[英]ERC20: transfer amount exceeds allowance Smart contract with brownie and NFT
Hello there I have two smart contracts, one is an ERC1155 contract which mints a NFT from Moralis IPFS server, the other is a ERC20 token.您好,我有两个智能合约,一个是 ERC1155 合约,它从 Moralis IPFS 服务器铸造一个 NFT,另一个是 ERC20 代币。 I want users to be able to pay for the minted NFT using the ERC20 token but I'm receiving an error on the transferfrom()
function: brownie.exceptions.VirtualMachineError: revert: ERC20: transfer amount exceeds allowance.我希望用户能够使用 ERC20 代币为铸造的 NFT 付款,但我在transferfrom()
function: brownie.exceptions.VirtualMachineError: revert: ERC20: transfer amount exceeded permit 上收到错误。 I did some research but nothing helped so far.我做了一些研究,但到目前为止没有任何帮助。
This is my ERC1155 contract这是我的 ERC1155 合约
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@chainlink/contracts/src/v0.8/VRFConsumerBase.sol";
contract NFTPomoBots is ERC1155, Ownable {
IERC20 private _roboToken;
constructor(IERC20 roboToken)
ERC1155(
"ipfs://QmcPjTnt33BRM5TPGyno7restoftheurl/({id}.json"
)
{
_roboToken = roboToken;
}
function mintPomoBot(
address account,
uint256 id,
uint256 amount
) public {
require(_roboToken.transferFrom(msg.sender, address(this), 1));
_mint(account, id, amount, "");
}
}
this is the ERC20 contract这是ERC20合约
// SPDX-License-Identifier: MIT
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
pragma solidity ^0.8.0;
contract RoboToken is ERC20, Ownable {
uint256 public maxSupply = 100000 * 10**18;
constructor() ERC20("Pomobots Token", "POMO") {
_mint(msg.sender, maxSupply);
}
function transferToAccount(
address to,
uint256 amount,
bool completedTime
) public onlyOwner {
require(completedTime == true);
_mint(to, amount);
}
function approveNFTContract(address _tokenAddress) public onlyOwner {
approve(_tokenAddress, maxSupply);
}
}
this is the test script这是测试脚本
def test_can_mint_new_nft():
# Arrange
account1 = get_account()
print(f"account 1 {account1.address}")
account2 = get_account(1)
print(f"account 2 {account2.address}")
robo_token = deploy_erc20_token()
pomobot_token = NFTPomoBots.deploy(robo_token, {"from": account1})
# Act
tx1 = robo_token.transferToAccount(account2, 10, True)
tx1.wait(1)
print(robo_token.balanceOf(account2.address))
tx2 = robo_token.approve(account2.address, robo_token.balanceOf(account2.address))
tx2.wait(1)
# assert
assert pomobot_token.mintPomoBot(account2.address, 20, 1, {"from": account2})
print(f"nft minted to {account2.address}")
print(robo_token.balanceOf(account2.address))
Any help is appreciated, also should I make the function minPomobot() payable?感谢您提供任何帮助,我还应该支付 function minPomobot() 吗?
Before calling mintPomoBot
function, with the same account ( msg.sender
) you need to call approve(spender, amount)
function on RoboToken
smart contract where spender = NFTPomoBots' address
and amount = 1
在调用mintPomoBot
function 之前,使用相同的帐户( msg.sender
)您需要在RoboToken
智能合约上调用approve(spender, amount)
function ,其中spender = NFTPomoBots' address
和amount = 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.