如何在另一个合约中调用预装合约

How to invoke a pre-installed contract in another contract

首先我预装了一个合约A(address(A))。然后我安装一个合约 B (address(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调用者地址实现转账功能。 THKS.

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

如果您要创建 ERC20 令牌,您可能需要查看 OpenZeppelin 合约实施,看看它是否满足您的需求。 详情见文档: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 的社区经理