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)   
  }