如何与部署的ERC20令牌与另一个智能合同交互? [英] How to interact with the deployed ERC20 token with another smart-contract?
问题描述
我已经通过在ERC20.sol文件中实现OpenZeppelin创建了一个基本的ERC20令牌:
pragma solidity ^0.6.4;
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/token/ERC20/ERC20.sol";
contract Token is ERC20 {
constructor(string memory _name, string memory _symbol)
public
ERC20(_name, _symbol)
{
_mint(msg.sender, 10000000000000000000000000000);
}
}
然后执行另一个合同Contract.sol,如下所示:
import "./ERC20.sol";
pragma solidity ^0.6.4;
contract SimpleBank{
Token tokenContract;
constructor(Token _tokenContract) public {
tokenContract = _tokenContract;
}
function deposit(uint amt) public returns (bool) {
require(amt != 0 , "deposit amount cannot be zero");
tokenContract.transfer(address(this),amt);
return true;
}
}
AS,我已经从地址0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2部署了这两个约定,因此,它包含1000000000000000000000000000000令牌。
但当我从同一地址调用
deposit
函数时,我收到以下错误:
交易到SimpleBank。存款错误:VM错误:还原。恢复 事务已恢复到初始状态。理由由 合同:ERC20:转账金额超过余额。调试 事务以获取更多信息。
那么,与部署的ERC20令牌交互以使deploy
函数正常工作的正确方式是什么?
推荐答案
用户地址
0xAb8483...
发送执行SimpleBank
函数deposit()
的事务,使0xAb8483...
的值为SimpleBank
中的msg.sender
。但随后
SimpleBank
发送执行Token
的函数transfer()
的内部事务。这使得SimpleBank
地址(不是0xAb8483...
)的值为Token
中的msg.sender
。因此SimpleBank中的代码段
tokenContract.transfer(address(this),amt);
正在尝试发送SimpleBank
的令牌,而不是用户的(0xAb8483...
)令牌。
如果您希望SimpleBank
能够转移0xAb8483...
的令牌,则0xAb8483...
需要approve()
首先由SimpleBank
使用的令牌。直接从它们的地址开始,以便msg.sender
在Token
合同中。
只有SimpleBank
才能执行transferFrom(0xAb8483..., address(this), amt)
(开始、结束、金额)。
TLDR:您的合同不能使用它不拥有的令牌,除非所有者手动批准您的合同来使用它们。
如果它可以在未经批准的情况下使用他人的令牌,那么从无法/不能验证您的源代码的人那里窃取将非常容易(通过花费他们的USDT、Weth和其他广泛使用的令牌)。
这篇关于如何与部署的ERC20令牌与另一个智能合同交互?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!