我的目标是创建一个智能契约,用户可以使用该协议存放erc20并提取erc20令牌,我尝试使用令牌传输实现此功能,并尝试将令牌发送到契约地址.but,显示了一些错误。我尝试了所有可以在网上找到的解决方案,但是没有运气,.please帮了我。
// 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错误:还原。
还原事务已恢复到初始状态。注意:如果您发送值,则应支付被调用的函数,而您发送的值应小于当前余额。调试事务以获得更多信息。
发布于 2021-11-22 15:25:16
必须首先挖掘ERC20 approve()事务。只有在网络确认了这一点之后,transferFrom()才能在随后的块中使用。
此外,在depositToken()中,您使用approve()的方式将是智能契约,它将批准自己。
正确的方法是:用户必须将审批事务发送到网络。因此,在用户端,这条指令必须首先到达网络:
_tokenContract.approve(address(_yourContractAddress), _amountToApprove, {from:_user});
https://ethereum.stackexchange.com/questions/114065
复制相似问题