{"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":"5ded88fa-4108-448d-b81e-9c88b42d9aa2","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"ed53d61b80332914c52b3819b27f6daa0fcb8b3cd5b913a62fe27e92d7c5a9a1","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"7486d7114584f8c99a50a2a24a294fb38c7ef6109ab70518a37b16b84c5accf2","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":"3bf7e308cce2231886dc9889b0608add70e0a2a71bb37627666d24fb528f2c1f","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":"9a9add5d01ac242855465a8fec20f02992b063f2597a1ccfa7c98af743cd1bd6","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":"84ca3cb5d3fd61bb66b7b0a8a4d6a3dbe1ac52cefca2a44213c6d96ebaa66567","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":"accepted"},{"acceptedSubmissionHash":"b83f4679575207be369aece520ef4729d38d0a25d4dae6f238a2f28d25fa56d7","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":"4820ad904ca3593ad4f16a0d794bc07c012e10b034b75eda90298fef86996f3e","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":"093ef44909197abda21f9f2c6d88c131576836700bc40b67b0e4d14eafdad5e0","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"a5fe3f11d4ea4dda22ac5ca1b1b2c63a4df14c0e3b62eef8e973ebdafd0bf882","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Launch PLEA test run 9 on Sepolia from this Foundry repository exactly as launch.json lists it: five contracts (PLEA, CabalGate, Seasons, PleaDistributor, PleaLaunch), deployed in order in one transaction with the constructor arguments in launch.json. This is the final code: run 8.5's code (your launch #1981, branch testnet8.5 @ af57f6d) plus (1) the two findings of run 8.5's launch audit, fixed: the share bands compare the exact share (CabalGate._shareBps rounds up), and launch.json's seat-NFT word is in EIP-55 form; (2) fees 2.25%: the owner's share is 1% (PleaHook.OWNER_BPS 100), and the Letterbox's 95% delivery floor counts the hook's 2.25% sale fees (HOOK_SALE_FEE_BPS 225, a new Letterbox hash); (3) the wall's placement guard rises at most 700 ticks a day (WALL_GUARD_TICKS_PER_DAY, was 400); (4) imdTEST (0x56bcf2a5f47710649a4091219ef0b56e2d1b58bf) is both the pool currency and the oracle fee asset, because your Sepolia Intake sells oracle questions only in imdTEST since 2026-10-18 (the earlier open-mint test IMD is priced at 0 there). So the mint flag is 0: the Letterbox buys the 0.5 oracle fee and the 0.25 tip with the writer's PLEA, and a hand plea, an appeal and an objection pay the fee in imdTEST. imd/acc's Sepolia Stacker stakes the earlier test IMD, so its credit reverts and the hook pays the 0.5% cashback in plain imdTEST, its documented fallback. While the shared PoolManager holds less imdTEST than a buy's payouts, the payouts are ERC-6909 claims; the agreed 2 imdTEST opening buy's payouts join the pool (PAYOUT_RESERVE). Unchanged from run 8.5: letters plead 20% and the fact score is 0-45: share of the balance sold at most 20%: 16, at most 35%: 9, more: 3; held 7 days: 7, 3 days: 4, 1 day: 2; at a loss: 13, gain at most 50%: 12, 200%: 10, 500%: 8, 1,000%: 6, more: 4; PLEA no buy record covers: held since trading opened, at profit 10; 24h trend up: 9, flat: 5, down: 0; need = 71 - fact (CannotPass above 45); every fix of your audit rounds 5 to 8 (audit/FINDINGS.md); Objection! (src/Tribunal.sol, spec OBJECTIONS.md, deployed after the launch through PleaLaunch.deployTribunal against the hash committed as its 13th argument): for 20 minutes after an approval anyone except the seller and the wallets Seasons excludes may object (the 0.5 oracle fee and a 0.35 stake, both in imdTEST); sustained when newScore + 2 < need (no points, stake back), otherwise overruled (stake to the plea's season pot); no answer within 20 minutes voids it (stake back); the recorded score is the lowest any panel gave; at most two objections per plea, from different wallets; the 1.2 seat multiplier (Seasons' fourth argument, the IMD NFT (test) 0xa0443799c320e16c80801c9c1911f3571260287f), cap decay 15 days, the 82/6/12 split, six bonus seasons of 10,000,000 PLEA, top 25 from 450 to 350 bps. Build: a bare forge build compiles src, script and the launch-manifest suites in test/ (about 1 GB, under two minutes); a new test file goes in test/ and joins that build. The suite (852 tests in 91 suites) lives in test/full/ and the forks in test/fork/, both skipped by the default profile: run them with FOUNDRY_PROFILE=full forge test --match-path 'test/full/{A,B}.t.sol' a few files at a time (the forks skip without their RPC URL variables; test/fork/ForkTestnet.t.sol rehearses this run against your live Sepolia Intake with imdTEST); never FOUNDRY_PROFILE=full forge build of the whole tree (several GB of memory, over a 10-minute limit); test/LaunchManifest.t.sol ties launch.json to both committed code hashes and asserts the launch fits the 16,777,216-gas cap with your factory's 22% headroom (13,490,541 as charged, 16,458,460 with headroom, 318,756 under). Audit the imported code and deploy it unchanged; fix only what the audit proves is a real bug, and keep every number as it is (timings, panel 30, quorum 17, 5-hour seasons, 33-hour dead-man, START 1792594800, credit gas 1300000, fees 2.25%, letters 20%, the fact table above, plea 1% to 50% or 2.5M, 0.70 IMD minimum plea value, 95% sale minimum, fee cap +10%, objection window 20 minutes, stake 0.35 IMD, margin 2, two objections per plea). If you change the Letterbox or the Tribunal, update its code hash in launch.json. Runtime sizes: PleaHook 24,402 bytes (174 under the EIP-170 limit), CabalGate 24,018, Letterbox 23,255, Tribunal 21,654, Seasons 12,473: keep any fix within them. Keep PLEA.setLauncher accepting either the deploy-transaction flag or PLEA's deployment block, and keep foundry.toml as it is, including the default profile's skip list, [lint] lint_on_build = false and the read-only fs_permissions for ./out and ./launch.json.","parentJobId":null,"planHash":"8c080a57d45091e8c9924aab9eb86040a16c9991a8c55b263e8798128ace64fa","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"5ded88fa-4108-448d-b81e-9c88b42d9aa2","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2234-src-cabalgate-sol-src-tribunal-sol-src-p"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51744","feedbackHash":"526b1bad187c9efa5ba5db5e69a3e1a5d366b2bd5b32330d8dd229631f82fd01","nodeKey":"adapt_contract_project","submissionHash":"ed53d61b80332914c52b3819b27f6daa0fcb8b3cd5b913a62fe27e92d7c5a9a1","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52170","feedbackHash":"b727ff130ba8824550013295c1041a61c3cd16dd45ace8ca7cf31f43c20ee91e","nodeKey":"audit_economics","submissionHash":"7486d7114584f8c99a50a2a24a294fb38c7ef6109ab70518a37b16b84c5accf2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51141","feedbackHash":"d346db81a5b37c8d0869c4f67cfbfb1009a65743cb57e5ef1c43dc00c66a9904","nodeKey":"audit_flow","submissionHash":"3bf7e308cce2231886dc9889b0608add70e0a2a71bb37627666d24fb528f2c1f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51465","feedbackHash":"eaf38319f35aa560d8ed2a58764470917beb647b3176521cb6dd8e47b6d65f47","nodeKey":"audit_imported_code","submissionHash":"9a9add5d01ac242855465a8fec20f02992b063f2597a1ccfa7c98af743cd1bd6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52548","feedbackHash":"c58fb6c6e821963b30179ad097e77f35c9a39b31b98e2aaff20a0cb4cefb07ae","nodeKey":"audit_judge","submissionHash":"84ca3cb5d3fd61bb66b7b0a8a4d6a3dbe1ac52cefca2a44213c6d96ebaa66567","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53929","feedbackHash":"1803d59e473127ec16b18d352b6c50977e08f2a0016c7cd6770cfb0a32714f1c","nodeKey":"audit_math","submissionHash":"b83f4679575207be369aece520ef4729d38d0a25d4dae6f238a2f28d25fa56d7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52161","feedbackHash":"6c248a98d06a1ff788fd44ceffde495497fe660318f1c705d956528dd34f0bb9","nodeKey":"audit_permissions","submissionHash":"4820ad904ca3593ad4f16a0d794bc07c012e10b034b75eda90298fef86996f3e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51484","feedbackHash":"a7976d1993f73c553117806e797da5de12ff1e4c39edcee5be465fb859282adb","nodeKey":"manifest","submissionHash":"093ef44909197abda21f9f2c6d88c131576836700bc40b67b0e4d14eafdad5e0","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52215","feedbackHash":"462446553ebefaa4e5cb63b4b74074eaa7058dc39cc294161b0b6b1edc32bb4a","nodeKey":"write_foundry_tests","submissionHash":"a5fe3f11d4ea4dda22ac5ca1b1b2c63a4df14c0e3b62eef8e973ebdafd0bf882","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"1da64985313c3bdb43a85b5bade2900314819e020b0661d622f93b94f96d5491","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"b5c66ec60374384e58dc1d5384e19a95e3484d15c3534948f957354f65cd4f9f","device":"6ed09c2eb1ff6aec","findings":[],"hash":"093ef44909197abda21f9f2c6d88c131576836700bc40b67b0e4d14eafdad5e0","nodeId":"c9d99ae5-44ac-460f-b123-4c218a02686a","outcome":"completed","summary":"I made no changes: the `launch.json` already in the tree is correct for test run 9, and every check passes.\n\n**What it deploys.** The five contracts go in order, PLEA, CabalGate, Seasons, PleaDistributor and PleaLaunch, all using imdTEST (`0x56bc…58BF`):\n\n- **PLEA and PleaDistributor:** their owner argument is `$owner`.\n- **CabalGate:** imdTEST is both the oracle fee asset and the pool IMD; seasons are 18000 seconds (5 hours) and the dead-man is 118800 seconds (33 hours).\n- **Seasons:** its fourth argument is the seat NFT in EIP-55 form, `0xa0443799c320E16C80801c9C1911F3571260287F`.\n- **PleaLaunch:** credit gas 1300000, START 1792594800 and mint flag 0. Its 12th and 13th arguments are the code hashes of the Letterbox and the Tribunal.\n\n**Checks.** `forge build` succeeds. `forge test` passed all 23 tests in 5 suites, run with the required fuzz seed. That includes `test/LaunchManifest.t.sol`, which ties `launch.json` to both code hashes and checks that the launch fits the gas cap. I did not run the full suite in `test/full/` or the fork tests.\n\n**Latest commit.** It only changed two comments in `src/CabalGate.sol`, not code. It doesn't touch the Letterbox or the Tribunal, so their hashes in the manifest are still right.\n\n**One thing in the notes.** They describe the code's history starting from run 7 rather than naming run 8.5's code (launch #1981, testnet8.5 @ af57f6d) as the base. The fixes they list do match the brief. They're explanatory text with no effect on deployment, so I left them as they are.","treeHash":"a6d07cb1887bde3d869ed688ffd9c429fa24ab41","usage":{"cachedInputTokens":89458,"inputTokens":6,"model":"claude-opus-5-5","outputTokens":1142,"runtime":"claude","turns":3,"wallClockMs":84573}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7d454e6cee88c390","findings":[],"hash":"3bf7e308cce2231886dc9889b0608add70e0a2a71bb37627666d24fb528f2c1f","nodeId":"84b4ce0b-5346-45e0-bd3b-a7d26f52ce4b","outcome":"completed","summary":"The review is complete. The findings file is in place and the working tree holds nothing outside it.\n\n**Outcome: no substantiated defect in the control flow.** The file `.imd-findings.json` has an empty findings list and a coverage row for all 56 listed entry points plus two invariants, every one marked `holds` with a one-line reason.\n\n**What I traced** (Execution Trace, Periphery and First Principles guides applied to the run-9 code):\n\n- **The letter path end to end.** The Letterbox escrows through `courtTake` in the writer's own transaction, the gate scores on the pre-escrow balance, the exact-output fee swap is capped by the PLEA sent and returns the unspent part, and the 0.5 oracle fee plus a 0.35 appeal share are pulled from an approval the gate consumes exactly. The unearned specified-side fee refund rounds to zero wei for both the 0.75 and the 1.10 IMD fee swaps.\n- **The Sepolia configuration.** With the mint flag at 0 and imdTEST as both pool currency and oracle asset, the PleaLaunch, Letterbox and Tribunal constructors all accept launch.json's arguments. The Letterbox and Tribunal suites that buy the fee in pool IMD pass under the full profile.\n- **Delivery and settlement states.** Every escrow ending was checked against the gate's status machine: Pending only through a stale expire, Approved only after the window, Lapsed and Denied returned, Executed refused. No path lets an AUTO_SELL plea sell without an open escrow.\n- **Objection timing.** The 20-minute window plus a 20-minute pending expiry fits inside the one-hour close grace, a void frees its slot without counting, and late Intake answers hit `TooLate` or `UnknownRequest`.\n- **PLEA's transfer gate, the hook's fee and claims accounting, the wall guard at 700 ticks a day, Seasons' pot accounting, and the manifest ties.** The default launch suites pass, and `cast` confirms the seat and imdTEST words are their EIP-55 checksums.\n\n**Not reached.** The live Sepolia Stacker's credit reverting is rehearsed only by the fork suite, which needs an RPC URL I did not have. The plain-imdTEST cashback fallback is traced in code only.","treeHash":null,"usage":{"cachedInputTokens":1758932,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":41691,"runtime":"claude","turns":26,"wallClockMs":668632}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ca075d17c94a854b","findings":[],"hash":"4820ad904ca3593ad4f16a0d794bc07c012e10b034b75eda90298fef86996f3e","nodeId":"7c64127f-6d96-4672-accd-79e090f6610b","outcome":"completed","summary":"The review is complete and the report is written. No repository file was changed. Only the untracked report file was created, which git status shows as clean for tracked files.\n\n**Result: no defect found in the assigned area.** The permission model of the five launch contracts plus PleaHook, Letterbox and Tribunal holds against the Access Control, Trust Gap and Asymmetry checklists. The report at `.imd-findings.json` carries an empty findings list and 59 coverage rows: one `holds` row with a reason for each of the 57 listed entry points, plus three invariant rows.\n\nWhat I traced:\n\n- **Every privileged guard** resolves to an immutable or once-set address: launcher, letterbox, intake, poolManager, the committed Tribunal. The only live-owner powers are the add-only allowlist, early seed and two-step ownership, as the threat model lists. The allowlist cannot reach the PoolManager or the gate, so it opens OTC transfers only.\n- **Paired surfaces** compared: hand plea versus Letterbox plea, hand appeal versus letter appeal, executeSell versus executeSellFor, record versus closeSeason's try-record, settle versus settleable, gate versus Tribunal oracle callbacks. Each pair mirrors its checks and state writes. The known asymmetries are the documented ones, such as the letter appeal's fee exception.\n- **Trust-gap seams** checked: owner handover cannot redirect hook fees or strip a leader; the Tribunal and Seasons share one exclusion read; the sham-objection shield, the hookData gift and the system-contract sinks are already accepted in writing.\n- **Manifest and live chain.** All six static Sepolia addresses have code. imdTEST's symbol matches. The seat NFT is \"IdentityMD (test)\". The Stacker stakes the earlier test IMD, so its credit reverts and cashback falls back to plain imdTEST. The default suite passes, and five fork rehearsals against the live Intake pass, including seller-only execute and the failure-binding test.\n\nNot reached: the full `test/full/` suite was not re-run, and the oracle signer is an EOA whose key I cannot verify beyond its address.","treeHash":null,"usage":{"cachedInputTokens":1650638,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":40263,"runtime":"claude","turns":29,"wallClockMs":801698}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa99051b60a858d6","findings":[],"hash":"7486d7114584f8c99a50a2a24a294fb38c7ef6109ab70518a37b16b84c5accf2","nodeId":"1ed64c9d-111a-4af2-a3fe-57d79ebc25cb","outcome":"completed","summary":"The review is complete and the findings file is in place. No tree files were changed.\n\n**Result: no reproducible defect in the economics of run 9's code.** The findings file holds an empty list and a coverage row for all 56 listed entry points, each marked `holds` with a one-line reason.\n\n**What I checked, against the Economic Security, Invariant and Flow Gap guides:**\n\n- **Fee conservation at 2.25%.** The IMD leg pays 0.5% cashback, 1% owner, 0.25% prize and 0.25% wall on the realised fill, with the PLEA leg's 0.25% burned. The Letterbox's delivery floor uses a 2.25% multiplicative deduction, which sits just under the real net of 99.75% times 98%, so the 5% room for a dip is real and errs in the seller's favour by a few hundredths of a percent.\n- **Same token for the pool and the oracle fee.** With the mint flag at 0, the Letterbox approves the gate for the oracle fee plus the wall share from one imdTEST allowance, the gate's fee swap buys exactly that IMD plus the tip first, and the Tribunal pulls the stake and the fee from the objector. No allowance collision and no path where the tip is short.\n- **Payout funding on a PoolManager that holds little imdTEST.** Payouts fall back to ERC-6909 claims measured against the pool's own pre-swap IMD, the 2 imdTEST opening buy closes the pool-liquidity exception, and every claim Seasons or the hook later redeems is backed by v4's settlement invariant.\n- **Season pot accounting.** The accounted pot never exceeds the real pot, overruled stakes are booked to the plea's verdict season or to rollover, unpaid shares roll over, and the bonus's unpaid share is burned.\n- **Share-band rounding and the wall guard.** The rounded-up share makes 20% and 35% exact edges on every plea and appeal path, and the 700-tick daily allowance is bounded with its remainder carried.\n\n**Verification run on this tree.** The default build compiles, the manifest suite ties launch.json's two code-hash words to this tree's Letterbox and Tribunal and confirms the gas cap, runtime sizes match the stated figures, and 161 tests across the Letterbox, Seasons-funds, hook-revision, round-1 audit, Tribunal/Seasons and judge-findings suites pass under the full profile.\n\n**Not reached.** The live Sepolia fork rehearsal needs an RPC URL and was not run. Static-analysis leads were all traced to known-safe patterns or already accepted findings in the audit ledger, so none is reported.","treeHash":null,"usage":{"cachedInputTokens":2022905,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":31554,"runtime":"claude","turns":27,"wallClockMs":584676}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9b657b3675e34ec5","findings":[],"hash":"84ca3cb5d3fd61bb66b7b0a8a4d6a3dbe1ac52cefca2a44213c6d96ebaa66567","nodeId":"d763275b-d04c-4224-8877-79a89e2baa81","outcome":"completed","summary":"Review complete. The findings file holds an empty findings list and a full coverage record.\n\n**Outcome: no reproducible defects.** All four specialists and the independent tester reported nothing, and my own pass over the five manifest contracts plus the committed Letterbox, Tribunal and PleaHook found nothing that reproduces as a bug. There were no specialist findings to merge or drop.\n\n**What I verified against this tree**\n\n- The manifest commits to this build. The 12th and 13th PleaLaunch words equal the keccak256 of the compiled Letterbox and Tribunal creation code from a fresh default-profile build. Every address word is in valid EIP-55 case, and every contract address in it has code on Sepolia through this machine's RPC. The Stacker's staked token is the earlier test IMD, so the plain imdTEST cashback fallback is the live path, as the brief says.\n- Sizes and deployability. Runtime sizes match the brief (PleaHook 24,402, CabalGate 24,018, Letterbox 23,255, Tribunal 21,654, Seasons 12,473), all creation codes with arguments are under 49,152 bytes, and no manifest constructor needs anything the factory does not supply.\n- Test runs on this machine, all passing: the launch-manifest suite (13 tests, including the gas cap with the factory's headroom), the run 9 Sepolia suite (22 tests plus 5 invariants), and the live Sepolia fork rehearsal against the real Intake with imdTEST (22 tests, run with this machine's RPC).\n- Run 9 specifics traced by hand. With imdTEST as both the pool currency and the oracle fee asset, the gate's appeal and oracle pulls, the Letterbox's single approval for fee plus wall share, and the Tribunal's stake plus fee pulls all consume exactly the intended allowances. The Letterbox's new 2.25% delivery floor matches the hook's real sale take, which nets about 97.76% of snapshot value before price impact. The 2 imdTEST opening buy closes the PAYOUT_RESERVE exception as documented.\n- Static-analysis leads. The slither and aderyn lines were checked and none reproduces: the uninitialized-state mappings, weak-PRNG ring indices, divide-before-multiply tick alignment, strict equalities and the encodePacked init-code hash are all correct as written, and the uint128 cast is bounded by the 2.5M PLEA cap.\n\n**Coverage record.** 56 entry points answered as holds, plus one invariant row for the manifest-to-build linkage. No row is unreached.\n\nNo repository file was changed. The only artifact written is the review output at the repository root, and the scratch directory was not needed since nothing carried a proof.","treeHash":null,"usage":{"cachedInputTokens":1401782,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":28477,"runtime":"claude","turns":23,"wallClockMs":570851}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f0c4ae5b8ada215c","findings":[{"citation":"resolved","description":"Run 9 makes imdTEST (0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF) both the pool currency (CabalGate's 4th argument, Seasons' 3rd, PleaLaunch's 6th and 10th) and the oracle fee asset with the mint flag 0, so the Letterbox buys the 0.5 oracle fee and the 0.25 tip from the pool in imdTEST, and a hand plea, an appeal or an objection pulls imdTEST from the caller. On Sepolia today (read over https://ethereum-sepolia-rpc.publicnode.com, chain 11155111) the token's totalSupply() is 0x19 = 25 wei, its mint(address,uint256) reverts NotMinter(caller) for a stranger and succeeds only from its owner 0x047F606fD5b2BaA5f5C6c4aB8958E45CB6B054B7, which itself holds 0, and the PoolManager 0xE03A1074c86CFeDd5C142C4F04F1a1536e203543 holds 0 imdTEST. Nothing in the contracts is wrong: the README (line 266) says only the owner and named minters mint it. But the agreed 2 imdTEST opening buy (PAYOUT_RESERVE), every PLEA buy, every hand plea's 0.5 fee and every objection's 0.85 need imdTEST that does not exist yet, so the run is inert until IMD mints to the owner and testers. The fork rehearsal (test/fork/ForkTestnet.t.sol, 22 tests, passing against the live chain during this review) passes only because it uses deal() to conjure balances.","line":15,"path":"launch.json","reproduction":"State: Sepolia at the time of this review. Calls: cast call 0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF 'totalSupply()' -> 0x...19 (25 wei); cast call ... 'mint(address,uint256)' <any> 1e18 --from 0x1111...1111 -> revert NotMinter(0x1111...1111); balanceOf(0xE03A1074c86CFeDd5C142C4F04F1a1536e203543) -> 0. Expected for a usable test run: enough imdTEST in the owner's and testers' wallets for the 2 imdTEST opening buy and the 0.5/0.85 fees; actual: 25 wei exist in total. After deploy, PoolSwapTest buys revert at settle for lack of imdTEST, CabalGate.submitSell reverts in oracleAsset.safeTransferFrom, Tribunal.object reverts in imd.safeTransferFrom.","severity":"info","snippet":"        \"0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF\",","title":"imdTEST, the pool currency and oracle fee asset, has a 25-wei total supply on Sepolia and a minter-only mint, so no one can trade, plead or object until IMD's minters distribute it"},{"citation":"resolved","description":"Documentation only, no bytecode change (bytecode_hash none, cbor_metadata false, so fixing it does not move any committed hash). launch.json's CabalGate arguments 3 and 4 are both 0x56bcf2a5F47710649A4091219Ef0b56e2d1B58BF (imdTEST), as the README's Sepolia table and the fork rehearsal say; the two comments describe the superseded open-mint test IMD (0x44a1…) and TestIMD (0x2b69…, the token imd/acc's Stacker still stakes). A reader of the verified source on Sepolia would be told the appeal's 0.35 wall share and the 0.5 oracle fee are paid in two different tokens. Same token for both is the mainnet shape and is what the constructors, PleaLaunch (OracleAssetNotImd when mint is off and the two differ) and the Letterbox/Tribunal constructors enforce.","line":138,"path":"src/CabalGate.sol","reproduction":"Read src/CabalGate.sol lines 138-141 against launch.json lines 10-11 and README.md lines 266-267: the comments say 0x44a1… and 0x2b69…, the manifest passes 0x56bc…f2a5 for both. Expected: comments that name imdTEST for both, or no address at all (as PleaHook's and Seasons' NatSpec do); actual: stale addresses from runs 2-8.5.","severity":"info","snippet":"    /// @notice What the Intake is paid in (Sepolia: test IMD 0x44a1…; mainnet: IMD).","title":"CabalGate's NatSpec still names runs 2-8.5's two Sepolia test tokens for oracleAsset and imd; run 9 passes imdTEST for both"}],"hash":"9a9add5d01ac242855465a8fec20f02992b063f2597a1ccfa7c98af743cd1bd6","nodeId":"b570eac9-b10e-4b7d-9ebc-2b3bf2386fef","outcome":"completed","summary":"Both findings validate against the tree, and no tracked file changed. The review is complete.\n\n**Outcome: no defect found in the contracts. The findings file holds two informational notes.**\n\n**What was read.** All nine contracts in full: PLEA, CabalGate, Seasons, PleaDistributor, PleaLaunch, PleaHook, Letterbox, Tribunal and OracleAttestation, plus the two interfaces, launch.json, foundry.toml and the audit ledger. Nothing was out of reach. Each state-changing entry point was walked for caller, value moved and trust, with attention on the run 9 changes: imdTEST as both pool currency and oracle fee asset with the mint flag off, the 2.25% fee split and the Letterbox's 95% floor, the 700-tick wall guard, and the rounded-up share bands.\n\n**What was run.**\n- The default build and the 22 launch-manifest tests pass. They tie launch.json to the committed Letterbox and Tribunal hashes, confirm the gas fit, and rehearse atomic deployment.\n- The project's Sepolia fork rehearsal, all 22 tests, passes against the live Intake, PoolManager, Stacker and seat NFT over a public RPC. That confirms the live Intake takes 0.5 imdTEST for a plea and an objection, the Stacker credit reverts and cashback falls back to plain imdTEST, and the exact-output fee sale works with one token for both roles.\n- Direct chain reads: imdTEST has 18 decimals, every manifest address has code, the signer is a plain key.\n\n**Findings written to .imd-findings.json.**\n- **Info, launch.json line 15.** imdTEST's total supply on Sepolia is 25 wei and only its owner's minters can mint. The run cannot trade, plead or object until IMD mints and distributes it. The contracts are fine; the fork tests pass only because they conjure balances.\n- **Info, CabalGate.sol line 138.** Two NatSpec comments still name runs 2 to 8.5's separate test tokens for the oracle asset and the pool IMD. Documentation only, no bytecode or hash change.\n\n**Checked and found sound.** The same-token path leaves no shared allowance between the Intake and the hook. The Letterbox's floor is slightly conservative against the real 0.25% burn plus 2% IMD fee. The rounded-up share keeps a 20% letter in the 16-point band. The owner allowlist and the post-launch Merkle root are documented accepted powers, not reported.\n\n**Not verified.** The oracle signer address in launch.json could not be checked against IMD's live attester. The Intake's own signer view returns a different key, which may simply be its request signer, and the public node refused log scans that would have shown earlier gates receiving verdicts under this signer. The address has been unchanged since PLEA v10, through runs that received real verdicts.","treeHash":null,"usage":{"cachedInputTokens":2400899,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":34884,"runtime":"claude","turns":35,"wallClockMs":728551}},{"artifacts":[],"attempt":1,"bundleHash":"7d205e20d3e229a4ec73b79ef9c5fe26a9281a0f88dfb3fb8b16eb87af1dc9db","device":"e2a4a53638df3fc6","findings":[],"hash":"a5fe3f11d4ea4dda22ac5ca1b1b2c63a4df14c0e3b62eef8e973ebdafd0bf882","nodeId":"69ae54f1-d5bb-4a3a-b1b8-1436918b8b62","outcome":"completed","summary":"I added one new test file, `test/Run9Sepolia.t.sol`. It's part of the default build, and `forge test` with the verifier's seed passes: 46 tests in 7 suites, 23 of them mine. I found no defects, so there is no `.imd-findings.json`. The file is not committed: git has no author identity on this machine, and setting one would mean changing config, so I left it staged for the upload step.\n\nThe suite runs the real contracts set up as run 9 has them: imdTEST is both the pool currency and the oracle fee token, the mint flag is 0, Objection! is on, and the Sepolia timings and credit gas are used. The Stacker is set to stake a different token, so its credit reverts the way imd/acc's Sepolia Stacker will.\n\n**What the 22 unit and fuzz tests check:**\n- **Numbers:** the owner's share is 1%, the fees total 2.25% (matching the Letterbox's 225), the wall guard is 700 ticks a day, `PAYOUT_RESERVE` is 2 imdTEST, and the objection settings are 0.35 stake, 20 minutes, margin 2 and two per plea. The gate, launch and Tribunal all use imdTEST and none of them mints.\n- **Payouts:**\n  - The 2 imdTEST opening buy's payouts join the pool, and a dust buy before it doesn't use up that exception.\n  - The next buy pays the owner, the prize and the cashback in plain tokens.\n  - A large first buy into an empty PoolManager pays them as ERC-6909 claims, and the PoolManager holds enough to cover them.\n- **Cashback fallback:** when the credit reverts, the 0.5% is paid in plain imdTEST, no sIMD is minted and no allowance is left behind. A control test with a Stacker that stakes imdTEST stacks normally, which shows the fallback comes from the token mismatch.\n- **Share bands:** exactly 20% scores 7 more than 20% plus one wei, and exactly 35% scores 6 more than one wei over. A fuzz test checks the band against the exact share. A plea whose need is above 45 is refused with `CannotPass`.\n- **Hand plea:** the 0.5 fee is paid in imdTEST, and the old test IMD is never touched. The plea is refused without an imdTEST allowance or balance.\n- **Objections:**\n  - The objector pays 0.85 imdTEST.\n  - A score 3 under the need is sustained and the stake comes back; 2 under is overruled and the stake goes to the season pot.\n  - An unanswered objection is voided after 20 minutes and the stake comes back.\n  - Refused: the seller, an excluded owner, the same wallet twice, a third objection, objecting at 20 minutes plus one second, a denied plea, a balance one wei short, and settling twice.\n\n**Invariants (random buys, pleas with random scores, and time jumps from several wallets):**\n- The owner holds, as tokens or claims, everything the hook says it paid them.\n- The prize is never more than a quarter of the owner's fees, and the owner's fees are twice the cashback, give or take a wei per trade.\n- The PoolManager can always redeem every imdTEST claim.\n- No cashback is left in the hook and no sIMD is ever minted.\n- PLEA's supply only shrinks.\n- A check after each run confirms the sequence actually traded.\n\nThe hook takes its 2% on top of the fill, so a 10.2 imdTEST buy pays the owner 0.1. That matches the code's \"0.5% of the IMD fill\" comment, so I treated it as intended and wrote the fee tests that way. Also, the prize share stops once the 33-hour dead-man runs out, which is also by design, so that invariant is an upper bound rather than an exact ratio.","treeHash":"ca33a0dc2e45b247e4bfa85511267c951ef41bda","usage":{"cachedInputTokens":2134994,"inputTokens":52,"model":"claude-opus-5-5","outputTokens":37960,"runtime":"claude","turns":27,"wallClockMs":972203}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"23617eab0c5242d6","findings":[],"hash":"b83f4679575207be369aece520ef4729d38d0a25d4dae6f238a2f28d25fa56d7","nodeId":"98301eaa-5758-4c58-8f2f-c9caf58c1487","outcome":"completed","summary":"I found no defects in the math area that I could back with a failing input, so `.imd-findings.json` has an empty findings list. It also has a coverage row for all 56 entry points, each marked `holds` with a one-line reason, plus three invariant rows. No source files were changed. To support the \"holds\" verdicts I ran `FOUNDRY_PROFILE=full forge test --match-path 'test/full/{AppealRounding,HookRevision}.t.sol'`: 69 tests passed, none failed. That includes the fuzz test that the wall guard climbs at most 700 ticks a day.\n\n**What I checked, using the Math Precision, Boundary and Numerical Gap guides:**\n- **Share bands (CabalGate):** the round-up share makes the 20% edge exact: exactly 20% scores 16 and one wei more scores 9. A letter's 20% is rounded down, so it can never land in the 9-point band. An appeal takes the lower of its own share and the original's, and the Letterbox's appeal limits stay inside the gate's 1%–50% and 2.5M bounds.\n- **Fact score:** the score can't exceed 45, the need is always 26–71, and the mixed score for PLEA no buy record covers rounds to the nearest point. The thresholds for each band and the 24h trend are as specified.\n- **Hook fees:** the IMD fee is 2.00% (0.5% cashback, 1% owner, 0.25% prize, 0.25% wall), plus a 0.25% PLEA burn. Together that matches the Letterbox's 2.25% (HOOK_SALE_FEE_BPS 225); the true combined cost is 2.244%.\n  - The fee taken on a filled exact-input trade is never below the fee reserved before the swap.\n  - The three payouts, each rounded down, always add up to no more than the fee, so the wall's share can't go negative.\n  - I traced the balancing of fees and refunds and the buy-record updates for all four trade types (buy or sell, exact input or exact output).\n- **Opening-buy exception and fallbacks:** the 2 imdTEST opening buy, during the 70% launch fee, does put its payouts into the pool. The ERC-6909 claims and refund fallbacks also hold.\n- **Wall and inventory cap:** the 700-ticks-a-day pace carries its remainder correctly, tick rounding is correct for negative ticks, and the one-sided liquidity formulas, the opening price for the 5,700 IMD market cap and the cap's daily decay all hold.\n- **Letterbox:** the 95% delivery floor, the fee limit (snapshot value +10%), the 10% balance cap, and the 0.70 IMD minimum (rounded up, so it's never missed by a wei) all check out. The only rounding loss is at most 2 wei.\n- **Seasons:** the 25 prize shares add up to exactly 10,000 bps (450 down to 350). The pot's bookkeeping can't underflow, the 1.2× seat points (at most 54) and the best-three totals fit their types, and a wallet only ever moves up the leaderboard.\n- **Tribunal:** \"sustained when newScore + 2 < need\" is computed exactly, the lowest panel score is kept, and the 20-minute deadlines line up with the gate's, Letterbox's and Seasons' deadlines.\n\n**Static-analysis leads, all dismissed:**\n- The \"weak PRNG\" lines are ring-buffer index arithmetic.\n- The \"never initialized\" state variables are mappings.\n- The divide-before-multiply lines are either correct tick rounding or lose at most 2 wei.\n- The strict equalities are intended zero checks.\n\n**Not reached:**\n- I didn't check whether imd/acc's Sepolia Stacker really reverts on `credit` and so falls back to plain imdTEST cashback.\n- I didn't check whether the live Intake accepts 0.5 imdTEST as the oracle fee.\n\nBoth need the live Sepolia contracts; `test/fork/ForkTestnet.t.sol` rehearses them, and I didn't run it. I also didn't re-check the launch gas figures, which are outside the math area.","treeHash":null,"usage":{"cachedInputTokens":1853923,"inputTokens":40,"model":"claude-opus-5-5","outputTokens":32495,"runtime":"claude","turns":21,"wallClockMs":500323}},{"artifacts":[],"attempt":1,"bundleHash":"35769dc5c21a39e985244feef9bf39c40c424b4553fcb1289dd6631a45c7825c","device":"81314195390981c7","findings":[],"hash":"ed53d61b80332914c52b3819b27f6daa0fcb8b3cd5b913a62fe27e92d7c5a9a1","nodeId":"bf54043f-a7ad-4d8c-ad2d-92f014cb004e","outcome":"completed","summary":"Run 9 is ready to launch. The code I was given already had every change the brief lists, so my diff only fixes two outdated comments, adds one test and rewrites `ADAPTATION.md`.\n\n**What was already there.** I compared run 8.5 (af57f6d) with the current code and every brief item is in place:\n- **Share bands:** they use the exact share now (`CabalGate._shareBps` rounds up), and the seat-NFT address in `launch.json` is in EIP-55 form.\n- **Fees (2.25%):** the owner's share is 1% (`OWNER_BPS` 100). The Letterbox's 95% delivery floor counts the 2.25% sale fees (`HOOK_SALE_FEE_BPS` 225), and `launch.json` has the new Letterbox hash.\n- **Wall guard:** `WALL_GUARD_TICKS_PER_DAY` is 700.\n- **imdTEST:** `launch.json` uses imdTEST in every currency and fee-asset slot, with the mint flag 0 and START 1792594800.\n\nEvery other number in the brief is unchanged, and I didn't touch `foundry.toml` or `launch.json`.\n\n**The two audit findings:**\n1. **imdTEST has a total supply of only 25 wei, and only its owner and minters can mint it:** this is the state of the chain, not a bug in the contracts, so I changed nothing. It does mean the run can't trade, plead or object until IMD's minters give imdTEST to the owner (2 for the opening buy) and to testers (0.5 per hand plea, 0.85 per objection). I listed this as an open item in `ADAPTATION.md`.\n2. **Outdated comments in CabalGate:** confirmed and fixed. The comments on `oracleAsset` and `imd` in `src/CabalGate.sol` named the two tokens from runs 2–8.5; they now say both are imdTEST. CabalGate's compiled bytecode is byte-identical to the version I was given, so neither code hash in `launch.json` changes.\n   - The new test, `test_gateTakesImdTestForBothRolesAndItsNatSpecSaysSo` in `test/LaunchManifest.t.sol`, checks three things: `launch.json` gives the gate the same token for both roles, a deployed gate returns imdTEST for both, and the built docs name imdTEST and not the old addresses.\n\n**Checks**, all with the required fuzz seed:\n- `forge build` and `forge test` pass: 23 tests in 5 suites, including the new one.\n- The full suite in `test/full/`, run seven files at a time, passes: 803 tests in 84 suites.\n- I didn't run the fork tests in `test/fork/` because they need RPC URLs. They are the difference between my 826 tests and the brief's 852.\n- The five-contract launch costs 13,490,574 gas, or 16,458,500 with the factory's 22% headroom. That is 318,716 under the 16,777,216 cap; the brief gave 13,490,541, a 33-gas difference.\n\nNothing was deployed, signed or broadcast.","treeHash":"a6d07cb1887bde3d869ed688ffd9c429fa24ab41","usage":{"cachedInputTokens":912672,"inputTokens":34,"model":"claude-opus-5-5","outputTokens":10565,"runtime":"claude","turns":19,"wallClockMs":907724}}],"verification":[{"checks":[{"durationMs":26096,"exitCode":0,"name":"build","output":"Compiling 122 files with Solc 0.8.26\nSolc 0.8.26 finished in 26.00s\nCompiler run successful with warnings:\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:345:9:\n    |\n345 |         uint8 status,\n    |         ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:383:53:\n    |\n383 |     function _void(uint256 id, Objection storage o, uint8 status, bytes32 reason) internal {\n    |                                                     ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/Seasons.sol:422:58:\n    |\n422 |     function _owners() internal view returns (address a, address b, address c) {\n    |                                                          ^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/CabalGate.sol:755:5:\n    |\n755 |     function _text(string storage t, bool json) internal view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":209,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/LaunchManifest.t.sol:RehearsalManifestTest\n[PASS] test_laterBlockCannotRegisterLauncher() (gas: 14061565)\n[PASS] test_separateConstructorCallsInDeploymentBlockStillWork() (gas: 15285715)\n[PASS] test_separateTransactionsLeaveTheAcceptedDeploymentBlockWindow() (gas: 14195952)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 7.77ms (7.59ms CPU time)\n\nRan 2 tests for test/ManifestInput.t.sol:ManifestInputTest\n[PASS] test_everyManifestWordDeploysAtomicallyAndCommitsTheTribunal() (gas: 22555527)\n[PASS] test_failedLastConstructorRollsBackAllEarlierDeploymentsAndCanRetry() (gas: 27161135)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.06ms (7.01ms CPU time)\n\nRan 3 tests for test/LaunchManifest.t.sol:PostLaunchTest\n[PASS] test_committedHookDeploysLaterAndMintsOnlyTheFixedSplit() (gas: 25073611)\n[PASS] test_committedLetterboxDeploysLater() (gas: 10792122)\nLogs:\n  deployLetterbox transaction gas: 5580980\n\n[PASS] test_committedTribunalDeploysLater() (gas: 10383989)\nLogs:\n  deployTribunal transaction gas: 5271271\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 23.10ms (33.81ms CPU time)\n\nRan 7 tests for test/LaunchManifest.t.sol:AtomicManifestTest\n[PASS] test_factoryDeploysExactManifestOnAnEmptySepoliaChain() (gas: 54722369)\nLogs:\n  five-contract launch transaction gas through IMD's factory: 13490574\n  gas limit with IMD's headroom: 16458500\n  margin to the 16,777,216 cap: 318716\n\n[PASS] test_gateTakesImdTestForBothRolesAndItsNatSpecSaysSo() (gas: 17968744)\n[PASS] test_launchJsonAddressWordsAreTheTestedAddressesInAValidCase() (gas: 36036)\n[PASS] test_launchJsonCommitsToThisLetterbox() (gas: 34660)\n[PASS] test_launchJsonCommitsToThisTribunal() (gas: 31325)\n[PASS] test_launchJsonEncodesOracleMintFlagAsStaticWord() (gas: 11412)\n[PASS] test_launchJsonNotesFitTheManifestCap() (gas: 9627)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 49.67ms (52.43ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_aMintedFeeOnChainOneNeverOpensTrading() (gas: 154934842)\n[PASS] test_deployHookChecksTheInitCodeAndFlags() (gas: 204193860)\n[PASS] test_eachStepFitsAMainnetTransaction() (gas: 208904430)\nLogs:\n  launch (5 contracts + intake mock): 12782909\n  deployLetterbox: 5210191\n  deployHook: 5752858\n  seed: 643071\n\n[PASS] test_launchWiresEverythingWithoutCallingOutside() (gas: 12905047)\n[PASS] test_ownerMaySeedEarly() (gas: 208873802)\n[PASS] test_seedByOwnerAnyTimeByAnyoneAfterStart() (gas: 209012351)\n[PASS] test_theLaunchRefusesAZeroOrSwappedLetterboxHash() (gas: 52942249)\n[PASS] test_theLaunchRefusesAnOracleSetupTheLetterboxWouldRefuse() (gas: 53599557)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 108.71ms (462.13ms CPU time)\n\nRan 5 test suites in 109.30ms (198.30ms CPU time): 23 tests passed, 0 failed, 0 skipped (23 total tests)\n","passed":true},{"durationMs":71,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"CabalGate.appeal(uint256,uint256,string)\",\"CabalGate.appealFor(address,uint256,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.begin()\",\"CabalGate.executeSell(uint256)\",\"CabalGate.executeSellFor(uint256,uint256)\",\"CabalGate.expire(uint256)\",\"CabalGate.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"CabalGate.onPleaFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"CabalGate.submitFor(address,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.submitSell(uint256,string)\",\"CabalGate.unlockCallback(bytes)\",\"Letterbox.appealAuto(uint256,string)\",\"Letterbox.deliver(uint256)\",\"Letterbox.fallback()\",\"Letterbox.letter(string)\",\"Letterbox.plead(uint256,string)\",\"Letterbox.setName(string)\",\"Letterbox.settle(uint256)\",\"PLEA.acceptOwnership()\",\"PLEA.allow(address)\",\"PLEA.approve(address,uint256)\",\"PLEA.burn(uint256)\",\"PLEA.courtTake(address,uint256)\",\"PLEA.init(address,address)\",\"PLEA.renounceOwnership()\",\"PLEA.setLauncher(address,address,address)\",\"PLEA.setLetterbox(address)\",\"PLEA.transfer(address,uint256)\",\"PLEA.transferFrom(address,address,uint256)\",\"PLEA.transferOwnership(address)\",\"PleaDistributor.acceptOwnership()\",\"PleaDistributor.claim(uint256,address,uint256,bytes32[])\",\"PleaDistributor.renounceOwnership()\",\"PleaDistributor.setMerkleRoot(bytes32)\",\"PleaDistributor.transferOwnership(address)\",\"PleaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PleaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PleaHook.fundWall(uint256)\",\"PleaHook.rebalance()\",\"PleaHook.seed()\",\"PleaHook.unlockCallback(bytes)\",\"PleaLaunch.deployHook(bytes32,bytes)\",\"PleaLaunch.deployLetterbox(bytes)\",\"PleaLaunch.deployTribunal(bytes)\",\"PleaLaunch.seed()\",\"Seasons.checkpoint()\",\"Seasons.checkpointObjection(uint256,uint256)\",\"Seasons.closeSeason(uint256[])\",\"Seasons.flushToWall()\",\"Seasons.record(uint256)\",\"Seasons.unlockCallback(bytes)\",\"Tribunal.expire(uint256)\",\"Tribunal.object(uint256,string)\",\"Tribunal.onObjectionFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Tribunal.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Tribunal.settle(uint256)\"],\"files\":{\".gitignore\":5,\"ADAPTATION.md\":73,\"OBJECTIONS.md\":339,\"README.md\":346,\"audit/FINDINGS.md\":211,\"audit/README.md\":35,\"audit/THREAT-MODEL.md\":114,\"audit/jobs/A1.md\":18,\"audit/jobs/A2.md\":23,\"audit/jobs/A3.md\":16,\"audit/jobs/common.md\":14,\"audit/make_jobs.py\":143,\"audit/rounds/1/A1.objective.txt\":26,\"audit/rounds/1/A1.report.md\":130,\"audit/rounds/1/A1.request.json\":9,\"audit/rounds/1/A2.objective.txt\":31,\"audit/rounds/1/A2.report.md\":323,\"audit/rounds/1/A2.request.json\":9,\"audit/rounds/1/A3.objective.txt\":24,\"audit/rounds/1/A3.report.md\":114,\"audit/rounds/1/A3.request.json\":9,\"audit/rounds/1/manifest.json\":87,\"audit/rounds/2/A1.objective.txt\":26,\"audit/rounds/2/A1.report.md\":133,\"audit/rounds/2/A1.request.json\":9,\"audit/rounds/2/A2.objective.txt\":31,\"audit/rounds/2/A2.report.md\":93,\"audit/rounds/2/A2.request.json\":9,\"audit/rounds/2/A3.objective.txt\":24,\"audit/rounds/2/A3.report.md\":142,\"audit/rounds/2/A3.request.json\":9,\"audit/rounds/2/manifest.json\":87,\"audit/rounds/3/A1.objective.txt\":26,\"audit/rounds/3/A1.report.md\":127,\"audit/rounds/3/A1.request.json\":9,\"audit/rounds/3/A2.objective.txt\":31,\"audit/rounds/3/A2.report.md\":192,\"audit/rounds/3/A2.request.json\":9,\"audit/rounds/3/A3.objective.txt\":24,\"audit/rounds/3/A3.report.md\":119,\"audit/rounds/3/A3.request.json\":9,\"audit/rounds/3/manifest.json\":87,\"audit/rounds/4/A1.objective.txt\":26,\"audit/rounds/4/A1.report.md\":88,\"audit/rounds/4/A1.request.json\":9,\"audit/rounds/4/A2.objective.txt\":31,\"audit/rounds/4/A2.report.md\":207,\"audit/rounds/4/A2.request.json\":9,\"audit/rounds/4/A3.objective.txt\":24,\"audit/rounds/4/A3.report.md\":133,\"audit/rounds/4/A3.request.json\":9,\"audit/rounds/4/manifest.json\":87,\"audit/rounds/5/A1.objective.txt\":26,\"audit/rounds/5/A1.report.md\":135,\"audit/rounds/5/A1.request.json\":9,\"audit/rounds/5/A2.objective.txt\":31,\"audit/rounds/5/A2.report.md\":93,\"audit/rounds/5/A2.request.json\":9,\"audit/rounds/5/A3.objective.txt\":24,\"audit/rounds/5/A3.report.md\":73,\"audit/rounds/5/A3.request.json\":9,\"audit/rounds/5/manifest.json\":87,\"audit/rounds/6/A1.objective.txt\":26,\"audit/rounds/6/A1.report.md\":60,\"audit/rounds/6/A1.request.json\":9,\"audit/rounds/6/A2.objective.txt\":31,\"audit/rounds/6/A2.report.md\":161,\"audit/rounds/6/A2.request.json\":9,\"audit/rounds/6/A3.objective.txt\":24,\"audit/rounds/6/A3.request.json\":9,\"audit/rounds/6/manifest.json\":87,\"audit/rounds/7/A1.objective.txt\":26,\"audit/rounds/7/A1.report.md\":132,\"audit/rounds/7/A1.request.json\":9,\"audit/rounds/7/A2.objective.txt\":31,\"audit/rounds/7/A2.report.md\":95,\"audit/rounds/7/A2.request.json\":9,\"audit/rounds/7/A3.objective.txt\":24,\"audit/rounds/7/A3.report.md\":72,\"audit/rounds/7/A3.request.json\":9,\"audit/rounds/7/manifest.json\":87,\"audit/rounds/8/A1.objective.txt\":26,\"audit/rounds/8/A1.report.md\":121,\"audit/rounds/8/A1.request.json\":9,\"audit/rounds/8/A2.objective.txt\":31,\"audit/rounds/8/A2.request.json\":9,\"audit/rounds/8/A3.objective.txt\":24,\"audit/rounds/8/A3.report.md\":114,\"audit/rounds/8/A3.request.json\":9,\"audit/rounds/8/manifest.json\":87,\"foundry.toml\":34,\"launch.json\":58,\"remappings.txt\":4,\"script/Deploy.s.sol\":80,\"script/DeployLetterbox.s.sol\":22,\"script/DeployTribunal.s.sol\":22,\"script/MineSalt.s.sol\":44,\"src/CabalGate.sol\":909,\"src/Letterbox.sol\":757,\"src/OracleAttestation.sol\":227,\"src/PLEA.sol\":151,\"src/PleaDistributor.sol\":60,\"src/PleaHook.sol\":1116,\"src/PleaLaunch.sol\":220,\"src/Seasons.sol\":467,\"src/Tribunal.sol\":561,\"src/interfaces/IPleaParts.sol\":78,\"src/interfaces/IStacker.sol\":12,\"test/Launch.t.sol\":249,\"test/LaunchManifest.t.sol\":419,\"test/ManifestInput.t.sol\":84,\"test/fork/ForkMainnet.t.sol\":406,\"test/fork/ForkTestnet.t.sol\":916,\"test/full/AppealRounding.t.sol\":146,\"test/full/ArtifactDeployment.t.sol\":59,\"test/full/AuditImported.t.sol\":142,\"test/full/AuditRevision.t.sol\":336,\"test/full/AuditRound1.t.sol\":687,\"test/full/AuditRun3.t.sol\":394,\"test/full/AuditRun5.t.sol\":186,\"test/full/BonusInvariant.t.sol\":541,\"test/full/DistributorAdversarial.t.sol\":342,\"test/full/DistributorOwnership.t.sol\":71,\"test/full/GasPass.t.sol\":403,\"test/full/Gate.t.sol\":472,\"test/full/GateAdversarial.t.sol\":400,\"test/full/GateFailureInvariant.t.sol\":330,\"test/full/Hook.t.sol\":372,\"test/full/HookAdversarial.t.sol\":257,\"test/full/HookRevision.t.sol\":554,\"test/full/JudgeFindings.t.sol\":243,\"test/full/Letterbox.t.sol\":915,\"test/full/LetterboxInvariant.t.sol\":447,\"test/full/MainnetGuard.t.sol\":87,\"test/full/OracleConformance.t.sol\":116,\"test/full/OracleReplay.t.sol\":60,\"test/full/Orientation.t.sol\":126,\"test/full/OwnershipTransitionInvariant.t.sol\":238,\"test/full/Run7Coverage.md\":54,\"test/full/Run7DistributorLifecycle.t.sol\":276,\"test/full/Run7ObjectionPoints.t.sol\":204,\"test/full/Run7SeatAccounting.t.sol\":308,\"test/full/Run85Objection.t.sol\":823,\"test/full/SeasonAdversarial.t.sol\":211,\"test/full/SeasonFunds.t.sol\":351,\"test/full/SeasonInvariant.t.sol\":348,\"test/full/SeasonRanking.t.sol\":176,\"test/full/Seasons.t.sol\":290,\"test/full/SeatMultiplier.t.sol\":167,\"test/full/Token.t.sol\":80,\"test/full/TraderAttributionInvariant.t.sol\":287,\"test/full/TraderFallbackAdversarial.t.sol\":315,\"test/full/TraderResolution.t.sol\":225,\"test/full/TraderResolverBoundary.t.sol\":126,\"test/full/TradingInvariant.t.sol\":496,\"test/full/Tribunal.t.sol\":615,\"test/full/TribunalAdversarial.t.sol\":225,\"test/full/TribunalInvariant.t.sol\":603,\"test/full/TribunalOracleBoundary.t.sol\":334,\"test/full/TribunalSeasons.t.sol\":309,\"test/full/TribunalStanding.t.sol\":217,\"test/full/TribunalTextProperties.t.sol\":276,\"test/utils/AdversarialTraderRouter.sol\":38,\"test/utils/ArtifactDeployment.sol\":23,\"test/utils/ClaimTree.sol\":41,\"test/utils/Fixture.sol\":350,\"test/utils/Mocks.sol\":371,\"test/utils/SeasonModel.sol\":117,\"test/utils/SepoliaFixture.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"093ef44909197abda21f9f2c6d88c131576836700bc40b67b0e4d14eafdad5e0","verifiedTreeHash":"a6d07cb1887bde3d869ed688ffd9c429fa24ab41","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":32650,"exitCode":0,"name":"build","output":"Compiling 123 files with Solc 0.8.26\nSolc 0.8.26 finished in 32.54s\nCompiler run successful with warnings:\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:345:9:\n    |\n345 |         uint8 status,\n    |         ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:383:53:\n    |\n383 |     function _void(uint256 id, Objection storage o, uint8 status, bytes32 reason) internal {\n    |                                                     ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/Seasons.sol:422:58:\n    |\n422 |     function _owners() internal view returns (address a, address b, address c) {\n    |                                                          ^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/CabalGate.sol:755:5:\n    |\n755 |     function _text(string storage t, bool json) internal view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":643,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/ManifestInput.t.sol:ManifestInputTest\n[PASS] test_everyManifestWordDeploysAtomicallyAndCommitsTheTribunal() (gas: 22555527)\n[PASS] test_failedLastConstructorRollsBackAllEarlierDeploymentsAndCanRetry() (gas: 27161135)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 8.86ms (10.51ms CPU time)\n\nRan 3 tests for test/LaunchManifest.t.sol:RehearsalManifestTest\n[PASS] test_laterBlockCannotRegisterLauncher() (gas: 14061565)\n[PASS] test_separateConstructorCallsInDeploymentBlockStillWork() (gas: 15285715)\n[PASS] test_separateTransactionsLeaveTheAcceptedDeploymentBlockWindow() (gas: 14195952)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 12.29ms (10.05ms CPU time)\n\nRan 3 tests for test/LaunchManifest.t.sol:PostLaunchTest\n[PASS] test_committedHookDeploysLaterAndMintsOnlyTheFixedSplit() (gas: 25073611)\n[PASS] test_committedLetterboxDeploysLater() (gas: 10792122)\nLogs:\n  deployLetterbox transaction gas: 5580980\n\n[PASS] test_committedTribunalDeploysLater() (gas: 10383989)\nLogs:\n  deployTribunal transaction gas: 5271271\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 24.42ms (33.78ms CPU time)\n\nRan 7 tests for test/LaunchManifest.t.sol:AtomicManifestTest\n[PASS] test_factoryDeploysExactManifestOnAnEmptySepoliaChain() (gas: 54722369)\nLogs:\n  five-contract launch transaction gas through IMD's factory: 13490574\n  gas limit with IMD's headroom: 16458500\n  margin to the 16,777,216 cap: 318716\n\n[PASS] test_gateTakesImdTestForBothRolesAndItsNatSpecSaysSo() (gas: 17968744)\n[PASS] test_launchJsonAddressWordsAreTheTestedAddressesInAValidCase() (gas: 36036)\n[PASS] test_launchJsonCommitsToThisLetterbox() (gas: 34660)\n[PASS] test_launchJsonCommitsToThisTribunal() (gas: 31325)\n[PASS] test_launchJsonEncodesOracleMintFlagAsStaticWord() (gas: 11412)\n[PASS] test_launchJsonNotesFitTheManifestCap() (gas: 9627)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 54.35ms (57.02ms CPU time)\n\nRan 22 tests for test/Run9Sepolia.t.sol:Run9SepoliaTest\n[PASS] testFuzz_buyFeeSplit(uint256) (runs: 64, μ: 1310977, ~: 1310409)\n[PASS] testFuzz_shareBandMatchesExactShare(uint256) (runs: 128, μ: 1836963, ~: 1836818)\n[PASS] test_cannotPassAboveFortyFive() (gas: 1753726)\n[PASS] test_control_stackerOfImdTEST_stacks() (gas: 1300079)\n[PASS] test_deniedPleaCannotBeObjected() (gas: 6089649)\n[PASS] test_dustBuyFirst_openingBuyStillJoinsThePool() (gas: 1024284)\n[PASS] test_handPleaPaysTheOracleFeeInImdTEST() (gas: 5841384)\n[PASS] test_handPleaWithoutImdTESTAllowance_reverts() (gas: 1525466)\n[PASS] test_handPleaWithoutImdTESTBalance_reverts() (gas: 1555806)\n[PASS] test_imdTESTIsBothThePoolCurrencyAndTheOracleFee_mintFlagZero() (gas: 35210)\n[PASS] test_largeFirstBuy_payoutsAreClaims() (gas: 878189)\n[PASS] test_objectionAfterTwentyMinutes_windowClosed() (gas: 7407965)\n[PASS] test_objectionAtExactlyTwentyMinutes_accepted() (gas: 11594608)\n[PASS] test_objectionAtTheMarginIsOverruled_stakeToSeasonPot() (gas: 11930932)\n[PASS] test_objectionPaysFeeAndStakeInImdTEST_sustainedReturnsStake() (gas: 12090417)\n[PASS] test_objectionRefusals() (gas: 16222158)\n[PASS] test_objectionWithoutImdTEST_reverts() (gas: 7654337)\n[PASS] test_openingTwoImdTESTBuy_payoutsJoinThePool() (gas: 1350913)\n[PASS] test_run9FeeAndGuardNumbers() (gas: 67326)\n[PASS] test_shareBandEdgesAreExact() (gas: 2053682)\n[PASS] test_stackerCreditReverts_cashbackPaidInPlainImdTEST() (gas: 1262353)\n[PASS] test_unansweredObjectionIsVoid_stakeBack() (gas: 11750458)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 97.49ms (174.03ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_aMintedFeeOnChainOneNeverOpensTrading() (gas: 154934842)\n[PASS] test_deployHookChecksTheInitCodeAndFlags() (gas: 204193860)\n[PASS] test_eachStepFitsAMainnetTransaction() (gas: 208904430)\nLogs:\n  launch (5 contracts + intake mock): 12782909\n  deployLetterbox: 5210191\n  deployHook: 5752858\n  seed: 643071\n\n[PASS] test_launchWiresEverythingWithoutCallingOutside() (gas: 12905047)\n[PASS] test_ownerMaySeedEarly() (gas: 208873802)\n[PASS] test_seedByOwnerAnyTimeByAnyoneAfterStart() (gas: 209012351)\n[PASS] test_theLaunchRefusesAZeroOrSwappedLetterboxHash() (gas: 52942249)\n[PASS] test_theLaunchRefusesAnOracleSetupTheLetterboxWouldRefuse() (gas: 53599557)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 146.51ms (487.65ms CPU time)\n\nRan 1 test for test/Run9Sepolia.t.sol:Run9InvariantTest\n[PASS]\nRun9InvariantTest invariants:\n[PASS] invariant_feeRatios\n[PASS] invariant_noCashbackStranded\n[PASS] invariant_ownerFeesAreHeld\n[PASS] invariant_pleaSupplyOnlyShrinks\n[PASS] invariant_poolManagerCoversClaims\n Run9InvariantTest invariants (runs: 48, calls: 1440, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| Run9Handler | buy      | 491   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| Run9Handler | plead    | 489   | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| Run9Handler | warp     | 460   | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 517.32ms (492.55ms CPU time)\n\nRan 7 test suites in 520.31ms (861.24ms CPU time): 46 tests passed, 0 failed, 0 skipped (46 total tests)\n","passed":true},{"durationMs":74,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"CabalGate.appeal(uint256,uint256,string)\",\"CabalGate.appealFor(address,uint256,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.begin()\",\"CabalGate.executeSell(uint256)\",\"CabalGate.executeSellFor(uint256,uint256)\",\"CabalGate.expire(uint256)\",\"CabalGate.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"CabalGate.onPleaFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"CabalGate.submitFor(address,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.submitSell(uint256,string)\",\"CabalGate.unlockCallback(bytes)\",\"Letterbox.appealAuto(uint256,string)\",\"Letterbox.deliver(uint256)\",\"Letterbox.fallback()\",\"Letterbox.letter(string)\",\"Letterbox.plead(uint256,string)\",\"Letterbox.setName(string)\",\"Letterbox.settle(uint256)\",\"PLEA.acceptOwnership()\",\"PLEA.allow(address)\",\"PLEA.approve(address,uint256)\",\"PLEA.burn(uint256)\",\"PLEA.courtTake(address,uint256)\",\"PLEA.init(address,address)\",\"PLEA.renounceOwnership()\",\"PLEA.setLauncher(address,address,address)\",\"PLEA.setLetterbox(address)\",\"PLEA.transfer(address,uint256)\",\"PLEA.transferFrom(address,address,uint256)\",\"PLEA.transferOwnership(address)\",\"PleaDistributor.acceptOwnership()\",\"PleaDistributor.claim(uint256,address,uint256,bytes32[])\",\"PleaDistributor.renounceOwnership()\",\"PleaDistributor.setMerkleRoot(bytes32)\",\"PleaDistributor.transferOwnership(address)\",\"PleaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PleaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PleaHook.fundWall(uint256)\",\"PleaHook.rebalance()\",\"PleaHook.seed()\",\"PleaHook.unlockCallback(bytes)\",\"PleaLaunch.deployHook(bytes32,bytes)\",\"PleaLaunch.deployLetterbox(bytes)\",\"PleaLaunch.deployTribunal(bytes)\",\"PleaLaunch.seed()\",\"Seasons.checkpoint()\",\"Seasons.checkpointObjection(uint256,uint256)\",\"Seasons.closeSeason(uint256[])\",\"Seasons.flushToWall()\",\"Seasons.record(uint256)\",\"Seasons.unlockCallback(bytes)\",\"Tribunal.expire(uint256)\",\"Tribunal.object(uint256,string)\",\"Tribunal.onObjectionFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Tribunal.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Tribunal.settle(uint256)\"],\"files\":{\".gitignore\":5,\"ADAPTATION.md\":73,\"OBJECTIONS.md\":339,\"README.md\":346,\"audit/FINDINGS.md\":211,\"audit/README.md\":35,\"audit/THREAT-MODEL.md\":114,\"audit/jobs/A1.md\":18,\"audit/jobs/A2.md\":23,\"audit/jobs/A3.md\":16,\"audit/jobs/common.md\":14,\"audit/make_jobs.py\":143,\"audit/rounds/1/A1.objective.txt\":26,\"audit/rounds/1/A1.report.md\":130,\"audit/rounds/1/A1.request.json\":9,\"audit/rounds/1/A2.objective.txt\":31,\"audit/rounds/1/A2.report.md\":323,\"audit/rounds/1/A2.request.json\":9,\"audit/rounds/1/A3.objective.txt\":24,\"audit/rounds/1/A3.report.md\":114,\"audit/rounds/1/A3.request.json\":9,\"audit/rounds/1/manifest.json\":87,\"audit/rounds/2/A1.objective.txt\":26,\"audit/rounds/2/A1.report.md\":133,\"audit/rounds/2/A1.request.json\":9,\"audit/rounds/2/A2.objective.txt\":31,\"audit/rounds/2/A2.report.md\":93,\"audit/rounds/2/A2.request.json\":9,\"audit/rounds/2/A3.objective.txt\":24,\"audit/rounds/2/A3.report.md\":142,\"audit/rounds/2/A3.request.json\":9,\"audit/rounds/2/manifest.json\":87,\"audit/rounds/3/A1.objective.txt\":26,\"audit/rounds/3/A1.report.md\":127,\"audit/rounds/3/A1.request.json\":9,\"audit/rounds/3/A2.objective.txt\":31,\"audit/rounds/3/A2.report.md\":192,\"audit/rounds/3/A2.request.json\":9,\"audit/rounds/3/A3.objective.txt\":24,\"audit/rounds/3/A3.report.md\":119,\"audit/rounds/3/A3.request.json\":9,\"audit/rounds/3/manifest.json\":87,\"audit/rounds/4/A1.objective.txt\":26,\"audit/rounds/4/A1.report.md\":88,\"audit/rounds/4/A1.request.json\":9,\"audit/rounds/4/A2.objective.txt\":31,\"audit/rounds/4/A2.report.md\":207,\"audit/rounds/4/A2.request.json\":9,\"audit/rounds/4/A3.objective.txt\":24,\"audit/rounds/4/A3.report.md\":133,\"audit/rounds/4/A3.request.json\":9,\"audit/rounds/4/manifest.json\":87,\"audit/rounds/5/A1.objective.txt\":26,\"audit/rounds/5/A1.report.md\":135,\"audit/rounds/5/A1.request.json\":9,\"audit/rounds/5/A2.objective.txt\":31,\"audit/rounds/5/A2.report.md\":93,\"audit/rounds/5/A2.request.json\":9,\"audit/rounds/5/A3.objective.txt\":24,\"audit/rounds/5/A3.report.md\":73,\"audit/rounds/5/A3.request.json\":9,\"audit/rounds/5/manifest.json\":87,\"audit/rounds/6/A1.objective.txt\":26,\"audit/rounds/6/A1.report.md\":60,\"audit/rounds/6/A1.request.json\":9,\"audit/rounds/6/A2.objective.txt\":31,\"audit/rounds/6/A2.report.md\":161,\"audit/rounds/6/A2.request.json\":9,\"audit/rounds/6/A3.objective.txt\":24,\"audit/rounds/6/A3.request.json\":9,\"audit/rounds/6/manifest.json\":87,\"audit/rounds/7/A1.objective.txt\":26,\"audit/rounds/7/A1.report.md\":132,\"audit/rounds/7/A1.request.json\":9,\"audit/rounds/7/A2.objective.txt\":31,\"audit/rounds/7/A2.report.md\":95,\"audit/rounds/7/A2.request.json\":9,\"audit/rounds/7/A3.objective.txt\":24,\"audit/rounds/7/A3.report.md\":72,\"audit/rounds/7/A3.request.json\":9,\"audit/rounds/7/manifest.json\":87,\"audit/rounds/8/A1.objective.txt\":26,\"audit/rounds/8/A1.report.md\":121,\"audit/rounds/8/A1.request.json\":9,\"audit/rounds/8/A2.objective.txt\":31,\"audit/rounds/8/A2.request.json\":9,\"audit/rounds/8/A3.objective.txt\":24,\"audit/rounds/8/A3.report.md\":114,\"audit/rounds/8/A3.request.json\":9,\"audit/rounds/8/manifest.json\":87,\"foundry.toml\":34,\"launch.json\":58,\"remappings.txt\":4,\"script/Deploy.s.sol\":80,\"script/DeployLetterbox.s.sol\":22,\"script/DeployTribunal.s.sol\":22,\"script/MineSalt.s.sol\":44,\"src/CabalGate.sol\":909,\"src/Letterbox.sol\":757,\"src/OracleAttestation.sol\":227,\"src/PLEA.sol\":151,\"src/PleaDistributor.sol\":60,\"src/PleaHook.sol\":1116,\"src/PleaLaunch.sol\":220,\"src/Seasons.sol\":467,\"src/Tribunal.sol\":561,\"src/interfaces/IPleaParts.sol\":78,\"src/interfaces/IStacker.sol\":12,\"test/Launch.t.sol\":249,\"test/LaunchManifest.t.sol\":419,\"test/ManifestInput.t.sol\":84,\"test/Run9Sepolia.t.sol\":583,\"test/fork/ForkMainnet.t.sol\":406,\"test/fork/ForkTestnet.t.sol\":916,\"test/full/AppealRounding.t.sol\":146,\"test/full/ArtifactDeployment.t.sol\":59,\"test/full/AuditImported.t.sol\":142,\"test/full/AuditRevision.t.sol\":336,\"test/full/AuditRound1.t.sol\":687,\"test/full/AuditRun3.t.sol\":394,\"test/full/AuditRun5.t.sol\":186,\"test/full/BonusInvariant.t.sol\":541,\"test/full/DistributorAdversarial.t.sol\":342,\"test/full/DistributorOwnership.t.sol\":71,\"test/full/GasPass.t.sol\":403,\"test/full/Gate.t.sol\":472,\"test/full/GateAdversarial.t.sol\":400,\"test/full/GateFailureInvariant.t.sol\":330,\"test/full/Hook.t.sol\":372,\"test/full/HookAdversarial.t.sol\":257,\"test/full/HookRevision.t.sol\":554,\"test/full/JudgeFindings.t.sol\":243,\"test/full/Letterbox.t.sol\":915,\"test/full/LetterboxInvariant.t.sol\":447,\"test/full/MainnetGuard.t.sol\":87,\"test/full/OracleConformance.t.sol\":116,\"test/full/OracleReplay.t.sol\":60,\"test/full/Orientation.t.sol\":126,\"test/full/OwnershipTransitionInvariant.t.sol\":238,\"test/full/Run7Coverage.md\":54,\"test/full/Run7DistributorLifecycle.t.sol\":276,\"test/full/Run7ObjectionPoints.t.sol\":204,\"test/full/Run7SeatAccounting.t.sol\":308,\"test/full/Run85Objection.t.sol\":823,\"test/full/SeasonAdversarial.t.sol\":211,\"test/full/SeasonFunds.t.sol\":351,\"test/full/SeasonInvariant.t.sol\":348,\"test/full/SeasonRanking.t.sol\":176,\"test/full/Seasons.t.sol\":290,\"test/full/SeatMultiplier.t.sol\":167,\"test/full/Token.t.sol\":80,\"test/full/TraderAttributionInvariant.t.sol\":287,\"test/full/TraderFallbackAdversarial.t.sol\":315,\"test/full/TraderResolution.t.sol\":225,\"test/full/TraderResolverBoundary.t.sol\":126,\"test/full/TradingInvariant.t.sol\":496,\"test/full/Tribunal.t.sol\":615,\"test/full/TribunalAdversarial.t.sol\":225,\"test/full/TribunalInvariant.t.sol\":603,\"test/full/TribunalOracleBoundary.t.sol\":334,\"test/full/TribunalSeasons.t.sol\":309,\"test/full/TribunalStanding.t.sol\":217,\"test/full/TribunalTextProperties.t.sol\":276,\"test/utils/AdversarialTraderRouter.sol\":38,\"test/utils/ArtifactDeployment.sol\":23,\"test/utils/ClaimTree.sol\":41,\"test/utils/Fixture.sol\":350,\"test/utils/Mocks.sol\":371,\"test/utils/SeasonModel.sol\":117,\"test/utils/SepoliaFixture.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a5fe3f11d4ea4dda22ac5ca1b1b2c63a4df14c0e3b62eef8e973ebdafd0bf882","verifiedTreeHash":"ca33a0dc2e45b247e4bfa85511267c951ef41bda","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":27200,"exitCode":0,"name":"build","output":"Compiling 122 files with Solc 0.8.26\nSolc 0.8.26 finished in 27.09s\nCompiler run successful with warnings:\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:345:9:\n    |\n345 |         uint8 status,\n    |         ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Tribunal.sol:383:53:\n    |\n383 |     function _void(uint256 id, Objection storage o, uint8 status, bytes32 reason) internal {\n    |                                                     ^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Tribunal.sol:208:5:\n    |\n208 |     function status(uint256 pleaId) external view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> src/Seasons.sol:422:58:\n    |\n422 |     function _owners() internal view returns (address a, address b, address c) {\n    |                                                          ^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/CabalGate.sol:755:5:\n    |\n755 |     function _text(string storage t, bool json) internal view returns (string memory) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":234,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/LaunchManifest.t.sol:RehearsalManifestTest\n[PASS] test_laterBlockCannotRegisterLauncher() (gas: 14061565)\n[PASS] test_separateConstructorCallsInDeploymentBlockStillWork() (gas: 15285715)\n[PASS] test_separateTransactionsLeaveTheAcceptedDeploymentBlockWindow() (gas: 14195952)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 6.03ms (5.84ms CPU time)\n\nRan 2 tests for test/ManifestInput.t.sol:ManifestInputTest\n[PASS] test_everyManifestWordDeploysAtomicallyAndCommitsTheTribunal() (gas: 22555527)\n[PASS] test_failedLastConstructorRollsBackAllEarlierDeploymentsAndCanRetry() (gas: 27161135)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.85ms (11.73ms CPU time)\n\nRan 3 tests for test/LaunchManifest.t.sol:PostLaunchTest\n[PASS] test_committedHookDeploysLaterAndMintsOnlyTheFixedSplit() (gas: 25073611)\n[PASS] test_committedLetterboxDeploysLater() (gas: 10792122)\nLogs:\n  deployLetterbox transaction gas: 5580980\n\n[PASS] test_committedTribunalDeploysLater() (gas: 10383989)\nLogs:\n  deployTribunal transaction gas: 5271271\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 32.04ms (42.20ms CPU time)\n\nRan 7 tests for test/LaunchManifest.t.sol:AtomicManifestTest\n[PASS] test_factoryDeploysExactManifestOnAnEmptySepoliaChain() (gas: 54722369)\nLogs:\n  five-contract launch transaction gas through IMD's factory: 13490574\n  gas limit with IMD's headroom: 16458500\n  margin to the 16,777,216 cap: 318716\n\n[PASS] test_gateTakesImdTestForBothRolesAndItsNatSpecSaysSo() (gas: 17968744)\n[PASS] test_launchJsonAddressWordsAreTheTestedAddressesInAValidCase() (gas: 36036)\n[PASS] test_launchJsonCommitsToThisLetterbox() (gas: 34660)\n[PASS] test_launchJsonCommitsToThisTribunal() (gas: 31325)\n[PASS] test_launchJsonEncodesOracleMintFlagAsStaticWord() (gas: 11412)\n[PASS] test_launchJsonNotesFitTheManifestCap() (gas: 9627)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 52.94ms (56.41ms CPU time)\n\nRan 8 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_aMintedFeeOnChainOneNeverOpensTrading() (gas: 154934842)\n[PASS] test_deployHookChecksTheInitCodeAndFlags() (gas: 204193860)\n[PASS] test_eachStepFitsAMainnetTransaction() (gas: 208904430)\nLogs:\n  launch (5 contracts + intake mock): 12782909\n  deployLetterbox: 5210191\n  deployHook: 5752858\n  seed: 643071\n\n[PASS] test_launchWiresEverythingWithoutCallingOutside() (gas: 12905047)\n[PASS] test_ownerMaySeedEarly() (gas: 208873802)\n[PASS] test_seedByOwnerAnyTimeByAnyoneAfterStart() (gas: 209012351)\n[PASS] test_theLaunchRefusesAZeroOrSwappedLetterboxHash() (gas: 52942249)\n[PASS] test_theLaunchRefusesAnOracleSetupTheLetterboxWouldRefuse() (gas: 53599557)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 111.64ms (483.15ms CPU time)\n\nRan 5 test suites in 112.16ms (213.50ms CPU time): 23 tests passed, 0 failed, 0 skipped (23 total tests)\n","passed":true},{"durationMs":103,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"CabalGate.appeal(uint256,uint256,string)\",\"CabalGate.appealFor(address,uint256,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.begin()\",\"CabalGate.executeSell(uint256)\",\"CabalGate.executeSellFor(uint256,uint256)\",\"CabalGate.expire(uint256)\",\"CabalGate.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"CabalGate.onPleaFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"CabalGate.submitFor(address,uint256,uint256,string,uint8,uint256,uint256)\",\"CabalGate.submitSell(uint256,string)\",\"CabalGate.unlockCallback(bytes)\",\"Letterbox.appealAuto(uint256,string)\",\"Letterbox.deliver(uint256)\",\"Letterbox.fallback()\",\"Letterbox.letter(string)\",\"Letterbox.plead(uint256,string)\",\"Letterbox.setName(string)\",\"Letterbox.settle(uint256)\",\"PLEA.acceptOwnership()\",\"PLEA.allow(address)\",\"PLEA.approve(address,uint256)\",\"PLEA.burn(uint256)\",\"PLEA.courtTake(address,uint256)\",\"PLEA.init(address,address)\",\"PLEA.renounceOwnership()\",\"PLEA.setLauncher(address,address,address)\",\"PLEA.setLetterbox(address)\",\"PLEA.transfer(address,uint256)\",\"PLEA.transferFrom(address,address,uint256)\",\"PLEA.transferOwnership(address)\",\"PleaDistributor.acceptOwnership()\",\"PleaDistributor.claim(uint256,address,uint256,bytes32[])\",\"PleaDistributor.renounceOwnership()\",\"PleaDistributor.setMerkleRoot(bytes32)\",\"PleaDistributor.transferOwnership(address)\",\"PleaHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PleaHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PleaHook.fundWall(uint256)\",\"PleaHook.rebalance()\",\"PleaHook.seed()\",\"PleaHook.unlockCallback(bytes)\",\"PleaLaunch.deployHook(bytes32,bytes)\",\"PleaLaunch.deployLetterbox(bytes)\",\"PleaLaunch.deployTribunal(bytes)\",\"PleaLaunch.seed()\",\"Seasons.checkpoint()\",\"Seasons.checkpointObjection(uint256,uint256)\",\"Seasons.closeSeason(uint256[])\",\"Seasons.flushToWall()\",\"Seasons.record(uint256)\",\"Seasons.unlockCallback(bytes)\",\"Tribunal.expire(uint256)\",\"Tribunal.object(uint256,string)\",\"Tribunal.onObjectionFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Tribunal.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Tribunal.settle(uint256)\"],\"files\":{\".gitignore\":5,\"ADAPTATION.md\":73,\"OBJECTIONS.md\":339,\"README.md\":346,\"audit/FINDINGS.md\":211,\"audit/README.md\":35,\"audit/THREAT-MODEL.md\":114,\"audit/jobs/A1.md\":18,\"audit/jobs/A2.md\":23,\"audit/jobs/A3.md\":16,\"audit/jobs/common.md\":14,\"audit/make_jobs.py\":143,\"audit/rounds/1/A1.objective.txt\":26,\"audit/rounds/1/A1.report.md\":130,\"audit/rounds/1/A1.request.json\":9,\"audit/rounds/1/A2.objective.txt\":31,\"audit/rounds/1/A2.report.md\":323,\"audit/rounds/1/A2.request.json\":9,\"audit/rounds/1/A3.objective.txt\":24,\"audit/rounds/1/A3.report.md\":114,\"audit/rounds/1/A3.request.json\":9,\"audit/rounds/1/manifest.json\":87,\"audit/rounds/2/A1.objective.txt\":26,\"audit/rounds/2/A1.report.md\":133,\"audit/rounds/2/A1.request.json\":9,\"audit/rounds/2/A2.objective.txt\":31,\"audit/rounds/2/A2.report.md\":93,\"audit/rounds/2/A2.request.json\":9,\"audit/rounds/2/A3.objective.txt\":24,\"audit/rounds/2/A3.report.md\":142,\"audit/rounds/2/A3.request.json\":9,\"audit/rounds/2/manifest.json\":87,\"audit/rounds/3/A1.objective.txt\":26,\"audit/rounds/3/A1.report.md\":127,\"audit/rounds/3/A1.request.json\":9,\"audit/rounds/3/A2.objective.txt\":31,\"audit/rounds/3/A2.report.md\":192,\"audit/rounds/3/A2.request.json\":9,\"audit/rounds/3/A3.objective.txt\":24,\"audit/rounds/3/A3.report.md\":119,\"audit/rounds/3/A3.request.json\":9,\"audit/rounds/3/manifest.json\":87,\"audit/rounds/4/A1.objective.txt\":26,\"audit/rounds/4/A1.report.md\":88,\"audit/rounds/4/A1.request.json\":9,\"audit/rounds/4/A2.objective.txt\":31,\"audit/rounds/4/A2.report.md\":207,\"audit/rounds/4/A2.request.json\":9,\"audit/rounds/4/A3.objective.txt\":24,\"audit/rounds/4/A3.report.md\":133,\"audit/rounds/4/A3.request.json\":9,\"audit/rounds/4/manifest.json\":87,\"audit/rounds/5/A1.objective.txt\":26,\"audit/rounds/5/A1.report.md\":135,\"audit/rounds/5/A1.request.json\":9,\"audit/rounds/5/A2.objective.txt\":31,\"audit/rounds/5/A2.report.md\":93,\"audit/rounds/5/A2.request.json\":9,\"audit/rounds/5/A3.objective.txt\":24,\"audit/rounds/5/A3.report.md\":73,\"audit/rounds/5/A3.request.json\":9,\"audit/rounds/5/manifest.json\":87,\"audit/rounds/6/A1.objective.txt\":26,\"audit/rounds/6/A1.report.md\":60,\"audit/rounds/6/A1.request.json\":9,\"audit/rounds/6/A2.objective.txt\":31,\"audit/rounds/6/A2.report.md\":161,\"audit/rounds/6/A2.request.json\":9,\"audit/rounds/6/A3.objective.txt\":24,\"audit/rounds/6/A3.request.json\":9,\"audit/rounds/6/manifest.json\":87,\"audit/rounds/7/A1.objective.txt\":26,\"audit/rounds/7/A1.report.md\":132,\"audit/rounds/7/A1.request.json\":9,\"audit/rounds/7/A2.objective.txt\":31,\"audit/rounds/7/A2.report.md\":95,\"audit/rounds/7/A2.request.json\":9,\"audit/rounds/7/A3.objective.txt\":24,\"audit/rounds/7/A3.report.md\":72,\"audit/rounds/7/A3.request.json\":9,\"audit/rounds/7/manifest.json\":87,\"audit/rounds/8/A1.objective.txt\":26,\"audit/rounds/8/A1.report.md\":121,\"audit/rounds/8/A1.request.json\":9,\"audit/rounds/8/A2.objective.txt\":31,\"audit/rounds/8/A2.request.json\":9,\"audit/rounds/8/A3.objective.txt\":24,\"audit/rounds/8/A3.report.md\":114,\"audit/rounds/8/A3.request.json\":9,\"audit/rounds/8/manifest.json\":87,\"foundry.toml\":34,\"launch.json\":58,\"remappings.txt\":4,\"script/Deploy.s.sol\":80,\"script/DeployLetterbox.s.sol\":22,\"script/DeployTribunal.s.sol\":22,\"script/MineSalt.s.sol\":44,\"src/CabalGate.sol\":909,\"src/Letterbox.sol\":757,\"src/OracleAttestation.sol\":227,\"src/PLEA.sol\":151,\"src/PleaDistributor.sol\":60,\"src/PleaHook.sol\":1116,\"src/PleaLaunch.sol\":220,\"src/Seasons.sol\":467,\"src/Tribunal.sol\":561,\"src/interfaces/IPleaParts.sol\":78,\"src/interfaces/IStacker.sol\":12,\"test/Launch.t.sol\":249,\"test/LaunchManifest.t.sol\":419,\"test/ManifestInput.t.sol\":84,\"test/fork/ForkMainnet.t.sol\":406,\"test/fork/ForkTestnet.t.sol\":916,\"test/full/AppealRounding.t.sol\":146,\"test/full/ArtifactDeployment.t.sol\":59,\"test/full/AuditImported.t.sol\":142,\"test/full/AuditRevision.t.sol\":336,\"test/full/AuditRound1.t.sol\":687,\"test/full/AuditRun3.t.sol\":394,\"test/full/AuditRun5.t.sol\":186,\"test/full/BonusInvariant.t.sol\":541,\"test/full/DistributorAdversarial.t.sol\":342,\"test/full/DistributorOwnership.t.sol\":71,\"test/full/GasPass.t.sol\":403,\"test/full/Gate.t.sol\":472,\"test/full/GateAdversarial.t.sol\":400,\"test/full/GateFailureInvariant.t.sol\":330,\"test/full/Hook.t.sol\":372,\"test/full/HookAdversarial.t.sol\":257,\"test/full/HookRevision.t.sol\":554,\"test/full/JudgeFindings.t.sol\":243,\"test/full/Letterbox.t.sol\":915,\"test/full/LetterboxInvariant.t.sol\":447,\"test/full/MainnetGuard.t.sol\":87,\"test/full/OracleConformance.t.sol\":116,\"test/full/OracleReplay.t.sol\":60,\"test/full/Orientation.t.sol\":126,\"test/full/OwnershipTransitionInvariant.t.sol\":238,\"test/full/Run7Coverage.md\":54,\"test/full/Run7DistributorLifecycle.t.sol\":276,\"test/full/Run7ObjectionPoints.t.sol\":204,\"test/full/Run7SeatAccounting.t.sol\":308,\"test/full/Run85Objection.t.sol\":823,\"test/full/SeasonAdversarial.t.sol\":211,\"test/full/SeasonFunds.t.sol\":351,\"test/full/SeasonInvariant.t.sol\":348,\"test/full/SeasonRanking.t.sol\":176,\"test/full/Seasons.t.sol\":290,\"test/full/SeatMultiplier.t.sol\":167,\"test/full/Token.t.sol\":80,\"test/full/TraderAttributionInvariant.t.sol\":287,\"test/full/TraderFallbackAdversarial.t.sol\":315,\"test/full/TraderResolution.t.sol\":225,\"test/full/TraderResolverBoundary.t.sol\":126,\"test/full/TradingInvariant.t.sol\":496,\"test/full/Tribunal.t.sol\":615,\"test/full/TribunalAdversarial.t.sol\":225,\"test/full/TribunalInvariant.t.sol\":603,\"test/full/TribunalOracleBoundary.t.sol\":334,\"test/full/TribunalSeasons.t.sol\":309,\"test/full/TribunalStanding.t.sol\":217,\"test/full/TribunalTextProperties.t.sol\":276,\"test/utils/AdversarialTraderRouter.sol\":38,\"test/utils/ArtifactDeployment.sol\":23,\"test/utils/ClaimTree.sol\":41,\"test/utils/Fixture.sol\":350,\"test/utils/Mocks.sol\":371,\"test/utils/SeasonModel.sol\":117,\"test/utils/SepoliaFixture.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":20050,"exitCode":0,"name":"slither","output":"[high/medium] weak-prng at src/PleaHook.sol:1027: PleaHook._updateWallGuard(int24) (src/PleaHook.sol#1027-1052) uses a weak PRNG: \"guardRemainder = numerator % 86400 (src/PleaHook.sol#1039)\"\n[high/medium] weak-prng at src/PleaHook.sol:277: PleaHook.latestPrice() (src/PleaHook.sol#277-290) uses a weak PRNG: \"best = ring[lastCheckpointHour % RING].priceX96 (src/PleaHook.sol#280)\"\n[high/medium] weak-prng at src/PleaHook.sol:1054: PleaHook._checkpoint(uint160) (src/PleaHook.sol#1054-1064) uses a weak PRNG: \"c = ring[hour % RING] (src/PleaHook.sol#1056)\"\n[high/medium] weak-prng at src/PleaHook.sol:293: PleaHook.price24hAgo() (src/PleaHook.sol#293-307) uses a weak PRNG: \"t = ring[target % RING] (src/PleaHook.sol#296)\"\n[high/high] uninitialized-state at src/Seasons.sol:127: Seasons._best (src/Seasons.sol#86) is never initialized. It is used in:\n[high/high] uninitialized-state at src/Seasons.sol:260: Seasons._bestPleaIds (src/Seasons.sol#87) is never initialized. It is used in:\n[high/high] uninitialized-state at src/Seasons.sol:112: Seasons._top (src/Seasons.sol#85) is never initialized. It is used in:\n[medium/medium] divide-before-multiply at src/PleaHook.sol:1086: PleaHook._alignUp(int24) (src/PleaHook.sol#1086-1090) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/Letterbox.sol:400: Letterbox._deliver(uint256,address) (src/Letterbox.sol#400-426) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/PleaHook.sol:1092: PleaHook._alignDown(int24) (src/PleaHook.sol#1092-1096) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/PleaHook.sol:845: PleaHook.rebalance() (src/PleaHook.sol#845-851) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Seasons.sol:463: Seasons._pay(address,uint256) (src/Seasons.sol#463-466) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/CabalGate.sol:207: CabalGate.restricted() (src/CabalGate.sol#207-209) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PleaHook.sol:990: PleaHook._settleImd(uint256) (src/PleaHook.sol#990-995) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PleaHook.sol:932: PleaHook._closeWall() (src/PleaHook.sol#932-945) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PleaHook.sol:293: PleaHook.price24hAgo() (src/PleaHook.sol#293-307) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Letterbox.sol:435: Letterbox._settle(uint256) (src/Letterbox.sol#435-455) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Seasons.sol:178: Seasons.checkpoint() (src/Seasons.sol#178-189) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PleaHook.sol:641: PleaHook._burnPlea(uint256) (src/PleaHook.sol#641-651) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/CabalGate.sol:420: CabalGate._open(address,uint256,string,uint256,uint256) (src/CabalGate.sol#420-448) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Letterbox.sol:394: Letterbox._close(uint256,Letterbox.Escrow) (src/Letterbox.sol#394-398) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/CabalGate.sol:255: CabalGate._factScore(address,uint256,uint256) (src/CabalGate.sol#255-258) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PleaHook.sol:310: PleaHook.launchExtraBps() (src/PleaHook.sol#310-315) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Letterbox.sol:465: Letterbox._settleable(uint256) (src/Letterbox.sol#465-472) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Letterbox.sol:465: Letterbox._settleable(uint256) (src/Letterbox.sol#465-472) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Letterbox.sol:435: Letterbox._settle(uint256) (src/Letterbox.sol#435-455) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PleaHook.sol:856: PleaHook._rebalance() (src/PleaHook.sol#856-930) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/CabalGate.sol:212: CabalGate.diedAt() (src/CabalGate.sol#212-215) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PleaHook.sol:786: PleaHook._applyCap() (src/PleaHook.sol#786-824) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Letterbox.sol:435: Letterbox._settle(uint256) (src/Letterbox.sol#435-455) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Letterbox.sol:458: Letterbox._settleOpen(address) (src/Letterbox.sol#458-463) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Seasons.sol:355: Seasons.flushToWall() (src/Seasons.sol#355-373) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PleaHook.sol:786: PleaHook._applyCap() (src/PleaHook.sol#786-824) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PleaHook.sol:340: PleaHook._pleaIn(PleaHook.Band,uint160) (src/PleaHook.sol#340-352) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PleaHook.sol:856: PleaHook._rebalance() (src/PleaHook.sol#856-930) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/PleaHook.sol:932: Reentrancy in PleaHook._closeWall() (src/PleaHook.sol#932-945):\n[medium/medium] reentrancy-no-eth at src/Letterbox.sol:293: Reentrancy in Letterbox._plead(address,uint256,string,uint8) (src/Letterbox.sol#293-312):\n[medium/medium] reentrancy-no-eth at src/PleaHook.sol:489: Reentrancy in PleaHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/PleaHook.sol#489-575):\n[medium/medium] reentrancy-no-eth at src/CabalGate.sol:320: Reentrancy in CabalGate.submitFor(address,uint256,uint256,string,uint8,uint256,uint256) (src/CabalGate.sol#320-334):\n[medium/medium] reentrancy-no-eth at src/Seasons.sol:320: Reentrancy in Seasons.closeSeason(uint256[]) (src/Seasons.sol#320-351):\n[medium/medium] reentrancy-no-eth at src/PleaHook.sol:856: Reentrancy in PleaHook._rebalance() (src/PleaHook.sol#856-930):\n[medium/medium] reentrancy-no-eth at src/CabalGate.sol:354: Reentrancy in CabalGate.appealFor(address,uint256,uint256,uint256,string,uint8,uint256,uint256) (src/CabalGate.sol#354-369):\n[medium/medium] reentrancy-no-eth at src/PleaHook.sol:856: Reentrancy in PleaHook._rebalance() (src/PleaHook.sol#856-930):\n[medium/medium] reentrancy-no-eth at src/PleaHook.sol:755: Reentrancy in PleaHook._payCashback(address,uint256) (src/PleaHook.sol#755-778):\n[medium/medium] reentrancy-no-eth at src/Letterbox.sol:314: Reentrancy in Letterbox._appeal(address,uint256,string,uint8) (src/Letterbox.sol#314-371):\n[medium/medium] reentrancy-no-eth at src/Tribunal.sol:259: Reentrancy in Tribunal.object(uint256,string) (src/Tribunal.sol#259-305):\n[medium/medium] reentrancy-no-eth at src/Letterbox.sol:435: Reentrancy in Letterbox._settle(uint256) (src/Letterbox.sol#435-455):\n[medium/medium] reentrancy-no-eth at src/CabalGate.sol:452: Reentrancy in CabalGate._ask(uint256) (src/CabalGate.sol#452-467):\n[medium/medium] reentrancy-no-eth at src/PleaHook.sol:587: Reentrancy in PleaHook._payFees(address,bool,uint256,uint256,uint256,uint160) (src/PleaHook.sol#587-636):\n[medium/medium] reentrancy-no-eth at src/Seasons.sol:355: Reentrancy in Seasons.flushToWall() (src/Seasons.sol#355-373):\n[medium/medium] reentrancy-no-eth at src/PleaHook.sol:786: Reentrancy in PleaHook._applyCap() (src/PleaHook.sol#786-824):\n[medium/medium] reentrancy-no-eth at src/PleaHook.sol:489: Reentrancy in PleaHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/PleaHook.sol#489-575):\n[medium/medium] reentrancy-no-eth at src/PleaHook.sol:856: Reentrancy in PleaHook._rebalance() (src/PleaHook.sol#856-930):\n[medium/medium] uninitialized-local at src/Seasons.sol:442: Seasons._payBonus(uint256,Seasons.Entry[25]).paid (src/Seasons.sol#442) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Letterbox.sol:414: Letterbox._deliver(uint256,address).fee (src/Letterbox.sol#414) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PleaHook.sol:592: PleaHook._payFees(address,bool,uint256,uint256,uint256,uint160).toPrize (src/PleaHook.sol#592) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Seasons.sol:267: Seasons._record(uint256,uint256,address,uint8).mi (src/Seasons.sol#267) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PleaHook.sol:299: PleaHook.price24hAgo().bestHour (src/PleaHook.sol#299) is a local variable never initialized\n[medium/medium] uninitialized-local at src/CabalGate.sol:844: CabalGate._validateText(string).len (src/CabalGate.sol#844) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Seasons.sol:335: Seasons.closeSeason(uint256[]).paid (src/Seasons.sol#335) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Seasons.sol:272: Seasons._record(uint256,uint256,address,uint8).pts (src/Seasons.sol#272) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Tribunal.sol:497: Tribunal._validateText(string).len (src/Tribunal.sol#497) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PleaHook.sol:282: PleaHook.latestPrice().bestHour (src/PleaHook.sol#282) is a local variable never initialized\n[medium/medium] unused-return at src/Seasons.sol:377: Seasons._redeemClaims() (src/Seasons.sol#377-384) ignores return value by pm.unlock(abi.encode(amount)) (src/Seasons.sol#383)\n[medium/medium] unused-return at src/PleaHook.sol:990: PleaHook._settleImd(uint256) (src/PleaHook.sol#990-995) ignores return value by poolManager.settle() (src/PleaHook.sol#994)\n[medium/medium] unused-return at src/Tribunal.sol:419: Tribunal._question(uint256,bool) (src/Tribunal.sol#419-431) ignores return value by (None,score,None,None) = gate.result(o.pleaId) (src/Tribunal.sol#421)\n[medium/medium] unused-return at src/Tribunal.sol:259: Tribunal.object(uint256,string) (src/Tribunal.sol#259-305) ignores return value by (seller,None,approved,verdictAt) = gate.result(pleaId) (src/Tribunal.sol#261)\n[medium/medium] unused-return at src/PleaHook.sol:856: PleaHook._rebalance() (src/PleaHook.sol#856-930) ignores return value by (d,None) = poolManager.modifyLiquidity(poolKey(),ModifyLiquidityParams({tickLower:lower,tickUpper:upper,liquidityDelta:int256(uint256(liquidity)),salt:0}),) (src/PleaHook.sol#910-916)\n[medium/medium] unused-return at src/CabalGate.sol:500: CabalGate._stale(CabalGate.Plea) (src/CabalGate.sol#500-504) ignores return value by (None,None,None,completed) = intake.requests(p.intakeId) (src/CabalGate.sol#502)\n[medium/medium] unused-return at src/CabalGate.sol:657: CabalGate.unlockCallback(bytes) (src/CabalGate.sol#657-690) ignores return value by pm.settle() (src/CabalGate.sol#687)\n[medium/medium] unused-return at src/PleaHook.sol:960: PleaHook.unlockCallback(bytes) (src/PleaHook.sol#960-988) ignores return value by poolManager.settle() (src/PleaHook.sol#980)\n[medium/medium] unused-return at src/PleaHook.sol:259: PleaHook.currentTick() (src/PleaHook.sol#259-261) ignores return value by (None,tick,None,None) = poolManager.getSlot0(poolId()) (src/PleaHook.sol#260)\n[medium/medium] unused-return at src/PleaHook.sol:826: PleaHook._removeLiquidity(int24,int24,uint256) (src/PleaHook.sol#826-838) ignores return value by (d,None) = poolManager.modifyLiquidity(poolKey(),ModifyLiquidityParams({tickLower:lower,tickUpper:upper,liquidityDelta:- int256(liquidity),salt:0}),) (src/PleaHook.sol#830-834)\n[medium/medium] unused-return at src/Seasons.sol:194: Seasons.checkpointObjection(uint256,uint256) (src/Seasons.sol#194-207) ignores return value by (None,None,approved,verdictAt) = gate.result(pleaId) (src/Seasons.sol#197)\n[medium/medium] unused-return at src/Tribunal.sol:403: Tribunal._stale(Tribunal.Objection) (src/Tribunal.sol#403-407) ignores return value by (None,None,None,completed) = intake.requests(o.intakeId) (src/Tribunal.sol#405)\n[medium/medium] unused-return at src/OracleAttestation.sol:158: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/OracleAttestation.sol#158-171) ignores return value by (recovered,err,None) = ECDSA.tryRecover(digest,signature) (src/OracleAttestation.sol#166)\n[medium/medium] unused-return at src/Tribunal.sol:194: Tribunal.standing(uint256) (src/Tribunal.sol#194-205) ignores return value by (seller,None,approved,verdictAt) = gate.result(pleaId) (src/Tribunal.sol#198)\n[medium/medium] unused-return at src/PleaHook.sol:255: PleaHook.currentSqrtPriceX96() (src/PleaHook.sol#255-257) ignores return value by (sqrtPriceX96,None,None,None) = poolManager.getSlot0(poolId()) (src/PleaHook.sol#256)\n[medium/medium] unused-return at src/Tribunal.sol:308: Tribunal.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/Tribunal.sol#308-340) ignores return value by (None,oldScore,None,None) = gate.result(pleaId) (src/Tribunal.sol#328)\n[medium/medium] unused-return at src/Letterbox.sol:474: Letterbox._intakeDone(bytes32) (src/Letterbox.sol#474-476) ignores return value by (None,None,None,done) = gate.intake().requests(intakeId) (src/Letterbox.sol#475)\n[medium/medium] unused-return at src/PleaHook.sol:960: PleaHook.unlockCallback(bytes) (src/PleaHook.sol#960-988) ignores return value by (d,None) = poolManager.modifyLiquidity(poolKey(),ModifyLiquidityParams({tickLower:lower,tickUpper:upper,liquidityDelta:int256(uint256(liquidity)),salt:0}),) (src/PleaHook.sol#967-973)\n[low/high] shadowing-local at src/Tribunal.sol:208: Tribunal.onObjectionFailure(bytes32,uint8,bytes32,uint16,uint16,bytes).status (src/Tribunal.sol#345) shadows:\n[low/high] shadowing-local at src/Tribunal.sol:208: Tribunal._void(uint256,Tribunal.Objection,uint8,bytes32).status (src/Tribunal.sol#383) shadows:\n[low/medium] missing-zero-check at src/PleaLaunch.sol:93: PleaLaunch.constructor(address,address,address,address,address,address,address,uint256,uint256,address,bool,bytes32,bytes32).imd_ (src/PleaLaunch.sol#93) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PleaLaunch.sol:120: PleaLaunch.constructor(address,address,address,address,address,address,address,uint256,uint256,address,bool,bytes32,bytes32).owner_ (src/PleaLaunch.sol#120) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PleaHook.sol:204: PleaHook.constructor(IPoolManager,address,IERC20,IStacker,address,address,uint256).seasons_ (src/PleaHook.sol#204) lacks a zero-check on :\n[low/medium] missing-zero-check at src/Seasons.sol:102: Seasons.constructor(address,address,address,address).seat_ (src/Seasons.sol#102) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PleaLaunch.sol:90: PleaLaunch.constructor(address,address,address,address,address,address,address,uint256,uint256,address,bool,bytes32,bytes32).seasons_ (src/PleaLaunch.sol#90) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PleaLaunch.sol:89: PleaLaunch.constructor(address,address,address,address,address,address,address,uint256,uint256,address,bool,bytes32,bytes32).gate_ (src/PleaLaunch.sol#89) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PleaLaunch.sol:97: PleaLaunch.constructor(address,address,address,address,address,address,address,uint256,uint256,address,bool,bytes32,bytes32).oracleAsset_ (src/PleaLaunch.sol#97) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PleaLaunch.sol:88: PleaLaunch.constructor(address,address,address,address,address,address,address,uint256,uint256,address,bool,bytes32,bytes32).plea_ (src/PleaLaunch.sol#88) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PleaHook.sol:200: PleaHook.constructor(IPoolManager,address,IERC20,IStacker,address,address,uint256).plea_ (src/PleaHook.sol#200) la","passed":true},{"durationMs":1211,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PleaLaunch.sol:123: `abi.encodePacked()` Hash Collision\n[high] reentrancy-state-change at src/CabalGate.sol:192: Reentrancy: State change after external call (40 places)\n[high] storage-array-memory-edit at src/PleaHook.sol:318: Storage Array Edited with Memory (6 places)\n[high] unsafe-casting at src/CabalGate.sol:438: Unsafe Casting of integers (3 places)\n[low] centralization-risk at src/PLEA.sol:14: Centralization Risk (5 places)\n[low] costly-loop at src/Seasons.sol:310: Costly operations inside loop (3 places)\n[low] division-before-multiplication at src/Letterbox.sol:406: Incorrect Order of Division and Multiplication\n[low] internal-function-used-once at src/Tribunal.sol:36: Internal Function Used Only Once\n[low] large-numeric-literal at src/CabalGate.sol:263: Large Numeric Literal (13 places)\n[low] literal-instead-of-constant at src/CabalGate.sol:263: Literal Instead of Constant (125 places)\n[low] missing-inheritance at src/PleaHook.sol:35: Missing Inheritance (3 places)\n[low] require-revert-in-loop at src/CabalGate.sol:836: Loop Contains `require`/`revert` (6 places)\n[low] state-change-without-event at src/CabalGate.sol:657: State Change Without Event (4 places)\n[low] unchecked-return at src/CabalGate.sol:405: Unchecked Return (8 places)\n[low] uninitialized-local-variable at src/Seasons.sol:294: Uninitialized Local Variable (3 places)\n[low] unsafe-erc20-operation at src/PleaHook.sol:771: Unsafe ERC20 Operation (3 places)\n[low] unused-import at src/PleaLaunch.sol:4: Unused Import (3 places)\n[low] unused-public-function at src/CabalGate.sol:212: Public Function Not Used Internally (9 places)\n[low] unused-state-variable at src/PLEA.sol:29: Unused State Variable (6 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ed53d61b80332914c52b3819b27f6daa0fcb8b3cd5b913a62fe27e92d7c5a9a1","verifiedTreeHash":"a6d07cb1887bde3d869ed688ffd9c429fa24ab41","verifierVersion":"0.1.0+a6ee6548"}]}