需要使用delegatecall
,的方式, 这样不会修改msg.sender.
在集训营课程里有讲解,这个是 PPT 里的两个图片, 方便你理解:
这个是正常的调用( Call 调用):
以下是委托调用(delegatecall 调用):
具体反应在代码上, 你可以让你的合约继承自下面的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;
}
}
}