TypeError: nft.createToken(...) is not a function error
TypeError: nft.createToken(...) is not a function error
我像这样使用 openzeppelin 创建了一个 ERC721 令牌:
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract Item is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
address contractAddress;
constructor(address marketAddress) ERC721("Item", "ITM") {
contractAddress = marketAddress;
}
function createToken(string memory _URI)
public
returns(uint256)
{
_tokenIds.increment();
uint256 itemId = _tokenIds.current();
_mint(msg.sender, itemId);
_setTokenURI(itemId, _URI);
setApprovalForAll(contractAddress, true);
return itemId;
}
}
在这个合约中,我有一个函数 createToken
用于铸造代币。我使用安全帽进行测试,但出现此错误: TypeError: nft.createToken(...) is not a function
/* deploy the NFT contract */
const Item = await ethers.getContractFactory("Item")
const nft = await Item.deploy(marketAddress)
await nft.deployed()
/* create two tokens */
await nft.createToken("https://www.mytokenlocation.com")
await nft.createToken("https://www.mytokenlocation2.com")
我错过了什么?
部署合约和与合约交互是两件不同的事情。
在区块链上部署合约后,您需要一个提供者,它有点像通往该区块链中节点的桥梁。
import { ethers } from "ethers";
const provider = new ethers.providers.JsonRpcProvider();
您还需要该合约的合约地址和abi。 abi
有点像指令。
const yourContract = new ethers.Contract(nftAddress, NFT.abi, provider);
现在可以调用合约的方法了。如果你想在前端执行此操作,你应该编写部署脚本并设置地址的状态。 (一般部署脚本写在安全帽的scripts目录下)
const [nftAddress, setNftAddress] = useState("")
async function deployContract(){
const Item = await ethers.getContractFactory("Item")
const nft = await Item.deploy(marketAddress)
await nft.deployed()
setNftAddress(nft.address)
}
我像这样使用 openzeppelin 创建了一个 ERC721 令牌:
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract Item is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
address contractAddress;
constructor(address marketAddress) ERC721("Item", "ITM") {
contractAddress = marketAddress;
}
function createToken(string memory _URI)
public
returns(uint256)
{
_tokenIds.increment();
uint256 itemId = _tokenIds.current();
_mint(msg.sender, itemId);
_setTokenURI(itemId, _URI);
setApprovalForAll(contractAddress, true);
return itemId;
}
}
在这个合约中,我有一个函数 createToken
用于铸造代币。我使用安全帽进行测试,但出现此错误: TypeError: nft.createToken(...) is not a function
/* deploy the NFT contract */
const Item = await ethers.getContractFactory("Item")
const nft = await Item.deploy(marketAddress)
await nft.deployed()
/* create two tokens */
await nft.createToken("https://www.mytokenlocation.com")
await nft.createToken("https://www.mytokenlocation2.com")
我错过了什么?
部署合约和与合约交互是两件不同的事情。
在区块链上部署合约后,您需要一个提供者,它有点像通往该区块链中节点的桥梁。
import { ethers } from "ethers";
const provider = new ethers.providers.JsonRpcProvider();
您还需要该合约的合约地址和abi。 abi
有点像指令。
const yourContract = new ethers.Contract(nftAddress, NFT.abi, provider);
现在可以调用合约的方法了。如果你想在前端执行此操作,你应该编写部署脚本并设置地址的状态。 (一般部署脚本写在安全帽的scripts目录下)
const [nftAddress, setNftAddress] = useState("")
async function deployContract(){
const Item = await ethers.getContractFactory("Item")
const nft = await Item.deploy(marketAddress)
await nft.deployed()
setNftAddress(nft.address)
}