我打算使用我的erc20令牌做一些造币的nft付款。但是当我调用testPay函数时总是得到ERC20:不足允许错误。
已经在寻找答案,但找不到答案。
有人能告诉我我在这里做错了什么吗?
msg.sender已经有了一些erc20令牌。地址(这个)没有标记。这个合同不是我真正的nft铸币合同,我只是想测试一下付款功能。
contract GameItem is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
ERC20 public GXGToken;
constructor(address mytoken) ERC721("GameItem", "ITM") {
GXGToken = ERC20(mytoken);
}
function awardItem(address player, string memory tokenURI)
public
returns (uint256)
{
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(player, newItemId);
_setTokenURI(newItemId, tokenURI);
return newItemId;
}
function approval(uint amount) public{
GXGToken.approve(msg.sender,amount);
}
function myallowance() view public returns (uint){
return GXGToken.allowance(msg.sender,address(this));
}
function testpay(uint _amount) public{
GXGToken.approve(msg.sender,_amount);
pay(_amount);
}
function pay(uint _amount) internal{
GXGToken.transferFrom(msg.sender,address(this),_amount);
}
}编辑:好的,收到了,谢谢您的回复。
这就是我要做的。
所以我首先在erc20上调用审批函数,批准erc721地址和金额,然后调用transferFrom on erc721契约,param1是发送方,param2是erc721地址。
而且起作用了。
发布于 2022-02-12 22:31:52
msg.sender必须批准GameItem智能契约地址,然后transferFrom才能开始工作,您正在尝试从发送方进行传输,而发件人尚未批准它不起作用的契约地址,即您在这里的声明
GXGToken.approve(msg.sender,_amount);GXGToken令牌具有审批功能,用户必须直接与GXGToken令牌协议地址交互,并在用户(地址)调用该函数之前使用它的审批函数来批准GameItem智能协议地址。
approve(GameItem smart contract address, _amount);您的意图是它将自动设置msg.sender以批准GameItem智能契约地址,但它不是这样工作的。
这里的解决方案可以解释批准的用例和transferFrom:转自函数在ERC20 20令牌契约中的用例是什么?。
发布于 2022-02-12 23:04:41
功能
function testpay(uint _amount) public{
GXGToken.approve(msg.sender,_amount);
pay(_amount);
}由msg.sender调用,因此msg.sender批准msg.sender使用该令牌的_amount。这是不对的。->允许Adress A调用ERC20契约,所以当他调用approve函数时,他会说"I,Address A (msg.sender),Address (第一个参数)来花费我的令牌的一些(第二个参数)“。因此,msg.sender不可能是第一个参数,否则他将批准自己传输他的令牌。
我相信你不能只用一笔交易就能做到这一点。首先,您必须让用户访问令牌智能契约(ERC20),批准NFT契约(ERC721)代表他/她传输令牌。也就是说,您必须执行msg.sender来执行ERC20合同上的批准函数,而不是这次。然后,ERC721合同将能够将TransferFrom称为ERC20,即TransferFrom (msg.sender,address(this),ERC20)。
发布于 2023-01-15 14:45:49
实际上,这个过程是非常不同的。msg.sender应该首先批准使用web3前端支付给nft合同的金额。
web3js应该调用审批函数以允许您的NFT合同像这样使用(例如。反应js前端)
await GXGToken.approve(NFTAddress, amount).then(tx=>{
tx.wait().then(data => {
console.log('success', data)
})
})然后,在您的NFT合同中,您可以使用类似的transferFrom函数
function testpay(uint _amount) public{
GXGToken.transferFrom(msg.sender,address(this), amount);
pay(_amount);
}https://ethereum.stackexchange.com/questions/121479
复制相似问题