部署合约和与合约交互是两回事。
我使用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);
现在您可以调用合同的方法。如果要在前端执行此操作,则应该编写部署脚本并设置地址的状态。(通常部署脚本写在安全帽的脚本目录上(
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)
}