ContractCallContract

pragma solidity 0.6.2;

/*
    合約調(diào)用合約,并解析返回參數(shù)
*/
contract ContractCallContract{

    event Call(bytes k1,uint256 k2,uint256 k3);

    function callContractByEncodeWithSelector(address contractAddress,uint256 a,uint256 b) public {
        (bool success, bytes memory data) = contractAddress.call(abi.encodeWithSelector(getSelector(),a,b));
        require(success,"call A is fail");
        (uint256 c,uint256 d) = abi.decode(data,(uint256,uint256));
        emit Call(data,c,d);
    }

    function callContractByEncodeWithSignature(address contractAddress,uint256 a,uint256 b) public {
        (bool success, bytes memory data) = contractAddress.call(abi.encodeWithSignature("add(uint256,uint256)",a,b));
        require(success,"call A is fail");
        // 解析data
        (uint256 c,uint256 d) = abi.decode(data,(uint256,uint256));
        emit Call(data,c,d);
    }

    function callA(bytes4 b4,uint256[] memory list,address contractAddress) public {
        (bool success, bytes memory data) = contractAddress.call(abi.encodeWithSelector(b4,list));
        require(success,"call A is fail");
        // 解析data
        (uint256 a,uint256 b) = abi.decode(data,(uint256,uint256));
        emit Call(data,a,b);
    }

    function getSelector() public pure returns(bytes4){
        return bytes4(keccak256(bytes('add(uint256,uint256)')));
    }

    function getAddSelector() public pure returns(bytes4){
        return bytes4(keccak256(bytes('add(uint256[])')));
    }



}

contract A{
    function add(uint256 a,uint256 b) public pure returns(uint256,uint256){
        return (a+b,a-b);
    }
    function add(uint256[] memory a) public pure returns(uint256,uint256){
        return (a[0]+a[1],a[0]-a[1]);
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容