首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用smart契约保存和提取erc20令牌

使用smart契约保存和提取erc20令牌
EN

Ethereum用户
提问于 2021-11-22 15:13:49
回答 1查看 1.9K关注 0票数 1

我的目标是创建一个智能契约,用户可以使用该协议存放erc20并提取erc20令牌,我尝试使用令牌传输实现此功能,并尝试将令牌发送到契约地址.but,显示了一些错误。我尝试了所有可以在网上找到的解决方案,但是没有运气,.please帮了我。

代码语言:javascript
复制
// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.10;

interface IERC20 
{

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);


    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 TestFunding
{

    mapping(address => uint) public users;

    address public owner;

    uint public minimumDeposit;

    uint public totalDeposit;

    uint public noOfUsers;

    constructor(){
        owner = msg.sender;
    }
    
    function depositToken(address _token,uint _amount) public {
        
         IERC20(_token).approve(address(this), _amount);
        IERC20(_token).transferFrom(msg.sender,address(this),_amount);
    }
    
       function depositToken2(address _token,uint _amount) public {

        IERC20(_token).transfer(address(this), _amount);
    }
    
    
    function getUserBalance() public view returns(uint)
    {
     return users[msg.sender];   
    }
    
    function getCurrentBalance(address _token) public view returns(uint)
    {
     return IERC20(_token).balanceOf(address(this)) ; 
    }
    
    function getTokenBalance(address _token,address _account) public view returns(uint)
    {
     return IERC20(_token).balanceOf(_account) ; 
    }
    
    
    
    function withdrawToken(address _token,uint _amount) public
    {
    
    IERC20(_token).approve(msg.sender, _amount);
    IERC20(_token).transferFrom(address(this),msg.sender,_amount);
    
    }
    
}

当我试图使用depositToken函数进行传输时,出现了显示事务到TestFunding.depositToken的错误,错误: VM错误:还原。

还原事务已恢复到初始状态。合同提供的理由:"ERC20:转移金额超过备抵额“。调试事务以获得更多信息。

当我试图使用depositToken函数进行传输时,出现了显示事务到TestFunding.depositToken2的错误,错误: VM错误:还原。

还原事务已恢复到初始状态。注意:如果您发送值,则应支付被调用的函数,而您发送的值应小于当前余额。调试事务以获得更多信息。

EN

回答 1

Ethereum用户

发布于 2021-11-22 15:25:16

必须首先挖掘ERC20 approve()事务。只有在网络确认了这一点之后,transferFrom()才能在随后的块中使用。

此外,在depositToken()中,您使用approve()的方式将是智能契约,它将批准自己。

正确的方法是:用户必须将审批事务发送到网络。因此,在用户端,这条指令必须首先到达网络:

_tokenContract.approve(address(_yourContractAddress), _amountToApprove, {from:_user});

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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