多次调用合约

多重调用

多重调用

实现的效果是同一个合约地址在tong'yi

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.30;

contract TestMultiCall {

    function func1() external view returns(uint, uint){
        return (1, block.timestamp);
    }

    function func2() external view returns(uint, uint){
        return (2, block.timestamp);
    }

    function getData1() external pure returns (bytes memory){
        return abi.encodeWithSelector(this.func1.selector);
    }

    function getData2() external pure returns (bytes memory){
        return abi.encodeWithSelector(this.func2.selector);
    }
}

contract MultiCall{
    // 保证调用 TestMultiCall的调用方是同一时间获取数据,保证数据一致性
    function multiCall(address[] calldata targets, bytes[] calldata data) 
        external 
        view 
        returns(bytes[] memory)
    {
        require(targets.length == data.length, "target length != data length");
        bytes[] memory results = new bytesUnsupported embed;

        for(uint i; i < targets.length; i++){
            (bool success, bytes memory result) = targets[i].staticcall(data[i]);
            require(success, "call failed");
            results[i] = result;
        }
        return results;
    }
}