使用 ERC20 代币支付
Paying with ERC20 token
我想构建一个 NFT,我可以用 ERC-20 代币支付来铸造它。我目前在多边形上使用孟买测试网,我正在使用 Dummy ERC20 token 对其进行测试。
这是我目前的构造函数:
ERC20 token;
constructor() ERC721("Token", "TKN") {
token = ERC20(0xfe4F5145f6e09952a5ba9e956ED0C25e3Fa4c7F1);
}
这是我的 mint 函数:
function mint() public returns (uint256) {
uint256 tokenId = _tokenIds.current();
require(tokenId <= MAX_TOKEN_ID);
token.approve(address(this), NFT_PRICE);
token.transfer(address(this), NFT_PRICE);
_mint(msg.sender, tokenId);
_setTokenURI(tokenId, TOKEN_URI);
_tokenIds.increment();
return tokenId;
}
如果我删除那两行代码工作正常,它会生成 NFT:
token.approve(address(this), NFT_PRICE);
token.transfer(address(this), NFT_PRICE);
但是我一添加它,代码就崩溃了,它给我以下 gas 估计错误:
The transaction execution will likely fail. Do you want to force sending?
Internal JSON-RPC error. { "code": 3, "message": "execution reverted: ERC20: transfer amount exceeds balance", "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002645524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63650000000000000000000000000000000000000000000000000000" }
作为故障排除步骤,我还在我的 mint 函数中添加了这个,以确保我是从我自己的钱包调用的:
sender = msg.sender;
并创建了这个函数:
function tokenBalance(address addr) public view returns (uint256) {
return token.balanceOf(addr);
}
如果我获取发件人地址的代币余额,它会给我以下值:
0: uint256: 2000000000000000000
因为逻辑不对。您在 mint
函数中调用的那个 approve
函数是无用的:花费者需要从您的虚拟 ERC20 合约中调用 approve
函数。
然后您可以从您的 mint 函数中调用 transferFrom(msg.sender, address(this), NFT_PRICE)
。
我想构建一个 NFT,我可以用 ERC-20 代币支付来铸造它。我目前在多边形上使用孟买测试网,我正在使用 Dummy ERC20 token 对其进行测试。
这是我目前的构造函数:
ERC20 token;
constructor() ERC721("Token", "TKN") {
token = ERC20(0xfe4F5145f6e09952a5ba9e956ED0C25e3Fa4c7F1);
}
这是我的 mint 函数:
function mint() public returns (uint256) {
uint256 tokenId = _tokenIds.current();
require(tokenId <= MAX_TOKEN_ID);
token.approve(address(this), NFT_PRICE);
token.transfer(address(this), NFT_PRICE);
_mint(msg.sender, tokenId);
_setTokenURI(tokenId, TOKEN_URI);
_tokenIds.increment();
return tokenId;
}
如果我删除那两行代码工作正常,它会生成 NFT:
token.approve(address(this), NFT_PRICE);
token.transfer(address(this), NFT_PRICE);
但是我一添加它,代码就崩溃了,它给我以下 gas 估计错误:
The transaction execution will likely fail. Do you want to force sending?
Internal JSON-RPC error. { "code": 3, "message": "execution reverted: ERC20: transfer amount exceeds balance", "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002645524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e63650000000000000000000000000000000000000000000000000000" }
作为故障排除步骤,我还在我的 mint 函数中添加了这个,以确保我是从我自己的钱包调用的:
sender = msg.sender;
并创建了这个函数:
function tokenBalance(address addr) public view returns (uint256) {
return token.balanceOf(addr);
}
如果我获取发件人地址的代币余额,它会给我以下值:
0: uint256: 2000000000000000000
因为逻辑不对。您在 mint
函数中调用的那个 approve
函数是无用的:花费者需要从您的虚拟 ERC20 合约中调用 approve
函数。
然后您可以从您的 mint 函数中调用 transferFrom(msg.sender, address(this), NFT_PRICE)
。