【问题标题】:How to invoke a pre-installed contract in another contract如何在另一个合约中调用预安装的合约
【发布时间】:2019-08-08 03:29:14
【问题描述】:

首先我预先安装了一个合约 A(address(A))。然后我安装了一个合约B(地址(B))来通过调用接口调用A。最后我使用他的地址(x)调用合约。我是想用address(x)调用A,但实际上address(B)调用A。那我怎么用address(x)调用A呢?"

pragma solidity ^0.4.21;

contract TransferERC20 {

    event TransferEvent (
        bool _flag,
        string _invoiceId,
        address _erc20ContractHash,
        address indexed _from,
        address indexed _to,
        uint256 _value
    );

    function transfer(string _invoiceId, address _erc20ContractHash,address _from, address _to, uint256 _amount) public returns (bool) {
        bytes4 methodTransfer = bytes4(keccak256("transfer(address,uint256)"));
        if(_erc20ContractHash.call(methodTransfer, _to, _amount)) {
            emit TransferEvent(true, _invoiceId, _erc20ContractHash, _from, _to, _amount);
            return true;
        }
        emit TransferEvent(false, _invoiceId, _erc20ContractHash, _from, _to, _amount);
        return false;
    }
}

上述代码旨在调用预装在以太坊测试网上的ERC20合约。但是我调用失败,因为地址更改为 TransferERC20 地址。如何使用 TransferERC20 调用方地址实现转接功能。谢谢。

【问题讨论】:

    标签: ethereum solidity contract


    【解决方案1】:

    代币持有者首先需要在 ERC20 代币上使用 approve 为 TransferERC20 合约设置限额,然后他们才能在 TransferERC20 合约上调用 transfer,而后者应该在 ERC20 代币上调用 transferFrom
    这需要两笔交易,一笔用于approve,另一笔用于transferFrom

    如果您正在创建 ERC20 代币,您可能需要查看 OpenZeppelin Contracts 实现,看看这是否满足您的需求。 详情见文档:https://docs.openzeppelin.com/contracts/2.x/tokens#ERC20

    或者,您可以考虑创建 ERC777 令牌(无需在两个单独的事务中执行 approvetransferFrom)。详情见文档:https://docs.openzeppelin.com/contracts/2.x/tokens#ERC777

    如果您对使用 OpenZeppelin 有任何疑问,可以在社区论坛中提问:https://forum.openzeppelin.com/

    披露:我是 OpenZeppelin 的社区经理

    【讨论】:

    • TKS,我已经按照您的建议解决了这个问题。 ^>^
    • 太好了,很高兴我能帮上忙。您可以将我的回复标记为答案。
    猜你喜欢
    • 2019-06-16
    • 1970-01-01
    • 2018-02-04
    • 2022-12-03
    • 2021-09-11
    • 1970-01-01
    • 2017-07-03
    • 2018-10-31
    • 1970-01-01
    相关资源
    最近更新 更多