如何与已部署的 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...成为SimpleBankmsg.sender的值。

    但随后SimpleBank 发送了一个内部事务,执行Token 的函数transfer()。这使得 SimpleBank 地址(不是0xAb8483... 成为Tokenmsg.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 代币与另一个智能合约进行交互?的主要内容,如果未能解决你的问题,请参考以下文章

为部署在 RinkeBy 测试网上的智能合约执行 ERC20 代币“传输函数”的原始交易

如何将 ERC20 代币发送到智能合约余额?

Solidity-ERC20代币的锁仓与释放-1

如何从智能合约中转移 ERC20 代币而不转移到基本账户

使用智能合约存取erc20代币

ERC20 代币转移到智能合约