如何在没有参数的情况下调用 abi.encodeWithSignature 的外部合同?

How to call external contract with abi.encodeWithSignature with no arguments?

我正在使用 solidity 0.5.16,在一个合约的函数中,我想调用另一个合约的 initialize() 方法。此方法不接受任何参数。

        contract.call.value(0)(
          abi.encodeWithSignature("initialize()",);
        );

但是上面的方法编译不正确..

  1. 不要使用保留关键字 contract - 例如将其替换为 externalContract

  2. 当您不传递任何参数时,删除 encodeWithSignature() 函数中的逗号 ,

  3. 去掉encodeWithSignature()后面的分号;。这会导致另一个解析错误,因为您仍在 call 函数中构建参数。

pragma solidity 0.5.16;

contract MyContract {
    function foo() external {
        address externalContract = address(0x123);
        (bool success, bytes memory returnedData) = externalContract.call.value(0)(
            abi.encodeWithSignature("initialize()")
        );
    }
}

以上语法现已弃用,您可以改用它:

pragma solidity ^0.8.0;

contract MyContract {
    function foo() external {
        address externalContract = address(0x123);
        (bool success, bytes memory returnedData) = externalContract.call{value: 0}(abi.encodeWithSignature("initialize()"));
    }
}