如何与已部署的 ERC20 代币与另一个智能合约进行交互?
Posted
技术标签:
【中文标题】如何与已部署的 ERC20 代币与另一个智能合约进行交互?【英文标题】:How to interact with the deployed ERC20 token with another smart-contract? 【发布时间】:2021-08-10 19:15:15 【问题描述】:我通过在 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;
因为,我已经从地址 0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2 部署了两个合约,所以它拥有 100000000000000000000000000000 个令牌。
但是当我从同一地址调用 deposit
函数时,出现以下错误:
对 SimpleBank.deposit 的交易出错:VM 错误:还原。恢复 事务已恢复到初始状态。原因提供者 合约:“ERC20:转账金额超过余额”。调试 交易以获取更多信息。
那么,与已部署的 ERC20 令牌进行交互以使 deploy
函数起作用的正确方法是什么。
【问题讨论】:
这能回答你的问题吗? ehtereum smart contract approve spender from another contract 提供的链接中的答案对我来说并不清楚。这是否意味着另一个帐户出于安全原因无法与 ERC20.sol 交互?你能帮我解决一下@PetrHejda 吗? 【参考方案1】:用户地址0xAb8483...
发送一个事务执行SimpleBank
的函数deposit()
,这使得0xAb8483...
成为SimpleBank
中msg.sender
的值。
但随后SimpleBank
发送了一个内部事务,执行Token
的函数transfer()
。这使得 SimpleBank
地址(不是0xAb8483...
) 成为Token
中msg.sender
的值。
所以 SimpleBank 中的 sn-p tokenContract.transfer(address(this),amt);
正在尝试发送 SimpleBank
的令牌。不是用户的 (0xAb8483...
) 令牌。
这种代币转移(从第 2 点开始)会恢复,因为 SimpleBank 不拥有任何代币。这使得***交易(从第 1 点开始)也恢复了。
如果你希望SimpleBank
能够转移0xAb8483...
的代币,0xAb8483...
需要先将SimpleBank
使用的代币转给approve()
。直接来自他们的地址,因此他们在Token
合约中是msg.sender
。
只有SimpleBank
才能执行transferFrom(0xAb8483..., address(this), amt)
(从、到、金额)。
TLDR:你的合约不能使用它不拥有的代币,除非所有者手动批准你的合约使用它们。
如果它可以在未经批准的情况下使用其他人的代币,那么很容易从无法/无法验证您的源代码的人那里窃取(通过花费他们的 USDT、WETH 和其他广泛使用的代币)。
【讨论】:
以上是关于如何与已部署的 ERC20 代币与另一个智能合约进行交互?的主要内容,如果未能解决你的问题,请参考以下文章