如何与部署的ERC20令牌与另一个智能合同交互? [英] How to interact with the deployed ERC20 token with another smart-contract?

查看:11
本文介绍了如何与部署的ERC20令牌与另一个智能合同交互?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经通过在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函数正常工作的正确方式是什么?

推荐答案

  1. 用户地址0xAb8483...发送执行SimpleBank函数deposit()的事务,使0xAb8483...的值为SimpleBank中的msg.sender

  2. 但随后SimpleBank发送执行Token的函数transfer()的内部事务。这使得SimpleBank地址(不是0xAb8483...)的值为Token中的msg.sender

    因此SimpleBank中的代码段tokenContract.transfer(address(this),amt);正在尝试发送SimpleBank的令牌,而不是用户的(0xAb8483...)令牌。

由于SimpleBank不拥有任何令牌,因此这种令牌传输(从第2点开始)会恢复。这使得顶层事务(从第1点开始)也被还原。


如果您希望SimpleBank能够转移0xAb8483...的令牌,则0xAb8483...需要approve()首先由SimpleBank使用的令牌。直接从它们的地址开始,以便msg.senderToken合同中。

只有SimpleBank才能执行transferFrom(0xAb8483..., address(this), amt)(开始、结束、金额)。


TLDR:您的合同不能使用它不拥有的令牌,除非所有者手动批准您的合同来使用它们。

如果它可以在未经批准的情况下使用他人的令牌,那么从无法/不能验证您的源代码的人那里窃取将非常容易(通过花费他们的USDT、Weth和其他广泛使用的令牌)。

这篇关于如何与部署的ERC20令牌与另一个智能合同交互?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆