{"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":"407c3cbb-d967-4666-99e6-0ab7139c141f","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"399e7496ff5e6d37366a6ac3765e79fbf42fb455178176ae04caea9549628650","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"1c94510f9478f0c9ec743c1829caaf5d220fc9b155b10217c12a36c06505d6e1","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"793d9ec286da1c7d29e94c8773da4c8119b1f742a8622f4577ee6d5a4ca8d651","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"aba4821b06a9ff308f0e6f48be952c668a9073663ed38fe0fc16abb3e156fad3","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"ca66bd09c7e0bbf40755061380c3ef168c3be3295c8fb1c47a5cbe2a4e11ddc4","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"3c8e9199d9f5799cc343c5aa237d1c22fe933113a039ea6f83a9ca384553b529","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"9e5de3aca77ccefd83ad1ae80321cd2bb36d6957f5071f98680ff2055b8248a3","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"4101d2652118c454e841261357526313d5d18527722ca3bfcba08bb72b36af02","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Token name: UNLOCK. Token symbol: UNLK. Deploy the existing fixed project on Sepolia (11155111) through univ4_hook, native ETH pair, poolBps=8700. NEW launch, not job.continue/retry of 1534. A new test token/pool is authorized. No mainnet deployment or website. Deliver an activated official pool with working trades and claims.\n\nSOURCE: https://github.com/identity-md-launches/launch-1534-unlock\nRequired fixed commit: f0149886ac3c09b57a0e1d676582e6aeaeb7a69f\nRestore this exact published project, preserving workspace .git/protected checks. Record provenance. No rebuild, old bundles or pre-fix f77cf377. Fetch this source even if the workspace is empty; prose URLs do not populate repoUrl/baseCommit automatically. Supported import must preserve univ4_hook.\n\nLaunch 1534 was parked for oversized HookDeployer. Fix job 0edcb64f-c0cf-4ac9-afed-176758f17cde published this commit: helper 728 bytes, hook 24328; production bytecode unchanged. Reproduce 175 tests/five release-gate tests; local success is not service admission. Read docs/SIZE_FIX.md, docs/DEPLOYMENT.md and docs/SECURITY_REVIEW.md. Preserve the encoder fix. Check all attested artifact/runtime/initcode sizes without exemptions, protected tests, hashes and manifest.\n\nBEFORE BROADCAST: Verify Sepolia factory/registry/distributor/manager/feed against the pins and current policy. Use policy opening price, not a manifest placeholder. Rehearse both stages on a recorded-block fork. Verify an executable service or owner-wallet path for stage 2, with concrete calls/signing method; never request private keys. Stage 1 requires an executable activation path. Future addresses are outputs, not user prerequisites. Report missing platform operations and publish completed artifacts.\n\nSTAGE 1: Authorized factory deploys UnlkToken, UnlkHook and native distributor, distributes supply and initializes/seeds the official pool with this hook in its PoolKey from the start. Keep constructor inputs [$poolManager,$token,$factory,$owner]; no companion constructor prerequisites. Use verified new launch number, payer, root, addresses and policy, never old hardcoded identities. Authenticate manager/factory, bind once and permit required seed liquidity. UNCONFIGURED rejects swaps, credit sync and milestones while allowing ordinary transfers and eligible native claims. Never add/replace the hook later or substitute another pool.\n\nSTAGE 2: From actual stage-1 records, execute the reviewed deployCompanions call with pinned router/evidence/oracle creation code, certify the ACTUAL complete round-0 allocation tree (chunked if needed), then configureAndActivate through the authorized setup wallet. Verify unique recipients, native distributor, allocation provenance, reviewed code/settings, pool/manager/token/feed and reciprocal bindings. Failed activation changes nothing; success permanently seals setup. No later upgrades, pausing, replacements, counter resets, exemptions or admin withdrawals. Claims made before activation must remain provable and creditable once afterwards. Native claims never depend on credit sync.\n\nPRESERVE: 1 billion UNLK, 18 decimals, minted once to factory; 10% swarm / 87% pool / 3% payer with documented seed rounding. Plain unrestricted ERC-20 transfers. Official 1.25% trade fee: 1% payer, 0.25% IMD; zero extra hook fee. Verify locked initial principal and fee-collection rights. Authenticated actual traders, replay/bypass protection and atomic executed-delta accounting remain enforced.\n\nPer wallet E counts verified pool buys, original payer allocation and actual native claims; S counts executed sales. Q=max(0,floor(E*p/10000)-S); no cross-wallet quota use or transfer/donation/liquidity credits. Initially p=2500; verified USD FDV $100K:3500, $250K:4500, $500K:5500, $1M:7000, $2.5M:8500; $5M permanently bypasses quotas for everyone, including transfer-only holders. Fees/authentication remain; declines never relock. Preserve the revised TWAP/feed/depth/sequential-confirmation rules. Invalid data cannot advance tiers or revoke rights. No silent economic/oracle changes to force deployment.\n\nObtain required independent review. Disclose remaining sustained-price manipulation, protocol-fee-triggered trading halt, treasury reward-round powers and other-pool bypass. This request does not waive release checks or accept new risks. Do not claim production safety.\n\nDELIVER: published source/commit, reproducible test/review results, actual Sepolia addresses, transaction/explorer links, PoolKey/PoolId, ABIs, source verification and sealed activation evidence. Test buys, permitted/excess sells, transfer-only holders, eligible native claim/sync/sale, fees and principal protection. Respect claim release times; label local/fork/public tests separately. If blocked, publish code/package and exact failure. Stage 1 alone means \"pool deployed, trading inactive\". Never invent success.\n\nToken name: UNLOCK\nToken symbol: UNLK","parentJobId":null,"planHash":"12f13f2d4a851ac79ee88b6661dbc2e5c61c40f668c57eeacbba4cdc8975adb8","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"407c3cbb-d967-4666-99e6-0ab7139c141f","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1560-unlock"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52250","feedbackHash":"68e636bd556128c068a46e701f87b693e6086f09686bc7b80be4018cc78ca95d","nodeKey":"audit_economics","submissionHash":"399e7496ff5e6d37366a6ac3765e79fbf42fb455178176ae04caea9549628650","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50989","feedbackHash":"8d22da5207540551e5344194314bf266adc49d05f60561152b790b4400735880","nodeKey":"audit_flow","submissionHash":"1c94510f9478f0c9ec743c1829caaf5d220fc9b155b10217c12a36c06505d6e1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50969","feedbackHash":"d481feb04033cd971b7d53c689532ace32ebd55b8260aaf3a99859092da095bd","nodeKey":"audit_judge","submissionHash":"7055f0fae258c5cffebbf7d8ed08c5147608b7838ba8a168efcad4e6674bcc14","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52161","feedbackHash":"eccde37bc376ed1d3e7208b80f64de839efb922b22c354c90cc7c8701cd8fb9f","nodeKey":"audit_judge","submissionHash":"793d9ec286da1c7d29e94c8773da4c8119b1f742a8622f4577ee6d5a4ca8d651","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51511","feedbackHash":"e9f08bd4a547596094a15cad8d60552c6c9cb9b721a18ad646d122fcd9dc8131","nodeKey":"audit_math","submissionHash":"aba4821b06a9ff308f0e6f48be952c668a9073663ed38fe0fc16abb3e156fad3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51423","feedbackHash":"721d46d3eeab89e95f9dc17632c516e6e5dddf91cbb520feb1bce9a5b5c77e71","nodeKey":"audit_permissions","submissionHash":"ca66bd09c7e0bbf40755061380c3ef168c3be3295c8fb1c47a5cbe2a4e11ddc4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50981","feedbackHash":"b9d4b0a31d39a45de2155e65cd66522467ebbc895ad95d24ed9048f37535e885","nodeKey":"build_contract_project","submissionHash":"3c8e9199d9f5799cc343c5aa237d1c22fe933113a039ea6f83a9ca384553b529","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51456","feedbackHash":"f48b2bcab20b7c8c2d95fd8e954fa4b1170c8a2455155935e642750d23b4b999","nodeKey":"build_contract_project","submissionHash":"a915d214da2998e9279a1b65fcdfcb2f2963caaa9ed770232dd605303d3cb64c","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51446","feedbackHash":"7986d09a23a5f3e87cb98e2d4c0182243ad97e8e3be5e5ee617e41dabd859d46","nodeKey":"manifest","submissionHash":"6479ec566b3729d65a83187c7ffb905e73f227c7c94a443111a4c83a5027b8c9","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51540","feedbackHash":"b50c55b945bf7cafd248517adab35dce10870d059b072608b2d2893840566af4","nodeKey":"manifest","submissionHash":"9e5de3aca77ccefd83ad1ae80321cd2bb36d6957f5071f98680ff2055b8248a3","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51539","feedbackHash":"bdee5e819662c16d7272013d6a04be52c7b24eb35f6c31f66978ce90a60cd80e","nodeKey":"write_foundry_tests","submissionHash":"87c99c422522ae7ba50593acc14c13fe632b06480977f043897f3eba6584af74","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52173","feedbackHash":"d541656591e91b2a404ce37118bb25d0577c5ef72f99a7bd692e6fee8ac246fe","nodeKey":"write_foundry_tests","submissionHash":"4101d2652118c454e841261357526313d5d18527722ca3bfcba08bb72b36af02","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"73fc5e0f835ab1c765e2d80468ee3abbb5daf2001d0cb00cbd0bc54dfa6f7977","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e36579e0223ff908","findings":[{"citation":"resolved","description":"The official pool holds only the factory's token-side seed (range LOWER..seedUpper). Above seedUpper there is no liquidity, so an exact-input sell whose input exceeds what the pool's ETH reserve can absorb is partially filled and v4's swap loop then walks the price through the empty region to the request's sqrtPriceLimitX96 (the fixture and any ordinary client use MAX_SQRT_PRICE-1). The pool's economic state afterwards is identical to launch (the seed again holds every token, as at initialization where `sqrtPrice == rangeUpper` is classed liquid), but slot0's tick is 887271, so `checkpoint()` records `liquid = false` for the afterSwap observation and for every later observation until a buy moves the price back into the range. While that observation is the latest one, `twapTick()` reverts (`!last.liquid`), and once a buy restores liquidity the window still contains bad seconds, so `endBad != startBad` reverts for the next two hours. `_updateMilestone` catches these reverts and takes no sample; because the gap between valid samples then exceeds MAX_CONFIRMATION_GAP (10 minutes), an in-progress 6-hour (or 24-hour) confirmation run restarts from zero. Any wallet whose quota is worth at least the pool's current ETH reserve can trigger this at will and at near-zero cost (it sells at market and may rebuy; its unused input is refunded): the payer's 30M credit alone covers it whenever the pool holds less than about 0.15 ETH at the opening price, and reward claimants cover it in proportion to their claims. It does not change prices or credits, and it fails closed (no tier advances on bad data), but it lets a single holder stall every holder's tier progression indefinitely by draining the reserve each time a run approaches confirmation. The disclosed risks name sustained price manipulation; they do not name this cheaper liquidity-flag griefing. A consistent classification would treat `sqrtPrice > rangeUpper` with the seed fully in tokens exactly like the launch state (liquid, tick clamped to rangeUpperTick), or the router could cap a sell's price limit at rangeUpper so the spot never parks beyond the seed.","line":99,"path":"src/UnlkOracle.sol","reproduction":"Local system (SystemFixture without _localQuoteDepth, so only the factory seed exists, as on Sepolia): (1) after activation the latest observation has liquid == true and slot0 tick == 177300 == rangeUpperTick. (2) alice buys with 0.05 ETH via router.swap -> pool holds 0.05 ETH, observation liquid == true. (3) hook.syncPayer() credits payer 30M; hook.remainingQuota(payer) == 7.5e24; payer sells exact-input 7.5e24 UNLK with sqrtPriceLimitX96 = MAX_SQRT_PRICE-1 -> output 0.049375 ETH (the whole reserve less fee), ~2.49e24 UNLK consumed, remainder refunded. Observed: slot0 sqrtPrice == 1461446703485210103287273052203988822378723970341, tick == 887271; latest observation liquid == false. (4) warp 1h, checkpoint, warp 1h, checkpoint: oracle.twapTick() reverts InvalidOracle; hook.updateMilestone() returns false without sampling. (5) bob buys 0.01 ETH: latest observation liquid == true again, but twapTick keeps reverting until a full 2h window of liquid seconds has elapsed. Expected: a pool whose seed is fully in tokens is classed the same way it was at launch (liquid), or the run is not restarted by a state no trade can distinguish from launch. Actual: illiquid, every confirmation run in progress restarts. Scratch test used: test/scratch/DrainSell.t.sol (uses the project fixture, passes against the current code and prints the values above).","severity":"low","snippet":"        bool liquid = sqrtPrice >= rangeLower && sqrtPrice <= rangeUpper && sqrtPrice != 0\n            && liquidity >= MIN_LIQUIDITY && depth >= MIN_SEED_QUOTE_CAPACITY && protocolFee == 0\n            && lpFee == 12500;","title":"A sell that exhausts the pool's ETH parks the spot tick at the seller's price limit, so the oracle marks the pool illiquid and milestone confirmation is frozen until the next buy"},{"citation":"resolved","description":"Stage2.run broadcasts deployCompanions, then certifyRound(0, accounts, amounts), then configureAndActivate. MerkleClaimEvidence.certifyRound reverts InvalidConfig when accounts.length > MAX_LEAVES (1024). The contracts support a chunked session (submitLeaves/reduce) and the operations notes describe it, but no executable script in the tree performs it; the assignment requires the actual round-0 tree to be certified 'chunked if needed' through a concrete executable owner path. With a large tree the published executable path cannot complete stage 2; the deployCompanions transaction lands and the rest reverts (harmless, re-stageable, but not executable as published).","line":55,"path":"script/Stage2.s.sol","reproduction":"Call Stage2.run(hook, number, accounts, amounts) with accounts.length == amounts.length == 1025 unique recipients forming the frozen root. Expected: certification completes (chunked) and activation follows. Actual: deployCompanions succeeds, certifyRound reverts with InvalidConfig() at MerkleClaimEvidence.sol:73 (`n > MAX_LEAVES`), the script aborts before configureAndActivate. No in-tree script issues submitLeaves/reduce.","severity":"info","snippet":"        companions.rewards.certifyRound(0, accounts, amounts);","title":"The owner stage-2 script only supports the single-call certifyRound path, so a round-0 tree over 1024 recipients reverts the run after deployCompanions has already broadcast"}],"hash":"1c94510f9478f0c9ec743c1829caaf5d220fc9b155b10217c12a36c06505d6e1","nodeId":"7338c059-1966-44f4-9d10-cb320283ceba","outcome":"completed","summary":"Review complete. The findings file is at `.imd-findings.json` with two findings and a coverage row for every one of the 28 listed entry points plus four invariants.\n\n**What I found**\n\n- **Low: oracle liquidity flag after a reserve-draining sell.** The pool holds only the factory's token-side seed, so an exact-input sell larger than the ETH reserve partially fills and v4 walks the spot price through the empty region to the seller's price limit. The pool is then economically identical to its launch state, but `checkpoint()` in `src/UnlkOracle.sol:99` classes it illiquid until the next buy. Every TWAP sample is invalid for that period plus the following two hours, and the resulting gap over 10 minutes restarts any 6-hour or 24-hour confirmation run. Any holder whose quota covers the reserve can do this repeatedly at near-zero cost. The payer's credit alone suffices while the pool holds under about 0.15 ETH. I reproduced it locally against the fixture: slot0 tick parked at 887271, latest observation `liquid == false`, `twapTick()` reverting after two hours of checkpoints. It fails closed and moves no funds, which is why it is low rather than medium.\n- **Info: the owner stage-2 script has no chunked certification path.** `script/Stage2.s.sol:55` calls `certifyRound` only, which reverts for more than 1024 recipients after `deployCompanions` has already broadcast. The contracts and docs support the chunked path; no executable in the tree runs it.\n\n**What held under tracing**\n\n- Router settlement: msg.sender-only sourcing, exact pre/post balance deltas in single and batch paths with mixed native input and output, ETH refunds and proceeds as pull credits, one expected callback with re-checked operation hash.\n- Hook swap gating: router-only sender, nonce-bound context, pending-operation clearing, sign-correct buy credit and sale quota, fee pin.\n- Stage 2: staged companions pinned by address and codehash, every stage-1 check re-run, all checks before all writes, factory distribution order makes the remainder wallet the recorded payer.\n- Evidence adapter: complete-tree certification with uniqueness, heap-order encoder matches OpenZeppelin's layout, per-account single attestation.\n- Principal lock and fee collection via zero-delta remove, plus the milestone state machine's reset and one-tier-per-confirmation rules.\n\n**Not reached in depth**: the Sepolia rehearsal and network verification scripts under `rehearsal/` and `scripts/`, and the Python release tooling beyond the claim-tree encoder. The 175-test suite passes locally. The scratch test under `test/scratch/` is verification only and not a submitted proof.","treeHash":null,"usage":{"cachedInputTokens":1634368,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":52085,"runtime":"claude","turns":36,"wallClockMs":921294}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fc87c05048aca47d","findings":[{"citation":"resolved","description":"Flow gap (execution x periphery x first principles). The hook's own design rule, stated at _recordSeed, is that a launch which can never activate must revert in the launch transaction so that a dead pool is never created. beforeInitialize (src/UnlkHook.sol:184-203) enforces only key shape and sender == launchFactory. deployCompanions and configureAndActivate both run _verifyLaunch -> _verifyServices (src/UnlkHook.sol:263-270), which on chainid 11155111 reverts InvalidConfig unless launchFactory.codehash, poolManager.codehash and factory.fees().codehash equal the SepoliaRelease pins recorded at block 11904506 (and _verifyFeed/_verifyLaunchRecord pin the feed and registry the same way). Those pins are immutable constants in the hook bytecode and the setup authority has no override. If the platform redeploys or upgrades its Sepolia LaunchFactory, PoolFees, registry, or if the PoolManager at the launch chain differs from the pinned runtime, stage 1 still succeeds: the token is minted, 10% goes to the distributor, ~870M UNLK is seeded into a position that beforeRemoveLiquidity (src/UnlkHook.sol:573) forbids ever shrinking, and the hook is bound. Stage 2 then reverts forever, trading never activates (beforeSwap NotActivated), and the pool is permanently dead with its principal locked. The code hashes are readable in beforeInitialize (the factory is the live msg.sender of initialize and the manager is the caller), so the same gate can run at stage 1 at no extra trust cost; the protected admission test runs on a non-Sepolia chain id so the chain-gated check would not interfere with it. Operational mitigation exists (the brief says to verify pins before broadcast), but the contract itself does not enforce the invariant it documents.","line":189,"path":"src/UnlkHook.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 {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {TickMath} from \"v4-core/src/libraries/TickMath.sol\";\nimport {UnlkToken} from \"src/UnlkToken.sol\";\nimport {UnlkHook} from \"src/UnlkHook.sol\";\nimport {SepoliaRelease} from \"src/libraries/SepoliaRelease.sol\";\n\n/// On a chain that reports Sepolia's id, stage 2 (`deployCompanions` -> `_verifyServices`) refuses forever any\n/// factory / pool manager / fees whose code hash is not the pinned one. Stage 1 (`beforeInitialize`) performs no\n/// such check, so a launch whose services differ from the pins is created, its 87% seed locked, and it can never\n/// activate. The hook must refuse the pool at initialization under the same condition it will refuse activation.\ncontract SepoliaPinAsymmetryTest is Test {\n    uint160 internal constant FLAGS = 0x3fc0;\n\n    function testHookRefusesUnpinnedServicesAtInitializeOnSepolia() public {\n        vm.chainId(11155111);\n        PoolManager manager = new PoolManager(address(this));\n        // The factory in this scenario is this test contract: it deploys the token and opens the pool,\n        // exactly the role `launchFactory` plays. Its code hash is not `SepoliaRelease.FACTORY`, and the\n        // local manager's is not `SepoliaRelease.MANAGER`.\n        assertTrue(address(this).codehash != SepoliaRelease.FACTORY);\n        assertTrue(address(manager).codehash != SepoliaRelease.MANAGER);\n\n        UnlkToken token = new UnlkToken();\n        address owner = makeAddr(\"owner\");\n        bytes memory initCode = bytes.concat(\n            type(UnlkHook).creationCode, abi.encode(manager, token, address(this), owner)\n        );\n        bytes32 codeHash = keccak256(initCode);\n        bytes32 salt;\n        address predicted;\n        for (uint256 i;; ++i) {\n            salt = bytes32(i);\n            predicted = address(\n                uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(this), salt, codeHash))))\n            );\n            if (uint160(predicted) & 0x3fff == FLAGS) break;\n        }\n        address hookAddr;\n        assembly {\n            hookAddr := create2(0, add(initCode, 32), mload(initCode), salt)\n        }\n        require(hookAddr == predicted, \"create2\");\n        UnlkHook hook = UnlkHook(hookAddr);\n\n        PoolKey memory key = PoolKey(\n            Currency.wrap(address(0)), Currency.wrap(address(token)), 12500, 60, IHooks(hookAddr)\n        );\n        uint160 sqrt = TickMath.getSqrtPriceAtTick(177300);\n\n        // Stage 2 will refuse these services: `_verifyServices` compares code hashes on chain 11155111.\n        // Stage 1 must therefore refuse them too, or the launch creates a pool that can never activate.\n        vm.expectRevert();\n        manager.initialize(key, sqrt);\n        assertFalse(hook.bound(), \"hook bound to a pool whose services it will refuse at activation\");\n    }\n}","reproduction":"State: chainid 11155111; a PoolManager and a launch factory whose runtime code hashes differ from SepoliaRelease.MANAGER / SepoliaRelease.FACTORY (any redeploy, or the local build). Calls: factory deploys UnlkToken and UnlkHook(manager, token, factory, owner) by CREATE2 at a 0x3fc0 address, then poolManager.initialize(PoolKey(ETH, token, 12500, 60, hook), sqrtPriceAtTick(177300)) and seeds the full token-only position. Expected (per the hook's documented principle): the launch transaction reverts so no unactivatable pool exists. Actual: initialize succeeds, hook.bound() == true, seedRecorded == true, 870M UNLK locked; afterwards owner.deployCompanions(number, feed, routerCode, evidenceCode, oracleCode) reverts InvalidConfig at _verifyServices for every input, and configureAndActivate reverts the same way, forever. The scratch test test/scratch/SepoliaPinAsymmetry.t.sol reproduces the stage-1 acceptance (fails on current code with 'next call did not revert as expected'; passes once beforeInitialize applies the same chain-gated pins stage 2 applies).","severity":"medium","snippet":"        if (sender != launchFactory) revert Unauthorized();\n        address c0 = Currency.unwrap(key.currency0);\n        address c1 = Currency.unwrap(key.currency1);\n        if (\n            bound || address(key.hooks) != address(this) || key.fee != FEE || key.tickSpacing != TICK_SPACING\n                || c0 != address(0) || c1 != address(token)\n        ) revert InvalidPool();","title":"Stage 1 binds the pool to any factory/manager on Sepolia while stage 2 permanently requires the pinned code hashes, so a pin mismatch creates a pool that can never activate and locks the 87% seed fore"},{"citation":"resolved","description":"Economic-security note on the tier schedule versus the policy opening price. fdvUsd values the whole 1e9 supply at the 2h TWAP of the pool price times Chainlink ETH/USD. The factory seeds at tick 177300 (19.968 ETH FDV). The oracle therefore reports FDV = 19.968 * ethUsd with no trade at all; at $5,008/ETH that is $100,000 and tierForFdv returns 1. Anyone can then call updateMilestone every 4-10 minutes for 6 hours after the 2h window and p rises from 2500 to 3500 for every wallet, including the payer's 30M allocation (7.5M -> 10.5M sellable) with no buyer having put any ETH into the pool. The recorded Sepolia feed rounds (docs/network/feed-rounds.json) show ~$2,514, so today the first tier needs about a 2x TWAP move (roughly 7 ETH of sustained buying on the 17.37 ETH virtual reserve); the margin is thin and is decided by the external ETH price rather than by demand for UNLK. docs/SECURITY_REVIEW.md acknowledges the $3,000/ETH case passes with <10 ETH cash; it does not state that no trade is required above $5,008. No code change is required if the requester accepts that the first tier is an ETH-price function; otherwise the tier thresholds or opening cap need re-basing. Not a bypass of quotas or a loss of funds.","line":663,"path":"src/UnlkHook.sol","reproduction":"Local, production-shaped pool (token-only seed, no local quote depth): launch at OPENING_TICK -177300, deployCompanions, configureAndActivate, feed.set(5100e8). Advance 2h, updateMilestone(); oracle.fdvUsd() == 101838e18 with no swap executed. Then updateMilestone() every 5 minutes for 6h: hook.tier() == 1 and hook.p() == 3500. Expected under the brief's framing ('verified USD FDV' milestones driven by trading): tier stays 0 until buyers move the price; actual: tier 1 is confirmed by the ETH/USD feed alone. Measured in test/scratch/Probe.t.sol testOpeningStateAndFdv (fdv at $2000 = $39,936; at $5,100 = $101,838; tier after 6h = 1).","severity":"low","snippet":"        if (fdv >= 100_000 ether) return 1;","title":"First unlock tier ($100K FDV) is reached at the opening price with zero trades once ETH/USD is at or above about $5,008, because the 20 ETH opening cap values the full supply at only 2.5x below the ti"}],"hash":"399e7496ff5e6d37366a6ac3765e79fbf42fb455178176ae04caea9549628650","nodeId":"ab76f054-cabf-4249-a03a-9ecacbdfd60f","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` with two findings and a coverage row for all 28 entry points plus three invariants.\n\n**What I checked (Economic Security, Invariant, Flow Gap guides).** I traced the quota formula, every writer of `eligible` and `sold`, the router's settlement accounting, the TWAP and FDV derivation, the milestone cadence, allocation verification against the factory's real launch order, and claim evidence certification. I ran the full suite (175 pass) and added production-shaped probes on a token-only pool with no local ETH depth: the quota boundary rejects q+1 wei and accepts q, buy/sell round trips do not increase net exit, price never exceeds the seed's upper tick, and the first sell at the opening price reverts cleanly.\n\n**Findings.**\n\n- **Medium, with proof.** Stage 1 (`beforeInitialize`) accepts any factory and pool manager on Sepolia, while stage 2 (`_verifyServices`, feed and registry pins) refuses non-pinned code hashes forever. A redeployed or upgraded platform service produces a launch that succeeds, locks the 87% seed in a position that can never shrink, and can never activate. The scratch test `test/scratch/SepoliaPinAsymmetry.t.sol` fails on current code and passes once the same chain-gated check runs at initialization.\n- **Low.** The $100K first tier is reached at the opening price with no trades once ETH/USD is at or above about $5,008, since the 20 ETH opening cap already values the supply at $39,936 at $2,000/ETH. Measured locally: FDV $101,838 at $5,100/ETH with zero swaps, tier 1 confirmed after the 2h window plus 6h of calls.\n\n**Not reached or only partly reached.** The real Sepolia Chainlink feed path through `fdvUsd` was never exercised in the fork rehearsal; the recorded rounds pass the sanity checks by inspection only. Disclosed risks (sustained manipulation, protocol-fee halt, treasury round powers, other-pool bypass) were confirmed as documented and not re-reported.","treeHash":null,"usage":{"cachedInputTokens":2704508,"inputTokens":642,"model":"claude-fable-5-1","outputTokens":61411,"runtime":"claude","turns":40,"wallClockMs":860706}},{"artifacts":[],"attempt":1,"bundleHash":"05071e69860ec170a7c45b8913cdee60fb5a2a6298ee742a9475e016149ab120","device":"5739ce0d803a43cd","findings":[],"hash":"3c8e9199d9f5799cc343c5aa237d1c22fe933113a039ea6f83a9ca384553b529","nodeId":"7e36b690-beb0-4f2d-995a-8e47ecc7bdf0","outcome":"completed","summary":"Both findings reproduced on the starting tree and both are fixed. The tree builds, all tests pass, the format check passes, and the answers are in `.imd-responses.json`.\n\n**Finding d2d6b0db (medium): fixed.** The reviewer's proof failed on the starting tree as reported. `beforeInitialize` in `src/UnlkHook.sol` now calls the same Sepolia service pin check that both stage-2 calls run, so on chain 11155111 an unpinned factory, pool manager, fees or registry reverts the launch transaction with `InvalidConfig` instead of seeding a pool that can never activate. The registry pin moved into that single check, and the duplicate in the launch-record verifier was removed. The hook runtime is 24,359 bytes, 217 bytes under the EIP-170 limit. Evidence:\n- The proof now passes.\n- New `test/SepoliaPins.t.sol` (8 tests) refuses local services, each single unpinned or lookalike service, and accepts the pinned code. The accepting path etches the recorded Sepolia runtime bytes, which hash to the pins, and initializes through the real PoolManager code with the real factory address as sender.\n- The recorded-block fork rehearsal of both stages through the real Sepolia factory passed at block 11,906,030 on the public Sepolia endpoint. The result is in `delivery/checks/revision-fork.txt`.\n\n**Finding 9224491b (low, advisory): judged real and fixed.** Reproduced with the reviewer's steps: the draining sell left the tick at 887271 and the FDV unreadable two hours later. A drain-and-buy-back costs only two LP fees on the reserve and stalls tier confirmation for a window, so it is far cheaper than the disclosed sustained manipulation. The router in `src/UnlkSwapRouter.sol` now bounds every swap's price limit to the seed range read from the hook's existing getters. A reserve-draining sell ends at the seed's upper boundary, the launch state, which the oracle classes liquid. No TWAP, feed, depth or confirmation rule changed. On Sepolia the seed range is provably the only liquidity because the verified factory reaches the pool only from launch and fee collection. New `test/SeedBoundary.t.sol` (4 tests) covers the drain, an empty-reserve sell, a tighter caller limit and buys. Two accepted credit tests that sold from the launch state into local-only depth above the seed now make the fixture's warm-up buy first.\n\n**Consequences recorded.** `UnlkHook` and `UnlkSwapRouter` bytecode now differ from commit f0149886; the other four artifacts are byte-identical. The reviewed router creation hash was regenerated, the hook creation hash pinned in the deployer test was updated, and the artifact records, ABIs and source digest list were regenerated. The revision is documented in `docs/REVISION_2026-10-13.md`, with notes added to the README, delivery handoff, security review, deployment doc, both status files and the historical records.\n\n**Results on this machine.** 208 delivered Foundry tests pass (209 with the proof copy in scratch), the unmodified protected suite passes with 11, the Python release gate passes with 5, and the format check passes. Foundry here is 1.7.1, and its formatter also rewrapped one expression in each of three accepted test files that the format check otherwise rejects, so those formatting-only edits are kept.\n\n**Not done.** Nothing was broadcast, the memory directory refused writes, and independent re-review of the revised build remains a release gate along with the previously disclosed risks.","treeHash":"9ac235d6bad7827f8b8c0b39dfa60b46c6cbee9c","usage":{"cachedInputTokens":3583165,"inputTokens":738,"model":"claude-fable-5-1","outputTokens":77177,"runtime":"claude","turns":72,"wallClockMs":1252836}},{"artifacts":[],"attempt":1,"bundleHash":"25707dcddf012d4717b731d1596a276274f5fc703782ae15f7ef0fb225496e4a","device":"c2e167266d13dcf4","findings":[],"hash":"4101d2652118c454e841261357526313d5d18527722ca3bfcba08bb72b36af02","nodeId":"0868898f-5fc4-4a46-952d-38ebe5525f02","outcome":"completed","summary":"All work is done and verified. Final state of the tree: only files under `test/` changed.\n\n**What this revision needed.** No reviewer findings were attached to this round, but the implementation changed underneath my accepted tests in the other contributor's revision: `beforeInitialize` now runs the Sepolia service pins at stage 1, and the router clamps every swap's price limit to the seed range read from the hook. My two earlier suites still pass unchanged on the revised code, so I left them alone and added coverage for the changed router mechanism.\n\n**What I added**, in `test/SeedRangeLimitProperties.t.sol`, on the Sepolia-faithful token-only seed with no local quote depth:\n\n- **Failure paths the clamp creates.** A launch-state sell is refused with the exact v4 error `PriceLimitAlreadyExceeded(ceiling, ceiling)` and leaves nonce, sold, balance and approval untouched. An exact-output sale past the reserve is refused as slippage with no state change. A buy whose limit sits at the current price is refused with no refund credit.\n- **Exact clamp semantics under fuzz.** For caller limits drawn below the price, inside the range, and above the ceiling, executing the request equals executing the hand-clamped limit, compared on success or exact revert data, input, output, end price, sold, eligible and nonce. A tighter caller limit is honoured and a partial fill ends exactly on it.\n- **Oracle readability after a drain.** A quota-sized sale into a small reserve stops on the ceiling, trading resumes at once, and the TWAP is priced a window later with every observation liquid.\n- **Invariant campaign** over random buys, exact-input and exact-output sales with limits from the whole v4 range, time advances, payer sync and withdrawals, with `fail-on-revert` on. The price never leaves the seed range, every observation is liquid, the seed principal and the manager's assets equal executed flows, and sold matches a ghost ledger and the quota formula. Only four exact refusals are tolerated and each is checked to leave the price unchanged.\n\n**Results.** Full suite: 205 tests across 45 suites, zero failures or skips. The new campaign ran 6,144 handler calls with zero unexpected reverts. Build and test logs are refreshed in `test/results/`, and the revision is documented in `test/TESTING_ADDITIONS.md`.\n\n**Defects.** None reproduced in the implementation, so no findings file was written. Two mistakes surfaced during development were in my own test harness and were fixed there.\n\n**Unchanged limits.** These are local checks only. The package still has no public Sepolia deployment, transactions, source verification, sealed activation evidence or independent review, and the disclosed sustained-manipulation, protocol-fee halt, treasury reward-round and other-pool bypass limitations stand as documented.","treeHash":"6d9611288b21a1a824ca889d88dbd5615c5ee042","usage":{"cachedInputTokens":3660324,"inputTokens":1186,"model":"claude-fable-5-1","outputTokens":47125,"runtime":"claude","turns":38,"wallClockMs":715484}},{"artifacts":[],"attempt":1,"bundleHash":"89c4bd1f94d5667f3f782e192bcd7ec09baf237e78f34113d051a9f1f39ad741","device":"16b70f563303d8e7","findings":[],"hash":"6479ec566b3729d65a83187c7ffb905e73f227c7c94a443111a4c83a5027b8c9","nodeId":"563e02da-ac15-4122-a943-1fba5464d358","outcome":"completed","summary":"Updated only [launch.json](/Users/gmoney/.identitymd/work/407c3cbb-d967-4666-99e6-0ab7139c141f/563e02da-ac15-4122-a943-1fba5464d358/launch.json), correcting provenance and release notes while preserving matching constructor arguments and permissions.\n\nVerified pinned commit `f0149886…`. Build, official manifest check, 175 Foundry tests, five release-gate tests and 11 protected tests passed.\n\nNo deployment broadcast. Recorded blockers remain: import `bad_path_count`, independent review/admission and verified stage-2 signing. No activated pool is claimed.","treeHash":"b37639029e725d7c8f98bda24b1b38ead0177b8c","usage":{"cachedInputTokens":1164928,"inputTokens":91461,"model":"gpt-6-astra","outputTokens":11514,"runtime":"codex","turns":5,"wallClockMs":423147}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"93ca4a1020037bf1","findings":[{"citation":"resolved","description":"beforeInitialize (src/UnlkHook.sol:184-203) checks only the sender and the key shape. On chainid 11155111, both deployCompanions and configureAndActivate run _verifyLaunch -> _verifyServices (lines 263-270), plus _verifyLaunchRecord (line 406) and _verifyFeed. These require launchFactory.codehash == SepoliaRelease.FACTORY, poolManager.codehash == SepoliaRelease.MANAGER, factory.fees().codehash == SepoliaRelease.FEES and registry.codehash == SepoliaRelease.REGISTRY. The pins are immutable constants and the setup authority has no override. If the factory, manager or registry the launch actually uses differ from the pins, stage 1 still succeeds: the supply is distributed, about 870M UNLK is seeded into a position that beforeRemoveLiquidity (line 573) never lets shrink, and the hook binds. Every stage-2 call then reverts with InvalidConfig/InvalidEvidence, so trading never activates and the principal stays locked. This contradicts the hook's own rule at _recordSeed (lines 527-530): a launch that could never activate must revert in the launch transaction. The factory/manager/registry code hashes can be read inside beforeInitialize (the factory is `sender` and the manager is msg.sender), so the same chain-gated pin check can run there. Then a pin mismatch reverts the launch instead of creating a dead pool. Checking the pins off-chain before broadcast does not stop the contract from accepting a pool it will later refuse.","line":189,"path":"src/UnlkHook.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 {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {TickMath} from \"v4-core/src/libraries/TickMath.sol\";\nimport {UnlkToken} from \"src/UnlkToken.sol\";\nimport {UnlkHook} from \"src/UnlkHook.sol\";\nimport {SepoliaRelease} from \"src/libraries/SepoliaRelease.sol\";\n\n/// On a chain that reports Sepolia's id, stage 2 (`deployCompanions` -> `_verifyServices`) refuses forever any\n/// factory / pool manager / fees whose code hash is not the pinned one. Stage 1 (`beforeInitialize`) performs no\n/// such check, so a launch whose services differ from the pins is created, its 87% seed locked, and it can never\n/// activate. The hook must refuse the pool at initialization under the same condition it will refuse activation.\ncontract SepoliaPinAsymmetryTest is Test {\n    uint160 internal constant FLAGS = 0x3fc0;\n\n    function testHookRefusesUnpinnedServicesAtInitializeOnSepolia() public {\n        vm.chainId(11155111);\n        PoolManager manager = new PoolManager(address(this));\n        // The factory in this scenario is this test contract: it deploys the token and opens the pool,\n        // exactly the role `launchFactory` plays. Its code hash is not `SepoliaRelease.FACTORY`, and the\n        // local manager's is not `SepoliaRelease.MANAGER`.\n        assertTrue(address(this).codehash != SepoliaRelease.FACTORY);\n        assertTrue(address(manager).codehash != SepoliaRelease.MANAGER);\n\n        UnlkToken token = new UnlkToken();\n        address owner = makeAddr(\"owner\");\n        bytes memory initCode = bytes.concat(\n            type(UnlkHook).creationCode, abi.encode(manager, token, address(this), owner)\n        );\n        bytes32 codeHash = keccak256(initCode);\n        bytes32 salt;\n        address predicted;\n        for (uint256 i;; ++i) {\n            salt = bytes32(i);\n            predicted = address(\n                uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(this), salt, codeHash))))\n            );\n            if (uint160(predicted) & 0x3fff == FLAGS) break;\n        }\n        address hookAddr;\n        assembly {\n            hookAddr := create2(0, add(initCode, 32), mload(initCode), salt)\n        }\n        require(hookAddr == predicted, \"create2\");\n        UnlkHook hook = UnlkHook(hookAddr);\n\n        PoolKey memory key = PoolKey(\n            Currency.wrap(address(0)), Currency.wrap(address(token)), 12500, 60, IHooks(hookAddr)\n        );\n        uint160 sqrt = TickMath.getSqrtPriceAtTick(177300);\n\n        // Stage 2 will refuse these services: `_verifyServices` compares code hashes on chain 11155111.\n        // Stage 1 must therefore refuse them too, or the launch creates a pool that can never activate.\n        vm.expectRevert();\n        manager.initialize(key, sqrt);\n        assertFalse(hook.bound(), \"hook bound to a pool whose services it will refuse at activation\");\n    }\n}","reproduction":"Run on chainid 11155111 (vm.chainId) with a local PoolManager and factory whose runtime code hashes are not the SepoliaRelease pins. Deploy UnlkToken and UnlkHook(manager, token, factory, owner) by CREATE2 at a 0x3fc0-flagged address, then call manager.initialize(PoolKey(ETH, token, 12500, 60, hook), sqrtPriceAtTick(177300)). Expected: initialize reverts, because stage 2 will refuse these services. Actual: initialize succeeds and hook.bound() == true. Seeding and distribution then succeed, and owner.deployCompanions(...) and configureAndActivate(...) revert at _verifyServices for every input. I ran the attached proof (the audit_economics specialist's test) on this tree: it fails with 'next call did not revert as expected', as the finding states.","severity":"medium","snippet":"        if (sender != launchFactory) revert Unauthorized();","title":"Stage 1 accepts a pool whose Sepolia services stage 2 will refuse forever, locking the 87% seed in a pool that can never activate"},{"citation":"resolved","description":"Merged from audit_math (UnlkSwapRouter.sol:147) and audit_flow (UnlkOracle.sol:99); both describe the same root cause. The official pool's only liquidity is the factory's token-only seed [lower, 177300]. Above the seed's upper tick the pool has no liquidity. The router accepts partial fills for exact-input requests, so a sell larger than the pool's ETH reserve consumes the in-range ETH. v4 then steps the price through the empty region to sqrtPriceLimitX96; clients normally pass MAX_SQRT_PRICE-1. The afterSwap checkpoint then records liquid=false because sqrtPrice > rangeUpper. twapTick reverts while the latest observation is illiquid, and keeps reverting for a full 2h window after a buy brings the price back (endBad != startBad). _updateMilestone swallows the revert, so the gap between valid samples exceeds MAX_CONFIRMATION_GAP and any confirmation run in progress restarts. Credits, quota and prices are unaffected and the failure is fail-closed. However, a holder whose quota covers the pool's current ETH reserve can stall tier progression for everyone, even though the pool's economic state equals the launch state, which is classed liquid. Fix: clamp the router's sell limit to the seed's upper boundary, or revert in afterSwap when post-swap sqrtPrice > getSqrtPriceAtTick(seedTickUpper), or class sqrtPrice > rangeUpper (seed fully in tokens) as liquid with the tick clamped to rangeUpperTick.","line":99,"path":"src/UnlkOracle.sol","reproduction":"I ran this as test/scratch/Drain.t.sol. It uses SystemFixture with setUp = _deploy(false); _launchTokenOnly(OPENING_TICK); _deployCompanions(); _activate() and no _localQuoteDepth, matching the production token-only seed. Steps: alice buys 0.05 ETH. hook.syncPayer(). The payer sells hook.remainingQuota(payer) (7.5e24 UNLK) exact-input with sqrtPriceLimitX96 = MAX_SQRT_PRICE-1. Observed: slot0 tick == 887271 and the latest oracle observation has liquid == false. After 2 hours, hook.updateMilestone() returns false and oracle.fdvUsd() reverts with InvalidOracle (the test passes on the current code, which demonstrates the behaviour). Expected: the price stays at or below the seed's upper boundary, or that state is classed as the launch state (liquid).","severity":"low","snippet":"        bool liquid = sqrtPrice >= rangeLower && sqrtPrice <= rangeUpper && sqrtPrice != 0","title":"An exact-input sell that drains the pool's ETH walks the price to the seller's limit (tick 887271), so the oracle classes the pool illiquid and resets milestone confirmation"}],"hash":"7055f0fae258c5cffebbf7d8ed08c5147608b7838ba8a168efcad4e6674bcc14","nodeId":"be35fc99-e5cf-4b95-b891-b59ac35d63f3","outcome":"completed","summary":"I kept two findings and wrote them to `.imd-findings.json`, with a coverage row for each of the 28 entry points: 23 hold and 5 are linked to a finding. No other repository file changed; the scratch tests I ran are deleted.\n\n**1. Medium: a launch can create a pool that can never activate** (`src/UnlkHook.sol:189`)\n- **The gap:** `beforeInitialize` only checks who opens the pool and its shape. Stage 2 (`deployCompanions` and `configureAndActivate`) also requires, on Sepolia, that the factory, PoolManager, fee contract and registry code match fixed hashes built into the hook.\n- **Impact:** if those services don't match the hashes, stage 1 still succeeds and the 87% seed (about 870M UNLK) is locked in the pool for good. Every stage-2 call then reverts, so trading never starts. The hook's own comments say a launch that can never activate should fail in the launch transaction instead.\n- **Evidence:** I ran the specialist's proof test on this tree. It fails with \"next call did not revert as expected\", which is the defect it describes, so it is attached to the finding.\n- **Fix:** run the same Sepolia hash check inside `beforeInitialize`.\n\n**2. Low: a large sell can pause milestone progress** (`src/UnlkOracle.sol:99`)\n- **Merged:** this combines the audit_math and audit_flow findings, which share one cause.\n- **The gap:** a sell bigger than the pool's ETH moves the price past the top of the seeded range, all the way to the seller's price limit (tick 887271). The oracle then marks the pool illiquid. Price readings fail until 2 hours of normal trading have passed, and any milestone confirmation in progress starts over.\n- **What it doesn't do:** no funds are lost, and no quota or credit changes.\n- **Evidence:** I reproduced it in a scratch test with the production-style token-only seed:\n  - alice buys 0.05 ETH, then the payer sells its full 7.5M UNLK quota;\n  - the tick ends at 887271 and the latest price record is marked illiquid;\n  - two hours later, `updateMilestone()` returns false and `fdvUsd()` reverts.\n\n**Dropped findings**\n- **Disclosed by design:** treasury reward-round powers, the protocol-fee trading halt and the other-pool bypass are all deliberate behaviour that the launch notes list as unresolved risks. They are disclosures, not code defects.\n- **Not code defects:**\n  - The payer, who is also the setup wallet, can trade first after activation. Nothing in the brief requires a neutral opening.\n  - The first unlock tier ($100K) is reached with no trades once ETH/USD is at or above about $5,008. That follows from the policy's opening price and the brief's tier schedule.\n  - The stage-2 script has no chunked-certification path for more than 1,024 recipients, but `delivery/OPERATIONS.md` gives the exact chunked calls (`submitLeaves`/`reduce`), and certification is open to anyone.\n- **Static-analysis leads** (router reentrancy and balance checks, the uninitialized-variable warnings, the `HookDeployer` \"initializer\", the unchecked ETH send in `withdrawNative`): I traced each one and none is a real problem.","treeHash":null,"usage":{"cachedInputTokens":1258840,"inputTokens":26,"model":"claude-opus-5-5","outputTokens":19144,"runtime":"claude","turns":15,"wallClockMs":217975}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ca075d17c94a854b","findings":[{"citation":"resolved","description":"The revision changed UnlkHook and UnlkSwapRouter bytecode (docs/REVISION_2026-10-13.md records hook creation 25726 / initcode 25854 / runtime 24359 and router 9186 / 9250 / 8831), and delivery/STATUS.json records hookRuntimeBytes 24359. DELIVERY.md's release-artifact table (lines 56-61) still lists the superseded figures for both contracts, and launch.json notes say 'helper runtime 728 bytes; hook 24328', '187 Foundry tests in 40 suites' and refer to the fork block 11905741 while the revision rehearsal ran at 11906030. Notes are explanatory and not deployment authority, and the attestation binds the real hashes, so this cannot mis-deploy anything; it is a stale-evidence note for the author to refresh so a reader comparing the attestation with the delivery does not see a contradiction. No code change.","line":58,"path":"DELIVERY.md","reproduction":"Run `forge build --sizes`: UnlkHook runtime 24,359 / initcode 25,726+128; UnlkSwapRouter 8,831 / 9,186+64. Compare with DELIVERY.md line 58 (24328 / 25702 / 25830) and line 59 (8102 / 8166 / 7761), and with the launch.json notes string ('hook 24328', '187 Foundry tests'). Expected: delivery figures equal the built artifact; actual: they describe the pre-revision build. The full suite run on this tree reports 208 delivered tests plus scratch copies, all passing.","severity":"info","snippet":"| UnlkHook | 25702 | 128 | 25830 | 24328 |","title":"Delivery table and launch.json notes still cite the pre-revision hook size (24328 bytes) and test count (187) although the attested build is 24359 bytes / 208 tests"},{"citation":"resolved","description":"Reproduction of the audit_economics low. The factory seeds at the policy's 20 ETH whole-supply cap (opening sqrtPriceX96 560670463299104726496887759586116 in the fork record, 19.968 ETH FDV at the spacing-rounded tick), so UnlkOracle.fdvUsd reports 19.968 * ethUsd with the pool untouched. At $5,008/ETH that equals the $100K threshold at line 669 and tierForFdv returns 1; six hours of permissionless updateMilestone calls then raise p from 2500 to 3500 for every credited wallet, including the payer's 30M allocation, without any buyer having put ETH into the pool. At the recorded Sepolia feed (~$2,514) the FDV is about $50K, so today the tier needs roughly a 2x sustained TWAP move. This is a property of the brief's own tier schedule and policy opening price, which the author may not change ('no silent economic/oracle changes'), not a code defect; docs/SECURITY_REVIEW.md discloses that a $3,000/ETH test passes the $100K tier with under 10 ETH in the seed but does not state the zero-trade threshold. Recorded here as a disclosure item only; it does not reopen the work.","line":669,"path":"src/UnlkHook.sol","reproduction":"Local, production-shaped pool (test/scratch/FeedOnlyTier.t.sol on this tree, using SystemFixture: _deploy(false); _launchTokenOnly(OPENING_TICK); _deployCompanions(); _activate(); no local quote depth). feed.set(5100e8); then _confirm() (advance one 2h window, updateMilestone, then updateMilestone every 5 minutes for 6h). Observed: router.nonce() == 0 throughout (no swap executed), oracle.fdvUsd() == 101838967683600000000000 (about $101,839), hook.tier() == 1, hook.p() == 3500. With feed.set(2514e8) the same sequence gives fdvUsd == 50200620540504000000000 and tier 0. Expected under the brief's framing of tiers as 'verified USD FDV' driven by trading: tier 0 until buyers move the price; actual: tier 1 from the external ETH price alone.","severity":"info","snippet":"        if (fdv >= 100_000 ether) return 1;","title":"At the policy opening price the first unlock tier ($100K FDV) is confirmed by the ETH/USD feed alone, with no trade, once ETH is at or above about $5,008"}],"hash":"793d9ec286da1c7d29e94c8773da4c8119b1f742a8622f4577ee6d5a4ca8d651","nodeId":"be35fc99-e5cf-4b95-b891-b59ac35d63f3","outcome":"completed","summary":"Review complete. The findings file is valid JSON with 2 info-level notes and 30 coverage rows, and the tree holds no modifications outside the findings file and the scratch directory.\n\n**Both prior findings are settled as fixed.**\n\n- **Medium, stage 1 accepting services stage 2 refuses.** The hook's beforeInitialize now runs the same four Sepolia code-hash pins as stage 2, with the factory hash checked before its getters are read. My attached proof passes on the revised tree, the author's 8 new pin tests pass, and the 11 supplied protected tests still pass on a local chain id. The hook runtime is 24,359 bytes with 217 bytes of margin, and the initcode stays well under the limit.\n- **Low, drain sell parking the tick at 887271.** The router now clamps every price limit to the seed range read from the hook. A reserve-draining sell stops exactly at the seed's upper boundary, which the oracle classes liquid, and the operation hash covers the clamped params on both sides. The author's 4 boundary tests pass, and the regenerated reviewed-code hash matches the build.\n\n**Verification run on this tree.** The full suite passed with no failures across 40 suites, the protected admission suite passed, and the reviewed-code hash check matched all four creation hashes.\n\n**Two info notes, neither reopening the work.**\n\n- The delivery table and the manifest notes still quote the pre-revision hook size and test count. The attestation binds real hashes, so this is stale evidence to refresh, not a deployment risk.\n- At the policy opening price the first unlock tier confirms from the ETH/USD feed alone once ETH is at or above roughly $5,008. I reproduced this with a scratch test: tier 1 and p=3500 with zero swaps at $5,100, tier 0 at the recorded $2,514. This follows from the brief's own tier schedule and opening cap, which the author may not change, so it is a disclosure item only.\n\nThe specialists' other items were either duplicates of the settled findings or the disclosures the security review already carries. No new defect was found.","treeHash":null,"usage":{"cachedInputTokens":1381656,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":18621,"runtime":"claude","turns":27,"wallClockMs":374474}},{"artifacts":[],"attempt":1,"bundleHash":"88bca7eb3f072b170b60609174fa68d5a1b9d56b57c0c5296e996f3483397d35","device":"699fb03b7f482edb","findings":[],"hash":"87c99c422522ae7ba50593acc14c13fe632b06480977f043897f3eba6584af74","nodeId":"0868898f-5fc4-4a46-952d-38ebe5525f02","outcome":"completed","summary":"Added adversarial token tests and fee-custody invariants, modifying only `test/`.\n\n- `forge build` passed.\n- 186 tests passed; no failures or skips.\n- 11 protected checks and five release-gate tests passed.\n- Published source and artifact hashes remain unchanged.\n\n[Review and reproduction notes](test/TESTING_ADDITIONS.md).\n\nNo Sepolia deployment or activation was performed.","treeHash":"9f91b57841907a4df0231a1edebf737ca0dd90b6","usage":{"cachedInputTokens":3205120,"inputTokens":154837,"model":"gpt-6-astra","outputTokens":24581,"runtime":"codex","turns":6,"wallClockMs":965734}},{"artifacts":[],"attempt":1,"bundleHash":"59baac43d99963ef229fe319629310b630f1b48592abfe0e074af2e226429d9c","device":"589ef002581a5371","findings":[],"hash":"9e5de3aca77ccefd83ad1ae80321cd2bb36d6957f5071f98680ff2055b8248a3","nodeId":"563e02da-ac15-4122-a943-1fba5464d358","outcome":"completed","summary":"Done. The manifest at launch.json is verified against the accepted tree and only its test-count line changed.\n\n**What I found**\n\n- The existing manifest already described the hook correctly. Constructor words are `$poolManager`, `$token`, `$factory`, `$owner`, matching the declaration order manager, token, launchFactory, setupAuthority in src/UnlkHook.sol.\n- The eight declared permissions match getHookPermissions exactly, confirmed programmatically from the source. No return-delta permissions are declared or implemented.\n- Token fields are UnlkToken, UNLOCK, UNLK, 18 decimals. Pool fields are native ETH, fee 12500, tickSpacing 60 and the one-to-one placeholder price, as the launch facts require.\n- The first key is `kind` with value `univ4_hook`. Notes are 3989 characters, under the 4000 cap.\n- The source hash list from the published commit matches every file except launch.json, which is the deliverable revised last round.\n\n**What I changed**\n\nOne sentence in notes. It claimed 175 Foundry tests, but the current accepted tree runs 187 tests in 40 suites. The line now reports the counts I actually reproduced today.\n\n**Verification run on this machine**\n\n| Check | Result |\n| --- | --- |\n| forge build | success |\n| forge test | 187 passed, 0 failed |\n| Protected suite via scripts/check_protected.py with manifest-derived probes | 11 passed |\n| Python release gate via unittest discovery | 5 passed |\n\nThe working tree shows only launch.json modified. No .imd-blocked.json was needed since every manifest value comes from the launch facts or the repository.\n\n**Still outside this task**\n\nNothing was broadcast. Independent review, admission, Sepolia pin verification against current policy, fork rehearsal and both deployment stages remain platform operations, as the notes state. Stage 1 alone would mean pool deployed, trading inactive.","treeHash":"f2a95fb5e81db09a591d9401fc6381688cec39ca","usage":{"cachedInputTokens":720607,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":9501,"runtime":"claude","turns":19,"wallClockMs":356962}},{"artifacts":[],"attempt":1,"bundleHash":"26d8b0d76ff3abc62eb7dbe658ce6297f1e64ca1856e6ff22892bbaa8cf4e47f","device":"f4cf051c8a9d8584","findings":[],"hash":"a915d214da2998e9279a1b65fcdfcb2f2963caaa9ed770232dd605303d3cb64c","nodeId":"7e36b690-beb0-4f2d-995a-8e47ecc7bdf0","outcome":"completed","summary":"Restored the [exact fixed commit](https://github.com/identity-md-launches/launch-1534-unlock/commit/f0149886ac3c09b57a0e1d676582e6aeaeb7a69f), preserving all 498 files.\n\nPassed: build, formatting, 175 Foundry tests, five release gates, 11 protected checks, and both stages on a recorded Sepolia fork.\n\n**No public deployment or activation occurred.** Blockers remain: platform `bad_path_count`, pending independent review/new launch records, and an unverified owner-signing path for stage 2.\n\n[Complete evidence and handoff](DELIVERY.md) · [Source package](artifacts/unlock-sepolia-f0149886-source-package.tar.gz)\n\nNot delivered: artifacts/unlock-sepolia-f0149886-source-package.sha256, artifacts/unlock-sepolia-f0149886-source-package.tar.gz. Under artifacts/, only this step's named outputs leave the machine.","treeHash":"961a3ceda3828757dca7dc10bc0f5fd45431167f","usage":{"cachedInputTokens":4161408,"inputTokens":181740,"model":"gpt-6-astra","outputTokens":39986,"runtime":"codex","turns":8,"wallClockMs":1535857}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fbcdfc017217af1f","findings":[{"citation":"resolved","description":"Boundary x invariant seam. The official pool has exactly one position, the factory seed, whose upper tick is the opening tick (177300 in the fixture that mirrors the on-chain seed). Above it the pool has zero liquidity all the way to MAX_TICK. The router only enforces full fill for exact-output requests (this line); an exact-input sell with the default price limit MAX_SQRT_PRICE-1 is accepted as a partial fill. v4 consumes the in-range ETH, then keeps stepping through the empty tick words with zero amounts until the trader's limit, so slot0.tick ends at 887271 for the price of the in-range portion only (about 46 bitmap steps of gas). UnlkOracle.checkpoint (src/UnlkOracle.sol:99-101) then records liquid=false because sqrtPrice > rangeUpper, twapTick reverts on !last.liquid, and every milestone sample is discarded until a buy drags the price back and a further full 2h window of liquid time has elapsed. Rights are not revoked and executed-delta accounting stays exact (sold[trader] grows only by the consumed input), so impact is limited to interrupting confirmation sampling and to a meaningless spot tick for any reader. The cost is only the ETH actually held by the range, so it is cheap exactly when the pool holds little ETH (early life, or after a broad sell-down); at the $100K tier the range holds about 10 ETH and the quota makes it infeasible. Minimal fix that preserves design: in UnlkHook.afterSwap revert when the post-swap sqrtPrice is above getSqrtPriceAtTick(seedTickUpper) (or have the router clamp a sell's sqrtPriceLimitX96 to that boundary), so the official pool price can never leave the seeded range.","line":147,"path":"src/UnlkSwapRouter.sol","reproduction":"Native-only launch as in test/NativeLaunch.t.sol but with the fixture seed [-887220, 177300] and initial sqrtPrice at tick 177300 (seed liquidity 122939419675900087871291, seedTokens 869999999999999999999997987, seedQuoteCapacity 17372529781893206513 wei). 1) hook.syncPayer() -> remainingQuota(payer)=7500000000000000000000000. 2) alice buys with 0.001 ETH exact input -> tick 177298, manager ETH balance 1000000000000000. 3) payer calls router.swap(SwapRequest{zeroForOne:false, amountSpecified:-7500000000000000000000000, sqrtPriceLimitX96: MAX_SQRT_PRICE-1, maxInput:7500000000000000000000000, minOutput:1, deadline:now+1h}). Expected (design intent 'official pool trades inside the seeded range'): sell limited to the range or rejected. Actual: swap succeeds with input=50076215764709872389387 UNLK, output=987499999999999 wei (all pool ETH), slot0.tick=887271, sold[payer]=50076215764709872389387, oracle last observation liquid=false. 4) Any updateMilestone()/afterSwap sample now hits the catch path (fdvUsd reverts InvalidOracle) until bob buys 0.01 ETH (tick returns to 177288, liquid=true) and 2h more pass, after which fdvUsd=39984800660000000000000 is valid again.","severity":"low","snippet":"        if (request.amountSpecified > 0 && output != uint256(request.amountSpecified)) revert Slippage();","title":"Exact-input sells walk through the empty region above the seed range at zero cost, parking the pool tick at MAX and flagging the oracle illiquid"}],"hash":"aba4821b06a9ff308f0e6f48be952c668a9073663ed38fe0fc16abb3e156fad3","nodeId":"79c6e1aa-fa08-428e-bb5a-4604e78f43f9","outcome":"completed","summary":"The review is complete. The findings file is valid JSON, the quoted snippet matches line 147 of the router exactly, the scratch test is removed, and the working tree holds only `.imd-findings.json`.\n\n**Outcome.** The math in my area holds up. I found one low-severity defect and no critical, high or medium issues. The file records one finding and 31 coverage rows covering all 28 listed entry points plus three arithmetic invariants.\n\n**What I checked, against the Math Precision, Boundary and Numerical Gap guides:**\n- Quota arithmetic in `afterSwap` and `remainingQuota`. Floor division matches the specified Q formula, casts are in range, and sales count executed input only.\n- The oracle. The TWAP floor on the negated tick rounds ETH-per-UNLK down, the result stays within tick bounds, the FDV chain cannot overflow in either sqrt-price branch, and the window logic rejects any illiquid second.\n- Milestone cadence. The 4-minute and 10-minute boundaries are inclusive, 6h/24h confirmations advance one tier only, and invalid samples neither advance nor reset.\n- Seed geometry. The on-chain seed gives principal 869,999,999.999999999999997987 UNLK and 17.37 ETH depth, inside the policy band with the documented 2.3% margin. The floor passes up to opening tick 177480 and fails from 177540.\n- Router settlement. Relative balance equalities hold for single swaps and mixed native and token batches, refunds are exact, and the callback settles and takes exactly the executed deltas.\n- Merkle evidence. Heap indexing, the n=1 edge, chunked reduction order and cross-chunk uniqueness are all sound.\n- Token receipts. Initial allocations accumulate only from the minter until it empties, so later transfers cannot rewrite them.\n\n**The finding (low).** An exact-input sell with the default price limit is accepted as a partial fill. Because the official pool has only the seed position, the swap drains the in-range ETH and then steps through the empty region above the seed at zero cost. On the native-only fixture, after a 0.001 ETH buy, the payer's 7.5M quota sell consumed only 50,076 UNLK, took all 0.0009875 ETH, and parked the tick at 887271. The oracle correctly flagged the pool illiquid, which suspends milestone sampling until a buy restores the range and a further 2h window passes. Accounting stays exact and no rights are lost, so this is a griefing vector that is cheap only while the pool holds little ETH. The suggested fix is to reject a post-swap price above the seed's upper tick in `afterSwap`, or clamp the sell price limit in the router.\n\n**Not covered.** I did not re-run the Sepolia fork rehearsal or the network pin checks, and I did not audit the access-control, economic or execution-trace areas assigned to the other specialists beyond what the math required. All 175 local tests pass.","treeHash":null,"usage":{"cachedInputTokens":1870896,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":63231,"runtime":"claude","turns":31,"wallClockMs":935363}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"56e50117311155be","findings":[{"citation":"resolved","description":"E (eligible) is credited for every actual native claim in any distributor round, and MerkleDistributor.openRound accepts rounds from LaunchFees.treasury() (a LaunchFees-owner-settable address) with any root the treasury chooses, as long as the distributor holds the funding. Certification (certifyRound) and attestation (attest) are permissionless and only require the round to exist and the claim flag to be set. So the treasury, using tokens it already holds (swept unclaimed rewards, its fee share, or tokens anyone sends it), can route them to chosen wallets with sell quota that an identical plain-transfer recipient never gets. The code treats this as a trust assumption (SECURITY_REVIEW.md 'treasury reward-round powers'); it is listed here because the brief requires it to be disclosed and because the asymmetry between a treasury-routed holder (E>0) and a transfer-only holder (E=0) of the same balance is enforced on chain with no cap. Mitigation would require a design change (e.g. only round 0, or treasury rounds not counted), which the author must decide; nothing in the hook can distinguish a legitimate remediation round from a quota grant.","line":635,"path":"src/UnlkHook.sol","reproduction":"Local SystemFixture after activation. 1) payer transfers 1,000,000e18 UNLK to the distributor. 2) vm.prank(launchFees.treasury()); distributor.openRound(keccak256(bytes.concat(keccak256(abi.encode(stranger, 1_000_000e18)))), 1_000_000e18, 0) -> round 1. 3) distributor.claim(1, stranger, 1_000_000e18, []) succeeds. 4) rewards.certifyRound(1, [stranger], [1_000_000e18]); rewards.attest(1, stranger, 1_000_000e18, []); hook.syncRewards(stranger) -> hook.eligible(stranger) == 1_000_000e18. 5) stranger sells 250,000e18 through UnlkSwapRouter.swap(zeroForOne=false, amountSpecified=-250_000e18, MAX_SQRT_PRICE-1, maxInput=250_000e18, minOutput=1, deadline) -> succeeds, hook.sold(stranger)==250_000e18. 6) A second wallet that received 1,000,000e18 by plain transfer attempts a 1e18 sell -> reverts with wrapped QuotaExceeded. Expected per brief: only verified pool buys, the original payer allocation and actual native claims count; actual: any treasury-authored round counts, with no amount or round limit.","severity":"info","snippet":"    function syncRewards(address recipient) external returns (uint256 amount) {\n        if (!activated) revert NotActivated();\n        if (recipient == address(0)) revert InvalidEvidence();\n        amount = pendingRewardCredit(recipient);\n        claimedCredit[recipient] += amount;\n        if (amount != 0) _credit(recipient, amount, 2);\n    }","title":"Trust gap (access x economics x asymmetry): the chain treasury can mint official-pool sell quota for any wallet by opening a funded reward round"},{"citation":"resolved","description":"beforeSwap refuses the swap whenever the pool's protocol fee is non-zero. Uniswap governance (the PoolManager owner, through its protocol fee controller) can set a protocol fee on any pool at any time. There is no owner/admin function, upgrade path or alternative route in the hook, and the oracle also classes such observations illiquid (UnlkOracle.checkpoint requires protocolFee == 0), so milestones stop as well. Rights already recorded stay recorded and native claims/transfers keep working. The design chooses halting over silently changing the promised 1.25% split (SECURITY_REVIEW.md 'Release decision d0e68f0c'); it is reported because the brief requires the halt to be disclosed and the requester must accept it explicitly before broadcast.","line":471,"path":"src/UnlkHook.sol","reproduction":"Local SystemFixture after activation and a warm-up buy. manager.setProtocolFeeController(address(this)); manager.setProtocolFee(key, 1000 | (1000 << 12)). Then alice calls router.swap{value: 1e18}(zeroForOne=true, amountSpecified=-1e18, MIN_SQRT_PRICE+1, maxInput=1e18, minOutput=1, deadline) -> reverts (wrapped InvalidPool from beforeSwap). Every subsequent official-pool buy and sell reverts identically until the protocol fee is removed by Uniswap governance; nobody in the launch can clear it. Expected per brief: disclosed trading halt; actual: confirmed.","severity":"info","snippet":"        if (protocolFee != 0 || lpFee != FEE) revert InvalidPool();","title":"Protocol-fee-triggered permanent trading halt: a PoolManager protocol fee on the official pool makes every router swap revert with no recovery path"},{"citation":"resolved","description":"configureAndActivate is the single event that opens official trading, and only $owner (resolved to the requester wallet 0x48e4e74fe1d0c14404ceb57b9fec5b21329c6ec9, which is also the remainder/payer wallet credited PAYER_ALLOCATION by syncPayer) can send it. Between stage 1 and activation nobody can trade, so the first buy after activation always executes at the policy opening price (about 20 ETH FDV). The owner can bundle configureAndActivate with its own buy in the same block (two transactions from the same EOA, sequential nonces, or a builder bundle), while every other participant can at best react to the activation in the mempool. Combined with its 30M E (syncPayer) and 80% of LP fees, the owner is the one actor whose authorization step (activation) also sets the economic start it benefits from. SECURITY_REVIEW.md discloses the payer's fee recapture and its ability to refuse activation, but not activation-timing priority. No code fix is required by the brief; the author should state this in the disclosures, or make activation start trading at a published later timestamp if the requester wants equal access to the opening price.","line":281,"path":"src/UnlkHook.sol","reproduction":"Local SystemFixture without the fixture's _activate(): owner sends hook.configureAndActivate(router, rewards, oracle, 1) and, in the same block (next nonce), router.swap{value: X}(buy). The owner's buy executes at the opening tick 177300 (19.97 ETH FDV) before any other wallet can submit; afterwards hook.syncPayer() credits eligible[owner] = 30_000_000e18 so remainingQuota(owner) == 7_500_000e18 at p=2500 without the owner having bought anything. Any other wallet's buy in that block can only be ordered after the activation transaction by the block builder. Expected: the brief's 'authenticated actual traders' get a neutral opening; actual: the activating wallet controls the opening moment.","severity":"info","snippet":"        if (msg.sender != setupAuthority) revert Unauthorized();\n        if (activated) revert AlreadyActivated();","title":"Trust gap (access x economics): the setup authority is also the payer wallet and alone picks the activation block, so it can guarantee itself the first trade and already holds a 7.5M UNLK sell quota a"},{"citation":"resolved","description":"UnlkToken is a plain ERC-20 (as the brief requires) and the hook's authentication, quota and fee rules exist only in the beforeSwap/afterSwap callbacks of the one bound PoolKey (fee 12500, spacing 60, hooks=UnlkHook). Nothing prevents anyone from calling PoolManager.initialize with PoolKey(address(0), token, anyFee, anySpacing, IHooks(address(0))), adding liquidity and trading there without quota, without the 1%/0.25% split and without feeding the oracle. Every holder (transfer-only holders included) can therefore sell unlimited UNLK off the official pool, and arbitrage between the two pools transmits that selling pressure into the official pool price the milestone oracle reads. This is disclosed in SECURITY_REVIEW.md and launch.json notes ('other-pool bypass'); recorded here with a concrete sequence because the brief requires the disclosure and because it bounds what the quota mechanism actually guarantees.","line":31,"path":"src/UnlkToken.sol","reproduction":"Executed locally (test/scratch/OtherPool.t.sol, passes on this tree). SystemFixture after activation. Wallet V (an unlock-callback contract) receives 2,000,000e18 UNLK by plain transfer from the payer; hook.eligible(V)==0. 1) manager.initialize(PoolKey(Currency.wrap(address(0)), Currency.wrap(address(token)), 3000, 60, IHooks(address(0))), TickMath.getSqrtPriceAtTick(177300)) succeeds; UnlkHook is never consulted. 2) V adds liquidity 1e21 on ticks [177240,177360] paying both currencies. 3) V swaps 1,000,000e18 UNLK for ETH (zeroForOne=false, exact input, limit MAX_SQRT_PRICE-1) on that key: succeeds, V's ETH balance increases, hook.sold(V) stays 0, no QuotaExceeded, no 1.25% payer/IMD split, no oracle checkpoint. Expected per the brief's quota statement: S bounded by Q=max(0, floor(E*p/10000)-S); actual: unbounded off the official pool, by design.","severity":"info","snippet":"    function _update(address from, address to, uint256 amount) internal override {\n        super._update(from, to, amount);","title":"Other-pool bypass: quotas bind only the official pool; any holder can sell on a hook-less ETH/UNLK pool on the same PoolManager"}],"hash":"ca66bd09c7e0bbf40755061380c3ef168c3be3295c8fb1c47a5cbe2a4e11ddc4","nodeId":"3fab8cb8-f49a-47a1-9ec7-f3e9443fc21b","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result.\n\n**Outcome.** The permission model of the UNLK hook bundle holds. I found no undisclosed bypass, escalation path, unprotected initializer, confused deputy, or asymmetric paired write. All 175 project tests pass on this tree, and seven extra scratch probes I wrote under `test/scratch/` also pass. Those probes confirm that a direct PoolManager swap with a spoofed nonce is refused, that even the factory identity cannot remove seed principal, that non-owner staging and activation and a second activation revert, that an outsider cannot bind the oracle, and that re-entering swap from a native withdrawal leaves the router ledger backed.\n\n**Findings file.** Four findings, all at info severity, each with a reproduction executed locally. They are the material trust gaps the brief requires to be disclosed, not code defects, and the author already documents three of them:\n\n- The chain treasury can mint official-pool sell quota for any wallet by opening a funded reward round. A plain transfer recipient of the same balance gets none.\n- A PoolManager protocol fee halts all official trading permanently, with no recovery path inside the launch.\n- The setup authority is also the payer wallet, alone picks the activation block, and already holds a 7.5M UNLK quota at activation. Activation-timing priority is the one point the docs do not state.\n- Quotas bind only the official pool. A transfer-only holder sold 1,000,000 UNLK on a hook-less ETH/UNLK pool with no quota, no fee split and no oracle checkpoint.\n\n**Coverage.** All 28 listed entry points have a row, plus four invariant and manifest rows. Four entry points point at the info findings above, the rest hold. Not reached in depth: numeric precision of the seed-depth and TWAP math, sustained-manipulation economics, and a fresh Sepolia fork rehearsal, which belong to other specialists or needed an RPC I did not have.\n\nNo repository files were changed. Only `.imd-findings.json` and the two scratch test files, which are mine and not kept, were written.","treeHash":null,"usage":{"cachedInputTokens":3697972,"inputTokens":738,"model":"claude-fable-5-1","outputTokens":59693,"runtime":"claude","turns":45,"wallClockMs":861617}}],"verification":[{"checks":[{"durationMs":17762,"exitCode":0,"name":"build","output":"Compiling 135 files with Solc 0.8.26\nSolc 0.8.26 finished in 17.62s\nCompiler run successful with warnings:\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/BatchSettlementProperties.t.sol:14:9:\n   |\n14 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/NativeCustodyInvariants.t.sol:15:9:\n   |\n15 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/UnlkHook.sol:209:5:\n    |\n209 |     function afterInitialize(address, PoolKey calldata key, uint160, int24)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":10350,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/HookDeployer.t.sol:HookDeployerTest\n[PASS] testChangedCreationBodyCannotMatchReviewedHash() (gas: 135903)\n[PASS] testChangedSetupAuthorityChangesHashAndCreate2Prediction() (gas: 226228)\n[PASS] testDeployedHelperFitsEvmCodeLimits() (gas: 8947)\n[PASS] testFuzzEncodesCallerSuppliedBytesAndFourAddresses(bytes,address,address,address,address) (runs: 256, μ: 24547, ~: 20428)\n[PASS] testReviewedHookInitCodeAndHash() (gas: 196628)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 18.30ms (17.39ms CPU time)\n\nRan 5 tests for test/EvidenceAndOracleProperties.t.sol:MultiLeafEvidenceTest\n[PASS] testDecreasingEvidenceCannotRevokePreviouslyCreditedClaims() (gas: 1100730)\n[PASS] testProofsFromTheActualTreeCreditExactlyWhatWasDelivered() (gas: 2298063)\n[PASS] testSiblingCannotAttestAnotherWalletsClaim() (gas: 771322)\n[PASS] testSweptRoundFreezesEvidence() (gas: 1136164)\n[PASS] testTheTreeIsWellFormed() (gas: 40973)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 38.58ms (2.07ms CPU time)\n\nRan 1 test for test/FailurePaths.t.sol:UnpaidLaunchTest\n[PASS] testNoRequesterMeansNoPayerCreditAnywhere() (gas: 1267642)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 44.62ms (994.68µs CPU time)\n\nRan 2 tests for test/SecurityRegression.t.sol:StagingCreationRegressionTest\n[PASS] testCounterfeitConstructorIsRefusedBeforeAnyDeployment() (gas: 6413863)\n[PASS] testOnlySetupAuthorityMayStageAndOnlyUntilActivation() (gas: 12289760)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 45.08ms (2.32ms CPU time)\n\nRan 2 tests for test/TwoStage.t.sol:StageOneConstructorTest\n[PASS] testConstructorRejectsMissingOrConflatedInputs() (gas: 8207)\n[PASS] testOnlyFactoryCanInitializeTheHooksPool() (gas: 43150)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 47.20ms (166.92µs CPU time)\n\nRan 4 tests for test/SeedBoundary.t.sol:SeedBoundaryTest\n[PASS] testBuyLimitIsBoundedByTheSeedFloor() (gas: 390660)\n[PASS] testLimitsInsideTheRangeAreHonoured() (gas: 771508)\n[PASS] testSellIntoAnEmptyReserveRevertsWithoutState() (gas: 394827)\n[PASS] testSellThatDrainsTheReserveStopsAtTheSeedBoundary() (gas: 1586847)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 49.81ms (3.64ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:EvidenceCertificationRegressionTest\n[PASS] testActualLaterRoundClaimsHaveNoArtificialCumulativeCeiling() (gas: 1511648)\n[PASS] testDuplicateRecipientCannotOvercreditSmallerActualClaim() (gas: 441218)\n[PASS] testIncompleteTreeCannotBeCertified() (gas: 59593)\n[PASS] testOddTreeReconstructionAndPreCertificationNativeClaim() (gas: 580532)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 54.00ms (1.42ms CPU time)\n\nRan 2 tests for test/Stage2Script.t.sol:Stage2ScriptTest\n[PASS] testStage2DeploysFromActualIdentitiesAndOwnerActivates() (gas: 7071565)\n[PASS] testStage2RefusesUnknownLaunchNumber() (gas: 33767)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 54.80ms (2.24ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] testCompanionsAreImmutablyBound() (gas: 37886)\n[PASS] testFactoryHoldsPrincipalAndCannotRemoveIt() (gas: 333697)\n[PASS] testLaunchAllocationAndLockedPrincipal() (gas: 191055)\n[PASS] testLaunchIsOnceAndDeployerOnly() (gas: 2731433)\n[PASS] testOnlyCanonicalManagerCanCallHook() (gas: 66479)\n[PASS] testPayerCreditExactDeduplicated() (gas: 137462)\n[PASS] testUnauthorizedFactoryAndWrongPoolRejected() (gas: 80623)\n[PASS] testUnconfiguredComponentsFailClosed() (gas: 42307)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 54.76ms (1.72ms CPU time)\n\nRan 1 test for test/EvidenceAndOracleProperties.t.sol:RouterDeadlineTest\n[PASS] testDeadlineIsInclusive() (gas: 423552)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 56.71ms (508.22µs CPU time)\n\nRan 2 tests for test/LocalScript.t.sol:LocalScriptTest\n[PASS] testLocalScriptRefusesPublicChainId() (gas: 13983272)\n[PASS] testLocalSimulationFunctionDoesNotDependOnCaller() (gas: 63694238)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.43ms (5.90ms CPU time)\n\nRan 1 test for test/RevisionProperties.t.sol:RestagingIsolationTest\n[PASS] testAbandonedBundleIsInertAndMixedBundlesAreRefused() (gas: 7156292)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 68.60ms (3.97ms CPU time)\n\nRan 3 tests for test/ReleaseConfig.t.sol:ReleaseConfigTest\n[PASS] testReadOnlyReleaseChecksOnLocalFixture() (gas: 2011487)\n[PASS] testReadOnlyReleaseChecksRejectWrongChainOrHash() (gas: 1903758)\n[PASS] testStageOneAloneCannotPassReleaseGate() (gas: 63801371)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 76.46ms (33.09ms CPU time)\n\nRan 10 tests for test/CreditsAndFees.t.sol:CreditsAndFeesTest\n[PASS] testAttestationRequiresActualClaimAndExactLeaf() (gas: 438961)\n[PASS] testClaimTransferAndPayerTransferDoNotDuplicateCredit() (gas: 577960)\n[PASS] testFeeCollectionDoesNotReducePrincipal() (gas: 647552)\n[PASS] testNativeClaimNeverDependsOnAdapterOrFeed() (gas: 1190278)\n[PASS] testNativeClaimThenAttestThenSyncThenSale() (gas: 1607696)\n[PASS] testNegativeLiquidityForbiddenEvenForFactory() (gas: 82464)\n[PASS] testProofReleaseAndDedupRemainNativeRules() (gas: 573172)\n[PASS] testSaleFeesCountGrossInputAndNeverCreditFeeRecipients() (gas: 1191477)\n[PASS] testUnauthorizedLiquidityAndDonationNoCredit() (gas: 232025)\n[PASS] testUnclaimedRewardsNotEligible() (gas: 39399)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 85.08ms (3.79ms CPU time)\n\nRan 8 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test100PercentAloneIsNotFullUnlock() (gas: 7257766)\n[PASS] testArbitraryHookDataAndMultihopPayloadCannotSelectVictim() (gas: 89207)\n[PASS] testCallbacksAllRequireCanonicalManager() (gas: 211512)\n[PASS] testForeignPoolKeyRejectedEvenWithManagerPrank() (gas: 49882)\n[PASS] testNoMintPauseBlacklistUpgradeOrCounterResetEntrypoint() (gas: 114793)\n[PASS] testProtocolFeeChangeCannotSilentlyAlterTradingEconomics() (gas: 359163)\n[PASS] testQuotaMultiplicationDoesNotOverflowAtMaxEligible() (gas: 239235)\n[PASS] testTokenMintsWholeSupplyToDeployerOnly() (gas: 32832)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 85.58ms (15.88ms CPU time)\n\nRan 1 test for test/SecurityRegression.t.sol:LargeTreeCertificationTest\n[PASS] testMaximumSortedTreeFitsTransactionGasLimit() (gas: 15973574)\nLogs:\n  1024-leaf sorted certification gas: 13939470\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 86.35ms (29.12ms CPU time)\n\nRan 13 tests for test/TwoStage.t.sol:StageOneTest\n[PASS] testActivationSealsAndCannotBeReplayed() (gas: 6134570)\n[PASS] testCrossLaunchNumberRejected() (gas: 5594038)\n[PASS] testFactoryLiquidityAllowedBeforeActivationButPrincipalStaysLocked() (gas: 37293)\n[PASS] testFirstTierConfirmsBelowTenEthActualReserves() (gas: 35619197)\n[PASS] testLaunchSucceedsWithoutCompanions() (gas: 122562)\n[PASS] testPayerCanTransferBeforeActivationWithoutLosingHistoricalCredit() (gas: 6125881)\n[PASS] testPayerCreditOnlyAfterActivationAndFromOriginalTransferReceipt() (gas: 6075022)\n[PASS] testRequesterReassignmentCannotMoveInitialAllocationCredit() (gas: 6081688)\n[PASS] testSepoliaRequiresPublishedChainlinkFeed() (gas: 5610561)\n[PASS] testSwapsSyncAndMilestonesRevertBeforeActivation() (gas: 6082593)\n[PASS] testTransfersAndNativeClaimsWorkBeforeActivationAndClaimIsCreditedLater() (gas: 6432841)\n[PASS] testUnauthorizedActivationRejected() (gas: 5606198)\n[PASS] testWrongContractsRejected() (gas: 6294420)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 48.40ms (21.82ms CPU time)\n\nRan 3 tests for test/FailurePaths.t.sol:ActivationFailurePathsTest\n[PASS] testCompanionConstructorsRejectMissingInputs() (gas: 6057)\n[PASS] testCrossLaunchSetupIsRefusedInEveryDirection() (gas: 24766771)\n[PASS] testSepoliaRefusesLocallyClonedServicesEvenWithFeedAtPublishedAddress() (gas: 676766)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 62.92ms (19.43ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:CodeAuthenticationRegressionTest\n[PASS] testActivationExternalFailureRollsBackEveryBinding() (gas: 912953)\n[PASS] testInconsistentImmutablePatchesAreRejected() (gas: 2018871)\n[PASS] testLaterFactoryDonationsCannotRewriteInitialAllocationReceipts() (gas: 688934)\n[PASS] testRuntimeMutationCannotPassGetterChecks() (gas: 85252)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 139.27ms (27.22ms CPU time)\n\nRan 3 tests for test/SecurityRegression.t.sol:OracleOutageRegressionTest\n[PASS] testDepthDipInvalidatesWholeWindowAndRetainsReachedRights() (gas: 16317055)\n[PASS] testFinalTierRequiresItsOwnTwentyFourHours() (gas: 138827744)\n[PASS] testNextTierClockWaitsForItsOwnThreshold() (gas: 15295035)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 150.45ms (107.46ms CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:SeedGatePropertiesTest\n[PASS] testFuzz_launchedSeedIsAlwaysLiquidAndRefusedSeedIsAlwaysBelowFloor(uint8) (runs: 96, μ: 11091242, ~: 9050245)\n[PASS] testFuzz_poolShareBandDecidesLaunchAndActivation(uint16) (runs: 96, μ: 11400930, ~: 9047728)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 194.76ms (264.52ms CPU time)\n\nRan 11 tests for test/NativeLaunch.t.sol:NativeWithdrawalTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136095725)\n[PASS] testNativeBatchSettlement() (gas: 870289)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1127528)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 453473)\n[PASS] testNativeSettlementResetsPriorSyncCurrency() (gas: 605836)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91930)\n[PASS] testNativeWithdrawalUsesCEIAndCannotDoubleWithdraw() (gas: 996338)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62586)\n[PASS] testOtherWalletCannotWithdrawNativeRefund() (gas: 461374)\n[PASS] testRejectingNativeWalletCanTradeAndRetryWithdrawal() (gas: 1074660)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29940461)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 196.63ms (135.82ms CPU time)\n\nRan 17 tests for test/Oracle.t.sol:OracleTest\n[PASS] testBadChainlinkRoundsAndAnswersFailClosed() (gas: 2352246)\n[PASS] testConfirmationGapRestartsRatherThanCountingUnobservedTime() (gas: 14857451)\n[PASS] testEveryTierAndPermanentUnlock() (gas: 136512808)\n[PASS] testFallingPricesNeverLowerReachedTier() (gas: 29259665)\n[PASS] testInvalidDataCannotCountTowardPendingConfirmationOrRevokeRights() (gas: 15083422)\n[PASS] testInvalidDataLongerThanGapRestartsOnNextValidCall() (gas: 694951)\n[PASS] testLongInvalidIntervalRestartsWhetherObservedOrNot() (gas: 807692)\n[PASS] testNegativeTickAveragesRoundConservativelyForBothOrders() (gas: 769389)\n[PASS] testObservedAndUnobservedInvalidIntervalsAgree() (gas: 29667292)\n[PASS] testOneBlockSpikeCannotConfirm() (gas: 740812)\n[PASS] testOracleCannotBeReboundOrConfiguredByAnyone() (gas: 73530)\n[PASS] testRealFeedCadenceCannotBeUsedToResetConfirmation() (gas: 18790257)\n[PASS] testSameTimestampManipulationHasNoTimeWeight() (gas: 760132)\n[PASS] testStaleCheckpointAndFeedPreventNewTierButNotTrades() (gas: 1332186)\n[PASS] testSustainedManipulationRequiresWindowAndConfirmation() (gas: 15128037)\n[PASS] testThresholdMappingBoundaries() (gas: 69776)\n[PASS] testWarmupAndExactWindow() (gas: 400906)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 263.37ms (209.34ms CPU time)\n\nRan 1 test for test/StageOneInvariants.t.sol:StageOneInvariantTest\n[PASS]\nStageOneInvariantTest invariants:\n[PASS] invariant_onlyTheAuthorizedCallActivates\n[PASS] invariant_tokenAndClaimsIndependentOfTheHook\n[PASS] invariant_unconfiguredPoolIsInert\n StageOneInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| StageOneHandler | advance          | 459   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | attemptActivate  | 436   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | claimAndAttest   | 464   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | directSwap       | 492   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | foreignLiquidity | 509   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | routerSwap       | 507   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | syncAndMilestone | 498   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | transfer         | 475   | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 721.64ms (676.35ms CPU time)\n\nRan 3 tests for test/ManipulationEconomics.t.sol:ManipulationEconomicsTest\n[PASS] testCounterSellingOfAllInitialNonPoolTokens() (gas: 157505516)\nLogs:\n  gross ETH capital (wei): 404492004375936755769\n  attacker ETH exit (wei): 139667041180374722901\n  net ETH exit cost before fee recapture (wei): 264824963195562032868\n  payer ETH fee receipts (wei): 4044920043759367559\n  counter-seller ETH proceeds (wei): 259768813140862823404\n  duration seconds: 201600\n\n[PASS] testPayerCanRecaptureItsNativeFeeShare() (gas: 144656869)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n  net ETH cost after native fee recapture (wei): 653249186877100125\n\n[PASS] testSustainedManipulationUnlockAndExit() (gas: 144670589)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 984.96ms (282.10ms CPU time)\n\nRan 3 tests for test/EvidenceAndOracleProperties.t.sol:OracleReferenceTest\n[PASS] testCheckpointReplacementRewritesOnlyTheCurrentSecond() (gas: 997263)\n[PASS] testFuzzFdvIsMonotonicInTheEthUsdAnswer(uint64,uint64) (runs: 256, μ: 751916, ~: 752051)\n[PASS] testFuzzTwapMatchesBruteForceReference(uint256) (runs: 160, μ: 2747618, ~: 2596849)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.32s (752.91ms CPU time)\n\nRan 4 tests for test/ActivationRobustness.t.sol:ChunkedCertificationTest\n[PASS] testChunkBoundsAndSizeAreFixedByTheFirstChunk() (gas: 29517535)\n[PASS] testDuplicateAcrossChunksWrongRootAndForeignSessionsAreRefused() (gas: 231631551)\n[PASS] testSingleLeafRoundCertifiesThroughTheChunkedPath() (gas: 398202)\n[PASS] testSingleShotRefusesButChunksCertifyAndCredit() (gas: 124071664)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.32s (119.88ms CPU time)\n\nRan 7 tests for test/NativeLaunch.t.sol:NativeLaunchTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136095724)\n[PASS] testNativeBatchSettlement() (gas: 870289)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1127517)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 453384)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91952)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62608)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29940461)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 578.11ms (102.49ms CPU time)\n\nRan 6 tests for test/ActivationRobustness.t.sol:ActivationRobustnessTest\n[PASS] testPolicySeedRecordsCapacityAndConfirmsTiers() (gas: 30575729)\n[PASS] testSeedBelowOpeningValueFloorCannotLaunch() (gas: 9054745)\n[PASS] testSeedBelowThePoolShareBandCannotLaunch() (gas: 9050786)\n[PASS] testSeedInsideTheOnePercentBandActivates() (gas: 15887629)\n[PASS] testStagingRunsActivationPreconditionsAndCanRepeat() (gas: 21576209)\n[PASS] testSubDustSeedRoundingStillActivates() (gas: 16247257)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.36s (24.65ms CPU time)\n\nRan 9 tests for test/Trading.t.sol:TradingTest\n[PASS] testAnotherWalletCannotConsumeVictimsAllowanceOrQuota() (gas: 472208)\n[PASS] testDirectManagerAndForeignRouterSpoofingRejected() (gas: 644028)\n[PASS] testDonatedRouterBalancesCannotCreateCreditOrBeSwept() (gas: 497543)\n[PASS] testExactOutputSaleAccountsActualInput() (gas: 735195)\n[PASS] testExcessSaleRollsBackPoolBalancesOracleAndNonce() (gas: 800579)\n[PASS] testFuzzQuotaBoundary(uint96) (runs: 256, μ: 1037768, ~: 1037777)\n[PASS] testReplayOldCallbackHasNoLiveContext() (gas: 427364)\n[PASS] testSaleBoundaryExecutedInputIncludesPoolFee() (gas: 1067073)\n[PASS] testTransfersDoNotMoveRightsOrAllowChainCredit() (gas: 830532)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.40s (1.35s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:ChunkedCertificationPropertiesTest\n[PASS] testFuzz_abandonedSessionIsInertAndRestartable(uint8,uint256) (runs: 128, μ: 2350848, ~: 1709809)\n[PASS] testFuzz_anyChunkingAndReductionScheduleMatchesSingleShot(uint8,uint256,uint256,uint256,uint8,uint8) (runs: 128, μ: 3976257, ~: 3364305)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.43s (1.32s CPU time)\n\nRan 17 tests for test/FailurePaths.t.sol:RouterAndHookFailurePathsTest\n[PASS] testBatchBoundsAndValueMustMatch() (gas: 186758)\n[PASS] testBatchIsAtomicWhenALaterStepFails() (gas: 834234)\n[PASS] testConfirmationRequiresSixHoursAndCannotSkipTiers() (gas: 15341697)\n[PASS] testFullUnlockKeepsFeesAndRouterAuthentication() (gas: 137007309)\n[PASS] testFuzzOperationHashBindsTraderNonceAndChain(address,uint256,uint64) (runs: 256, μ: 17656, ~: 17656)\n[PASS] testFuzzRemainingQuotaFormula(uint128,uint128,uint8) (runs: 512, μ: 7293365, ~: 7293203)\n[PASS] testFuzzTierIsMonotonicInFdv(uint256,uint256) (runs: 512, μ: 16956, ~: 16923)\n[PASS] testFuzzTransfersMoveExactlyTheAmount(address,uint96) (runs: 256, μ: 122086, ~: 122463)\n[PASS] testHookRejectsMalformedRouteDataAndUnknownSenders() (gas: 238753)\n[PASS] testPartialFillAtPriceLimitChargesOnlyExecutedInput() (gas: 1213883)\n[PASS] testQuotaWidensWithTierAndNeverDoubleCounts() (gas: 16795708)\n[PASS] testRequesterChangeAfterActivationDoesNotMoveThePayer() (gas: 146383)\n[PASS] testRouterCallbackNeedsALiveSwap() (gas: 73817)\n[PASS] testRouterRefusesDegenerateRequests() (gas: 500273)\n[PASS] testSecondRoundClaimsAccumulateOncePerRound() (gas: 995639)\n[PASS] testSlippageRefusalsLeaveNoTrace() (gas: 899401)\n[PASS] testSyncForStrangerAndZeroAddressCreatesNothing() (gas: 108400)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 1.50s (1.32s CPU time)\n\nRan 5 tests for test/BatchSettlementProperties.t.sol:BatchSettlementPropertiesTest\n[PASS] testFuzz_BatchEqualsSequentialExecution(uint256,uint8,bool) (runs: 1000, μ: 4514064, ~: 4062136)\n[PASS] testFuzz_FailureAtAnyBatchIndexRestoresAllowancesFeesAndCredits(uint256,uint8) (runs: 1000, μ: 11404877, ~: 11106673)\n[PASS] test_MaximumMixedBatchOnFreshTokenOnlyManager() (gas: 9253895)\n[PASS] test_OneWeiShortAllowanceRestoresEntireBatchAndRetryWorks() (gas: 1872568)\n[PASS] test_PartialSaleMayPrefundMoreThanQuotaButChargesOnlyExecution() (gas: 906671)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.50s (2.77s CPU time)\n\nRan 1 test for test/Invariants.t.sol:SystemInvariantTest\n[PASS]\nSystemInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n SystemInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 877   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 865   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 848   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 859   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 822   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 849   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.71s (1.67s CPU time)\n\nRan 1 test for test/Invariants.t.sol:FullyUnlockedInvariantTest\n[PASS]\nFullyUnlockedInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n[PASS] invariantUnlockRemainsPermanentDespiteInvalidFeed\n FullyUnlockedInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 877   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 865   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 848   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 859   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 822   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 849   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.89s (1.65s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:MilestoneSampleInvariantTest\n[PASS]\nMilestoneSampleInvariantTest invariants:\n[PASS] invariant_confirmationNeedsAnUnbrokenChainOfValidSamples\n[PASS] invariant_invalidSamplesNeverAdvanceTiers\n[PASS] invariant_nothingEverRelocksAndStateIsConsistent\n MilestoneSampleInvariantTest invariants (runs: 48, calls: 1920, reverts: 0)\n\n╭------------------------+----------+-------+---------+----------╮\n| Contract               | Selector | Calls | Reverts | Discards |\n+================================================================+\n| MilestoneSampleHandler | advance  | 315   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | corrupt  | 332   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | heal     | 306   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | march    | 305   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | sample   | 335   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | setPrice | 327   | 0       | 0        |\n╰------------------------+----------+-------+---------+----------╯\n\n[PASS] testHandlerReachesTiersAndEveryCorruptionIsInvalid() (gas: 12640787)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.03s (1.98s CPU time)\n\nRan 2 tests for test/QuotaInvariants.t.sol:QuotaInvariantTest\n[PASS]\nQuotaInvariantTest invariants:\n[PASS] invariant_configurationSealedAndRouteEnforced\n[PASS] invariant_ledgerMatchesExecutedDeltas\n[PASS] invariant_milestonesMonotonicAndConsistent\n[PASS] invariant_principalLockedAndFeeTermsFixed\n[PASS] invariant_routerNativeSolvency\n[PASS] invariant_salesNeverExceedQuota\n[PASS] invariant_supplyConservedAndNoCustody\n QuotaInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭--------------+-----------------+-------+---------+----------╮\n| Contract     | Selector        | Calls | Reverts | Discards |\n+=============================================================+\n| QuotaHandler | advance         | 360   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactIn      | 353   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactOut     | 368   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimAndAttest  | 345   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimFees       | 364   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | directSwap      | 355   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | donate          | 360   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | foreignActivate | 353   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellExactOut    | 362   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellOverQuota   | 347   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellWithinQuota | 729   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | setFeed         | 366   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sync            | 382   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | transfer        | 373   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | withdrawNative  | 343   | 0       | 0        |\n╰--------------+-----------------+-------+---------+----------╯\n\n[PASS] testHandlerActionsActuallyExecute() (gas: 23822211)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.96s (2.91s CPU time)\n\nRan 2 tests for test/ClaimLifecycleInvariants.t.sol:ClaimLifecycleInvariantsTest\n[PASS]\nClaimLifecycleInvariantsTest invariants:\n[PASS] invariant_DistributorReservesAndCashMatchIndependentRoundModel\n[PASS] invariant_FixedSupplyAndInitialReceiptsSurviveAllClaimSequences\n[PASS] invariant_OnlyDeliveredAttestedAndSyncedClaimsCreateRights\n ClaimLifecycleInvariantsTest invariants (runs: 256, calls: 20480, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| ClaimLifecycleHandler | advance           | 1800  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | attest            | 1900  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | certify           | 1785  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | claim             | 1782  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | deliverAndSync    | 1970  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | openRound         | 1880  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sweep             | 1840  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sync              | 1832  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | syncPayer         | 1919  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | transferOrDonate  | 1881  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | unauthorizedRound | 1891  | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\n[PASS] test_ModelExercisesDelayedCertificationSweepsAndRecycledFunding() (gas: 4966220)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.00s (8.97s CPU time)\n\nRan 2 tests for test/NativeCustodyInvariants.t.sol:NativeCustodyInvariantsTest\n[PASS]\nNativeCustodyInvariantsTest invariants:\n[PASS] invariant_ManagerHasNoUnsettledDeltaOrReusableRouteContext\n[PASS] invariant_NativeLiabilitiesRemainFullyBackedAndBelongToTheirWallet\n[PASS] invariant_TransfersDonationsAndFailedBatchesCannotCreateOrMoveRights\n NativeCustodyInvariantsTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| NativeCustodyHandler | donateTokens | 2701  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | failBatch    | 2692  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | forceEther   | 2826  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | tradeBatch   | 2753  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | transfer     | 2652  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | withdraw     | 2760  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\n[PASS] test_HandlerTradesRejectsReentersAndDrainsWithoutTakingDonations() (gas: 5323166)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.15s (10.12s CPU time)\n\nRan 8 tests for test/SepoliaPins.t.sol:SepoliaPinsTest\n[PASS] testEmbeddedRuntimeMatchesThePins() (gas: 22518)\n[PASS] testLocalChainDoesNotConsultThePins() (gas: 10226069)\n[PASS] testSepoliaAcceptsThePinnedServicesAtInitialize() (gas: 10488386)\n[PASS] testSepoliaRefusesAnUnpinnedFactory() (gas: 6489939)\n[PASS] testSepoliaRefusesAnUnpinnedManager() (gas: 159347398)\n[PASS] testSepoliaRefusesLookalikeFeesBehindThePinnedFactory() (gas: 10451800)\n[PASS] testSepoliaRefusesLookalikeRegistryBehindThePinnedFactory() (gas: 10438631)\n[PASS] testSepoliaRefusesUnpinnedServicesAtInitialize() (gas: 10157187)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 10.20s (96.67ms CPU time)\n\nRan 40 test suites in 10.20s (51.97s CPU time): 187 tests passed, 0 failed, 0 skipped (187 total tests)\n","passed":true},{"durationMs":126,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MerkleClaimEvidence.abandonSession(uint256)\",\"MerkleClaimEvidence.attest(uint256,address,uint256,bytes32[])\",\"MerkleClaimEvidence.certifyRound(uint256,address[],uint256[])\",\"MerkleClaimEvidence.reduce(uint256,uint256)\",\"MerkleClaimEvidence.submitLeaves(uint256,uint256,address[],uint256[])\",\"UnlkHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"UnlkHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"UnlkHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"UnlkHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"UnlkHook.configureAndActivate(address,address,address,uint64)\",\"UnlkHook.deployCompanions(uint64,address,bytes,bytes,bytes)\",\"UnlkHook.syncPayer()\",\"UnlkHook.syncRewards(address)\",\"UnlkHook.updateMilestone()\",\"UnlkOracle.bind((address,address,uint24,int24,address),address,int24,int24)\",\"UnlkOracle.checkpoint()\",\"UnlkSwapRouter.receive()\",\"UnlkSwapRouter.swap((bool,int256,uint160,uint256,uint256,uint256))\",\"UnlkSwapRouter.swapBatch((bool,int256,uint160,uint256,uint256,uint256)[])\",\"UnlkSwapRouter.unlockCallback(bytes)\",\"UnlkSwapRouter.withdrawNative()\",\"UnlkToken.approve(address,uint256)\",\"UnlkToken.transfer(address,uint256)\",\"UnlkToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DELIVERY.md\":103,\"LICENSE\":25,\"README.md\":167,\"RELEASE_STATUS.json\":53,\"delivery/OPERATIONS.md\":112,\"delivery/PACKAGE_SHA256SUMS\":566,\"delivery/STATUS.json\":213,\"delivery/checks/abi-export.txt\":1,\"delivery/checks/artifact-export.txt\":1,\"delivery/checks/build.txt\":21,\"delivery/checks/current-block-fork.txt\":24,\"delivery/checks/extended-fork.txt\":27,\"delivery/checks/final-fmt.txt\":0,\"delivery/checks/final-integrity.txt\":8,\"delivery/checks/fmt.txt\":0,\"delivery/checks/historical-block-fork.txt\":25,\"delivery/checks/imd-launch.txt\":1,\"delivery/checks/integrity.txt\":12,\"delivery/checks/lint.txt\":372,\"delivery/checks/live-rpc.txt\":1,\"delivery/checks/minimal-environment.txt\":505,\"delivery/checks/protected.txt\":22,\"delivery/checks/release-gates.txt\":10,\"delivery/checks/reviewed-code.txt\":1,\"delivery/checks/revision-fmt.txt\":1,\"delivery/checks/revision-fork.txt\":17,\"delivery/checks/revision-protected.txt\":22,\"delivery/checks/revision-test.txt\":980,\"delivery/checks/rpc-tools.txt\":1,\"delivery/checks/saved-network.txt\":7,\"delivery/checks/signing-tools.txt\":5,\"delivery/checks/source-hashes.txt\":458,\"delivery/checks/test.txt\":485,\"delivery/checks/upstream-rehearsal-build.txt\":8,\"delivery/network/block.json\":1,\"delivery/network/capabilities.json\":345,\"delivery/network/current-job.json\":217,\"delivery/network/factory.runtime.hex\":1,\"delivery/network/feed-check.json\":21,\"delivery/network/feed.runtime.hex\":1,\"delivery/network/fees.runtime.hex\":1,\"delivery/network/fix-job.json\":104,\"delivery/network/http-results.json\":117,\"delivery/network/import-check-paths-request.json\":33,\"delivery/network/import-check-paths-response.json\":25,\"delivery/network/import-check-request.json\":15,\"delivery/network/import-check-response.json\":25,\"delivery/network/import-request.json\":5,\"delivery/network/import-response.json\":17,\"delivery/network/manager.runtime.hex\":1,\"delivery/network/openapi.json\":1383,\"delivery/network/platform-rebuild.json\":30,\"delivery/network/policies.json\":1430,\"delivery/network/preflight.json\":347,\"delivery/network/registry.runtime.hex\":1,\"delivery/network/rpc-access.json\":20,\"delivery/network/selected-policy.json\":34,\"delivery/network/services.json\":29,\"delivery/protected-inputs.json\":4,\"delivery/provenance.json\":25,\"delivery/rehearsal/RecordedSepolia.t.sol\":200,\"delivery/source-files.json\":2492,\"delivery/verify.py\":163,\"dependencies.lock.json\":24,\"docs/ARTIFACTS.json\":64,\"docs/BUILD_RESULTS.txt\":21,\"docs/BYTECODE_COMPARISON_RESULTS.txt\":8,\"docs/DEPLOYMENT.md\":163,\"docs/ECONOMICS_RESULTS.txt\":49,\"docs/FMT_RESULTS.txt\":0,\"docs/FORK_RESULTS.txt\":24,\"docs/IMD_LAUNCH_CHECK_RESULTS.txt\":1,\"docs/LINT_RESULTS.txt\":372,\"docs/MINIMAL_ENV_TEST_RESULTS.txt\":543,\"docs/NETWORK_VERIFICATION_RESULTS.txt\":7,\"docs/PROTECTED_TEST_RESULTS.txt\":22,\"docs/RECOVERY.md\":65,\"docs/RELEASE_ARTIFACT_TEST_RESULTS.txt\":10,\"docs/REVISION_2026-10-13.md\":120,\"docs/SECURITY_REVIEW.md\":132,\"docs/SIZE_FIX.md\":150,\"docs/SOURCE_SHA256SUMS\":461,\"docs/SOURCE_VERIFICATION_RESULTS.txt\":458,\"docs/TEST_RESULTS.txt\":485,\"docs/VALIDATION.md\":135,\"docs/abi/CheckReleaseConfig.json\":46,\"docs/abi/HookDeployer.json\":94,\"docs/abi/IChainlinkEthUsd.json\":48,\"docs/abi/IClaimEvidence.json\":47,\"docs/abi/IHooks.json\":789,\"docs/abi/ILaunchFactoryView.json\":115,\"docs/abi/ILaunchRegistryView.json\":70,\"docs/abi/IMerkleDistributor.json\":125,\"docs/abi/IPoolManager.json\":1286,\"docs/abi/IRouteContext.json\":20,\"docs/abi/LaunchFactory.json\":896,\"docs/abi/LaunchFees.json\":323,\"docs/abi/LaunchRegistry.json\":320,\"docs/abi/MerkleClaimEvidence.json\":461,\"docs/abi/MerkleDistributor.json\":451,\"docs/abi/Stage2.json\":225,\"docs/abi/UnlkHook.json\":1973,\"docs/abi/UnlkOracle.json\":443,\"docs/abi/UnlkSwapRouter.json\":359,\"docs/abi/UnlkToken.json\":425,\"docs/network/capabilities.json\":345,\"docs/network/factory-artifacts.json\":2201,\"docs/network/factory-reference.json\":420,\"docs/network/factory.runtime.hex\":1,\"docs/network/feed-reference.json\":67,\"docs/network/feed-rounds.json\":134,\"docs/network/feed.runtime.hex\":1,\"docs/network/fees.runtime.hex\":1,\"docs/network/job-identity.json\":14,\"docs/network/manager.runtime.hex\":1,\"docs/network/policies.json\":36,\"docs/network/registry-reference.json\":108,\"docs/network/registry.runtime.hex\":1,\"docs/network/sepolia.json\":309,\"docs/network/services.json\":29,\"docs/network/size-fix-status.json\":126,\"foundry.toml\":31,\"launch.json\":35,\"rehearsal/Sepolia.t.sol\":112,\"remappings.txt\":4,\"script/CheckReleaseConfig.s.sol\":85,\"script/LocalDemo.s.sol\":41,\"script/Stage2.s.sol\":98,\"scripts/check.sh\":12,\"scripts/check_protected.py\":31,\"scripts/export_abis.py\":33,\"scripts/generate_code_checks.py\":22,\"scripts/mine-hook.sh\":9,\"scripts/prepare_claim_tree.py\":37,\"scripts/rehearse-sepolia.sh\":4,\"scripts/release_artifacts.py\":56,\"scripts/verify_network.py\":46,\"src/HookDeployer.sol\":37,\"src/HookFlags.sol\":45,\"src/MerkleClaimEvidence.sol\":200,\"src/UnlkHook.sol\":725,\"src/UnlkOracle.sol\":190,\"src/UnlkSwapRouter.sol\":242,\"src/UnlkToken.sol\":42,\"src/interfaces/IIntegration.sol\":88,\"src/libraries/OperationHash.sol\":15,\"src/libraries/ReviewedCode.sol\":10,\"src/libraries/SeedDepth.sol\":41,\"src/libraries/SepoliaRelease.sol\":11,\"test/ADDITIONAL_COVERAGE.md\":94,\"test/ActivationRobustness.t.sol\":303,\"test/Adversarial.t.sol\":115,\"test/BatchSettlementProperties.t.sol\":272,\"test/ClaimLifecycleInvariants.t.sol\":444,\"test/CreditsAndFees.t.sol\":180,\"test/EvidenceAndOracleProperties.t.sol\":347,\"test/FailurePaths.t.sol\":579,\"test/HookDeployer.t.sol\":98,\"test/Invariants.t.sol\":220,\"test/Launch.t.sol\":112,\"test/LocalScript.t.sol\":28,\"test/ManipulationEconomics.t.sol\":117,\"test/NativeCustodyInvariants.t.sol\":296,\"test/NativeLaunch.t.sol\":236,\"test/Oracle.t.sol\":422,\"test/QuotaInvariants.t.sol\":529,\"test/ReleaseConfig.t.sol\":32,\"test/RevisionProperties.t.sol\":593,\"test/SecurityRegression.t.sol\":337,\"test/SeedBoundary.t.sol\":94,\"test/SepoliaPins.t.sol\":180,\"test/Stage2Script.t.sol\":62,\"test/StageOneInvariants.t.sol\":281,\"test/Trading.t.sol\":171,\"test/TwoStage.t.sol\":302,\"test/fixtures/LocalFixtures.sol\":59,\"test/fixtures/SepoliaRuntime.sol\":28,\"test/fixtures/SystemFixture.sol\":372,\"test/imd/HookFlags.sol\":45,\"test/imd/LaunchFactory.sol\":375,\"test/imd/LaunchFees.sol\":73,\"test/imd/LaunchRegistry.sol\":109,\"test/imd/MerkleDistributor.sol\":181,\"test/imd/PoolFees.sol\":220,\"test/imd/README.md\":29,\"test/mocks/MockERC20.sol\":11,\"test/test_release_artifacts.py\":96},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":3728,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/UnlkSwapRouter.sol:105: Reentrancy in UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167):\n[high/medium] reentrancy-balance at src/UnlkSwapRouter.sol:105: Reentrancy in UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167):\n[medium/medium] divide-before-multiply at src/UnlkOracle.sol:122: UnlkOracle.twapTick() (src/UnlkOracle.sol#122-147) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/UnlkOracle.sol:122: UnlkOracle.twapTick() (src/UnlkOracle.sol#122-147) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/UnlkOracle.sol:90: UnlkOracle.checkpoint() (src/UnlkOracle.sol#90-115) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/UnlkOracle.sol:90: UnlkOracle.checkpoint() (src/UnlkOracle.sol#90-115) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/UnlkHook.sol:484: Reentrancy in UnlkHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/UnlkHook.sol#484-515):\n[medium/medium] uninitialized-local at src/UnlkHook.sol:417: UnlkHook._verifyLaunchRecord(uint64).hookSeen (src/UnlkHook.sol#417) is a local variable never initialized\n[medium/medium] uninitialized-local at src/UnlkHook.sol:416: UnlkHook._verifyLaunchRecord(uint64).tokenSeen (src/UnlkHook.sol#416) is a local variable never initialized\n[medium/medium] uninitialized-local at src/UnlkHook.sol:675: UnlkHook._updateMilestone().fdv (src/UnlkHook.sol#675) is a local variable never initialized\n[medium/medium] uninitialized-local at src/UnlkSwapRouter.sol:115: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256).state (src/UnlkSwapRouter.sol#115) is a local variable never initialized\n[medium/medium] unused-return at src/UnlkHook.sol:462: UnlkHook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/UnlkHook.sol#462-482) ignores return value by (None,None,protocolFee,lpFee) = poolManager.getSlot0(poolId) (src/UnlkHook.sol#476)\n[medium/medium] unused-return at src/UnlkOracle.sol:90: UnlkOracle.checkpoint() (src/UnlkOracle.sol#90-115) ignores return value by (liquidity,None,None) = poolManager.getPositionInfo(poolId,factory,rangeLowerTick,rangeUpperTick,bytes32(0)) (src/UnlkOracle.sol#93-94)\n[medium/medium] unused-return at src/UnlkHook.sol:537: UnlkHook._recordSeed(ModifyLiquidityParams) (src/UnlkHook.sol#537-555) ignores return value by (sqrtPrice,None,None,None) = poolManager.getSlot0(poolId) (src/UnlkHook.sol#542)\n[medium/medium] unused-return at src/UnlkHook.sol:371: UnlkHook._verifySeed() (src/UnlkHook.sol#371-382) ignores return value by (liquidity,None,None) = poolManager.getPositionInfo(poolId,launchFactory,seedTickLower,seedTickUpper,bytes32(0)) (src/UnlkHook.sol#372-373)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:189: UnlkSwapRouter._balance(IERC20) (src/UnlkSwapRouter.sol#189-191) has external calls inside a loop: currency.balanceOf(address(this)) (src/UnlkSwapRouter.sol#190)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:105: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167) has external calls inside a loop: ! hook.activated() || block.timestamp > request.deadline || request.amountSpecified == 0 || request.amountSpecified == type()(int256).min || request.maxInput == 0 || request.maxInput > uint256(uint128(type()(int128).max)) || request.minOutput == 0 (src/UnlkSwapRouter.sol#110-112)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:174: UnlkSwapRouter._boundedLimit(UnlkSwapRouter.SwapRequest) (src/UnlkSwapRouter.sol#174-183) has external calls inside a loop: floor_ = TickMath.getSqrtPriceAtTick(hook.seedTickLower()) (src/UnlkSwapRouter.sol#177)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:105: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167) has external calls inside a loop: state.baseInput = state.inputToken.balanceOf(address(this)) (src/UnlkSwapRouter.sol#121-123)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:105: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167) has external calls inside a loop: key = hook.poolKey() (src/UnlkSwapRouter.sol#114)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:105: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167) has external calls inside a loop: outputBefore = state.outputToken.balanceOf(msg.sender) (src/UnlkSwapRouter.sol#156)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:174: UnlkSwapRouter._boundedLimit(UnlkSwapRouter.SwapRequest) (src/UnlkSwapRouter.sol#174-183) has external calls inside a loop: ceiling = TickMath.getSqrtPriceAtTick(hook.seedTickUpper()) (src/UnlkSwapRouter.sol#180)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:105: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167) has external calls inside a loop: result = poolManager.unlock(abi.encode(key,params,operationNonce,request.maxInput)) (src/UnlkSwapRouter.sol#140)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:105: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167) has external calls inside a loop: state.inputToken.balanceOf(address(this)) != state.baseInput + request.maxInput (src/UnlkSwapRouter.sol#130)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:105: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167) has external calls inside a loop: state.outputToken.balanceOf(msg.sender) != outputBefore + output (src/UnlkSwapRouter.sol#158)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:105: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167) has external calls inside a loop: state.baseOutput = state.outputToken.balanceOf(address(this)) (src/UnlkSwapRouter.sol#124-125)\n[low/medium] reentrancy-benign at src/UnlkHook.sol:657: Reentrancy in UnlkHook.updateMilestone() (src/UnlkHook.sol#657-661):\n[low/medium] reentrancy-benign at src/UnlkSwapRouter.sol:105: Reentrancy in UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167):\n[low/medium] reentrancy-benign at src/UnlkHook.sol:484: Reentrancy in UnlkHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/UnlkHook.sol#484-515):\n[low/medium] reentrancy-events at src/UnlkHook.sol:657: Reentrancy in UnlkHook.updateMilestone() (src/UnlkHook.sol#657-661):\n[low/medium] reentrancy-events at src/UnlkHook.sol:484: Reentrancy in UnlkHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/UnlkHook.sol#484-515):\n[low/medium] reentrancy-events at src/UnlkHook.sol:283: Reentrancy in UnlkHook.configureAndActivate(address,IClaimEvidence,UnlkOracle,uint64) (src/UnlkHook.sol#283-332):\n[low/medium] timestamp at src/UnlkOracle.sol:122: UnlkOracle.twapTick() (src/UnlkOracle.sol#122-147) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkOracle.sol:90: UnlkOracle.checkpoint() (src/UnlkOracle.sol#90-115) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkSwapRouter.sol:105: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#105-167) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkOracle.sol:166: UnlkOracle._ethUsd() (src/UnlkOracle.sol#166-179) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkOracle.sol:150: UnlkOracle.fdvUsd() (src/UnlkOracle.sol#150-164) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkHook.sol:673: UnlkHook._updateMilestone() (src/UnlkHook.sol#673-715) uses timestamp for comparisons","passed":true},{"durationMs":721,"exitCode":0,"name":"aderyn","output":"[high] eth-send-unchecked-address at src/UnlkSwapRouter.sol:201: ETH transferred without address checks\n[high] reentrancy-state-change at src/MerkleClaimEvidence.sol:190: Reentrancy: State change after external call (8 places)\n[high] unprotected-initializer at src/HookDeployer.sol:19: Unprotected initializer (2 places)\n[low] costly-loop at src/MerkleClaimEvidence.sol:121: Costly operations inside loop (3 places)\n[low] internal-function-used-once at src/HookFlags.sol:35: Internal Function Used Only Once (2 places)\n[low] large-numeric-literal at src/UnlkHook.sol:69: Large Numeric Literal (16 places)\n[low] literal-instead-of-constant at src/UnlkHook.sol:469: Literal Instead of Constant (13 places)\n[low] missing-inheritance at src/UnlkOracle.sol:15: Missing Inheritance\n[low] require-revert-in-loop at src/MerkleClaimEvidence.sol:75: Loop Contains `require`/`revert` (5 places)\n[low] state-change-without-event at src/UnlkHook.sol:462: State Change Without Event (4 places)\n[low] unchecked-return at src/UnlkHook.sol:343: Unchecked Return (2 places)\n[low] uninitialized-local-variable at src/MerkleClaimEvidence.sol:121: Uninitialized Local Variable (2 places)\n[low] unused-import at src/libraries/OperationHash.sol:4: Unused Import","passed":true},{"durationMs":2785,"exitCode":0,"name":"proof d2d6b0dbd9b5","output":"Compiling 106 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.13s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n   --> src/UnlkHook.sol:209:5:\n    |\n209 |     function afterInitialize(address, PoolKey calldata key, uint160, int24)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n\nRan 1 test for test/imd-proof-583480a9/Proof_d2d6b0dbd9b5.t.sol:SepoliaPinAsymmetryTest\n[PASS] testHookRefusesUnpinnedServicesAtInitializeOnSepolia() (gas: 10503383)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.86ms (2.64ms CPU time)\n\nRan 1 test suite in 5.57ms (2.86ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3c8e9199d9f5799cc343c5aa237d1c22fe933113a039ea6f83a9ca384553b529","verifiedTreeHash":"9ac235d6bad7827f8b8c0b39dfa60b46c6cbee9c","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":26362,"exitCode":0,"name":"build","output":"Compiling 138 files with Solc 0.8.26\nSolc 0.8.26 finished in 26.20s\nCompiler run successful with warnings:\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/BatchSettlementProperties.t.sol:14:9:\n   |\n14 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/FeeCustodyProperties.t.sol:19:9:\n   |\n19 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/NativeCustodyInvariants.t.sol:15:9:\n   |\n15 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/UnlkHook.sol:209:5:\n    |\n209 |     function afterInitialize(address, PoolKey calldata key, uint160, int24)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":14795,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/HookDeployer.t.sol:HookDeployerTest\n[PASS] testChangedCreationBodyCannotMatchReviewedHash() (gas: 135903)\n[PASS] testChangedSetupAuthorityChangesHashAndCreate2Prediction() (gas: 226228)\n[PASS] testDeployedHelperFitsEvmCodeLimits() (gas: 8947)\n[PASS] testFuzzEncodesCallerSuppliedBytesAndFourAddresses(bytes,address,address,address,address) (runs: 256, μ: 21981, ~: 20352)\n[PASS] testReviewedHookInitCodeAndHash() (gas: 196628)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 13.99ms (13.39ms CPU time)\n\nRan 2 tests for test/LocalScript.t.sol:LocalScriptTest\n[PASS] testLocalScriptRefusesPublicChainId() (gas: 13983272)\n[PASS] testLocalSimulationFunctionDoesNotDependOnCaller() (gas: 63694238)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 24.80ms (24.27ms CPU time)\n\nRan 1 test for test/FailurePaths.t.sol:UnpaidLaunchTest\n[PASS] testNoRequesterMeansNoPayerCreditAnywhere() (gas: 1267642)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 60.25ms (1.31ms CPU time)\n\nRan 4 tests for test/SeedBoundary.t.sol:SeedBoundaryTest\n[PASS] testBuyLimitIsBoundedByTheSeedFloor() (gas: 390660)\n[PASS] testLimitsInsideTheRangeAreHonoured() (gas: 771508)\n[PASS] testSellIntoAnEmptyReserveRevertsWithoutState() (gas: 394827)\n[PASS] testSellThatDrainsTheReserveStopsAtTheSeedBoundary() (gas: 1586847)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 97.36ms (3.30ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:EvidenceCertificationRegressionTest\n[PASS] testActualLaterRoundClaimsHaveNoArtificialCumulativeCeiling() (gas: 1511648)\n[PASS] testDuplicateRecipientCannotOvercreditSmallerActualClaim() (gas: 441218)\n[PASS] testIncompleteTreeCannotBeCertified() (gas: 59593)\n[PASS] testOddTreeReconstructionAndPreCertificationNativeClaim() (gas: 580532)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 99.84ms (1.22ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] testCompanionsAreImmutablyBound() (gas: 37886)\n[PASS] testFactoryHoldsPrincipalAndCannotRemoveIt() (gas: 333697)\n[PASS] testLaunchAllocationAndLockedPrincipal() (gas: 191055)\n[PASS] testLaunchIsOnceAndDeployerOnly() (gas: 2731433)\n[PASS] testOnlyCanonicalManagerCanCallHook() (gas: 66479)\n[PASS] testPayerCreditExactDeduplicated() (gas: 137462)\n[PASS] testUnauthorizedFactoryAndWrongPoolRejected() (gas: 80623)\n[PASS] testUnconfiguredComponentsFailClosed() (gas: 42307)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 101.30ms (1.21ms CPU time)\n\nRan 8 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test100PercentAloneIsNotFullUnlock() (gas: 7257766)\n[PASS] testArbitraryHookDataAndMultihopPayloadCannotSelectVictim() (gas: 89207)\n[PASS] testCallbacksAllRequireCanonicalManager() (gas: 211512)\n[PASS] testForeignPoolKeyRejectedEvenWithManagerPrank() (gas: 49882)\n[PASS] testNoMintPauseBlacklistUpgradeOrCounterResetEntrypoint() (gas: 114793)\n[PASS] testProtocolFeeChangeCannotSilentlyAlterTradingEconomics() (gas: 359163)\n[PASS] testQuotaMultiplicationDoesNotOverflowAtMaxEligible() (gas: 239235)\n[PASS] testTokenMintsWholeSupplyToDeployerOnly() (gas: 32832)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 102.07ms (7.88ms CPU time)\n\nRan 1 test for test/RevisionProperties.t.sol:RestagingIsolationTest\n[PASS] testAbandonedBundleIsInertAndMixedBundlesAreRefused() (gas: 7156292)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 110.58ms (2.16ms CPU time)\n\nRan 1 test for test/SecurityRegression.t.sol:LargeTreeCertificationTest\n[PASS] testMaximumSortedTreeFitsTransactionGasLimit() (gas: 15973574)\nLogs:\n  1024-leaf sorted certification gas: 13939470\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 90.35ms (34.62ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:CodeAuthenticationRegressionTest\n[PASS] testActivationExternalFailureRollsBackEveryBinding() (gas: 912953)\n[PASS] testInconsistentImmutablePatchesAreRejected() (gas: 2018871)\n[PASS] testLaterFactoryDonationsCannotRewriteInitialAllocationReceipts() (gas: 688934)\n[PASS] testRuntimeMutationCannotPassGetterChecks() (gas: 85252)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 119.71ms (10.40ms CPU time)\n\nRan 1 test for test/EvidenceAndOracleProperties.t.sol:RouterDeadlineTest\n[PASS] testDeadlineIsInclusive() (gas: 423552)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 119.93ms (620.21µs CPU time)\n\nRan 2 tests for test/Stage2Script.t.sol:Stage2ScriptTest\n[PASS] testStage2DeploysFromActualIdentitiesAndOwnerActivates() (gas: 7071565)\n[PASS] testStage2RefusesUnknownLaunchNumber() (gas: 33767)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 120.51ms (2.63ms CPU time)\n\nRan 2 tests for test/SecurityRegression.t.sol:StagingCreationRegressionTest\n[PASS] testCounterfeitConstructorIsRefusedBeforeAnyDeployment() (gas: 6413863)\n[PASS] testOnlySetupAuthorityMayStageAndOnlyUntilActivation() (gas: 12289760)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 131.63ms (3.42ms CPU time)\n\nRan 10 tests for test/CreditsAndFees.t.sol:CreditsAndFeesTest\n[PASS] testAttestationRequiresActualClaimAndExactLeaf() (gas: 438961)\n[PASS] testClaimTransferAndPayerTransferDoNotDuplicateCredit() (gas: 577960)\n[PASS] testFeeCollectionDoesNotReducePrincipal() (gas: 647552)\n[PASS] testNativeClaimNeverDependsOnAdapterOrFeed() (gas: 1190278)\n[PASS] testNativeClaimThenAttestThenSyncThenSale() (gas: 1607696)\n[PASS] testNegativeLiquidityForbiddenEvenForFactory() (gas: 82464)\n[PASS] testProofReleaseAndDedupRemainNativeRules() (gas: 573172)\n[PASS] testSaleFeesCountGrossInputAndNeverCreditFeeRecipients() (gas: 1191477)\n[PASS] testUnauthorizedLiquidityAndDonationNoCredit() (gas: 232025)\n[PASS] testUnclaimedRewardsNotEligible() (gas: 39399)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 138.99ms (5.70ms CPU time)\n\nRan 6 tests for test/ActivationRobustness.t.sol:ActivationRobustnessTest\n[PASS] testPolicySeedRecordsCapacityAndConfirmsTiers() (gas: 30575729)\n[PASS] testSeedBelowOpeningValueFloorCannotLaunch() (gas: 9054745)\n[PASS] testSeedBelowThePoolShareBandCannotLaunch() (gas: 9050786)\n[PASS] testSeedInsideTheOnePercentBandActivates() (gas: 15887629)\n[PASS] testStagingRunsActivationPreconditionsAndCanRepeat() (gas: 21576209)\n[PASS] testSubDustSeedRoundingStillActivates() (gas: 16247257)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 161.87ms (50.88ms CPU time)\n\nRan 3 tests for test/ReleaseConfig.t.sol:ReleaseConfigTest\n[PASS] testReadOnlyReleaseChecksOnLocalFixture() (gas: 2011487)\n[PASS] testReadOnlyReleaseChecksRejectWrongChainOrHash() (gas: 1903758)\n[PASS] testStageOneAloneCannotPassReleaseGate() (gas: 63801371)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 168.65ms (62.26ms CPU time)\n\nRan 5 tests for test/EvidenceAndOracleProperties.t.sol:MultiLeafEvidenceTest\n[PASS] testDecreasingEvidenceCannotRevokePreviouslyCreditedClaims() (gas: 1100730)\n[PASS] testProofsFromTheActualTreeCreditExactlyWhatWasDelivered() (gas: 2298063)\n[PASS] testSiblingCannotAttestAnotherWalletsClaim() (gas: 771322)\n[PASS] testSweptRoundFreezesEvidence() (gas: 1136164)\n[PASS] testTheTreeIsWellFormed() (gas: 40973)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 78.33ms (3.06ms CPU time)\n\nRan 2 tests for test/TwoStage.t.sol:StageOneConstructorTest\n[PASS] testConstructorRejectsMissingOrConflatedInputs() (gas: 8207)\n[PASS] testOnlyFactoryCanInitializeTheHooksPool() (gas: 43150)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 68.86ms (290.46µs CPU time)\n\nRan 3 tests for test/FailurePaths.t.sol:ActivationFailurePathsTest\n[PASS] testCompanionConstructorsRejectMissingInputs() (gas: 6057)\n[PASS] testCrossLaunchSetupIsRefusedInEveryDirection() (gas: 24766771)\n[PASS] testSepoliaRefusesLocallyClonedServicesEvenWithFeedAtPublishedAddress() (gas: 676766)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 112.77ms (24.49ms CPU time)\n\nRan 3 tests for test/SecurityRegression.t.sol:OracleOutageRegressionTest\n[PASS] testDepthDipInvalidatesWholeWindowAndRetainsReachedRights() (gas: 16317055)\n[PASS] testFinalTierRequiresItsOwnTwentyFourHours() (gas: 138827744)\n[PASS] testNextTierClockWaitsForItsOwnThreshold() (gas: 15295035)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 130.47ms (107.57ms CPU time)\n\nRan 4 tests for test/ActivationRobustness.t.sol:ChunkedCertificationTest\n[PASS] testChunkBoundsAndSizeAreFixedByTheFirstChunk() (gas: 29517535)\n[PASS] testDuplicateAcrossChunksWrongRootAndForeignSessionsAreRefused() (gas: 231631551)\n[PASS] testSingleLeafRoundCertifiesThroughTheChunkedPath() (gas: 398202)\n[PASS] testSingleShotRefusesButChunksCertifyAndCredit() (gas: 124071664)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 272.56ms (162.01ms CPU time)\n\nRan 11 tests for test/NativeLaunch.t.sol:NativeWithdrawalTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136095725)\n[PASS] testNativeBatchSettlement() (gas: 870289)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1127528)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 453473)\n[PASS] testNativeSettlementResetsPriorSyncCurrency() (gas: 605836)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91930)\n[PASS] testNativeWithdrawalUsesCEIAndCannotDoubleWithdraw() (gas: 996338)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62586)\n[PASS] testOtherWalletCannotWithdrawNativeRefund() (gas: 461374)\n[PASS] testRejectingNativeWalletCanTradeAndRetryWithdrawal() (gas: 1074660)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29940461)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 236.87ms (237.07ms CPU time)\n\nRan 7 tests for test/NativeLaunch.t.sol:NativeLaunchTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136095724)\n[PASS] testNativeBatchSettlement() (gas: 870289)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1127517)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 453384)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91952)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62608)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29940461)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 305.99ms (194.96ms CPU time)\n\nRan 17 tests for test/Oracle.t.sol:OracleTest\n[PASS] testBadChainlinkRoundsAndAnswersFailClosed() (gas: 2352246)\n[PASS] testConfirmationGapRestartsRatherThanCountingUnobservedTime() (gas: 14857451)\n[PASS] testEveryTierAndPermanentUnlock() (gas: 136512808)\n[PASS] testFallingPricesNeverLowerReachedTier() (gas: 29259665)\n[PASS] testInvalidDataCannotCountTowardPendingConfirmationOrRevokeRights() (gas: 15083422)\n[PASS] testInvalidDataLongerThanGapRestartsOnNextValidCall() (gas: 694951)\n[PASS] testLongInvalidIntervalRestartsWhetherObservedOrNot() (gas: 807692)\n[PASS] testNegativeTickAveragesRoundConservativelyForBothOrders() (gas: 769389)\n[PASS] testObservedAndUnobservedInvalidIntervalsAgree() (gas: 29667292)\n[PASS] testOneBlockSpikeCannotConfirm() (gas: 740812)\n[PASS] testOracleCannotBeReboundOrConfiguredByAnyone() (gas: 73530)\n[PASS] testRealFeedCadenceCannotBeUsedToResetConfirmation() (gas: 18790257)\n[PASS] testSameTimestampManipulationHasNoTimeWeight() (gas: 760132)\n[PASS] testStaleCheckpointAndFeedPreventNewTierButNotTrades() (gas: 1332186)\n[PASS] testSustainedManipulationRequiresWindowAndConfirmation() (gas: 15128037)\n[PASS] testThresholdMappingBoundaries() (gas: 69776)\n[PASS] testWarmupAndExactWindow() (gas: 400906)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 336.78ms (323.30ms CPU time)\n\nRan 9 tests for test/Trading.t.sol:TradingTest\n[PASS] testAnotherWalletCannotConsumeVictimsAllowanceOrQuota() (gas: 472208)\n[PASS] testDirectManagerAndForeignRouterSpoofingRejected() (gas: 644028)\n[PASS] testDonatedRouterBalancesCannotCreateCreditOrBeSwept() (gas: 497543)\n[PASS] testExactOutputSaleAccountsActualInput() (gas: 735195)\n[PASS] testExcessSaleRollsBackPoolBalancesOracleAndNonce() (gas: 800579)\n[PASS] testFuzzQuotaBoundary(uint96) (runs: 256, μ: 1037856, ~: 1037777)\n[PASS] testReplayOldCallbackHasNoLiveContext() (gas: 427364)\n[PASS] testSaleBoundaryExecutedInputIncludesPoolFee() (gas: 1067073)\n[PASS] testTransfersDoNotMoveRightsOrAllowChainCredit() (gas: 830532)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 352.19ms (246.37ms CPU time)\n\nRan 3 tests for test/ManipulationEconomics.t.sol:ManipulationEconomicsTest\n[PASS] testCounterSellingOfAllInitialNonPoolTokens() (gas: 157505516)\nLogs:\n  gross ETH capital (wei): 404492004375936755769\n  attacker ETH exit (wei): 139667041180374722901\n  net ETH exit cost before fee recapture (wei): 264824963195562032868\n  payer ETH fee receipts (wei): 4044920043759367559\n  counter-seller ETH proceeds (wei): 259768813140862823404\n  duration seconds: 201600\n\n[PASS] testPayerCanRecaptureItsNativeFeeShare() (gas: 144656869)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n  net ETH cost after native fee recapture (wei): 653249186877100125\n\n[PASS] testSustainedManipulationUnlockAndExit() (gas: 144670589)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 481.67ms (596.86ms CPU time)\n\nRan 4 tests for test/TokenLedgerProperties.t.sol:TokenReceiptPropertiesTest\n[PASS] testFuzz_ReceiptsSurviveRoundingDelegationAndReturnedInventory(uint96) (runs: 1000, μ: 611436, ~: 611245)\n[PASS] test_FailedFinalTransferRollsBackAllowanceAndDistribution() (gas: 395800)\n[PASS] test_MetadataAndUnsealedIssuance() (gas: 72386)\n[PASS] test_ZeroAndSelfTransfersCannotSealOrCreateAllocationReceipts() (gas: 521375)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 328.55ms (328.19ms CPU time)\n\nRan 8 tests for test/SepoliaPins.t.sol:SepoliaPinsTest\n[PASS] testEmbeddedRuntimeMatchesThePins() (gas: 22518)\n[PASS] testLocalChainDoesNotConsultThePins() (gas: 10226069)\n[PASS] testSepoliaAcceptsThePinnedServicesAtInitialize() (gas: 10488386)\n[PASS] testSepoliaRefusesAnUnpinnedFactory() (gas: 6489939)\n[PASS] testSepoliaRefusesAnUnpinnedManager() (gas: 159347398)\n[PASS] testSepoliaRefusesLookalikeFeesBehindThePinnedFactory() (gas: 10451800)\n[PASS] testSepoliaRefusesLookalikeRegistryBehindThePinnedFactory() (gas: 10438631)\n[PASS] testSepoliaRefusesUnpinnedServicesAtInitialize() (gas: 10157187)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 580.07ms (267.51ms CPU time)\n\nRan 1 test for test/StageOneInvariants.t.sol:StageOneInvariantTest\n[PASS]\nStageOneInvariantTest invariants:\n[PASS] invariant_onlyTheAuthorizedCallActivates\n[PASS] invariant_tokenAndClaimsIndependentOfTheHook\n[PASS] invariant_unconfiguredPoolIsInert\n StageOneInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| StageOneHandler | advance          | 452   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | attemptActivate  | 492   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | claimAndAttest   | 481   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | directSwap       | 458   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | foreignLiquidity | 513   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | routerSwap       | 471   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | syncAndMilestone | 461   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | transfer         | 512   | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.50s (1.36s CPU time)\n\nRan 13 tests for test/TwoStage.t.sol:StageOneTest\n[PASS] testActivationSealsAndCannotBeReplayed() (gas: 6134570)\n[PASS] testCrossLaunchNumberRejected() (gas: 5594038)\n[PASS] testFactoryLiquidityAllowedBeforeActivationButPrincipalStaysLocked() (gas: 37293)\n[PASS] testFirstTierConfirmsBelowTenEthActualReserves() (gas: 35619197)\n[PASS] testLaunchSucceedsWithoutCompanions() (gas: 122562)\n[PASS] testPayerCanTransferBeforeActivationWithoutLosingHistoricalCredit() (gas: 6125881)\n[PASS] testPayerCreditOnlyAfterActivationAndFromOriginalTransferReceipt() (gas: 6075022)\n[PASS] testRequesterReassignmentCannotMoveInitialAllocationCredit() (gas: 6081688)\n[PASS] testSepoliaRequiresPublishedChainlinkFeed() (gas: 5610561)\n[PASS] testSwapsSyncAndMilestonesRevertBeforeActivation() (gas: 6082593)\n[PASS] testTransfersAndNativeClaimsWorkBeforeActivationAndClaimIsCreditedLater() (gas: 6432841)\n[PASS] testUnauthorizedActivationRejected() (gas: 5606198)\n[PASS] testWrongContractsRejected() (gas: 6294420)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.40s (64.66ms CPU time)\n\nRan 3 tests for test/EvidenceAndOracleProperties.t.sol:OracleReferenceTest\n[PASS] testCheckpointReplacementRewritesOnlyTheCurrentSecond() (gas: 997263)\n[PASS] testFuzzFdvIsMonotonicInTheEthUsdAnswer(uint64,uint64) (runs: 256, μ: 751745, ~: 752051)\n[PASS] testFuzzTwapMatchesBruteForceReference(uint256) (runs: 160, μ: 2892738, ~: 2882727)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.97s (1.94s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:ChunkedCertificationPropertiesTest\n[PASS] testFuzz_abandonedSessionIsInertAndRestartable(uint8,uint256) (runs: 128, μ: 2553958, ~: 2350096)\n[PASS] testFuzz_anyChunkingAndReductionScheduleMatchesSingleShot(uint8,uint256,uint256,uint256,uint8,uint8) (runs: 128, μ: 3918598, ~: 3619720)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.08s (317.77ms CPU time)\n\nRan 17 tests for test/FailurePaths.t.sol:RouterAndHookFailurePathsTest\n[PASS] testBatchBoundsAndValueMustMatch() (gas: 186758)\n[PASS] testBatchIsAtomicWhenALaterStepFails() (gas: 834234)\n[PASS] testConfirmationRequiresSixHoursAndCannotSkipTiers() (gas: 15341697)\n[PASS] testFullUnlockKeepsFeesAndRouterAuthentication() (gas: 137007309)\n[PASS] testFuzzOperationHashBindsTraderNonceAndChain(address,uint256,uint64) (runs: 256, μ: 17656, ~: 17656)\n[PASS] testFuzzRemainingQuotaFormula(uint128,uint128,uint8) (runs: 512, μ: 7293361, ~: 7293203)\n[PASS] testFuzzTierIsMonotonicInFdv(uint256,uint256) (runs: 512, μ: 16959, ~: 16923)\n[PASS] testFuzzTransfersMoveExactlyTheAmount(address,uint96) (runs: 256, μ: 122101, ~: 122469)\n[PASS] testHookRejectsMalformedRouteDataAndUnknownSenders() (gas: 238753)\n[PASS] testPartialFillAtPriceLimitChargesOnlyExecutedInput() (gas: 1213883)\n[PASS] testQuotaWidensWithTierAndNeverDoubleCounts() (gas: 16795708)\n[PASS] testRequesterChangeAfterActivationDoesNotMoveThePayer() (gas: 146383)\n[PASS] testRouterCallbackNeedsALiveSwap() (gas: 73817)\n[PASS] testRouterRefusesDegenerateRequests() (gas: 500273)\n[PASS] testSecondRoundClaimsAccumulateOncePerRound() (gas: 995639)\n[PASS] testSlippageRefusalsLeaveNoTrace() (gas: 899401)\n[PASS] testSyncForStrangerAndZeroAddressCreatesNothing() (gas: 108400)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 2.11s (2.10s CPU time)\n\nRan 5 tests for test/SeedRangeLimitProperties.t.sol:SeedRangeLimitPropertiesTest\n[PASS] testBuyLimitBelowTheFloorIsClampedAndLimitAboveThePriceIsRefused() (gas: 1123455)\n[PASS] testExactOutputSellBeyondTheReserveRevertsSlippageWithoutState() (gas: 1324053)\n[PASS] testFuzzDrainAndRebuyKeepsTheOracleReadable(uint96,uint96,uint8) (runs: 256, μ: 1689586, ~: 1680504)\n[PASS] testFuzzSellLimitIsClampedExactlyToTheSeedCeiling(uint96,uint160,uint8) (runs: 512, μ: 1127378, ~: 1203441)\n[PASS] testLaunchStateSellRevertsAsPriceLimitAlreadyExceeded() (gas: 1161675)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.60s (4.38s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:SeedGatePropertiesTest\n[PASS] testFuzz_launchedSeedIsAlwaysLiquidAndRefusedSeedIsAlwaysBelowFloor(uint8) (runs: 96, μ: 10799665, ~: 9050245)\n[PASS] testFuzz_poolShareBandDecidesLaunchAndActivation(uint16) (runs: 96, μ: 10830438, ~: 9047728)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.60s (379.68ms CPU time)\n\nRan 5 tests for test/BatchSettlementProperties.t.sol:BatchSettlementPropertiesTest\n[PASS] testFuzz_BatchEqualsSequentialExecution(uint256,uint8,bool) (runs: 1000, μ: 4489668, ~: 3847853)\n[PASS] testFuzz_FailureAtAnyBatchIndexRestoresAllowancesFeesAndCredits(uint256,uint8) (runs: 1000, μ: 11407509, ~: 11108739)\n[PASS] test_MaximumMixedBatchOnFreshTokenOnlyManager() (gas: 9253895)\n[PASS] test_OneWeiShortAllowanceRestoresEntireBatchAndRetryWorks() (gas: 1872568)\n[PASS] test_PartialSaleMayPrefundMoreThanQuotaButChargesOnlyExecution() (gas: 906671)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.60s (4.82s CPU time)\n\nRan 1 test for test/Invariants.t.sol:SystemInvariantTest\n[PASS]\nSystemInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n SystemInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 848   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 887   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 863   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 869   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 817   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 836   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.53s (2.45s CPU time)\n\nRan 1 test for test/Invariants.t.sol:FullyUnlockedInvariantTest\n[PASS]\nFullyUnlockedInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n[PASS] invariantUnlockRemainsPermanentDespiteInvalidFeed\n FullyUnlockedInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 848   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 887   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 863   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 869   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 817   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 836   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.07s (2.78s CPU time)\n\nRan 2 tests for test/SeedRangeLimitProperties.t.sol:SeedRangeInvariantTest\n[PASS]\nSeedRangeInvariantTest invariants:\n[PASS] invariant_EveryObservationIsLiquid\n[PASS] invariant_PriceNeverLeavesTheSeedRange\n[PASS] invariant_PrincipalLockedAndManagerAssetsEqualExecutedFlows\n[PASS] invariant_SoldMatchesExecutedSalesAndQuota\n SeedRangeInvariantTest invariants (runs: 128, calls: 6144, reverts: 0)\n\n╭-----------------------+--------------+-------+---------+----------╮\n| Contract              | Selector     | Calls | Reverts | Discards |\n+===================================================================+\n| SeedRangeTradeHandler | advance      | 1001  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| SeedRangeTradeHandler | buyExactIn   | 991   | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| SeedRangeTradeHandler | sellExactIn  | 1099  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| SeedRangeTradeHandler | sellExactOut | 991   | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| SeedRangeTradeHandler | syncPayer    | 1040  | 0       | 0        |\n|-----------------------+--------------+-------+---------+----------|\n| SeedRangeTradeHandler | withdraw     | 1022  | 0       | 0        |\n╰-----------------------+--------------+-------+---------+----------╯\n\n[PASS] testHandlerBranchesAreReachable() (gas: 3844289)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.18s (3.07s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:MilestoneSampleInvariantTest\n[PASS]\nMilestoneSampleInvariantTest invariants:\n[PASS] invariant_confirmationNeedsAnUnbrokenChainOfValidSamples\n[PASS] invariant_invalidSamplesNeverAdvanceTiers\n[PASS] invariant_nothingEverRelocksAndStateIsConsistent\n MilestoneSampleInvariantTest invariants (runs: 48, calls: 1920, reverts: 0)\n\n╭------------------------+----------+-------+---------+----------╮\n| Contract               | Selector | Calls | Reverts | Discards |\n+================================================================+\n| MilestoneSampleHandler | advance  | 316   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | corrupt  | 328   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | heal     | 307   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | march    | 328   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | sample   | 310   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | setPrice | 331   | 0       | 0        |\n╰------------------------+----------+-------+---------+----------╯\n\n[PASS] testHandlerReachesTiersAndEveryCorruptionIsInvalid() (gas: 12640787)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.38s (3.32s CPU time)\n\nRan 2 tests for test/QuotaInvariants.t.sol:QuotaInvariantTest\n[PASS]\nQuotaInvariantTest invariants:\n[PASS] invariant_configurationSealedAndRouteEnforced\n[PASS] invariant_ledgerMatchesExecutedDeltas\n[PASS] invariant_milestonesMonotonicAndConsistent\n[PASS] invariant_principalLockedAndFeeTermsFixed\n[PASS] invariant_routerNativeSolvency\n[PASS] invariant_salesNeverExceedQuota\n[PASS] invariant_supplyConservedAndNoCustody\n QuotaInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭--------------+-----------------+-------+---------+----------╮\n| Contract     | Selector        | Calls | Reverts | Discards |\n+=============================================================+\n| QuotaHandler | advance         | 378   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactIn      | 355   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactOut     | 366   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimAndAttest  | 340   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimFees       | 372   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | directSwap      | 400   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | donate          | 340   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | foreignActivate | 353   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellExactOut    | 364   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellOverQuota   | 374   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellWithinQuota | 701   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | setFeed         | 327   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sync            | 371   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | transfer        | 346   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | withdrawNative  | 373   | 0       | 0        |\n╰--------------+-----------------+-------+---------+----------╯\n\n[PASS] testHandlerActionsActuallyExecute() (gas: 23822211)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.18s (5.11s CPU time)\n\nRan 2 tests for test/TokenLedgerProperties.t.sol:TokenLedgerInvariantTest\n[PASS]\nTokenLedgerInvariantTest invariants:\n[PASS] invariant_BalancesAndAllowancesMatchIndependentLedger\n[PASS] invariant_OriginalReceiptsRemainSealedDespiteArbitraryTransfers\n TokenLedgerInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+-------------------+-------+---------+----------╮\n| Contract           | Selector          | Calls | Reverts | Discards |\n+=====================================================================+\n| TokenLedgerHandler | approve           | 2818  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| TokenLedgerHandler | refuseOverspend   | 2755  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| TokenLedgerHandler | refuseZeroAddress | 2704  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| TokenLedgerHandler | transfer          | 2772  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| TokenLedgerHandler | transferAll       | 2655  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| TokenLedgerHandler | transferFrom      | 2680  | 0       | 0        |\n╰--------------------+-------------------+-------+---------+----------╯\n\n[PASS] test_HandlerCoversFiniteInfiniteSelfRevokedAndFailedAllowancePaths() (gas: 2246042)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.71s (6.71s CPU time)\n\nRan 5 tests for test/FeeCustodyProperties.t.sol:FeeCustodyInvariantTest\n[PASS]\nFeeCustodyInvariantTest invariants:\n[PASS] invariant_FactoryAssetsBackEveryUnpaidFeeAndDonationsRemainSurplus\n[PASS] invariant_FeeCollectionCannotTouchPrincipalOrCreateQuota\n[PASS] invariant_RecipientsAndSettlementStayBoundToTheirActualOwners\n FeeCustodyInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------------+-------------------------+-------+---------+----------╮\n| Contract          | Selector                | Calls | Reverts | Discards |\n+==========================================================================+\n| FeeCustodyHandler | collect                 | 1824  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | donate                  | 1851  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | refuseInvalidOperations | 1812  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | rotateNetwork           | 1832  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | setRecipientMode        | 1820  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | tradePair               | 1875  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | transferRequester       | 1816  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | withdrawAccount         | 1785  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | withdrawNetwork         | 1769  | 0       | 0        |\n╰-------------------+-------------------------+-------+---------+----------╯\n\n[PASS] test_DeferredPayerDebtStaysWithOldWalletWhileNetworkDebtFollowsRecipient() (gas: 6376558)\n[PASS] test_ReentrantFeeCollectionHasNoSecondPrincipalOrFeeWithdrawal() (gas: 4131841)\n[PASS] test_ReentrantFeeWithdrawalsCannotPayEitherShareTwice() (gas: 4037988)\n[PASS] test_RejectingNetworkRecipientCannotHoldPayerFeesHostage() (gas: 3956563)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 10.14s (10.07s CPU time)\n\nRan 2 tests for test/ClaimLifecycleInvariants.t.sol:ClaimLifecycleInvariantsTest\n[PASS]\nClaimLifecycleInvariantsTest invariants:\n[PASS] invariant_DistributorReservesAndCashMatchIndependentRoundModel\n[PASS] invariant_FixedSupplyAndInitialReceiptsSurviveAllClaimSequences\n[PASS] invariant_OnlyDeliveredAttestedAndSyncedClaimsCreateRights\n ClaimLifecycleInvariantsTest invariants (runs: 256, calls: 20480, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| ClaimLifecycleHandler | advance           | 1896  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | attest            | 1820  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | certify           | 1919  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | claim             | 1806  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | deliverAndSync    | 1802  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | openRound         | 1867  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sweep             | 1916  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sync              | 1866  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | syncPayer         | 1844  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | transferOrDonate  | 1893  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | unauthorizedRound | 1851  | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\n[PASS] test_ModelExercisesDelayedCertificationSweepsAndRecycledFunding() (gas: 4966220)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 13.55s (13.44s CPU time)\n\nRan 2 tests for test/NativeCustodyInvariants.t.sol:NativeCustodyInvariantsTest\n[PASS]\nNativeCustodyInvariantsTest invariants:\n[PASS] invariant_ManagerHasNoUnsettledDeltaOrReusableRouteContext\n[PASS] invariant_NativeLiabilitiesRemainFullyBackedAndBelongToTheirWallet\n[PASS] invariant_TransfersDonationsAndFailedBatchesCannotCreateOrMoveRights\n NativeCustodyInvariantsTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| NativeCustodyHandler | donateTokens | 2666  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | failBatch    | 2732  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | forceEther   | 2642  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | tradeBatch   | 2753  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | transfer     | 2817  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | withdraw     | 2774  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\n[PASS] test_HandlerTradesRejectsReentersAndDrainsWithoutTakingDonations() (gas: 5323166)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 14.57s (14.48s CPU time)\n\nRan 45 test suites in 14.58s (84.11s CPU time): 205 tests passed, 0 failed, 0 skipped (205 total tests)\n","passed":true},{"durationMs":233,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MerkleClaimEvidence.abandonSession(uint256)\",\"MerkleClaimEvidence.attest(uint256,address,uint256,bytes32[])\",\"MerkleClaimEvidence.certifyRound(uint256,address[],uint256[])\",\"MerkleClaimEvidence.reduce(uint256,uint256)\",\"MerkleClaimEvidence.submitLeaves(uint256,uint256,address[],uint256[])\",\"UnlkHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"UnlkHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"UnlkHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"UnlkHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"UnlkHook.configureAndActivate(address,address,address,uint64)\",\"UnlkHook.deployCompanions(uint64,address,bytes,bytes,bytes)\",\"UnlkHook.syncPayer()\",\"UnlkHook.syncRewards(address)\",\"UnlkHook.updateMilestone()\",\"UnlkOracle.bind((address,address,uint24,int24,address),address,int24,int24)\",\"UnlkOracle.checkpoint()\",\"UnlkSwapRouter.receive()\",\"UnlkSwapRouter.swap((bool,int256,uint160,uint256,uint256,uint256))\",\"UnlkSwapRouter.swapBatch((bool,int256,uint160,uint256,uint256,uint256)[])\",\"UnlkSwapRouter.unlockCallback(bytes)\",\"UnlkSwapRouter.withdrawNative()\",\"UnlkToken.approve(address,uint256)\",\"UnlkToken.transfer(address,uint256)\",\"UnlkToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DELIVERY.md\":103,\"LICENSE\":25,\"README.md\":167,\"RELEASE_STATUS.json\":53,\"delivery/OPERATIONS.md\":112,\"delivery/PACKAGE_SHA256SUMS\":566,\"delivery/STATUS.json\":213,\"delivery/checks/abi-export.txt\":1,\"delivery/checks/artifact-export.txt\":1,\"delivery/checks/build.txt\":21,\"delivery/checks/current-block-fork.txt\":24,\"delivery/checks/extended-fork.txt\":27,\"delivery/checks/final-fmt.txt\":0,\"delivery/checks/final-integrity.txt\":8,\"delivery/checks/fmt.txt\":0,\"delivery/checks/historical-block-fork.txt\":25,\"delivery/checks/imd-launch.txt\":1,\"delivery/checks/integrity.txt\":12,\"delivery/checks/lint.txt\":372,\"delivery/checks/live-rpc.txt\":1,\"delivery/checks/minimal-environment.txt\":505,\"delivery/checks/protected.txt\":22,\"delivery/checks/release-gates.txt\":10,\"delivery/checks/reviewed-code.txt\":1,\"delivery/checks/revision-fmt.txt\":1,\"delivery/checks/revision-fork.txt\":17,\"delivery/checks/revision-protected.txt\":22,\"delivery/checks/revision-test.txt\":980,\"delivery/checks/rpc-tools.txt\":1,\"delivery/checks/saved-network.txt\":7,\"delivery/checks/signing-tools.txt\":5,\"delivery/checks/source-hashes.txt\":458,\"delivery/checks/test.txt\":485,\"delivery/checks/upstream-rehearsal-build.txt\":8,\"delivery/network/block.json\":1,\"delivery/network/capabilities.json\":345,\"delivery/network/current-job.json\":217,\"delivery/network/factory.runtime.hex\":1,\"delivery/network/feed-check.json\":21,\"delivery/network/feed.runtime.hex\":1,\"delivery/network/fees.runtime.hex\":1,\"delivery/network/fix-job.json\":104,\"delivery/network/http-results.json\":117,\"delivery/network/import-check-paths-request.json\":33,\"delivery/network/import-check-paths-response.json\":25,\"delivery/network/import-check-request.json\":15,\"delivery/network/import-check-response.json\":25,\"delivery/network/import-request.json\":5,\"delivery/network/import-response.json\":17,\"delivery/network/manager.runtime.hex\":1,\"delivery/network/openapi.json\":1383,\"delivery/network/platform-rebuild.json\":30,\"delivery/network/policies.json\":1430,\"delivery/network/preflight.json\":347,\"delivery/network/registry.runtime.hex\":1,\"delivery/network/rpc-access.json\":20,\"delivery/network/selected-policy.json\":34,\"delivery/network/services.json\":29,\"delivery/protected-inputs.json\":4,\"delivery/provenance.json\":25,\"delivery/rehearsal/RecordedSepolia.t.sol\":200,\"delivery/source-files.json\":2492,\"delivery/verify.py\":163,\"dependencies.lock.json\":24,\"docs/ARTIFACTS.json\":64,\"docs/BUILD_RESULTS.txt\":21,\"docs/BYTECODE_COMPARISON_RESULTS.txt\":8,\"docs/DEPLOYMENT.md\":163,\"docs/ECONOMICS_RESULTS.txt\":49,\"docs/FMT_RESULTS.txt\":0,\"docs/FORK_RESULTS.txt\":24,\"docs/IMD_LAUNCH_CHECK_RESULTS.txt\":1,\"docs/LINT_RESULTS.txt\":372,\"docs/MINIMAL_ENV_TEST_RESULTS.txt\":543,\"docs/NETWORK_VERIFICATION_RESULTS.txt\":7,\"docs/PROTECTED_TEST_RESULTS.txt\":22,\"docs/RECOVERY.md\":65,\"docs/RELEASE_ARTIFACT_TEST_RESULTS.txt\":10,\"docs/REVISION_2026-10-13.md\":120,\"docs/SECURITY_REVIEW.md\":132,\"docs/SIZE_FIX.md\":150,\"docs/SOURCE_SHA256SUMS\":461,\"docs/SOURCE_VERIFICATION_RESULTS.txt\":458,\"docs/TEST_RESULTS.txt\":485,\"docs/VALIDATION.md\":135,\"docs/abi/CheckReleaseConfig.json\":46,\"docs/abi/HookDeployer.json\":94,\"docs/abi/IChainlinkEthUsd.json\":48,\"docs/abi/IClaimEvidence.json\":47,\"docs/abi/IHooks.json\":789,\"docs/abi/ILaunchFactoryView.json\":115,\"docs/abi/ILaunchRegistryView.json\":70,\"docs/abi/IMerkleDistributor.json\":125,\"docs/abi/IPoolManager.json\":1286,\"docs/abi/IRouteContext.json\":20,\"docs/abi/LaunchFactory.json\":896,\"docs/abi/LaunchFees.json\":323,\"docs/abi/LaunchRegistry.json\":320,\"docs/abi/MerkleClaimEvidence.json\":461,\"docs/abi/MerkleDistributor.json\":451,\"docs/abi/Stage2.json\":225,\"docs/abi/UnlkHook.json\":1973,\"docs/abi/UnlkOracle.json\":443,\"docs/abi/UnlkSwapRouter.json\":359,\"docs/abi/UnlkToken.json\":425,\"docs/network/capabilities.json\":345,\"docs/network/factory-artifacts.json\":2201,\"docs/network/factory-reference.json\":420,\"docs/network/factory.runtime.hex\":1,\"docs/network/feed-reference.json\":67,\"docs/network/feed-rounds.json\":134,\"docs/network/feed.runtime.hex\":1,\"docs/network/fees.runtime.hex\":1,\"docs/network/job-identity.json\":14,\"docs/network/manager.runtime.hex\":1,\"docs/network/policies.json\":36,\"docs/network/registry-reference.json\":108,\"docs/network/registry.runtime.hex\":1,\"docs/network/sepolia.json\":309,\"docs/network/services.json\":29,\"docs/network/size-fix-status.json\":126,\"foundry.toml\":31,\"launch.json\":35,\"rehearsal/Sepolia.t.sol\":112,\"remappings.txt\":4,\"script/CheckReleaseConfig.s.sol\":85,\"script/LocalDemo.s.sol\":41,\"script/Stage2.s.sol\":98,\"scripts/check.sh\":12,\"scripts/check_protected.py\":31,\"scripts/export_abis.py\":33,\"scripts/generate_code_checks.py\":22,\"scripts/mine-hook.sh\":9,\"scripts/prepare_claim_tree.py\":37,\"scripts/rehearse-sepolia.sh\":4,\"scripts/release_artifacts.py\":56,\"scripts/verify_network.py\":46,\"src/HookDeployer.sol\":37,\"src/HookFlags.sol\":45,\"src/MerkleClaimEvidence.sol\":200,\"src/UnlkHook.sol\":725,\"src/UnlkOracle.sol\":190,\"src/UnlkSwapRouter.sol\":242,\"src/UnlkToken.sol\":42,\"src/interfaces/IIntegration.sol\":88,\"src/libraries/OperationHash.sol\":15,\"src/libraries/ReviewedCode.sol\":10,\"src/libraries/SeedDepth.sol\":41,\"src/libraries/SepoliaRelease.sol\":11,\"test/ADDITIONAL_COVERAGE.md\":94,\"test/ActivationRobustness.t.sol\":303,\"test/Adversarial.t.sol\":115,\"test/BatchSettlementProperties.t.sol\":272,\"test/ClaimLifecycleInvariants.t.sol\":444,\"test/CreditsAndFees.t.sol\":180,\"test/EvidenceAndOracleProperties.t.sol\":347,\"test/FailurePaths.t.sol\":579,\"test/FeeCustodyProperties.t.sol\":454,\"test/HookDeployer.t.sol\":98,\"test/Invariants.t.sol\":220,\"test/Launch.t.sol\":112,\"test/LocalScript.t.sol\":28,\"test/ManipulationEconomics.t.sol\":117,\"test/NativeCustodyInvariants.t.sol\":296,\"test/NativeLaunch.t.sol\":236,\"test/Oracle.t.sol\":422,\"test/QuotaInvariants.t.sol\":529,\"test/ReleaseConfig.t.sol\":32,\"test/RevisionProperties.t.sol\":593,\"test/SecurityRegression.t.sol\":337,\"test/SeedBoundary.t.sol\":94,\"test/SeedRangeLimitProperties.t.sol\":599,\"test/SepoliaPins.t.sol\":180,\"test/Stage2Script.t.sol\":62,\"test/StageOneInvariants.t.sol\":281,\"test/TESTING_ADDITIONS.md\":136,\"test/TokenLedgerProperties.t.sol\":310,\"test/Trading.t.sol\":171,\"test/TwoStage.t.sol\":302,\"test/fixtures/LocalFixtures.sol\":59,\"test/fixtures/SepoliaRuntime.sol\":28,\"test/fixtures/SystemFixture.sol\":372,\"test/imd/HookFlags.sol\":45,\"test/imd/LaunchFactory.sol\":375,\"test/imd/LaunchFees.sol\":73,\"test/imd/LaunchRegistry.sol\":109,\"test/imd/MerkleDistributor.sol\":181,\"test/imd/PoolFees.sol\":220,\"test/imd/README.md\":29,\"test/mocks/MockERC20.sol\":11,\"test/results/build.txt\":8,\"test/results/foundry-tests.txt\":450,\"test/results/protected-checks.txt\":22,\"test/results/release-checks.txt\":18,\"test/test_release_artifacts.py\":96},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4101d2652118c454e841261357526313d5d18527722ca3bfcba08bb72b36af02","verifiedTreeHash":"6d9611288b21a1a824ca889d88dbd5615c5ee042","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":17559,"exitCode":0,"name":"build","output":"Compiling 132 files with Solc 0.8.26\nSolc 0.8.26 finished in 17.43s\nCompiler run successful with warnings:\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/BatchSettlementProperties.t.sol:14:9:\n   |\n14 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/NativeCustodyInvariants.t.sol:15:9:\n   |\n15 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/UnlkHook.sol:205:5:\n    |\n205 |     function afterInitialize(address, PoolKey calldata key, uint160, int24)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":10514,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/HookDeployer.t.sol:HookDeployerTest\n[PASS] testChangedCreationBodyCannotMatchReviewedHash() (gas: 135884)\n[PASS] testChangedSetupAuthorityChangesHashAndCreate2Prediction() (gas: 226190)\n[PASS] testDeployedHelperFitsEvmCodeLimits() (gas: 8947)\n[PASS] testFuzzEncodesCallerSuppliedBytesAndFourAddresses(bytes,address,address,address,address) (runs: 256, μ: 20407, ~: 20352)\n[PASS] testReviewedHookInitCodeAndHash() (gas: 196590)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.78ms (7.10ms CPU time)\n\nRan 1 test for test/FailurePaths.t.sol:UnpaidLaunchTest\n[PASS] testNoRequesterMeansNoPayerCreditAnywhere() (gas: 1264616)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 22.38ms (782.25µs CPU time)\n\nRan 2 tests for test/TwoStage.t.sol:StageOneConstructorTest\n[PASS] testConstructorRejectsMissingOrConflatedInputs() (gas: 8207)\n[PASS] testOnlyFactoryCanInitializeTheHooksPool() (gas: 43150)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 14.93ms (183.76µs CPU time)\n\nRan 2 tests for test/LocalScript.t.sol:LocalScriptTest\n[PASS] testLocalScriptRefusesPublicChainId() (gas: 13983272)\n[PASS] testLocalSimulationFunctionDoesNotDependOnCaller() (gas: 68079045)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 25.48ms (24.29ms CPU time)\n\nRan 1 test for test/EvidenceAndOracleProperties.t.sol:RouterDeadlineTest\n[PASS] testDeadlineIsInclusive() (gas: 422030)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 25.94ms (353.68µs CPU time)\n\nRan 1 test for test/RevisionProperties.t.sol:RestagingIsolationTest\n[PASS] testAbandonedBundleIsInertAndMixedBundlesAreRefused() (gas: 6919999)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 31.19ms (1.37ms CPU time)\n\nRan 10 tests for test/CreditsAndFees.t.sol:CreditsAndFeesTest\n[PASS] testAttestationRequiresActualClaimAndExactLeaf() (gas: 438961)\n[PASS] testClaimTransferAndPayerTransferDoNotDuplicateCredit() (gas: 577960)\n[PASS] testFeeCollectionDoesNotReducePrincipal() (gas: 646031)\n[PASS] testNativeClaimNeverDependsOnAdapterOrFeed() (gas: 846757)\n[PASS] testNativeClaimThenAttestThenSyncThenSale() (gas: 1280110)\n[PASS] testNegativeLiquidityForbiddenEvenForFactory() (gas: 82464)\n[PASS] testProofReleaseAndDedupRemainNativeRules() (gas: 573172)\n[PASS] testSaleFeesCountGrossInputAndNeverCreditFeeRecipients() (gas: 1188451)\n[PASS] testUnauthorizedLiquidityAndDonationNoCredit() (gas: 232025)\n[PASS] testUnclaimedRewardsNotEligible() (gas: 39399)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 33.27ms (3.20ms CPU time)\n\nRan 3 tests for test/FailurePaths.t.sol:ActivationFailurePathsTest\n[PASS] testCompanionConstructorsRejectMissingInputs() (gas: 6057)\n[PASS] testCrossLaunchSetupIsRefusedInEveryDirection() (gas: 31144365)\n[PASS] testSepoliaRefusesLocallyClonedServicesEvenWithFeedAtPublishedAddress() (gas: 676754)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 35.83ms (16.94ms CPU time)\n\nRan 5 tests for test/EvidenceAndOracleProperties.t.sol:MultiLeafEvidenceTest\n[PASS] testDecreasingEvidenceCannotRevokePreviouslyCreditedClaims() (gas: 1100787)\n[PASS] testProofsFromTheActualTreeCreditExactlyWhatWasDelivered() (gas: 2298120)\n[PASS] testSiblingCannotAttestAnotherWalletsClaim() (gas: 771379)\n[PASS] testSweptRoundFreezesEvidence() (gas: 1136221)\n[PASS] testTheTreeIsWellFormed() (gas: 40973)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 37.39ms (3.07ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:EvidenceCertificationRegressionTest\n[PASS] testActualLaterRoundClaimsHaveNoArtificialCumulativeCeiling() (gas: 1510126)\n[PASS] testDuplicateRecipientCannotOvercreditSmallerActualClaim() (gas: 441218)\n[PASS] testIncompleteTreeCannotBeCertified() (gas: 59593)\n[PASS] testOddTreeReconstructionAndPreCertificationNativeClaim() (gas: 580532)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 40.28ms (1.73ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] testCompanionsAreImmutablyBound() (gas: 37886)\n[PASS] testFactoryHoldsPrincipalAndCannotRemoveIt() (gas: 333697)\n[PASS] testLaunchAllocationAndLockedPrincipal() (gas: 191055)\n[PASS] testLaunchIsOnceAndDeployerOnly() (gas: 2730017)\n[PASS] testOnlyCanonicalManagerCanCallHook() (gas: 66479)\n[PASS] testPayerCreditExactDeduplicated() (gas: 137462)\n[PASS] testUnauthorizedFactoryAndWrongPoolRejected() (gas: 80623)\n[PASS] testUnconfiguredComponentsFailClosed() (gas: 42307)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 42.63ms (1.49ms CPU time)\n\nRan 2 tests for test/SecurityRegression.t.sol:StagingCreationRegressionTest\n[PASS] testCounterfeitConstructorIsRefusedBeforeAnyDeployment() (gas: 6161976)\n[PASS] testOnlySetupAuthorityMayStageAndOnlyUntilActivation() (gas: 11784008)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 20.22ms (2.27ms CPU time)\n\nRan 2 tests for test/Stage2Script.t.sol:Stage2ScriptTest\n[PASS] testStage2DeploysFromActualIdentitiesAndOwnerActivates() (gas: 6832294)\n[PASS] testStage2RefusesUnknownLaunchNumber() (gas: 33767)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 44.43ms (2.59ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:CodeAuthenticationRegressionTest\n[PASS] testActivationExternalFailureRollsBackEveryBinding() (gas: 913067)\n[PASS] testInconsistentImmutablePatchesAreRejected() (gas: 1782922)\n[PASS] testLaterFactoryDonationsCannotRewriteInitialAllocationReceipts() (gas: 688991)\n[PASS] testRuntimeMutationCannotPassGetterChecks() (gas: 84703)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 45.93ms (5.57ms CPU time)\n\nRan 8 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test100PercentAloneIsNotFullUnlock() (gas: 7307385)\n[PASS] testArbitraryHookDataAndMultihopPayloadCannotSelectVictim() (gas: 89207)\n[PASS] testCallbacksAllRequireCanonicalManager() (gas: 211512)\n[PASS] testForeignPoolKeyRejectedEvenWithManagerPrank() (gas: 49882)\n[PASS] testNoMintPauseBlacklistUpgradeOrCounterResetEntrypoint() (gas: 114793)\n[PASS] testProtocolFeeChangeCannotSilentlyAlterTradingEconomics() (gas: 357261)\n[PASS] testQuotaMultiplicationDoesNotOverflowAtMaxEligible() (gas: 239235)\n[PASS] testTokenMintsWholeSupplyToDeployerOnly() (gas: 32832)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 57.71ms (11.78ms CPU time)\n\nRan 1 test for test/SecurityRegression.t.sol:LargeTreeCertificationTest\n[PASS] testMaximumSortedTreeFitsTransactionGasLimit() (gas: 15973574)\nLogs:\n  1024-leaf sorted certification gas: 13939470\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 59.73ms (28.51ms CPU time)\n\nRan 3 tests for test/ReleaseConfig.t.sol:ReleaseConfigTest\n[PASS] testReadOnlyReleaseChecksOnLocalFixture() (gas: 2011487)\n[PASS] testReadOnlyReleaseChecksRejectWrongChainOrHash() (gas: 1903758)\n[PASS] testStageOneAloneCannotPassReleaseGate() (gas: 75663436)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 64.37ms (41.44ms CPU time)\n\nRan 6 tests for test/ActivationRobustness.t.sol:ActivationRobustnessTest\n[PASS] testPolicySeedRecordsCapacityAndConfirmsTiers() (gas: 30335357)\n[PASS] testSeedBelowOpeningValueFloorCannotLaunch() (gas: 9047798)\n[PASS] testSeedBelowThePoolShareBandCannotLaunch() (gas: 9043839)\n[PASS] testSeedInsideTheOnePercentBandActivates() (gas: 15647267)\n[PASS] testStagingRunsActivationPreconditionsAndCanRepeat() (gas: 21081828)\n[PASS] testSubDustSeedRoundingStillActivates() (gas: 16005370)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 65.43ms (28.26ms CPU time)\n\nRan 4 tests for test/ActivationRobustness.t.sol:ChunkedCertificationTest\n[PASS] testChunkBoundsAndSizeAreFixedByTheFirstChunk() (gas: 29517535)\n[PASS] testDuplicateAcrossChunksWrongRootAndForeignSessionsAreRefused() (gas: 231631551)\n[PASS] testSingleLeafRoundCertifiesThroughTheChunkedPath() (gas: 398202)\n[PASS] testSingleShotRefusesButChunksCertifyAndCredit() (gas: 124071664)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 101.08ms (59.39ms CPU time)\n\nRan 7 tests for test/NativeLaunch.t.sol:NativeLaunchTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136092722)\n[PASS] testNativeBatchSettlement() (gas: 865791)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1124516)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 451888)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91952)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62608)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29938965)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 135.09ms (103.58ms CPU time)\n\nRan 11 tests for test/NativeLaunch.t.sol:NativeWithdrawalTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136092723)\n[PASS] testNativeBatchSettlement() (gas: 865791)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1124527)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 451977)\n[PASS] testNativeSettlementResetsPriorSyncCurrency() (gas: 604340)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91930)\n[PASS] testNativeWithdrawalUsesCEIAndCannotDoubleWithdraw() (gas: 994842)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62586)\n[PASS] testOtherWalletCannotWithdrawNativeRefund() (gas: 459878)\n[PASS] testRejectingNativeWalletCanTradeAndRetryWithdrawal() (gas: 1073164)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29938965)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 137.04ms (131.78ms CPU time)\n\nRan 17 tests for test/Oracle.t.sol:OracleTest\n[PASS] testBadChainlinkRoundsAndAnswersFailClosed() (gas: 2352246)\n[PASS] testConfirmationGapRestartsRatherThanCountingUnobservedTime() (gas: 14857451)\n[PASS] testEveryTierAndPermanentUnlock() (gas: 136511302)\n[PASS] testFallingPricesNeverLowerReachedTier() (gas: 29259665)\n[PASS] testInvalidDataCannotCountTowardPendingConfirmationOrRevokeRights() (gas: 15083422)\n[PASS] testInvalidDataLongerThanGapRestartsOnNextValidCall() (gas: 694951)\n[PASS] testLongInvalidIntervalRestartsWhetherObservedOrNot() (gas: 807692)\n[PASS] testNegativeTickAveragesRoundConservativelyForBothOrders() (gas: 767868)\n[PASS] testObservedAndUnobservedInvalidIntervalsAgree() (gas: 29667292)\n[PASS] testOneBlockSpikeCannotConfirm() (gas: 739290)\n[PASS] testOracleCannotBeReboundOrConfiguredByAnyone() (gas: 73530)\n[PASS] testRealFeedCadenceCannotBeUsedToResetConfirmation() (gas: 18790257)\n[PASS] testSameTimestampManipulationHasNoTimeWeight() (gas: 758610)\n[PASS] testStaleCheckpointAndFeedPreventNewTierButNotTrades() (gas: 1329158)\n[PASS] testSustainedManipulationRequiresWindowAndConfirmation() (gas: 15126515)\n[PASS] testThresholdMappingBoundaries() (gas: 69776)\n[PASS] testWarmupAndExactWindow() (gas: 400906)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 149.56ms (131.00ms CPU time)\n\nRan 9 tests for test/Trading.t.sol:TradingTest\n[PASS] testAnotherWalletCannotConsumeVictimsAllowanceOrQuota() (gas: 470687)\n[PASS] testDirectManagerAndForeignRouterSpoofingRejected() (gas: 644028)\n[PASS] testDonatedRouterBalancesCannotCreateCreditOrBeSwept() (gas: 496022)\n[PASS] testExactOutputSaleAccountsActualInput() (gas: 732168)\n[PASS] testExcessSaleRollsBackPoolBalancesOracleAndNonce() (gas: 797176)\n[PASS] testFuzzQuotaBoundary(uint96) (runs: 256, μ: 1032846, ~: 1032869)\n[PASS] testReplayOldCallbackHasNoLiveContext() (gas: 425843)\n[PASS] testSaleBoundaryExecutedInputIncludesPoolFee() (gas: 1062165)\n[PASS] testTransfersDoNotMoveRightsOrAllowChainCredit() (gas: 827129)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 292.32ms (246.77ms CPU time)\n\nRan 3 tests for test/ManipulationEconomics.t.sol:ManipulationEconomicsTest\n[PASS] testCounterSellingOfAllInitialNonPoolTokens() (gas: 157719009)\nLogs:\n  gross ETH capital (wei): 404492004375936755769\n  attacker ETH exit (wei): 139667041180374722901\n  net ETH exit cost before fee recapture (wei): 264824963195562032868\n  payer ETH fee receipts (wei): 4044920043759367559\n  counter-seller ETH proceeds (wei): 259768813140862823404\n  duration seconds: 201600\n\n[PASS] testPayerCanRecaptureItsNativeFeeShare() (gas: 144653849)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n  net ETH cost after native fee recapture (wei): 653249186877100125\n\n[PASS] testSustainedManipulationUnlockAndExit() (gas: 144667569)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 354.51ms (304.27ms CPU time)\n\nRan 3 tests for test/SecurityRegression.t.sol:OracleOutageRegressionTest\n[PASS] testDepthDipInvalidatesWholeWindowAndRetainsReachedRights() (gas: 16312506)\n[PASS] testFinalTierRequiresItsOwnTwentyFourHours() (gas: 138827744)\n[PASS] testNextTierClockWaitsForItsOwnThreshold() (gas: 15293513)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 500.45ms (131.23ms CPU time)\n\nRan 1 test for test/StageOneInvariants.t.sol:StageOneInvariantTest\n[PASS]\nStageOneInvariantTest invariants:\n[PASS] invariant_onlyTheAuthorizedCallActivates\n[PASS] invariant_tokenAndClaimsIndependentOfTheHook\n[PASS] invariant_unconfiguredPoolIsInert\n StageOneInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| StageOneHandler | advance          | 470   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | attemptActivate  | 504   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | claimAndAttest   | 519   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | directSwap       | 461   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | foreignLiquidity | 470   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | routerSwap       | 491   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | syncAndMilestone | 472   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | transfer         | 453   | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 722.52ms (688.61ms CPU time)\n\nRan 3 tests for test/EvidenceAndOracleProperties.t.sol:OracleReferenceTest\n[PASS] testCheckpointReplacementRewritesOnlyTheCurrentSecond() (gas: 994219)\n[PASS] testFuzzFdvIsMonotonicInTheEthUsdAnswer(uint64,uint64) (runs: 256, μ: 750292, ~: 750529)\n[PASS] testFuzzTwapMatchesBruteForceReference(uint256) (runs: 160, μ: 2747520, ~: 2619557)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.24s (1.72s CPU time)\n\nRan 17 tests for test/FailurePaths.t.sol:RouterAndHookFailurePathsTest\n[PASS] testBatchBoundsAndValueMustMatch() (gas: 186758)\n[PASS] testBatchIsAtomicWhenALaterStepFails() (gas: 830450)\n[PASS] testConfirmationRequiresSixHoursAndCannotSkipTiers() (gas: 15340175)\n[PASS] testFullUnlockKeepsFeesAndRouterAuthentication() (gas: 137004282)\n[PASS] testFuzzOperationHashBindsTraderNonceAndChain(address,uint256,uint64) (runs: 256, μ: 17656, ~: 17656)\n[PASS] testFuzzRemainingQuotaFormula(uint128,uint128,uint8) (runs: 512, μ: 7293362, ~: 7293203)\n[PASS] testFuzzTierIsMonotonicInFdv(uint256,uint256) (runs: 512, μ: 16963, ~: 16923)\n[PASS] testFuzzTransfersMoveExactlyTheAmount(address,uint96) (runs: 256, μ: 122458, ~: 122475)\n[PASS] testHookRejectsMalformedRouteDataAndUnknownSenders() (gas: 238753)\n[PASS] testPartialFillAtPriceLimitChargesOnlyExecutedInput() (gas: 1208964)\n[PASS] testQuotaWidensWithTierAndNeverDoubleCounts() (gas: 16785891)\n[PASS] testRequesterChangeAfterActivationDoesNotMoveThePayer() (gas: 146383)\n[PASS] testRouterCallbackNeedsALiveSwap() (gas: 73817)\n[PASS] testRouterRefusesDegenerateRequests() (gas: 500273)\n[PASS] testSecondRoundClaimsAccumulateOncePerRound() (gas: 995639)\n[PASS] testSlippageRefusalsLeaveNoTrace() (gas: 895597)\n[PASS] testSyncForStrangerAndZeroAddressCreatesNothing() (gas: 108400)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 1.60s (2.87s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:ChunkedCertificationPropertiesTest\n[PASS] testFuzz_abandonedSessionIsInertAndRestartable(uint8,uint256) (runs: 128, μ: 2630222, ~: 2456457)\n[PASS] testFuzz_anyChunkingAndReductionScheduleMatchesSingleShot(uint8,uint256,uint256,uint256,uint8,uint8) (runs: 128, μ: 3712224, ~: 3508656)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.62s (236.10ms CPU time)\n\nRan 13 tests for test/TwoStage.t.sol:StageOneTest\n[PASS] testActivationSealsAndCannotBeReplayed() (gas: 5901690)\n[PASS] testCrossLaunchNumberRejected() (gas: 5361101)\n[PASS] testFactoryLiquidityAllowedBeforeActivationButPrincipalStaysLocked() (gas: 37293)\n[PASS] testFirstTierConfirmsBelowTenEthActualReserves() (gas: 35384808)\n[PASS] testLaunchSucceedsWithoutCompanions() (gas: 122562)\n[PASS] testPayerCanTransferBeforeActivationWithoutLosingHistoricalCredit() (gas: 5893013)\n[PASS] testPayerCreditOnlyAfterActivationAndFromOriginalTransferReceipt() (gas: 5842154)\n[PASS] testRequesterReassignmentCannotMoveInitialAllocationCredit() (gas: 5848820)\n[PASS] testSepoliaRequiresPublishedChainlinkFeed() (gas: 5377611)\n[PASS] testSwapsSyncAndMilestonesRevertBeforeActivation() (gas: 5849964)\n[PASS] testTransfersAndNativeClaimsWorkBeforeActivationAndClaimIsCreditedLater() (gas: 6199971)\n[PASS] testUnauthorizedActivationRejected() (gas: 5373249)\n[PASS] testWrongContractsRejected() (gas: 6061423)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.60s (24.26ms CPU time)\n\nRan 5 tests for test/BatchSettlementProperties.t.sol:BatchSettlementPropertiesTest\n[PASS] testFuzz_BatchEqualsSequentialExecution(uint256,uint8,bool) (runs: 1000, μ: 4418362, ~: 4045936)\n[PASS] testFuzz_FailureAtAnyBatchIndexRestoresAllowancesFeesAndCredits(uint256,uint8) (runs: 1000, μ: 11413774, ~: 11248454)\n[PASS] test_MaximumMixedBatchOnFreshTokenOnlyManager() (gas: 9205385)\n[PASS] test_OneWeiShortAllowanceRestoresEntireBatchAndRetryWorks() (gas: 1867639)\n[PASS] test_PartialSaleMayPrefundMoreThanQuotaButChargesOnlyExecution() (gas: 903643)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.62s (3.17s CPU time)\n\nRan 1 test for test/Invariants.t.sol:FullyUnlockedInvariantTest\n[PASS]\nFullyUnlockedInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n[PASS] invariantUnlockRemainsPermanentDespiteInvalidFeed\n FullyUnlockedInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 835   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 854   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 872   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 856   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 820   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 883   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.82s (1.68s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:MilestoneSampleInvariantTest\n[PASS]\nMilestoneSampleInvariantTest invariants:\n[PASS] invariant_confirmationNeedsAnUnbrokenChainOfValidSamples\n[PASS] invariant_invalidSamplesNeverAdvanceTiers\n[PASS] invariant_nothingEverRelocksAndStateIsConsistent\n MilestoneSampleInvariantTest invariants (runs: 48, calls: 1920, reverts: 0)\n\n╭------------------------+----------+-------+---------+----------╮\n| Contract               | Selector | Calls | Reverts | Discards |\n+================================================================+\n| MilestoneSampleHandler | advance  | 301   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | corrupt  | 315   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | heal     | 322   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | march    | 338   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | sample   | 309   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | setPrice | 335   | 0       | 0        |\n╰------------------------+----------+-------+---------+----------╯\n\n[PASS] testHandlerReachesTiersAndEveryCorruptionIsInvalid() (gas: 12640787)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.10s (2.09s CPU time)\n\nRan 1 test for test/Invariants.t.sol:SystemInvariantTest\n[PASS]\nSystemInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n SystemInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 835   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 854   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 872   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 856   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 820   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 883   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.13s (2.10s CPU time)\n\nRan 2 tests for test/QuotaInvariants.t.sol:QuotaInvariantTest\n[PASS]\nQuotaInvariantTest invariants:\n[PASS] invariant_configurationSealedAndRouteEnforced\n[PASS] invariant_ledgerMatchesExecutedDeltas\n[PASS] invariant_milestonesMonotonicAndConsistent\n[PASS] invariant_principalLockedAndFeeTermsFixed\n[PASS] invariant_routerNativeSolvency\n[PASS] invariant_salesNeverExceedQuota\n[PASS] invariant_supplyConservedAndNoCustody\n QuotaInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭--------------+-----------------+-------+---------+----------╮\n| Contract     | Selector        | Calls | Reverts | Discards |\n+=============================================================+\n| QuotaHandler | advance         | 374   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactIn      | 342   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactOut     | 342   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimAndAttest  | 374   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimFees       | 387   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | directSwap      | 365   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | donate          | 374   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | foreignActivate | 376   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellExactOut    | 376   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellOverQuota   | 363   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellWithinQuota | 715   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | setFeed         | 375   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sync            | 335   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | transfer        | 334   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | withdrawNative  | 328   | 0       | 0        |\n╰--------------+-----------------+-------+---------+----------╯\n\n[PASS] testHandlerActionsActuallyExecute() (gas: 23814275)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.95s (2.94s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:SeedGatePropertiesTest\n[PASS] testFuzz_launchedSeedIsAlwaysLiquidAndRefusedSeedIsAlwaysBelowFloor(uint8) (runs: 96, μ: 10804853, ~: 9043298)\n[PASS] testFuzz_poolShareBandDecidesLaunchAndActivation(uint16) (runs: 96, μ: 11520382, ~: 9040783)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.23s (193.82ms CPU time)\n\nRan 2 tests for test/ClaimLifecycleInvariants.t.sol:ClaimLifecycleInvariantsTest\n[PASS]\nClaimLifecycleInvariantsTest invariants:\n[PASS] invariant_DistributorReservesAndCashMatchIndependentRoundModel\n[PASS] invariant_FixedSupplyAndInitialReceiptsSurviveAllClaimSequences\n[PASS] invariant_OnlyDeliveredAttestedAndSyncedClaimsCreateRights\n ClaimLifecycleInvariantsTest invariants (runs: 256, calls: 20480, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| ClaimLifecycleHandler | advance           | 1892  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | attest            | 1803  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | certify           | 1905  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | claim             | 1834  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | deliverAndSync    | 1856  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | openRound         | 1849  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sweep             | 1929  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sync              | 1791  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | syncPayer         | 1859  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | transferOrDonate  | 1867  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | unauthorizedRound | 1895  | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\n[PASS] test_ModelExercisesDelayedCertificationSweepsAndRecycledFunding() (gas: 4966220)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.45s (9.43s CPU time)\n\nRan 2 tests for test/NativeCustodyInvariants.t.sol:NativeCustodyInvariantsTest\n[PASS]\nNativeCustodyInvariantsTest invariants:\n[PASS] invariant_ManagerHasNoUnsettledDeltaOrReusableRouteContext\n[PASS] invariant_NativeLiabilitiesRemainFullyBackedAndBelongToTheirWallet\n[PASS] invariant_TransfersDonationsAndFailedBatchesCannotCreateOrMoveRights\n NativeCustodyInvariantsTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| NativeCustodyHandler | donateTokens | 2730  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | failBatch    | 2762  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | forceEther   | 2698  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | tradeBatch   | 2716  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | transfer     | 2725  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | withdraw     | 2753  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\n[PASS] test_HandlerTradesRejectsReentersAndDrainsWithoutTakingDonations() (gas: 5300451)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.38s (10.35s CPU time)\n\nRan 38 test suites in 10.39s (42.80s CPU time): 175 tests passed, 0 failed, 0 skipped (175 total tests)\n","passed":true},{"durationMs":121,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MerkleClaimEvidence.abandonSession(uint256)\",\"MerkleClaimEvidence.attest(uint256,address,uint256,bytes32[])\",\"MerkleClaimEvidence.certifyRound(uint256,address[],uint256[])\",\"MerkleClaimEvidence.reduce(uint256,uint256)\",\"MerkleClaimEvidence.submitLeaves(uint256,uint256,address[],uint256[])\",\"UnlkHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"UnlkHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"UnlkHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"UnlkHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"UnlkHook.configureAndActivate(address,address,address,uint64)\",\"UnlkHook.deployCompanions(uint64,address,bytes,bytes,bytes)\",\"UnlkHook.syncPayer()\",\"UnlkHook.syncRewards(address)\",\"UnlkHook.updateMilestone()\",\"UnlkOracle.bind((address,address,uint24,int24,address),address,int24,int24)\",\"UnlkOracle.checkpoint()\",\"UnlkSwapRouter.receive()\",\"UnlkSwapRouter.swap((bool,int256,uint160,uint256,uint256,uint256))\",\"UnlkSwapRouter.swapBatch((bool,int256,uint160,uint256,uint256,uint256)[])\",\"UnlkSwapRouter.unlockCallback(bytes)\",\"UnlkSwapRouter.withdrawNative()\",\"UnlkToken.approve(address,uint256)\",\"UnlkToken.transfer(address,uint256)\",\"UnlkToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DELIVERY.md\":78,\"LICENSE\":25,\"README.md\":153,\"RELEASE_STATUS.json\":49,\"delivery/OPERATIONS.md\":112,\"delivery/PACKAGE_SHA256SUMS\":566,\"delivery/STATUS.json\":151,\"delivery/checks/abi-export.txt\":1,\"delivery/checks/artifact-export.txt\":1,\"delivery/checks/build.txt\":21,\"delivery/checks/current-block-fork.txt\":24,\"delivery/checks/extended-fork.txt\":27,\"delivery/checks/final-fmt.txt\":0,\"delivery/checks/final-integrity.txt\":8,\"delivery/checks/fmt.txt\":0,\"delivery/checks/historical-block-fork.txt\":25,\"delivery/checks/imd-launch.txt\":1,\"delivery/checks/integrity.txt\":12,\"delivery/checks/lint.txt\":372,\"delivery/checks/live-rpc.txt\":1,\"delivery/checks/minimal-environment.txt\":505,\"delivery/checks/protected.txt\":22,\"delivery/checks/release-gates.txt\":10,\"delivery/checks/reviewed-code.txt\":1,\"delivery/checks/rpc-tools.txt\":1,\"delivery/checks/saved-network.txt\":7,\"delivery/checks/signing-tools.txt\":5,\"delivery/checks/source-hashes.txt\":458,\"delivery/checks/test.txt\":485,\"delivery/checks/upstream-rehearsal-build.txt\":8,\"delivery/network/block.json\":1,\"delivery/network/capabilities.json\":345,\"delivery/network/current-job.json\":217,\"delivery/network/factory.runtime.hex\":1,\"delivery/network/feed-check.json\":21,\"delivery/network/feed.runtime.hex\":1,\"delivery/network/fees.runtime.hex\":1,\"delivery/network/fix-job.json\":104,\"delivery/network/http-results.json\":117,\"delivery/network/import-check-paths-request.json\":33,\"delivery/network/import-check-paths-response.json\":25,\"delivery/network/import-check-request.json\":15,\"delivery/network/import-check-response.json\":25,\"delivery/network/import-request.json\":5,\"delivery/network/import-response.json\":17,\"delivery/network/manager.runtime.hex\":1,\"delivery/network/openapi.json\":1383,\"delivery/network/platform-rebuild.json\":30,\"delivery/network/policies.json\":1430,\"delivery/network/preflight.json\":347,\"delivery/network/registry.runtime.hex\":1,\"delivery/network/rpc-access.json\":20,\"delivery/network/selected-policy.json\":34,\"delivery/network/services.json\":29,\"delivery/protected-inputs.json\":4,\"delivery/provenance.json\":25,\"delivery/rehearsal/RecordedSepolia.t.sol\":200,\"delivery/source-files.json\":2492,\"delivery/verify.py\":163,\"dependencies.lock.json\":24,\"docs/ARTIFACTS.json\":64,\"docs/BUILD_RESULTS.txt\":21,\"docs/BYTECODE_COMPARISON_RESULTS.txt\":8,\"docs/DEPLOYMENT.md\":158,\"docs/ECONOMICS_RESULTS.txt\":49,\"docs/FMT_RESULTS.txt\":0,\"docs/FORK_RESULTS.txt\":24,\"docs/IMD_LAUNCH_CHECK_RESULTS.txt\":1,\"docs/LINT_RESULTS.txt\":372,\"docs/MINIMAL_ENV_TEST_RESULTS.txt\":543,\"docs/NETWORK_VERIFICATION_RESULTS.txt\":7,\"docs/PROTECTED_TEST_RESULTS.txt\":22,\"docs/RECOVERY.md\":65,\"docs/RELEASE_ARTIFACT_TEST_RESULTS.txt\":10,\"docs/SECURITY_REVIEW.md\":128,\"docs/SIZE_FIX.md\":146,\"docs/SOURCE_SHA256SUMS\":458,\"docs/SOURCE_VERIFICATION_RESULTS.txt\":458,\"docs/TEST_RESULTS.txt\":485,\"docs/VALIDATION.md\":131,\"docs/abi/CheckReleaseConfig.json\":46,\"docs/abi/HookDeployer.json\":94,\"docs/abi/IChainlinkEthUsd.json\":48,\"docs/abi/IClaimEvidence.json\":47,\"docs/abi/IHooks.json\":789,\"docs/abi/ILaunchFactoryView.json\":115,\"docs/abi/ILaunchRegistryView.json\":70,\"docs/abi/IMerkleDistributor.json\":125,\"docs/abi/IPoolManager.json\":1286,\"docs/abi/IRouteContext.json\":20,\"docs/abi/LaunchFactory.json\":896,\"docs/abi/LaunchFees.json\":323,\"docs/abi/LaunchRegistry.json\":320,\"docs/abi/MerkleClaimEvidence.json\":461,\"docs/abi/MerkleDistributor.json\":451,\"docs/abi/Stage2.json\":225,\"docs/abi/UnlkHook.json\":1973,\"docs/abi/UnlkOracle.json\":443,\"docs/abi/UnlkSwapRouter.json\":359,\"docs/abi/UnlkToken.json\":425,\"docs/network/capabilities.json\":345,\"docs/network/factory-artifacts.json\":2201,\"docs/network/factory-reference.json\":420,\"docs/network/factory.runtime.hex\":1,\"docs/network/feed-reference.json\":67,\"docs/network/feed-rounds.json\":134,\"docs/network/feed.runtime.hex\":1,\"docs/network/fees.runtime.hex\":1,\"docs/network/job-identity.json\":14,\"docs/network/manager.runtime.hex\":1,\"docs/network/policies.json\":36,\"docs/network/registry-reference.json\":108,\"docs/network/registry.runtime.hex\":1,\"docs/network/sepolia.json\":309,\"docs/network/services.json\":29,\"docs/network/size-fix-status.json\":126,\"foundry.toml\":31,\"launch.json\":35,\"rehearsal/Sepolia.t.sol\":112,\"remappings.txt\":4,\"script/CheckReleaseConfig.s.sol\":85,\"script/LocalDemo.s.sol\":41,\"script/Stage2.s.sol\":98,\"scripts/check.sh\":12,\"scripts/check_protected.py\":31,\"scripts/export_abis.py\":33,\"scripts/generate_code_checks.py\":22,\"scripts/mine-hook.sh\":9,\"scripts/prepare_claim_tree.py\":37,\"scripts/rehearse-sepolia.sh\":4,\"scripts/release_artifacts.py\":56,\"scripts/verify_network.py\":46,\"src/HookDeployer.sol\":37,\"src/HookFlags.sol\":45,\"src/MerkleClaimEvidence.sol\":200,\"src/UnlkHook.sol\":719,\"src/UnlkOracle.sol\":190,\"src/UnlkSwapRouter.sol\":225,\"src/UnlkToken.sol\":42,\"src/interfaces/IIntegration.sol\":86,\"src/libraries/OperationHash.sol\":15,\"src/libraries/ReviewedCode.sol\":10,\"src/libraries/SeedDepth.sol\":41,\"src/libraries/SepoliaRelease.sol\":11,\"test/ADDITIONAL_COVERAGE.md\":94,\"test/ActivationRobustness.t.sol\":303,\"test/Adversarial.t.sol\":117,\"test/BatchSettlementProperties.t.sol\":272,\"test/ClaimLifecycleInvariants.t.sol\":444,\"test/CreditsAndFees.t.sol\":176,\"test/EvidenceAndOracleProperties.t.sol\":349,\"test/FailurePaths.t.sol\":581,\"test/HookDeployer.t.sol\":96,\"test/Invariants.t.sol\":220,\"test/Launch.t.sol\":112,\"test/LocalScript.t.sol\":28,\"test/ManipulationEconomics.t.sol\":117,\"test/NativeCustodyInvariants.t.sol\":296,\"test/NativeLaunch.t.sol\":236,\"test/Oracle.t.sol\":422,\"test/QuotaInvariants.t.sol\":529,\"test/ReleaseConfig.t.sol\":32,\"test/RevisionProperties.t.sol\":593,\"test/SecurityRegression.t.sol\":337,\"test/Stage2Script.t.sol\":62,\"test/StageOneInvariants.t.sol\":281,\"test/Trading.t.sol\":171,\"test/TwoStage.t.sol\":302,\"test/fixtures/LocalFixtures.sol\":59,\"test/fixtures/SystemFixture.sol\":372,\"test/imd/HookFlags.sol\":45,\"test/imd/LaunchFactory.sol\":375,\"test/imd/LaunchFees.sol\":73,\"test/imd/LaunchRegistry.sol\":109,\"test/imd/MerkleDistributor.sol\":181,\"test/imd/PoolFees.sol\":220,\"test/imd/README.md\":29,\"test/mocks/MockERC20.sol\":11,\"test/test_release_artifacts.py\":96},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6479ec566b3729d65a83187c7ffb905e73f227c7c94a443111a4c83a5027b8c9","verifiedTreeHash":"b37639029e725d7c8f98bda24b1b38ead0177b8c","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":19778,"exitCode":0,"name":"build","output":"Compiling 134 files with Solc 0.8.26\nSolc 0.8.26 finished in 19.63s\nCompiler run successful with warnings:\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/BatchSettlementProperties.t.sol:14:9:\n   |\n14 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/FeeCustodyProperties.t.sol:19:9:\n   |\n19 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/NativeCustodyInvariants.t.sol:15:9:\n   |\n15 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/UnlkHook.sol:205:5:\n    |\n205 |     function afterInitialize(address, PoolKey calldata key, uint160, int24)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":11208,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/HookDeployer.t.sol:HookDeployerTest\n[PASS] testChangedCreationBodyCannotMatchReviewedHash() (gas: 135884)\n[PASS] testChangedSetupAuthorityChangesHashAndCreate2Prediction() (gas: 226190)\n[PASS] testDeployedHelperFitsEvmCodeLimits() (gas: 8947)\n[PASS] testFuzzEncodesCallerSuppliedBytesAndFourAddresses(bytes,address,address,address,address) (runs: 256, μ: 20393, ~: 20352)\n[PASS] testReviewedHookInitCodeAndHash() (gas: 196590)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 11.22ms (10.37ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:EvidenceCertificationRegressionTest\n[PASS] testActualLaterRoundClaimsHaveNoArtificialCumulativeCeiling() (gas: 1510126)\n[PASS] testDuplicateRecipientCannotOvercreditSmallerActualClaim() (gas: 441218)\n[PASS] testIncompleteTreeCannotBeCertified() (gas: 59593)\n[PASS] testOddTreeReconstructionAndPreCertificationNativeClaim() (gas: 580532)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 23.08ms (1.25ms CPU time)\n\nRan 2 tests for test/SecurityRegression.t.sol:StagingCreationRegressionTest\n[PASS] testCounterfeitConstructorIsRefusedBeforeAnyDeployment() (gas: 6161976)\n[PASS] testOnlySetupAuthorityMayStageAndOnlyUntilActivation() (gas: 11784008)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 19.80ms (2.10ms CPU time)\n\nRan 2 tests for test/LocalScript.t.sol:LocalScriptTest\n[PASS] testLocalScriptRefusesPublicChainId() (gas: 13983272)\n[PASS] testLocalSimulationFunctionDoesNotDependOnCaller() (gas: 68079045)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 31.81ms (31.22ms CPU time)\n\nRan 1 test for test/RevisionProperties.t.sol:RestagingIsolationTest\n[PASS] testAbandonedBundleIsInertAndMixedBundlesAreRefused() (gas: 6919999)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 45.51ms (1.86ms CPU time)\n\nRan 5 tests for test/EvidenceAndOracleProperties.t.sol:MultiLeafEvidenceTest\n[PASS] testDecreasingEvidenceCannotRevokePreviouslyCreditedClaims() (gas: 1100787)\n[PASS] testProofsFromTheActualTreeCreditExactlyWhatWasDelivered() (gas: 2298120)\n[PASS] testSiblingCannotAttestAnotherWalletsClaim() (gas: 771379)\n[PASS] testSweptRoundFreezesEvidence() (gas: 1136221)\n[PASS] testTheTreeIsWellFormed() (gas: 40973)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 46.47ms (2.36ms CPU time)\n\nRan 10 tests for test/CreditsAndFees.t.sol:CreditsAndFeesTest\n[PASS] testAttestationRequiresActualClaimAndExactLeaf() (gas: 438961)\n[PASS] testClaimTransferAndPayerTransferDoNotDuplicateCredit() (gas: 577960)\n[PASS] testFeeCollectionDoesNotReducePrincipal() (gas: 646031)\n[PASS] testNativeClaimNeverDependsOnAdapterOrFeed() (gas: 846757)\n[PASS] testNativeClaimThenAttestThenSyncThenSale() (gas: 1280110)\n[PASS] testNegativeLiquidityForbiddenEvenForFactory() (gas: 82464)\n[PASS] testProofReleaseAndDedupRemainNativeRules() (gas: 573172)\n[PASS] testSaleFeesCountGrossInputAndNeverCreditFeeRecipients() (gas: 1188451)\n[PASS] testUnauthorizedLiquidityAndDonationNoCredit() (gas: 232025)\n[PASS] testUnclaimedRewardsNotEligible() (gas: 39399)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 49.59ms (3.51ms CPU time)\n\nRan 2 tests for test/Stage2Script.t.sol:Stage2ScriptTest\n[PASS] testStage2DeploysFromActualIdentitiesAndOwnerActivates() (gas: 6832294)\n[PASS] testStage2RefusesUnknownLaunchNumber() (gas: 33767)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 29.63ms (1.95ms CPU time)\n\nRan 1 test for test/EvidenceAndOracleProperties.t.sol:RouterDeadlineTest\n[PASS] testDeadlineIsInclusive() (gas: 422030)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 53.84ms (513.23µs CPU time)\n\nRan 1 test for test/FailurePaths.t.sol:UnpaidLaunchTest\n[PASS] testNoRequesterMeansNoPayerCreditAnywhere() (gas: 1264616)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 54.22ms (1.03ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] testCompanionsAreImmutablyBound() (gas: 37886)\n[PASS] testFactoryHoldsPrincipalAndCannotRemoveIt() (gas: 333697)\n[PASS] testLaunchAllocationAndLockedPrincipal() (gas: 191055)\n[PASS] testLaunchIsOnceAndDeployerOnly() (gas: 2730017)\n[PASS] testOnlyCanonicalManagerCanCallHook() (gas: 66479)\n[PASS] testPayerCreditExactDeduplicated() (gas: 137462)\n[PASS] testUnauthorizedFactoryAndWrongPoolRejected() (gas: 80623)\n[PASS] testUnconfiguredComponentsFailClosed() (gas: 42307)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 57.85ms (1.66ms CPU time)\n\nRan 6 tests for test/ActivationRobustness.t.sol:ActivationRobustnessTest\n[PASS] testPolicySeedRecordsCapacityAndConfirmsTiers() (gas: 30335357)\n[PASS] testSeedBelowOpeningValueFloorCannotLaunch() (gas: 9047798)\n[PASS] testSeedBelowThePoolShareBandCannotLaunch() (gas: 9043839)\n[PASS] testSeedInsideTheOnePercentBandActivates() (gas: 15647267)\n[PASS] testStagingRunsActivationPreconditionsAndCanRepeat() (gas: 21081828)\n[PASS] testSubDustSeedRoundingStillActivates() (gas: 16005370)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 61.37ms (17.94ms CPU time)\n\nRan 3 tests for test/FailurePaths.t.sol:ActivationFailurePathsTest\n[PASS] testCompanionConstructorsRejectMissingInputs() (gas: 6057)\n[PASS] testCrossLaunchSetupIsRefusedInEveryDirection() (gas: 31144365)\n[PASS] testSepoliaRefusesLocallyClonedServicesEvenWithFeedAtPublishedAddress() (gas: 676754)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 63.73ms (18.28ms CPU time)\n\nRan 8 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test100PercentAloneIsNotFullUnlock() (gas: 7307385)\n[PASS] testArbitraryHookDataAndMultihopPayloadCannotSelectVictim() (gas: 89207)\n[PASS] testCallbacksAllRequireCanonicalManager() (gas: 211512)\n[PASS] testForeignPoolKeyRejectedEvenWithManagerPrank() (gas: 49882)\n[PASS] testNoMintPauseBlacklistUpgradeOrCounterResetEntrypoint() (gas: 114793)\n[PASS] testProtocolFeeChangeCannotSilentlyAlterTradingEconomics() (gas: 357261)\n[PASS] testQuotaMultiplicationDoesNotOverflowAtMaxEligible() (gas: 239235)\n[PASS] testTokenMintsWholeSupplyToDeployerOnly() (gas: 32832)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 64.72ms (6.37ms CPU time)\n\nRan 2 tests for test/TwoStage.t.sol:StageOneConstructorTest\n[PASS] testConstructorRejectsMissingOrConflatedInputs() (gas: 8207)\n[PASS] testOnlyFactoryCanInitializeTheHooksPool() (gas: 43150)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 15.18ms (175.33µs CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:CodeAuthenticationRegressionTest\n[PASS] testActivationExternalFailureRollsBackEveryBinding() (gas: 913067)\n[PASS] testInconsistentImmutablePatchesAreRejected() (gas: 1782922)\n[PASS] testLaterFactoryDonationsCannotRewriteInitialAllocationReceipts() (gas: 688991)\n[PASS] testRuntimeMutationCannotPassGetterChecks() (gas: 84703)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 26.19ms (4.63ms CPU time)\n\nRan 1 test for test/SecurityRegression.t.sol:LargeTreeCertificationTest\n[PASS] testMaximumSortedTreeFitsTransactionGasLimit() (gas: 15973574)\nLogs:\n  1024-leaf sorted certification gas: 13939470\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 81.90ms (30.84ms CPU time)\n\nRan 3 tests for test/ReleaseConfig.t.sol:ReleaseConfigTest\n[PASS] testReadOnlyReleaseChecksOnLocalFixture() (gas: 2011487)\n[PASS] testReadOnlyReleaseChecksRejectWrongChainOrHash() (gas: 1903758)\n[PASS] testStageOneAloneCannotPassReleaseGate() (gas: 75663436)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 95.39ms (48.66ms CPU time)\n\nRan 13 tests for test/TwoStage.t.sol:StageOneTest\n[PASS] testActivationSealsAndCannotBeReplayed() (gas: 5901690)\n[PASS] testCrossLaunchNumberRejected() (gas: 5361101)\n[PASS] testFactoryLiquidityAllowedBeforeActivationButPrincipalStaysLocked() (gas: 37293)\n[PASS] testFirstTierConfirmsBelowTenEthActualReserves() (gas: 35384808)\n[PASS] testLaunchSucceedsWithoutCompanions() (gas: 122562)\n[PASS] testPayerCanTransferBeforeActivationWithoutLosingHistoricalCredit() (gas: 5893013)\n[PASS] testPayerCreditOnlyAfterActivationAndFromOriginalTransferReceipt() (gas: 5842154)\n[PASS] testRequesterReassignmentCannotMoveInitialAllocationCredit() (gas: 5848820)\n[PASS] testSepoliaRequiresPublishedChainlinkFeed() (gas: 5377611)\n[PASS] testSwapsSyncAndMilestonesRevertBeforeActivation() (gas: 5849964)\n[PASS] testTransfersAndNativeClaimsWorkBeforeActivationAndClaimIsCreditedLater() (gas: 6199971)\n[PASS] testUnauthorizedActivationRejected() (gas: 5373249)\n[PASS] testWrongContractsRejected() (gas: 6061423)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 34.75ms (23.86ms CPU time)\n\nRan 11 tests for test/NativeLaunch.t.sol:NativeWithdrawalTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136092723)\n[PASS] testNativeBatchSettlement() (gas: 865791)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1124527)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 451977)\n[PASS] testNativeSettlementResetsPriorSyncCurrency() (gas: 604340)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91930)\n[PASS] testNativeWithdrawalUsesCEIAndCannotDoubleWithdraw() (gas: 994842)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62586)\n[PASS] testOtherWalletCannotWithdrawNativeRefund() (gas: 459878)\n[PASS] testRejectingNativeWalletCanTradeAndRetryWithdrawal() (gas: 1073164)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29938965)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 133.26ms (114.07ms CPU time)\n\nRan 4 tests for test/ActivationRobustness.t.sol:ChunkedCertificationTest\n[PASS] testChunkBoundsAndSizeAreFixedByTheFirstChunk() (gas: 29517535)\n[PASS] testDuplicateAcrossChunksWrongRootAndForeignSessionsAreRefused() (gas: 231631551)\n[PASS] testSingleLeafRoundCertifiesThroughTheChunkedPath() (gas: 398202)\n[PASS] testSingleShotRefusesButChunksCertifyAndCredit() (gas: 124071664)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 135.95ms (66.56ms CPU time)\n\nRan 7 tests for test/NativeLaunch.t.sol:NativeLaunchTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136092722)\n[PASS] testNativeBatchSettlement() (gas: 865791)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1124516)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 451888)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91952)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62608)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29938965)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 148.03ms (140.34ms CPU time)\n\nRan 17 tests for test/Oracle.t.sol:OracleTest\n[PASS] testBadChainlinkRoundsAndAnswersFailClosed() (gas: 2352246)\n[PASS] testConfirmationGapRestartsRatherThanCountingUnobservedTime() (gas: 14857451)\n[PASS] testEveryTierAndPermanentUnlock() (gas: 136511302)\n[PASS] testFallingPricesNeverLowerReachedTier() (gas: 29259665)\n[PASS] testInvalidDataCannotCountTowardPendingConfirmationOrRevokeRights() (gas: 15083422)\n[PASS] testInvalidDataLongerThanGapRestartsOnNextValidCall() (gas: 694951)\n[PASS] testLongInvalidIntervalRestartsWhetherObservedOrNot() (gas: 807692)\n[PASS] testNegativeTickAveragesRoundConservativelyForBothOrders() (gas: 767868)\n[PASS] testObservedAndUnobservedInvalidIntervalsAgree() (gas: 29667292)\n[PASS] testOneBlockSpikeCannotConfirm() (gas: 739290)\n[PASS] testOracleCannotBeReboundOrConfiguredByAnyone() (gas: 73530)\n[PASS] testRealFeedCadenceCannotBeUsedToResetConfirmation() (gas: 18790257)\n[PASS] testSameTimestampManipulationHasNoTimeWeight() (gas: 758610)\n[PASS] testStaleCheckpointAndFeedPreventNewTierButNotTrades() (gas: 1329158)\n[PASS] testSustainedManipulationRequiresWindowAndConfirmation() (gas: 15126515)\n[PASS] testThresholdMappingBoundaries() (gas: 69776)\n[PASS] testWarmupAndExactWindow() (gas: 400906)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 167.52ms (141.57ms CPU time)\n\nRan 3 tests for test/SecurityRegression.t.sol:OracleOutageRegressionTest\n[PASS] testDepthDipInvalidatesWholeWindowAndRetainsReachedRights() (gas: 16312506)\n[PASS] testFinalTierRequiresItsOwnTwentyFourHours() (gas: 138827744)\n[PASS] testNextTierClockWaitsForItsOwnThreshold() (gas: 15293513)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 179.97ms (144.85ms CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:SeedGatePropertiesTest\n[PASS] testFuzz_launchedSeedIsAlwaysLiquidAndRefusedSeedIsAlwaysBelowFloor(uint8) (runs: 96, μ: 10804788, ~: 9043286)\n[PASS] testFuzz_poolShareBandDecidesLaunchAndActivation(uint16) (runs: 96, μ: 10900477, ~: 9040781)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 190.86ms (225.70ms CPU time)\n\nRan 4 tests for test/TokenLedgerProperties.t.sol:TokenReceiptPropertiesTest\n[PASS] testFuzz_ReceiptsSurviveRoundingDelegationAndReturnedInventory(uint96) (runs: 1000, μ: 611432, ~: 611245)\n[PASS] test_FailedFinalTransferRollsBackAllowanceAndDistribution() (gas: 395800)\n[PASS] test_MetadataAndUnsealedIssuance() (gas: 72386)\n[PASS] test_ZeroAndSelfTransfersCannotSealOrCreateAllocationReceipts() (gas: 521375)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 238.71ms (238.76ms CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:ChunkedCertificationPropertiesTest\n[PASS] testFuzz_abandonedSessionIsInertAndRestartable(uint8,uint256) (runs: 128, μ: 2629966, ~: 2563152)\n[PASS] testFuzz_anyChunkingAndReductionScheduleMatchesSingleShot(uint8,uint256,uint256,uint256,uint8,uint8) (runs: 128, μ: 3856763, ~: 3580505)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 753.21ms (696.38ms CPU time)\n\nRan 3 tests for test/EvidenceAndOracleProperties.t.sol:OracleReferenceTest\n[PASS] testCheckpointReplacementRewritesOnlyTheCurrentSecond() (gas: 994219)\n[PASS] testFuzzFdvIsMonotonicInTheEthUsdAnswer(uint64,uint64) (runs: 256, μ: 750300, ~: 750530)\n[PASS] testFuzzTwapMatchesBruteForceReference(uint256) (runs: 160, μ: 2906909, ~: 2894424)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 786.34ms (1.30s CPU time)\n\nRan 1 test for test/StageOneInvariants.t.sol:StageOneInvariantTest\n[PASS]\nStageOneInvariantTest invariants:\n[PASS] invariant_onlyTheAuthorizedCallActivates\n[PASS] invariant_tokenAndClaimsIndependentOfTheHook\n[PASS] invariant_unconfiguredPoolIsInert\n StageOneInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| StageOneHandler | advance          | 464   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | attemptActivate  | 435   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | claimAndAttest   | 500   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | directSwap       | 475   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | foreignLiquidity | 498   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | routerSwap       | 493   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | syncAndMilestone | 503   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | transfer         | 472   | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 792.22ms (746.22ms CPU time)\n\nRan 3 tests for test/ManipulationEconomics.t.sol:ManipulationEconomicsTest\n[PASS] testCounterSellingOfAllInitialNonPoolTokens() (gas: 157719009)\nLogs:\n  gross ETH capital (wei): 404492004375936755769\n  attacker ETH exit (wei): 139667041180374722901\n  net ETH exit cost before fee recapture (wei): 264824963195562032868\n  payer ETH fee receipts (wei): 4044920043759367559\n  counter-seller ETH proceeds (wei): 259768813140862823404\n  duration seconds: 201600\n\n[PASS] testPayerCanRecaptureItsNativeFeeShare() (gas: 144653849)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n  net ETH cost after native fee recapture (wei): 653249186877100125\n\n[PASS] testSustainedManipulationUnlockAndExit() (gas: 144667569)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.68s (381.13ms CPU time)\n\nRan 9 tests for test/Trading.t.sol:TradingTest\n[PASS] testAnotherWalletCannotConsumeVictimsAllowanceOrQuota() (gas: 470687)\n[PASS] testDirectManagerAndForeignRouterSpoofingRejected() (gas: 644028)\n[PASS] testDonatedRouterBalancesCannotCreateCreditOrBeSwept() (gas: 496022)\n[PASS] testExactOutputSaleAccountsActualInput() (gas: 732168)\n[PASS] testExcessSaleRollsBackPoolBalancesOracleAndNonce() (gas: 797176)\n[PASS] testFuzzQuotaBoundary(uint96) (runs: 256, μ: 1032688, ~: 1032869)\n[PASS] testReplayOldCallbackHasNoLiveContext() (gas: 425843)\n[PASS] testSaleBoundaryExecutedInputIncludesPoolFee() (gas: 1062165)\n[PASS] testTransfersDoNotMoveRightsOrAllowChainCredit() (gas: 827129)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.65s (1.62s CPU time)\n\nRan 17 tests for test/FailurePaths.t.sol:RouterAndHookFailurePathsTest\n[PASS] testBatchBoundsAndValueMustMatch() (gas: 186758)\n[PASS] testBatchIsAtomicWhenALaterStepFails() (gas: 830450)\n[PASS] testConfirmationRequiresSixHoursAndCannotSkipTiers() (gas: 15340175)\n[PASS] testFullUnlockKeepsFeesAndRouterAuthentication() (gas: 137004282)\n[PASS] testFuzzOperationHashBindsTraderNonceAndChain(address,uint256,uint64) (runs: 256, μ: 17656, ~: 17656)\n[PASS] testFuzzRemainingQuotaFormula(uint128,uint128,uint8) (runs: 512, μ: 7293369, ~: 7293203)\n[PASS] testFuzzTierIsMonotonicInFdv(uint256,uint256) (runs: 512, μ: 16959, ~: 16923)\n[PASS] testFuzzTransfersMoveExactlyTheAmount(address,uint96) (runs: 256, μ: 122011, ~: 122463)\n[PASS] testHookRejectsMalformedRouteDataAndUnknownSenders() (gas: 238753)\n[PASS] testPartialFillAtPriceLimitChargesOnlyExecutedInput() (gas: 1208964)\n[PASS] testQuotaWidensWithTierAndNeverDoubleCounts() (gas: 16785891)\n[PASS] testRequesterChangeAfterActivationDoesNotMoveThePayer() (gas: 146383)\n[PASS] testRouterCallbackNeedsALiveSwap() (gas: 73817)\n[PASS] testRouterRefusesDegenerateRequests() (gas: 500273)\n[PASS] testSecondRoundClaimsAccumulateOncePerRound() (gas: 995639)\n[PASS] testSlippageRefusalsLeaveNoTrace() (gas: 895597)\n[PASS] testSyncForStrangerAndZeroAddressCreatesNothing() (gas: 108400)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 1.69s (3.25s CPU time)\n\nRan 5 tests for test/BatchSettlementProperties.t.sol:BatchSettlementPropertiesTest\n[PASS] testFuzz_BatchEqualsSequentialExecution(uint256,uint8,bool) (runs: 1000, μ: 4472012, ~: 4045901)\n[PASS] testFuzz_FailureAtAnyBatchIndexRestoresAllowancesFeesAndCredits(uint256,uint8) (runs: 1000, μ: 11357585, ~: 11049725)\n[PASS] test_MaximumMixedBatchOnFreshTokenOnlyManager() (gas: 9205385)\n[PASS] test_OneWeiShortAllowanceRestoresEntireBatchAndRetryWorks() (gas: 1867639)\n[PASS] test_PartialSaleMayPrefundMoreThanQuotaButChargesOnlyExecution() (gas: 903643)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.69s (3.17s CPU time)\n\nRan 1 test for test/Invariants.t.sol:SystemInvariantTest\n[PASS]\nSystemInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n SystemInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 906   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 862   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 809   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 832   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 836   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 875   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.12s (2.07s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:MilestoneSampleInvariantTest\n[PASS]\nMilestoneSampleInvariantTest invariants:\n[PASS] invariant_confirmationNeedsAnUnbrokenChainOfValidSamples\n[PASS] invariant_invalidSamplesNeverAdvanceTiers\n[PASS] invariant_nothingEverRelocksAndStateIsConsistent\n MilestoneSampleInvariantTest invariants (runs: 48, calls: 1920, reverts: 0)\n\n╭------------------------+----------+-------+---------+----------╮\n| Contract               | Selector | Calls | Reverts | Discards |\n+================================================================+\n| MilestoneSampleHandler | advance  | 319   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | corrupt  | 329   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | heal     | 299   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | march    | 331   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | sample   | 322   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | setPrice | 320   | 0       | 0        |\n╰------------------------+----------+-------+---------+----------╯\n\n[PASS] testHandlerReachesTiersAndEveryCorruptionIsInvalid() (gas: 12640787)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.13s (2.08s CPU time)\n\nRan 1 test for test/Invariants.t.sol:FullyUnlockedInvariantTest\n[PASS]\nFullyUnlockedInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n[PASS] invariantUnlockRemainsPermanentDespiteInvalidFeed\n FullyUnlockedInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 906   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 862   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 809   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 832   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 836   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 875   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.19s (1.97s CPU time)\n\nRan 2 tests for test/QuotaInvariants.t.sol:QuotaInvariantTest\n[PASS]\nQuotaInvariantTest invariants:\n[PASS] invariant_configurationSealedAndRouteEnforced\n[PASS] invariant_ledgerMatchesExecutedDeltas\n[PASS] invariant_milestonesMonotonicAndConsistent\n[PASS] invariant_principalLockedAndFeeTermsFixed\n[PASS] invariant_routerNativeSolvency\n[PASS] invariant_salesNeverExceedQuota\n[PASS] invariant_supplyConservedAndNoCustody\n QuotaInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭--------------+-----------------+-------+---------+----------╮\n| Contract     | Selector        | Calls | Reverts | Discards |\n+=============================================================+\n| QuotaHandler | advance         | 336   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactIn      | 358   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactOut     | 372   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimAndAttest  | 411   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimFees       | 319   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | directSwap      | 352   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | donate          | 349   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | foreignActivate | 371   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellExactOut    | 367   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellOverQuota   | 352   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellWithinQuota | 704   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | setFeed         | 358   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sync            | 370   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | transfer        | 367   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | withdrawNative  | 374   | 0       | 0        |\n╰--------------+-----------------+-------+---------+----------╯\n\n[PASS] testHandlerActionsActuallyExecute() (gas: 23814275)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.12s (3.09s CPU time)\n\nRan 2 tests for test/TokenLedgerProperties.t.sol:TokenLedgerInvariantTest\n[PASS]\nTokenLedgerInvariantTest invariants:\n[PASS] invariant_BalancesAndAllowancesMatchIndependentLedger\n[PASS] invariant_OriginalReceiptsRemainSealedDespiteArbitraryTransfers\n TokenLedgerInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+-------------------+-------+---------+----------╮\n| Contract           | Selector          | Calls | Reverts | Discards |\n+=====================================================================+\n| TokenLedgerHandler | approve           | 2819  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| TokenLedgerHandler | refuseOverspend   | 2736  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| TokenLedgerHandler | refuseZeroAddress | 2698  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| TokenLedgerHandler | transfer          | 2773  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| TokenLedgerHandler | transferAll       | 2716  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| TokenLedgerHandler | transferFrom      | 2642  | 0       | 0        |\n╰--------------------+-------------------+-------+---------+----------╯\n\n[PASS] test_HandlerCoversFiniteInfiniteSelfRevokedAndFailedAllowancePaths() (gas: 2246042)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.58s (4.58s CPU time)\n\nRan 5 tests for test/FeeCustodyProperties.t.sol:FeeCustodyInvariantTest\n[PASS]\nFeeCustodyInvariantTest invariants:\n[PASS] invariant_FactoryAssetsBackEveryUnpaidFeeAndDonationsRemainSurplus\n[PASS] invariant_FeeCollectionCannotTouchPrincipalOrCreateQuota\n[PASS] invariant_RecipientsAndSettlementStayBoundToTheirActualOwners\n FeeCustodyInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------------+-------------------------+-------+---------+----------╮\n| Contract          | Selector                | Calls | Reverts | Discards |\n+==========================================================================+\n| FeeCustodyHandler | collect                 | 1836  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | donate                  | 1849  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | refuseInvalidOperations | 1731  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | rotateNetwork           | 1865  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | setRecipientMode        | 1828  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | tradePair               | 1831  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | transferRequester       | 1798  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | withdrawAccount         | 1829  | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| FeeCustodyHandler | withdrawNetwork         | 1817  | 0       | 0        |\n╰-------------------+-------------------------+-------+---------+----------╯\n\n[PASS] test_DeferredPayerDebtStaysWithOldWalletWhileNetworkDebtFollowsRecipient() (gas: 6370504)\n[PASS] test_ReentrantFeeCollectionHasNoSecondPrincipalOrFeeWithdrawal() (gas: 4128814)\n[PASS] test_ReentrantFeeWithdrawalsCannotPayEitherShareTwice() (gas: 4034961)\n[PASS] test_RejectingNetworkRecipientCannotHoldPayerFeesHostage() (gas: 3953536)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.61s (7.59s CPU time)\n\nRan 2 tests for test/ClaimLifecycleInvariants.t.sol:ClaimLifecycleInvariantsTest\n[PASS]\nClaimLifecycleInvariantsTest invariants:\n[PASS] invariant_DistributorReservesAndCashMatchIndependentRoundModel\n[PASS] invariant_FixedSupplyAndInitialReceiptsSurviveAllClaimSequences\n[PASS] invariant_OnlyDeliveredAttestedAndSyncedClaimsCreateRights\n ClaimLifecycleInvariantsTest invariants (runs: 256, calls: 20480, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| ClaimLifecycleHandler | advance           | 1815  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | attest            | 1860  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | certify           | 1810  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | claim             | 1894  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | deliverAndSync    | 1893  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | openRound         | 1870  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sweep             | 1853  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sync              | 1860  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | syncPayer         | 1867  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | transferOrDonate  | 1896  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | unauthorizedRound | 1862  | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\n[PASS] test_ModelExercisesDelayedCertificationSweepsAndRecycledFunding() (gas: 4966220)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.07s (10.05s CPU time)\n\nRan 2 tests for test/NativeCustodyInvariants.t.sol:NativeCustodyInvariantsTest\n[PASS]\nNativeCustodyInvariantsTest invariants:\n[PASS] invariant_ManagerHasNoUnsettledDeltaOrReusableRouteContext\n[PASS] invariant_NativeLiabilitiesRemainFullyBackedAndBelongToTheirWallet\n[PASS] invariant_TransfersDonationsAndFailedBatchesCannotCreateOrMoveRights\n NativeCustodyInvariantsTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| NativeCustodyHandler | donateTokens | 2750  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | failBatch    | 2781  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | forceEther   | 2708  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | tradeBatch   | 2695  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | transfer     | 2700  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | withdraw     | 2750  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\n[PASS] test_HandlerTradesRejectsReentersAndDrainsWithoutTakingDonations() (gas: 5300451)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.06s (11.01s CPU time)\n\nRan 41 test suites in 11.07s (53.98s CPU time): 186 tests passed, 0 failed, 0 skipped (186 total tests)\n","passed":true},{"durationMs":125,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MerkleClaimEvidence.abandonSession(uint256)\",\"MerkleClaimEvidence.attest(uint256,address,uint256,bytes32[])\",\"MerkleClaimEvidence.certifyRound(uint256,address[],uint256[])\",\"MerkleClaimEvidence.reduce(uint256,uint256)\",\"MerkleClaimEvidence.submitLeaves(uint256,uint256,address[],uint256[])\",\"UnlkHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"UnlkHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"UnlkHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"UnlkHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"UnlkHook.configureAndActivate(address,address,address,uint64)\",\"UnlkHook.deployCompanions(uint64,address,bytes,bytes,bytes)\",\"UnlkHook.syncPayer()\",\"UnlkHook.syncRewards(address)\",\"UnlkHook.updateMilestone()\",\"UnlkOracle.bind((address,address,uint24,int24,address),address,int24,int24)\",\"UnlkOracle.checkpoint()\",\"UnlkSwapRouter.receive()\",\"UnlkSwapRouter.swap((bool,int256,uint160,uint256,uint256,uint256))\",\"UnlkSwapRouter.swapBatch((bool,int256,uint160,uint256,uint256,uint256)[])\",\"UnlkSwapRouter.unlockCallback(bytes)\",\"UnlkSwapRouter.withdrawNative()\",\"UnlkToken.approve(address,uint256)\",\"UnlkToken.transfer(address,uint256)\",\"UnlkToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DELIVERY.md\":78,\"LICENSE\":25,\"README.md\":153,\"RELEASE_STATUS.json\":49,\"delivery/OPERATIONS.md\":112,\"delivery/PACKAGE_SHA256SUMS\":566,\"delivery/STATUS.json\":151,\"delivery/checks/abi-export.txt\":1,\"delivery/checks/artifact-export.txt\":1,\"delivery/checks/build.txt\":21,\"delivery/checks/current-block-fork.txt\":24,\"delivery/checks/extended-fork.txt\":27,\"delivery/checks/final-fmt.txt\":0,\"delivery/checks/final-integrity.txt\":8,\"delivery/checks/fmt.txt\":0,\"delivery/checks/historical-block-fork.txt\":25,\"delivery/checks/imd-launch.txt\":1,\"delivery/checks/integrity.txt\":12,\"delivery/checks/lint.txt\":372,\"delivery/checks/live-rpc.txt\":1,\"delivery/checks/minimal-environment.txt\":505,\"delivery/checks/protected.txt\":22,\"delivery/checks/release-gates.txt\":10,\"delivery/checks/reviewed-code.txt\":1,\"delivery/checks/rpc-tools.txt\":1,\"delivery/checks/saved-network.txt\":7,\"delivery/checks/signing-tools.txt\":5,\"delivery/checks/source-hashes.txt\":458,\"delivery/checks/test.txt\":485,\"delivery/checks/upstream-rehearsal-build.txt\":8,\"delivery/network/block.json\":1,\"delivery/network/capabilities.json\":345,\"delivery/network/current-job.json\":217,\"delivery/network/factory.runtime.hex\":1,\"delivery/network/feed-check.json\":21,\"delivery/network/feed.runtime.hex\":1,\"delivery/network/fees.runtime.hex\":1,\"delivery/network/fix-job.json\":104,\"delivery/network/http-results.json\":117,\"delivery/network/import-check-paths-request.json\":33,\"delivery/network/import-check-paths-response.json\":25,\"delivery/network/import-check-request.json\":15,\"delivery/network/import-check-response.json\":25,\"delivery/network/import-request.json\":5,\"delivery/network/import-response.json\":17,\"delivery/network/manager.runtime.hex\":1,\"delivery/network/openapi.json\":1383,\"delivery/network/platform-rebuild.json\":30,\"delivery/network/policies.json\":1430,\"delivery/network/preflight.json\":347,\"delivery/network/registry.runtime.hex\":1,\"delivery/network/rpc-access.json\":20,\"delivery/network/selected-policy.json\":34,\"delivery/network/services.json\":29,\"delivery/protected-inputs.json\":4,\"delivery/provenance.json\":25,\"delivery/rehearsal/RecordedSepolia.t.sol\":200,\"delivery/source-files.json\":2492,\"delivery/verify.py\":163,\"dependencies.lock.json\":24,\"docs/ARTIFACTS.json\":64,\"docs/BUILD_RESULTS.txt\":21,\"docs/BYTECODE_COMPARISON_RESULTS.txt\":8,\"docs/DEPLOYMENT.md\":158,\"docs/ECONOMICS_RESULTS.txt\":49,\"docs/FMT_RESULTS.txt\":0,\"docs/FORK_RESULTS.txt\":24,\"docs/IMD_LAUNCH_CHECK_RESULTS.txt\":1,\"docs/LINT_RESULTS.txt\":372,\"docs/MINIMAL_ENV_TEST_RESULTS.txt\":543,\"docs/NETWORK_VERIFICATION_RESULTS.txt\":7,\"docs/PROTECTED_TEST_RESULTS.txt\":22,\"docs/RECOVERY.md\":65,\"docs/RELEASE_ARTIFACT_TEST_RESULTS.txt\":10,\"docs/SECURITY_REVIEW.md\":128,\"docs/SIZE_FIX.md\":146,\"docs/SOURCE_SHA256SUMS\":458,\"docs/SOURCE_VERIFICATION_RESULTS.txt\":458,\"docs/TEST_RESULTS.txt\":485,\"docs/VALIDATION.md\":131,\"docs/abi/CheckReleaseConfig.json\":46,\"docs/abi/HookDeployer.json\":94,\"docs/abi/IChainlinkEthUsd.json\":48,\"docs/abi/IClaimEvidence.json\":47,\"docs/abi/IHooks.json\":789,\"docs/abi/ILaunchFactoryView.json\":115,\"docs/abi/ILaunchRegistryView.json\":70,\"docs/abi/IMerkleDistributor.json\":125,\"docs/abi/IPoolManager.json\":1286,\"docs/abi/IRouteContext.json\":20,\"docs/abi/LaunchFactory.json\":896,\"docs/abi/LaunchFees.json\":323,\"docs/abi/LaunchRegistry.json\":320,\"docs/abi/MerkleClaimEvidence.json\":461,\"docs/abi/MerkleDistributor.json\":451,\"docs/abi/Stage2.json\":225,\"docs/abi/UnlkHook.json\":1973,\"docs/abi/UnlkOracle.json\":443,\"docs/abi/UnlkSwapRouter.json\":359,\"docs/abi/UnlkToken.json\":425,\"docs/network/capabilities.json\":345,\"docs/network/factory-artifacts.json\":2201,\"docs/network/factory-reference.json\":420,\"docs/network/factory.runtime.hex\":1,\"docs/network/feed-reference.json\":67,\"docs/network/feed-rounds.json\":134,\"docs/network/feed.runtime.hex\":1,\"docs/network/fees.runtime.hex\":1,\"docs/network/job-identity.json\":14,\"docs/network/manager.runtime.hex\":1,\"docs/network/policies.json\":36,\"docs/network/registry-reference.json\":108,\"docs/network/registry.runtime.hex\":1,\"docs/network/sepolia.json\":309,\"docs/network/services.json\":29,\"docs/network/size-fix-status.json\":126,\"foundry.toml\":31,\"launch.json\":35,\"rehearsal/Sepolia.t.sol\":112,\"remappings.txt\":4,\"script/CheckReleaseConfig.s.sol\":85,\"script/LocalDemo.s.sol\":41,\"script/Stage2.s.sol\":98,\"scripts/check.sh\":12,\"scripts/check_protected.py\":31,\"scripts/export_abis.py\":33,\"scripts/generate_code_checks.py\":22,\"scripts/mine-hook.sh\":9,\"scripts/prepare_claim_tree.py\":37,\"scripts/rehearse-sepolia.sh\":4,\"scripts/release_artifacts.py\":56,\"scripts/verify_network.py\":46,\"src/HookDeployer.sol\":37,\"src/HookFlags.sol\":45,\"src/MerkleClaimEvidence.sol\":200,\"src/UnlkHook.sol\":719,\"src/UnlkOracle.sol\":190,\"src/UnlkSwapRouter.sol\":225,\"src/UnlkToken.sol\":42,\"src/interfaces/IIntegration.sol\":86,\"src/libraries/OperationHash.sol\":15,\"src/libraries/ReviewedCode.sol\":10,\"src/libraries/SeedDepth.sol\":41,\"src/libraries/SepoliaRelease.sol\":11,\"test/ADDITIONAL_COVERAGE.md\":94,\"test/ActivationRobustness.t.sol\":303,\"test/Adversarial.t.sol\":117,\"test/BatchSettlementProperties.t.sol\":272,\"test/ClaimLifecycleInvariants.t.sol\":444,\"test/CreditsAndFees.t.sol\":176,\"test/EvidenceAndOracleProperties.t.sol\":349,\"test/FailurePaths.t.sol\":581,\"test/FeeCustodyProperties.t.sol\":454,\"test/HookDeployer.t.sol\":96,\"test/Invariants.t.sol\":220,\"test/Launch.t.sol\":112,\"test/LocalScript.t.sol\":28,\"test/ManipulationEconomics.t.sol\":117,\"test/NativeCustodyInvariants.t.sol\":296,\"test/NativeLaunch.t.sol\":236,\"test/Oracle.t.sol\":422,\"test/QuotaInvariants.t.sol\":529,\"test/ReleaseConfig.t.sol\":32,\"test/RevisionProperties.t.sol\":593,\"test/SecurityRegression.t.sol\":337,\"test/Stage2Script.t.sol\":62,\"test/StageOneInvariants.t.sol\":281,\"test/TESTING_ADDITIONS.md\":106,\"test/TokenLedgerProperties.t.sol\":310,\"test/Trading.t.sol\":171,\"test/TwoStage.t.sol\":302,\"test/fixtures/LocalFixtures.sol\":59,\"test/fixtures/SystemFixture.sol\":372,\"test/imd/HookFlags.sol\":45,\"test/imd/LaunchFactory.sol\":375,\"test/imd/LaunchFees.sol\":73,\"test/imd/LaunchRegistry.sol\":109,\"test/imd/MerkleDistributor.sol\":181,\"test/imd/PoolFees.sol\":220,\"test/imd/README.md\":29,\"test/mocks/MockERC20.sol\":11,\"test/results/build.txt\":15,\"test/results/foundry-tests.txt\":554,\"test/results/protected-checks.txt\":22,\"test/results/release-checks.txt\":18,\"test/test_release_artifacts.py\":96},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"87c99c422522ae7ba50593acc14c13fe632b06480977f043897f3eba6584af74","verifiedTreeHash":"9f91b57841907a4df0231a1edebf737ca0dd90b6","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":17955,"exitCode":0,"name":"build","output":"Compiling 135 files with Solc 0.8.26\nSolc 0.8.26 finished in 17.82s\nCompiler run successful with warnings:\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/BatchSettlementProperties.t.sol:14:9:\n   |\n14 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/NativeCustodyInvariants.t.sol:15:9:\n   |\n15 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/UnlkHook.sol:209:5:\n    |\n209 |     function afterInitialize(address, PoolKey calldata key, uint160, int24)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":10846,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/HookDeployer.t.sol:HookDeployerTest\n[PASS] testChangedCreationBodyCannotMatchReviewedHash() (gas: 135903)\n[PASS] testChangedSetupAuthorityChangesHashAndCreate2Prediction() (gas: 226228)\n[PASS] testDeployedHelperFitsEvmCodeLimits() (gas: 8947)\n[PASS] testFuzzEncodesCallerSuppliedBytesAndFourAddresses(bytes,address,address,address,address) (runs: 256, μ: 24775, ~: 20352)\n[PASS] testReviewedHookInitCodeAndHash() (gas: 196628)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 9.35ms (8.72ms CPU time)\n\nRan 2 tests for test/LocalScript.t.sol:LocalScriptTest\n[PASS] testLocalScriptRefusesPublicChainId() (gas: 13983272)\n[PASS] testLocalSimulationFunctionDoesNotDependOnCaller() (gas: 63694238)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.28ms (9.81ms CPU time)\n\nRan 1 test for test/FailurePaths.t.sol:UnpaidLaunchTest\n[PASS] testNoRequesterMeansNoPayerCreditAnywhere() (gas: 1267642)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 36.22ms (832.40µs CPU time)\n\nRan 1 test for test/RevisionProperties.t.sol:RestagingIsolationTest\n[PASS] testAbandonedBundleIsInertAndMixedBundlesAreRefused() (gas: 7156292)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 36.74ms (1.38ms CPU time)\n\nRan 4 tests for test/SeedBoundary.t.sol:SeedBoundaryTest\n[PASS] testBuyLimitIsBoundedByTheSeedFloor() (gas: 390660)\n[PASS] testLimitsInsideTheRangeAreHonoured() (gas: 771508)\n[PASS] testSellIntoAnEmptyReserveRevertsWithoutState() (gas: 394827)\n[PASS] testSellThatDrainsTheReserveStopsAtTheSeedBoundary() (gas: 1586847)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 38.00ms (2.49ms CPU time)\n\nRan 10 tests for test/CreditsAndFees.t.sol:CreditsAndFeesTest\n[PASS] testAttestationRequiresActualClaimAndExactLeaf() (gas: 438961)\n[PASS] testClaimTransferAndPayerTransferDoNotDuplicateCredit() (gas: 577960)\n[PASS] testFeeCollectionDoesNotReducePrincipal() (gas: 647552)\n[PASS] testNativeClaimNeverDependsOnAdapterOrFeed() (gas: 1190278)\n[PASS] testNativeClaimThenAttestThenSyncThenSale() (gas: 1607696)\n[PASS] testNegativeLiquidityForbiddenEvenForFactory() (gas: 82464)\n[PASS] testProofReleaseAndDedupRemainNativeRules() (gas: 573172)\n[PASS] testSaleFeesCountGrossInputAndNeverCreditFeeRecipients() (gas: 1191477)\n[PASS] testUnauthorizedLiquidityAndDonationNoCredit() (gas: 232025)\n[PASS] testUnclaimedRewardsNotEligible() (gas: 39399)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 40.18ms (4.88ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] testCompanionsAreImmutablyBound() (gas: 37886)\n[PASS] testFactoryHoldsPrincipalAndCannotRemoveIt() (gas: 333697)\n[PASS] testLaunchAllocationAndLockedPrincipal() (gas: 191055)\n[PASS] testLaunchIsOnceAndDeployerOnly() (gas: 2731433)\n[PASS] testOnlyCanonicalManagerCanCallHook() (gas: 66479)\n[PASS] testPayerCreditExactDeduplicated() (gas: 137462)\n[PASS] testUnauthorizedFactoryAndWrongPoolRejected() (gas: 80623)\n[PASS] testUnconfiguredComponentsFailClosed() (gas: 42307)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 42.52ms (1.11ms CPU time)\n\nRan 1 test for test/EvidenceAndOracleProperties.t.sol:RouterDeadlineTest\n[PASS] testDeadlineIsInclusive() (gas: 423552)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 37.11ms (422.20µs CPU time)\n\nRan 5 tests for test/EvidenceAndOracleProperties.t.sol:MultiLeafEvidenceTest\n[PASS] testDecreasingEvidenceCannotRevokePreviouslyCreditedClaims() (gas: 1100730)\n[PASS] testProofsFromTheActualTreeCreditExactlyWhatWasDelivered() (gas: 2298063)\n[PASS] testSiblingCannotAttestAnotherWalletsClaim() (gas: 771322)\n[PASS] testSweptRoundFreezesEvidence() (gas: 1136164)\n[PASS] testTheTreeIsWellFormed() (gas: 40973)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 49.97ms (2.87ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:EvidenceCertificationRegressionTest\n[PASS] testActualLaterRoundClaimsHaveNoArtificialCumulativeCeiling() (gas: 1511648)\n[PASS] testDuplicateRecipientCannotOvercreditSmallerActualClaim() (gas: 441218)\n[PASS] testIncompleteTreeCannotBeCertified() (gas: 59593)\n[PASS] testOddTreeReconstructionAndPreCertificationNativeClaim() (gas: 580532)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 52.76ms (1.34ms CPU time)\n\nRan 3 tests for test/FailurePaths.t.sol:ActivationFailurePathsTest\n[PASS] testCompanionConstructorsRejectMissingInputs() (gas: 6057)\n[PASS] testCrossLaunchSetupIsRefusedInEveryDirection() (gas: 24766771)\n[PASS] testSepoliaRefusesLocallyClonedServicesEvenWithFeedAtPublishedAddress() (gas: 676766)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 52.48ms (13.23ms CPU time)\n\nRan 1 test for test/SecurityRegression.t.sol:LargeTreeCertificationTest\n[PASS] testMaximumSortedTreeFitsTransactionGasLimit() (gas: 15973574)\nLogs:\n  1024-leaf sorted certification gas: 13939470\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 63.47ms (28.16ms CPU time)\n\nRan 2 tests for test/Stage2Script.t.sol:Stage2ScriptTest\n[PASS] testStage2DeploysFromActualIdentitiesAndOwnerActivates() (gas: 7071565)\n[PASS] testStage2RefusesUnknownLaunchNumber() (gas: 33767)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 67.96ms (2.23ms CPU time)\n\nRan 2 tests for test/SecurityRegression.t.sol:StagingCreationRegressionTest\n[PASS] testCounterfeitConstructorIsRefusedBeforeAnyDeployment() (gas: 6413863)\n[PASS] testOnlySetupAuthorityMayStageAndOnlyUntilActivation() (gas: 12289760)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 69.95ms (3.34ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:CodeAuthenticationRegressionTest\n[PASS] testActivationExternalFailureRollsBackEveryBinding() (gas: 912953)\n[PASS] testInconsistentImmutablePatchesAreRejected() (gas: 2018871)\n[PASS] testLaterFactoryDonationsCannotRewriteInitialAllocationReceipts() (gas: 688934)\n[PASS] testRuntimeMutationCannotPassGetterChecks() (gas: 85252)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 72.79ms (7.16ms CPU time)\n\nRan 6 tests for test/ActivationRobustness.t.sol:ActivationRobustnessTest\n[PASS] testPolicySeedRecordsCapacityAndConfirmsTiers() (gas: 30575729)\n[PASS] testSeedBelowOpeningValueFloorCannotLaunch() (gas: 9054745)\n[PASS] testSeedBelowThePoolShareBandCannotLaunch() (gas: 9050786)\n[PASS] testSeedInsideTheOnePercentBandActivates() (gas: 15887629)\n[PASS] testStagingRunsActivationPreconditionsAndCanRepeat() (gas: 21576209)\n[PASS] testSubDustSeedRoundingStillActivates() (gas: 16247257)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 81.43ms (26.63ms CPU time)\n\nRan 2 tests for test/TwoStage.t.sol:StageOneConstructorTest\n[PASS] testConstructorRejectsMissingOrConflatedInputs() (gas: 8207)\n[PASS] testOnlyFactoryCanInitializeTheHooksPool() (gas: 43150)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 24.99ms (181.43µs CPU time)\n\nRan 3 tests for test/ReleaseConfig.t.sol:ReleaseConfigTest\n[PASS] testReadOnlyReleaseChecksOnLocalFixture() (gas: 2011487)\n[PASS] testReadOnlyReleaseChecksRejectWrongChainOrHash() (gas: 1903758)\n[PASS] testStageOneAloneCannotPassReleaseGate() (gas: 63801371)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 99.92ms (41.67ms CPU time)\n\nRan 13 tests for test/TwoStage.t.sol:StageOneTest\n[PASS] testActivationSealsAndCannotBeReplayed() (gas: 6134570)\n[PASS] testCrossLaunchNumberRejected() (gas: 5594038)\n[PASS] testFactoryLiquidityAllowedBeforeActivationButPrincipalStaysLocked() (gas: 37293)\n[PASS] testFirstTierConfirmsBelowTenEthActualReserves() (gas: 35619197)\n[PASS] testLaunchSucceedsWithoutCompanions() (gas: 122562)\n[PASS] testPayerCanTransferBeforeActivationWithoutLosingHistoricalCredit() (gas: 6125881)\n[PASS] testPayerCreditOnlyAfterActivationAndFromOriginalTransferReceipt() (gas: 6075022)\n[PASS] testRequesterReassignmentCannotMoveInitialAllocationCredit() (gas: 6081688)\n[PASS] testSepoliaRequiresPublishedChainlinkFeed() (gas: 5610561)\n[PASS] testSwapsSyncAndMilestonesRevertBeforeActivation() (gas: 6082593)\n[PASS] testTransfersAndNativeClaimsWorkBeforeActivationAndClaimIsCreditedLater() (gas: 6432841)\n[PASS] testUnauthorizedActivationRejected() (gas: 5606198)\n[PASS] testWrongContractsRejected() (gas: 6294420)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 42.83ms (22.49ms CPU time)\n\nRan 4 tests for test/ActivationRobustness.t.sol:ChunkedCertificationTest\n[PASS] testChunkBoundsAndSizeAreFixedByTheFirstChunk() (gas: 29517535)\n[PASS] testDuplicateAcrossChunksWrongRootAndForeignSessionsAreRefused() (gas: 231631551)\n[PASS] testSingleLeafRoundCertifiesThroughTheChunkedPath() (gas: 398202)\n[PASS] testSingleShotRefusesButChunksCertifyAndCredit() (gas: 124071664)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 109.24ms (87.15ms CPU time)\n\nRan 8 tests for test/SepoliaPins.t.sol:SepoliaPinsTest\n[PASS] testEmbeddedRuntimeMatchesThePins() (gas: 22518)\n[PASS] testLocalChainDoesNotConsultThePins() (gas: 10226069)\n[PASS] testSepoliaAcceptsThePinnedServicesAtInitialize() (gas: 10488386)\n[PASS] testSepoliaRefusesAnUnpinnedFactory() (gas: 6489939)\n[PASS] testSepoliaRefusesAnUnpinnedManager() (gas: 159347398)\n[PASS] testSepoliaRefusesLookalikeFeesBehindThePinnedFactory() (gas: 10451800)\n[PASS] testSepoliaRefusesLookalikeRegistryBehindThePinnedFactory() (gas: 10438631)\n[PASS] testSepoliaRefusesUnpinnedServicesAtInitialize() (gas: 10157187)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 88.99ms (103.79ms CPU time)\n\nRan 8 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test100PercentAloneIsNotFullUnlock() (gas: 7257766)\n[PASS] testArbitraryHookDataAndMultihopPayloadCannotSelectVictim() (gas: 89207)\n[PASS] testCallbacksAllRequireCanonicalManager() (gas: 211512)\n[PASS] testForeignPoolKeyRejectedEvenWithManagerPrank() (gas: 49882)\n[PASS] testNoMintPauseBlacklistUpgradeOrCounterResetEntrypoint() (gas: 114793)\n[PASS] testProtocolFeeChangeCannotSilentlyAlterTradingEconomics() (gas: 359163)\n[PASS] testQuotaMultiplicationDoesNotOverflowAtMaxEligible() (gas: 239235)\n[PASS] testTokenMintsWholeSupplyToDeployerOnly() (gas: 32832)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 127.91ms (11.84ms CPU time)\n\nRan 11 tests for test/NativeLaunch.t.sol:NativeWithdrawalTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136095725)\n[PASS] testNativeBatchSettlement() (gas: 870289)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1127528)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 453473)\n[PASS] testNativeSettlementResetsPriorSyncCurrency() (gas: 605836)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91930)\n[PASS] testNativeWithdrawalUsesCEIAndCannotDoubleWithdraw() (gas: 996338)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62586)\n[PASS] testOtherWalletCannotWithdrawNativeRefund() (gas: 461374)\n[PASS] testRejectingNativeWalletCanTradeAndRetryWithdrawal() (gas: 1074660)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29940461)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 143.81ms (126.40ms CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:SeedGatePropertiesTest\n[PASS] testFuzz_launchedSeedIsAlwaysLiquidAndRefusedSeedIsAlwaysBelowFloor(uint8) (runs: 96, μ: 11601450, ~: 9050824)\n[PASS] testFuzz_poolShareBandDecidesLaunchAndActivation(uint16) (runs: 96, μ: 11472285, ~: 9047728)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 145.58ms (216.10ms CPU time)\n\nRan 17 tests for test/Oracle.t.sol:OracleTest\n[PASS] testBadChainlinkRoundsAndAnswersFailClosed() (gas: 2352246)\n[PASS] testConfirmationGapRestartsRatherThanCountingUnobservedTime() (gas: 14857451)\n[PASS] testEveryTierAndPermanentUnlock() (gas: 136512808)\n[PASS] testFallingPricesNeverLowerReachedTier() (gas: 29259665)\n[PASS] testInvalidDataCannotCountTowardPendingConfirmationOrRevokeRights() (gas: 15083422)\n[PASS] testInvalidDataLongerThanGapRestartsOnNextValidCall() (gas: 694951)\n[PASS] testLongInvalidIntervalRestartsWhetherObservedOrNot() (gas: 807692)\n[PASS] testNegativeTickAveragesRoundConservativelyForBothOrders() (gas: 769389)\n[PASS] testObservedAndUnobservedInvalidIntervalsAgree() (gas: 29667292)\n[PASS] testOneBlockSpikeCannotConfirm() (gas: 740812)\n[PASS] testOracleCannotBeReboundOrConfiguredByAnyone() (gas: 73530)\n[PASS] testRealFeedCadenceCannotBeUsedToResetConfirmation() (gas: 18790257)\n[PASS] testSameTimestampManipulationHasNoTimeWeight() (gas: 760132)\n[PASS] testStaleCheckpointAndFeedPreventNewTierButNotTrades() (gas: 1332186)\n[PASS] testSustainedManipulationRequiresWindowAndConfirmation() (gas: 15128037)\n[PASS] testThresholdMappingBoundaries() (gas: 69776)\n[PASS] testWarmupAndExactWindow() (gas: 400906)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 149.14ms (145.08ms CPU time)\n\nRan 3 tests for test/SecurityRegression.t.sol:OracleOutageRegressionTest\n[PASS] testDepthDipInvalidatesWholeWindowAndRetainsReachedRights() (gas: 16317055)\n[PASS] testFinalTierRequiresItsOwnTwentyFourHours() (gas: 138827744)\n[PASS] testNextTierClockWaitsForItsOwnThreshold() (gas: 15295035)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 148.27ms (107.54ms CPU time)\n\nRan 1 test for test/StageOneInvariants.t.sol:StageOneInvariantTest\n[PASS]\nStageOneInvariantTest invariants:\n[PASS] invariant_onlyTheAuthorizedCallActivates\n[PASS] invariant_tokenAndClaimsIndependentOfTheHook\n[PASS] invariant_unconfiguredPoolIsInert\n StageOneInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| StageOneHandler | advance          | 477   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | attemptActivate  | 476   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | claimAndAttest   | 469   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | directSwap       | 479   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | foreignLiquidity | 475   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | routerSwap       | 472   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | syncAndMilestone | 490   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | transfer         | 502   | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 747.53ms (712.79ms CPU time)\n\nRan 3 tests for test/ManipulationEconomics.t.sol:ManipulationEconomicsTest\n[PASS] testCounterSellingOfAllInitialNonPoolTokens() (gas: 157505516)\nLogs:\n  gross ETH capital (wei): 404492004375936755769\n  attacker ETH exit (wei): 139667041180374722901\n  net ETH exit cost before fee recapture (wei): 264824963195562032868\n  payer ETH fee receipts (wei): 4044920043759367559\n  counter-seller ETH proceeds (wei): 259768813140862823404\n  duration seconds: 201600\n\n[PASS] testPayerCanRecaptureItsNativeFeeShare() (gas: 144656869)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n  net ETH cost after native fee recapture (wei): 653249186877100125\n\n[PASS] testSustainedManipulationUnlockAndExit() (gas: 144670589)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 956.86ms (319.31ms CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:ChunkedCertificationPropertiesTest\n[PASS] testFuzz_abandonedSessionIsInertAndRestartable(uint8,uint256) (runs: 128, μ: 2635567, ~: 2350086)\n[PASS] testFuzz_anyChunkingAndReductionScheduleMatchesSingleShot(uint8,uint256,uint256,uint256,uint8,uint8) (runs: 128, μ: 4000436, ~: 3684447)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.40s (1.38s CPU time)\n\nRan 9 tests for test/Trading.t.sol:TradingTest\n[PASS] testAnotherWalletCannotConsumeVictimsAllowanceOrQuota() (gas: 472208)\n[PASS] testDirectManagerAndForeignRouterSpoofingRejected() (gas: 644028)\n[PASS] testDonatedRouterBalancesCannotCreateCreditOrBeSwept() (gas: 497543)\n[PASS] testExactOutputSaleAccountsActualInput() (gas: 735195)\n[PASS] testExcessSaleRollsBackPoolBalancesOracleAndNonce() (gas: 800579)\n[PASS] testFuzzQuotaBoundary(uint96) (runs: 256, μ: 1037677, ~: 1037777)\n[PASS] testReplayOldCallbackHasNoLiveContext() (gas: 427364)\n[PASS] testSaleBoundaryExecutedInputIncludesPoolFee() (gas: 1067073)\n[PASS] testTransfersDoNotMoveRightsOrAllowChainCredit() (gas: 830532)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.54s (1.51s CPU time)\n\nRan 7 tests for test/NativeLaunch.t.sol:NativeLaunchTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136095724)\n[PASS] testNativeBatchSettlement() (gas: 870289)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1127517)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 453384)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91952)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62608)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29940461)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.62s (105.42ms CPU time)\n\nRan 3 tests for test/EvidenceAndOracleProperties.t.sol:OracleReferenceTest\n[PASS] testCheckpointReplacementRewritesOnlyTheCurrentSecond() (gas: 997263)\n[PASS] testFuzzFdvIsMonotonicInTheEthUsdAnswer(uint64,uint64) (runs: 256, μ: 751771, ~: 752041)\n[PASS] testFuzzTwapMatchesBruteForceReference(uint256) (runs: 160, μ: 2888626, ~: 2877386)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.62s (1.64s CPU time)\n\nRan 17 tests for test/FailurePaths.t.sol:RouterAndHookFailurePathsTest\n[PASS] testBatchBoundsAndValueMustMatch() (gas: 186758)\n[PASS] testBatchIsAtomicWhenALaterStepFails() (gas: 834234)\n[PASS] testConfirmationRequiresSixHoursAndCannotSkipTiers() (gas: 15341697)\n[PASS] testFullUnlockKeepsFeesAndRouterAuthentication() (gas: 137007309)\n[PASS] testFuzzOperationHashBindsTraderNonceAndChain(address,uint256,uint64) (runs: 256, μ: 17656, ~: 17656)\n[PASS] testFuzzRemainingQuotaFormula(uint128,uint128,uint8) (runs: 512, μ: 7293366, ~: 7293203)\n[PASS] testFuzzTierIsMonotonicInFdv(uint256,uint256) (runs: 512, μ: 16953, ~: 16923)\n[PASS] testFuzzTransfersMoveExactlyTheAmount(address,uint96) (runs: 256, μ: 122621, ~: 122463)\n[PASS] testHookRejectsMalformedRouteDataAndUnknownSenders() (gas: 238753)\n[PASS] testPartialFillAtPriceLimitChargesOnlyExecutedInput() (gas: 1213883)\n[PASS] testQuotaWidensWithTierAndNeverDoubleCounts() (gas: 16795708)\n[PASS] testRequesterChangeAfterActivationDoesNotMoveThePayer() (gas: 146383)\n[PASS] testRouterCallbackNeedsALiveSwap() (gas: 73817)\n[PASS] testRouterRefusesDegenerateRequests() (gas: 500273)\n[PASS] testSecondRoundClaimsAccumulateOncePerRound() (gas: 995639)\n[PASS] testSlippageRefusalsLeaveNoTrace() (gas: 899401)\n[PASS] testSyncForStrangerAndZeroAddressCreatesNothing() (gas: 108400)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 1.62s (1.69s CPU time)\n\nRan 5 tests for test/BatchSettlementProperties.t.sol:BatchSettlementPropertiesTest\n[PASS] testFuzz_BatchEqualsSequentialExecution(uint256,uint8,bool) (runs: 1000, μ: 4561832, ~: 4064469)\n[PASS] testFuzz_FailureAtAnyBatchIndexRestoresAllowancesFeesAndCredits(uint256,uint8) (runs: 1000, μ: 11408070, ~: 11108630)\n[PASS] test_MaximumMixedBatchOnFreshTokenOnlyManager() (gas: 9253895)\n[PASS] test_OneWeiShortAllowanceRestoresEntireBatchAndRetryWorks() (gas: 1872568)\n[PASS] test_PartialSaleMayPrefundMoreThanQuotaButChargesOnlyExecution() (gas: 906671)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.65s (3.14s CPU time)\n\nRan 1 test for test/Invariants.t.sol:SystemInvariantTest\n[PASS]\nSystemInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n SystemInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 845   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 852   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 834   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 862   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 876   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 851   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.79s (1.76s CPU time)\n\nRan 1 test for test/Invariants.t.sol:FullyUnlockedInvariantTest\n[PASS]\nFullyUnlockedInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n[PASS] invariantUnlockRemainsPermanentDespiteInvalidFeed\n FullyUnlockedInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 845   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 852   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 834   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 862   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 876   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 851   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.95s (1.75s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:MilestoneSampleInvariantTest\n[PASS]\nMilestoneSampleInvariantTest invariants:\n[PASS] invariant_confirmationNeedsAnUnbrokenChainOfValidSamples\n[PASS] invariant_invalidSamplesNeverAdvanceTiers\n[PASS] invariant_nothingEverRelocksAndStateIsConsistent\n MilestoneSampleInvariantTest invariants (runs: 48, calls: 1920, reverts: 0)\n\n╭------------------------+----------+-------+---------+----------╮\n| Contract               | Selector | Calls | Reverts | Discards |\n+================================================================+\n| MilestoneSampleHandler | advance  | 351   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | corrupt  | 305   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | heal     | 333   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | march    | 312   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | sample   | 304   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | setPrice | 315   | 0       | 0        |\n╰------------------------+----------+-------+---------+----------╯\n\n[PASS] testHandlerReachesTiersAndEveryCorruptionIsInvalid() (gas: 12640787)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.08s (2.04s CPU time)\n\nRan 2 tests for test/QuotaInvariants.t.sol:QuotaInvariantTest\n[PASS]\nQuotaInvariantTest invariants:\n[PASS] invariant_configurationSealedAndRouteEnforced\n[PASS] invariant_ledgerMatchesExecutedDeltas\n[PASS] invariant_milestonesMonotonicAndConsistent\n[PASS] invariant_principalLockedAndFeeTermsFixed\n[PASS] invariant_routerNativeSolvency\n[PASS] invariant_salesNeverExceedQuota\n[PASS] invariant_supplyConservedAndNoCustody\n QuotaInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭--------------+-----------------+-------+---------+----------╮\n| Contract     | Selector        | Calls | Reverts | Discards |\n+=============================================================+\n| QuotaHandler | advance         | 371   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactIn      | 358   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactOut     | 349   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimAndAttest  | 357   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimFees       | 363   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | directSwap      | 362   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | donate          | 356   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | foreignActivate | 387   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellExactOut    | 351   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellOverQuota   | 325   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellWithinQuota | 746   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | setFeed         | 376   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sync            | 343   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | transfer        | 358   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | withdrawNative  | 358   | 0       | 0        |\n╰--------------+-----------------+-------+---------+----------╯\n\n[PASS] testHandlerActionsActuallyExecute() (gas: 23822211)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.02s (2.98s CPU time)\n\nRan 2 tests for test/ClaimLifecycleInvariants.t.sol:ClaimLifecycleInvariantsTest\n[PASS]\nClaimLifecycleInvariantsTest invariants:\n[PASS] invariant_DistributorReservesAndCashMatchIndependentRoundModel\n[PASS] invariant_FixedSupplyAndInitialReceiptsSurviveAllClaimSequences\n[PASS] invariant_OnlyDeliveredAttestedAndSyncedClaimsCreateRights\n ClaimLifecycleInvariantsTest invariants (runs: 256, calls: 20480, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| ClaimLifecycleHandler | advance           | 1923  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | attest            | 1851  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | certify           | 1887  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | claim             | 1880  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | deliverAndSync    | 1837  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | openRound         | 1831  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sweep             | 1858  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sync              | 1790  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | syncPayer         | 1855  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | transferOrDonate  | 1906  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | unauthorizedRound | 1862  | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\n[PASS] test_ModelExercisesDelayedCertificationSweepsAndRecycledFunding() (gas: 4966220)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.58s (9.53s CPU time)\n\nRan 2 tests for test/NativeCustodyInvariants.t.sol:NativeCustodyInvariantsTest\n[PASS]\nNativeCustodyInvariantsTest invariants:\n[PASS] invariant_ManagerHasNoUnsettledDeltaOrReusableRouteContext\n[PASS] invariant_NativeLiabilitiesRemainFullyBackedAndBelongToTheirWallet\n[PASS] invariant_TransfersDonationsAndFailedBatchesCannotCreateOrMoveRights\n NativeCustodyInvariantsTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| NativeCustodyHandler | donateTokens | 2714  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | failBatch    | 2708  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | forceEther   | 2825  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | tradeBatch   | 2641  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | transfer     | 2714  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | withdraw     | 2782  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\n[PASS] test_HandlerTradesRejectsReentersAndDrainsWithoutTakingDonations() (gas: 5323166)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.69s (10.66s CPU time)\n\nRan 40 test suites in 10.70s (42.10s CPU time): 187 tests passed, 0 failed, 0 skipped (187 total tests)\n","passed":true},{"durationMs":145,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MerkleClaimEvidence.abandonSession(uint256)\",\"MerkleClaimEvidence.attest(uint256,address,uint256,bytes32[])\",\"MerkleClaimEvidence.certifyRound(uint256,address[],uint256[])\",\"MerkleClaimEvidence.reduce(uint256,uint256)\",\"MerkleClaimEvidence.submitLeaves(uint256,uint256,address[],uint256[])\",\"UnlkHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"UnlkHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"UnlkHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"UnlkHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"UnlkHook.configureAndActivate(address,address,address,uint64)\",\"UnlkHook.deployCompanions(uint64,address,bytes,bytes,bytes)\",\"UnlkHook.syncPayer()\",\"UnlkHook.syncRewards(address)\",\"UnlkHook.updateMilestone()\",\"UnlkOracle.bind((address,address,uint24,int24,address),address,int24,int24)\",\"UnlkOracle.checkpoint()\",\"UnlkSwapRouter.receive()\",\"UnlkSwapRouter.swap((bool,int256,uint160,uint256,uint256,uint256))\",\"UnlkSwapRouter.swapBatch((bool,int256,uint160,uint256,uint256,uint256)[])\",\"UnlkSwapRouter.unlockCallback(bytes)\",\"UnlkSwapRouter.withdrawNative()\",\"UnlkToken.approve(address,uint256)\",\"UnlkToken.transfer(address,uint256)\",\"UnlkToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DELIVERY.md\":103,\"LICENSE\":25,\"README.md\":167,\"RELEASE_STATUS.json\":53,\"delivery/OPERATIONS.md\":112,\"delivery/PACKAGE_SHA256SUMS\":566,\"delivery/STATUS.json\":213,\"delivery/checks/abi-export.txt\":1,\"delivery/checks/artifact-export.txt\":1,\"delivery/checks/build.txt\":21,\"delivery/checks/current-block-fork.txt\":24,\"delivery/checks/extended-fork.txt\":27,\"delivery/checks/final-fmt.txt\":0,\"delivery/checks/final-integrity.txt\":8,\"delivery/checks/fmt.txt\":0,\"delivery/checks/historical-block-fork.txt\":25,\"delivery/checks/imd-launch.txt\":1,\"delivery/checks/integrity.txt\":12,\"delivery/checks/lint.txt\":372,\"delivery/checks/live-rpc.txt\":1,\"delivery/checks/minimal-environment.txt\":505,\"delivery/checks/protected.txt\":22,\"delivery/checks/release-gates.txt\":10,\"delivery/checks/reviewed-code.txt\":1,\"delivery/checks/revision-fmt.txt\":1,\"delivery/checks/revision-fork.txt\":17,\"delivery/checks/revision-protected.txt\":22,\"delivery/checks/revision-test.txt\":980,\"delivery/checks/rpc-tools.txt\":1,\"delivery/checks/saved-network.txt\":7,\"delivery/checks/signing-tools.txt\":5,\"delivery/checks/source-hashes.txt\":458,\"delivery/checks/test.txt\":485,\"delivery/checks/upstream-rehearsal-build.txt\":8,\"delivery/network/block.json\":1,\"delivery/network/capabilities.json\":345,\"delivery/network/current-job.json\":217,\"delivery/network/factory.runtime.hex\":1,\"delivery/network/feed-check.json\":21,\"delivery/network/feed.runtime.hex\":1,\"delivery/network/fees.runtime.hex\":1,\"delivery/network/fix-job.json\":104,\"delivery/network/http-results.json\":117,\"delivery/network/import-check-paths-request.json\":33,\"delivery/network/import-check-paths-response.json\":25,\"delivery/network/import-check-request.json\":15,\"delivery/network/import-check-response.json\":25,\"delivery/network/import-request.json\":5,\"delivery/network/import-response.json\":17,\"delivery/network/manager.runtime.hex\":1,\"delivery/network/openapi.json\":1383,\"delivery/network/platform-rebuild.json\":30,\"delivery/network/policies.json\":1430,\"delivery/network/preflight.json\":347,\"delivery/network/registry.runtime.hex\":1,\"delivery/network/rpc-access.json\":20,\"delivery/network/selected-policy.json\":34,\"delivery/network/services.json\":29,\"delivery/protected-inputs.json\":4,\"delivery/provenance.json\":25,\"delivery/rehearsal/RecordedSepolia.t.sol\":200,\"delivery/source-files.json\":2492,\"delivery/verify.py\":163,\"dependencies.lock.json\":24,\"docs/ARTIFACTS.json\":64,\"docs/BUILD_RESULTS.txt\":21,\"docs/BYTECODE_COMPARISON_RESULTS.txt\":8,\"docs/DEPLOYMENT.md\":163,\"docs/ECONOMICS_RESULTS.txt\":49,\"docs/FMT_RESULTS.txt\":0,\"docs/FORK_RESULTS.txt\":24,\"docs/IMD_LAUNCH_CHECK_RESULTS.txt\":1,\"docs/LINT_RESULTS.txt\":372,\"docs/MINIMAL_ENV_TEST_RESULTS.txt\":543,\"docs/NETWORK_VERIFICATION_RESULTS.txt\":7,\"docs/PROTECTED_TEST_RESULTS.txt\":22,\"docs/RECOVERY.md\":65,\"docs/RELEASE_ARTIFACT_TEST_RESULTS.txt\":10,\"docs/REVISION_2026-10-13.md\":120,\"docs/SECURITY_REVIEW.md\":132,\"docs/SIZE_FIX.md\":150,\"docs/SOURCE_SHA256SUMS\":461,\"docs/SOURCE_VERIFICATION_RESULTS.txt\":458,\"docs/TEST_RESULTS.txt\":485,\"docs/VALIDATION.md\":135,\"docs/abi/CheckReleaseConfig.json\":46,\"docs/abi/HookDeployer.json\":94,\"docs/abi/IChainlinkEthUsd.json\":48,\"docs/abi/IClaimEvidence.json\":47,\"docs/abi/IHooks.json\":789,\"docs/abi/ILaunchFactoryView.json\":115,\"docs/abi/ILaunchRegistryView.json\":70,\"docs/abi/IMerkleDistributor.json\":125,\"docs/abi/IPoolManager.json\":1286,\"docs/abi/IRouteContext.json\":20,\"docs/abi/LaunchFactory.json\":896,\"docs/abi/LaunchFees.json\":323,\"docs/abi/LaunchRegistry.json\":320,\"docs/abi/MerkleClaimEvidence.json\":461,\"docs/abi/MerkleDistributor.json\":451,\"docs/abi/Stage2.json\":225,\"docs/abi/UnlkHook.json\":1973,\"docs/abi/UnlkOracle.json\":443,\"docs/abi/UnlkSwapRouter.json\":359,\"docs/abi/UnlkToken.json\":425,\"docs/network/capabilities.json\":345,\"docs/network/factory-artifacts.json\":2201,\"docs/network/factory-reference.json\":420,\"docs/network/factory.runtime.hex\":1,\"docs/network/feed-reference.json\":67,\"docs/network/feed-rounds.json\":134,\"docs/network/feed.runtime.hex\":1,\"docs/network/fees.runtime.hex\":1,\"docs/network/job-identity.json\":14,\"docs/network/manager.runtime.hex\":1,\"docs/network/policies.json\":36,\"docs/network/registry-reference.json\":108,\"docs/network/registry.runtime.hex\":1,\"docs/network/sepolia.json\":309,\"docs/network/services.json\":29,\"docs/network/size-fix-status.json\":126,\"foundry.toml\":31,\"launch.json\":35,\"rehearsal/Sepolia.t.sol\":112,\"remappings.txt\":4,\"script/CheckReleaseConfig.s.sol\":85,\"script/LocalDemo.s.sol\":41,\"script/Stage2.s.sol\":98,\"scripts/check.sh\":12,\"scripts/check_protected.py\":31,\"scripts/export_abis.py\":33,\"scripts/generate_code_checks.py\":22,\"scripts/mine-hook.sh\":9,\"scripts/prepare_claim_tree.py\":37,\"scripts/rehearse-sepolia.sh\":4,\"scripts/release_artifacts.py\":56,\"scripts/verify_network.py\":46,\"src/HookDeployer.sol\":37,\"src/HookFlags.sol\":45,\"src/MerkleClaimEvidence.sol\":200,\"src/UnlkHook.sol\":725,\"src/UnlkOracle.sol\":190,\"src/UnlkSwapRouter.sol\":242,\"src/UnlkToken.sol\":42,\"src/interfaces/IIntegration.sol\":88,\"src/libraries/OperationHash.sol\":15,\"src/libraries/ReviewedCode.sol\":10,\"src/libraries/SeedDepth.sol\":41,\"src/libraries/SepoliaRelease.sol\":11,\"test/ADDITIONAL_COVERAGE.md\":94,\"test/ActivationRobustness.t.sol\":303,\"test/Adversarial.t.sol\":115,\"test/BatchSettlementProperties.t.sol\":272,\"test/ClaimLifecycleInvariants.t.sol\":444,\"test/CreditsAndFees.t.sol\":180,\"test/EvidenceAndOracleProperties.t.sol\":347,\"test/FailurePaths.t.sol\":579,\"test/HookDeployer.t.sol\":98,\"test/Invariants.t.sol\":220,\"test/Launch.t.sol\":112,\"test/LocalScript.t.sol\":28,\"test/ManipulationEconomics.t.sol\":117,\"test/NativeCustodyInvariants.t.sol\":296,\"test/NativeLaunch.t.sol\":236,\"test/Oracle.t.sol\":422,\"test/QuotaInvariants.t.sol\":529,\"test/ReleaseConfig.t.sol\":32,\"test/RevisionProperties.t.sol\":593,\"test/SecurityRegression.t.sol\":337,\"test/SeedBoundary.t.sol\":94,\"test/SepoliaPins.t.sol\":180,\"test/Stage2Script.t.sol\":62,\"test/StageOneInvariants.t.sol\":281,\"test/Trading.t.sol\":171,\"test/TwoStage.t.sol\":302,\"test/fixtures/LocalFixtures.sol\":59,\"test/fixtures/SepoliaRuntime.sol\":28,\"test/fixtures/SystemFixture.sol\":372,\"test/imd/HookFlags.sol\":45,\"test/imd/LaunchFactory.sol\":375,\"test/imd/LaunchFees.sol\":73,\"test/imd/LaunchRegistry.sol\":109,\"test/imd/MerkleDistributor.sol\":181,\"test/imd/PoolFees.sol\":220,\"test/imd/README.md\":29,\"test/mocks/MockERC20.sol\":11,\"test/test_release_artifacts.py\":96},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9e5de3aca77ccefd83ad1ae80321cd2bb36d6957f5071f98680ff2055b8248a3","verifiedTreeHash":"f2a95fb5e81db09a591d9401fc6381688cec39ca","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":16953,"exitCode":0,"name":"build","output":"Compiling 132 files with Solc 0.8.26\nSolc 0.8.26 finished in 16.80s\nCompiler run successful with warnings:\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/BatchSettlementProperties.t.sol:14:9:\n   |\n14 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/NativeCustodyInvariants.t.sol:15:9:\n   |\n15 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n   --> src/UnlkHook.sol:205:5:\n    |\n205 |     function afterInitialize(address, PoolKey calldata key, uint160, int24)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":10837,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/HookDeployer.t.sol:HookDeployerTest\n[PASS] testChangedCreationBodyCannotMatchReviewedHash() (gas: 135884)\n[PASS] testChangedSetupAuthorityChangesHashAndCreate2Prediction() (gas: 226190)\n[PASS] testDeployedHelperFitsEvmCodeLimits() (gas: 8947)\n[PASS] testFuzzEncodesCallerSuppliedBytesAndFourAddresses(bytes,address,address,address,address) (runs: 256, μ: 20396, ~: 20352)\n[PASS] testReviewedHookInitCodeAndHash() (gas: 196590)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.48ms (6.91ms CPU time)\n\nRan 2 tests for test/LocalScript.t.sol:LocalScriptTest\n[PASS] testLocalScriptRefusesPublicChainId() (gas: 13983272)\n[PASS] testLocalSimulationFunctionDoesNotDependOnCaller() (gas: 68079045)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.02ms (10.52ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:EvidenceCertificationRegressionTest\n[PASS] testActualLaterRoundClaimsHaveNoArtificialCumulativeCeiling() (gas: 1510126)\n[PASS] testDuplicateRecipientCannotOvercreditSmallerActualClaim() (gas: 441218)\n[PASS] testIncompleteTreeCannotBeCertified() (gas: 59593)\n[PASS] testOddTreeReconstructionAndPreCertificationNativeClaim() (gas: 580532)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 21.04ms (1.17ms CPU time)\n\nRan 2 tests for test/TwoStage.t.sol:StageOneConstructorTest\n[PASS] testConstructorRejectsMissingOrConflatedInputs() (gas: 8207)\n[PASS] testOnlyFactoryCanInitializeTheHooksPool() (gas: 43150)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 20.99ms (251.79µs CPU time)\n\nRan 5 tests for test/EvidenceAndOracleProperties.t.sol:MultiLeafEvidenceTest\n[PASS] testDecreasingEvidenceCannotRevokePreviouslyCreditedClaims() (gas: 1100787)\n[PASS] testProofsFromTheActualTreeCreditExactlyWhatWasDelivered() (gas: 2298120)\n[PASS] testSiblingCannotAttestAnotherWalletsClaim() (gas: 771379)\n[PASS] testSweptRoundFreezesEvidence() (gas: 1136221)\n[PASS] testTheTreeIsWellFormed() (gas: 40973)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 23.43ms (1.98ms CPU time)\n\nRan 1 test for test/FailurePaths.t.sol:UnpaidLaunchTest\n[PASS] testNoRequesterMeansNoPayerCreditAnywhere() (gas: 1264616)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 33.87ms (998.41µs CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] testCompanionsAreImmutablyBound() (gas: 37886)\n[PASS] testFactoryHoldsPrincipalAndCannotRemoveIt() (gas: 333697)\n[PASS] testLaunchAllocationAndLockedPrincipal() (gas: 191055)\n[PASS] testLaunchIsOnceAndDeployerOnly() (gas: 2730017)\n[PASS] testOnlyCanonicalManagerCanCallHook() (gas: 66479)\n[PASS] testPayerCreditExactDeduplicated() (gas: 137462)\n[PASS] testUnauthorizedFactoryAndWrongPoolRejected() (gas: 80623)\n[PASS] testUnconfiguredComponentsFailClosed() (gas: 42307)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 37.08ms (1.42ms CPU time)\n\nRan 2 tests for test/SecurityRegression.t.sol:StagingCreationRegressionTest\n[PASS] testCounterfeitConstructorIsRefusedBeforeAnyDeployment() (gas: 6161976)\n[PASS] testOnlySetupAuthorityMayStageAndOnlyUntilActivation() (gas: 11784008)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 18.35ms (2.11ms CPU time)\n\nRan 1 test for test/EvidenceAndOracleProperties.t.sol:RouterDeadlineTest\n[PASS] testDeadlineIsInclusive() (gas: 422030)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 39.60ms (475.05µs CPU time)\n\nRan 1 test for test/RevisionProperties.t.sol:RestagingIsolationTest\n[PASS] testAbandonedBundleIsInertAndMixedBundlesAreRefused() (gas: 6919999)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 19.99ms (1.31ms CPU time)\n\nRan 2 tests for test/Stage2Script.t.sol:Stage2ScriptTest\n[PASS] testStage2DeploysFromActualIdentitiesAndOwnerActivates() (gas: 6832294)\n[PASS] testStage2RefusesUnknownLaunchNumber() (gas: 33767)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 44.93ms (2.07ms CPU time)\n\nRan 1 test for test/SecurityRegression.t.sol:LargeTreeCertificationTest\n[PASS] testMaximumSortedTreeFitsTransactionGasLimit() (gas: 15973574)\nLogs:\n  1024-leaf sorted certification gas: 13939470\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 48.97ms (28.11ms CPU time)\n\nRan 8 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test100PercentAloneIsNotFullUnlock() (gas: 7307385)\n[PASS] testArbitraryHookDataAndMultihopPayloadCannotSelectVictim() (gas: 89207)\n[PASS] testCallbacksAllRequireCanonicalManager() (gas: 211512)\n[PASS] testForeignPoolKeyRejectedEvenWithManagerPrank() (gas: 49882)\n[PASS] testNoMintPauseBlacklistUpgradeOrCounterResetEntrypoint() (gas: 114793)\n[PASS] testProtocolFeeChangeCannotSilentlyAlterTradingEconomics() (gas: 357261)\n[PASS] testQuotaMultiplicationDoesNotOverflowAtMaxEligible() (gas: 239235)\n[PASS] testTokenMintsWholeSupplyToDeployerOnly() (gas: 32832)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 53.52ms (15.53ms CPU time)\n\nRan 13 tests for test/TwoStage.t.sol:StageOneTest\n[PASS] testActivationSealsAndCannotBeReplayed() (gas: 5901690)\n[PASS] testCrossLaunchNumberRejected() (gas: 5361101)\n[PASS] testFactoryLiquidityAllowedBeforeActivationButPrincipalStaysLocked() (gas: 37293)\n[PASS] testFirstTierConfirmsBelowTenEthActualReserves() (gas: 35384808)\n[PASS] testLaunchSucceedsWithoutCompanions() (gas: 122562)\n[PASS] testPayerCanTransferBeforeActivationWithoutLosingHistoricalCredit() (gas: 5893013)\n[PASS] testPayerCreditOnlyAfterActivationAndFromOriginalTransferReceipt() (gas: 5842154)\n[PASS] testRequesterReassignmentCannotMoveInitialAllocationCredit() (gas: 5848820)\n[PASS] testSepoliaRequiresPublishedChainlinkFeed() (gas: 5377611)\n[PASS] testSwapsSyncAndMilestonesRevertBeforeActivation() (gas: 5849964)\n[PASS] testTransfersAndNativeClaimsWorkBeforeActivationAndClaimIsCreditedLater() (gas: 6199971)\n[PASS] testUnauthorizedActivationRejected() (gas: 5373249)\n[PASS] testWrongContractsRejected() (gas: 6061423)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 54.90ms (26.31ms CPU time)\n\nRan 3 tests for test/FailurePaths.t.sol:ActivationFailurePathsTest\n[PASS] testCompanionConstructorsRejectMissingInputs() (gas: 6057)\n[PASS] testCrossLaunchSetupIsRefusedInEveryDirection() (gas: 31144365)\n[PASS] testSepoliaRefusesLocallyClonedServicesEvenWithFeedAtPublishedAddress() (gas: 676754)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 64.58ms (29.68ms CPU time)\n\nRan 3 tests for test/ReleaseConfig.t.sol:ReleaseConfigTest\n[PASS] testReadOnlyReleaseChecksOnLocalFixture() (gas: 2011487)\n[PASS] testReadOnlyReleaseChecksRejectWrongChainOrHash() (gas: 1903758)\n[PASS] testStageOneAloneCannotPassReleaseGate() (gas: 75663436)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 99.89ms (63.73ms CPU time)\n\nRan 4 tests for test/ActivationRobustness.t.sol:ChunkedCertificationTest\n[PASS] testChunkBoundsAndSizeAreFixedByTheFirstChunk() (gas: 29517535)\n[PASS] testDuplicateAcrossChunksWrongRootAndForeignSessionsAreRefused() (gas: 231631551)\n[PASS] testSingleLeafRoundCertifiesThroughTheChunkedPath() (gas: 398202)\n[PASS] testSingleShotRefusesButChunksCertifyAndCredit() (gas: 124071664)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 105.10ms (62.29ms CPU time)\n\nRan 17 tests for test/Oracle.t.sol:OracleTest\n[PASS] testBadChainlinkRoundsAndAnswersFailClosed() (gas: 2352246)\n[PASS] testConfirmationGapRestartsRatherThanCountingUnobservedTime() (gas: 14857451)\n[PASS] testEveryTierAndPermanentUnlock() (gas: 136511302)\n[PASS] testFallingPricesNeverLowerReachedTier() (gas: 29259665)\n[PASS] testInvalidDataCannotCountTowardPendingConfirmationOrRevokeRights() (gas: 15083422)\n[PASS] testInvalidDataLongerThanGapRestartsOnNextValidCall() (gas: 694951)\n[PASS] testLongInvalidIntervalRestartsWhetherObservedOrNot() (gas: 807692)\n[PASS] testNegativeTickAveragesRoundConservativelyForBothOrders() (gas: 767868)\n[PASS] testObservedAndUnobservedInvalidIntervalsAgree() (gas: 29667292)\n[PASS] testOneBlockSpikeCannotConfirm() (gas: 739290)\n[PASS] testOracleCannotBeReboundOrConfiguredByAnyone() (gas: 73530)\n[PASS] testRealFeedCadenceCannotBeUsedToResetConfirmation() (gas: 18790257)\n[PASS] testSameTimestampManipulationHasNoTimeWeight() (gas: 758610)\n[PASS] testStaleCheckpointAndFeedPreventNewTierButNotTrades() (gas: 1329158)\n[PASS] testSustainedManipulationRequiresWindowAndConfirmation() (gas: 15126515)\n[PASS] testThresholdMappingBoundaries() (gas: 69776)\n[PASS] testWarmupAndExactWindow() (gas: 400906)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 141.32ms (154.66ms CPU time)\n\nRan 4 tests for test/SecurityRegression.t.sol:CodeAuthenticationRegressionTest\n[PASS] testActivationExternalFailureRollsBackEveryBinding() (gas: 913067)\n[PASS] testInconsistentImmutablePatchesAreRejected() (gas: 1782922)\n[PASS] testLaterFactoryDonationsCannotRewriteInitialAllocationReceipts() (gas: 688991)\n[PASS] testRuntimeMutationCannotPassGetterChecks() (gas: 84703)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 159.18ms (5.85ms CPU time)\n\nRan 7 tests for test/NativeLaunch.t.sol:NativeLaunchTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136092722)\n[PASS] testNativeBatchSettlement() (gas: 865791)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1124516)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 451888)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91952)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62608)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29938965)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 159.42ms (143.90ms CPU time)\n\nRan 11 tests for test/NativeLaunch.t.sol:NativeWithdrawalTest\n[PASS] testDeepNativePoolWarmsUpAndCanUnlock() (gas: 136092723)\n[PASS] testNativeBatchSettlement() (gas: 865791)\n[PASS] testNativeBuySellAndFeeDistribution() (gas: 1124527)\n[PASS] testNativeExactOutputRefundToAuthenticatedCaller() (gas: 451977)\n[PASS] testNativeSettlementResetsPriorSyncCurrency() (gas: 604340)\n[PASS] testNativeValueMismatchAndUnsolicitedSendRejected() (gas: 91930)\n[PASS] testNativeWithdrawalUsesCEIAndCannotDoubleWithdraw() (gas: 994842)\n[PASS] testOneSidedOpeningLocks87PercentWithoutEthFunding() (gas: 62586)\n[PASS] testOtherWalletCannotWithdrawNativeRefund() (gas: 459878)\n[PASS] testRejectingNativeWalletCanTradeAndRetryWithdrawal() (gas: 1073164)\n[PASS] testThinLaunchCannotUnlockFromInitialSpotOrTinyBuy() (gas: 29938965)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 163.22ms (144.38ms CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:SeedGatePropertiesTest\n[PASS] testFuzz_launchedSeedIsAlwaysLiquidAndRefusedSeedIsAlwaysBelowFloor(uint8) (runs: 96, μ: 11016245, ~: 9043814)\n[PASS] testFuzz_poolShareBandDecidesLaunchAndActivation(uint16) (runs: 96, μ: 11520394, ~: 9040783)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 202.19ms (185.47ms CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:ChunkedCertificationPropertiesTest\n[PASS] testFuzz_abandonedSessionIsInertAndRestartable(uint8,uint256) (runs: 128, μ: 2550347, ~: 2243045)\n[PASS] testFuzz_anyChunkingAndReductionScheduleMatchesSingleShot(uint8,uint256,uint256,uint256,uint8,uint8) (runs: 128, μ: 3723591, ~: 3401985)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 557.01ms (183.22ms CPU time)\n\nRan 3 tests for test/EvidenceAndOracleProperties.t.sol:OracleReferenceTest\n[PASS] testCheckpointReplacementRewritesOnlyTheCurrentSecond() (gas: 994219)\n[PASS] testFuzzFdvIsMonotonicInTheEthUsdAnswer(uint64,uint64) (runs: 256, μ: 750252, ~: 750529)\n[PASS] testFuzzTwapMatchesBruteForceReference(uint256) (runs: 160, μ: 2844153, ~: 2883447)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 593.79ms (330.83ms CPU time)\n\nRan 9 tests for test/Trading.t.sol:TradingTest\n[PASS] testAnotherWalletCannotConsumeVictimsAllowanceOrQuota() (gas: 470687)\n[PASS] testDirectManagerAndForeignRouterSpoofingRejected() (gas: 644028)\n[PASS] testDonatedRouterBalancesCannotCreateCreditOrBeSwept() (gas: 496022)\n[PASS] testExactOutputSaleAccountsActualInput() (gas: 732168)\n[PASS] testExcessSaleRollsBackPoolBalancesOracleAndNonce() (gas: 797176)\n[PASS] testFuzzQuotaBoundary(uint96) (runs: 256, μ: 1032895, ~: 1032869)\n[PASS] testReplayOldCallbackHasNoLiveContext() (gas: 425843)\n[PASS] testSaleBoundaryExecutedInputIncludesPoolFee() (gas: 1062165)\n[PASS] testTransfersDoNotMoveRightsOrAllowChainCredit() (gas: 827129)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 616.40ms (592.52ms CPU time)\n\nRan 1 test for test/StageOneInvariants.t.sol:StageOneInvariantTest\n[PASS]\nStageOneInvariantTest invariants:\n[PASS] invariant_onlyTheAuthorizedCallActivates\n[PASS] invariant_tokenAndClaimsIndependentOfTheHook\n[PASS] invariant_unconfiguredPoolIsInert\n StageOneInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| StageOneHandler | advance          | 484   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | attemptActivate  | 490   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | claimAndAttest   | 480   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | directSwap       | 464   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | foreignLiquidity | 467   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | routerSwap       | 480   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | syncAndMilestone | 479   | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| StageOneHandler | transfer         | 496   | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 813.28ms (787.75ms CPU time)\n\nRan 3 tests for test/SecurityRegression.t.sol:OracleOutageRegressionTest\n[PASS] testDepthDipInvalidatesWholeWindowAndRetainsReachedRights() (gas: 16312506)\n[PASS] testFinalTierRequiresItsOwnTwentyFourHours() (gas: 138827744)\n[PASS] testNextTierClockWaitsForItsOwnThreshold() (gas: 15293513)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.08s (146.19ms CPU time)\n\nRan 17 tests for test/FailurePaths.t.sol:RouterAndHookFailurePathsTest\n[PASS] testBatchBoundsAndValueMustMatch() (gas: 186758)\n[PASS] testBatchIsAtomicWhenALaterStepFails() (gas: 830450)\n[PASS] testConfirmationRequiresSixHoursAndCannotSkipTiers() (gas: 15340175)\n[PASS] testFullUnlockKeepsFeesAndRouterAuthentication() (gas: 137004282)\n[PASS] testFuzzOperationHashBindsTraderNonceAndChain(address,uint256,uint64) (runs: 256, μ: 17656, ~: 17656)\n[PASS] testFuzzRemainingQuotaFormula(uint128,uint128,uint8) (runs: 512, μ: 7293356, ~: 7293203)\n[PASS] testFuzzTierIsMonotonicInFdv(uint256,uint256) (runs: 512, μ: 16974, ~: 16923)\n[PASS] testFuzzTransfersMoveExactlyTheAmount(address,uint96) (runs: 256, μ: 121830, ~: 122457)\n[PASS] testHookRejectsMalformedRouteDataAndUnknownSenders() (gas: 238753)\n[PASS] testPartialFillAtPriceLimitChargesOnlyExecutedInput() (gas: 1208964)\n[PASS] testQuotaWidensWithTierAndNeverDoubleCounts() (gas: 16785891)\n[PASS] testRequesterChangeAfterActivationDoesNotMoveThePayer() (gas: 146383)\n[PASS] testRouterCallbackNeedsALiveSwap() (gas: 73817)\n[PASS] testRouterRefusesDegenerateRequests() (gas: 500273)\n[PASS] testSecondRoundClaimsAccumulateOncePerRound() (gas: 995639)\n[PASS] testSlippageRefusalsLeaveNoTrace() (gas: 895597)\n[PASS] testSyncForStrangerAndZeroAddressCreatesNothing() (gas: 108400)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 1.29s (1.28s CPU time)\n\nRan 3 tests for test/ManipulationEconomics.t.sol:ManipulationEconomicsTest\n[PASS] testCounterSellingOfAllInitialNonPoolTokens() (gas: 157719009)\nLogs:\n  gross ETH capital (wei): 404492004375936755769\n  attacker ETH exit (wei): 139667041180374722901\n  net ETH exit cost before fee recapture (wei): 264824963195562032868\n  payer ETH fee receipts (wei): 4044920043759367559\n  counter-seller ETH proceeds (wei): 259768813140862823404\n  duration seconds: 201600\n\n[PASS] testPayerCanRecaptureItsNativeFeeShare() (gas: 144653849)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n  net ETH cost after native fee recapture (wei): 653249186877100125\n\n[PASS] testSustainedManipulationUnlockAndExit() (gas: 144667569)\nLogs:\n  gross ETH capital (wei): 181211119085726918584\n  attacker ETH exit (wei): 178745758707992549273\n  net ETH exit cost before fee recapture (wei): 2465360377734369311\n  payer ETH fee receipts (wei): 1812111190857269186\n  counter-seller ETH proceeds (wei): 0\n  duration seconds: 201600\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.38s (277.93ms CPU time)\n\nRan 6 tests for test/ActivationRobustness.t.sol:ActivationRobustnessTest\n[PASS] testPolicySeedRecordsCapacityAndConfirmsTiers() (gas: 30335357)\n[PASS] testSeedBelowOpeningValueFloorCannotLaunch() (gas: 9047798)\n[PASS] testSeedBelowThePoolShareBandCannotLaunch() (gas: 9043839)\n[PASS] testSeedInsideTheOnePercentBandActivates() (gas: 15647267)\n[PASS] testStagingRunsActivationPreconditionsAndCanRepeat() (gas: 21081828)\n[PASS] testSubDustSeedRoundingStillActivates() (gas: 16005370)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.58s (22.68ms CPU time)\n\nRan 10 tests for test/CreditsAndFees.t.sol:CreditsAndFeesTest\n[PASS] testAttestationRequiresActualClaimAndExactLeaf() (gas: 438961)\n[PASS] testClaimTransferAndPayerTransferDoNotDuplicateCredit() (gas: 577960)\n[PASS] testFeeCollectionDoesNotReducePrincipal() (gas: 646031)\n[PASS] testNativeClaimNeverDependsOnAdapterOrFeed() (gas: 846757)\n[PASS] testNativeClaimThenAttestThenSyncThenSale() (gas: 1280110)\n[PASS] testNegativeLiquidityForbiddenEvenForFactory() (gas: 82464)\n[PASS] testProofReleaseAndDedupRemainNativeRules() (gas: 573172)\n[PASS] testSaleFeesCountGrossInputAndNeverCreditFeeRecipients() (gas: 1188451)\n[PASS] testUnauthorizedLiquidityAndDonationNoCredit() (gas: 232025)\n[PASS] testUnclaimedRewardsNotEligible() (gas: 39399)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 1.61s (4.21ms CPU time)\n\nRan 5 tests for test/BatchSettlementProperties.t.sol:BatchSettlementPropertiesTest\n[PASS] testFuzz_BatchEqualsSequentialExecution(uint256,uint8,bool) (runs: 1000, μ: 4624561, ~: 4310088)\n[PASS] testFuzz_FailureAtAnyBatchIndexRestoresAllowancesFeesAndCredits(uint256,uint8) (runs: 1000, μ: 11402058, ~: 11246596)\n[PASS] test_MaximumMixedBatchOnFreshTokenOnlyManager() (gas: 9205385)\n[PASS] test_OneWeiShortAllowanceRestoresEntireBatchAndRetryWorks() (gas: 1867639)\n[PASS] test_PartialSaleMayPrefundMoreThanQuotaButChargesOnlyExecution() (gas: 903643)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.61s (3.13s CPU time)\n\nRan 1 test for test/Invariants.t.sol:SystemInvariantTest\n[PASS]\nSystemInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n SystemInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 843   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 901   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 800   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 841   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 857   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 878   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.72s (1.70s CPU time)\n\nRan 1 test for test/Invariants.t.sol:FullyUnlockedInvariantTest\n[PASS]\nFullyUnlockedInvariantTest invariants:\n[PASS] invariantEligibleEqualsOnlyExecutedBuysAndSynchronizedProofs\n[PASS] invariantNoActorExceedsItsQuotaBeforeUnlock\n[PASS] invariantPrincipalLiquidityNeverDecreases\n[PASS] invariantSupplyConservedAndRouterHasNoCustody\n[PASS] invariantUnlockRemainsPermanentDespiteInvalidFeed\n FullyUnlockedInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------+-------+---------+----------╮\n| Contract      | Selector | Calls | Reverts | Discards |\n+=======================================================+\n| ActionHandler | advance  | 843   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | buy      | 901   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | claim    | 800   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sell     | 841   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | sync     | 857   | 0       | 0        |\n|---------------+----------+-------+---------+----------|\n| ActionHandler | transfer | 878   | 0       | 0        |\n╰---------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.81s (1.67s CPU time)\n\nRan 2 tests for test/RevisionProperties.t.sol:MilestoneSampleInvariantTest\n[PASS]\nMilestoneSampleInvariantTest invariants:\n[PASS] invariant_confirmationNeedsAnUnbrokenChainOfValidSamples\n[PASS] invariant_invalidSamplesNeverAdvanceTiers\n[PASS] invariant_nothingEverRelocksAndStateIsConsistent\n MilestoneSampleInvariantTest invariants (runs: 48, calls: 1920, reverts: 0)\n\n╭------------------------+----------+-------+---------+----------╮\n| Contract               | Selector | Calls | Reverts | Discards |\n+================================================================+\n| MilestoneSampleHandler | advance  | 325   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | corrupt  | 296   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | heal     | 314   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | march    | 327   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | sample   | 331   | 0       | 0        |\n|------------------------+----------+-------+---------+----------|\n| MilestoneSampleHandler | setPrice | 327   | 0       | 0        |\n╰------------------------+----------+-------+---------+----------╯\n\n[PASS] testHandlerReachesTiersAndEveryCorruptionIsInvalid() (gas: 12640787)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.22s (2.20s CPU time)\n\nRan 2 tests for test/QuotaInvariants.t.sol:QuotaInvariantTest\n[PASS]\nQuotaInvariantTest invariants:\n[PASS] invariant_configurationSealedAndRouteEnforced\n[PASS] invariant_ledgerMatchesExecutedDeltas\n[PASS] invariant_milestonesMonotonicAndConsistent\n[PASS] invariant_principalLockedAndFeeTermsFixed\n[PASS] invariant_routerNativeSolvency\n[PASS] invariant_salesNeverExceedQuota\n[PASS] invariant_supplyConservedAndNoCustody\n QuotaInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭--------------+-----------------+-------+---------+----------╮\n| Contract     | Selector        | Calls | Reverts | Discards |\n+=============================================================+\n| QuotaHandler | advance         | 364   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactIn      | 357   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | buyExactOut     | 363   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimAndAttest  | 376   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | claimFees       | 330   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | directSwap      | 385   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | donate          | 344   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | foreignActivate | 352   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellExactOut    | 361   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellOverQuota   | 362   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sellWithinQuota | 752   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | setFeed         | 346   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | sync            | 358   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | transfer        | 380   | 0       | 0        |\n|--------------+-----------------+-------+---------+----------|\n| QuotaHandler | withdrawNative  | 330   | 0       | 0        |\n╰--------------+-----------------+-------+---------+----------╯\n\n[PASS] testHandlerActionsActuallyExecute() (gas: 23814275)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.03s (3.01s CPU time)\n\nRan 2 tests for test/ClaimLifecycleInvariants.t.sol:ClaimLifecycleInvariantsTest\n[PASS]\nClaimLifecycleInvariantsTest invariants:\n[PASS] invariant_DistributorReservesAndCashMatchIndependentRoundModel\n[PASS] invariant_FixedSupplyAndInitialReceiptsSurviveAllClaimSequences\n[PASS] invariant_OnlyDeliveredAttestedAndSyncedClaimsCreateRights\n ClaimLifecycleInvariantsTest invariants (runs: 256, calls: 20480, reverts: 0)\n\n╭-----------------------+-------------------+-------+---------+----------╮\n| Contract              | Selector          | Calls | Reverts | Discards |\n+========================================================================+\n| ClaimLifecycleHandler | advance           | 1811  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | attest            | 1845  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | certify           | 1780  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | claim             | 1902  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | deliverAndSync    | 1799  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | openRound         | 1887  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sweep             | 1883  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | sync              | 1858  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | syncPayer         | 1918  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | transferOrDonate  | 1926  | 0       | 0        |\n|-----------------------+-------------------+-------+---------+----------|\n| ClaimLifecycleHandler | unauthorizedRound | 1871  | 0       | 0        |\n╰-----------------------+-------------------+-------+---------+----------╯\n\n[PASS] test_ModelExercisesDelayedCertificationSweepsAndRecycledFunding() (gas: 4966220)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.06s (9.04s CPU time)\n\nRan 2 tests for test/NativeCustodyInvariants.t.sol:NativeCustodyInvariantsTest\n[PASS]\nNativeCustodyInvariantsTest invariants:\n[PASS] invariant_ManagerHasNoUnsettledDeltaOrReusableRouteContext\n[PASS] invariant_NativeLiabilitiesRemainFullyBackedAndBelongToTheirWallet\n[PASS] invariant_TransfersDonationsAndFailedBatchesCannotCreateOrMoveRights\n NativeCustodyInvariantsTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+--------------+-------+---------+----------╮\n| Contract             | Selector     | Calls | Reverts | Discards |\n+==================================================================+\n| NativeCustodyHandler | donateTokens | 2714  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | failBatch    | 2797  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | forceEther   | 2691  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | tradeBatch   | 2760  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | transfer     | 2703  | 0       | 0        |\n|----------------------+--------------+-------+---------+----------|\n| NativeCustodyHandler | withdraw     | 2719  | 0       | 0        |\n╰----------------------+--------------+-------+---------+----------╯\n\n[PASS] test_HandlerTradesRejectsReentersAndDrainsWithoutTakingDonations() (gas: 5300451)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.67s (10.65s CPU time)\n\nRan 38 test suites in 10.69s (41.16s CPU time): 175 tests passed, 0 failed, 0 skipped (175 total tests)\n","passed":true},{"durationMs":114,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"MerkleClaimEvidence.abandonSession(uint256)\",\"MerkleClaimEvidence.attest(uint256,address,uint256,bytes32[])\",\"MerkleClaimEvidence.certifyRound(uint256,address[],uint256[])\",\"MerkleClaimEvidence.reduce(uint256,uint256)\",\"MerkleClaimEvidence.submitLeaves(uint256,uint256,address[],uint256[])\",\"UnlkHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"UnlkHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"UnlkHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"UnlkHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"UnlkHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"UnlkHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"UnlkHook.configureAndActivate(address,address,address,uint64)\",\"UnlkHook.deployCompanions(uint64,address,bytes,bytes,bytes)\",\"UnlkHook.syncPayer()\",\"UnlkHook.syncRewards(address)\",\"UnlkHook.updateMilestone()\",\"UnlkOracle.bind((address,address,uint24,int24,address),address,int24,int24)\",\"UnlkOracle.checkpoint()\",\"UnlkSwapRouter.receive()\",\"UnlkSwapRouter.swap((bool,int256,uint160,uint256,uint256,uint256))\",\"UnlkSwapRouter.swapBatch((bool,int256,uint160,uint256,uint256,uint256)[])\",\"UnlkSwapRouter.unlockCallback(bytes)\",\"UnlkSwapRouter.withdrawNative()\",\"UnlkToken.approve(address,uint256)\",\"UnlkToken.transfer(address,uint256)\",\"UnlkToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DELIVERY.md\":78,\"LICENSE\":25,\"README.md\":153,\"RELEASE_STATUS.json\":49,\"delivery/OPERATIONS.md\":112,\"delivery/PACKAGE_SHA256SUMS\":566,\"delivery/STATUS.json\":151,\"delivery/checks/abi-export.txt\":1,\"delivery/checks/artifact-export.txt\":1,\"delivery/checks/build.txt\":21,\"delivery/checks/current-block-fork.txt\":24,\"delivery/checks/extended-fork.txt\":27,\"delivery/checks/final-fmt.txt\":0,\"delivery/checks/final-integrity.txt\":8,\"delivery/checks/fmt.txt\":0,\"delivery/checks/historical-block-fork.txt\":25,\"delivery/checks/imd-launch.txt\":1,\"delivery/checks/integrity.txt\":12,\"delivery/checks/lint.txt\":372,\"delivery/checks/live-rpc.txt\":1,\"delivery/checks/minimal-environment.txt\":505,\"delivery/checks/protected.txt\":22,\"delivery/checks/release-gates.txt\":10,\"delivery/checks/reviewed-code.txt\":1,\"delivery/checks/rpc-tools.txt\":1,\"delivery/checks/saved-network.txt\":7,\"delivery/checks/signing-tools.txt\":5,\"delivery/checks/source-hashes.txt\":458,\"delivery/checks/test.txt\":485,\"delivery/checks/upstream-rehearsal-build.txt\":8,\"delivery/network/block.json\":1,\"delivery/network/capabilities.json\":345,\"delivery/network/current-job.json\":217,\"delivery/network/factory.runtime.hex\":1,\"delivery/network/feed-check.json\":21,\"delivery/network/feed.runtime.hex\":1,\"delivery/network/fees.runtime.hex\":1,\"delivery/network/fix-job.json\":104,\"delivery/network/http-results.json\":117,\"delivery/network/import-check-paths-request.json\":33,\"delivery/network/import-check-paths-response.json\":25,\"delivery/network/import-check-request.json\":15,\"delivery/network/import-check-response.json\":25,\"delivery/network/import-request.json\":5,\"delivery/network/import-response.json\":17,\"delivery/network/manager.runtime.hex\":1,\"delivery/network/openapi.json\":1383,\"delivery/network/platform-rebuild.json\":30,\"delivery/network/policies.json\":1430,\"delivery/network/preflight.json\":347,\"delivery/network/registry.runtime.hex\":1,\"delivery/network/rpc-access.json\":20,\"delivery/network/selected-policy.json\":34,\"delivery/network/services.json\":29,\"delivery/protected-inputs.json\":4,\"delivery/provenance.json\":25,\"delivery/rehearsal/RecordedSepolia.t.sol\":200,\"delivery/source-files.json\":2492,\"delivery/verify.py\":163,\"dependencies.lock.json\":24,\"docs/ARTIFACTS.json\":64,\"docs/BUILD_RESULTS.txt\":21,\"docs/BYTECODE_COMPARISON_RESULTS.txt\":8,\"docs/DEPLOYMENT.md\":158,\"docs/ECONOMICS_RESULTS.txt\":49,\"docs/FMT_RESULTS.txt\":0,\"docs/FORK_RESULTS.txt\":24,\"docs/IMD_LAUNCH_CHECK_RESULTS.txt\":1,\"docs/LINT_RESULTS.txt\":372,\"docs/MINIMAL_ENV_TEST_RESULTS.txt\":543,\"docs/NETWORK_VERIFICATION_RESULTS.txt\":7,\"docs/PROTECTED_TEST_RESULTS.txt\":22,\"docs/RECOVERY.md\":65,\"docs/RELEASE_ARTIFACT_TEST_RESULTS.txt\":10,\"docs/SECURITY_REVIEW.md\":128,\"docs/SIZE_FIX.md\":146,\"docs/SOURCE_SHA256SUMS\":458,\"docs/SOURCE_VERIFICATION_RESULTS.txt\":458,\"docs/TEST_RESULTS.txt\":485,\"docs/VALIDATION.md\":131,\"docs/abi/CheckReleaseConfig.json\":46,\"docs/abi/HookDeployer.json\":94,\"docs/abi/IChainlinkEthUsd.json\":48,\"docs/abi/IClaimEvidence.json\":47,\"docs/abi/IHooks.json\":789,\"docs/abi/ILaunchFactoryView.json\":115,\"docs/abi/ILaunchRegistryView.json\":70,\"docs/abi/IMerkleDistributor.json\":125,\"docs/abi/IPoolManager.json\":1286,\"docs/abi/IRouteContext.json\":20,\"docs/abi/LaunchFactory.json\":896,\"docs/abi/LaunchFees.json\":323,\"docs/abi/LaunchRegistry.json\":320,\"docs/abi/MerkleClaimEvidence.json\":461,\"docs/abi/MerkleDistributor.json\":451,\"docs/abi/Stage2.json\":225,\"docs/abi/UnlkHook.json\":1973,\"docs/abi/UnlkOracle.json\":443,\"docs/abi/UnlkSwapRouter.json\":359,\"docs/abi/UnlkToken.json\":425,\"docs/network/capabilities.json\":345,\"docs/network/factory-artifacts.json\":2201,\"docs/network/factory-reference.json\":420,\"docs/network/factory.runtime.hex\":1,\"docs/network/feed-reference.json\":67,\"docs/network/feed-rounds.json\":134,\"docs/network/feed.runtime.hex\":1,\"docs/network/fees.runtime.hex\":1,\"docs/network/job-identity.json\":14,\"docs/network/manager.runtime.hex\":1,\"docs/network/policies.json\":36,\"docs/network/registry-reference.json\":108,\"docs/network/registry.runtime.hex\":1,\"docs/network/sepolia.json\":309,\"docs/network/services.json\":29,\"docs/network/size-fix-status.json\":126,\"foundry.toml\":31,\"launch.json\":35,\"rehearsal/Sepolia.t.sol\":112,\"remappings.txt\":4,\"script/CheckReleaseConfig.s.sol\":85,\"script/LocalDemo.s.sol\":41,\"script/Stage2.s.sol\":98,\"scripts/check.sh\":12,\"scripts/check_protected.py\":31,\"scripts/export_abis.py\":33,\"scripts/generate_code_checks.py\":22,\"scripts/mine-hook.sh\":9,\"scripts/prepare_claim_tree.py\":37,\"scripts/rehearse-sepolia.sh\":4,\"scripts/release_artifacts.py\":56,\"scripts/verify_network.py\":46,\"src/HookDeployer.sol\":37,\"src/HookFlags.sol\":45,\"src/MerkleClaimEvidence.sol\":200,\"src/UnlkHook.sol\":719,\"src/UnlkOracle.sol\":190,\"src/UnlkSwapRouter.sol\":225,\"src/UnlkToken.sol\":42,\"src/interfaces/IIntegration.sol\":86,\"src/libraries/OperationHash.sol\":15,\"src/libraries/ReviewedCode.sol\":10,\"src/libraries/SeedDepth.sol\":41,\"src/libraries/SepoliaRelease.sol\":11,\"test/ADDITIONAL_COVERAGE.md\":94,\"test/ActivationRobustness.t.sol\":303,\"test/Adversarial.t.sol\":117,\"test/BatchSettlementProperties.t.sol\":272,\"test/ClaimLifecycleInvariants.t.sol\":444,\"test/CreditsAndFees.t.sol\":176,\"test/EvidenceAndOracleProperties.t.sol\":349,\"test/FailurePaths.t.sol\":581,\"test/HookDeployer.t.sol\":96,\"test/Invariants.t.sol\":220,\"test/Launch.t.sol\":112,\"test/LocalScript.t.sol\":28,\"test/ManipulationEconomics.t.sol\":117,\"test/NativeCustodyInvariants.t.sol\":296,\"test/NativeLaunch.t.sol\":236,\"test/Oracle.t.sol\":422,\"test/QuotaInvariants.t.sol\":529,\"test/ReleaseConfig.t.sol\":32,\"test/RevisionProperties.t.sol\":593,\"test/SecurityRegression.t.sol\":337,\"test/Stage2Script.t.sol\":62,\"test/StageOneInvariants.t.sol\":281,\"test/Trading.t.sol\":171,\"test/TwoStage.t.sol\":302,\"test/fixtures/LocalFixtures.sol\":59,\"test/fixtures/SystemFixture.sol\":372,\"test/imd/HookFlags.sol\":45,\"test/imd/LaunchFactory.sol\":375,\"test/imd/LaunchFees.sol\":73,\"test/imd/LaunchRegistry.sol\":109,\"test/imd/MerkleDistributor.sol\":181,\"test/imd/PoolFees.sol\":220,\"test/imd/README.md\":29,\"test/mocks/MockERC20.sol\":11,\"test/test_release_artifacts.py\":96},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":3443,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/UnlkSwapRouter.sol:104: Reentrancy in UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166):\n[high/medium] reentrancy-balance at src/UnlkSwapRouter.sol:104: Reentrancy in UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166):\n[medium/medium] divide-before-multiply at src/UnlkOracle.sol:122: UnlkOracle.twapTick() (src/UnlkOracle.sol#122-147) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/UnlkOracle.sol:122: UnlkOracle.twapTick() (src/UnlkOracle.sol#122-147) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/UnlkOracle.sol:90: UnlkOracle.checkpoint() (src/UnlkOracle.sol#90-115) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/UnlkOracle.sol:90: UnlkOracle.checkpoint() (src/UnlkOracle.sol#90-115) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/UnlkHook.sol:478: Reentrancy in UnlkHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/UnlkHook.sol#478-509):\n[medium/medium] uninitialized-local at src/UnlkHook.sol:411: UnlkHook._verifyLaunchRecord(uint64).hookSeen (src/UnlkHook.sol#411) is a local variable never initialized\n[medium/medium] uninitialized-local at src/UnlkHook.sol:410: UnlkHook._verifyLaunchRecord(uint64).tokenSeen (src/UnlkHook.sol#410) is a local variable never initialized\n[medium/medium] uninitialized-local at src/UnlkHook.sol:669: UnlkHook._updateMilestone().fdv (src/UnlkHook.sol#669) is a local variable never initialized\n[medium/medium] uninitialized-local at src/UnlkSwapRouter.sol:114: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256).state (src/UnlkSwapRouter.sol#114) is a local variable never initialized\n[medium/medium] unused-return at src/UnlkHook.sol:363: UnlkHook._verifySeed() (src/UnlkHook.sol#363-374) ignores return value by (liquidity,None,None) = poolManager.getPositionInfo(poolId,launchFactory,seedTickLower,seedTickUpper,bytes32(0)) (src/UnlkHook.sol#364-365)\n[medium/medium] unused-return at src/UnlkOracle.sol:90: UnlkOracle.checkpoint() (src/UnlkOracle.sol#90-115) ignores return value by (liquidity,None,None) = poolManager.getPositionInfo(poolId,factory,rangeLowerTick,rangeUpperTick,bytes32(0)) (src/UnlkOracle.sol#93-94)\n[medium/medium] unused-return at src/UnlkHook.sol:531: UnlkHook._recordSeed(ModifyLiquidityParams) (src/UnlkHook.sol#531-549) ignores return value by (sqrtPrice,None,None,None) = poolManager.getSlot0(poolId) (src/UnlkHook.sol#536)\n[medium/medium] unused-return at src/UnlkHook.sol:456: UnlkHook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/UnlkHook.sol#456-476) ignores return value by (None,None,protocolFee,lpFee) = poolManager.getSlot0(poolId) (src/UnlkHook.sol#470)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:104: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166) has external calls inside a loop: outputBefore = state.outputToken.balanceOf(msg.sender) (src/UnlkSwapRouter.sol#155)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:104: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166) has external calls inside a loop: key = hook.poolKey() (src/UnlkSwapRouter.sol#113)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:104: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166) has external calls inside a loop: state.baseInput = state.inputToken.balanceOf(address(this)) (src/UnlkSwapRouter.sol#120-122)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:104: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166) has external calls inside a loop: state.outputToken.balanceOf(msg.sender) != outputBefore + output (src/UnlkSwapRouter.sol#157)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:104: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166) has external calls inside a loop: ! hook.activated() || block.timestamp > request.deadline || request.amountSpecified == 0 || request.amountSpecified == type()(int256).min || request.maxInput == 0 || request.maxInput > uint256(uint128(type()(int128).max)) || request.minOutput == 0 (src/UnlkSwapRouter.sol#109-111)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:104: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166) has external calls inside a loop: result = poolManager.unlock(abi.encode(key,params,operationNonce,request.maxInput)) (src/UnlkSwapRouter.sol#139)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:104: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166) has external calls inside a loop: state.baseOutput = state.outputToken.balanceOf(address(this)) (src/UnlkSwapRouter.sol#123-124)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:104: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166) has external calls inside a loop: state.inputToken.balanceOf(address(this)) != state.baseInput + request.maxInput (src/UnlkSwapRouter.sol#129)\n[low/medium] calls-loop at src/UnlkSwapRouter.sol:172: UnlkSwapRouter._balance(IERC20) (src/UnlkSwapRouter.sol#172-174) has external calls inside a loop: currency.balanceOf(address(this)) (src/UnlkSwapRouter.sol#173)\n[low/medium] reentrancy-benign at src/UnlkHook.sol:651: Reentrancy in UnlkHook.updateMilestone() (src/UnlkHook.sol#651-655):\n[low/medium] reentrancy-benign at src/UnlkSwapRouter.sol:104: Reentrancy in UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166):\n[low/medium] reentrancy-benign at src/UnlkHook.sol:478: Reentrancy in UnlkHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/UnlkHook.sol#478-509):\n[low/medium] reentrancy-events at src/UnlkHook.sol:478: Reentrancy in UnlkHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/UnlkHook.sol#478-509):\n[low/medium] reentrancy-events at src/UnlkHook.sol:275: Reentrancy in UnlkHook.configureAndActivate(address,IClaimEvidence,UnlkOracle,uint64) (src/UnlkHook.sol#275-324):\n[low/medium] reentrancy-events at src/UnlkHook.sol:651: Reentrancy in UnlkHook.updateMilestone() (src/UnlkHook.sol#651-655):\n[low/medium] timestamp at src/UnlkOracle.sol:122: UnlkOracle.twapTick() (src/UnlkOracle.sol#122-147) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkOracle.sol:90: UnlkOracle.checkpoint() (src/UnlkOracle.sol#90-115) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkSwapRouter.sol:104: UnlkSwapRouter._swap(UnlkSwapRouter.SwapRequest,uint256) (src/UnlkSwapRouter.sol#104-166) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkOracle.sol:166: UnlkOracle._ethUsd() (src/UnlkOracle.sol#166-179) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkHook.sol:667: UnlkHook._updateMilestone() (src/UnlkHook.sol#667-709) uses timestamp for comparisons\n[low/medium] timestamp at src/UnlkOracle.sol:150: UnlkOracle.fdvUsd() (src/UnlkOracle.sol#150-164) uses timestamp for comparisons","passed":true},{"durationMs":669,"exitCode":0,"name":"aderyn","output":"[high] eth-send-unchecked-address at src/UnlkSwapRouter.sol:184: ETH transferred without address checks\n[high] reentrancy-state-change at src/MerkleClaimEvidence.sol:190: Reentrancy: State change after external call (8 places)\n[high] unprotected-initializer at src/HookDeployer.sol:19: Unprotected initializer (2 places)\n[low] costly-loop at src/MerkleClaimEvidence.sol:121: Costly operations inside loop (3 places)\n[low] internal-function-used-once at src/HookFlags.sol:35: Internal Function Used Only Once (2 places)\n[low] large-numeric-literal at src/UnlkHook.sol:69: Large Numeric Literal (16 places)\n[low] literal-instead-of-constant at src/UnlkHook.sol:463: Literal Instead of Constant (13 places)\n[low] missing-inheritance at src/UnlkOracle.sol:15: Missing Inheritance\n[low] require-revert-in-loop at src/MerkleClaimEvidence.sol:75: Loop Contains `require`/`revert` (5 places)\n[low] state-change-without-event at src/UnlkHook.sol:456: State Change Without Event (4 places)\n[low] unchecked-return at src/UnlkHook.sol:335: Unchecked Return (2 places)\n[low] uninitialized-local-variable at src/MerkleClaimEvidence.sol:121: Uninitialized Local Variable (2 places)\n[low] unused-import at src/libraries/OperationHash.sol:4: Unused Import","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a915d214da2998e9279a1b65fcdfcb2f2963caaa9ed770232dd605303d3cb64c","verifiedTreeHash":"961a3ceda3828757dca7dc10bc0f5fd45431167f","verifierVersion":"0.1.0+327e1e9f"}]}