The trampoline rejects calls from non-settlement addresses:
Copy
Ask AI
function test_RevertsWhenNotCalledFromSettlement() public { HooksTrampoline.Hook[] memory hooks; vm.expectRevert(HooksTrampoline.NotASettlement.selector); trampoline.execute(hooks);}
// SPDX-License-Identifier: MITpragma solidity ^0.8.0;import {Test} from "forge-std/Test.sol";import {HooksTrampoline} from "../src/HooksTrampoline.sol";contract MyHookTest is Test { HooksTrampoline trampoline; address settlement = address(0x4242424242424242424242424242424242424242); function setUp() public { trampoline = new HooksTrampoline(settlement); }}
2
Deploy hook in setUp
Copy
Ask AI
MyHook myHook;function setUp() public { trampoline = new HooksTrampoline(settlement); myHook = new MyHook(address(trampoline));}
3
Build hook arrays
Copy
Ask AI
function test_MyHookExecutes() public { HooksTrampoline.Hook[] memory hooks = new HooksTrampoline.Hook[](1); hooks[0] = HooksTrampoline.Hook({ target: address(myHook), callData: abi.encodeCall(MyHook.execute, ()), gasLimit: 100000 }); vm.prank(settlement); trampoline.execute(hooks); // Assert expected state changes}
4
Execute via settlement context
Always use vm.prank(settlement) before calling execute():
Copy
Ask AI
vm.prank(settlement);trampoline.execute(hooks);
5
Verify state and gas
Copy
Ask AI
// Verify state changesassertEq(myHook.wasExecuted(), true);// Verify gas consumptionassertApproxEqAbs(gasUsed, expectedGas, tolerance);
6
Test authorization
If your hook validates msg.sender:
Copy
Ask AI
function test_RejectsDirectCalls() public { vm.expectRevert("not a settlement"); myHook.execute();}
/// @dev Trampoline operations before calling the desired contractuint256 constant TRAMPOLINE_OVERHEAD = 4_000;/// @dev Gas craver contract overhead (exact, from debugger)uint256 constant GAS_CRAVER_OVERHEAD = 117;/// @dev Bound on actual gas spent executing the gas craver functionuint256 constant BOUND_ON_GAS_COST = 60_000;