首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >错误ERC20:备抵不足

错误ERC20:备抵不足
EN

Ethereum用户
提问于 2022-02-12 14:14:09
回答 3查看 7.9K关注 0票数 2

我打算使用我的erc20令牌做一些造币的nft付款。但是当我调用testPay函数时总是得到ERC20:不足允许错误。

已经在寻找答案,但找不到答案。

有人能告诉我我在这里做错了什么吗?

msg.sender已经有了一些erc20令牌。地址(这个)没有标记。这个合同不是我真正的nft铸币合同,我只是想测试一下付款功能。

代码语言:javascript
复制
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地址。

而且起作用了。

EN

回答 3

Ethereum用户

回答已采纳

发布于 2022-02-12 22:31:52

msg.sender必须批准GameItem智能契约地址,然后transferFrom才能开始工作,您正在尝试从发送方进行传输,而发件人尚未批准它不起作用的契约地址,即您在这里的声明

代码语言:javascript
复制
GXGToken.approve(msg.sender,_amount);

GXGToken令牌具有审批功能,用户必须直接与GXGToken令牌协议地址交互,并在用户(地址)调用该函数之前使用它的审批函数来批准GameItem智能协议地址。

代码语言:javascript
复制
approve(GameItem smart contract address, _amount);

您的意图是它将自动设置msg.sender以批准GameItem智能契约地址,但它不是这样工作的。

这里的解决方案可以解释批准的用例和transferFrom:转自函数在ERC20 20令牌契约中的用例是什么?

票数 0
EN

Ethereum用户

发布于 2022-02-12 23:04:41

功能

代码语言:javascript
复制
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)。

票数 0
EN

Ethereum用户

发布于 2023-01-15 14:45:49

实际上,这个过程是非常不同的。msg.sender应该首先批准使用web3前端支付给nft合同的金额。

web3js应该调用审批函数以允许您的NFT合同像这样使用(例如。反应js前端)

代码语言:javascript
复制
await GXGToken.approve(NFTAddress, amount).then(tx=>{
    tx.wait().then(data => {
       console.log('success', data)
    })

})

然后,在您的NFT合同中,您可以使用类似的transferFrom函数

代码语言:javascript
复制
function testpay(uint _amount) public{
   GXGToken.transferFrom(msg.sender,address(this), amount);
   pay(_amount);
}
票数 0
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/121479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档