我的目标是创建一个智能合约,用户可以使用它来存放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);
}
}
在此处输入图像描述
在此处输入图像描述
当我尝试使用depositToken函数传输时,显示transaction到TestFunding.dedepositToken错误:VM错误:revert。
revert事务已恢复到初始状态。合同提供的理由:;ERC20:转账金额超过限额";。调试事务以获取更多信息。
当我尝试使用depositToken函数传输时,显示transaction到TestFunding.destorToken2错误:VM错误:revert。
revert事务已恢复到初始状态。注意:如果您发送值,并且您发送的值应该小于您当前的余额,则调用的函数应该是应付的。调试事务以获取更多信息。
depositToken函数不起作用,因为当合约调用approve合约是该函数的消息发送者时,如果合约正在批准自己移动合约令牌,则需要删除approve行,这是因为与您的合约交互的前端应该让用户在调用该函数之前批准该合约,在depositToken2中,当合约调用转移是该函数的msg.sender时,它与调用approve的问题类似,因此合约在自己转移一定数量的不拥有的令牌