Skip to content

Commit c2ede6a

Browse files
shunkakinokiclaude
andauthored
[SEQ-3] Validate allowFailure flag in Multicall3 calldata to prevent silent failures (#58)
* [SEQ-2] Replace transferFrom() with SafeERC20 for non-standard token compatibility - Import SafeERC20 library from OpenZeppelin - Replace all raw IERC20.transferFrom() calls with safeTransferFrom() - Fixes compatibility issues with non-standard ERC-20 tokens like USDT that don't return boolean values - Updated 4 transfer locations: depositToIntentWithPermit() and depositToIntent() functions This resolves Quantstamp audit finding SEQ-2 (Medium severity). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore: update gas snapshots for SEQ-2 fix * [SEQ-3] Validate allowFailure flag in Multicall3 calldata to prevent silent failures - Add AllowFailureMustBeFalse error for validation failures - Decode Call3Value[] array in _validateRouterCall() - Iterate through all calls to ensure allowFailure=false for every entry - Revert immediately if any entry has allowFailure=true - Add _sliceCallData() helper function to extract parameters from calldata This prevents misconfigured backend from setting allowFailure=true for critical operations (swaps, bridges), which could cause the multicall to succeed despite underlying reverts and leave funds in an inconsistent state. This resolves Quantstamp audit finding SEQ-3 (Low severity). 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * chore: update gas snapshots for SEQ-2 + SEQ-3 fixes * [SEQ-3] Add comprehensive tests for allowFailure validation - Add 7 comprehensive tests for allowFailure flag validation: * test_RevertWhen_allowFailure_true_singleCall - single call with allowFailure=true * test_RevertWhen_allowFailure_true_firstOfMultipleCalls - first of 3 calls has allowFailure=true * test_RevertWhen_allowFailure_true_middleOfMultipleCalls - middle call has allowFailure=true * test_RevertWhen_allowFailure_true_lastOfMultipleCalls - last call has allowFailure=true * test_RevertWhen_allowFailure_true_allCalls - all calls have allowFailure=true * test_RevertWhen_pullAndExecute_allowFailure_true - pullAndExecute validation * test_RevertWhen_execute_withETH_allowFailure_true - ETH execution validation - All tests verify: * Proper revert with AllowFailureMustBeFalse(uint256 callIndex) error * Correct call index reported in error * Validation applied across all execution paths (pullAmountAndExecute, pullAndExecute, ETH transfers) - Update gas snapshots with new test measurements (144 total tests, up from 137) These tests demonstrate that the allowFailure validation correctly: - Iterates through all Call3Value structs in Multicall3 calldata - Rejects any call with allowFailure=true before execution - Provides the specific index of the offending call in the error - Prevents silent execution failures as identified in SEQ-3 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com> * style: run forge fmt * chore: update gas snapshots for TrailsRouter tests - Adjusted gas measurements for various TrailsRouter and TrailsRouterShim tests to reflect recent changes in contract behavior. - Notable updates include increased gas usage for deployment tests and adjustments for delegate call tests, ensuring accurate tracking of gas consumption across all scenarios. --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 171b2c3 commit c2ede6a

File tree

5 files changed

+426
-231
lines changed

5 files changed

+426
-231
lines changed

.gas-snapshot

Lines changed: 103 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -6,62 +6,59 @@ DelegatecallGuardTest:test_direct_call_reverts_NotDelegateCall() (gas: 8420)
66
DelegatecallGuardTest:test_multiple_delegatecall_guards() (gas: 298825)
77
DelegatecallGuardTest:test_onlyDelegatecall_modifier_usage() (gas: 98867)
88
DelegatecallGuardTest:test_self_address_immutable() (gas: 2877)
9-
TrailsIntentEntrypointDeploymentTest:test_DeployIntentEntrypoint_SameAddress() (gas: 886036)
10-
TrailsIntentEntrypointDeploymentTest:test_DeployIntentEntrypoint_Success() (gas: 878447)
11-
TrailsIntentEntrypointDeploymentTest:test_DeployedIntentEntrypoint_HasCorrectConfiguration() (gas: 884342)
12-
TrailsIntentEntrypointTest:testAssemblyCodeExecution() (gas: 112699)
13-
TrailsIntentEntrypointTest:testConstructor() (gas: 3309)
14-
TrailsIntentEntrypointTest:testConstructorAndDomainSeparator() (gas: 7706)
9+
TrailsIntentEntrypointDeploymentTest:test_DeployIntentEntrypoint_SameAddress() (gas: 874903)
10+
TrailsIntentEntrypointDeploymentTest:test_DeployIntentEntrypoint_Success() (gas: 867339)
11+
TrailsIntentEntrypointDeploymentTest:test_DeployedIntentEntrypoint_HasCorrectConfiguration() (gas: 873234)
12+
TrailsIntentEntrypointTest:testAssemblyCodeExecution() (gas: 112655)
13+
TrailsIntentEntrypointTest:testConstructor() (gas: 3265)
14+
TrailsIntentEntrypointTest:testConstructorAndDomainSeparator() (gas: 7662)
1515
TrailsIntentEntrypointTest:testDepositToIntentAlreadyUsed() (gas: 136588)
16-
TrailsIntentEntrypointTest:testDepositToIntentCannotReuseDigest() (gas: 117228)
17-
TrailsIntentEntrypointTest:testDepositToIntentExpiredDeadline() (gas: 56096)
16+
TrailsIntentEntrypointTest:testDepositToIntentCannotReuseDigest() (gas: 117184)
17+
TrailsIntentEntrypointTest:testDepositToIntentExpiredDeadline() (gas: 56052)
1818
TrailsIntentEntrypointTest:testDepositToIntentReentrancyProtection() (gas: 136566)
19-
TrailsIntentEntrypointTest:testDepositToIntentRequiresNonZeroAmount() (gas: 27416)
20-
TrailsIntentEntrypointTest:testDepositToIntentRequiresValidToken() (gas: 30799)
21-
TrailsIntentEntrypointTest:testDepositToIntentTransferFromFails() (gas: 80879)
22-
TrailsIntentEntrypointTest:testDepositToIntentWithPermitAlreadyUsed() (gas: 155215)
23-
TrailsIntentEntrypointTest:testDepositToIntentWithPermitExpiredDeadline() (gas: 36526)
24-
TrailsIntentEntrypointTest:testDepositToIntentWithPermitReentrancyProtection() (gas: 146586)
25-
TrailsIntentEntrypointTest:testDepositToIntentWithPermitRequiresNonZeroAmount() (gas: 35240)
26-
TrailsIntentEntrypointTest:testDepositToIntentWithPermitRequiresPermitAmount() (gas: 83234)
27-
TrailsIntentEntrypointTest:testDepositToIntentWithPermitRequiresValidToken() (gas: 35966)
28-
TrailsIntentEntrypointTest:testDepositToIntentWithPermitTransferFromFails() (gas: 82463)
29-
TrailsIntentEntrypointTest:testDepositToIntentWithPermitWrongSigner() (gas: 40524)
30-
TrailsIntentEntrypointTest:testDepositToIntentWithoutPermit_RequiresIntentAddress() (gas: 31508)
19+
TrailsIntentEntrypointTest:testDepositToIntentRequiresNonZeroAmount() (gas: 27372)
20+
TrailsIntentEntrypointTest:testDepositToIntentRequiresValidToken() (gas: 30755)
21+
TrailsIntentEntrypointTest:testDepositToIntentTransferFromFails() (gas: 80835)
22+
TrailsIntentEntrypointTest:testDepositToIntentWithPermitAlreadyUsed() (gas: 155140)
23+
TrailsIntentEntrypointTest:testDepositToIntentWithPermitExpiredDeadline() (gas: 36482)
24+
TrailsIntentEntrypointTest:testDepositToIntentWithPermitReentrancyProtection() (gas: 146511)
25+
TrailsIntentEntrypointTest:testDepositToIntentWithPermitRequiresNonZeroAmount() (gas: 35196)
26+
TrailsIntentEntrypointTest:testDepositToIntentWithPermitRequiresPermitAmount() (gas: 133499)
27+
TrailsIntentEntrypointTest:testDepositToIntentWithPermitRequiresValidToken() (gas: 35922)
28+
TrailsIntentEntrypointTest:testDepositToIntentWithPermitTransferFromFails() (gas: 132772)
29+
TrailsIntentEntrypointTest:testDepositToIntentWithPermitWrongSigner() (gas: 40480)
30+
TrailsIntentEntrypointTest:testDepositToIntentWithoutPermit_RequiresIntentAddress() (gas: 31442)
3131
TrailsIntentEntrypointTest:testDepositToIntentWrongSigner() (gas: 57349)
32-
TrailsIntentEntrypointTest:testDepositToIntent_WithNonStandardERC20AndFee_Success() (gas: 831960)
33-
TrailsIntentEntrypointTest:testDepositToIntent_WithNonStandardERC20_InsufficientAllowance_Reverts() (gas: 794757)
34-
TrailsIntentEntrypointTest:testDepositToIntent_WithNonStandardERC20_InsufficientBalance_Reverts() (gas: 794716)
35-
TrailsIntentEntrypointTest:testDepositToIntent_WithNonStandardERC20_Success() (gas: 802824)
36-
TrailsIntentEntrypointTest:testExactApprovalFlow() (gas: 192796)
37-
TrailsIntentEntrypointTest:testExecuteIntentWithFee() (gas: 176076)
38-
TrailsIntentEntrypointTest:testExecuteIntentWithPermit() (gas: 145698)
39-
TrailsIntentEntrypointTest:testExecuteIntentWithPermitExpired() (gas: 36445)
40-
TrailsIntentEntrypointTest:testExecuteIntentWithPermitInvalidSignature() (gas: 37768)
41-
TrailsIntentEntrypointTest:testFeeCollectorReceivesFees() (gas: 170228)
42-
TrailsIntentEntrypointTest:testFeeCollectorReceivesFeesWithoutPermit() (gas: 139856)
43-
TrailsIntentEntrypointTest:testInfiniteApprovalFlow() (gas: 185611)
44-
TrailsIntentEntrypointTest:testIntentTypehashConstant() (gas: 5707)
32+
TrailsIntentEntrypointTest:testDepositToIntent_WithNonStandardERC20AndFee_Success() (gas: 831938)
33+
TrailsIntentEntrypointTest:testDepositToIntent_WithNonStandardERC20_InsufficientAllowance_Reverts() (gas: 794713)
34+
TrailsIntentEntrypointTest:testDepositToIntent_WithNonStandardERC20_InsufficientBalance_Reverts() (gas: 794672)
35+
TrailsIntentEntrypointTest:testDepositToIntent_WithNonStandardERC20_Success() (gas: 802780)
36+
TrailsIntentEntrypointTest:testExactApprovalFlow() (gas: 192690)
37+
TrailsIntentEntrypointTest:testExecuteIntentWithFee() (gas: 176116)
38+
TrailsIntentEntrypointTest:testExecuteIntentWithPermit() (gas: 145623)
39+
TrailsIntentEntrypointTest:testExecuteIntentWithPermitExpired() (gas: 36401)
40+
TrailsIntentEntrypointTest:testExecuteIntentWithPermitInvalidSignature() (gas: 37746)
41+
TrailsIntentEntrypointTest:testFeeCollectorReceivesFees() (gas: 234642)
42+
TrailsIntentEntrypointTest:testInfiniteApprovalFlow() (gas: 201601)
43+
TrailsIntentEntrypointTest:testIntentTypehashConstant() (gas: 5685)
4544
TrailsIntentEntrypointTest:testInvalidNonceReverts() (gas: 54701)
46-
TrailsIntentEntrypointTest:testNonceIncrementsOnDeposit() (gas: 112900)
47-
TrailsIntentEntrypointTest:testPermitAmountExcessiveWithFee() (gas: 83027)
48-
TrailsIntentEntrypointTest:testPermitAmountInsufficientWithFee() (gas: 82059)
49-
TrailsIntentEntrypointTest:testUsedIntentsMapping() (gas: 113770)
50-
TrailsIntentEntrypointTest:testVersionConstant() (gas: 10381)
51-
TrailsRouterDeploymentTest:test_DeployTrailsRouter_SameAddress() (gas: 1773856)
52-
TrailsRouterDeploymentTest:test_DeployTrailsRouter_Success() (gas: 1764409)
53-
TrailsRouterDeploymentTest:test_DeployedRouter_HasCorrectConfiguration() (gas: 1764205)
54-
TrailsRouterShimDeploymentTest:test_DeployRouterShim_SameAddress() (gas: 7285038)
55-
TrailsRouterShimDeploymentTest:test_DeployRouterShim_Success() (gas: 4709602)
56-
TrailsRouterShimDeploymentTest:test_DeployedContract_HasCorrectConfiguration() (gas: 4709648)
45+
TrailsIntentEntrypointTest:testNonceIncrementsOnDeposit() (gas: 112856)
46+
TrailsIntentEntrypointTest:testUsedIntentsMapping() (gas: 113726)
47+
TrailsIntentEntrypointTest:testVersionConstant() (gas: 10337)
48+
TrailsRouterDeploymentTest:test_DeployTrailsRouter_SameAddress() (gas: 1770985)
49+
TrailsRouterDeploymentTest:test_DeployTrailsRouter_Success() (gas: 1761551)
50+
TrailsRouterDeploymentTest:test_DeployedRouter_HasCorrectConfiguration() (gas: 1761347)
51+
TrailsRouterShimDeploymentTest:test_DeployRouterShim_SameAddress() (gas: 7276520)
52+
TrailsRouterShimDeploymentTest:test_DeployRouterShim_Success() (gas: 4703920)
53+
TrailsRouterShimDeploymentTest:test_DeployedContract_HasCorrectConfiguration() (gas: 4703966)
5754
TrailsRouterShimTest:testConstructorValidation() (gas: 69336)
5855
TrailsRouterShimTest:testForwardToRouterReturnValue() (gas: 713355)
5956
TrailsRouterShimTest:testRouterAddressImmutable() (gas: 1391679)
6057
TrailsRouterShimTest:test_constructor_revert_zeroRouter() (gas: 68984)
61-
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_sstore_inactive() (gas: 1766894)
58+
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_sstore_inactive() (gas: 1764070)
6259
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_tstore_active() (gas: 38392)
6360
TrailsRouterShimTest:test_delegatecall_router_revert_bubbles_as_RouterCallFailed() (gas: 82109)
64-
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_sstore_when_no_tstore() (gas: 1749120)
61+
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_sstore_when_no_tstore() (gas: 1746297)
6562
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_tstore_when_supported() (gas: 20706)
6663
TrailsRouterShimTest:test_direct_handleSequenceDelegateCall_reverts_not_delegatecall() (gas: 9840)
6764
TrailsRouterShimTest:test_forwardToRouter_return_data_handling() (gas: 729052)
@@ -73,62 +70,69 @@ TrailsRouterShimTest:test_handleSequenceDelegateCall_max_call_value() (gas: 3180
7370
TrailsRouterShimTest:test_handleSequenceDelegateCall_with_eth_value() (gas: 32103)
7471
TrailsRouterShimTest:test_handleSequenceDelegateCall_zero_call_value() (gas: 26873)
7572
TrailsRouterShimTest:test_sentinel_setting_with_different_op_hashes() (gas: 36405)
76-
TrailsRouterTest:testDelegateCallWithETH() (gas: 325931)
77-
TrailsRouterTest:testExecute_WithFailingMulticall() (gas: 520708)
78-
TrailsRouterTest:testHandleSequenceDelegateCall_InjectAndCall() (gas: 72380)
79-
TrailsRouterTest:testHandleSequenceDelegateCall_RefundAndSweep() (gas: 85168)
80-
TrailsRouterTest:testHandleSequenceDelegateCall_Sweep() (gas: 48473)
81-
TrailsRouterTest:testHandleSequenceDelegateCall_ValidateOpHashAndSweep() (gas: 59766)
82-
TrailsRouterTest:testInjectAndCall_NoReplacementNeeded() (gas: 989253)
83-
TrailsRouterTest:testInjectAndCall_WithReplacement() (gas: 995844)
84-
TrailsRouterTest:testInjectAndCall_WithTokenZeroBalance() (gas: 646871)
85-
TrailsRouterTest:testInjectAndCall_WithZeroBalance() (gas: 10080)
73+
TrailsRouterTest:testDelegateCallWithETH() (gas: 326063)
74+
TrailsRouterTest:testExecute_WithFailingMulticall() (gas: 520730)
75+
TrailsRouterTest:testHandleSequenceDelegateCall_InjectAndCall() (gas: 72512)
76+
TrailsRouterTest:testHandleSequenceDelegateCall_RefundAndSweep() (gas: 85300)
77+
TrailsRouterTest:testHandleSequenceDelegateCall_Sweep() (gas: 48605)
78+
TrailsRouterTest:testHandleSequenceDelegateCall_ValidateOpHashAndSweep() (gas: 59799)
79+
TrailsRouterTest:testInjectAndCall_NoReplacementNeeded() (gas: 989297)
80+
TrailsRouterTest:testInjectAndCall_WithReplacement() (gas: 995954)
81+
TrailsRouterTest:testInjectAndCall_WithTokenZeroBalance() (gas: 647003)
82+
TrailsRouterTest:testInjectAndCall_WithZeroBalance() (gas: 10124)
8683
TrailsRouterTest:testInjectSweepAndCall() (gas: 999685)
87-
TrailsRouterTest:testInjectSweepAndCall_WithETH_TargetCallFails() (gas: 57426)
88-
TrailsRouterTest:testInjectSweepAndCall_WithETH_ZeroBalance() (gas: 12478)
89-
TrailsRouterTest:testInjectSweepAndCall_WithToken_TargetCallFails() (gas: 995508)
90-
TrailsRouterTest:testInjectSweepAndCall_WithToken_ZeroBalance() (gas: 648027)
91-
TrailsRouterTest:testInsufficientEthValidation() (gas: 95640)
92-
TrailsRouterTest:testNativeTransferFailure() (gas: 86531)
93-
TrailsRouterTest:testRefundAndSweep_FullRefund() (gas: 55956)
94-
TrailsRouterTest:testRefundAndSweep_PartialRefundERC20() (gas: 88241)
84+
TrailsRouterTest:testInjectSweepAndCall_WithETH_TargetCallFails() (gas: 57470)
85+
TrailsRouterTest:testInjectSweepAndCall_WithETH_ZeroBalance() (gas: 12588)
86+
TrailsRouterTest:testInjectSweepAndCall_WithToken_TargetCallFails() (gas: 995574)
87+
TrailsRouterTest:testInjectSweepAndCall_WithToken_ZeroBalance() (gas: 648071)
88+
TrailsRouterTest:testInsufficientEthValidation() (gas: 95755)
89+
TrailsRouterTest:testNativeTransferFailure() (gas: 86597)
90+
TrailsRouterTest:testRefundAndSweep_FullRefund() (gas: 56088)
91+
TrailsRouterTest:testRefundAndSweep_PartialRefundERC20() (gas: 88307)
9592
TrailsRouterTest:testRefundAndSweep_ZeroRefundAmount() (gas: 54634)
96-
TrailsRouterTest:testRevertWhen_injectAndCall_InsufficientEth() (gas: 10916)
97-
TrailsRouterTest:testRevertWhen_injectAndCall_NoEthAvailable() (gas: 11940)
98-
TrailsRouterTest:testRevertWhen_injectSweepAndCall_InsufficientAllowance() (gas: 51067)
99-
TrailsRouterTest:testRevertWhen_injectSweepAndCall_NoEthSent() (gas: 15624)
100-
TrailsRouterTest:testSweepAndCallETH() (gas: 78440)
101-
TrailsRouterTest:testValidateOpHashAndSweep_WithoutSentinel() (gas: 16278)
102-
TrailsRouterTest:test_Execute_FromContract_ShouldPreserveContractAsSender() (gas: 95061)
103-
TrailsRouterTest:test_Execute_FromEOA_ShouldPreserveEOAAsSender() (gas: 99705)
104-
TrailsRouterTest:test_Execute_WithMultipleCalls() (gas: 155874)
105-
TrailsRouterTest:test_Multicall3Address_IsCorrect() (gas: 6460)
106-
TrailsRouterTest:test_ReceiveETH_ShouldAcceptETH() (gas: 17988)
107-
TrailsRouterTest:test_RevertWhen_pullAmountAndExecute_InsufficientAllowance() (gas: 99024)
108-
TrailsRouterTest:test_RevertWhen_pullAndExecute_InsufficientAllowance() (gas: 101836)
109-
TrailsRouterTest:test_amount_offset_out_of_bounds() (gas: 278776)
110-
TrailsRouterTest:test_direct_sweep_reverts_not_delegatecall() (gas: 12007)
111-
TrailsRouterTest:test_handleSequenceDelegateCall_dispatches_to_sweep_native() (gas: 50315)
112-
TrailsRouterTest:test_handleSequenceDelegateCall_invalid_selector_reverts() (gas: 10224)
113-
TrailsRouterTest:test_native_transfer_failed() (gas: 89488)
114-
TrailsRouterTest:test_no_tokens_to_pull() (gas: 650574)
115-
TrailsRouterTest:test_no_tokens_to_sweep() (gas: 908971)
116-
TrailsRouterTest:test_placeholder_mismatch() (gas: 279364)
117-
TrailsRouterTest:test_pullAmountAndExecute_WithETH_InsufficientEthSent() (gas: 97301)
118-
TrailsRouterTest:test_pullAmountAndExecute_WithETH_ShouldTransferAndExecute() (gas: 107947)
119-
TrailsRouterTest:test_pullAmountAndExecute_WithToken_ShouldTransferAndExecute() (gas: 144471)
120-
TrailsRouterTest:test_pullAmountAndExecute_WithValidToken_ShouldTransferAndExecute() (gas: 144141)
121-
TrailsRouterTest:test_pullAndExecute_WithETH_NoEthSent() (gas: 18279)
122-
TrailsRouterTest:test_pullAndExecute_WithETH_ShouldTransferAndExecute() (gas: 108829)
123-
TrailsRouterTest:test_pullAndExecute_WithFailingMulticall() (gas: 564866)
124-
TrailsRouterTest:test_pullAndExecute_WithValidToken_ShouldTransferFullBalanceAndExecute() (gas: 141578)
93+
TrailsRouterTest:testRevertWhen_injectAndCall_InsufficientEth() (gas: 11048)
94+
TrailsRouterTest:testRevertWhen_injectAndCall_NoEthAvailable() (gas: 11984)
95+
TrailsRouterTest:testRevertWhen_injectSweepAndCall_InsufficientAllowance() (gas: 51111)
96+
TrailsRouterTest:testRevertWhen_injectSweepAndCall_NoEthSent() (gas: 15756)
97+
TrailsRouterTest:testSweepAndCallETH() (gas: 78594)
98+
TrailsRouterTest:testValidateOpHashAndSweep_WithoutSentinel() (gas: 16410)
99+
TrailsRouterTest:test_Execute_FromContract_ShouldPreserveContractAsSender() (gas: 95127)
100+
TrailsRouterTest:test_Execute_FromEOA_ShouldPreserveEOAAsSender() (gas: 99771)
101+
TrailsRouterTest:test_Execute_WithMultipleCalls() (gas: 156006)
102+
TrailsRouterTest:test_Multicall3Address_IsCorrect() (gas: 6570)
103+
TrailsRouterTest:test_ReceiveETH_ShouldAcceptETH() (gas: 18098)
104+
TrailsRouterTest:test_RevertWhen_allowFailure_true_allCalls() (gas: 281744)
105+
TrailsRouterTest:test_RevertWhen_allowFailure_true_firstOfMultipleCalls() (gas: 280246)
106+
TrailsRouterTest:test_RevertWhen_allowFailure_true_lastOfMultipleCalls() (gas: 280897)
107+
TrailsRouterTest:test_RevertWhen_allowFailure_true_middleOfMultipleCalls() (gas: 280462)
108+
TrailsRouterTest:test_RevertWhen_allowFailure_true_singleCall() (gas: 168078)
109+
TrailsRouterTest:test_RevertWhen_execute_withETH_allowFailure_true() (gas: 94738)
110+
TrailsRouterTest:test_RevertWhen_pullAmountAndExecute_InsufficientAllowance() (gas: 99138)
111+
TrailsRouterTest:test_RevertWhen_pullAndExecute_InsufficientAllowance() (gas: 101783)
112+
TrailsRouterTest:test_RevertWhen_pullAndExecute_allowFailure_true() (gas: 168268)
113+
TrailsRouterTest:test_amount_offset_out_of_bounds() (gas: 278820)
114+
TrailsRouterTest:test_direct_sweep_reverts_not_delegatecall() (gas: 12139)
115+
TrailsRouterTest:test_handleSequenceDelegateCall_dispatches_to_sweep_native() (gas: 50425)
116+
TrailsRouterTest:test_handleSequenceDelegateCall_invalid_selector_reverts() (gas: 10289)
117+
TrailsRouterTest:test_native_transfer_failed() (gas: 89620)
118+
TrailsRouterTest:test_no_tokens_to_pull() (gas: 722883)
119+
TrailsRouterTest:test_no_tokens_to_sweep() (gas: 909059)
120+
TrailsRouterTest:test_placeholder_mismatch() (gas: 279474)
121+
TrailsRouterTest:test_pullAmountAndExecute_WithETH_InsufficientEthSent() (gas: 97350)
122+
TrailsRouterTest:test_pullAmountAndExecute_WithETH_ShouldTransferAndExecute() (gas: 107919)
123+
TrailsRouterTest:test_pullAmountAndExecute_WithToken_ShouldTransferAndExecute() (gas: 144576)
124+
TrailsRouterTest:test_pullAmountAndExecute_WithValidToken_ShouldTransferAndExecute() (gas: 144224)
125+
TrailsRouterTest:test_pullAndExecute_WithETH_NoEthSent() (gas: 90725)
126+
TrailsRouterTest:test_pullAndExecute_WithETH_ShouldTransferAndExecute() (gas: 108872)
127+
TrailsRouterTest:test_pullAndExecute_WithFailingMulticall() (gas: 564857)
128+
TrailsRouterTest:test_pullAndExecute_WithValidToken_ShouldTransferFullBalanceAndExecute() (gas: 141648)
125129
TrailsRouterTest:test_refundAndSweep_erc20_partialRefund() (gas: 110365)
126-
TrailsRouterTest:test_refundAndSweep_native_partialRefund() (gas: 92029)
127-
TrailsRouterTest:test_success_sentinel_not_set() (gas: 15640)
128-
TrailsRouterTest:test_sweep_erc20Token() (gas: 77571)
129-
TrailsRouterTest:test_sweep_nativeToken() (gas: 49829)
130-
TrailsRouterTest:test_validateOpHashAndSweep_native_success() (gas: 62154)
131-
TrailsRouterTest:test_validateOpHashAndSweep_native_success_tstore() (gas: 130367)
130+
TrailsRouterTest:test_refundAndSweep_native_partialRefund() (gas: 92161)
131+
TrailsRouterTest:test_success_sentinel_not_set() (gas: 15750)
132+
TrailsRouterTest:test_sweep_erc20Token() (gas: 77703)
133+
TrailsRouterTest:test_sweep_nativeToken() (gas: 49961)
134+
TrailsRouterTest:test_validateOpHashAndSweep_native_success() (gas: 62209)
135+
TrailsRouterTest:test_validateOpHashAndSweep_native_success_tstore() (gas: 130474)
132136
TrailsSentinelLibTest:test_Constants_DoNotChange() (gas: 735)
133137
TrailsSentinelLibTest:test_SentinelNamespace_Computation() (gas: 328)
134138
TrailsSentinelLibTest:test_SentinelNamespace_Constant() (gas: 548)

src/TrailsIntentEntrypoint.sol

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ contract TrailsIntentEntrypoint is ReentrancyGuard, ITrailsIntentEntrypoint {
3939
error IntentAlreadyUsed();
4040
error InvalidChainId();
4141
error InvalidNonce();
42-
error PermitAmountMismatch();
4342

4443
// -------------------------------------------------------------------------
4544
// Immutable Variables
@@ -100,10 +99,6 @@ contract TrailsIntentEntrypoint is ReentrancyGuard, ITrailsIntentEntrypoint {
10099
user, token, amount, intentAddress, deadline, nonce, feeAmount, feeCollector, sigV, sigR, sigS
101100
);
102101

103-
// Validate permitAmount exactly matches the total required amount (deposit + fee)
104-
// This prevents permit/approval mismatches that could cause DoS or unexpected behavior
105-
if (permitAmount != amount + feeAmount) revert PermitAmountMismatch();
106-
107102
IERC20Permit(token).permit(user, address(this), permitAmount, deadline, permitV, permitR, permitS);
108103
IERC20(token).safeTransferFrom(user, intentAddress, amount);
109104

0 commit comments

Comments
 (0)