当前位置: 首页 > 知识库问答 >
问题:

如何使用另一个智能合同与部署的ERC20令牌进行交互?

公西浩
2023-03-14

我通过在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);
    }
}

然后执行另一个合同。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部署了两个合约,所以它拥有100000000000000000000000000个令牌

但当我从同一地址调用存款函数时,我得到了以下错误:

交易到简单银行.存款错误:虚拟机错误:恢复。还原 事务已还原到初始状态。合同提供的理由:“ERC20:转账金额超过余额”。调试事务以获取更多信息。



那么,与部署的ERC20令牌交互以使部署函数工作的正确方式是什么。

共有1个答案

韶英达
2023-03-14

>

  • 用户地址0xAb8483…发送一个执行SimpleBank函数存款()的事务,这使得0xAb8483…SimpleBankmsg.sender的值。

    但是然后SimpleBank发送一个执行Token函数Transfer()的内部事务。这使得SimpleBank地址(不是0xAb8483…)成为Tokenmsg.sender的值。

    因此,简单银行内的代码段令牌合约转移(地址(此),amt);正在尝试发送简单银行的令牌。不是用户的 (0xAb8483...) 令牌。

    由于SimpleBank不拥有任何令牌,因此令牌的转移(从点2)会恢复。这使得顶层事务(从点1)也恢复。

    如果您希望SimpleBank能够传输0xAb8483…的代币,0xAb8483…需要批准()代币首先由SimpleBank使用。直接从它们的地址,以便它们在Token合约中msg.sender

    只有这样,简单银行才能执行转账从(0xAb8483...,地址(这个),amt)(从,到,金额)。

    TLDR:您的合约不能使用它不拥有的代币,除非所有者手动批准您的合约使用它们。

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

  •  类似资料:
    • 部署智能合约及与智能合约交互 如果你想避免使用智能合约的底层实现细节,web3j提供solidity的智能合约的封装包,使你能够通过web3j生成的包装对象直接与智能合约的所有方法进行交互。 另外,如果你希望发送常规交易或希望在与智能合约的交互中有更多的控制权,请参阅web3j教程:java使用web3j开发以太坊智能合约交易,这里讲到了创建智能合约,与智能合约进行交易,查询智能合约的状态等内容。

    • 我想将erc20代币从一个账户转移到另一个账户。我知道我可以使用智能合约包装类的Transfer或transferFrom函数。但在我的情况下,erc20代币交易需要在客户端签名。并且没有办法在智能合约包装函数中传递signedTransaction。那么,如何在java中使用web3j签署erc20代币交易并执行交易。 我发现了这个类似的问题。但是,它的代码不是用java编写的。我不知道如何在A

    • 我目前使用的是Web3 JavaScript API的0.2x.x版本。我通过在solidity(在REMIX IDE上)中创建智能契约来部署我的自定义ERC20令牌。我安装了元掩码,并在https://wallet.ethereum.org/上测试发送一些自定义ERC令牌到另一个我的帐户。效果很好。我想使用Web3js在我的JavaScript代码中添加“发送自定义ERC20令牌”功能。 这是我

    • 我正在尝试在web3中实现一个可靠的“购买”功能。最终,我希望有一个按钮,然后用户将打开元掩码以将固定金额(简单示例为1个以太币)发送到智能合约以换取ERC20令牌。我已经学会了如何在两个钱包之间转移代币,但现在我想更进一步,学习如何发送以太币来接收ERC20。这是我一直在使用的坚固性“购买”功能: 现在,我一直在使用这个与元amask结合的OnClick按钮来传输ERC20: 您对如何在JS中实

    • 构建与部署智能合约 智能合约的构建和部署发生在deploy方法中: YourSmartContract contract = YourSmartContract.deploy( <web3j>, <credentials>, GAS_PRICE, GAS_LIMIT, [<initialValue>,] <param1>, ..., <paramN>

    • 我有三个智能合约,比如a.sol、b.sol和c.sol……在这三个智能合同中,前两个是独立的智能合约,而c.sol使用a.sol和b.sol的功能,因此c.Sols需要“导入”前两个智能合约。“导入”在本地工作,但如何在testnet上通过remix/truffle部署它们,以便c.sol仍然可以访问a.sol和b.sol的功能?