【问题标题】:deposite and withdraw erc20 token using smart contract使用智能合约存取erc20代币
【发布时间】: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 事务已恢复到初始状态。注意:如果您发送值并且您发送的值应该小于您当前的余额,则调用的函数应该是应付的。调试事务以获取更多信息。

【问题讨论】:

    标签: blockchain solidity transfer metamask erc20


    【解决方案1】:

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

    【讨论】:

    • 作为一个补充,如果你在混音中(如图所示)你可以直接与代币合约交互来调用批准函数,但如果你没有部署代币合约并且你使用已有的token可以选择token界面,把地址放在address中,然后点击按钮
    猜你喜欢
    • 2021-09-17
    • 1970-01-01
    • 2021-04-26
    • 2022-01-20
    • 1970-01-01
    • 2019-11-02
    • 1970-01-01
    • 2021-12-18
    • 2022-08-21
    相关资源
    最近更新 更多