{"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":"5d73988a-559e-4021-8d51-a2a654a9d6e1","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"2bdf7dc3287b3fb7098838fcb4e47dee90161eaff94465dea942816a4bdc0b83","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"81b7052da6cdca6819abb4b1fb4924e31086633863b272c8ed89d9b24523ab82","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"81b7052da6cdca6819abb4b1fb4924e31086633863b272c8ed89d9b24523ab82","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"9ec7458f18d87cffe26830bcee057ee07dbc79235374d3c5d383935c9db9a764","dependsOn":["adapt_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":"e6c733805c97478e0d8150c12951f4eff46d7bc229b6950eba72ead057837ce3","dependsOn":["adapt_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":"c0c83e74382249e095e1d2357e729737abefa8562d27e5cce509edd9f0650654","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_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":"waiting"},{"acceptedSubmissionHash":"b9a826fcdc113a7253053d6d9b22515665b9aa45356e03691da2c98f5918937b","dependsOn":["adapt_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":"361fb8899eebc8366b11be1859a4b7843f277d07c93e9b361bd60e7393aa29a1","dependsOn":["adapt_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":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"failed"},{"acceptedSubmissionHash":"90819af54ca1b5087ee86bed44d300c1227d6bcbf09317e9a7a742c82a1f4fbf","dependsOn":["adapt_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":"This is a verification-only follow-up for existing launch 816.\nDo not create a new token, do not deploy onchain, and do not change any launch parameters.\n\nRepository:\nhttps://github.com/identity-md-launches/launch-816-imd-index\n\nOriginal launch job:\n6321056b-a125-48f2-9c7a-81cc8695a1f2\n\nRepair job:\n8a5d5e50-f972-4a86-ab69-1442ed0cc957\n\nThe repaired code is merged on main at:\n3a26e979a5198fa515ded5a32e28b6c34902001b\n\nUsing the exact existing launch 816 configuration, verify:\n\n1. The repaired commit is the source being checked.\n2. All seven application contracts deploy through the real launch-factory simulation path.\n3. FeeHookDeployer constructor arguments and contract references resolve correctly.\n4. The exact original launch parameters are preserved.\n5. Manifest, source commit, tree hash, attestation, and bytecode are consistent.\n6. No roles are assigned automatically.\n7. Full tests, verifier checks, and fork simulation pass.\n8. Report gas used, gas limit, safety margin, and any unresolved risk.\n\nReturn a concise GO / NO-GO report. If anything is unresolved, stop. Do not invent parameters and do not launch.","parentJobId":null,"planHash":"dd27433516d28bebc1dbd04f9fd692ae4027798f5403953817ee56bc56ae26de","previousHash":"774dccbb75a80832cfd5c6a6dcbe7fa5d80f1d3d257c63f846f0c383a7b96f91","projectId":"5d73988a-559e-4021-8d51-a2a654a9d6e1","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1141-verification-only-follow-up-existing-lau"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52480","feedbackHash":"b8dcb6b18e7b3665db7b252a69955a56bf3de2a1aa0e337935dc157eb55ebbb2","nodeKey":"audit_economics","submissionHash":"9ec7458f18d87cffe26830bcee057ee07dbc79235374d3c5d383935c9db9a764","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52481","feedbackHash":"ae5138d9d810c3ae523e0b398b8dcdeeb40ce849fcddca37ce9ece3108325997","nodeKey":"audit_flow","submissionHash":"e6c733805c97478e0d8150c12951f4eff46d7bc229b6950eba72ead057837ce3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51082","feedbackHash":"08e760c0c9a5858b8121120ce0bb83d11b4356af567ce1b947873778f58259d5","nodeKey":"audit_math","submissionHash":"b9a826fcdc113a7253053d6d9b22515665b9aa45356e03691da2c98f5918937b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52478","feedbackHash":"d4261003a573359e06d505d217da2331651bf19bf587b9cb1a678bfa61bd41e8","nodeKey":"audit_permissions","submissionHash":"361fb8899eebc8366b11be1859a4b7843f277d07c93e9b361bd60e7393aa29a1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51319","feedbackHash":"1ebace65f25f2d51ba753df4aeef8cfd29956eacdd170807afe2f2dd3244fcd5","nodeKey":"write_foundry_tests","submissionHash":"90819af54ca1b5087ee86bed44d300c1227d6bcbf09317e9a7a742c82a1f4fbf","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"89c96b1106d85b33697ece69f4f2bd6d41867c830d773b938c9149777472eb5c","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"2856dd3f17f5217dd7c5188eb8e9fe89fa68b58d15930a0ef80a18bac079719f","device":"7f1dec5ffcbde1d8","findings":[],"hash":"2bdf7dc3287b3fb7098838fcb4e47dee90161eaff94465dea942816a4bdc0b83","nodeId":"b27529dd-66a1-4435-bcde-1ec591d6dd95","outcome":"completed","summary":"**Verdict: NO-GO on one unresolved item.** Everything this repository can verify passes. The one thing it cannot resolve is the production-payload gas margin, which only the launch service holds.\n\n**What was verified**\n\n- **Source.** HEAD is the repaired commit 3a26e979 with tree b8800af7. GitHub main resolves to the same commit and tree. The repair job's accepted submission records that exact tree as its verified tree hash, which settles the audit's \"c6a77b2\" provenance question: that was the worker's local commit of the same tree.\n- **Factory path.** On a mainnet archive fork at block 26,137,298 against the real factory and operator, the original bytecode reverts with DeploymentFailed(6) and the repaired bytecode deploys the token, all seven applications and the distributor at the predicted addresses.\n- **FeeHookDeployer.** Its arguments resolve to the mainnet PoolManager, the predicted token, native quote and the predicted FeeWaterfall. Both waterfall reads return mainnet WETH, and the hook slot is zero after launch.\n- **Parameters.** launch.json differs from its first accepted commit only in the notes string. All seven constructor argument lists, the token block and the pool block match the original launch record's proof section exactly.\n- **Bytecode consistency.** The seven original creation hashes embedded in the repo equal both a clean rebuild of commit 6a78621 and the per-contract hashes in the public launch record. The repaired hashes are now pinned in a test. No attestation exists yet over the repaired tree, so the service must produce one.\n- **Roles.** Admin is $owner; guardian, executor, signers and quorum are unset; the factory holds no role and cannot schedule an operation.\n- **Checks.** forge build clean. forge test: 287 passed, 0 failed, 1 skipped (fork suite offline). The pinned contracts-only protected floor passes with manifest-resolved inputs. Fork suite: 3 of 3 pass.\n\n**Gas**\n\n| Quantity | Gas |\n| --- | ---: |\n| Cap | 16,777,216 |\n| Repaired total (rehearsal payload) | 16,759,438 |\n| Margin | 17,778 |\n| Cost of one extra agent ID | 23,203 |\n| Cost of one extra receipt-URL word | 22,767 |\n\nThe service recorded 20,816,126 gas for the original bytecode with the real payload, versus 19,733,790 for the rehearsal payload. That difference is payload, not code, and projects the repaired launch to roughly 1.06M gas over the cap. The public job record truncates the simulation call after its kind field, so the real agent count, owner and receipt cannot be recovered here. The launch service must re-simulate its exact payload before anything proceeds.\n\n**Audit findings**\n\n- Gas margin (medium): reproduces exactly. It is the NO-GO item, now covered by a fork test.\n- Heartbeat lapse (low): reproduces. Source left unchanged because this follow-up verifies a fixed, attested tree, and the mitigation the finding proposes is a post-launch timelock configuration. A new test pins the behaviour and the mitigation.\n- Manifest kind (info): confirmed and documented. Manifest unchanged, as the brief requires.\n- Provenance (info): resolved via the work record's verified tree hash.\n\n**Files delivered**\n\n- `docs/VERIFICATION-816.md` holds the full GO / NO-GO report.\n- `ADAPTATION.md` lists each change and the finding or brief item behind it.\n- New tests in `test/Launch816Record.t.sol` and `test/StaleFeedQuarantine.t.sol`, plus one fork-only margin test.\n- One index line added to README. No src, manifest or configuration file changed. Nothing was deployed or broadcast, and the working tree is left uncommitted for the harness.","treeHash":"223a0580f095c46cea80abd213d9fc3910d159ff","usage":{"cachedInputTokens":2554261,"inputTokens":674,"model":"claude-fable-5-1","outputTokens":46599,"runtime":"claude","turns":62,"wallClockMs":672815}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2bdd77125ec75e6c","findings":[{"citation":"resolved","description":"Access x asymmetry seam (Trust Gap guide, seam 3). AssetRegistry.quarantineIfStale (src/AssetRegistry.sol:210-216) lets any address set a sticky, confirmed quarantine on a basket member whose feed is one second past its configured heartbeat. The executor treats a confirmed quarantine as authority, not just as a buy block: _target returns 0 for the token (line 301) so a sale of it is an `exit` that skips _requireWindow and the drift threshold (lines 264-267), and _nav skips the whole position (line 319) so NAV as the executor counts it drops by that position's value, every other member's target shrinks proportionally, and the keeper is permitted to sell each of them down to the new target inside the window. Both sales clear at the oracle floor (fair minus MaxSlippageBps, line 273), which is what the keeper or a sandwicher of the keeper's predictable trades captures. The guardian-only confirmed quarantine was designed as a tighten-only power; this path hands the same effect to anyone whenever a feed lapses by a second, and the quarantine survives feed recovery until a 2-day timelocked releaseQuarantine. This widens audit finding 72f24c4d (deposit outage) to a bounded, realisable loss of vault value and a basket that drifts from the signed proposal without any signer or guardian action. Mitigations that preserve the design: let quarantineIfStale set only the auto (buy-block) flag rather than the confirmed flag, or require the lapse to exceed the heartbeat by a grace margin, or clear a stale-feed quarantine automatically once the feed is fresh again. The operational mitigation (approve feeds with heartbeat slack) is not enforced on-chain.","line":301,"path":"src/RebalanceExecutor.sol","reproduction":"State: Fixture.sol system, 6-decimal USDC reserve, five members at 20% each, ALICE deposits 1,000,000 USDC, keeper buys the basket (executor NAV 999,999.9996 USDC; T1 target 195,999.999921). Keeper sell of 300e18 T1 reverts (ExceedsDelta). Then: (1) feeds[0].setUpdatedAt(block.timestamp - 1 days - 1); (2) address(0xBAD) calls registry.quarantineIfStale(T0) -> succeeds; (3) skip(1), feed touched: registry.priceUsd(T0).ok == true but isQuarantined(T0) stays true. Now executor.position(T1) returns nav 803,999.9996 (was 999,999.9996), target 157,583.999921 (was 195,999.999921), sellable excess 38,416.000079 USDC. Keeper executeTrade(T1 -> USDC, 383.77 T1, fill 99.01% of oracle) succeeds: 38,377.58 USDC of T1 sold, vault receives 379.94 USDC less than fair value; the same is allowed for T2..T4 (about 1,520 USDC total). Then skip 3 days (window closed): keeper sell of T1 excess reverts WindowClosed, but keeper executeTrade(T0 -> USDC, entire 98e18 balance, 99.01% fill) succeeds outside the window: 196,000 USDC of T0 sold, 1,940.40 USDC below fair. Expected: a permissionless call must not change what the keeper is allowed to trade; a confirmed exclusion should require guardian or timelock. Actual: one unprivileged transaction at a one-second heartbeat lapse authorises a full exit outside the window plus sell-down of all healthy members, costing the vault up to MaxSlippageBps of roughly 35% of NAV (about 3,460 USDC here) before the timelock releases the quarantine and the positions are re-bought at the floor again.","severity":"low","snippet":"    function _target(address token, uint256 nav) private view returns (uint256) {\n        if (token == reserve || !_isApproved(token) || _isQuarantined(token)) return 0;\n        uint256 investable = nav * (BPS - _param(Param.ReserveBufferBps)) / BPS;\n        return investable * _targetWeightBps(token) / BPS;\n    }","title":"Permissionless stale-feed quarantine expands the keeper's trading authority: whole-position exit outside the window and sell-down of every healthy member"},{"citation":"resolved","description":"test/Launch816Record.t.sol::test_manifestResolvesToTheRecordedAddresses and docs/VERIFICATION-816.md lines 110-114 (and item 3 of its checks table) present seven application addresses and the FeeHookDeployer's resolved $contract:FeeWaterfall argument as 'the recorded addresses'. They are computed through _payload(), whose TimelockedAdmin init code is type(TimelockedAdmin).creationCode ++ abi.encode(OWNER, 2 days) with OWNER = 0xA11CE. Because every later application's init code embeds the earlier predicted addresses, all seven production addresses (and therefore the FeeHookDeployer's waterfall argument) differ from the published ones for any real policy owner. The record still proves the manifest resolves backward correctly and the bytecode hashes are right; only the address table is rehearsal-specific. The document says the service recomputes them but does not say they depend on $owner.","line":101,"path":"test/utils/Launch816.sol","reproduction":"Run _payload(0xfF03410d0Fe5fa8f7F59F743de35E333D9857120, false) with OWNER changed from 0xA11CE to any other address (for example the real policy owner): p.expectedContracts[0] != 0x05b624c67e261E8584647DEe9E7AA3a169e58Dcc and p.expectedContracts[5] != 0x6c9139A65773F6ca69C77Ce0c3D5E96FAb71BF0B, so the FeeHookDeployer tail abi.encode(POOL_MANAGER, token, address(0), expected[5]) asserted at test/Launch816Record.t.sol:93 would not match the production init code. Expected: the verification record states that the address table is a function of $owner and must be recomputed with the policy owner. Actual: it is presented as 'the recorded addresses' for item 3.","severity":"info","snippet":"    address internal constant OWNER = address(0xA11CE);","title":"Predicted launch addresses in the verification record are derived from the rehearsal owner 0xA11CE, not the policy $owner"}],"hash":"361fb8899eebc8366b11be1859a4b7843f277d07c93e9b361bd60e7393aa29a1","nodeId":"5aefdf08-0766-46e0-bd43-6f2fd8b7de92","outcome":"completed","summary":"Review complete. The findings file is written at the repository root with 2 findings and a 62-row coverage record covering all 57 listed entry points. No repository file was changed. Scratch tests were removed.\n\n**Verdict: NO-GO, for one unresolved item outside the code.** Every check this tree can perform passes, and I reproduced each one independently. The blocker is unchanged from the existing verification record: the rehearsal payload fits the EIP-7825 cap with a margin smaller than one extra agent ID, and the production payload is not in this repository.\n\n| Check | Result |\n| --- | --- |\n| 1. Source checked | HEAD adds only docs and tests on top of 3a26e979. Sources, manifest, config, libs and script are byte-identical to the repaired commit. |\n| 2. Seven apps deploy via real factory | Fork suite passes 3 of 3 at block 26,137,298 through a public archive RPC. Original bytecode reproduces DeploymentFailed(6). |\n| 3. FeeHookDeployer args | Resolve to PoolManager literal, the CREATE2 token, native quote, and the FeeWaterfall predecessor. Both waterfall getters return WETH. |\n| 4. Original parameters preserved | Token, pool and all seven constructor argument lists are identical to the first accepted manifest commit. Only the notes string changed. |\n| 5. Manifest, commit, tree, bytecode | Creation hashes pinned in the record test match the build. No attestation exists yet over the repaired tree, and HEAD's tree differs from 3a26e979's, so the service must attest whichever tree it publishes. |\n| 6. No automatic roles | Confirmed on the fork: admin is the owner, guardian, executor, signer count and quorum are zero, every role lookup is None. |\n| 7. Tests, verifier floor, fork | 287 offline tests pass. The pinned protected check passes with manifest-resolved inputs. Fork suite passes. |\n| 8. Gas | Total 16,759,438 of 16,777,216. Margin 17,778 gas, about 0.1%. One more agent ID costs 23,203. |\n\n**Findings in my area (Access Control, Trust Gap, Asymmetry):**\n\n- **Low.** A permissionless stale-feed quarantine, which anyone can trigger one second past a heartbeat, is treated by the executor as full authority: the keeper may then dump the entire position outside any rebalance window, and the executor's NAV shrinks so every healthy member becomes sellable down to a lower target. Each sale clears at the oracle floor. In the fixture one unprivileged call exposed about 3,460 USDC of a 1,000,000 USDC vault to slippage capture before a two-day timelocked release. This widens the already-recorded heartbeat finding from a deposit outage to realisable value loss and basket drift without signer or guardian action.\n- **Info.** The predicted application addresses in the verification record and its record test are derived from the rehearsal owner 0xA11CE. All seven production addresses depend on the real policy owner and will differ.\n\n**Permission model otherwise holds.** I traced every state-changing entry point: one role per address, admin holds no role, guardian powers are tighten-only, recovery operations cannot be vetoed, the executor contract moves vault assets only inside its own swap, and the fee hook pays only the waterfall. No escalation chain, unguarded initializer, or inconsistent guard was found.\n\n**Unresolved risks, in order:** production payload gas, missing attestation over the published tree, the heartbeat quarantine behaviour above, and the out-of-scope economic fork validation and independent audit the repair itself lists.","treeHash":null,"usage":{"cachedInputTokens":2710560,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":49233,"runtime":"claude","turns":42,"wallClockMs":814144}},{"artifacts":[],"attempt":1,"bundleHash":"fb55bc894caef0dc391ad97953a57fa8118c1ae8ef190ce59b33f3d8ac24647b","device":"8eebc53449bafe7b","findings":[{"description":"Verification-only follow-up for commit 3a26e979 (tree b8800af7). Everything this repository can check passes: the fork launch at block 26,137,298 against factory 0xfF03410d0Fe5fa8f7F59F743de35E333D9857120 deploys the token, all seven applications and the distributor for 16,759,438 gas, 17,778 under the 16,777,216 cap, and the pinned contracts-only protected floor passes with the manifest-resolved codes, salts and addresses. The margin, however, is smaller than one extra agent ID (23,203 gas) or one extra 32-byte receipt-URL word (22,767 gas), and the rehearsal payload is synthetic. The launch service recorded 20,816,126 gas for the ORIGINAL bytecode with its real payload; the same bytecode with the rehearsal payload needs 19,733,790, so the real payload costs about 1,082,336 more than the rehearsal. The repaired bytecode saves 2,974,352 gas on the fork and 2,974,128 in the offline harness (test/Launch816Gas.t.sol reproduces this with no network; the two agree to within 300 gas). Applying that saving to the service's own record predicts 17,841,998 gas for the repaired bytecode with the real payload, about 1,064,782 over the cap. This repository cannot confirm or refute the prediction because the production agent list, owner, receipt hashes, URL and allocation proof are held only by the launch service, and the public job record truncates the recorded simulation call after its kind field. No source or manifest change can be made here (verification-only), and no test can assert the production total. Resolution is on the service side: simulate the exact production payload against tree b8800af7 and publish the gas used; if over the cap, fewer agent IDs in the atomic call, a shorter receipt URL, or a further bytecode reduction in a new repair job. Also open: no attestation exists yet over the repaired tree (the original record attests 6a78621 / 5bf32d62); the service must attest 3a26e979 / b8800af7 and recompute per-contract hashes and addresses.","line":1,"path":"launch.json","reproduction":"forge test --match-contract Launch816ForkTest --no-isolate --fork-url <archive RPC> --fork-block-number 26137298 -vv (reproduced 2026-10-09 against https://eth.drpc.org): total gas upper bound 16759438; per extra agent ID 23203; per extra URL word 22767. Offline: forge test --match-path test/Launch816Gas.t.sol -vv logs offline saving 2974128 vs fork saving 2974352 and predicted production total 17841998 > cap 16777216. Expected for GO: the service's simulation of its exact production payload below 16,777,216. Actual: unknown to this repository; the only payload-level figure available (20,816,126 for the original bytecode) predicts an overrun of about 1.06M gas.","severity":"medium","title":"Launch 816 production payload gas is unverified and predicted above the EIP-7825 cap (NO-GO item)"},{"description":"FeeHookDeployer takes $token as a literal address argument and, by design, cannot verify that code exists there (constructors run on the empty-chain floor). The factory verifies each application against its predicted CREATE2 address, and $token is embedded in FeeHookDeployer's init code, so if the LaunchToken creation code the service deploys differs from the one it resolved $token from, every application still lands at its predicted address, the launch succeeds, and the deployer's immutable projectToken points at an address with no token. The hooked pool could then never be created for the real token and the deployer has no setter. This is not a code defect in the accepted design (the README and docs/LAUNCH-816.md already require the service to recompute $token and all addresses from the attested build and never reuse cached values); it is recorded so the launch service treats that requirement as load-bearing. Mitigation is procedural: resolve $token from the exact token creation bytes in the attested payload. Test test_tokenCodeDriftIsNotCaughtByTheAddressCheck in test/Launch816Resolution.t.sol demonstrates the gap on the offline harness.","line":41,"path":"src/FeeHookDeployer.sol","reproduction":"forge test --match-test test_tokenCodeDriftIsNotCaughtByTheAddressCheck -vv: append one byte to tokenCreationCode while keeping the FeeHookDeployer init code resolved from the original token prediction; the factory harness deploys all seven applications at their predicted addresses and returns success, FeeHookDeployer.projectToken() equals the stale token prediction, whose code length is 0, while the token actually exists at a different address. Expected (if the check were to catch it): WrongReference(6) and a rolled-back batch. Actual: success with a deployer bound to a nonexistent token.","severity":"info","title":"A $token resolved from different bytes than the token actually deployed is not caught by the factory's address check"}],"hash":"90819af54ca1b5087ee86bed44d300c1227d6bcbf09317e9a7a742c82a1f4fbf","nodeId":"8069934e-9e31-4263-aaaf-7b2dd9348c86","outcome":"completed","summary":"The findings file is in place and intentionally excluded from git by the harness, as is the scratch folder. All work is done and verified, so here is the report.\n\n## Verdict: NO-GO on one unresolved item, everything else GO\n\nThe repaired commit `3a26e979` (tree `b8800af7…`) is the source in this tree, and `src/`, `launch.json`, `foundry.toml` and `lib/` are byte-identical to it. Every check this repository can run passes. The one item that cannot be resolved here is the production-payload gas margin, which only the launch service can settle. Do not launch until it does.\n\n**Checks against the brief**\n\n1. **Source commit.** Tree hash of `3a26e979` is `b8800af7…`; no source drift since. Creation hashes and runtime sizes of all seven applications match the report tables exactly.\n2. **Factory path.** Fork at block 26,137,298 against the real factory, run today against a public archive endpoint: original bytecode reverts `DeploymentFailed(6)`, repaired bytecode deploys token, seven applications and distributor at their predicted addresses. The pinned contracts-only protected floor also passes with the manifest-resolved codes, salts and addresses.\n3. **FeeHookDeployer.** Arguments resolve to the PoolManager literal, the predicted token, native quote, and the FeeWaterfall address. The new tests show the three constructors that depend on an earlier application, that wrong sibling references and a non-wrapping waterfall roll the whole batch back, and that the hook deploys offline with the launched literals.\n4. **Parameters.** Every init-code tail decodes to the exact `launch.json` argument list, for both original and repaired payloads.\n5. **Consistency.** Bytecode, addresses and report tables agree. No attestation over the repaired tree exists yet; the service must produce one.\n6. **Roles.** Fuzzed over arbitrary addresses: no role, allowlist entry or balance anywhere. Every configuration entry point refuses the owner wallet, the factory and strangers until the two-day timelock has run.\n7. **Tests.** Full suite: 324 passed, 0 failed, 1 skipped (fork test offline). Fork suite 3 of 3 pass. Protected floor passes.\n\n**Gas**\n\n| Quantity | Gas |\n| --- | ---: |\n| Transaction cap | 16,777,216 |\n| Repaired, rehearsal payload (fork) | 16,759,438 |\n| Safety margin | 17,778 |\n| Cost of one more agent ID | 23,203 |\n| Service's record, original bytecode, real payload | 20,816,126 |\n| Saving from repair (offline, matches fork within 300) | 2,974,128 |\n| Predicted repaired total, real payload | 17,841,998 |\n\nThe predicted production total is about 1.06M over the cap. The margin is smaller than a single extra agent ID. This is recorded as a medium finding in `.imd-findings.json`, alongside an informational note that a `$token` resolved from different bytes than the deployed token would pass the factory's address check, so the service must resolve it from the attested payload.\n\n**Files added** (all under `test/`): `Launch816Resolution.t.sol`, `Launch816State.t.sol`, `Launch816Deployer.t.sol`, `Launch816Gas.t.sol`, `invariant/Launch816Waterfall.invariant.t.sol`, and the shared fixture `utils/Launch816Live.sol`. The invariant suite drives the launched waterfall and vault with native-ETH fees, timelock treasury pushes, claims, split changes and rescue attempts in the exact WETH configuration, with fee conservation, liability coverage, basket-floor and cap invariants over 128 runs.\n\n**What remains for the requester:** the launch service must simulate its exact production payload against tree `b8800af7…` and publish the gas, and attest the repaired tree. If the simulation lands under the cap, every other item is GO.","treeHash":"20e1b1273d32ed4006f6eb00eb8f82256653ad67","usage":{"cachedInputTokens":2831317,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":81903,"runtime":"claude","turns":69,"wallClockMs":1164149}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b0b4e7bbc84f9d80","findings":[{"citation":"resolved","description":"Reproduced on a mainnet fork at block 26,137,298 against factory 0xfF03410d0Fe5fa8f7F59F743de35E333D9857120 (operator 0xcECc29B037f5064fCdF45a5C318F132ef76aA551, RPC https://eth.drpc.org). Repaired bytecode, rehearsal payload (12 synthetic agent IDs, synthetic owner/root, placeholder receipt hashes, 80% pool allocation, range [-887220,0], liquidity 8e26): intrinsic 1,133,476 + execution 15,625,962 = 16,759,438 gas against the 16,777,216 transaction cap, margin 17,778 (0.106%). Original bytecode reverts DeploymentFailed(6) on the same fork. The launch service recorded 20,816,126 gas for the original bytecode with its real payload versus 19,733,790 for the rehearsal payload: the real payload costs about 1,082,336 gas more than the rehearsal, which applied to the repaired bytecode predicts roughly 17.84M gas, about 1.06M over the cap. The production agent list, owner, receipt hashes, URL, allocation proof and pool position are held only by the launch service. This is the pre-existing NO-GO item (39c34447) reproduced exactly, not a new code defect; it blocks GO until the service simulates its exact payload under the cap.","line":90,"path":"test/fork/Launch816Fork.t.sol","reproduction":"forge test --match-contract Launch816ForkTest --no-isolate --fork-url <archive RPC> --fork-block-number 26137298 -vv. Expected for GO: the real payload fits the cap. Actual: rehearsal payload 16,759,438 (fits by 17,778); 13 agent IDs 16,782,641 (+5,425 over cap); receipt URL one word longer 16,782,205 (+4,989 over cap); 0 agent IDs 16,459,078. Gas per extra agent ID 23,203; per extra URL word 22,767.","severity":"medium","snippet":"        assertGt(thirteen, TX_GAS_CAP, \"one more agent ID exceeds the cap\");","title":"Atomic launch gas margin is 17,778 gas with a rehearsal payload; the production payload is unknown and one extra agent ID or receipt-URL word exceeds the EIP-7825 cap"},{"citation":"resolved","description":"IndexVault.deposit (src/IndexVault.sol:144) mints shares at the last feed answer; redeem pays in kind with no oracle. Chainlink USD feeds update on a 0.5%-1% deviation or heartbeat, so between updates the vault sells basket exposure below market. The only on-chain brakes are the mint-block lock (12 seconds), the 100 WETH deposit cap (bounds size per round, not the fraction taken) and DepositFeeBps, which the AssetRegistry constructor sets to 0 and the timelock can raise to at most 100. With a 1% lag on every member and a 100,000-unit stake, the depositor leaves one block later with 100,890.9 units at market (profit 890.9, 0.89% of stake) and the existing holder's position at market falls by exactly that amount. With DepositFeeBps = 100 the same round trip returns 99,972.9 units and the holder is not diluted. README (lines 229-233) and docs/SECURITY.md (line 44) document this as residual cross-block oracle-latency risk, so this is reported as a quantified unresolved risk of the launch configuration rather than a new mechanism: the lever exists but the launch leaves it off, and no test in the tree measures the extraction. Who profits: any funded address; who loses: existing vIMDEX holders including the timelock treasury; cost: two transactions and the market slippage of selling the in-kind slice.","line":105,"path":"src/AssetRegistry.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Fixture} from \"../utils/Fixture.sol\";\nimport {Param} from \"../../src/interfaces/IIndex.sol\";\n\n/// @dev Quantifies the cross-block oracle-lag round trip at the launch defaults (DepositFeeBps = 0,\n/// one-block share lock). A depositor who buys shares while the feed lags the market and redeems\n/// in kind one block later takes value from existing holders.\ncontract OracleLagRoundTripTest is Fixture {\n    uint256 private constant LAG_BPS = 100; // 1% feed deviation threshold, feed not yet updated\n\n    function _roundTrip() private returns (uint256 stake, uint256 valueAtMarket, uint256 holderNavBefore, uint256 holderNavAfter) {\n        _deposit(ALICE, 1_000_000 * USDC_UNIT);\n        (address[] memory members, uint16[] memory weights) = _topFive();\n        _activateBasket(members, weights);\n        _buyBasket();\n        holderNavBefore = _holderValueAtMarket(ALICE);\n\n        stake = 100_000 * USDC_UNIT;\n        uint256 shares = _deposit(BOB, stake); // rolls one block: the share lock has passed\n        vm.prank(BOB);\n        vault.redeem(shares, BOB, true);\n        valueAtMarket = _accountValueAtMarket(BOB);\n        holderNavAfter = _holderValueAtMarket(ALICE);\n    }\n\n    /// @dev Market is LAG_BPS above every member's last feed answer.\n    function _accountValueAtMarket(address who) private view returns (uint256 value) {\n        value = usdc.balanceOf(who);\n        for (uint256 i; i < 5; ++i) {\n            (uint256 atOracle,) = registry.convert(address(tokens[i]), tokens[i].balanceOf(who), address(usdc));\n            value += atOracle * (10_000 + LAG_BPS) / 10_000;\n        }\n    }\n\n    function _holderValueAtMarket(address who) private view returns (uint256 value) {\n        uint256 shares = vault.balanceOf(who);\n        uint256 supply = vault.totalSupply() + 1e6;\n        value = usdc.balanceOf(address(vault)) * shares / supply;\n        for (uint256 i; i < 5; ++i) {\n            uint256 slice = tokens[i].balanceOf(address(vault)) * shares / supply;\n            (uint256 atOracle,) = registry.convert(address(tokens[i]), slice, address(usdc));\n            value += atOracle * (10_000 + LAG_BPS) / 10_000;\n        }\n    }\n\n    function test_feedLagRoundTripDoesNotDiluteHoldersAtLaunchDefaults() public {\n        assertEq(registry.param(Param.DepositFeeBps), 0, \"launch default deposit fee\");\n        (uint256 stake, uint256 got, uint256 before, uint256 after_) = _roundTrip();\n        emit log_named_uint(\"stake (USDC 6dp)\", stake);\n        emit log_named_uint(\"received at market (USDC 6dp)\", got);\n        emit log_named_uint(\"depositor profit (USDC 6dp)\", got - stake);\n        emit log_named_uint(\"existing holder loss (USDC 6dp)\", before - after_);\n        // Expected property: a depositor cannot leave with more than they brought and existing\n        // holders are not diluted. Fails on the current code (DepositFeeBps = 0 at launch).\n        assertLe(got, stake, \"depositor must not profit from feed lag\");\n        assertGe(after_, before, \"existing holder must not be diluted\");\n    }\n\n    function test_maxDepositFeeNeutralisesOneDeviationOfLag() public {\n        _gov(address(registry), abi.encodeCall(registry.setParam, (Param.DepositFeeBps, 100)));\n        (uint256 stake, uint256 got, uint256 before, uint256 after_) = _roundTrip();\n        emit log_named_uint(\"received at market with 1% fee (USDC 6dp)\", got);\n        assertLe(got, stake, \"1% fee covers a 1% lag\");\n        assertGe(after_, before, \"holder not diluted with fee\");\n    }\n}","reproduction":"Fixture state: ALICE deposits 1,000,000 USDC-units, a five-member basket is activated and bought at oracle prices. Feeds lag the market by 1%. BOB deposits 100,000 units (vault.deposit at stale NAV, receives shares), next block calls vault.redeem(shares, BOB, true) and values the slice at market. Expected: a depositor cannot leave with more than they brought. Actual: BOB holds 100,890,908,695 (6dp) for a 100,000,000,000 stake; ALICE's market value drops by 890,908,695. Test: test/scratch/OracleLagRoundTrip.t.sol: test_feedLagRoundTripDoesNotDiluteHoldersAtLaunchDefaults asserts the expected property and FAILS on the current code (100,890,908,695 > 100,000,000,000); test_maxDepositFeeNeutralisesOneDeviationOfLag shows DepositFeeBps = 100 makes the same property hold.","severity":"low","snippet":"        _params[Param.DepositFeeBps] = 0;","title":"At launch defaults (DepositFeeBps = 0, one-block share lock) a depositor extracts one feed-deviation of value from existing holders per cross-block deposit/redeem round trip"},{"citation":"resolved","description":"FeeHookDeployer.deploy is permissionless and one-shot, and FeeHook.beforeInitialize (src/FeeHook.sol:112-128) accepts the first PoolManager.initialize for its single pool key from any sender at any sqrtPriceX96. The manifest notes say the hooked pool is 'initialized only after checking its intended price and liquidity', but nothing on-chain reserves that step for the project. Impact is operational, not a loss: with zero liquidity the price can be moved to the intended value by a project-token-specified swap (a quote-specified swap reverts PartialFill), and liquidity added afterwards is priced by its own range. Recorded so the operator does not rely on choosing the initial price.","line":117,"path":"src/FeeHook.sol","reproduction":"After deploy(salt, creationCode) sets hook, any address calls PoolManager.initialize(hook.poolKey(), 4295128739 /* MIN_SQRT_PRICE+1 */). Expected per notes: the project initialises at its chosen price. Actual: beforeInitialize returns its selector, poolRegistered = true, poolId set, and a later initialize at the intended price reverts PoolAlreadyRegistered (test/FeeHook.t.sol:272 already shows the second initialize reverting).","severity":"info","snippet":"        if (poolRegistered) revert PoolAlreadyRegistered();","title":"The hooked IMDEX pool can be initialised by anyone at any price once the FeeHook exists; beforeInitialize checks the key but not the initializer or price"}],"hash":"9ec7458f18d87cffe26830bcee057ee07dbc79235374d3c5d383935c9db9a764","nodeId":"6768b4bd-b4ce-4ae2-af0b-237a377fbae4","outcome":"completed","summary":"**Verdict: NO-GO**, for one unresolved item only. Every check this repository can perform passes, but the atomic launch fits the gas cap by 17,778 gas with a rehearsal payload, and the production payload is held only by the launch service.\n\nFindings are in `.imd-findings.json` (3 findings, 62 coverage rows covering all 57 listed entry points). No tracked file was changed; scratch tests live under `test/scratch/`.\n\n**The eight verification items**\n\n1. **Source checked.** The working tree is commit 1200788, whose `src/`, `launch.json`, `foundry.toml` and `lib/` are byte-identical to the repaired commit 3a26e979. The later commit adds only docs and tests. All eight creation bytecode keccaks recomputed from a fresh build equal the record table.\n2. **Seven applications deploy through the real factory.** Fork at block 26,137,298 against the mainnet factory: original bytecode reverts `DeploymentFailed(6)`, repaired bytecode deploys token, all seven applications and the distributor at the predicted addresses.\n3. **FeeHookDeployer arguments resolve.** PoolManager literal, the CREATE2 token address, native quote and the FeeWaterfall address. Both constructor getter reads return mainnet WETH. The hook slot is zero after launch.\n4. **Original parameters preserved.** The manifest differs from the first accepted commit only in the notes string (3,258 characters). Argument counts and values are unchanged.\n5. **Manifest, commit, tree, bytecode consistent.** Yes for everything that exists. No attestation over the repaired tree exists yet. The service must attest whichever tree it publishes.\n6. **No roles assigned.** After the fork launch the owner is admin; guardian, executor, signer count and quorum are zero; no address holds a role.\n7. **Tests, verifier floor, fork.** Offline suite 287 passed, 0 failed, 1 skip. The pinned protected check passes with the manifest-resolved factory, salts, init code and addresses. Fork suite 3 of 3 pass.\n8. **Gas.**\n\n| Quantity | Gas |\n| --- | ---: |\n| Transaction cap (EIP-7825) | 16,777,216 |\n| Rehearsal total, repaired bytecode | 16,759,438 |\n| Safety margin | 17,778 |\n| One extra agent ID | +23,203 |\n| One extra receipt-URL word | +22,767 |\n\nThe service recorded about 1.08M more gas for its real payload than the rehearsal payload on the original bytecode. Applied here that predicts roughly 1.06M over the cap. Only the service can confirm or refute this.\n\n**Economic findings (Economic Security, Invariant, Flow Gap guides)**\n\n- **Medium, gas margin.** The blocking item above, reproduced exactly on the fork. Not a code defect.\n- **Low, oracle-lag round trip at launch defaults.** The deposit fee starts at zero and the share lock lasts one block. With feeds lagging the market by one deviation, a depositor of 100,000 units leaves the next block with 100,890.9 units at market, taken from existing holders. README documents the risk; this quantifies it and shows a 1% deposit fee neutralizes one deviation. A proof test fails on the current code.\n- **Info, hooked pool initialization.** Anyone can initialize the single hooked pool at any price once the hook exists. Recoverable with a zero-liquidity swap, so operational only.\n\nFee conservation, waterfall split math, hook delta accounting against v4, vault backing and in-kind pro-rata, executor delta and floor rules, and timelock role exclusivity all held under trace. Nothing in my area was left unreached.\n\n**Unresolved risks, in priority order**\n\n1. Production payload gas. The service must simulate its exact payload against this bytecode.\n2. No attestation over the repaired tree.\n3. Deposit fee left at zero at launch, and feed heartbeats configured with slack above nominal (existing low).\n4. Still open from the repair: live-market economic validation and an independent audit before real funds.","treeHash":null,"usage":{"cachedInputTokens":2637143,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":58880,"runtime":"claude","turns":49,"wallClockMs":985842}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f47f953f8e35921e","findings":[{"citation":"resolved","description":"Seam: boundary x invariant. The share lock is meant to hold only shares minted in the current block (comment at lines 48-49: 'unsolicited dust deposits cannot lock a receiver's older shares'). The check keeps `balance - value >= mintedThisBlock[from]`, so the older shares are liquid only for amounts strictly below `balance - mintedThisBlock`. A full-balance redemption or transfer (value == balance) always fails the boundary, since `0 < mintedThisBlock`. Anyone can call `deposit(1, victim, 0)` (1 reserve unit mints 1e6 shares) in the same block as the victim's full exit, and the exit reverts with SharesLocked. The attacker's 1 unit stays with the victim, so the cost is one deposit per block griefed; each repeat is a fresh block. No funds are lost and the victim can exit by redeeming `balance - dust` in that block or the full balance next block, so this is a one-block griefing of full-balance exits and of integrations that redeem `balanceOf`.","line":329,"path":"src/IndexVault.sol","reproduction":"Fixture (6-decimal USDC reserve). 1) ALICE deposits 1000e6 in block N-1: shares = 1e15. 2) Block N: BOB calls vault.deposit(1, ALICE, 0): mints 1e6 shares to ALICE, sets depositBlock[ALICE]=N, mintedThisBlock[ALICE]=1e6. 3) Same block N, ALICE calls vault.redeem(vault.balanceOf(ALICE)=1_000_000_001e6... i.e. 1e15+1e6, ALICE, true). Expected per the comment: older 1e15 shares are liquid, the call pays out. Actual: _update computes balance - value = 0 < 1e6 and reverts SharesLocked. redeem(1e15) in block N succeeds and redeem(1e6) in block N+1 succeeds, confirming only the full-balance boundary is blocked. Verified with a scratch Foundry test against this tree (expectRevert(IndexVault.SharesLocked.selector) on the full-balance redeem passes).","severity":"low","snippet":"            if (value > balance || balance - value < mintedThisBlock[from]) revert SharesLocked();","title":"Same-block dust deposit to a receiver blocks any redemption or transfer that would leave fewer shares than the dust"},{"citation":"resolved","description":"Outside the math area but it is the one NO-GO item for this launch and was asked for in the report. The fork test that measures it (test/fork/Launch816Fork.t.sol) skips offline, so this review could not re-measure it; the offline harness test test_repairedLaunchFitsTransactionBudgetAndGrantsNoRoles passes with the manifest-resolved bytecodes. The margin is smaller than one extra agent ID (23,203) or one extra calldata word (22,767), so the launch service must simulate its exact payload before launch. Nothing in src changed between the repaired commit 3a26e979 and HEAD (git diff on src/, foundry.toml, launch.json is empty).","line":50,"path":"docs/VERIFICATION-816.md","reproduction":"forge test --match-contract Launch816ForkTest --no-isolate --fork-url <archive RPC> --fork-block-number 26137298 -vv, then compare the emitted total against 16,777,216. Offline: forge test --match-path 'test/Launch816*.sol' (8 pass).","severity":"info","snippet":"| Safety margin | 17,778 (0.106%) |","title":"Launch gas safety margin recorded by the prior follow-up is 17,778 gas (0.106%) with a rehearsal payload; the production payload is not in the repository"}],"hash":"b9a826fcdc113a7253053d6d9b22515665b9aa45356e03691da2c98f5918937b","nodeId":"c1e04f78-3d96-4b1b-9224-3ae1905cbfb9","outcome":"completed","summary":"**Verdict: NO-GO** (one unresolved item, outside the math area), with the math area itself clean apart from one low-severity boundary defect.\n\n**What I checked.** The source under review is the repaired tree: `git diff 3a26e979..HEAD` touches only docs and tests, and `src/`, `foundry.toml` and `launch.json` are byte-identical. Build is clean and the full suite passes (287 passed, 1 skipped, the skip being the offline fork suite). I audited every division, scale conversion, downcast, subtraction and boundary comparison in all nine contracts against the Math Precision, Boundary and Numerical Gap guides, and confirmed the seams I could not settle by reading with scratch Foundry tests, which I then removed.\n\n**Findings written to `.imd-findings.json`:**\n\n1. **Low, `src/IndexVault.sol:329`.** The share lock keeps `balance - value >= mintedThisBlock`, so a full-balance redemption or transfer always fails in a block where anyone minted dust shares to that holder. A front-run `deposit(1, victim, 0)` reverts the victim's full exit with SharesLocked for that block. Verified: the full-balance redeem reverts, redeeming `balance - dust` in the same block succeeds, and the dust redeems the next block. No loss of funds, one-block griefing only.\n2. **Info, `docs/VERIFICATION-816.md:50`.** The launch gas margin recorded by the prior follow-up is 17,778 gas (0.106%) under the 16,777,216 cap with a rehearsal payload, less than one extra agent ID or one extra calldata word. The fork measurement cannot be re-run here without an RPC. This is the NO-GO item and only the launch service can resolve it by simulating its real payload.\n\n**Math checks that hold, with the numbers that settle them:**\n- Vault share math uses a 1e6 virtual-share / 1 wei virtual-asset offset. A donation attack costs the attacker more than the victim loses. Deposit-cap check equals preview availability at the exact cap.\n- Redemption uses pre-burn supply and floors every slice, so payouts never exceed balances.\n- FeeWaterfall gives the basket the remainder. Across a split change the basket credit was 24,691,365 against 24,691,360 recorded by the hook's per-swap floors, so the \"never credits less\" invariant holds.\n- Executor delta, buffer, drift and oracle-floor math are all in reserve units. After buying the basket to target, the rounding residual was 79 units on a 1e12 NAV and the follow-on sell was refused.\n- FeeHook fee uses `amount * pips / 1e6` with pips at most 30,000, so no overflow, the hook delta never exceeds the swap amount, and the afterSwap fill check matches for both exact-in and exact-out.\n- Timestamp subtractions in EpochManager, AssetRegistry and the executor window are all guarded by a prior ordering check. All downcasts are bounded.\n\n**Coverage:** 57 of 57 entry points answered plus three invariant rows. No critical or high finding, so no proof file was required.","treeHash":null,"usage":{"cachedInputTokens":1819966,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":46429,"runtime":"claude","turns":29,"wallClockMs":687856}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4dd67dae195771b6","findings":[{"citation":"resolved","description":"The fork rehearsal that establishes the GO condition (test/fork/Launch816Fork.t.sol, docs/LAUNCH-816.md) uses a guessed payload: 12 synthetic agent IDs, a synthetic owner, placeholder receipt hashes and a guessed pool position. Re-running it on the real factory 0xfF03410d0Fe5fa8f7F59F743de35E333D9857120 at block 26,137,298 reproduces exactly 16,759,438 gas against the 16,777,216 cap, a margin of 17,778 gas. Measured on the same fork, every additional agent ID costs about 23,000 execution gas (SSTORE in the factory) plus calldata, so the margin is smaller than ONE extra agent ID: 13 agent IDs exceed the cap by 5,425 gas and 20 by 167,855 gas; a sourceRepoUrl one 32-byte word longer exceeds it by 27,505 gas. The agent count is not known to this repository: the launch record for job 6321056b-a125-48f2-9c7a-81cc8695a1f2 states '300 agents across 12 wallets', and the repair-job record (8a5d5e50-f972-4a86-ab69-1442ed0cc957) reports the ORIGINAL simulation failing at 20,816,126 gas, whereas the original bytecodes with the rehearsal payload and an unconstrained budget need only 19,733,790 gas on the same fork. That 1,082,336-gas difference between the service's real payload and the rehearsal payload is 60x the remaining margin; applied to the repaired bytecodes it predicts roughly 17.84M gas, over the cap by about 1.06M. Nothing in the repository or on-chain (Blockscout shows no launch-816 call to the factory; the original was never broadcast) lets a reviewer resolve this. The launch is therefore NO-GO until the launch service re-simulates the exact production payload (real agentIds length, owner, receipt hashes/URL, allocation and pool position) and shows the result under 16,777,216 with the 63/64 call-depth rule applied, as docs/LAUNCH-816.md itself requires.","line":76,"path":"test/fork/Launch816Fork.t.sol","reproduction":"Inputs: the repaired commit 3a26e979a5198fa515ded5a32e28b6c34902001b, mainnet fork at block 26137298, factory 0xfF03410d0Fe5fa8f7F59F743de35E333D9857120, operator 0xcECc29B037f5064fCdF45a5C318F132ef76aA551, the Launch816Fixture payload with tickUpper=0, liquidity=8e26. (1) `forge test --match-contract Launch816ForkTest --no-isolate --fork-url <mainnet RPC> --fork-block-number 26137298 -vv` -> total gas upper bound 16759438 (margin 17778). (2) Same payload with p.agentIds = new uint256[](13) and the factory called with 30M gas -> total 16782641, i.e. 5425 over the cap; with 20 agent IDs -> 16945071 (167855 over); with p.receipt.sourceRepoUrl one word longer -> 16804721 (27505 over). (3) Original bytecodes (Launch816Original) with 12 agent IDs and a 60M budget -> 19733790 total, versus the 20816126 gas the launch service recorded for the original simulation of the real payload. Expected: the rehearsal payload equals the production payload, or the margin covers the difference. Actual: the production agent count and receipt fields are unknown to the repo, and a single extra agent ID or a 1.08M-gas payload difference pushes the launch over the cap, reproducing the parked state (DeploymentFailed / out of gas, whole batch reverted).","severity":"medium","snippet":"        p.agentIds = new uint256[](12);","title":"Launch gas margin (17,778 gas, 0.106%) is below the cost of one agent ID; the production payload is unverified and the service-recorded original gas implies the repaired launch still exceeds the EIP-7"},{"citation":"resolved","description":"quarantineIfStale is permissionless and triggers whenever block.timestamp - updatedAt > heartbeat by even one second. Chainlink feeds routinely land their heartbeat update a few seconds to a block after the nominal heartbeat, so if governance sets `heartbeat` equal to the feed's nominal value, nearly every cycle opens a short window in which any address can hard-quarantine a healthy member. The quarantine is sticky: the feed recovering does not clear it, and only the timelock can call releaseQuarantine, which takes at least minDelay (172,800 s in launch 816). While quarantined, IndexVault._nav() reports the position as unpriced, so deposit() and FeeWaterfall.pushBasketReserve() revert with PriceUnavailable, and RebalanceExecutor._target() returns 0, which lets a keeper sell the entire position outside the rebalance window and drift threshold (at the oracle floor). This is within the documented 'tighten only' design and the keeper trust model, so it is a low-severity griefing/availability issue, but it is a concrete 2-day deposit outage any address can cause at the cost of one transaction. Mitigation without changing the design: configure `heartbeat` with slack above the feed's nominal heartbeat (for example 1.5x), or require staleness to persist beyond a grace period before the permissionless path applies.","line":210,"path":"src/AssetRegistry.sol","reproduction":"State: fixture with five active members bought (test/utils/Fixture.sol), tokens[0] approved with heartbeat 1 days. Inputs: feeds[0].setUpdatedAt(block.timestamp - 1 days - 1); then from an arbitrary address (0xBAD) call registry.quarantineIfStale(tokens[0]). Then skip(1) and refresh the feed (updatedAt = now). Expected (healthy feed one second later): the member is priced and deposits continue. Actual: registry.isQuarantined(tokens[0]) stays true; vault.deposit(1000e6, BOB, 0) reverts PriceUnavailable(tokens[0]); executor.position(tokens[0]) returns target 0 with current > 0; three days later (outside the 2-day window) the keeper's executeTrade(tokens[0], usdc, wholeBalance, ...) succeeds and empties the position; guardian's releaseQuarantine reverts NotTimelock, so only a >=2-day timelock operation reopens deposits. Verified with test/scratch/StaleLapse.t.sol (passes on current code, demonstrating the behaviour).","severity":"low","snippet":"    function quarantineIfStale(address token) external {","title":"A one-second feed heartbeat lapse lets anyone quarantine a basket member; quarantine survives feed recovery, closes deposits and zeroes the member's target until a timelocked release"},{"citation":"resolved","description":"launch.json declares kind evm_project with a token block, a pool block and a `$token` constructor argument for FeeHookDeployer. The protected check pinned for this task (.imd/reads/protected/evm_contracts/Contracts.protected.t.sol) only rehearses the seven application CREATE2 deployments from environment-supplied creation code; it does not resolve `$token`, deploy LaunchToken, or exercise allocation, pool initialization or receipt recording. Run locally with the manifest-resolved inputs (factory 0xfF03410d0Fe5fa8f7F59F743de35E333D9857120, salts keccak256(abi.encode(uint64(816), i)), predicted token 0x1787f33BbB7A0E03c33FD157ff7BcaA94a52B3a4) the protected test passes: all seven runtimes present, under EIP-170, no DELEGATECALL/CALLCODE/SELFDESTRUCT. The full evm_project path (token, 7 apps, distributor, pool, receipt) passes only in test/fork/Launch816Fork.t.sol, which is skipped offline and needs an archive RPC at block 26137298. This is not a code defect; it is a coverage note so the operator does not read a passing contracts-only floor as proof of the evm_project path. The launch parameters themselves are unchanged: launch.json differs from its first commit 68b04fd only in the `notes` string (verified with git diff), and the seven constructorArgs lists, token block and pool block are byte-identical.","line":2,"path":"launch.json","reproduction":"git diff 68b04fddd4d2f1445d906c7453806f185fef29d8 HEAD -- launch.json shows only the notes line changed. Copy the pinned protected test under test/ and run it with IMD_PROJECT_FACTORY=0xfF03410d0Fe5fa8f7F59F743de35E333D9857120, IMD_PROJECT_CHAIN_ID=1, IMD_PROJECT_COUNT=7 and the seven CODE/SALT/ADDRESS values resolved from launch.json (test/scratch/EmitProtectedEnv.t.sol prints them): it passes, but never deploys LaunchToken or resolves $token; only `forge test --match-contract Launch816ForkTest --fork-url <archive RPC> --fork-block-number 26137298` does.","severity":"info","snippet":"  \"kind\": \"evm_project\",","title":"The manifest is an evm_project launch (token + pool + $token) while the pinned verifier check supplied for this review is the contracts-only floor; $token resolution and the factory pool path are cove"},{"citation":"resolved","description":"Verified: HEAD is 3a26e979a5198fa515ded5a32e28b6c34902001b (tree b8800af76ee7df5b312018e26ee518f44636da27), the commit the task names. The seven original creation bytecodes embedded in test/utils/Launch816Original.sol hash identically to a clean solc 0.8.26 build of commit 6a78621 (e.g. TimelockedAdmin 0x6efe6a62..., FeeHookDeployer 0x85201fd7...), and the compiled runtime sizes match the table in docs/LAUNCH-816.md exactly (2,020 bytes for FeeHookDeployer). Repaired creation-code hashes at HEAD: TimelockedAdmin 0x00f6d88b..., AssetRegistry 0xd77b24e3..., EpochManager 0xe361d1e8..., IndexVault 0xb5c557b8..., RebalanceExecutor 0x283ebd04..., FeeWaterfall 0x3aae82b3..., FeeHookDeployer 0xe71c41f1...; FeeHook creation hash pinned by the deployer 0x3527a2fd.... Not verifiable here: no ReleaseAttestation, manifest hash or verifier signature exists in the repository or the pinned inputs, and the public job record for the repair names commit `c6a77b2` and a 16,723,731-gas first attempt, neither of which is an object in this repository (git cat-file -t c6a77b2 fails). The merged commit must be the one the service attests; any attestation over c6a77b2 would not bind the tree under review.","line":14,"path":"docs/LAUNCH-816.md","reproduction":"git rev-parse HEAD HEAD^{tree}; git cat-file -t c6a77b2 -> 'Not a valid object name'. git worktree add /tmp/orig 6a78621 && forge build && forge inspect src/FeeHookDeployer.sol:FeeHookDeployer bytecode | cast keccak -> 0x85201fd7756f013b60f220b874a28401827b676de8f88a8aff540b4fb8b2dec3, equal to keccak256(Launch816Original.creationCode(6)). Expected: the attestation's commit equals 3a26e979 and its creation hashes equal the values above; actual: no attestation is reachable from this review.","severity":"info","snippet":"The accepted source is commit `6a78621b5bfe9513d9da5f6e7e4fcf6551f5040b`. Its exact seven application","title":"Provenance: the repair-job record cites commit c6a77b2 and a 16,723,731-gas first attempt that do not exist in this repository; the checked source is 3a26e979 (tree b8800af7) and no attestation is pre"}],"hash":"c0c83e74382249e095e1d2357e729737abefa8562d27e5cce509edd9f0650654","nodeId":"be26394a-bf1b-4165-9ff5-11272c1918c9","outcome":"completed","summary":"Verification is complete. No tracked file changed; `.imd-findings.json` holds four findings and `test/scratch/` holds my harness copies.\n\n## Verdict: NO-GO (one unresolved launch risk, no contract defects found)\n\n**What passed**\n- **Source identity.** HEAD is `3a26e979a5198fa515ded5a32e28b6c34902001b`, tree `b8800af76ee7df5b312018e26ee518f44636da27`. The original-bytecode fixtures hash identically to a clean build of commit `6a78621`; compiled runtime sizes match the docs table exactly.\n- **Seven contracts deploy on the real factory.** Fork at mainnet block 26,137,298 against factory `0xfF03…7120`: original bytecodes reproduce `DeploymentFailed(6)`, repaired bytecodes complete the full launch (token, 7 apps, distributor, pool, receipt).\n- **FeeHookDeployer references.** poolManager literal, `$token` (predicted `0x1787…B3a4`), quote `address(0)`, waterfall = app 5; the constructor's `reserveAsset()`/`weth()` reads resolve to mainnet WETH so the native-quote check passes.\n- **Launch parameters preserved.** `launch.json` differs from its first commit only in the `notes` string; all constructor argument lists, token and pool blocks are byte-identical.\n- **No roles granted.** Guardian, executor, signers, quorum, keeper all unset; owner, operator, factory and all apps hold `Role.None`.\n- **Tests.** 280 offline tests pass, formatting clean, both fork tests pass, and the pinned contracts-only protected check passes with manifest-resolved inputs.\n\n**Gas (fork, exact factory)**\n\n| | gas |\n|---|---|\n| Measured total (rehearsal payload) | 16,759,438 |\n| EIP-7825 cap | 16,777,216 |\n| Margin | 17,778 (0.106%) |\n| Cost per additional agent ID | ~23,000 + calldata |\n\n**Unresolved risk (the blocker).** The rehearsal payload is a guess: 12 synthetic agent IDs, synthetic owner, placeholder receipt. Measured on the fork, 13 agent IDs overshoot the cap by 5,425 gas and a one-word-longer repo URL by 27,505. The launch record says \"300 agents across 12 wallets\", and the repair-job record reports the original simulation at 20,816,126 gas, while the same original bytecodes with the rehearsal payload need 19,733,790 here. That 1.08M difference is 60× the margin; applied to the repaired code it predicts ~17.84M. Nothing in the repo or on-chain can resolve the real agent count (no launch-816 call was ever broadcast). The service must re-simulate the exact production payload before proceeding.\n\n**Code findings**\n- Low: a one-second heartbeat lapse lets anyone hard-quarantine a member; it survives feed recovery, closes deposits and zeroes the target for ≥2 days (reproduced in `test/scratch/StaleLapse.t.sol`). Mitigate operationally with heartbeat slack.\n- Info: manifest is `evm_project` while the pinned verifier check is the contracts-only floor; the `$token`/pool path is covered only by the fork test.\n- Info: no attestation reachable; the job record cites commit `c6a77b2`, which is not in this repository.\n\n**Coverage.** Read in full: all nine `src/` contracts and interfaces, the fork/launch harnesses, fixtures, docs. Not reachable: the launch service's attestation, policy row, production payload, and the factory's source.","treeHash":null,"usage":{"cachedInputTokens":3562696,"inputTokens":738,"model":"claude-fable-5-1","outputTokens":58234,"runtime":"claude","turns":65,"wallClockMs":1049941}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a4e285247c6f8aed","findings":[{"citation":"resolved","description":"Execution trace, across transactions (wrong-state execution / operation interleaving). `publish` claims to check every rule, but `_checkTiming` never looks at the rebalance cadence that `activate` enforces at src/EpochManager.sol:183-187 (`block.timestamp < _active.activatedAt + RebalanceInterval` -> TooSoonSinceLastEpoch) together with the snapshot-age rule at line 182 (`block.timestamp - q.snapshotTime > MaxSnapshotAge` -> StaleSnapshot). With the launch defaults (RebalanceInterval 7 days, MaxSnapshotAge 1 day, ProposalDelay 6 hours) any proposal published earlier than `activatedAt + 6 days` is dead on arrival: its snapshot (<= publish time) is already older than MaxSnapshotAge by the earliest moment the interval rule allows activation. Yet it is stored as `_pending`, and `publish` refuses any replacement while `block.timestamp <= _pending.expiry` (line 140), which the dead proposal may set up to 7 days ahead (MAX_VALIDITY). Only the guardian/timelock (`cancelPending`) or the passage of time (`clearExpired`, or the expiry branch in `publish`) frees the slot. Trigger needs a signer quorum (trusted role) acting honestly but early, so this is a liveness gap rather than a fund-loss path: one mistimed publication delays the next epoch by up to a week and, with it, every rebalance window that depends on activation. Minimal fix that preserves the design: in `_checkTiming`, when `_active.activatedAt != 0`, require that some activation instant exists, i.e. `_active.activatedAt + RebalanceInterval <= min(p.expiry, p.snapshotTime + MaxSnapshotAge)`; alternatively let `publish` supersede a pending proposal that can no longer activate.","line":312,"path":"src/EpochManager.sol","reproduction":"State: launch defaults; three signers, quorum 2; a first basket activated at time A (epoch 1). Sequence: (1) at A + 1 day a quorum signs and anyone relays `publish(p, sigs)` with p.epoch = 2, p.snapshotTime = A + 1 day - 1 hour, p.expiry = A + 8 days: every check passes, `_pending` is set. (2) `activate()` at A + 1 day + 6 hours reverts TooSoonSinceLastEpoch; `activate()` at A + 7 days reverts StaleSnapshot (snapshot is 6 days 1 hour old > 1 day); no timestamp in between satisfies both, so the proposal can never activate. (3) At A + 7 days a correctly timed proposal is signed and `publish` reverts PendingProposalExists. (4) The queue moves only after A + 8 days (`dead.expiry + 1`), so epoch 2 is delayed by more than a day beyond the cadence and the keeper gets no new rebalance window. Expected: `publish` rejects (or allows superseding) a proposal that has no reachable activation instant. Actual: it is stored and blocks the slot until expiry. Reproduced in test/scratch/DeadProposal.t.sol (passes on this tree, demonstrating the sequence above; the fixture's `test_weeklyCadenceBlocksAnEarlySecondEpoch` shows the activation half but not the blocked queue).","severity":"low","snippet":"    function _checkTiming(Proposal calldata p, uint256 readyAt) private view {\n        if (p.expiry < block.timestamp) revert ProposalExpired();\n        if (p.expiry <= readyAt) revert ExpiryTooSoon();\n        if (p.expiry > block.timestamp + MAX_VALIDITY) revert ExpiryTooFar();\n        if (p.snapshotTime > block.timestamp) revert SnapshotInFuture();\n        if (block.timestamp - p.snapshotTime > _param(Param.MaxSnapshotAge)) revert StaleSnapshot();\n        if (p.snapshotTime <= _active.snapshotTime) revert SnapshotNotNewer();\n    }","title":"EpochManager.publish accepts a proposal that can never activate, and it blocks the single pending slot until its expiry"}],"hash":"e6c733805c97478e0d8150c12951f4eff46d7bc229b6950eba72ead057837ce3","nodeId":"6e598607-7d25-4b59-8dd1-619277321a53","outcome":"completed","summary":"The review is complete. No tracked file changed; the findings file and my one scratch test are in place and ignored by git as intended.\n\n**Verdict: NO-GO on one unresolved item, unchanged from the prior verification.** Every check this repository can perform passes, including two I re-ran independently here. The single open item is the production payload's gas, which only the launch service can simulate.\n\n**What I verified myself**\n\n- Source identity holds. The contracts and manifest are byte-identical between the working tree and the repaired commit 3a26e979 (tree b8800af7). The creation-code hash pins in the record test pass.\n- Full offline suite: 287 passed, 0 failed, 1 skipped (fork suite, offline).\n- Fork rehearsal at block 26,137,298 through a public archive RPC: 3 of 3 pass. Original bytecode reverts `DeploymentFailed(6)`; repaired bytecode deploys the token, all seven applications and the distributor, with every role, guardian, executor, signer count and quorum unset.\n- Pinned protected floor re-run with manifest-resolved inputs (real factory address, chain 1, seven resolved creation codes and salts): passes. The computed addresses equal the recorded set exactly, token `0x1787…b3a4` and applications `0x05b6…8Dcc` through `0x53B0…4a11`.\n- FeeHookDeployer references resolve: it reads `reserveAsset()` and `weth()` from the FeeWaterfall deployed one index earlier, both WETH, so the native-quote branch passes, and `hook()` is zero after launch.\n\n**Gas (fork, rehearsal payload)**\n\n| Quantity | Gas |\n| --- | ---: |\n| Cap (EIP-7825) | 16,777,216 |\n| Repaired launch total | 16,759,438 |\n| Margin | 17,778 |\n| Cost of one extra agent ID | 23,203 |\n| Cost of one extra receipt-URL word | 22,767 |\n\nEither payload change alone exceeds the cap. The production agent list, owner, receipt hashes and URL are not in this repository, so the margin cannot be confirmed here. That is the NO-GO item.\n\n**Control-flow audit (Execution Trace, Periphery, First Principles)**\n\nI traced all 57 listed entry points plus the launch resolution path, checked the Uniswap v4 callback accounting against the vendored `Hooks` library, and found one defect, recorded as low in `.imd-findings.json` with a reproduction in `test/scratch/DeadProposal.t.sol`:\n\n- **EpochManager.publish accepts a proposal that can never activate.** The publish-time checks omit the rebalance-cadence rule that `activate` enforces. With launch defaults, any proposal published earlier than six days after the last activation is dead on arrival, yet it occupies the single pending slot and blocks a correctly timed replacement until its expiry, up to seven days. It needs an honest but early signer quorum, so it is a liveness gap, not a fund-loss path. The guardian can cancel it.\n\nTwo leads were traced and set aside as documented design, not defects: a held token that becomes permanently unreadable keeps deposits and treasury pushes closed with no write-off path (README lines 240-244 state this deliberately), and the one-second heartbeat quarantine lapse already recorded under finding 72f24c4d.\n\n**Still unresolved before launch**\n\n1. Production payload gas simulation by the launch service against tree b8800af7.\n2. No attestation yet exists over the repaired tree; the service must produce one and recompute the manifest hash, per-contract hashes and addresses with the real owner.\n3. Operational: approve feeds with heartbeat slack above the nominal value; the manifest `kind` is `evm_project` while this review's protected floor is the contracts-only check, so the token, distributor and pool path is covered only by the fork suite.","treeHash":null,"usage":{"cachedInputTokens":3266162,"inputTokens":706,"model":"claude-fable-5-1","outputTokens":55570,"runtime":"claude","turns":45,"wallClockMs":852966}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8f08088e7a7f557f","findings":[],"hash":"f651ca073ae995ea5e74a9be11983fc8e663df51308bdf37031d971b6cbd4eec","nodeId":"57ff4aac-becb-4db4-b1ae-d670d90f5f04","outcome":"failed","summary":"needs input: The accepted launch 816 implementation and approved brief define FeeHookDeployer's second constructor argument (projectToken) as $token, the IMDEX LaunchToken the factory creates in the evm_project mode of the existing manifest. This assignment requires kind evm_contracts, which has no token block and no $token, and the pinned contracts-only protected floor deploys the seven applications with no token. FeeHookDeployer's constructor rejects a zero projectToken and a projectToken equal to the native quote currency, and projectToken is immutable with no setter. No IMDEX token exists onchain (the predicted address 0x1787f33BbB7A0E03c33FD157ff7BcaA94a52B3a4 and all seven predicted application addresses have no code on Ethereum mainnet at the latest block), and the brief names no token address, so there is no legitimate static value. Writing the predicted address would be an invented parameter, and omitting FeeHookDeployer (six contracts) would change the launch parameters the brief says to ","treeHash":null,"usage":{"cachedInputTokens":643488,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":10059,"runtime":"claude","turns":21,"wallClockMs":175402}}],"verification":[{"checks":[{"durationMs":10471,"exitCode":0,"name":"build","output":"Compiling 124 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.35s\nCompiler run successful!\n","passed":true},{"durationMs":6403,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/Launch816Fork.t.sol:Launch816ForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 842.68µs (0.00ns CPU time)\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transfersConserveSupply(address,uint256) (runs: 256, μ: 85751, ~: 85564)\n[PASS] test_metadataAndFixedSupplyMintedToDeployer() (gas: 51556)\n[PASS] test_noMintOrAdminEntryPointExists() (gas: 144953)\n[PASS] test_transferBeyondBalanceReverts() (gas: 32873)\n[PASS] test_transferFromNeedsAllowance() (gas: 137195)\n[PASS] test_transferMovesExactlyTheAmount() (gas: 74767)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 4.65ms (4.97ms CPU time)\n\nRan 3 tests for test/StaleFeedQuarantine.t.sol:StaleFeedQuarantineTest\n[PASS] test_exactHeartbeatAgeIsStillFresh() (gas: 79821)\n[PASS] test_heartbeatSlackClosesTheLapseWindow() (gas: 597352)\n[PASS] test_oneSecondLapseAllowsPermissionlessStickyQuarantine() (gas: 1402580)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 10.69ms (1.46ms CPU time)\n\nRan 24 tests for test/AssetRegistry.t.sol:AssetRegistryTest\n[PASS] testFuzz_convertRoundTripNeverCreatesValue(uint256,uint8,uint8) (runs: 256, μ: 73601, ~: 83242)\n[PASS] test_anyoneCanQuarantineAStaleTokenButNotAFreshOne() (gas: 150827)\n[PASS] test_approveTokenRejectsCodelessFeed() (gas: 760054)\n[PASS] test_approveTokenRejectsCodelessTokenAndFeed() (gas: 117530)\n[PASS] test_approveTokenRejectsReserveAsset() (gas: 117416)\n[PASS] test_approveTokenRejectsZeroCapAndFutureListing() (gas: 866368)\n[PASS] test_badFeedAnswersReadAsNoPrice() (gas: 364271)\n[PASS] test_convertFailsWhenReserveFeedIsStale() (gas: 70866)\n[PASS] test_convertHandlesDifferentDecimals() (gas: 172490)\n[PASS] test_defaultParametersMatchTheDocumentedStartingValues() (gas: 167510)\n[PASS] test_everySetterIsTimelockOnly() (gas: 178651)\n[PASS] test_freshPriceIsNormalisedTo18Decimals() (gas: 23738)\n[PASS] test_listedTokensAndAssetRecordArePublished() (gas: 41428)\n[PASS] test_methodologyVersionOnlyMovesForward() (gas: 514732)\n[PASS] test_minimumTokenAgeCannotGoBelowThirtyDays() (gas: 109737)\n[PASS] test_onlyGuardianExecutorOrTimelockQuarantine() (gas: 583327)\n[PASS] test_paramsStayInsideHardBounds() (gas: 473219)\n[PASS] test_priceIsValidAtHeartbeatAndStaleOneSecondLater() (gas: 53355)\n[PASS] test_revertingOrMalformedFeedDoesNotRevertTheReader() (gas: 177818)\n[PASS] test_revokedTokenIsNotEligibleButStillPriced() (gas: 402836)\n[PASS] test_routerAllowlist() (gas: 396988)\n[PASS] test_slippageLimitCannotBeSwitchedOff() (gas: 109539)\n[PASS] test_tokenYoungerThanThirtyDaysIsNotEligible() (gas: 1623635)\n[PASS] test_windowCannotExceedInterval() (gas: 112207)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 20.72ms (18.74ms CPU time)\n\nRan 14 tests for test/FeeWaterfall.t.sol:FeeWaterfallTest\n[PASS] testFuzz_distributionConservesEveryUnit(uint256,uint256,uint16,uint16) (runs: 256, μ: 422786, ~: 428411)\n[PASS] test_basketReserveIsDepositedAtNavForTheTreasury() (gas: 841029)\n[PASS] test_basketReserveKeepsAccumulatingWhileTheVaultIsClosed() (gas: 931489)\n[PASS] test_claimPaysOnlyTheConfiguredRecipient() (gas: 1329657)\n[PASS] test_configurationIsTimelockOnly() (gas: 102613)\n[PASS] test_distributeSplitsTheNonLpSeventyFivePercent() (gas: 388340)\n[PASS] test_pushHonoursMinShares() (gas: 425705)\n[PASS] test_rescueCannotTouchFeeAssets() (gas: 931184)\n[PASS] test_roundingDustGoesToTheBasketReserve() (gas: 246455)\n[PASS] test_splitChangeOnlyAffectsLaterFees() (gas: 789294)\n[PASS] test_splitMustSumToOneHundredPercent() (gas: 81320)\n[PASS] test_staleBasketSurchargeIsAppliedOnlyWhileStale() (gas: 1512119)\n[PASS] test_startingSplitAndFeeAreVisibleOnChain() (gas: 54016)\n[PASS] test_swapFeeIsBoundedAtThreePercentIncludingSurcharge() (gas: 94494)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 35.78ms (34.29ms CPU time)\n\nRan 21 tests for test/FeeHook.t.sol:FeeHookErc20QuoteHighTest\n[PASS] testFuzz_feeAccountingMatchesAcrossSwapShapes(uint256,bool,bool) (runs: 256, μ: 385873, ~: 387403)\n[PASS] test_buyExactInput_feeTakenFromTheQuotePaid() (gas: 374122)\n[PASS] test_buyExactOutput_feeAddedToTheQuotePaid() (gas: 352194)\n[PASS] test_callbacksAreOnlyForThePoolManager() (gas: 114689)\n[PASS] test_create2CollisionCannotMarkHookAsDeployed() (gas: 23612044)\n[PASS] test_deployerAuthenticatesCodeAndAppendsOnlyItsFixedArguments() (gas: 25088335)\n[PASS] test_deployerRejectsAQuoteTheWaterfallCannotAccountFor() (gas: 651861)\n[PASS] test_deployerRejectsWrongSaltAndSecondDeployment() (gas: 25019553)\n[PASS] test_dustSwapWithZeroFeeStillWorks() (gas: 240738)\n[PASS] test_feeAndSplitChangesReachTheHookThroughTheTimelockOnly() (gas: 699072)\n[PASS] test_feeEventIsIndexedByPoolSenderAndCurrency() (gas: 365253)\n[PASS] test_feeIsAlwaysCollectedInTheQuoteCurrencyNeverInTheProjectToken() (gas: 1162729)\n[PASS] test_feesFlowFromSwapToWaterfallToVaultWithoutTradingTheBasket() (gas: 1189571)\n[PASS] test_hookAcceptsOnlyItsOnePool() (gas: 810958)\n[PASS] test_hookAddressCarriesExactlyTheRequiredPermissionBits() (gas: 75234)\n[PASS] test_quoteIsCurrencyOne() (gas: 5631)\n[PASS] test_quoteSpecifiedExactInputExhaustedRangeRevertsAtomically() (gas: 746250)\n[PASS] test_quoteSpecifiedExactOutputPartialFillRevertsAtomically() (gas: 299290)\n[PASS] test_sellExactInput_feeTakenFromTheQuoteReceived() (gas: 357542)\n[PASS] test_sellExactOutput_traderStillReceivesTheExactQuote() (gas: 356623)\n[PASS] test_zeroHookFeeLeavesSwapsUntouched() (gas: 431486)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 84.83ms (189.51ms CPU time)\n\nRan 21 tests for test/FeeHook.t.sol:FeeHookErc20QuoteLowTest\n[PASS] testFuzz_feeAccountingMatchesAcrossSwapShapes(uint256,bool,bool) (runs: 256, μ: 385470, ~: 383135)\n[PASS] test_buyExactInput_feeTakenFromTheQuotePaid() (gas: 380419)\n[PASS] test_buyExactOutput_feeAddedToTheQuotePaid() (gas: 357085)\n[PASS] test_callbacksAreOnlyForThePoolManager() (gas: 114108)\n[PASS] test_create2CollisionCannotMarkHookAsDeployed() (gas: 23704765)\n[PASS] test_deployerAuthenticatesCodeAndAppendsOnlyItsFixedArguments() (gas: 25180773)\n[PASS] test_deployerRejectsAQuoteTheWaterfallCannotAccountFor() (gas: 651839)\n[PASS] test_deployerRejectsWrongSaltAndSecondDeployment() (gas: 25112274)\n[PASS] test_dustSwapWithZeroFeeStillWorks() (gas: 247265)\n[PASS] test_feeAndSplitChangesReachTheHookThroughTheTimelockOnly() (gas: 704022)\n[PASS] test_feeEventIsIndexedByPoolSenderAndCurrency() (gas: 371441)\n[PASS] test_feeIsAlwaysCollectedInTheQuoteCurrencyNeverInTheProjectToken() (gas: 1162204)\n[PASS] test_feesFlowFromSwapToWaterfallToVaultWithoutTradingTheBasket() (gas: 1188828)\n[PASS] test_hookAcceptsOnlyItsOnePool() (gas: 810088)\n[PASS] test_hookAddressCarriesExactlyTheRequiredPermissionBits() (gas: 75204)\n[PASS] test_quoteIsCurrencyZero() (gas: 5581)\n[PASS] test_quoteSpecifiedExactInputExhaustedRangeRevertsAtomically() (gas: 752725)\n[PASS] test_quoteSpecifiedExactOutputPartialFillRevertsAtomically() (gas: 293009)\n[PASS] test_sellExactInput_feeTakenFromTheQuoteReceived() (gas: 350941)\n[PASS] test_sellExactOutput_traderStillReceivesTheExactQuote() (gas: 351230)\n[PASS] test_zeroHookFeeLeavesSwapsUntouched() (gas: 436444)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 89.82ms (139.84ms CPU time)\n\nRan 29 tests for test/RebalanceExecutor.t.sol:RebalanceExecutorTest\n[PASS] testFuzz_sandwichedFillNeverCostsMoreThanTheSlippageLimit(uint256,uint256) (runs: 256, μ: 470317, ~: 469595)\n[PASS] test_buysTheTopFiveAtTwentyPercentAndKeepsTheBuffer() (gas: 4134962)\n[PASS] test_cannotBuyATokenOutsideTheActiveBasket() (gas: 138996)\n[PASS] test_cannotBuyBeyondTheTargetDelta() (gas: 3277094)\n[PASS] test_cannotSellATokenAtOrBelowTarget() (gas: 3121706)\n[PASS] test_disposalIsOnlyForQuarantinedTokensAndEnforcesItsFloor() (gas: 3083373)\n[PASS] test_dustTradeWithNoEnforceableFloorIsRefused() (gas: 542515)\n[PASS] test_fillAtTheSlippageLimitSucceedsAndResetsTheFailureCount() (gas: 760413)\n[PASS] test_fillBelowTheOracleFloorIsUndoneAndCounted() (gas: 502157)\n[PASS] test_keeperFloorAppliesWhenStricterThanTheOracleFloor() (gas: 413532)\n[PASS] test_noTradingBeforeAnyBasketIsActive() (gas: 90208)\n[PASS] test_oneLegMustBeTheReserve() (gas: 3055491)\n[PASS] test_onlyAllowlistedRoutersAndNeverProjectContracts() (gas: 1156929)\n[PASS] test_onlyKeepersTrade() (gas: 285430)\n[PASS] test_outputIsMeasuredOnTheVaultSoFeeOnTransferTokensFailTheFloor() (gas: 3250922)\n[PASS] test_partialFillReturnsTheUnsoldRemainder() (gas: 356993)\n[PASS] test_pauseStopsTrading() (gas: 130806)\n[PASS] test_quarantinedPositionCanBeExitedAtAnyTime() (gas: 3799227)\n[PASS] test_quarantinedTokenWithDeadFeedIsDisposedThroughTheTimelock() (gas: 3771767)\n[PASS] test_removedMemberIsSoldAndItsReplacementBought() (gas: 5579511)\n[PASS] test_repeatedFailuresQuarantineTheAssetInsteadOfBlockingTheBasket() (gas: 3337916)\n[PASS] test_replacedExecutorLosesAccessToTheVault() (gas: 1047087)\n[PASS] test_reserveBufferCannotBeSpent() (gas: 3872548)\n[PASS] test_routerCannotReenterVaultOrExecutorDuringASwap() (gas: 402687)\n[PASS] test_sellsOnlyTheExcessOverTarget() (gas: 4377560)\n[PASS] test_smallDriftDoesNotTradeButMaterialDriftDoes() (gas: 4404631)\n[PASS] test_staleOracleStopsATradeUntilTheTokenIsQuarantined() (gas: 4006949)\n[PASS] test_swapEntryPointIsNotCallableFromOutside() (gas: 38611)\n[PASS] test_tradesOutsideTheWindowWaitForTheNextInterval() (gas: 4908965)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 90.66ms (143.22ms CPU time)\n\nRan 7 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_constructorsLeaveTheLaunchSupplyWithItsHolder() (gas: 28038608)\n[PASS] test_constructorsNeedNoExternalContractAndWireInDependencyOrder() (gas: 28090754)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 4047)\n[PASS] test_launchGrantsNoRoleToAnyoneAndNothingToTheDeployer() (gas: 28155707)\n[PASS] test_missingWaterfallAndIdenticalCurrenciesStillFailClosed() (gas: 8224)\n[PASS] test_nativeQuoteStillRequiresMatchingWrappedReserve() (gas: 8276)\n[PASS] test_runtimeFitsEip170AndContainsNoDelegatecallCallcodeOrSelfdestruct() (gas: 51161942)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 91.44ms (33.64ms CPU time)\n\nRan 9 tests for test/adversarial/ExternalTokenFailures.t.sol:ExternalTokenFailuresTest\n[PASS] testFuzz_taxedReserveCannotMintSharesForUnreceivedAssets(uint256) (runs: 1000, μ: 1022741, ~: 1024084)\n[PASS] test_failedFeeTransferRollsBackLiabilitiesAndUnlocksClaims() (gas: 1034474)\n[PASS] test_falseReturnStrictRollbackAndNonStrictExit() (gas: 1069012)\n[PASS] test_invalidBooleanStrictRollbackAndNonStrictExit() (gas: 1069357)\n[PASS] test_minShareFailureRollsBackFeeDistributionAndApproval() (gas: 905351)\n[PASS] test_noReturnTokenIsPaidDuringStrictRedemption() (gas: 954053)\n[PASS] test_reserveCallbacksCannotReenterOnDepositOrRedemption() (gas: 1278434)\n[PASS] test_shortReturnStrictRollbackAndNonStrictExit() (gas: 1068812)\n[PASS] test_taxedReserveOneUnitAndMaximumDeposit() (gas: 1991060)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 91.61ms (92.25ms CPU time)\n\nRan 4 tests for test/Launch816Record.t.sol:Launch816RecordTest\n[PASS] test_embeddedOriginalBytecodesMatchTheLaunchRecord() (gas: 46424)\n[PASS] test_manifestResolvesToTheRecordedAddresses() (gas: 223822)\n[PASS] test_repairedCreationCodeIsTheVerifiedTree() (gas: 40318)\n[PASS] test_repairedRuntimeIsBoundedAndHasNoEscapeOpcodes() (gas: 38139466)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 132.86ms (54.24ms CPU time)\n\nRan 23 tests for test/TimelockedAdmin.t.sol:TimelockedAdminTest\n[PASS] test_adminCannotBeHandedToARoleHolder() (gas: 107046)\n[PASS] test_adminHandoverIsTwoStep() (gas: 483977)\n[PASS] test_adminWalletCannotHoldARole() (gas: 105720)\n[PASS] test_configurationCannotBeCalledDirectly() (gas: 168794)\n[PASS] test_constructorValidatesInput() (gas: 3897)\n[PASS] test_executeAtExactlyReadyTimeSucceeds() (gas: 141031)\n[PASS] test_executeBubblesTargetRevertAndKeepsOperation() (gas: 107529)\n[PASS] test_executeRejectsCallDataForCodelessTarget() (gas: 99026)\n[PASS] test_executeRespectsDelayAndGraceBoundaries() (gas: 291764)\n[PASS] test_executorMustBeAContract() (gas: 116721)\n[PASS] test_guardianCanOnlyTighten() (gas: 257058)\n[PASS] test_guardianVetoesScheduledOperation() (gas: 157888)\n[PASS] test_minDelayChangeAppliesToLaterSchedules() (gas: 398687)\n[PASS] test_oneAddressHoldsAtMostOneRole() (gas: 110112)\n[PASS] test_onlyAdminSchedulesAndExecutes() (gas: 124156)\n[PASS] test_onlyGuardianPausesAndStrangerCannotUnpause() (gas: 472243)\n[PASS] test_quorumBounds() (gas: 104665)\n[PASS] test_quorumCannotExceedSigners() (gas: 106797)\n[PASS] test_rolesAreSeparatedAfterConfiguration() (gas: 68190)\n[PASS] test_scheduleRejectsShortLongAndDuplicate() (gas: 159223)\n[PASS] test_signerCannotBecomeGuardian() (gas: 144348)\n[PASS] test_timelockCannotDropSignersBelowQuorum() (gas: 487793)\n[PASS] test_treasuryEthLeavesOnlyThroughADelayedOperation() (gas: 129171)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 132.92ms (2.59ms CPU time)\n\nRan 21 tests for test/FeeHook.t.sol:FeeHookNativeEthTest\n[PASS] testFuzz_feeAccountingMatchesAcrossSwapShapes(uint256,bool,bool) (runs: 256, μ: 319856, ~: 314067)\n[PASS] test_buyExactInput_feeTakenFromTheQuotePaid() (gas: 325183)\n[PASS] test_buyExactOutput_feeAddedToTheQuotePaid() (gas: 301553)\n[PASS] test_callbacksAreOnlyForThePoolManager() (gas: 114036)\n[PASS] test_create2CollisionCannotMarkHookAsDeployed() (gas: 162273386)\n[PASS] test_deployerAuthenticatesCodeAndAppendsOnlyItsFixedArguments() (gas: 163749408)\n[PASS] test_deployerRejectsAQuoteTheWaterfallCannotAccountFor() (gas: 651839)\n[PASS] test_deployerRejectsWrongSaltAndSecondDeployment() (gas: 163680931)\n[PASS] test_dustSwapWithZeroFeeStillWorks() (gas: 214260)\n[PASS] test_feeAndSplitChangesReachTheHookThroughTheTimelockOnly() (gas: 658115)\n[PASS] test_feeEventIsIndexedByPoolSenderAndCurrency() (gas: 314151)\n[PASS] test_feeIsAlwaysCollectedInTheQuoteCurrencyNeverInTheProjectToken() (gas: 973549)\n[PASS] test_feesFlowFromSwapToWaterfallToVaultWithoutTradingTheBasket() (gas: 1132963)\n[PASS] test_hookAcceptsOnlyItsOnePool() (gas: 810004)\n[PASS] test_hookAddressCarriesExactlyTheRequiredPermissionBits() (gas: 75182)\n[PASS] test_nativeFeesArriveAsEthAndTheReceiveHookDoesNothing() (gas: 330760)\n[PASS] test_quoteSpecifiedExactInputExhaustedRangeRevertsAtomically() (gas: 638393)\n[PASS] test_quoteSpecifiedExactOutputPartialFillRevertsAtomically() (gas: 242603)\n[PASS] test_sellExactInput_feeTakenFromTheQuoteReceived() (gas: 288369)\n[PASS] test_sellExactOutput_traderStillReceivesTheExactQuote() (gas: 288953)\n[PASS] test_zeroHookFeeLeavesSwapsUntouched() (gas: 406821)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 133.01ms (325.38ms CPU time)\n\nRan 9 tests for test/adversarial/ProposalBoundaries.t.sol:ProposalBoundariesTest\n[PASS] testFuzz_everySignedFieldIsBoundToTheSignature(uint8,uint256) (runs: 1000, μ: 295513, ~: 352530)\n[PASS] test_clearExpiredAfterBoundaryPreservesReplayProtection() (gas: 974662)\n[PASS] test_clearExpiredAtBoundaryCannotEraseAnExecutableProposal() (gas: 1216965)\n[PASS] test_delayedAgeIncreaseIsRecheckedAtActivation() (gas: 1211646)\n[PASS] test_delayedMethodologyChangeInvalidatesPendingProposal() (gas: 1221045)\n[PASS] test_delayedRevocationIsRecheckedAtActivation() (gas: 1207764)\n[PASS] test_delayedWeightCapReductionIsRecheckedAtActivation() (gas: 1264448)\n[PASS] test_failedQuorumDoesNotPoisonARetryWithValidSignatures() (gas: 828851)\n[PASS] test_signatureCannotBeReusedOnAnotherManager() (gas: 326192)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 132.99ms (139.65ms CPU time)\n\nRan 4 tests for test/Launch816.t.sol:Launch816Test\n[PASS] test_originalFailsAtSeventhApplicationWithTransactionBudget() (gas: 36752803)\n[PASS] test_originalGettersAndResolvedArgumentsWorkWithEnoughGas() (gas: 17666768)\n[PASS] test_repairedLaunchFitsTransactionBudgetAndGrantsNoRoles() (gas: 32101007)\n[PASS] test_wrongReferenceIsRejectedAndRollsBack() (gas: 14645402)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 318.25ms (72.97ms CPU time)\n\nRan 41 tests for test/EpochManager.t.sol:EpochManagerTest\n[PASS] test_activatedProposalCannotBeReplayed() (gas: 1235847)\n[PASS] test_activationFailsOnceExpiredButSucceedsAtTheExpirySecond() (gas: 1411229)\n[PASS] test_basketGoesStaleWithoutSwarmActivityAndAReportRefreshesIt() (gas: 1837118)\n[PASS] test_basketMayHoldFewerThanFiveAndLeaveTheRestInReserve() (gas: 974431)\n[PASS] test_cancelledProposalCannotBeReplayed() (gas: 799075)\n[PASS] test_digestMatchesIndependentEip712Computation() (gas: 67665)\n[PASS] test_onlyOnePendingProposalUntilItExpires() (gas: 1340173)\n[PASS] test_pauseBlocksPublishAndActivate() (gas: 964870)\n[PASS] test_proposalSignedForAnOlderSignerSetIsRejected() (gas: 200105)\n[PASS] test_publishThenActivateAfterDelay() (gas: 1250824)\n[PASS] test_rejectsAProposalChangedAfterSigning() (gas: 290264)\n[PASS] test_rejectsASignatureFromANonSigner() (gas: 288805)\n[PASS] test_rejectsAttestedMarketDataBelowTheMinimums() (gas: 1218616)\n[PASS] test_rejectsBelowQuorum() (gas: 276586)\n[PASS] test_rejectsExpiredProposal() (gas: 149951)\n[PASS] test_rejectsExpiryThatCannotOutliveTheDelay() (gas: 695183)\n[PASS] test_rejectsExpiryTooFarAhead() (gas: 150567)\n[PASS] test_rejectsMalformedAndMalleableSignatures() (gas: 514847)\n[PASS] test_rejectsMismatchedArrays() (gas: 470056)\n[PASS] test_rejectsMoreThanFiveAssets() (gas: 163595)\n[PASS] test_rejectsQuarantinedToken() (gas: 243675)\n[PASS] test_rejectsStaleAndFutureSnapshots() (gas: 808215)\n[PASS] test_rejectsTheSameSignerTwice() (gas: 290281)\n[PASS] test_rejectsTokenThatIsNotAllowlisted() (gas: 859774)\n[PASS] test_rejectsTokenWithStalePrice() (gas: 287541)\n[PASS] test_rejectsTokenYoungerThanThirtyDays() (gas: 1696545)\n[PASS] test_rejectsTotalWeightAbove100Percent() (gas: 1146659)\n[PASS] test_rejectsWeightAboveTheTokenCap() (gas: 192616)\n[PASS] test_rejectsWhenNoQuorumIsConfigured() (gas: 369577)\n[PASS] test_rejectsWrongEpoch() (gas: 191280)\n[PASS] test_rejectsWrongMethodologyVersion() (gas: 157342)\n[PASS] test_rejectsZeroWeightAndDuplicates() (gas: 509371)\n[PASS] test_replacingLargeBasketTruncatesArraysAndClearsEveryPendingField() (gas: 2315520)\n[PASS] test_reportAnchorNeedsQuorumAndAFreshNewerSnapshot() (gas: 496464)\n[PASS] test_revokingASignerDuringTheDelayInvalidatesThePendingProposal() (gas: 880130)\n[PASS] test_secondEpochNeedsANewerSnapshot() (gas: 1323758)\n[PASS] test_signatureFromAnotherChainIsRejected() (gas: 290803)\n[PASS] test_staleFeedAtActivationBlocksActivation() (gas: 690018)\n[PASS] test_tokenQuarantinedDuringTheDelayBlocksActivation() (gas: 984868)\n[PASS] test_turnoverLimitCapsAdditionsPerEpoch() (gas: 2293819)\n[PASS] test_weeklyCadenceBlocksAnEarlySecondEpoch() (gas: 2279641)\nSuite result: ok. 41 passed; 0 failed; 0 skipped; finished in 318.39ms (31.60ms CPU time)\n\nRan 26 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_activationAtSnapshotAgeBoundarySucceeds() (gas: 1189864)\n[PASS] test_activationRechecksSnapshotAgeWithFreshPrices() (gas: 866414)\n[PASS] test_adminCanCancelRecoveryAndGuardianStillVetoesOtherCalls() (gas: 329190)\n[PASS] test_autoQuarantineDoesNotVetoProposalOrCloseFairDeposits() (gas: 3919750)\n[PASS] test_autoQuarantineRetainsDeltaAndWindowUntilGuardianConfirms() (gas: 6878086)\n[PASS] test_deadUntransferablePositionPreservesClaimsAndClosesDeposits() (gas: 5648607)\n[PASS] test_dustDepositCannotLockExistingShares() (gas: 5439911)\n[PASS] test_emptyBasketCannotResetTurnoverHistory() (gas: 1833111)\n[PASS] test_firstDepositChecksRegistryReserveScale() (gas: 159589)\n[PASS] test_firstTradeCannotChooseWindowStart() (gas: 1829943)\n[PASS] test_fullDustExitCanFreeHeldSlot() (gas: 5167650)\n[PASS] test_gasBurningUnquarantinedBalanceFailsWithBoundedError() (gas: 5682630)\n[PASS] test_guardianCannotVetoReplacementOrUnpause() (gas: 881452)\n[PASS] test_heldQuarantineClosesDepositsEvenWithFreshFeed() (gas: 4705525)\n[PASS] test_keeperFailuresCannotCreateExitRightsForAnyMember() (gas: 13863486)\n[PASS] test_lateFirstTradeUsesTheActivationSchedule() (gas: 2542285)\n[PASS] test_newSharesCannotRedeemInTheirDepositBlock() (gas: 5048795)\n[PASS] test_newSharesCannotTransferOrTransferFromToBypassLock() (gas: 4836815)\n[PASS] test_onlyKeeperOrTimelockChoosesTreasuryDepositTime() (gas: 507779)\n[PASS] test_proposalDelayAndSnapshotAgeMustLeaveExecutionTime() (gas: 1315527)\n[PASS] test_proposalDelayCannotConsumeEntireValidityPeriod() (gas: 33045)\n[PASS] test_quarantinedGasBurnerCannotStopUnrelatedTrades() (gas: 5369040)\n[PASS] test_releaseStartsANewFailureStreak() (gas: 6663761)\n[PASS] test_strictUnreadableBalancePreservesSharesAfterHoldingPeriod() (gas: 4584309)\n[PASS] test_unreadableNonStrictRedemptionEmitsUnknownSkippedSlice() (gas: 4627010)\n[PASS] test_untrackedDonationDoesNotBlockMemberPurchase() (gas: 1982111)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 319.34ms (98.15ms CPU time)\n\nRan 22 tests for test/IndexVault.t.sol:IndexVaultTest\n[PASS] testFuzz_depositThenRedeemNeverReturnsMore(uint256,uint256) (runs: 256, μ: 5929486, ~: 5937219)\n[PASS] test_depositCapBoundsTheBeta() (gas: 1011567)\n[PASS] test_depositFeeAccruesToExistingHolders() (gas: 946551)\n[PASS] test_depositHonoursMinShares() (gas: 434943)\n[PASS] test_depositIsRefusedWhileAHeldTokenHasNoFreshPrice() (gas: 5061980)\n[PASS] test_depositRejectsZeroAmountAndZeroReceiver() (gas: 185781)\n[PASS] test_depositsStayClosedUntilAGuardianExists() (gas: 28153437)\n[PASS] test_donationInflationDoesNotStealFromTheNextDepositor() (gas: 760549)\n[PASS] test_executorCannotTakeUntrackedTokenOrEndWithoutBegin() (gas: 485451)\n[PASS] test_firstDepositMintsOneShareUnitPerReserveUnit() (gas: 357848)\n[PASS] test_laterDepositorPaysCurrentNav() (gas: 4773481)\n[PASS] test_navAndHoldingsFollowTheBasketAndPrices() (gas: 4955557)\n[PASS] test_onlyTheExecutorContractMovesAssets() (gas: 540082)\n[PASS] test_pauseClosesDepositsButNeverRedemptions() (gas: 559523)\n[PASS] test_redeemPaysProRataInKind() (gas: 4960250)\n[PASS] test_redeemRejectsZeroAndMoreThanBalance() (gas: 404240)\n[PASS] test_redeemWorksWithSwarmKeeperAndOraclesAllOffline() (gas: 4930189)\n[PASS] test_rescueCannotTouchReserveOrBasket() (gas: 5190181)\n[PASS] test_shareTokenMetadata() (gas: 41233)\n[PASS] test_tokenWithBrokenBalanceOfBlocksDepositsNotRedemptions() (gas: 5131387)\n[PASS] test_untransferableTokenCannotTrapHolders() (gas: 4826818)\n[PASS] test_wrongReserveDecimalsAreCaughtOnFirstDeposit() (gas: 156998)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 326.58ms (362.75ms CPU time)\n\nRan 1 test for test/invariant/Solvency.invariant.t.sol:SolvencyInvariantTest\n[PASS]\nSolvencyInvariantTest invariants:\n[PASS] invariant_executorHoldsNothingBetweenTrades\n[PASS] invariant_feeAccountingConserves\n[PASS] invariant_noPropertyViolatedMidSequence\n[PASS] invariant_vaultIsSolventAndConsistent\n SolvencyInvariantTest invariants (runs: 32, calls: 2048, reverts: 0)\n\n╭----------+-------------------+-------+---------+----------╮\n| Contract | Selector          | Calls | Reverts | Discards |\n+===========================================================+\n| Handler  | claim             | 287   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | collectFees       | 296   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | deposit           | 309   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | movePrice         | 302   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | pushBasketReserve | 294   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | rebalance         | 275   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | redeem            | 285   | 0       | 0        |\n╰----------+-------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.03s (2.02s CPU time)\n\nRan 1 test for test/adversarial/TreasurySequence.invariant.t.sol:TreasurySequenceInvariantTest\n[PASS] invariant_treasuryAndFixedSupplyConserveValue() (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------+-------+---------+----------╮\n| Contract                | Selector            | Calls | Reverts | Discards |\n+============================================================================+\n| TreasurySequenceHandler | advance             | 3482  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | cancel              | 3539  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | execute             | 3491  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | fund                | 3535  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | moveLaunchTokens    | 3458  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | schedule            | 3522  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | unauthorizedExecute | 3549  | 0       | 0        |\n╰-------------------------+---------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.60s (3.59s CPU time)\n\nRan 1 test for test/adversarial/CustodySequence.invariant.t.sol:CustodySequenceInvariantTest\n[PASS]\nCustodySequenceInvariantTest invariants:\n[PASS] invariant_allSharesAreBackedAndAccountedFor\n[PASS] invariant_everyReserveUnitHasADestination\n CustodySequenceInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭------------------------+----------------+-------+---------+----------╮\n| Contract               | Selector       | Calls | Reverts | Discards |\n+======================================================================+\n| CustodySequenceHandler | changeSplit    | 2060  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | claim          | 2001  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | deposit        | 2073  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | distribute     | 2064  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | donate         | 2016  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | push           | 2019  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | receiveFees    | 2115  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | redeem         | 2080  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | roundTrip      | 2065  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | togglePause    | 2094  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | transferShares | 1984  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | treasuryRedeem | 2005  | 0       | 0        |\n╰------------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.28s (6.27s CPU time)\n\nRan 21 test suites in 6.28s (14.24s CPU time): 287 tests passed, 0 failed, 1 skipped (288 total tests)\n","passed":true},{"durationMs":88,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AssetRegistry.approveToken(address,address,uint32,uint16,uint40,bytes32)\",\"AssetRegistry.quarantine(address)\",\"AssetRegistry.quarantineIfStale(address)\",\"AssetRegistry.releaseQuarantine(address)\",\"AssetRegistry.revokeToken(address)\",\"AssetRegistry.setMethodology(uint32,bytes32)\",\"AssetRegistry.setParam(uint8,uint256)\",\"AssetRegistry.setReserveFeed(address,uint32)\",\"AssetRegistry.setRouter(address,bool)\",\"EpochManager.activate()\",\"EpochManager.anchorReport(uint64,bytes32,bytes[])\",\"EpochManager.cancelPending()\",\"EpochManager.clearExpired()\",\"EpochManager.publish((uint64,uint64,uint64,uint32,uint32,bytes32,address[],uint16[],uint256[],uint256[],uint256[]),bytes[])\",\"FeeHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"FeeHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"FeeHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"FeeHookDeployer.deploy(bytes32,bytes)\",\"FeeWaterfall.claim(uint8)\",\"FeeWaterfall.distribute()\",\"FeeWaterfall.pushBasketReserve(uint256)\",\"FeeWaterfall.receive()\",\"FeeWaterfall.rescue(address,address)\",\"FeeWaterfall.setRecipient(uint8,address)\",\"FeeWaterfall.setSplit(uint16,uint16,uint16,uint16,uint16)\",\"FeeWaterfall.setSwapFee(uint24,uint24)\",\"IndexVault.approve(address,uint256)\",\"IndexVault.beginTrade(address,uint256)\",\"IndexVault.deposit(uint256,address,uint256)\",\"IndexVault.endTrade(address)\",\"IndexVault.redeem(uint256,address,bool)\",\"IndexVault.rescue(address,address)\",\"IndexVault.setDepositCap(uint256)\",\"IndexVault.transfer(address,uint256)\",\"IndexVault.transferFrom(address,address,uint256)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\",\"RebalanceExecutor.disposeQuarantined(address,uint256,uint256,address,bytes)\",\"RebalanceExecutor.executeTrade(address,address,uint256,uint256,address,bytes)\",\"RebalanceExecutor.swapThroughRouter(address,address,uint256,uint256,address,bytes)\",\"TimelockedAdmin.acceptAdmin()\",\"TimelockedAdmin.cancel(bytes32)\",\"TimelockedAdmin.execute(address,uint256,bytes,bytes32)\",\"TimelockedAdmin.pause()\",\"TimelockedAdmin.receive()\",\"TimelockedAdmin.revokeKeeper(address)\",\"TimelockedAdmin.revokeSigner(address)\",\"TimelockedAdmin.schedule(address,uint256,bytes,bytes32,uint256)\",\"TimelockedAdmin.setExecutor(address)\",\"TimelockedAdmin.setGuardian(address)\",\"TimelockedAdmin.setKeeper(address,bool)\",\"TimelockedAdmin.setMinDelay(uint256)\",\"TimelockedAdmin.setQuorum(uint32)\",\"TimelockedAdmin.setSigner(address,bool)\",\"TimelockedAdmin.transferAdmin(address)\",\"TimelockedAdmin.unpause()\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":57,\"README.md\":300,\"docs/LAUNCH-816.md\":149,\"docs/METHODOLOGY.md\":139,\"docs/PROPOSAL.md\":99,\"docs/SECURITY.md\":105,\"docs/VERIFICATION-816.md\":145,\"foundry.toml\":34,\"launch.json\":71,\"script/Deploy.s.sol\":65,\"src/AssetRegistry.sol\":340,\"src/EpochManager.sol\":404,\"src/FeeHook.sol\":258,\"src/FeeHookDeployer.sol\":108,\"src/FeeWaterfall.sol\":254,\"src/IndexVault.sol\":407,\"src/LaunchToken.sol\":16,\"src/RebalanceExecutor.sol\":384,\"src/TimelockedAdmin.sol\":283,\"src/interfaces/IIndex.sol\":91,\"test/AssetRegistry.t.sol\":298,\"test/Deployment.t.sol\":155,\"test/EpochManager.t.sol\":611,\"test/FeeHook.t.sol\":481,\"test/FeeWaterfall.t.sol\":239,\"test/IndexVault.t.sol\":366,\"test/Launch816.t.sol\":113,\"test/Launch816Record.t.sol\":131,\"test/LaunchToken.t.sol\":69,\"test/RebalanceExecutor.t.sol\":488,\"test/Revision.t.sol\":426,\"test/StaleFeedQuarantine.t.sol\":89,\"test/TimelockedAdmin.t.sol\":272,\"test/adversarial/CustodySequence.invariant.t.sol\":315,\"test/adversarial/ExternalTokenFailures.t.sol\":212,\"test/adversarial/ProposalBoundaries.t.sol\":129,\"test/adversarial/README.md\":42,\"test/adversarial/TreasurySequence.invariant.t.sol\":224,\"test/fork/Launch816Fork.t.sol\":137,\"test/invariant/Handler.sol\":165,\"test/invariant/Solvency.invariant.t.sol\":95,\"test/utils/Fixture.sol\":282,\"test/utils/Launch816.sol\":220,\"test/utils/Launch816Original.sol\":40,\"test/utils/Mocks.sol\":180,\"test/utils/V4Router.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2bdf7dc3287b3fb7098838fcb4e47dee90161eaff94465dea942816a4bdc0b83","verifiedTreeHash":"223a0580f095c46cea80abd213d9fc3910d159ff","verifierVersion":"0.1.0+c4d32abc"},{"checks":[{"durationMs":11991,"exitCode":0,"name":"build","output":"Compiling 130 files with Solc 0.8.26\nSolc 0.8.26 finished in 11.88s\nCompiler run successful!\n","passed":true},{"durationMs":6196,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/Launch816Fork.t.sol:Launch816ForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 1.13ms (0.00ns CPU time)\n\nRan 23 tests for test/TimelockedAdmin.t.sol:TimelockedAdminTest\n[PASS] test_adminCannotBeHandedToARoleHolder() (gas: 107046)\n[PASS] test_adminHandoverIsTwoStep() (gas: 483977)\n[PASS] test_adminWalletCannotHoldARole() (gas: 105720)\n[PASS] test_configurationCannotBeCalledDirectly() (gas: 168794)\n[PASS] test_constructorValidatesInput() (gas: 3897)\n[PASS] test_executeAtExactlyReadyTimeSucceeds() (gas: 141031)\n[PASS] test_executeBubblesTargetRevertAndKeepsOperation() (gas: 107529)\n[PASS] test_executeRejectsCallDataForCodelessTarget() (gas: 99026)\n[PASS] test_executeRespectsDelayAndGraceBoundaries() (gas: 291764)\n[PASS] test_executorMustBeAContract() (gas: 116721)\n[PASS] test_guardianCanOnlyTighten() (gas: 257058)\n[PASS] test_guardianVetoesScheduledOperation() (gas: 157888)\n[PASS] test_minDelayChangeAppliesToLaterSchedules() (gas: 398687)\n[PASS] test_oneAddressHoldsAtMostOneRole() (gas: 110112)\n[PASS] test_onlyAdminSchedulesAndExecutes() (gas: 124156)\n[PASS] test_onlyGuardianPausesAndStrangerCannotUnpause() (gas: 472243)\n[PASS] test_quorumBounds() (gas: 104665)\n[PASS] test_quorumCannotExceedSigners() (gas: 106797)\n[PASS] test_rolesAreSeparatedAfterConfiguration() (gas: 68190)\n[PASS] test_scheduleRejectsShortLongAndDuplicate() (gas: 159223)\n[PASS] test_signerCannotBecomeGuardian() (gas: 144348)\n[PASS] test_timelockCannotDropSignersBelowQuorum() (gas: 487793)\n[PASS] test_treasuryEthLeavesOnlyThroughADelayedOperation() (gas: 129171)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 5.94ms (2.00ms CPU time)\n\nRan 3 tests for test/StaleFeedQuarantine.t.sol:StaleFeedQuarantineTest\n[PASS] test_exactHeartbeatAgeIsStillFresh() (gas: 79821)\n[PASS] test_heartbeatSlackClosesTheLapseWindow() (gas: 597352)\n[PASS] test_oneSecondLapseAllowsPermissionlessStickyQuarantine() (gas: 1402580)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 9.65ms (1.27ms CPU time)\n\nRan 13 tests for test/Launch816State.t.sol:Launch816StateTest\n[PASS] testFuzz_noAddressHoldsAnyRoleOrAllowlistEntry(address) (runs: 256, μ: 71743, ~: 71743)\n[PASS] test_configurationRefusesEveryDirectCaller() (gas: 1985768)\n[PASS] test_depositsAreClosedAndNothingCanBeRedeemed() (gas: 146508)\n[PASS] test_epochsVaultExecutorAndWaterfallStartEmpty() (gas: 870115)\n[PASS] test_feeFlowIsInertUntilConfigured() (gas: 817086)\n[PASS] test_firstDepositVerifiesTheReserveLiteralsAgainstTheToken() (gas: 918116)\n[PASS] test_firstGovernanceStepOpensDepositsUpToExactlyTheManifestCap() (gas: 1348289)\n[PASS] test_hookDeploysWithTheLaunchedLiteralsAndYieldsTheNativePoolKey() (gas: 2513807)\n[PASS] test_nativeFeesAreWrappedIntoTheReserveAndCannotBeSwept() (gas: 1038516)\n[PASS] test_nobodyCanTradeProposeOrAnchorBeforeRolesExist() (gas: 434844)\n[PASS] test_registryStartsWithDocumentedDefaultsAndNoListings() (gas: 190178)\n[PASS] test_reserveReadsNeedLiveCodeAtTheWethLiteral() (gas: 724312)\n[PASS] test_timelockStartsWithOnlyTheOwnerAndTheManifestDelay() (gas: 72480)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 14.27ms (13.69ms CPU time)\n\nRan 24 tests for test/AssetRegistry.t.sol:AssetRegistryTest\n[PASS] testFuzz_convertRoundTripNeverCreatesValue(uint256,uint8,uint8) (runs: 256, μ: 71214, ~: 83242)\n[PASS] test_anyoneCanQuarantineAStaleTokenButNotAFreshOne() (gas: 150827)\n[PASS] test_approveTokenRejectsCodelessFeed() (gas: 760054)\n[PASS] test_approveTokenRejectsCodelessTokenAndFeed() (gas: 117530)\n[PASS] test_approveTokenRejectsReserveAsset() (gas: 117416)\n[PASS] test_approveTokenRejectsZeroCapAndFutureListing() (gas: 866368)\n[PASS] test_badFeedAnswersReadAsNoPrice() (gas: 364271)\n[PASS] test_convertFailsWhenReserveFeedIsStale() (gas: 70866)\n[PASS] test_convertHandlesDifferentDecimals() (gas: 172490)\n[PASS] test_defaultParametersMatchTheDocumentedStartingValues() (gas: 167510)\n[PASS] test_everySetterIsTimelockOnly() (gas: 178651)\n[PASS] test_freshPriceIsNormalisedTo18Decimals() (gas: 23738)\n[PASS] test_listedTokensAndAssetRecordArePublished() (gas: 41428)\n[PASS] test_methodologyVersionOnlyMovesForward() (gas: 514732)\n[PASS] test_minimumTokenAgeCannotGoBelowThirtyDays() (gas: 109737)\n[PASS] test_onlyGuardianExecutorOrTimelockQuarantine() (gas: 583327)\n[PASS] test_paramsStayInsideHardBounds() (gas: 473219)\n[PASS] test_priceIsValidAtHeartbeatAndStaleOneSecondLater() (gas: 53355)\n[PASS] test_revertingOrMalformedFeedDoesNotRevertTheReader() (gas: 177818)\n[PASS] test_revokedTokenIsNotEligibleButStillPriced() (gas: 402836)\n[PASS] test_routerAllowlist() (gas: 396988)\n[PASS] test_slippageLimitCannotBeSwitchedOff() (gas: 109539)\n[PASS] test_tokenYoungerThanThirtyDaysIsNotEligible() (gas: 1623635)\n[PASS] test_windowCannotExceedInterval() (gas: 112207)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 22.05ms (19.17ms CPU time)\n\nRan 7 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_constructorsLeaveTheLaunchSupplyWithItsHolder() (gas: 28038608)\n[PASS] test_constructorsNeedNoExternalContractAndWireInDependencyOrder() (gas: 28090754)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 4047)\n[PASS] test_launchGrantsNoRoleToAnyoneAndNothingToTheDeployer() (gas: 28155707)\n[PASS] test_missingWaterfallAndIdenticalCurrenciesStillFailClosed() (gas: 8224)\n[PASS] test_nativeQuoteStillRequiresMatchingWrappedReserve() (gas: 8276)\n[PASS] test_runtimeFitsEip170AndContainsNoDelegatecallCallcodeOrSelfdestruct() (gas: 51161942)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 35.83ms (32.54ms CPU time)\n\nRan 14 tests for test/FeeWaterfall.t.sol:FeeWaterfallTest\n[PASS] testFuzz_distributionConservesEveryUnit(uint256,uint256,uint16,uint16) (runs: 256, μ: 422516, ~: 428387)\n[PASS] test_basketReserveIsDepositedAtNavForTheTreasury() (gas: 841029)\n[PASS] test_basketReserveKeepsAccumulatingWhileTheVaultIsClosed() (gas: 931489)\n[PASS] test_claimPaysOnlyTheConfiguredRecipient() (gas: 1329657)\n[PASS] test_configurationIsTimelockOnly() (gas: 102613)\n[PASS] test_distributeSplitsTheNonLpSeventyFivePercent() (gas: 388340)\n[PASS] test_pushHonoursMinShares() (gas: 425705)\n[PASS] test_rescueCannotTouchFeeAssets() (gas: 931184)\n[PASS] test_roundingDustGoesToTheBasketReserve() (gas: 246455)\n[PASS] test_splitChangeOnlyAffectsLaterFees() (gas: 789294)\n[PASS] test_splitMustSumToOneHundredPercent() (gas: 81320)\n[PASS] test_staleBasketSurchargeIsAppliedOnlyWhileStale() (gas: 1512119)\n[PASS] test_startingSplitAndFeeAreVisibleOnChain() (gas: 54016)\n[PASS] test_swapFeeIsBoundedAtThreePercentIncludingSurcharge() (gas: 94494)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 36.01ms (34.32ms CPU time)\n\nRan 4 tests for test/Launch816.t.sol:Launch816Test\n[PASS] test_originalFailsAtSeventhApplicationWithTransactionBudget() (gas: 36752803)\n[PASS] test_originalGettersAndResolvedArgumentsWorkWithEnoughGas() (gas: 17666768)\n[PASS] test_repairedLaunchFitsTransactionBudgetAndGrantsNoRoles() (gas: 32101007)\n[PASS] test_wrongReferenceIsRejectedAndRollsBack() (gas: 14645402)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 52.95ms (99.91ms CPU time)\n\nRan 4 tests for test/Launch816Record.t.sol:Launch816RecordTest\n[PASS] test_embeddedOriginalBytecodesMatchTheLaunchRecord() (gas: 46424)\n[PASS] test_manifestResolvesToTheRecordedAddresses() (gas: 223822)\n[PASS] test_repairedCreationCodeIsTheVerifiedTree() (gas: 40318)\n[PASS] test_repairedRuntimeIsBoundedAndHasNoEscapeOpcodes() (gas: 38139466)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 66.02ms (37.62ms CPU time)\n\nRan 4 tests for test/Launch816Gas.t.sol:Launch816GasTest\n[PASS] test_codeDepositSavingFollowsFromTheSizeTable() (gas: 31900)\n[PASS] test_offlineSavingAgreesWithTheForkMeasuredSaving() (gas: 69111116)\nLogs:\n  offline original (intrinsic + application loop): 17016579\n  offline repaired (intrinsic + application loop): 14042451\n  offline saving: 2974128\n  fork saving: 2974352\n  factory work beyond the application loop (fork - offline): 2716987\n  predicted production total (service record - saving): 17841998\n  transaction cap: 16777216\n  predicted overrun, to be confirmed or refuted by the service: 1064782\n\n[PASS] test_perApplicationCreationGasOrdering() (gas: 99779552)\nLogs:\n  original create2 gas 0: 1343975\n  repaired create2 gas 0: 1299272\n  original create2 gas 1: 2213215\n  repaired create2 gas 1: 2136927\n  original create2 gas 2: 3169807\n  repaired create2 gas 2: 2721453\n  original create2 gas 3: 2814461\n  repaired create2 gas 3: 2435010\n  original create2 gas 4: 2724198\n  repaired create2 gas 4: 1977666\n  original create2 gas 5: 1437037\n  repaired create2 gas 5: 1347298\n  original create2 gas 6: 1509919\n  repaired create2 gas 6: 446151\n\n[PASS] test_runtimeSizesMatchTheReportAndShrankEverywhere() (gas: 37669877)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 66.82ms (146.87ms CPU time)\n\nRan 21 tests for test/FeeHook.t.sol:FeeHookErc20QuoteHighTest\n[PASS] testFuzz_feeAccountingMatchesAcrossSwapShapes(uint256,bool,bool) (runs: 256, μ: 386033, ~: 387469)\n[PASS] test_buyExactInput_feeTakenFromTheQuotePaid() (gas: 374122)\n[PASS] test_buyExactOutput_feeAddedToTheQuotePaid() (gas: 352194)\n[PASS] test_callbacksAreOnlyForThePoolManager() (gas: 114689)\n[PASS] test_create2CollisionCannotMarkHookAsDeployed() (gas: 23612044)\n[PASS] test_deployerAuthenticatesCodeAndAppendsOnlyItsFixedArguments() (gas: 25088335)\n[PASS] test_deployerRejectsAQuoteTheWaterfallCannotAccountFor() (gas: 651861)\n[PASS] test_deployerRejectsWrongSaltAndSecondDeployment() (gas: 25019553)\n[PASS] test_dustSwapWithZeroFeeStillWorks() (gas: 240738)\n[PASS] test_feeAndSplitChangesReachTheHookThroughTheTimelockOnly() (gas: 699072)\n[PASS] test_feeEventIsIndexedByPoolSenderAndCurrency() (gas: 365253)\n[PASS] test_feeIsAlwaysCollectedInTheQuoteCurrencyNeverInTheProjectToken() (gas: 1162729)\n[PASS] test_feesFlowFromSwapToWaterfallToVaultWithoutTradingTheBasket() (gas: 1189571)\n[PASS] test_hookAcceptsOnlyItsOnePool() (gas: 810958)\n[PASS] test_hookAddressCarriesExactlyTheRequiredPermissionBits() (gas: 75234)\n[PASS] test_quoteIsCurrencyOne() (gas: 5631)\n[PASS] test_quoteSpecifiedExactInputExhaustedRangeRevertsAtomically() (gas: 746250)\n[PASS] test_quoteSpecifiedExactOutputPartialFillRevertsAtomically() (gas: 299290)\n[PASS] test_sellExactInput_feeTakenFromTheQuoteReceived() (gas: 357542)\n[PASS] test_sellExactOutput_traderStillReceivesTheExactQuote() (gas: 356623)\n[PASS] test_zeroHookFeeLeavesSwapsUntouched() (gas: 431486)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 102.41ms (171.99ms CPU time)\n\nRan 21 tests for test/FeeHook.t.sol:FeeHookErc20QuoteLowTest\n[PASS] testFuzz_feeAccountingMatchesAcrossSwapShapes(uint256,bool,bool) (runs: 256, μ: 385459, ~: 383124)\n[PASS] test_buyExactInput_feeTakenFromTheQuotePaid() (gas: 380419)\n[PASS] test_buyExactOutput_feeAddedToTheQuotePaid() (gas: 357085)\n[PASS] test_callbacksAreOnlyForThePoolManager() (gas: 114108)\n[PASS] test_create2CollisionCannotMarkHookAsDeployed() (gas: 23704765)\n[PASS] test_deployerAuthenticatesCodeAndAppendsOnlyItsFixedArguments() (gas: 25180773)\n[PASS] test_deployerRejectsAQuoteTheWaterfallCannotAccountFor() (gas: 651839)\n[PASS] test_deployerRejectsWrongSaltAndSecondDeployment() (gas: 25112274)\n[PASS] test_dustSwapWithZeroFeeStillWorks() (gas: 247265)\n[PASS] test_feeAndSplitChangesReachTheHookThroughTheTimelockOnly() (gas: 704022)\n[PASS] test_feeEventIsIndexedByPoolSenderAndCurrency() (gas: 371441)\n[PASS] test_feeIsAlwaysCollectedInTheQuoteCurrencyNeverInTheProjectToken() (gas: 1162204)\n[PASS] test_feesFlowFromSwapToWaterfallToVaultWithoutTradingTheBasket() (gas: 1188828)\n[PASS] test_hookAcceptsOnlyItsOnePool() (gas: 810088)\n[PASS] test_hookAddressCarriesExactlyTheRequiredPermissionBits() (gas: 75204)\n[PASS] test_quoteIsCurrencyZero() (gas: 5581)\n[PASS] test_quoteSpecifiedExactInputExhaustedRangeRevertsAtomically() (gas: 752725)\n[PASS] test_quoteSpecifiedExactOutputPartialFillRevertsAtomically() (gas: 293009)\n[PASS] test_sellExactInput_feeTakenFromTheQuoteReceived() (gas: 350941)\n[PASS] test_sellExactOutput_traderStillReceivesTheExactQuote() (gas: 351230)\n[PASS] test_zeroHookFeeLeavesSwapsUntouched() (gas: 436444)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 106.78ms (165.22ms CPU time)\n\nRan 29 tests for test/RebalanceExecutor.t.sol:RebalanceExecutorTest\n[PASS] testFuzz_sandwichedFillNeverCostsMoreThanTheSlippageLimit(uint256,uint256) (runs: 256, μ: 470500, ~: 469595)\n[PASS] test_buysTheTopFiveAtTwentyPercentAndKeepsTheBuffer() (gas: 4134962)\n[PASS] test_cannotBuyATokenOutsideTheActiveBasket() (gas: 138996)\n[PASS] test_cannotBuyBeyondTheTargetDelta() (gas: 3277094)\n[PASS] test_cannotSellATokenAtOrBelowTarget() (gas: 3121706)\n[PASS] test_disposalIsOnlyForQuarantinedTokensAndEnforcesItsFloor() (gas: 3083373)\n[PASS] test_dustTradeWithNoEnforceableFloorIsRefused() (gas: 542515)\n[PASS] test_fillAtTheSlippageLimitSucceedsAndResetsTheFailureCount() (gas: 760413)\n[PASS] test_fillBelowTheOracleFloorIsUndoneAndCounted() (gas: 502157)\n[PASS] test_keeperFloorAppliesWhenStricterThanTheOracleFloor() (gas: 413532)\n[PASS] test_noTradingBeforeAnyBasketIsActive() (gas: 90208)\n[PASS] test_oneLegMustBeTheReserve() (gas: 3055491)\n[PASS] test_onlyAllowlistedRoutersAndNeverProjectContracts() (gas: 1156929)\n[PASS] test_onlyKeepersTrade() (gas: 285430)\n[PASS] test_outputIsMeasuredOnTheVaultSoFeeOnTransferTokensFailTheFloor() (gas: 3250922)\n[PASS] test_partialFillReturnsTheUnsoldRemainder() (gas: 356993)\n[PASS] test_pauseStopsTrading() (gas: 130806)\n[PASS] test_quarantinedPositionCanBeExitedAtAnyTime() (gas: 3799227)\n[PASS] test_quarantinedTokenWithDeadFeedIsDisposedThroughTheTimelock() (gas: 3771767)\n[PASS] test_removedMemberIsSoldAndItsReplacementBought() (gas: 5579511)\n[PASS] test_repeatedFailuresQuarantineTheAssetInsteadOfBlockingTheBasket() (gas: 3337916)\n[PASS] test_replacedExecutorLosesAccessToTheVault() (gas: 1047087)\n[PASS] test_reserveBufferCannotBeSpent() (gas: 3872548)\n[PASS] test_routerCannotReenterVaultOrExecutorDuringASwap() (gas: 402687)\n[PASS] test_sellsOnlyTheExcessOverTarget() (gas: 4377560)\n[PASS] test_smallDriftDoesNotTradeButMaterialDriftDoes() (gas: 4404631)\n[PASS] test_staleOracleStopsATradeUntilTheTokenIsQuarantined() (gas: 4006949)\n[PASS] test_swapEntryPointIsNotCallableFromOutside() (gas: 38611)\n[PASS] test_tradesOutsideTheWindowWaitForTheNextInterval() (gas: 4908965)\nSuite result: ok. 29 passed; 0 failed; 0 skipped; finished in 106.94ms (140.85ms CPU time)\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transfersConserveSupply(address,uint256) (runs: 256, μ: 85556, ~: 85570)\n[PASS] test_metadataAndFixedSupplyMintedToDeployer() (gas: 51556)\n[PASS] test_noMintOrAdminEntryPointExists() (gas: 144953)\n[PASS] test_transferBeyondBalanceReverts() (gas: 32873)\n[PASS] test_transferFromNeedsAllowance() (gas: 137195)\n[PASS] test_transferMovesExactlyTheAmount() (gas: 74767)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 108.89ms (109.52ms CPU time)\n\nRan 41 tests for test/EpochManager.t.sol:EpochManagerTest\n[PASS] test_activatedProposalCannotBeReplayed() (gas: 1235847)\n[PASS] test_activationFailsOnceExpiredButSucceedsAtTheExpirySecond() (gas: 1411229)\n[PASS] test_basketGoesStaleWithoutSwarmActivityAndAReportRefreshesIt() (gas: 1837118)\n[PASS] test_basketMayHoldFewerThanFiveAndLeaveTheRestInReserve() (gas: 974431)\n[PASS] test_cancelledProposalCannotBeReplayed() (gas: 799075)\n[PASS] test_digestMatchesIndependentEip712Computation() (gas: 67665)\n[PASS] test_onlyOnePendingProposalUntilItExpires() (gas: 1340173)\n[PASS] test_pauseBlocksPublishAndActivate() (gas: 964870)\n[PASS] test_proposalSignedForAnOlderSignerSetIsRejected() (gas: 200105)\n[PASS] test_publishThenActivateAfterDelay() (gas: 1250824)\n[PASS] test_rejectsAProposalChangedAfterSigning() (gas: 290264)\n[PASS] test_rejectsASignatureFromANonSigner() (gas: 288805)\n[PASS] test_rejectsAttestedMarketDataBelowTheMinimums() (gas: 1218616)\n[PASS] test_rejectsBelowQuorum() (gas: 276586)\n[PASS] test_rejectsExpiredProposal() (gas: 149951)\n[PASS] test_rejectsExpiryThatCannotOutliveTheDelay() (gas: 695183)\n[PASS] test_rejectsExpiryTooFarAhead() (gas: 150567)\n[PASS] test_rejectsMalformedAndMalleableSignatures() (gas: 514847)\n[PASS] test_rejectsMismatchedArrays() (gas: 470056)\n[PASS] test_rejectsMoreThanFiveAssets() (gas: 163595)\n[PASS] test_rejectsQuarantinedToken() (gas: 243675)\n[PASS] test_rejectsStaleAndFutureSnapshots() (gas: 808215)\n[PASS] test_rejectsTheSameSignerTwice() (gas: 290281)\n[PASS] test_rejectsTokenThatIsNotAllowlisted() (gas: 859774)\n[PASS] test_rejectsTokenWithStalePrice() (gas: 287541)\n[PASS] test_rejectsTokenYoungerThanThirtyDays() (gas: 1696545)\n[PASS] test_rejectsTotalWeightAbove100Percent() (gas: 1146659)\n[PASS] test_rejectsWeightAboveTheTokenCap() (gas: 192616)\n[PASS] test_rejectsWhenNoQuorumIsConfigured() (gas: 369577)\n[PASS] test_rejectsWrongEpoch() (gas: 191280)\n[PASS] test_rejectsWrongMethodologyVersion() (gas: 157342)\n[PASS] test_rejectsZeroWeightAndDuplicates() (gas: 509371)\n[PASS] test_replacingLargeBasketTruncatesArraysAndClearsEveryPendingField() (gas: 2315520)\n[PASS] test_reportAnchorNeedsQuorumAndAFreshNewerSnapshot() (gas: 496464)\n[PASS] test_revokingASignerDuringTheDelayInvalidatesThePendingProposal() (gas: 880130)\n[PASS] test_secondEpochNeedsANewerSnapshot() (gas: 1323758)\n[PASS] test_signatureFromAnotherChainIsRejected() (gas: 290803)\n[PASS] test_staleFeedAtActivationBlocksActivation() (gas: 690018)\n[PASS] test_tokenQuarantinedDuringTheDelayBlocksActivation() (gas: 984868)\n[PASS] test_turnoverLimitCapsAdditionsPerEpoch() (gas: 2293819)\n[PASS] test_weeklyCadenceBlocksAnEarlySecondEpoch() (gas: 2279641)\nSuite result: ok. 41 passed; 0 failed; 0 skipped; finished in 109.08ms (26.47ms CPU time)\n\nRan 9 tests for test/adversarial/ProposalBoundaries.t.sol:ProposalBoundariesTest\n[PASS] testFuzz_everySignedFieldIsBoundToTheSignature(uint8,uint256) (runs: 1000, μ: 296676, ~: 352529)\n[PASS] test_clearExpiredAfterBoundaryPreservesReplayProtection() (gas: 974662)\n[PASS] test_clearExpiredAtBoundaryCannotEraseAnExecutableProposal() (gas: 1216965)\n[PASS] test_delayedAgeIncreaseIsRecheckedAtActivation() (gas: 1211646)\n[PASS] test_delayedMethodologyChangeInvalidatesPendingProposal() (gas: 1221045)\n[PASS] test_delayedRevocationIsRecheckedAtActivation() (gas: 1207764)\n[PASS] test_delayedWeightCapReductionIsRecheckedAtActivation() (gas: 1264448)\n[PASS] test_failedQuorumDoesNotPoisonARetryWithValidSignatures() (gas: 828851)\n[PASS] test_signatureCannotBeReusedOnAnotherManager() (gas: 326192)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 109.02ms (118.74ms CPU time)\n\nRan 21 tests for test/FeeHook.t.sol:FeeHookNativeEthTest\n[PASS] testFuzz_feeAccountingMatchesAcrossSwapShapes(uint256,bool,bool) (runs: 256, μ: 319709, ~: 314056)\n[PASS] test_buyExactInput_feeTakenFromTheQuotePaid() (gas: 325183)\n[PASS] test_buyExactOutput_feeAddedToTheQuotePaid() (gas: 301553)\n[PASS] test_callbacksAreOnlyForThePoolManager() (gas: 114036)\n[PASS] test_create2CollisionCannotMarkHookAsDeployed() (gas: 162273386)\n[PASS] test_deployerAuthenticatesCodeAndAppendsOnlyItsFixedArguments() (gas: 163749408)\n[PASS] test_deployerRejectsAQuoteTheWaterfallCannotAccountFor() (gas: 651839)\n[PASS] test_deployerRejectsWrongSaltAndSecondDeployment() (gas: 163680931)\n[PASS] test_dustSwapWithZeroFeeStillWorks() (gas: 214260)\n[PASS] test_feeAndSplitChangesReachTheHookThroughTheTimelockOnly() (gas: 658115)\n[PASS] test_feeEventIsIndexedByPoolSenderAndCurrency() (gas: 314151)\n[PASS] test_feeIsAlwaysCollectedInTheQuoteCurrencyNeverInTheProjectToken() (gas: 973549)\n[PASS] test_feesFlowFromSwapToWaterfallToVaultWithoutTradingTheBasket() (gas: 1132963)\n[PASS] test_hookAcceptsOnlyItsOnePool() (gas: 810004)\n[PASS] test_hookAddressCarriesExactlyTheRequiredPermissionBits() (gas: 75182)\n[PASS] test_nativeFeesArriveAsEthAndTheReceiveHookDoesNothing() (gas: 330760)\n[PASS] test_quoteSpecifiedExactInputExhaustedRangeRevertsAtomically() (gas: 638393)\n[PASS] test_quoteSpecifiedExactOutputPartialFillRevertsAtomically() (gas: 242603)\n[PASS] test_sellExactInput_feeTakenFromTheQuoteReceived() (gas: 288369)\n[PASS] test_sellExactOutput_traderStillReceivesTheExactQuote() (gas: 288953)\n[PASS] test_zeroHookFeeLeavesSwapsUntouched() (gas: 406821)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 139.84ms (251.91ms CPU time)\n\nRan 10 tests for test/Launch816Resolution.t.sol:Launch816ResolutionTest\n[PASS] testFuzz_differentOwnerMovesEveryAddressAndIsRejected(address) (runs: 256, μ: 3563071, ~: 3563148)\n[PASS] testFuzz_payloadBoundToAnotherLaunchNumberIsRejectedAtIndexZero(uint64) (runs: 256, μ: 3561940, ~: 3561935)\n[PASS] test_cachedAddressesAfterABytecodeChangeAreRejected() (gas: 74722943)\n[PASS] test_deployerPointedAtAnotherApplicationRollsTheBatchBack() (gas: 58431123)\n[PASS] test_everyInitCodeTailIsTheManifestArgumentList() (gas: 1145894)\n[PASS] test_nativeQuoteWithAWaterfallThatDoesNotWrapParksTheLaunch() (gas: 14285745)\n[PASS] test_onlyThreeConstructorsNeedAnEarlierApplication() (gas: 16876)\n[PASS] test_quoteCurrencyMustBeNativeOrTheReserve() (gas: 65782370)\n[PASS] test_repairedAndOriginalPayloadsPassIdenticalArguments() (gas: 1119405)\n[PASS] test_tokenCodeDriftIsNotCaughtByTheAddressCheck() (gas: 14656075)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 326.76ms (459.03ms CPU time)\n\nRan 26 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_activationAtSnapshotAgeBoundarySucceeds() (gas: 1189864)\n[PASS] test_activationRechecksSnapshotAgeWithFreshPrices() (gas: 866414)\n[PASS] test_adminCanCancelRecoveryAndGuardianStillVetoesOtherCalls() (gas: 329190)\n[PASS] test_autoQuarantineDoesNotVetoProposalOrCloseFairDeposits() (gas: 3919750)\n[PASS] test_autoQuarantineRetainsDeltaAndWindowUntilGuardianConfirms() (gas: 6878086)\n[PASS] test_deadUntransferablePositionPreservesClaimsAndClosesDeposits() (gas: 5648607)\n[PASS] test_dustDepositCannotLockExistingShares() (gas: 5439911)\n[PASS] test_emptyBasketCannotResetTurnoverHistory() (gas: 1833111)\n[PASS] test_firstDepositChecksRegistryReserveScale() (gas: 159589)\n[PASS] test_firstTradeCannotChooseWindowStart() (gas: 1829943)\n[PASS] test_fullDustExitCanFreeHeldSlot() (gas: 5167650)\n[PASS] test_gasBurningUnquarantinedBalanceFailsWithBoundedError() (gas: 5682630)\n[PASS] test_guardianCannotVetoReplacementOrUnpause() (gas: 881452)\n[PASS] test_heldQuarantineClosesDepositsEvenWithFreshFeed() (gas: 4705525)\n[PASS] test_keeperFailuresCannotCreateExitRightsForAnyMember() (gas: 13863486)\n[PASS] test_lateFirstTradeUsesTheActivationSchedule() (gas: 2542285)\n[PASS] test_newSharesCannotRedeemInTheirDepositBlock() (gas: 5048795)\n[PASS] test_newSharesCannotTransferOrTransferFromToBypassLock() (gas: 4836815)\n[PASS] test_onlyKeeperOrTimelockChoosesTreasuryDepositTime() (gas: 507779)\n[PASS] test_proposalDelayAndSnapshotAgeMustLeaveExecutionTime() (gas: 1315527)\n[PASS] test_proposalDelayCannotConsumeEntireValidityPeriod() (gas: 33045)\n[PASS] test_quarantinedGasBurnerCannotStopUnrelatedTrades() (gas: 5369040)\n[PASS] test_releaseStartsANewFailureStreak() (gas: 6663761)\n[PASS] test_strictUnreadableBalancePreservesSharesAfterHoldingPeriod() (gas: 4584309)\n[PASS] test_unreadableNonStrictRedemptionEmitsUnknownSkippedSlice() (gas: 4627010)\n[PASS] test_untrackedDonationDoesNotBlockMemberPurchase() (gas: 1982111)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 343.07ms (84.29ms CPU time)\n\nRan 9 tests for test/adversarial/ExternalTokenFailures.t.sol:ExternalTokenFailuresTest\n[PASS] testFuzz_taxedReserveCannotMintSharesForUnreceivedAssets(uint256) (runs: 1000, μ: 1022625, ~: 1024078)\n[PASS] test_failedFeeTransferRollsBackLiabilitiesAndUnlocksClaims() (gas: 1034474)\n[PASS] test_falseReturnStrictRollbackAndNonStrictExit() (gas: 1069012)\n[PASS] test_invalidBooleanStrictRollbackAndNonStrictExit() (gas: 1069357)\n[PASS] test_minShareFailureRollsBackFeeDistributionAndApproval() (gas: 905351)\n[PASS] test_noReturnTokenIsPaidDuringStrictRedemption() (gas: 954053)\n[PASS] test_reserveCallbacksCannotReenterOnDepositOrRedemption() (gas: 1278434)\n[PASS] test_shortReturnStrictRollbackAndNonStrictExit() (gas: 1068812)\n[PASS] test_taxedReserveOneUnitAndMaximumDeposit() (gas: 1991060)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 343.28ms (337.73ms CPU time)\n\nRan 22 tests for test/IndexVault.t.sol:IndexVaultTest\n[PASS] testFuzz_depositThenRedeemNeverReturnsMore(uint256,uint256) (runs: 256, μ: 5926738, ~: 5936603)\n[PASS] test_depositCapBoundsTheBeta() (gas: 1011567)\n[PASS] test_depositFeeAccruesToExistingHolders() (gas: 946551)\n[PASS] test_depositHonoursMinShares() (gas: 434943)\n[PASS] test_depositIsRefusedWhileAHeldTokenHasNoFreshPrice() (gas: 5061980)\n[PASS] test_depositRejectsZeroAmountAndZeroReceiver() (gas: 185781)\n[PASS] test_depositsStayClosedUntilAGuardianExists() (gas: 28153437)\n[PASS] test_donationInflationDoesNotStealFromTheNextDepositor() (gas: 760549)\n[PASS] test_executorCannotTakeUntrackedTokenOrEndWithoutBegin() (gas: 485451)\n[PASS] test_firstDepositMintsOneShareUnitPerReserveUnit() (gas: 357848)\n[PASS] test_laterDepositorPaysCurrentNav() (gas: 4773481)\n[PASS] test_navAndHoldingsFollowTheBasketAndPrices() (gas: 4955557)\n[PASS] test_onlyTheExecutorContractMovesAssets() (gas: 540082)\n[PASS] test_pauseClosesDepositsButNeverRedemptions() (gas: 559523)\n[PASS] test_redeemPaysProRataInKind() (gas: 4960250)\n[PASS] test_redeemRejectsZeroAndMoreThanBalance() (gas: 404240)\n[PASS] test_redeemWorksWithSwarmKeeperAndOraclesAllOffline() (gas: 4930189)\n[PASS] test_rescueCannotTouchReserveOrBasket() (gas: 5190181)\n[PASS] test_shareTokenMetadata() (gas: 41233)\n[PASS] test_tokenWithBrokenBalanceOfBlocksDepositsNotRedemptions() (gas: 5131387)\n[PASS] test_untransferableTokenCannotTrapHolders() (gas: 4826818)\n[PASS] test_wrongReserveDecimalsAreCaughtOnFirstDeposit() (gas: 156998)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 343.19ms (366.82ms CPU time)\n\nRan 7 tests for test/Launch816Deployer.t.sol:Launch816DeployerTest\n[PASS] testFuzz_anyUnminedSaltFailsWithoutSettingTheHook(bytes32) (runs: 64, μ: 2511189, ~: 2511271)\n[PASS] testFuzz_computedAddressIsTheDeployedAddressForAnyMinedSalt(uint256) (runs: 64, μ: 12394687, ~: 4389090)\n[PASS] test_findSaltEdges() (gas: 3604710)\n[PASS] test_findSaltRevertsOnOverflowInsteadOfWrapping() (gas: 29646)\n[PASS] test_firstComerChoosesTheAddressButNotTheCode() (gas: 11366733)\n[PASS] test_nothingCanRetargetTheDeployerAfterLaunch() (gas: 2796338)\n[PASS] test_onlyTheExactCreationCodeIsAccepted() (gas: 4339243)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 635.04ms (812.90ms CPU time)\n\nRan 1 test for test/invariant/Solvency.invariant.t.sol:SolvencyInvariantTest\n[PASS]\nSolvencyInvariantTest invariants:\n[PASS] invariant_executorHoldsNothingBetweenTrades\n[PASS] invariant_feeAccountingConserves\n[PASS] invariant_noPropertyViolatedMidSequence\n[PASS] invariant_vaultIsSolventAndConsistent\n SolvencyInvariantTest invariants (runs: 32, calls: 2048, reverts: 0)\n\n╭----------+-------------------+-------+---------+----------╮\n| Contract | Selector          | Calls | Reverts | Discards |\n+===========================================================+\n| Handler  | claim             | 274   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | collectFees       | 288   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | deposit           | 296   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | movePrice         | 297   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | pushBasketReserve | 307   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | rebalance         | 305   | 0       | 0        |\n|----------+-------------------+-------+---------+----------|\n| Handler  | redeem            | 281   | 0       | 0        |\n╰----------+-------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.92s (1.91s CPU time)\n\nRan 1 test for test/invariant/Launch816Waterfall.invariant.t.sol:Launch816WaterfallInvariantTest\n[PASS]\nLaunch816WaterfallInvariantTest invariants:\n[PASS] invariant_basketNeverReceivesLessThanItsShare\n[PASS] invariant_everyFeeUnitIsAccountedFor\n[PASS] invariant_liabilitiesAreCoveredAndLedgersSum\n[PASS] invariant_lifetimeEqualsAccruedPlusPaidOut\n[PASS] invariant_onlyConfiguredRecipientsArePaid\n[PASS] invariant_treasurySharesAreBackedAndCapped\n[PASS] invariant_untouchedConfigurationHoldsItsLaunchValues\n Launch816WaterfallInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------------------+----------------------+-------+---------+----------╮\n| Contract                  | Selector             | Calls | Reverts | Discards |\n+===============================================================================+\n| Launch816WaterfallHandler | advance              | 634   | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | claim                | 638   | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | claimBasketIsRefused | 605   | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | distribute           | 629   | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | feeNative            | 1285  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | feeWrapped           | 611   | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | push                 | 660   | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | rescueAttempts       | 621   | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | setRecipient         | 651   | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | setSplit             | 672   | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | treasuryRedeem       | 600   | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| Launch816WaterfallHandler | unauthorized         | 586   | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.92s (1.91s CPU time)\n\nRan 1 test for test/adversarial/TreasurySequence.invariant.t.sol:TreasurySequenceInvariantTest\n[PASS] invariant_treasuryAndFixedSupplyConserveValue() (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------+-------+---------+----------╮\n| Contract                | Selector            | Calls | Reverts | Discards |\n+============================================================================+\n| TreasurySequenceHandler | advance             | 3531  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | cancel              | 3470  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | execute             | 3530  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | fund                | 3504  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | moveLaunchTokens    | 3587  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | schedule            | 3504  | 0       | 0        |\n|-------------------------+---------------------+-------+---------+----------|\n| TreasurySequenceHandler | unauthorizedExecute | 3450  | 0       | 0        |\n╰-------------------------+---------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.33s (3.33s CPU time)\n\nRan 1 test for test/adversarial/CustodySequence.invariant.t.sol:CustodySequenceInvariantTest\n[PASS]\nCustodySequenceInvariantTest invariants:\n[PASS] invariant_allSharesAreBackedAndAccountedFor\n[PASS] invariant_everyReserveUnitHasADestination\n CustodySequenceInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭------------------------+----------------+-------+---------+----------╮\n| Contract               | Selector       | Calls | Reverts | Discards |\n+======================================================================+\n| CustodySequenceHandler | changeSplit    | 2036  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | claim          | 2130  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | deposit        | 2062  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | distribute     | 1975  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | donate         | 2037  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | push           | 1998  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | receiveFees    | 2082  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | redeem         | 2055  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | roundTrip      | 2125  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | togglePause    | 2047  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | transferShares | 1949  | 0       | 0        |\n|------------------------+----------------+-------+---------+----------|\n| CustodySequenceHandler | treasuryRedeem | 2080  | 0       | 0        |\n╰------------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.09s (6.07s CPU time)\n\nRan 26 test suites in 6.09s (16.34s CPU time): 322 tests passed, 0 failed, 1 skipped (323 total tests)\n","passed":true},{"durationMs":99,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AssetRegistry.approveToken(address,address,uint32,uint16,uint40,bytes32)\",\"AssetRegistry.quarantine(address)\",\"AssetRegistry.quarantineIfStale(address)\",\"AssetRegistry.releaseQuarantine(address)\",\"AssetRegistry.revokeToken(address)\",\"AssetRegistry.setMethodology(uint32,bytes32)\",\"AssetRegistry.setParam(uint8,uint256)\",\"AssetRegistry.setReserveFeed(address,uint32)\",\"AssetRegistry.setRouter(address,bool)\",\"EpochManager.activate()\",\"EpochManager.anchorReport(uint64,bytes32,bytes[])\",\"EpochManager.cancelPending()\",\"EpochManager.clearExpired()\",\"EpochManager.publish((uint64,uint64,uint64,uint32,uint32,bytes32,address[],uint16[],uint256[],uint256[],uint256[]),bytes[])\",\"FeeHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"FeeHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"FeeHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"FeeHookDeployer.deploy(bytes32,bytes)\",\"FeeWaterfall.claim(uint8)\",\"FeeWaterfall.distribute()\",\"FeeWaterfall.pushBasketReserve(uint256)\",\"FeeWaterfall.receive()\",\"FeeWaterfall.rescue(address,address)\",\"FeeWaterfall.setRecipient(uint8,address)\",\"FeeWaterfall.setSplit(uint16,uint16,uint16,uint16,uint16)\",\"FeeWaterfall.setSwapFee(uint24,uint24)\",\"IndexVault.approve(address,uint256)\",\"IndexVault.beginTrade(address,uint256)\",\"IndexVault.deposit(uint256,address,uint256)\",\"IndexVault.endTrade(address)\",\"IndexVault.redeem(uint256,address,bool)\",\"IndexVault.rescue(address,address)\",\"IndexVault.setDepositCap(uint256)\",\"IndexVault.transfer(address,uint256)\",\"IndexVault.transferFrom(address,address,uint256)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\",\"RebalanceExecutor.disposeQuarantined(address,uint256,uint256,address,bytes)\",\"RebalanceExecutor.executeTrade(address,address,uint256,uint256,address,bytes)\",\"RebalanceExecutor.swapThroughRouter(address,address,uint256,uint256,address,bytes)\",\"TimelockedAdmin.acceptAdmin()\",\"TimelockedAdmin.cancel(bytes32)\",\"TimelockedAdmin.execute(address,uint256,bytes,bytes32)\",\"TimelockedAdmin.pause()\",\"TimelockedAdmin.receive()\",\"TimelockedAdmin.revokeKeeper(address)\",\"TimelockedAdmin.revokeSigner(address)\",\"TimelockedAdmin.schedule(address,uint256,bytes,bytes32,uint256)\",\"TimelockedAdmin.setExecutor(address)\",\"TimelockedAdmin.setGuardian(address)\",\"TimelockedAdmin.setKeeper(address,bool)\",\"TimelockedAdmin.setMinDelay(uint256)\",\"TimelockedAdmin.setQuorum(uint32)\",\"TimelockedAdmin.setSigner(address,bool)\",\"TimelockedAdmin.transferAdmin(address)\",\"TimelockedAdmin.unpause()\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":57,\"README.md\":300,\"docs/LAUNCH-816.md\":149,\"docs/METHODOLOGY.md\":139,\"docs/PROPOSAL.md\":99,\"docs/SECURITY.md\":105,\"docs/VERIFICATION-816.md\":145,\"foundry.toml\":34,\"launch.json\":71,\"script/Deploy.s.sol\":65,\"src/AssetRegistry.sol\":340,\"src/EpochManager.sol\":404,\"src/FeeHook.sol\":258,\"src/FeeHookDeployer.sol\":108,\"src/FeeWaterfall.sol\":254,\"src/IndexVault.sol\":407,\"src/LaunchToken.sol\":16,\"src/RebalanceExecutor.sol\":384,\"src/TimelockedAdmin.sol\":283,\"src/interfaces/IIndex.sol\":91,\"test/AssetRegistry.t.sol\":298,\"test/Deployment.t.sol\":155,\"test/EpochManager.t.sol\":611,\"test/FeeHook.t.sol\":481,\"test/FeeWaterfall.t.sol\":239,\"test/IndexVault.t.sol\":366,\"test/Launch816.t.sol\":113,\"test/Launch816Deployer.t.sol\":161,\"test/Launch816Gas.t.sol\":164,\"test/Launch816Record.t.sol\":131,\"test/Launch816Resolution.t.sol\":242,\"test/Launch816State.t.sol\":440,\"test/LaunchToken.t.sol\":69,\"test/RebalanceExecutor.t.sol\":488,\"test/Revision.t.sol\":426,\"test/StaleFeedQuarantine.t.sol\":89,\"test/TimelockedAdmin.t.sol\":272,\"test/adversarial/CustodySequence.invariant.t.sol\":315,\"test/adversarial/ExternalTokenFailures.t.sol\":212,\"test/adversarial/ProposalBoundaries.t.sol\":129,\"test/adversarial/README.md\":42,\"test/adversarial/TreasurySequence.invariant.t.sol\":224,\"test/fork/Launch816Fork.t.sol\":137,\"test/invariant/Handler.sol\":165,\"test/invariant/Launch816Waterfall.invariant.t.sol\":391,\"test/invariant/Solvency.invariant.t.sol\":95,\"test/utils/Fixture.sol\":282,\"test/utils/Launch816.sol\":220,\"test/utils/Launch816Live.sol\":90,\"test/utils/Launch816Original.sol\":40,\"test/utils/Mocks.sol\":180,\"test/utils/V4Router.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"90819af54ca1b5087ee86bed44d300c1227d6bcbf09317e9a7a742c82a1f4fbf","verifiedTreeHash":"20e1b1273d32ed4006f6eb00eb8f82256653ad67","verifierVersion":"0.1.0+c4d32abc"}]}