{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"dac7fdb4-c231-4d5f-979f-17855ab2de9c","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"90dfac257806800d74a3f9431d29d83d8ac5b94fc7083253201e9b83c984feea","dependsOn":["manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":"b291283050f347e0b0ad75f74f598581e4e33c0ed578ede41f5c1de813e425eb","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"Launch Curb (CURB) with the Uniswap v4 hook in src/CurbHook.sol from this repository with no changes to the production source unless an audit finding requires one; launch.json in the repository root is the manifest. Token: src/CurbToken.sol, name Curb, symbol CURB, 18 decimals, fixed 1,000,000,000 supply minted once to its deployer, no constructor arguments, no owner, mint, burn, tax or pause. Hook: src/CurbHook.sol (OpenZeppelin uniswap-hooks v1.3.0-rc.0 BaseHook), constructor arguments in order: $poolManager; $token; $factory (the only address allowed to initialize the pool); $owner (the CurbDesk contract that pays for this launch); then the literals 1000, 100, 300, 15, 900, 1800, 100000, true (bandTicks, edgeTicks, refWindow seconds, limitSeconds, haltSeconds, cooldownSeconds, minLiquidityE18, arbBlocks). Permissions beforeInitialize, beforeSwap, afterSwap (flags 0x20C0), CREATE2-mined. Pool fee 12500 static, tick spacing 60, paired with IMD. Only the launch factory may initialize the pool, once. The hook takes no fee of its own, returns no deltas and has no liquidity callbacks, so adding, removing and the factory's zero-liquidity fee collect are untouched. It refuses a swap that would end outside a 1000-tick band around a 5-minute time-weighted reference and further from it (a swap toward the reference always passes), and halts the pool both ways for at most 15 minutes when the price holds at the band edge for 15 seconds; the owner can only shorten a halt or pin the pre-move reference through the cooldown, never lengthen a halt or move funds. Tests: forge test passes offline (188 tests, fork tests skip without RH_RPC); IMD's univ4_hook protected suites pass via script/protected.sh; docs/VERIFICATION.md records a Robinhood fork rehearsal of this exact LaunchFactory.launch call. CurbDesk (desk/CurbDesk.sol) is deployed separately from the steward's wallet and is not part of this launch, so it sits outside src/. This relaunches #2255, which parked because the bytecode check read the last byte of a 32-byte constant stored after CurbDesk's code as DELEGATECALL; the hook and token are byte-identical to #2255's.","parentJobId":null,"planHash":"4f166e7e00cfd2af607e46441592b68eb0429f3bb3f795a23732f8cf411d6755","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"dac7fdb4-c231-4d5f-979f-17855ab2de9c","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2266-launch-curb-curb-uniswap"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51873","feedbackHash":"6095e7a07acf6dd63811678d66bae997ffcb74a9141a8216f747ea3b56cc9d54","nodeKey":"audit_imported_code","submissionHash":"90dfac257806800d74a3f9431d29d83d8ac5b94fc7083253201e9b83c984feea","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53913","feedbackHash":"c9cdc4ade3464554ba5551cdc1cc7ba274bcbbafb1dd01163c6b274cb26e6191","nodeKey":"manifest","submissionHash":"b291283050f347e0b0ad75f74f598581e4e33c0ed578ede41f5c1de813e425eb","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"f18d2994211c37a2d6e5c3e591033aa915a4d6d23afcd5510651d818d1cde05c","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"42a6bb6aa496cd6b","findings":[{"citation":"resolved","description":"Breaker.beforeSwap accumulates `lastTick * elapsed` into the TWAP numerator on every swap, whether or not the tick that held since the last swap had any liquidity in range. The design (CurbHook NatSpec lines 42-45, Breaker lines 28-34, FAILURE-MODES 'Under the opening price') says prices where nothing trades 'never roll the reference' and 'never become the reference'. Only the roll trigger is gated on `liquid`; the samples are not. A launch pool is single-sided, so one side of the opening price is empty and moving the price there costs nothing (v4 jumps to the price limit with zero amounts). Sequence: (1) from the opening tick, a dust swap with a price limit 950 ticks into the empty side lands there for free, inside the band; (2) nobody trades for one 300 s window (or the attacker simply waits); (3) any swap back into liquidity starts in the void, so `liquid` is false, no roll happens, but `cum += 950 * 300`; (4) the very next swap starts in liquidity and rolls: twap = 285000/300 = 950, and rollRef clamps it to tick + 899. With the price at -100 the reference becomes 799 and the band [-201, 1799]: every swap carrying the price more than 101 ticks further into the LIQUID side is refused with OutsideBand, while the empty side is wide open. The attacker repeats the free push each window, so the reference is held 899 ticks into the void indefinitely at dust cost. In the real launch the empty side is the cheaper-CURB side, so this caps how far buyers can bid the price above opening (~1% per 5 minutes) for as long as the attacker keeps pushing. Side effect: after the roll the price sits 899 from the reference, so a 1-tick move away enters the edge zone (dist >= 900) with liquidity and a halt starts 15 s later with no 9.5% push (FAILURE-MODES prices a halt at ~3 IMD; here it is gas), and each halt lets anyone call CurbDesk.fileIncident, which spends 0.5 IMD of the desk treasury per incident. The void-admission escape in CurbHook._afterSwap does not help: the refused swaps start in liquidity, so voidStart is false. Fix direction: do not sample void time. When the last landed tick had no liquidity (record it in _land), reset `windowStart`/`lastObs` to nowTs and `cum` to 0 in beforeSwap instead of accumulating, or exclude void samples from `cum` and the denominator.","line":172,"path":"src/libraries/Breaker.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {Hooks} from \"v4-core/src/libraries/Hooks.sol\";\nimport {TickMath} from \"v4-core/src/libraries/TickMath.sol\";\nimport {StateLibrary} from \"v4-core/src/libraries/StateLibrary.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"v4-core/src/types/PoolOperation.sol\";\nimport {PoolSwapTest} from \"v4-core/src/test/PoolSwapTest.sol\";\nimport {PoolModifyLiquidityTest} from \"v4-core/src/test/PoolModifyLiquidityTest.sol\";\nimport {MockERC20} from \"solmate/src/test/utils/mocks/MockERC20.sol\";\nimport {CurbHook} from \"src/CurbHook.sol\";\nimport {ICurbHook} from \"src/interfaces/ICurbHook.sol\";\n\n/// @dev Time the price spends where nothing trades is still sampled into the reference TWAP. A\n/// dust holder pushes the price into the empty range for free, waits one window, steps back into\n/// liquidity, and the next roll drags the reference 899 ticks toward the empty range. From then on\n/// the band blocks the liquid side at 101 ticks from the current price.\ncontract VoidTwapDragTest is Test {\n    using StateLibrary for IPoolManager;\n\n    address constant FACTORY = address(0xFAC7);\n    address constant OWNER = address(0xD35C);\n    uint160 constant FLAGS = 0x20C0;\n    uint160 constant SQRT_PRICE_1_1 = 79228162514264337593543950336;\n    uint128 constant LIQUIDITY = 1e24;\n\n    PoolManager manager;\n    PoolSwapTest swapRouter;\n    PoolModifyLiquidityTest lpRouter;\n    MockERC20 curb;\n    MockERC20 imd;\n    CurbHook hook;\n    PoolKey key;\n\n    function setUp() public {\n        vm.warp(1_000_000);\n        vm.roll(100);\n        manager = new PoolManager(address(this));\n        swapRouter = new PoolSwapTest(manager);\n        lpRouter = new PoolModifyLiquidityTest(manager);\n        MockERC20 a = new MockERC20(\"A\", \"A\", 18);\n        MockERC20 b = new MockERC20(\"B\", \"B\", 18);\n        (curb, imd) = address(a) < address(b) ? (a, b) : (b, a);\n        curb.mint(address(this), 1e30);\n        imd.mint(address(this), 1e30);\n        curb.approve(address(swapRouter), type(uint256).max);\n        imd.approve(address(swapRouter), type(uint256).max);\n        curb.approve(address(lpRouter), type(uint256).max);\n        imd.approve(address(lpRouter), type(uint256).max);\n\n        address at = address(\n            (uint160(uint256(keccak256(\"curb-void-drag\"))) & ~uint160(Hooks.ALL_HOOK_MASK)) | FLAGS\n        );\n        deployCodeTo(\n            \"CurbHook.sol:CurbHook\",\n            abi.encode(manager, address(curb), FACTORY, OWNER, int24(1000), int24(100), uint32(300), uint32(15), uint32(900), uint32(1800), uint32(1), true),\n            at\n        );\n        hook = CurbHook(at);\n        key = PoolKey(Currency.wrap(address(curb)), Currency.wrap(address(imd)), 12500, 60, IHooks(at));\n        vm.prank(FACTORY);\n        manager.initialize(key, SQRT_PRICE_1_1);\n        // Launch-like: liquidity in range at the opening tick 0 and below it; nothing above tick 60.\n        lpRouter.modifyLiquidity(key, ModifyLiquidityParams(-887220, 60, int256(uint256(LIQUIDITY)), 0), \"\");\n    }\n\n    function tick() internal view returns (int24 t) {\n        (, t,,) = IPoolManager(address(manager)).getSlot0(key.toId());\n    }\n\n    function moveTo(int24 target) internal {\n        bool zeroForOne = target < tick();\n        swapRouter.swap(\n            key, SwapParams(zeroForOne, -1e29, TickMath.getSqrtPriceAtTick(target)), PoolSwapTest.TestSettings(false, false), \"\"\n        );\n    }\n\n    function test_voidTimeDragsReferenceAndBlocksLiquidSide() public {\n        assertEq(hook.status().ref, 0);\n\n        // 1. Free push into the empty range, inside the band (no liquidity above 60: costs ~nothing).\n        moveTo(950);\n        assertEq(tick(), 950);\n\n        // 2. One reference window passes with the price parked there.\n        vm.warp(block.timestamp + 300);\n\n        // 3. Back into liquidity. Starts in the void, so no roll happens on this swap.\n        moveTo(-100);\n        assertEq(tick(), -100);\n\n        // 4. The next swap rolls the reference from a TWAP made of 300 s at tick 950.\n        moveTo(-101);\n        int24 ref = hook.status().ref;\n        emit log_named_int(\"reference after roll\", ref);\n\n        // The reference must not be built from prices where nothing trades: it should sit in the\n        // liquid range (at or below tick 60), not 799.\n        assertLe(ref, 60, \"reference dragged into the empty range\");\n\n        // And a seller moving 200 more ticks into the liquid side must pass.\n        moveTo(-300);\n        assertEq(tick(), -300);\n    }\n}","reproduction":"Pool initialised at tick 0 with 1e24 liquidity in [-887220, 60) and nothing above 60 (launch-like; minLiquidity 1e18 in the test, 1e23 on the launch, same logic). t0: swap with price limit at tick 950 -> passes (dist 950 <= band 1000), lands at 950 with zero liquidity, costs nothing. t0+300: swap to -100 -> liquid before = false, no roll, cum = 950*300 = 285000; lands at -100. Same timestamp: swap to -101 -> roll: twap 950, ref = clamp(950, -999, 799) = 799; status().lower = -201. Then swap to -300 -> expected: passes (300 ticks from the real market, well inside any band built from liquid prices); actual: reverts OutsideBand(799, -300, -201, zeroForOne). test/scratch/VoidTwapDrag.t.sol fails with 'reference dragged into the empty range: 799 > 60'.","severity":"high","snippet":"        s.cum += int56(s.lastTick) * int56(uint56(nowTs - s.lastObs));","title":"Time the price spends in a no-liquidity range is sampled into the reference TWAP, so a free push into the void drags the reference 899 ticks and caps the liquid side at 101 ticks per window"},{"citation":"resolved","description":"ICurbHook.Status documents that while a halt has ended but no swap has closed it, `ref` 'already show[s] what the close will set'. Breaker._close computes the pinned reference with BandMath.rollRef(edgeRef, tick, band, edge), which clamps to tick +/- (band - edge - 1) = 899, but status() uses BandMath.pinRef(edgeRef, tick, band), which clamps to tick +/- 1000. For a close with no liquidity in range _close keeps pinRef(s.ref, tick, band) while status() shows lastTick. Readers (the desk's incident window is unaffected; keepers, the CLI preflight and traders are) see wrong `ref`, `lower` and `upper` until the closing swap.","line":160,"path":"src/CurbHook.sol","reproduction":"Full-range 1e24 liquidity, tick 0, ref 0. Swap to tick 950 (edge zone, LimitEntered). Warp +16 s (halted). Owner calls resolve(0, Concentrated). Warp +900 s (halt over, not closed). status().ref = pinRef(0, 950, 1000) = 0, status().lower = -1000. Any swap then closes the incident and sets ref = rollRef(0, 950, 1000, 100) = 51, lower = -949. Expected: the preview equals 51/-949. Actual: 0/-1000. test/scratch/StatusMismatch.t.sol fails with 'status() preview differs from what the close set: 0 != 51'.","severity":"low","snippet":"            s.ref = pin ? BandMath.pinRef(breaker.edgeRef, breaker.lastTick, c.band) : breaker.lastTick;","title":"status() previews a different post-halt reference than _close will set for a Concentrated verdict and for a close in a no-liquidity range"},{"citation":"resolved","description":"The only guard on launch() is launchBound, which bind() sets later. While a launch request is Requested or Completed the steward can call launch() again; _pay approves and the Intake pulls the full launch.open price a second time, and launchRequestId is overwritten. The Intake's later onResult/onRequestFailure for the first id then hit the `else revert UnknownRequest` branches, so the first launch's result and uri are never recorded even though that launch did happen on chain (bind(n) still works since it reads the factory). A retry after a Failed request is the legitimate use; a guard such as `launchState == RequestState.Requested || launchState == RequestState.Completed -> revert` keeps the retry and removes the double payment. Steward-only, so loss is limited to the desk's own treasury on a steward mistake.","line":211,"path":"desk/CurbDesk.sol","reproduction":"Desk funded with 2 * price IMD. steward: launch(body) -> request id A, treasury -price. steward: launch(body) again before bind -> succeeds, request id B, treasury -price again, launchRequestId = B. Intake delivers onResult(A, hash, uri) -> reverts UnknownRequest(A); launchState stays Requested, launchUri empty. Expected: second launch refused while A is in flight or completed; actual: paid twice and A's result unrecordable.","severity":"low","snippet":"        if (launchBound) revert AlreadyBound();","title":"CurbDesk.launch can be repeated until bind: each call pays the launch price again and orphans the earlier request's callbacks"},{"citation":"resolved","description":"CurbDesk.classify reads the top tx.origin's share of the window volume: <= 3000 bps Organic, >= 6000 bps Concentrated. One actor driving a move from four fresh EOAs holds 2500 bps each and is attested Organic, which reopens the halt early and re-centres the reference on the manipulated price. FAILURE-MODES documents this and accepts it; recorded here so the adapter and the panel do not treat the verdict as a defence against a funded actor. No code change required by the launch policy.","line":263,"path":"src/CurbHook.sol","reproduction":"Window volume 1000 IMD moved by EOAs e1..e4 at 250 each. Oracle answers leader e1, figure 250. classify(250, 1000) = (Organic, 2500). _settle calls hook.resolve(nonce, Organic) -> halt ends now, next close sets ref = lastTick (the moved price). Expected under the design's intent: Concentrated/pin; actual: Organic.","severity":"info","snippet":"        emit Trade(tx.origin, volume);","title":"Trade tape keys traders by tx.origin, so the Concentrated verdict is evaded by splitting a move across wallets (acknowledged in FAILURE-MODES)"},{"citation":"resolved","description":"LaunchFactory.claimFees pays the requester 80% of both pool currencies. The desk receives CURB as well as IMD, and by design has no function that moves any asset except IMD into the Intake. Every CURB fee claimed this way is locked in the desk forever. Not a launch-policy violation and consistent with the desk's stated custody model, but it is a permanent sink the requester should accept knowingly; a steward-only sweep of non-IMD assets would recover it without weakening the IMD custody rule.","line":271,"path":"desk/CurbDesk.sol","reproduction":"Pool trades 10,000 CURB and 10 IMD of volume at 1.25% LP fee; fileIncident(hook) during a halt calls claimFees -> desk receives 100 CURB and 0.1 IMD (80% shares). Expected: CURB usable by the desk's operator; actual: no function in CurbDesk can transfer it.","severity":"info","snippet":"            try factory.claimFees(pool.launchNumber) {} catch {}","title":"The CURB half of the requester fee share swept by fileIncident is unrecoverable from the desk"}],"hash":"90dfac257806800d74a3f9431d29d83d8ac5b94fc7083253201e9b83c984feea","nodeId":"c03ccb47-ddf2-4296-a7be-7bf10e42f9eb","outcome":"completed","summary":"The review is complete. Findings are in `.imd-findings.json` with a coverage row for every listed entry point, and the production tree is unchanged (only the ignored findings file and `test/scratch/` were created).\n\n**Outcome:** one high finding with a failing proof, two lows, two informational notes. The token, the manifest, and the hook's access control, permissions and fee behaviour all hold. The full suite (188 passed, 2 fork tests skipped) and both token orders of the protected suites (13 passed each) ran clean locally.\n\n**High: void time is sampled into the reference TWAP** (`src/libraries/Breaker.sol:172`). The hook gates the *roll* on in-range liquidity but not the *samples*. A launch pool is single-sided, so one side of the opening price is empty and the price can be parked there for free. A dust holder pushes 950 ticks into the void, waits one 300-second window, steps back into liquidity, and the next roll produces a TWAP of 950 that clamps the reference to 899 ticks from the current price. From then on the band refuses any move more than 101 ticks further into the liquid side, renewable each window at gas cost. The proof `test/scratch/VoidTwapDrag.t.sol` fails on this code (reference lands at 799) and passes with a minimal fix that resets the window after a void landing, which I verified on a temporary copy and restored. Side effects worth the adapter's attention: a one-tick move after the drag enters the edge zone, so halts become free, and every halt lets anyone spend 0.5 IMD of the desk's treasury through `fileIncident`.\n\n**Low findings:**\n- `status()` previews a different post-halt reference than the close actually sets after a Concentrated verdict (0 vs 51 in the scratch test), and for a close in a void range, contradicting the interface's documented guarantee.\n- `CurbDesk.launch` can be called repeatedly until `bind`, paying the launch price each time and orphaning the earlier request's callbacks. Steward-only, so limited to a steward mistake.\n\n**Informational:** the Trade tape keys on `tx.origin`, so a four-wallet split reads Organic (already acknowledged in FAILURE-MODES), and the CURB half of the requester fee share that `fileIncident` sweeps is locked in the desk forever by design.\n\n**Read:** CurbHook, CurbToken, HookFlags, Breaker, BandMath, L2Block, the three interfaces, OracleAttestation, CurbRouter, DrillToken, CurbDesk, the vendored BaseHook, launch.json and the verification notes. **Not reached:** OracleQuestion.sol's body canonicalisation, the fork rehearsal test, and the live factory and Intake code, which exist only as interfaces in this tree.","treeHash":null,"usage":{"cachedInputTokens":1483814,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":44589,"runtime":"claude","turns":31,"wallClockMs":1158452}},{"artifacts":[],"attempt":1,"bundleHash":"bef1c2c1f3754d6b6d830a637701df0e9e4c3b1c802a4ac0f269addba99b3994","device":"aa66e5f63eecc2a5","findings":[],"hash":"b291283050f347e0b0ad75f74f598581e4e33c0ed578ede41f5c1de813e425eb","nodeId":"ca6dd7ac-f5ab-403d-956a-7175cdcc9e80","outcome":"completed","summary":"Updated [launch.json](/home/imd2/.identitymd/work/dac7fdb4-c231-4d5f-979f-17855ab2de9c/ca6dd7ac-f5ab-403d-956a-7175cdcc9e80/launch.json). Constructor arguments and permissions match the implementation; pool values match the brief. Notes remain below 4,000 characters.\n\nValidation passed:\n\n- Offline build.\n- 188 tests with the specified fuzz seed; 2 fork tests skipped.\n- 13 protected tests in each token order.\n\nOnly the manifest changed outside disposable test scaffolding.","treeHash":"4ad007ab00f50b414974e6fd980e747b9194bb13","usage":{"cachedInputTokens":3334400,"inputTokens":95589,"model":"gpt-6-astra","outputTokens":12439,"runtime":"codex","turns":12,"wallClockMs":718294}}],"verification":[{"checks":[{"durationMs":103552,"exitCode":0,"name":"build","output":"Compiling 143 files with Solc 0.8.26\nSolc 0.8.26 finished in 103.40s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/CurbHook.t.sol:57:25:\n   |\n57 |     function _initFresh(uint256 seed, PoolKey memory k, address as_) internal returns (bytes memory) {\n   |                         ^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> test/protected/Owners.protected.t.sol:127:5:\n    |\n127 |     function test_theHookIsNotOwnedByTheFactoryOrIMD() public {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":1496,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/Scaffold.t.sol:ScaffoldTest\n[PASS] test_toolchain() (gas: 7791)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 342.35µs (53.85µs CPU time)\n\nRan 2 tests for test/fork/LaunchRehearsal.t.sol:LaunchRehearsalTest\n[SKIP] test_rehearsal_curbAboveImd() (gas: 0)\n[SKIP] test_rehearsal_curbBelowImd() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 2 skipped; finished in 594.32µs (75.99µs CPU time)\n\nRan 1 test for test/oracle/OracleQuestion.t.sol:OracleQuestionTest\n[PASS] test_protocolVectorHash() (gas: 37038)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 386.18µs (160.86µs CPU time)\n\nRan 1 test for test/HookGas.t.sol:HookGasTest\n[PASS] test_swapOverhead() (gas: 370831)\nLogs:\n  swap with CurbHook 204767\n  swap without hook  137992\n  overhead           66775\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.07ms (522.12µs CPU time)\n\nRan 1 test for test/CurbHook.t.sol:CurbHookNativePairTest\n[PASS] test_nativePair_tapeCountsEth() (gas: 210850)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.27ms (375.87µs CPU time)\n\nRan 8 tests for test/CurbRouter.t.sol:CurbRouterTest\n[PASS] test_addLiquidity() (gas: 256252)\n[PASS] test_drillToken() (gas: 30808)\n[PASS] test_refusedSwap_needsNoBalance() (gas: 227523)\n[PASS] test_simulate_bubblesOutsideBand() (gas: 118013)\n[PASS] test_simulate_returnsDeltas() (gas: 188980)\n[PASS] test_swap_bothDirections_erc20() (gas: 397374)\n[PASS] test_swap_native_refundsExcessEth() (gas: 767890)\n[PASS] test_unlockCallback_onlyManager() (gas: 32429)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 5.33ms (3.00ms CPU time)\n\nRan 3 tests for test/oracle/DeskConformance.t.sol:DeskConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 207653)\n[PASS] test_callbackSelectorIsCanonical() (gas: 696)\n[PASS] test_digestMatchesTheProtocol() (gas: 10300)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 10.01ms (9.30ms CPU time)\n\nRan 3 tests for test/oracle/RealAttestation.t.sol:RealAttestationTest\n[PASS] test_otherConsumerFails() (gas: 70587)\n[PASS] test_realSignatureFromLiveOracle() (gas: 18729)\n[PASS] test_tamperedFigureFails() (gas: 21693)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 10.73ms (12.52ms CPU time)\n\nRan 36 tests for test/CurbDeskIncidents.t.sol:CurbDeskIncidentsTest\n[PASS] test_answer_forOldNonce_neverTouchesNewIncident() (gas: 2397221)\n[PASS] test_answer_lateAfterHaltClosed_recordedNotApplied() (gas: 1961337)\n[PASS] test_answer_pushAfterCallback_refused() (gas: 1778435)\n[PASS] test_callback_fitsIn200k() (gas: 1722520)\n[PASS] test_classify_totalZero_inconclusive() (gas: 7004)\n[PASS] test_classify_zeroFigure_inconclusive() (gas: 6914)\n[PASS] test_failure_marksFailed_noRefile() (gas: 1727868)\n[PASS] test_file_bodyGolden() (gas: 171344)\n[PASS] test_file_claimRevertDoesNotBlockFiling() (gas: 1538916)\n[PASS] test_file_launchPoolSweepsFees_tryCatch() (gas: 1576836)\n[PASS] test_file_oncePerNonce() (gas: 1601329)\n[PASS] test_file_priceAboveCapRefused() (gas: 667698)\n[PASS] test_file_reentryFromFeeClaimFilesOnce() (gas: 1583108)\n[PASS] test_file_requestShape() (gas: 1755743)\n[PASS] test_file_requiresHalted() (gas: 115286)\n[PASS] test_file_treasuryShort_exactArgs() (gas: 639958)\n[PASS] test_file_unknownPool() (gas: 38269)\n[PASS] test_file_windowTooFresh() (gas: 619476)\n[PASS] test_postMortem_bodyAndResult() (gas: 4093392)\n[PASS] test_postMortem_needsTwoPrices() (gas: 1824190)\n[PASS] test_postMortem_requiresAnswer() (gas: 1576966)\n[PASS] test_question_isCanonical() (gas: 21504)\n[PASS] test_settle_badSignature() (gas: 1599803)\n[PASS] test_settle_boundary_3000Organic() (gas: 1760742)\n[PASS] test_settle_boundary_3001Inconclusive() (gas: 1746336)\n[PASS] test_settle_boundary_5999Inconclusive() (gas: 1722819)\n[PASS] test_settle_boundary_6000Concentrated() (gas: 1764630)\n[PASS] test_settle_expired() (gas: 1589001)\n[PASS] test_settle_figureAboveTotal_inconclusive() (gas: 1722809)\n[PASS] test_settle_listLengthNotOne_inconclusive() (gas: 1724155)\n[PASS] test_settle_organic_resolvesOrganic() (gas: 1772277)\n[PASS] test_settle_unknownRequest() (gas: 1582683)\n[PASS] test_settle_weakPanel() (gas: 1636018)\n[PASS] test_settle_wrongQuestion() (gas: 1582957)\n[PASS] test_settle_wrongSender() (gas: 1577811)\n[PASS] test_submitAttestation_anyoneCanPush() (gas: 1685300)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 14.02ms (51.19ms CPU time)\n\nRan 34 tests for test/CurbHook.t.sol:CurbHookCurbIsCurrency0Test\n[PASS] test_band_exactOutputPastBand_refused() (gas: 236603)\n[PASS] test_band_insideAndTowardReference_pass() (gas: 671924)\n[PASS] test_band_maxLimitSell_refused() (gas: 242501)\n[PASS] test_band_refusesPastLower() (gas: 159619)\n[PASS] test_band_refusesPastUpper_withWrappedOutsideBand() (gas: 154563)\n[PASS] test_callbacks_refuseNonPoolManager() (gas: 92516)\n[PASS] test_closeIlliquid_keepsReference() (gas: 1498543)\n[PASS] test_constructor_refusesBadParams() (gas: 115088)\n[PASS] test_dustBelowMinimum_isNotLiquidity() (gas: 1164204)\n[PASS] test_haltClosed_emittedOnFirstSwapAfter() (gas: 490052)\n[PASS] test_halted_swapRevertsWrapped() (gas: 352543)\n[PASS] test_incidentWindow_usesArbSysBlocks() (gas: 13031)\n[PASS] test_init_acceptsInitializerOnLaunchKey() (gas: 42608)\n[PASS] test_init_refusesDynamicFee() (gas: 104724)\n[PASS] test_init_refusesKeyWithoutToken() (gas: 840181)\n[PASS] test_init_refusesOtherSender() (gas: 104512)\n[PASS] test_init_refusesSecondPool() (gas: 781968)\n[PASS] test_init_refusesWrongFee() (gas: 105184)\n[PASS] test_init_refusesWrongSpacing() (gas: 104916)\n[PASS] test_l2Block_fallsBackWithoutArbSys() (gas: 290247)\n[PASS] test_l2Block_forkedArbSysCostsBoundedGas() (gas: 256450)\n[PASS] test_noForbiddenOpcodes() (gas: 3154216)\n[PASS] test_params() (gas: 11552)\n[PASS] test_permissions_are_0x20C0() (gas: 9080)\n[PASS] test_resolve_onlyOwner() (gas: 584196)\n[PASS] test_runtimeSize_under_24576() (gas: 5626)\n[PASS] test_status_phases() (gas: 361014)\n[PASS] test_trade_emitsOriginAndPairedVolume_exactIn() (gas: 558511)\n[PASS] test_trade_exactOut_countsPairedSide() (gas: 248581)\n[PASS] test_voidStart_stillCapsMovesWithinTheVoid() (gas: 876759)\n[PASS] test_voidStart_strandedReferenceIsEscapable() (gas: 2357789)\n[PASS] test_volume_sameBlockRoll() (gas: 668922)\n[PASS] test_zeroLiquidity_freePushCannotHalt() (gas: 873438)\n[PASS] test_zeroLiquidity_freePushCannotWalkReference() (gas: 1071322)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 18.66ms (38.31ms CPU time)\n\nRan 4 tests for test/CurbToken.t.sol:CurbTokenTest\n[PASS] testFuzz_transferIsExact(address,uint256) (runs: 512, μ: 77988, ~: 78343)\n[PASS] test_metadata() (gas: 24615)\n[PASS] test_mintsWholeSupplyToDeployer() (gas: 15343)\n[PASS] test_noMintSelector() (gas: 57612)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 18.76ms (18.37ms CPU time)\n\nRan 20 tests for test/CurbDesk.t.sol:CurbDeskTest\n[PASS] testFuzz_noTokenLeavesExceptIntakePrice(uint256,address) (runs: 512, μ: 752282, ~: 631325)\n[PASS] test_bindDrill_stewardOnly_ownerCheck() (gas: 490622)\n[PASS] test_bind_once() (gas: 691395)\n[PASS] test_bind_onlySteward() (gas: 289892)\n[PASS] test_bind_requiresRequesterAndOwner() (gas: 871160)\n[PASS] test_bind_unknownLaunch() (gas: 55025)\n[PASS] test_fund() (gas: 190897)\n[PASS] test_intakeIsImmutable() (gas: 8258)\n[PASS] test_launchFailure_recorded() (gas: 468122)\n[PASS] test_launch_onlySteward() (gas: 114179)\n[PASS] test_launch_paysExactPrice_viaRequestWithFailure() (gas: 450046)\n[PASS] test_launch_priceAboveCapRefused() (gas: 155066)\n[PASS] test_launch_refusedAfterBind() (gas: 501584)\n[PASS] test_launch_treasuryShort() (gas: 127825)\n[PASS] test_onResult_onlyIntake() (gas: 36205)\n[PASS] test_onResult_recordsLaunchResult() (gas: 571599)\n[PASS] test_renounce_disablesSteward() (gas: 151086)\n[PASS] test_steward_onlyStewardProposes() (gas: 32766)\n[PASS] test_timelock_executeBefore48hReverts_afterWorks() (gas: 140428)\n[PASS] test_timelock_nothingProposed() (gas: 38150)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 45.26ms (45.92ms CPU time)\n\nRan 26 tests for test/Breaker.t.sol:BreakerTest\n[PASS] testFuzz_resolve_neverExtends(uint64,bool) (runs: 512, μ: 135211, ~: 125193)\n[PASS] test_closeIlliquid_keepsReference() (gas: 165745)\n[PASS] test_cooldown_fromScheduledEnd_afterOrganic() (gas: 181721)\n[PASS] test_edgeEntry_startsClock() (gas: 88510)\n[PASS] test_edgeExitIntoVoid_clearsClock() (gas: 178211)\n[PASS] test_edgeExit_clearsClock() (gas: 132522)\n[PASS] test_halt_endsAtMax_thenCloses_recenters() (gas: 127653)\n[PASS] test_halt_startsAfterLimitSeconds() (gas: 125632)\n[PASS] test_limit_staysWhileInEdge() (gas: 124429)\n[PASS] test_nextHaltSpacing_atLeast_halt_plus_cooldown_plus_limit() (gas: 202352)\n[PASS] test_phase_pendingClose_reportsCooldownThenOpen() (gas: 109766)\n[PASS] test_pin_blocksRolls_untilCooldownEnd_thenRollUsesPostHaltSamplesOnly() (gas: 362321)\n[PASS] test_pin_keepsReferenceFromLimitEntry() (gas: 274270)\n[PASS] test_pin_leavesEdgeRoom_afterDump() (gas: 206462)\n[PASS] test_pin_suspendsEdgeClock() (gas: 205225)\n[PASS] test_refusedSwap_changesNothing() (gas: 72849)\n[PASS] test_resolveConcentrated_fullHalt_pinsEdgeRef() (gas: 293973)\n[PASS] test_resolveOrganic_reopensNow_recenters() (gas: 182712)\n[PASS] test_resolve_refusals() (gas: 282593)\n[PASS] test_roll_clearsLimit() (gas: 122563)\n[PASS] test_roll_followsTwap() (gas: 98452)\n[PASS] test_silentHalt_closesOnFirstSwapAfterEnd() (gas: 117541)\n[PASS] test_voidStart_admittedFromBoundary() (gas: 122731)\n[PASS] test_voidStart_boundaryTooFar() (gas: 109716)\n[PASS] test_voidStart_notWhenStartedLiquid() (gas: 48721)\n[PASS] test_zeroLiquidity_noRoll_noEdgeClock() (gas: 178279)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 785.88ms (22.34ms CPU time)\n\nRan 34 tests for test/CurbHook.t.sol:CurbHookCurbIsCurrency1Test\n[PASS] test_band_exactOutputPastBand_refused() (gas: 236603)\n[PASS] test_band_insideAndTowardReference_pass() (gas: 671864)\n[PASS] test_band_maxLimitSell_refused() (gas: 242501)\n[PASS] test_band_refusesPastLower() (gas: 159604)\n[PASS] test_band_refusesPastUpper_withWrappedOutsideBand() (gas: 154554)\n[PASS] test_callbacks_refuseNonPoolManager() (gas: 92516)\n[PASS] test_closeIlliquid_keepsReference() (gas: 1498644)\n[PASS] test_constructor_refusesBadParams() (gas: 115040)\n[PASS] test_dustBelowMinimum_isNotLiquidity() (gas: 1141579)\n[PASS] test_haltClosed_emittedOnFirstSwapAfter() (gas: 490024)\n[PASS] test_halted_swapRevertsWrapped() (gas: 352511)\n[PASS] test_incidentWindow_usesArbSysBlocks() (gas: 13031)\n[PASS] test_init_acceptsInitializerOnLaunchKey() (gas: 42599)\n[PASS] test_init_refusesDynamicFee() (gas: 104850)\n[PASS] test_init_refusesKeyWithoutToken() (gas: 840190)\n[PASS] test_init_refusesOtherSender() (gas: 104521)\n[PASS] test_init_refusesSecondPool() (gas: 781968)\n[PASS] test_init_refusesWrongFee() (gas: 105310)\n[PASS] test_init_refusesWrongSpacing() (gas: 105042)\n[PASS] test_l2Block_fallsBackWithoutArbSys() (gas: 290386)\n[PASS] test_l2Block_forkedArbSysCostsBoundedGas() (gas: 256418)\n[PASS] test_noForbiddenOpcodes() (gas: 3154216)\n[PASS] test_params() (gas: 11552)\n[PASS] test_permissions_are_0x20C0() (gas: 9080)\n[PASS] test_resolve_onlyOwner() (gas: 584168)\n[PASS] test_runtimeSize_under_24576() (gas: 5626)\n[PASS] test_status_phases() (gas: 360982)\n[PASS] test_trade_emitsOriginAndPairedVolume_exactIn() (gas: 558350)\n[PASS] test_trade_exactOut_countsPairedSide() (gas: 248597)\n[PASS] test_voidStart_stillCapsMovesWithinTheVoid() (gas: 876884)\n[PASS] test_voidStart_strandedReferenceIsEscapable() (gas: 2357740)\n[PASS] test_volume_sameBlockRoll() (gas: 668826)\n[PASS] test_zeroLiquidity_freePushCannotHalt() (gas: 873549)\n[PASS] test_zeroLiquidity_freePushCannotWalkReference() (gas: 1071433)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 786.42ms (26.64ms CPU time)\n\nRan 14 tests for test/BandMath.t.sol:BandMathTest\n[PASS] testFuzz_pinRef_keepsTickInBand(int24,int24,int24) (runs: 512, μ: 2550, ~: 2641)\n[PASS] testFuzz_refused_neverTowardReference(int24,int24,int24,int24) (runs: 512, μ: 3328, ~: 3179)\n[PASS] testFuzz_rollRef_keepsTickInsideBandOutsideEdge(int24,int24,int24,int24) (runs: 512, μ: 4004, ~: 3858)\n[PASS] test_clamp() (gas: 687)\n[PASS] test_dist() (gas: 792)\n[PASS] test_inEdge() (gas: 1239)\n[PASS] test_limits_saturateAtTickBounds() (gas: 1001)\n[PASS] test_refused_insideBand_passes() (gas: 1640)\n[PASS] test_refused_outsideAndFurther() (gas: 2297)\n[PASS] test_refused_outsideButCloser_passes() (gas: 1335)\n[PASS] test_rollRef_clamps() (gas: 1774)\n[PASS] test_twap_idleWindowUsesLastTick() (gas: 801)\n[PASS] test_twap_lastSecondPushBarelyMoves() (gas: 1143)\n[PASS] test_twap_negativeFloors() (gas: 1136)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 786.45ms (840.95ms CPU time)\n\nRan 2 tests for test/invariant/CurbHookInvariants.t.sol:CurbHookInvariants\n[PASS]\nCurbHookInvariants invariants:\n[PASS] invariant_1_haltNeverLongerThanHaltSeconds\n[PASS] invariant_2_haltStartsSpaced\n[PASS] invariant_3_resolveNeverExtends\n[PASS] invariant_4_liveness_noHookRevertOnTowardOrInBandOutsideHalt\n[PASS] invariant_5_priceAlwaysInsideBand\n[PASS] invariant_6_collectAlwaysSucceeds\n[PASS] invariant_7_onlyPoolManager\n[PASS] invariant_8_totalVolumeEqualsTradeSum\n CurbHookInvariants invariants (runs: 64, calls: 4096, reverts: 502)\n\n╭-------------+---------------+-------+---------+----------╮\n| Contract    | Selector      | Calls | Reverts | Discards |\n+==========================================================+\n| HookHandler | approve       | 502   | 502     | 0        |\n|-------------+---------------+-------+---------+----------|\n| HookHandler | collect       | 505   | 0       | 0        |\n|-------------+---------------+-------+---------+----------|\n| HookHandler | pressEdge     | 554   | 0       | 0        |\n|-------------+---------------+-------+---------+----------|\n| HookHandler | resolve       | 542   | 0       | 0        |\n|-------------+---------------+-------+---------+----------|\n| HookHandler | strayCallback | 471   | 0       | 0        |\n|-------------+---------------+-------+---------+----------|\n| HookHandler | swap          | 497   | 0       | 0        |\n|-------------+---------------+-------+---------+----------|\n| HookHandler | waitAndSwap   | 511   | 0       | 0        |\n|-------------+---------------+-------+---------+----------|\n| HookHandler | warp          | 514   | 0       | 0        |\n╰-------------+---------------+-------+---------+----------╯\n\nLogs:\n  swaps 12 refusals 7 halted reverts 6\n  halts closed 3 verdicts applied 1\n\n[PASS] test_soak_longRandomWalk() (gas: 535628529)\nLogs:\n  soak: swaps 1130 refusals 478 halted reverts 260\n  soak: halts closed 150 verdicts applied 47\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.27s (2.05s CPU time)\n\nRan 16 test suites in 1.28s (3.76s CPU time): 188 tests passed, 0 failed, 2 skipped (190 total tests)\n","passed":true},{"durationMs":101,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"CurbDesk.bind(uint64)\",\"CurbDesk.bindDrill(address)\",\"CurbDesk.commissionPostMortem(address,uint32)\",\"CurbDesk.executeOracleSigner()\",\"CurbDesk.fileIncident(address)\",\"CurbDesk.fund(uint256)\",\"CurbDesk.launch(bytes)\",\"CurbDesk.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"CurbDesk.onRequestFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"CurbDesk.onResult(bytes32,bytes32,string)\",\"CurbDesk.proposeOracleSigner(address)\",\"CurbDesk.renounce()\",\"CurbDesk.submitAttestation(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"CurbHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"CurbHook.afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"CurbHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"CurbHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"CurbHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"CurbHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"CurbHook.beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"CurbHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"CurbHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"CurbHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"CurbHook.resolve(uint32,uint8)\",\"CurbRouter.addLiquidity((address,address,uint24,int24,address),int24,int24,uint128)\",\"CurbRouter.simulate((address,address,uint24,int24,address),bool,int256,uint160)\",\"CurbRouter.swap((address,address,uint24,int24,address),bool,int256,uint160)\",\"CurbRouter.unlockCallback(bytes)\",\"CurbToken.approve(address,uint256)\",\"CurbToken.transfer(address,uint256)\",\"CurbToken.transferFrom(address,address,uint256)\",\"DrillToken.approve(address,uint256)\",\"DrillToken.transfer(address,uint256)\",\"DrillToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitattributes\":1,\".gitignore\":11,\"FAILURE-MODES.md\":189,\"LICENSE\":21,\"README.md\":110,\"SECURITY.md\":114,\"desk/CurbDesk.sol\":558,\"docs/GAS.md\":49,\"docs/VERIFICATION.md\":108,\"foundry.toml\":42,\"launch.json\":38,\"remappings.txt\":6,\"script/Mainnet.s.sol\":141,\"script/drill.sh\":98,\"script/protected.sh\":47,\"src/CurbHook.sol\":311,\"src/CurbToken.sol\":14,\"src/HookFlags.sol\":45,\"src/interfaces/ICurbHook.sol\":75,\"src/interfaces/IIntake.sol\":29,\"src/interfaces/ILaunchFactory.sol\":16,\"src/libraries/BandMath.sol\":79,\"src/libraries/Breaker.sol\":281,\"src/libraries/L2Block.sol\":26,\"src/oracle/OracleAttestation.sol\":221,\"src/oracle/OracleQuestion.sol\":255,\"src/tools/CurbRouter.sol\":134,\"src/tools/DrillToken.sol\":13,\"test/BandMath.t.sol\":103,\"test/Breaker.t.sol\":308,\"test/CurbDesk.t.sol\":296,\"test/CurbDeskIncidents.t.sol\":474,\"test/CurbHook.t.sol\":500,\"test/CurbRouter.t.sol\":125,\"test/CurbToken.t.sol\":46,\"test/HookGas.t.sol\":54,\"test/Scaffold.t.sol\":17,\"test/fixtures/kept-launch-input.hex\":1,\"test/fixtures/oracle_attestation_sample.json\":1,\"test/fork/LaunchRehearsal.t.sol\":306,\"test/fork/imd/LaunchTypes.sol\":64,\"test/invariant/CurbHookInvariants.t.sol\":101,\"test/invariant/HookHandler.sol\":269,\"test/oracle/DeskConformance.t.sol\":107,\"test/oracle/OracleQuestion.t.sol\":24,\"test/oracle/RealAttestation.t.sol\":70,\"test/protected/Hook.protected.t.sol\":293,\"test/protected/Owners.protected.t.sol\":209,\"test/protected/README.md\":9,\"test/protected/Token.protected.t.sol\":189,\"test/protected/support/MockERC20.sol\":11,\"test/protected/support/OwnerChecks.sol\":19,\"test/protected/support/Swapper.sol\":51,\"test/utils/BreakerHarness.sol\":69,\"test/utils/CurbFixture.sol\":165,\"test/utils/MockArbSys.sol\":12,\"test/utils/MockIntake.sol\":89,\"test/utils/MockLaunchFactory.sol\":61},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b291283050f347e0b0ad75f74f598581e4e33c0ed578ede41f5c1de813e425eb","verifiedTreeHash":"4ad007ab00f50b414974e6fd980e747b9194bb13","verifierVersion":"0.1.0+6a374fcd"}]}