使用智能合约存取erc20代币

Posted

技术标签:

【中文标题】使用智能合约存取erc20代币【英文标题】:deposite and withdraw erc20 token using smart contract 【发布时间】:2022-01-01 07:31:51 【问题描述】:

我的目标是创建一个智能合约,用户可以使用它来存入 erc20 和提取 erc20 代币。我尝试使用代币转移和 transferfrom 函数来实现此功能,尝试将代币发送到合约地址。但它显示了一些错误。我尝试了互联网上所有可能的解决方案,但没有运气。请帮助我################################ #######

// 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);
    
    
    

    

在此处输入图片说明

enter image description here

当我尝试使用 depositToken 转账时出现错误,显示交易到 TestFunding.depositToken 错误:VM 错误:还原。

revert 事务已恢复到初始状态。合约提供的原因:“ERC20:转账金额超过限额”。调试事务以获取更多信息。

当我尝试使用 depositToken 函数进行转账时,错误显示交易到 TestFunding.depositToken2 出错:VM 错误:还原。

revert 事务已恢复到初始状态。注意:如果您发送值并且您发送的值应该小于您当前的余额,则调用的函数应该是应付的。调试事务以获取更多信息。

【问题讨论】:

【参考方案1】:

depositToken 函数不起作用,因为当合约调用批准合约是该函数的 msg.sender 时,合约正在批准自己移动合约令牌,您需要删除批准行,这是因为与您的合约交互的前端应该让用户在调用该函数之前批准该合约,并且在 depositToken2 中与调用批准的问题类似,当合约调用 transfer 是该函数的 msg.sender 时,合约在 transfer她自己有一些不拥有的代币

【讨论】:

作为一个补充,如果你在混音中(如图所示)你可以直接与代币合约交互来调用批准函数,但如果你没有部署代币合约并且你使用已有的token可以选择token界面,把地址放在address中,然后点击按钮

以上是关于使用智能合约存取erc20代币的主要内容,如果未能解决你的问题,请参考以下文章

ERC20 代币转移到智能合约

如何从智能合约中转移 ERC20 代币而不转移到基本账户

手把手教你发行代币

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

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

我可以将我的自定义 ERC-20 与我的智能合约一起使用吗?