ERC20 代币转移到智能合约

Posted

技术标签:

【中文标题】ERC20 代币转移到智能合约【英文标题】:ERC20 token transfer to smart contract 【发布时间】:2021-09-17 21:43:41 【问题描述】:

您好,我编写了一个简单的智能合约,用于将 erc20 代币从用户转移到智能合约以及从智能合约转移到用户。我在调用 transferFrom 函数之前批准了它,但交易失败了。我试过只打电话批准而不打电话 transferFrom 它有效。我正在 rinkeby 测试网上进行测试。

// SPDX-License-Identifier: MIT
pragma solidity =0.7.6;
pragma abicoder v2;

interface IERC20 
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function allowance(address owner, address spender) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);



contract transferToContract 
    address public _WETH = 0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984;
    IERC20 public WETH = IERC20(_WETH);

    function transferToC (uint amount) public
    
        WETH.approve(msg.sender,amount);
        WETH.transferFrom(msg.sender,address(this),amount);
    
    
    function transferFromC(uint amount) public
        WETH.approve(address(this),amount);
        WETH.transferFrom(address(this),msg.sender,amount);
    
    
    function getbal() public view returns(uint)
        return WETH.balanceOf(msg.sender);
    
    
    

我正在测试注入 web3 的混音。我得到的错误是

Gas estimation errored with the following message (see below). The transaction execution will likely fail. Do you want to force sending?
execution reverted: Uni::transferFrom: transfer amount exceeds spender allowance  "originalError":  "code": 3, "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003c556e693a3a7472616e7366657246726f6d3a207472616e7366657220616d6f756e742065786365656473207370656e64657220616c6c6f77616e636500000000", "message": "execution reverted: Uni::transferFrom: transfer amount exceeds spender allowance"  

我在 rinkeby 测试网上的测试钱包中也有令牌,我正在使用 remix web3 注入进行部署。

【问题讨论】:

【参考方案1】:
WETH.approve(msg.sender,amount);

此行批准用户使用您的合约代币。反之亦然。

如果你想批准合约来操纵用户的代币,用户需要直接在 WETH 合约上执行approve(yourContractAddress, amount)(而不是通过你的合约)。


我在另一个答案中讨论了类似的主题。 TLDR 部分也与您的问题有关 - https://***.com/a/67642090/1693192

【讨论】:

这是有道理的。如何直接从我的用户钱包而不是智能合约调用 WETH.approve。 我能想到的一种方式是使用etherjs,先调用WETH智能合约进行审批,然后调用这个智能合约进行转账 是的,这是一种有效的方式。 最后一个疑问是我是否从我的用户钱包调用 WETH.approve 并允许我的合约在有效期内花费我的余额。我的意思是持续时间。永久有效吗? 这取决于合约的实现。特别是 WETH,它“永远”有效,直到您将值重置为另一个(您也可以将值设置为 0)...当然,批准的金额随着花费的金额而减少。因此,如果用户批准你的合约花费 100 个代币,那么合约花费 20 个(用户的)代币,仍然有 80 个被批准。【参考方案2】:

我希望我的合约接受来自外部账户的代币,该账户的代币很少(可以是任何代币,但基于 ERC20)。所以直接调用approve函数需要创建token合约的实例,那么如何使用web3创建实例呢?

任何代码片段都会有所帮助,或者如果您可以共享指向任何文档的链接也将有所帮助。

【讨论】:

以上是关于ERC20 代币转移到智能合约的主要内容,如果未能解决你的问题,请参考以下文章

使用智能合约存取erc20代币

手把手教你发行代币

如何将 ERC20 代币发送到智能合约余额?

为部署在 RinkeBy 测试网上的智能合约执行 ERC20 代币“传输函数”的原始交易

如何与已部署的 ERC20 代币与另一个智能合约进行交互?

ERC20 合约无法转移大额代币