Skip to content

Commit 39fb95e

Browse files
committed
feat: implement aggregate3Value function in IMulticall3 and update TrailsRouterShim
- Added the aggregate3Value function to the IMulticall3 interface to support calls with value transfers. - Updated the TrailsRouterShim contract to validate and forward calls specifically for aggregate3Value. - Modified related tests to ensure proper functionality and event emissions for the new aggregate3Value implementation.
1 parent 60d4e3b commit 39fb95e

File tree

4 files changed

+111
-78
lines changed

4 files changed

+111
-78
lines changed

.gas-snapshot

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,23 +48,23 @@ TrailsRouterShimDeploymentTest:test_DeployRouterShim_SameAddress() (gas: 6683217
4848
TrailsRouterShimDeploymentTest:test_DeployRouterShim_Success() (gas: 4320770)
4949
TrailsRouterShimDeploymentTest:test_DeployedContract_HasCorrectConfiguration() (gas: 4320816)
5050
TrailsRouterShimTest:testConstructorValidation() (gas: 69386)
51-
TrailsRouterShimTest:testForwardToRouterReturnValue() (gas: 747637)
51+
TrailsRouterShimTest:testForwardToRouterReturnValue() (gas: 750442)
5252
TrailsRouterShimTest:testRouterAddressImmutable() (gas: 1428747)
5353
TrailsRouterShimTest:test_constructor_revert_zeroRouter() (gas: 69034)
54-
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_sstore_inactive() (gas: 1553903)
55-
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_tstore_active() (gas: 37963)
56-
TrailsRouterShimTest:test_delegatecall_router_revert_bubbles_as_RouterCallFailed() (gas: 82093)
57-
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_sstore_when_no_tstore() (gas: 1536669)
58-
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_tstore_when_supported() (gas: 20808)
54+
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_sstore_inactive() (gas: 1554508)
55+
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_tstore_active() (gas: 38562)
56+
TrailsRouterShimTest:test_delegatecall_router_revert_bubbles_as_RouterCallFailed() (gas: 82200)
57+
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_sstore_when_no_tstore() (gas: 1536737)
58+
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_tstore_when_supported() (gas: 20876)
5959
TrailsRouterShimTest:test_direct_handleSequenceDelegateCall_reverts_not_delegatecall() (gas: 9840)
60-
TrailsRouterShimTest:test_forwardToRouter_return_data_handling() (gas: 763078)
61-
TrailsRouterShimTest:test_forwardToRouter_revert_with_custom_error() (gas: 721440)
62-
TrailsRouterShimTest:test_handleSequenceDelegateCall_empty_calldata() (gas: 13849)
63-
TrailsRouterShimTest:test_handleSequenceDelegateCall_large_calldata() (gas: 1681891)
64-
TrailsRouterShimTest:test_handleSequenceDelegateCall_max_call_value() (gas: 31292)
65-
TrailsRouterShimTest:test_handleSequenceDelegateCall_with_eth_value() (gas: 31593)
66-
TrailsRouterShimTest:test_handleSequenceDelegateCall_zero_call_value() (gas: 26363)
67-
TrailsRouterShimTest:test_sentinel_setting_with_different_op_hashes() (gas: 36047)
60+
TrailsRouterShimTest:test_forwardToRouter_return_data_handling() (gas: 766351)
61+
TrailsRouterShimTest:test_forwardToRouter_revert_with_custom_error() (gas: 724461)
62+
TrailsRouterShimTest:test_handleSequenceDelegateCall_empty_calldata() (gas: 13917)
63+
TrailsRouterShimTest:test_handleSequenceDelegateCall_large_calldata() (gas: 1682519)
64+
TrailsRouterShimTest:test_handleSequenceDelegateCall_max_call_value() (gas: 31893)
65+
TrailsRouterShimTest:test_handleSequenceDelegateCall_with_eth_value() (gas: 32194)
66+
TrailsRouterShimTest:test_handleSequenceDelegateCall_zero_call_value() (gas: 26964)
67+
TrailsRouterShimTest:test_sentinel_setting_with_different_op_hashes() (gas: 36731)
6868
TrailsRouterTest:testDelegateCallWithETH() (gas: 325931)
6969
TrailsRouterTest:testExecute_WithFailingMulticall() (gas: 362156)
7070
TrailsRouterTest:testHandleSequenceDelegateCall_InjectAndCall() (gas: 72380)

src/TrailsRouterShim.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ contract TrailsRouterShim is ITrailsRouterShim, DelegatecallGuard, Tstorish {
5555
// Decode the inner call data and call value forwarded to the router
5656
(bytes memory inner, uint256 callValue) = abi.decode(data, (bytes, uint256));
5757

58-
// Validate that only aggregate3() is called
58+
// Validate that only aggregate3Value() is called
5959
_validateRouterCall(inner);
6060

6161
bytes memory routerReturn = _forwardToRouter(inner, callValue);
@@ -83,8 +83,8 @@ contract TrailsRouterShim is ITrailsRouterShim, DelegatecallGuard, Tstorish {
8383
selector := mload(add(callData, 32))
8484
}
8585

86-
// Only allow `aggregate3` calls (0x82ad56cb)
87-
if (selector != 0x82ad56cb) {
86+
// Only allow `aggregate3Value` calls (0x174dea71)
87+
if (selector != 0x174dea71) {
8888
revert InvalidFunctionSelector(selector);
8989
}
9090
}

src/interfaces/IMulticall3.sol

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ interface IMulticall3 {
1515
bytes callData;
1616
}
1717

18+
struct Call3Value {
19+
address target;
20+
bool allowFailure;
21+
uint256 value;
22+
bytes callData;
23+
}
24+
1825
struct Result {
1926
bool success;
2027
bytes returnData;
@@ -25,4 +32,6 @@ interface IMulticall3 {
2532
// -------------------------------------------------------------------------
2633

2734
function aggregate3(Call3[] calldata calls) external payable returns (Result[] memory returnData);
35+
36+
function aggregate3Value(Call3Value[] calldata calls) external payable returns (Result[] memory returnData);
2837
}

0 commit comments

Comments
 (0)