5 solidity 怎么实现调用多合约合并到一笔交易

尝试了使用Multicall ,似乎没办法解决目标合约msg.sender是Multicall 的问题, 请大神多多指导

请先 登录 后评论

最佳答案 2022-06-20 08:36

需要使用delegatecall,的方式, 这样不会修改msg.sender.

集训营课程里有讲解,这个是 PPT 里的两个图片, 方便你理解:

这个是正常的调用( Call 调用):

Call 调用

以下是委托调用(delegatecall 调用): image.png

具体反应在代码上, 你可以让你的合约继承自下面的Multicall合约:

abstract contract Multicall  {
    /// @inheritdoc IMulticall
    function multicall(bytes[] calldata data) external payable override returns (bytes[] memory results) {
        results = new bytes[](data.length);
        for (uint256 i = 0; i < data.length; i++) {
            (bool success, bytes memory result) = address(this).delegatecall(data[i]);

            if (!success) {
                // Next 5 lines from https://ethereum.stackexchange.com/a/83577
                if (result.length < 68) revert();
                assembly {
                    result := add(result, 0x04)
                }
                revert(abi.decode(result, (string)));
            }

            results[i] = result;
        }
    }
}
请先 登录 后评论

其它 0 个回答

  • 1 关注
  • 2 收藏,2871 浏览
  • 提出于 2022-06-18 11:01