{"assessments":[],"deployments":[{"attestationHash":"d839cbb5377cc24293e0417f9f80b36c838488bf1210a7b2953c0ee87cb8ac4d","chainId":11155111,"contracts":[{"address":"0x6ba5f17245cb9df81b3b713c7450c7f2e7cba298","blockNumber":11903244,"name":"ProjectRegistry","role":"other","txHash":"0x10f8428c533233256a743d11ecc1a6e5eb43ef834809e331f0f9c3a9eeb21461"}],"id":"7f3316c0-ce7d-4b5a-b2f3-4541e0cae1a5","manifestHash":"038fb09cafacafe7ab383185d305ca0c3dfd7e31128ba8c9e0e369db3a3655bb","status":"live"}],"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":"6478f77c-4785-4534-9dcc-1da400871f70","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"9032d0f4a2fa2bf70a0c477dfd379964555f40151d951773482b614283b4a89f","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":"181b857bb0f2822f4a587842e9b48622e10e346d707dffc1a305fe18ba2468e2","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":"7defd06ee397589cd0341cff1ae63007a625a3068acb299fe320ad2d0d2f4eb6","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":"3f06344a98081f48d903c0096c5c30f4259c3a326e3ba7c2e7d644f8b234d50f","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":"86e1b4baf81eb950b3d5f49a19e6b764d6c87a11d243e2ebae10821e317c31ae","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":"402f42f5e3abf0396e179c426bb70680f9a21e2a343f092b0c083921be4c7c17","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":"6f9ba7674080a748fb48b70ecbf052506986f1b61353dadd8091254dc87b052f","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":"a68c567f86f9e0f6e50a478daf8babe4b5288dde3f96dc52ca4b69c3471387c6","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"d57ef1d34662c6af46c2de356ba2ae9fadefeb9522d93d38c822a72474935512","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Launch imd/acc's third and last Sepolia test run from this repository's sepolia branch: deploy only the ProjectRegistry, exactly as launch.json lists it, wired to test run 2's live Stacker and to IdentityMD's Intake v2. This registry is the code the mainnet registry will use, with Sepolia settings, and it asks the oracle panel with version 2 of the rules; this run tests those rules live (applications, a listing and a challenge) before mainnet. imd/acc pays trading cashback to traders as staked IMD (sIMD), 0.25% to 1% of each trade at each project's choice, funded from the project's existing fees; only credits from listed projects earn points.\n\nDEPLOY (Sepolia, one contract):\n- ProjectRegistry(intake, oracleAsset, stacker, oracleSigner, questionChainId, challengeBond, challengeCooldown) = (0xa43e6f75ee006411f79ac1c84120606c2330de82 Intake v2, 0x44a1cd38474fb1748400e7deb5f8d786cce3f89a Sepolia test IMD, 0x0457276d7b036818b3eddc1a4a3fceda61e9314d the live Stacker of launch #1294, 0x5598aa9146215bc13eb26f2c692ad1461fd32982 oracle signer, 1, 5e18, 3600). launch.json already lists exactly this.\n- Do not deploy a Stacker, TestIMD or TestSIMD. The Stacker at 0x0457...314d is live and runs src/Stacker.sol byte for byte (test/SepoliaFork.t.sol checks it) on the live TestIMD 0x2b69...1e82 and TestSIMD 0xf9e2...1cc1 of launch #1129, and PLEA's hook already credits through it. The registry only names the Stacker in its questions and never calls it.\n- src/ProjectRegistry.sol and src/oracle/OracleAttestation.sol stay as they are: no owner; the constructor makes no external call. Anyone calls applyListing(project, name, sourceUrl, rateBps 25-100, beneficiary) or, for a listed project, challengeForBeneficiary(project, reason, beneficiary), paying the oracle fee read live from the Intake (ORACLE_FEE(), 0.5 test IMD) plus the bond for a challenge; the registry asks Intake v2 one yes-or-no question with requestWithFailure, with the 8 rules of version 2 (docs/panel-rules-v2.md), each under 512 characters. onOracleResult (0x510379c7) accepts only the Intake, only its own open request, each answer once, only a signature by the oracle signer for this contract issued after the ask, from a panel of 15 with at least 11 agreeing: yes lists from that block, or keeps a challenged project (bond to its beneficiary, without restarting the cooldown); no rejects, or delists from that block (bond back). A challenge asks about the project's current rate within 25-100 bps. onOracleFailure (0xa7980e31) only clears the open question and returns a bond; expire clears one after a day or once the Intake completed it. setBeneficiary waits while a question is open. Questions are filed under chain 1 (the oracle has no Sepolia RPC) and name Sepolia in the text.\n- test/mocks and test/trial hold test doubles only. Keep foundry.toml as it is (solc 0.8.26, cancun, 10,000 runs, bytecode_hash none).\n\nFACTS (read on Sepolia 2026-10-12, block 11,896,540): Intake v2 is live (callback gas 1,000,000) and sells the question for 0.5 of the test IMD, which anyone can mint. The live Stacker's IMD() and SIMD() are TestIMD and TestSIMD; TestSIMD is not paused. The registry's runtime is 22,019 bytes; deploying it estimates about 34.7M gas on Sepolia's current schedule (test run 2's two contracts used 39.8M through the factory).\n\nTESTS: forge test passes (158 tests: 150 run offline; 8 fork tests run when ETH_RPC_URL and SEPOLIA_RPC_URL are set and are skipped otherwise). test/Deployment.t.sol checks this manifest: the registry alone, wired to the live Stacker, with the agreed Sepolia bond and cooldown. Keep all of them passing.\n\nREADME: once live, add the registry's address as \"Sepolia test run 3\" in the Deployments table.","parentJobId":null,"planHash":"5d67bc3b275a2b2b453a2537a3075f77a2692aaf93a6bac5668128bd63371daf","previousHash":"adda414a085615616df78073789d34bf053469d53796b34764c0069499b4dfee","projectId":"6478f77c-4785-4534-9dcc-1da400871f70","publication":{"commit":"8d3bf00656aee4568a0d21ad9e6c4debe624c29b","deliveredAt":"2026-10-13T01:58:07.120Z","repoUrl":"https://github.com/identity-md-launches/launch-1366-launch-imd-acc-s-third-last"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"591baaeebecc08c70168ad497bddbf781e082c2c07ef943b3bc7114abc50052c","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e12f98dda6acc55f","findings":[{"citation":"resolved","description":"Economics x asymmetry. For a third party a challenge risks the 5 IMD bond (paid to the beneficiary on a signed yes). For the project's beneficiary (or any wallet it controls) a challenge risks nothing: on yes the bond goes to p.beneficiary (itself, line 362), on no it goes to asker (itself, line 367), on failure or expiry it goes to asker (itself, line 414). Only the 0.5 IMD oracle fee is spent. Because one question per project is open at a time (AskOpen, line 274) and a settled or cleared challenge starts no cooldown (challengeOpenAt is written only on listing, line 354), the beneficiary can watch the mempool and front-run every hostile challengeForBeneficiary with its own challenge carrying a bland reason ('routine check'). The hostile call reverts with AskOpen before paying, and the hostile [REASON] text, which is the only channel by which a challenger points the panel at a specific violation, is never sent. The panel then judges the project from the beneficiary's framing. With the v2 rules rehearsed on Sepolia the decisive margin was exactly the quorum (11 of 13), so which reason the panel reads can decide the outcome. Impact: no funds are lost, but the challenge mechanism's guarantee (anyone can put a reason in front of the panel after the cooldown) can be denied indefinitely at 0.5 IMD per round, and a non-compliant project keeps earning points meanwhile. The existing test test_selfChallengeOccupiesSlotOnlyUntilItSettles records that the slot can be bought, but not that the buyer bears no bond risk and can repeat it on every attempt. Possible fixes (design decision for the author): refuse a challenge whose msg.sender equals p.beneficiary and let a defended bond paid to the beneficiary count only when asker != beneficiary (sybil wallets remain, but they then cost a real bond when the panel says no... they do not: the bond returns to asker on no, so also consider sending a self-challenge's bond on failure/expiry to the challenger of record only when it is not the beneficiary), or allow a second challenger to append a reason to an open challenge, or start a short per-project cooldown after any cleared challenge so a pre-emption cannot be repeated immediately.","line":362,"path":"src/ProjectRegistry.sol","reproduction":"State: project P listed, beneficiary B, cooldown passed. B holds >= 5.5 test IMD and approved the registry. 1) Challenger C broadcasts challengeForBeneficiary(P, 'owner can call credit outside trades, see fn X', B). 2) B front-runs with challengeForBeneficiary(P, 'routine check', B): pulls 5.5 IMD from B, opens Ask.Challenge. 3) C's tx reverts AskOpen (line 274); C paid nothing and its reason is never in any Intake body. 4) Panel answers; the Intake calls onOracleResult: on yes, line 362 pays 5 IMD to p.beneficiary = B; on no, line 367 pays 5 IMD to asker = B; onOracleFailure/expire pay asker = B (line 414). 5) challengeOpenAt is unchanged, so C retries and B repeats step 2. Observed in a scratch run (3 rounds, signed yes each time): B's balance fell by exactly 1.5 IMD (three fees); C's balance unchanged at 100 IMD; no body containing C's reason was ever created. Expected per the design ('anyone can challenge a listed project with a bond' after the cooldown): C's reason reaches the panel, or B's blocking costs B a bond.","severity":"low","snippet":"            if (challengeBond != 0) oracleAsset.safeTransfer(p.beneficiary, challengeBond);","title":"Beneficiary can pre-empt every hostile challenge with a riskless self-challenge, so the challenger's evidence never reaches the panel"},{"citation":"resolved","description":"Economic Security: cost of the cheapest griefing vector. The design note says the bond 'makes challenging a project just to annoy it costly, since a defended challenge pays the bond to the project'. That holds only when at least 11 of 15 seats agree yes. When the panel splits, the Intake calls onOracleFailure and _clear returns the bond to the asker (lines 413-414); nothing is paid to the project, and because no cooldown follows a cleared challenge (challengeOpenAt is only written on listing) the same griefer can refile in the next block. While each question is open setBeneficiary reverts AskOpen (line 433) and no other challenge can be filed. Live Sepolia data: with the v1 rules PLEA's two panels split (8/13 and 9/13 yes), and the v2 rehearsal reached exactly the 11 needed, so a compliant project cannot count on a decisive yes. Expected griefing cost per round on mainnet is therefore 0.5 IMD + P(decisive yes) x 20 IMD rather than 20.5 IMD, and on Sepolia (free test IMD) zero. The refund on failure is a deliberate choice documented in the contract header (an honest challenger should not lose a bond to a panel failure), so this is recorded as a limit of the stated economic guarantee, not a code defect: the author may want a short post-clear cooldown or a per-asker rate limit if the guarantee matters on mainnet.","line":413,"path":"src/ProjectRegistry.sol","reproduction":"State: project P listed with beneficiary B, cooldown passed; griefer G holds 5.5 IMD per round. 1) G calls challengeForBeneficiary(P, 'spam', B): 5.5 IMD pulled. 2) B calls setBeneficiary(P, X): reverts AskOpen. 3) Intake reports status 2 'disagreed' through onOracleFailure: _clear pays 5 IMD back to G, emits AskCleared; B receives nothing. 4) G repeats step 1 in the next block (no ChallengeTooSoon since challengeOpenAt is unchanged). Scratch run, 3 rounds: G's balance fell by exactly 1.5 IMD (three fees), B's balance unchanged apart from its own application fee. Expected under the design note: a griefing challenge costs the griefer the bond.","severity":"info","snippet":"        if (ask == Ask.Challenge && challengeBond != 0) {\n            oracleAsset.safeTransfer(asker, challengeBond);\n        }","title":"Bond deterrent assumes a decisive panel: on a split (status 2) the challenger's bond is refunded and the challenge can be refiled at once, so griefing a listed project costs the fee alone"}],"hash":"181b857bb0f2822f4a587842e9b48622e10e346d707dffc1a305fe18ba2468e2","nodeId":"17f51361-3f01-4e9b-93fa-5917dba92a2d","outcome":"completed","summary":"Review complete. The findings file is written and validated, the scratch test removed, and the tree is otherwise untouched.\n\n**Outcome.** No critical, high or medium defect in the economics area. The registry's value flows (fee, bond, settlement destinations) are correct and conserved on every path I traced, including against the live Sepolia Intake v2. Two economic observations are recorded in `.imd-findings.json`:\n\n- **Low: riskless self-challenge pre-emption.** The beneficiary's own challenge gets its bond back in all three outcomes (yes pays the beneficiary, no and failure pay the asker). With one open question per project and no cooldown after a settled challenge, the beneficiary can front-run every hostile challenge for the 0.5 IMD fee alone, so the challenger's reason never reaches the panel. Demonstrated over three rounds in a scratch test.\n- **Info: the bond deterrent needs a decisive panel.** A split panel refunds the griefer's bond and allows an immediate refile, which also keeps `setBeneficiary` blocked. Live data shows splits are common. This refund is a deliberate, documented choice, so it is filed as a limit of the stated guarantee rather than a defect.\n\n**Verified live and locally.**\n- All 150 offline tests pass. All 8 fork tests pass on public Sepolia and mainnet RPCs, including the registry's real application to Intake v2.\n- Live facts match the brief: price 0.5 test IMD, callback gas 1,000,000, Stacker on TestIMD/TestSIMD, vault unpaused, EOA signer.\n- Cold callback gas is 62k to 97k per settlement path, under mainnet's 200k stipend.\n- Both bond tokens are plain OpenZeppelin ERC20s (mainnet IMD is a LayerZero OFT), so bond pushes cannot be blocked.\n- `launch.json` has only the schema keys, seven string arguments in order matching the brief, and notes under the limit.\n\n**Coverage.** All eight listed entry points have rows, plus rows for the balance and state-coupling invariants, the manifest and the live dependencies. Application spam, fixed oracle settings and writer trust were checked and found already documented as known limits in the design notes, so they were not re-reported.","treeHash":null,"usage":{"cachedInputTokens":1562827,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":45338,"runtime":"claude","turns":39,"wallClockMs":746867}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"60c045240bb09c33","findings":[{"citation":"resolved","description":"The oracle-consumer reference says the intake, action id, asset/price and signer must be constructor inputs AND owner-settable, because the plane anticipates rotating its signing key and publishing a new action version (oracle-2). ProjectRegistry has no owner by design (the brief requires this), so `oracleSigner` is fixed for life (OracleAttestationConsumer exposes only `_setOracleSigner`, which nothing calls), `intake` and `oracleAsset` are immutable and `ACTION` is a constant. A retired action fails safely: `priceOf` returns 0 and `_ask` reverts `OracleUnavailable` before pulling any token (covered by test_retiredActionRefusesBeforePaymentAndPreservesListing). A signer rotation does not: `applyListing`/`challengeForBeneficiary` still pull the 0.5 IMD fee (plus bond) and open a question, and every answer then reverts `BadSignature` in `onOracleResult`, so the Intake records it as not delivered. Open bonds are recoverable through `expire`, but every fee paid after the rotation is spent for nothing until users notice and the registry is redeployed. This is a documented trust assumption of the agreed design (no owner; the Stacker never reads the registry so it can be replaced), not a permission bypass, so it is reported as low for the adapter and the panel to weigh, not as a request to add an owner.","line":181,"path":"src/ProjectRegistry.sol","reproduction":"State: registry live with oracleSigner S1. IdentityMD rotates the oracle signer to S2 (or S1 is compromised and retired). Then: (1) applicant calls applyListing(project, \"PLEA\", \"https://github.com/khaed1/plea\", 50, beneficiary): succeeds, 0.5 IMD leaves the applicant to the Intake's payTo. (2) The Intake delivers the panel's attestation signed by S2: onOracleResult reverts BadSignature (ECDSA recovers S2 != oracleSigner, ERC-1271 fails for an EOA); Completed(delivered=false). (3) Anyone calls expire(project) at once (completed==true): AskCleared, nothing listed. Expected per the reference: the signer can be moved without a redeploy and asks settle; actual: every ask after the rotation costs 0.5 IMD and can never settle. Mirror in the suite: RegistryAdversarial.test_everySignedFieldIsAuthenticatedBeforeABondCanMove shows a non-signer answer is refused; there is no test of asking after the fee is spent against an unreachable signer because no rotation exists.","severity":"low","snippet":"    ) OracleAttestationConsumer(oracleSigner_) {","title":"Oracle signer, Intake and action id cannot be rotated; a signer rotation keeps taking fees for answers that can never settle"},{"citation":"resolved","description":"Only one question may be open per project. A challenge by the project's own beneficiary costs only the oracle fee: its bond is paid back to `p.beneficiary` on a \"yes\" (line 362), i.e. to itself. Because `_challenge` reverts `AskOpen` for anyone else while that self-challenge is open, a beneficiary watching the public mempool can front-run every third-party `challengeForBeneficiary` with `challengeForBeneficiary(project, \"fine\", self)`. The third party's transaction reverts before paying anything, so it is not a loss of funds, but the panel only ever receives the beneficiary's benign `[REASON]` text, never the challenger's pointer to the specific violation. The panel still judges all 8 rules from the code on each self-challenge, so a clearly non-compliant project still risks delisting, which bounds the impact; and a defended challenge no longer restarts the cooldown (test_defendedSelfChallengeDoesNotRenewImmunity), so no immunity is gained. The cost of the suppression is 0.5 IMD per hostile attempt (zero on Sepolia where the test IMD is freely minted), the gain is keeping targeted evidence away from the panel. On mainnet a challenger can route through a private relay; on Sepolia there is none. Reported low: a griefing property of the agreed one-slot design, with a concrete sequence, for the adapter to decide whether the question text should carry the previous cleared reasons or whether the slot rule should prefer third-party challenges.","line":274,"path":"src/ProjectRegistry.sol","reproduction":"State: project listed, beneficiary B, cooldown elapsed, challenger C holds 5.5 IMD approved to the registry. Sequence in one block: (1) B (front-running) calls challengeForBeneficiary(project, \"fine\", B): pulls 0.5 + 5 IMD, opens Ask.Challenge. (2) C's challengeForBeneficiary(project, \"It credits the owner outside trades\", B) reverts AskOpen; C pays nothing. (3) The panel answers yes to B's question: bond 5 IMD returns to B, project stays listed, challengeOpenAt unchanged; B's net cost 0.5 IMD. (4) C retries; B front-runs again. Verified with a scratch test on the mock Intake: after step 3 B's balance is exactly 0.5e18 lower than before step 1 and isListed(project) is true. Expected: a challenger's reason reaches the panel at some bounded cost to the defender; actual: it can be kept out indefinitely at 0.5 IMD per attempt.","severity":"low","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"A beneficiary can front-run any hostile challenge with a fee-only self-challenge, so the challenger's reason never reaches the panel"},{"citation":"resolved","description":"The Intake's `complete` marks a request completed before calling the callback once with a fixed stipend and never retries (verified in the Sepolia/mainnet Intake v2 source from Sourcify, identical on both chains). If `onOracleResult` reverts for a genuine answer, the verdict is gone: `TooLate` (delivery more than one day after the ask), `WrongPanel` (the plane opened fewer than 15 seats or fewer than 11 agreed), a starved stipend, or a signer mismatch. For an application the \"yes\" is lost and the applicant pays 0.5 IMD again. For a challenge, `expire` is then callable at once (completed == true) and `_clear` returns the bond to the challenger, so a panel \"yes\" that should have paid the bond to the beneficiary instead refunds the challenger, and a panel \"no\" that should have delisted leaves the project listed. No funds are lost to a third party and no state is corrupted; the contract header acknowledges that the writer's withholding already has the same power. Measured margins are comfortable: the four cold callback paths cost 97k-127k gas against the real mainnet IMD under the 200k mainnet stipend and the live Sepolia stipend is 1,000,000. Recorded as information so the adapter and the panel know the liveness assumption and its exact consequence.","line":329,"path":"src/ProjectRegistry.sol","reproduction":"State: project listed; challenger C opens a challenge at time T (bond 5 IMD held by the registry). The writer delivers the panel's signed \"no\" at T + 1 day + 1 s: onOracleResult reverts TooLate, the Intake emits Completed(delivered=false). Anyone calls expire(project): AskCleared(..., Challenge, 0, \"expired\"), 5 IMD back to C, isListed(project) still true. Expected by the panel's verdict: project delisted from that block, bond to C; actual: listing unchanged, verdict discarded, 0.5 IMD fee spent. Same with a \"yes\": expected bond to the beneficiary, actual bond back to C. Reproduced on the mock Intake (deliver after warp of 1 days + 1, then expire): challenger balance 1000e18 - 0.5e18, project still listed.","severity":"info","snippet":"        if (block.timestamp > uint256(p.askedAt) + PENDING_EXPIRY) revert TooLate();","title":"An answer the Intake could not deliver is lost with the fee, and a challenge bond then goes back to the challenger whatever the panel decided"},{"citation":"resolved","description":"`expire` has two triggers: a day has passed, or the Intake already completed the request (callback reverted or ran out of gas, or a failure completion with empty args). Both emit AskCleared with status 0 and reason \"expired\". The site's history and any indexer therefore show a question cleared seconds after the Intake tried to deliver as if it had timed out, hiding that a signed verdict was discarded (see the previous note). Cosmetic; the AskCleared doc comment says status 0 means cleared by expire, which is true, but the reason could carry \"completed\" for the second trigger.","line":400,"path":"src/ProjectRegistry.sol","reproduction":"State: project listed, challenge open with intake id X. The Intake calls complete(X, 0, ...) and the callback is starved (mock: deliver(X, attestation, sig, 30_000) returns false). Immediately, with block.timestamp == askedAt, anyone calls expire(project): emits AskCleared(project, X, Challenge, 0, \"expired\"). Expected: an event that says the Intake completed the request without delivering; actual: the same \"expired\" reason as a 24-hour timeout. Verified with a scratch test using vm.expectEmit on the exact event.","severity":"info","snippet":"        _clear(project, p, intakeId, 0, \"expired\");","title":"expire logs status 0 / \"expired\" for a lost callback as well as for a day-old question, so the two cases are indistinguishable on chain"},{"citation":"resolved","description":"Read in full: src/ProjectRegistry.sol, src/oracle/OracleAttestation.sol, src/Stacker.sol (not deployed in this run), test/mocks/*, test/trial/SelfCredit.sol, the deployment, callback-gas, conformance, adversarial, regression and fork tests, launch.json, docs/panel-rules-v2.md, the rehearsal body and docs/history.md sections 16-20. Reached live: Intake v2 0xa43e...de82 on Ethereum (local RPC) and on Sepolia (public RPC): same selectors for priceOf, requestWithFailure, request and requests, `requests` returns (payer, callbackTarget, callbackSelector, completed) as the registry's IIntake declares, priceOf(ACTION, 0x44a1...f89a) = 0.5e18 on Sepolia, callbackGas() = 1,000,000 on Sepolia, writer set; the verified Intake source from Sourcify for chain 1 and Sepolia is identical and its complete() marks completed before one fixed-stipend call. Sepolia test IMD 0x44a1...f89a: plain mintable ERC20, no pause, blocklist or hook selectors. Live Stacker 0x0457...314d: IMD() and SIMD() are the launch #1129 pair. Sepolia block gas limit about 200M. All 158 tests pass: 150 offline and the 8 fork tests against live Sepolia and mainnet (applyListing on the real Intake emits Requested with chainId 1 and consumer.verifyingContract = registry, and FailureHookSet 0xa7980e31). A scratch fork test measured the cold callback on chain 1 with the real mainnet IMD: listing 97,018, delist 107,651, defended 126,667 gas, all under 200k. Manifest: kind evm_contracts, one contract ProjectRegistry, seven string arguments in constructor order matching the brief (Intake v2, oracle test IMD, live Stacker, signer 0x5598...2982, 1, 5e18, 3600), notes 1,172 characters, no extra keys; runtime 22,019 bytes, no DELEGATECALL/CALLCODE/SELFDESTRUCT, constructor makes no external call and deploys on an empty chain. Each of the 8 version-2 rules is 173-472 characters (max feeGuard 472, trading 446 with the address), under the 512 limit; the body shape matches the rehearsal that reached a signed yes, and a signed no was already delivered live to the test run 2 registry with chainId 1 and panel 15/11. Checked and found sound: callback access (Intake only, own open request, one consumption per oracle UUID, signature in this contract's domain, issuedAt/expiry windows, panel 15/11/agreed), third-party paid questions naming the registry, bond accounting (registry balance equals open bonds; fee approved exactly and pulled by the Intake), reentrancy (shared guard on ask, callback, failure and expire; OZ ERC20 has no hooks), beneficiary handoff pinning and the legacy challenge front-run, cooldown not restarted by a defence, overflow bounds (cooldown <= 365 days), text validation keeping the JSON body valid, and the EIP-712 vector. Not reached: the oracle plane's wording screen and panel behaviour (off chain), and Sepolia Etherscan. No critical, high or medium defect was found, so no proof test is attached; test/scratch was used only for measurements and removed.","line":53,"path":"src/ProjectRegistry.sol","reproduction":null,"severity":"info","snippet":"contract ProjectRegistry is OracleAttestationConsumer, ReentrancyGuard {","title":"Coverage: what was read, what was reached live, and what was checked against the manifest"}],"hash":"3f06344a98081f48d903c0096c5c30f4259c3a326e3ba7c2e7d644f8b234d50f","nodeId":"2f963d41-90f2-4e79-a215-e8e8e45e435f","outcome":"completed","summary":"The review is complete. The findings file is written and every anchored line and snippet matches the tree.\n\n**Outcome: no critical, high or medium defect found.** The registry as it arrived is sound for this launch. I recorded two low findings and three informational notes in `.imd-findings.json`.\n\n**What I checked**\n\n- Read in full: both source contracts, the Stacker (not deployed here), the mocks and trial contract, the manifest, the panel rules and rehearsal body, the history, and the whole test suite.\n- Reached live: Intake v2 on both Ethereum and Sepolia (selectors, `requests` layout, price, callback gas of 1,000,000, verified source from Sourcify identical on both chains), the oracle test IMD (plain mintable ERC20, no pause or blocklist), and the live Stacker's IMD and SIMD pair.\n- Ran all 158 tests: 150 offline and the 8 fork tests against live Sepolia and mainnet. All pass.\n- Measured the four cold callback paths against the real mainnet IMD on a chain 1 fork, all under the 200k mainnet stipend.\n- Verified the manifest shape, argument order and values against the brief, the runtime size, the forbidden-opcode scan, and that every version 2 rule stays under 512 characters.\n- Not reachable: the oracle plane's wording screen and panel behaviour, and Sepolia Etherscan.\n\n**Findings**\n\n- **Low:** the oracle signer, Intake and action id have no rotation path. A retired action fails before payment, but a signer rotation keeps taking the 0.5 IMD fee for answers that can never verify. This is the agreed no-owner design, so it is documented as a trust assumption rather than a request to add an owner.\n- **Low:** a beneficiary can front-run any hostile challenge with a fee-only self-challenge, so the challenger's reason never reaches the panel. The challenger pays nothing and the panel still judges all rules, which bounds the impact.\n- **Info:** an answer the Intake fails to deliver is lost with the fee, and a challenge bond then returns to the challenger regardless of the verdict. The code header already acknowledges this.\n- **Info:** `expire` logs the same \"expired\" reason for a lost callback and a day-old question.\n- **Info:** the coverage statement listing what was read, reached and checked.\n\nNo proof tests were attached since nothing reached high or critical. The scratch directory was used only for measurements and reproductions and has been removed, leaving the tree unchanged apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":1986580,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":59126,"runtime":"claude","turns":43,"wallClockMs":872850}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f96a0c89c039c22a","findings":[{"citation":"resolved","description":"The brief requires an answer signed for this contract and issued after the ask. The check subtracts ISSUED_AT_TOLERANCE (5 minutes, meant for clock skew of future timestamps) on the lower bound too, so an attestation issued up to 300 s before askedAt passes. A valid signed attestation for this registry that predates the question (for example, from a third party's question naming this registry as consumer, or an answer to an earlier ask on the same project that was cleared by onOracleFailure/expire and never consumed) can be paired by the Intake writer with the new intakeId. The writer is trusted, so impact is limited to a broken boundary guarantee.","line":332,"path":"src/ProjectRegistry.sol","reproduction":"applyListing at block.timestamp=1_000_000 (askedAt=1_000_000). Intake calls onOracleResult(intakeId, a, sig) with a.issuedAt=999_750, a.expiresAt=1_086_400, valid signature by the oracle signer, panel 15/11/11, answer true. Expected: revert AnswerFromBeforeAsk(999_750). Actual: accepted, project listed. Fix: `if (a.issuedAt < p.askedAt) revert` (keep tolerance only for the future bound in _verifyAttestation).","severity":"low","snippet":"        if (uint256(a.issuedAt) + ISSUED_AT_TOLERANCE < p.askedAt) {","title":"Answer issued up to 5 minutes before the ask is accepted, contrary to 'issued after the ask'"}],"hash":"402f42f5e3abf0396e179c426bb70680f9a21e2a343f092b0c083921be4c7c17","nodeId":"5f1189cf-df8e-4386-a3cf-d2a2c214e984","outcome":"completed","summary":"I found one low-severity defect in the math, and nothing critical or high. The findings are in `.imd-findings.json`, which also has a coverage row for each of the 8 entry points: 7 hold and 1 has the finding. I didn't run any tests; with no critical or high finding, no proof file was needed.\n\n**Finding 1 (low): `src/ProjectRegistry.sol:332`, in `onOracleResult`.** The brief says an answer must be issued after the question is asked. The check subtracts a 5-minute allowance, `ISSUED_AT_TOLERANCE`, from the lower limit as well. That allowance is only meant for oracle timestamps a little ahead of the chain's clock, so an answer signed up to 300 seconds *before* the ask still passes.\n- **Failing input:** a question asked at timestamp 1,000,000, answered with a correctly signed \"yes\" (panel 15, 11 agreeing) whose `issuedAt` is 999,750. It should be rejected with `AnswerFromBeforeAsk`; instead the project is listed.\n- **Impact:** small, because only the Intake's writer, which is already trusted, can deliver an answer against a given request. What breaks is the stated guarantee, not a path for anyone to take funds.\n- **Fix:** reject when `a.issuedAt < p.askedAt`, and keep the 5-minute allowance only for future timestamps (the check in `_verifyAttestation`).\n\n**What I checked and found holding:**\n- **Rate and text bounds:** rate 25–100 inclusive, name 1–48 bytes, URL 12–200 bytes, reason 1–280 bytes.\n- **Fee and bond:** the oracle fee plus bond is pulled in full, and exactly the fee is approved to the Intake. Each bond is paid out once: to the beneficiary on \"yes\", or back to the challenger on \"no\", on failure or on expiry.\n- **Time limits:** \"too late to answer\" (more than one day after the ask) and `expire` (allowed after that same day) line up with no gap. The cooldown can't overflow because it is capped at 365 days.\n- **Panel checks:** panel of at least 15 seats, required agreement of at least 11, and at least 11 actually agreeing.\n- **`Stacker.credit`:** a zero amount returns early, a deposit that mints zero shares reverts, and the totals use checked arithmetic. It isn't redeployed in this run.\n\n`launch.json` matches the brief: one contract, the seven constructor arguments in order, a 5e18 bond and a 3600-second cooldown.","treeHash":null,"usage":{"cachedInputTokens":240678,"inputTokens":10,"model":"claude-opus-5-5","outputTokens":3699,"runtime":"claude","turns":6,"wallClockMs":39819}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ea62f3bebece9304","findings":[],"hash":"44db5a2ae890513dbc8b74e7cbab2240c3a2f1647d2c28d3260700e4f6478707","nodeId":"40ac2d1c-d644-465d-8a19-bfae24a96780","outcome":"failed","summary":"the task produced no changes; the agent's last message was: I left `launch.json` unchanged: the copy already in the tree, from earlier accepted work, matches the brief exactly, so this run produced no new edits.\n\n**What it lists:** one contract, `ProjectRegistry`. Its arguments, in constructor order, are:\n1. Intake v2 `0xa43e…de82`\n2. Sepolia test IMD `0x44a1…f89a`\n3. the live Stacker from launch #1294 `0x0457…314d`\n4. oracle signer `0x5598…2982`\n5. question chain id `1`\n6. challenge bond `5000000000000000000` (5 test IMD)\n7. cooldown `3600`\n\nThere is no Stacker, TestIMD or TestSIMD in it, and no owner argument. That fits the contract: it has no owner and its constructor makes no external call. The file has exactly the keys `kind`, `contracts` and `notes`, and the notes are 1,172 characters.\n\n**Checks:**\n- `forge build` compiles cleanly.\n- `forge test`: 150 passed, 0 failed, 8 skipped (158 total). The 8 skipped are the fork tests, because no RPC URLs were set. `test/Deployment.t.sol`, which checks this manifest, passed.\n- I couldn't run the provided `Contracts.protected.t.sol` check locally. It stops in setup because it needs factory settings (`IMD_PROJECT_FACTORY`, chain id and per-contract code, salt and address) that the verification step supplies.\n\nThe README line (\"Sepolia test run 3\" in the Deployments table) still has to be added once the registry is live. It is outside what this task may change.","treeHash":null,"usage":{"cachedInputTokens":145758,"inputTokens":10,"model":"claude-opus-5-5","outputTokens":1274,"runtime":"claude","turns":5,"wallClockMs":57494}},{"artifacts":[],"attempt":1,"bundleHash":"7b009776b327266e83e88815b724e895637501a9163a461c1df8fc9a7e318958","device":"6ed09c2eb1ff6aec","findings":[],"hash":"5e92eb46c042b88d34acdf2efb3cc8caa1a81cca32d7edb824eb607d491c354e","nodeId":"ebab8f2d-84ba-415c-96dd-b128bd0af7b2","outcome":"completed","summary":"The registry was already ready to launch as the brief describes, so I changed no code. The only file I added is `ADAPTATION.md`, which records why nothing changed and what I concluded about each audit finding.\n\n**Checks:** `forge build` passes. `forge test` ran 158 tests: 150 passed and the 8 fork tests were skipped because no RPC URLs were set, so they were not run against live Sepolia.\n\n**Why no change was needed:**\n- `ProjectRegistry` has no owner and a constructor that takes seven fixed arguments and calls no other contract.\n- It contains none of the forbidden capabilities: no DELEGATECALL, CALLCODE, SELFDESTRUCT, proxy, pause or minting.\n- The oracle library's functions are internal, so the contract deploys as built.\n- The existing `launch.json` already lists the agreed arguments, and `test/Deployment.t.sol` checks them. I left `launch.json` untouched because that file belongs to the manifest step.\n- The README's \"Sepolia test run 3\" row isn't added yet because the registry has no address until it is live.\n\n**Audit findings:** I fixed none of them, because the brief says the registry's code stays as it is.\n- **Oracle signer can't be rotated:** accurate, but it follows from the no-owner design the brief requires. If the signer changes, the registry has to be redeployed.\n- **Beneficiary can block a hostile challenge with a cheap self-challenge:** it matches the code. A challenger loses no funds and the panel still judges all 8 rules, but a fix would change the registry's behaviour. It's written up so this live run can watch for it.\n- **The three information items** (a lost answer refunds the challenge bond, `expire` logs \"expired\" for both triggers, the coverage note) need no action.\n\n**Not committed:** `git commit` failed because no git author identity is set on this machine, so `ADAPTATION.md` is in the working tree but not in a commit.","treeHash":"2e30844b5e128062d9e99f73d878435b854f327f","usage":{"cachedInputTokens":195068,"inputTokens":10,"model":"claude-opus-5-5","outputTokens":2229,"runtime":"claude","turns":5,"wallClockMs":90766}},{"artifacts":[],"attempt":2,"bundleHash":"ce2fa6bed666b2929331c3beca0644ec99be247df27a2d49de218a0ba969fa2f","device":"f96a0c89c039c22a","findings":[],"hash":"69471015229afe27800da80809f1cb8b0e0048a283a3f90bc701eb91c5aa7e3b","nodeId":"40ac2d1c-d644-465d-8a19-bfae24a96780","outcome":"completed","summary":"I updated the notes in `launch.json`. The contract entry was already correct, so I didn't touch it.\n\n**What's in the manifest:** one contract, `ProjectRegistry`, with these arguments in constructor order:\n1. Intake v2 `0xa43e…de82`\n2. Sepolia test IMD `0x44a1…f89a`\n3. the live Stacker from launch #1294 `0x0457…314d`\n4. oracle signer `0x5598…2982`\n5. question chain id `1`\n6. challenge bond `5000000000000000000` (5 test IMD)\n7. cooldown `3600`\n\nIt has no owner argument, because the contract has no owner. No Stacker, TestIMD or TestSIMD is deployed.\n\n**What changed in the notes:** they now also cover:\n- what a yes or no answer does (list or keep, reject or delist, and where the bond goes);\n- that an oracle failure, or expiry after a day, only clears the question and returns any bond;\n- that the questions name Sepolia in their text;\n- that the test doubles in `test/trial`, as well as `test/mocks`, are not deployed.\n\nThe notes are still under the 4,000-character limit.\n\n**Checks:** `forge test`: 150 passed, 0 failed, 8 skipped (158 total), including `test/Deployment.t.sol`, which checks this manifest. The 8 skipped are the fork tests, which need the RPC URLs set. I didn't run `forge build` on its own; the test run compiles the project.\n\nThe README entry (\"Sepolia test run 3\" in the Deployments table) still needs adding once the registry is live. This task isn't allowed to change that file.","treeHash":"dbade4dbf694b025ea9f49d7f8108c15222c4b8d","usage":{"cachedInputTokens":83818,"inputTokens":6,"model":"claude-opus-5-5","outputTokens":1087,"runtime":"claude","turns":3,"wallClockMs":75017}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"03845cacb54c3a73","findings":[{"citation":"resolved","description":"Merged from audit_flow and audit_permissions (same root cause). challengeForBeneficiary reverts BeneficiaryChanged, before pulling the fee or the bond, whenever the stored beneficiary differs from the one the challenger named (src/ProjectRegistry.sol:276-278). setBeneficiary (lines 430-439) may be called by the current beneficiary any number of times while no question is open, costs only gas, has no rate limit or delay, and its first move to a different wallet sets beneficiaryPinRequired so the compat entry point challenge() reverts BeneficiaryPinRequired for good (line 253). A beneficiary that watches the public mempool therefore wins every race: it sees challengeForBeneficiary(project, reason, X) pending, lands setBeneficiary(project, Y) first, the challenge reverts, the challenger retries naming Y and the beneficiary moves back to X, and so on. No question is ever filed and nothing is paid, so the brief's guarantee that a listed project can be challenged after its cooldown does not hold against an attentive beneficiary; a project in breach keeps earning points indefinitely, and setBeneficiary is also the only way a project redirects points to a wallet the panel never approved. The front-run check itself is deliberate (test_pinnedChallengeRefusesFrontrunBeforeAnyPayment) and protects the challenger's fee; the defect is that the handoff it keys on is unbounded. Impact: no funds at risk, broken liveness of the challenge/delisting mechanism (medium). A private relay sidesteps one race but does not fix the contract. Minimal fixes that keep the pin design: rate-limit handoffs (at most one per challengeCooldown, or none within PENDING_EXPIRY of the previous one), or make a handoff two-step with a delay during which the old beneficiary still counts for challenges.","line":276,"path":"src/ProjectRegistry.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {ProjectRegistry, IIntake} from \"src/ProjectRegistry.sol\";\nimport {OracleAttestation} from \"src/oracle/OracleAttestation.sol\";\n\n/// @dev Minimal stand-ins (no other test files are imported).\ncontract ProofIMD is ERC20 {\n    constructor() ERC20(\"test IMD\", \"IMD\") {}\n\n    function mint(address to, uint256 amount) external {\n        _mint(to, amount);\n    }\n}\n\ncontract ProofIntake is IIntake {\n    bytes32 public constant ACTION = \"oracle.request@oracle-1\";\n    uint256 public count;\n    mapping(bytes32 => bool) public completed;\n\n    function priceOf(bytes32 action, address) external pure returns (uint256) {\n        return action == ACTION ? 0.5e18 : 0;\n    }\n\n    function requestWithFailure(bytes32, bytes calldata, Callback calldata, bytes4, address asset, uint256 amount)\n        external\n        returns (bytes32 id)\n    {\n        IERC20(asset).transferFrom(msg.sender, address(0x7EA5), amount);\n        id = keccak256(abi.encode(address(this), ++count));\n    }\n\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) {\n        return (address(0), address(0), bytes4(0), completed[id]);\n    }\n}\n\ncontract ProofProject {}\n\n/// @title A listed project's beneficiary can refuse every challenge for free.\n/// @notice `challengeForBeneficiary` reverts when the beneficiary differs from the one the challenger\n/// saw, and after the first handoff `challenge` reverts with `BeneficiaryPinRequired`. A beneficiary\n/// that front-runs each challenge with `setBeneficiary` to its other wallet (and back next time)\n/// therefore blocks every challenge at the cost of gas only, so a violating project can never be\n/// delisted. This test fails on the current code: neither round opens a challenge. It passes once a\n/// handoff can no longer invalidate a pending challenge (a rate-limited or delayed handoff, or a\n/// challenge that proceeds against the beneficiary in force when it was sent).\ncontract BeneficiaryToggleLockoutTest is Test {\n    uint256 internal constant KEY = 0xA11CE;\n\n    ProofIMD internal imd;\n    ProofIntake internal intake;\n    ProjectRegistry internal reg;\n    address internal project;\n    address internal w1 = makeAddr(\"beneficiary-wallet-1\");\n    address internal w2 = makeAddr(\"beneficiary-wallet-2\");\n    address internal challenger = makeAddr(\"challenger\");\n\n    function setUp() public {\n        vm.chainId(11_155_111);\n        vm.warp(1_760_000_000);\n        vm.roll(11_896_540);\n        imd = new ProofIMD();\n        intake = new ProofIntake();\n        reg = new ProjectRegistry(\n            address(intake), address(imd), makeAddr(\"stacker\"), vm.addr(KEY), 1, 5e18, 1 hours\n        );\n        project = address(new ProofProject());\n\n        // List the project with w1 as beneficiary.\n        address applicant = makeAddr(\"applicant\");\n        imd.mint(applicant, 1e18);\n        vm.startPrank(applicant);\n        imd.approve(address(reg), type(uint256).max);\n        bytes32 id = reg.applyListing(project, \"Proj\", \"https://example.org/x\", 50, w1);\n        vm.stopPrank();\n\n        OracleAttestation.Attestation memory a;\n        a.requestId = bytes32(uint256(1) << 128);\n        a.chainId = 1;\n        a.answerType = OracleAttestation.ANSWER_BOOL;\n        a.answer = abi.encode(true);\n        a.panelSize = 15;\n        a.quorum = 11;\n        a.agreed = 12;\n        a.issuedAt = uint64(block.timestamp);\n        a.expiresAt = uint64(block.timestamp + 1 days);\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(KEY, reg.attestationDigest(a));\n        vm.prank(address(intake));\n        reg.onOracleResult(id, a, abi.encodePacked(r, s, v));\n        assertTrue(reg.isListed(project));\n\n        // Cooldown over; the challenger holds the fee and the bond.\n        vm.warp(block.timestamp + 1 hours);\n        imd.mint(challenger, 100e18);\n        vm.prank(challenger);\n        imd.approve(address(reg), type(uint256).max);\n    }\n\n    function test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() public {\n        bool opened;\n\n        // Round 1: the challenger saw w1; w1 front-runs with a handoff to w2.\n        address seen = reg.projectOf(project).beneficiary;\n        assertEq(seen, w1);\n        vm.prank(w1);\n        try reg.setBeneficiary(project, w2) {} catch {}\n        opened = _tryChallenge(seen);\n\n        // Round 2: the challenger saw whatever is current now; that wallet hands back to the other.\n        if (!opened) {\n            seen = reg.projectOf(project).beneficiary;\n            address other = seen == w1 ? w2 : w1;\n            vm.prank(seen);\n            try reg.setBeneficiary(project, other) {} catch {}\n            opened = _tryChallenge(seen);\n        }\n\n        // Round 3, same pattern, to show it never ends.\n        if (!opened) {\n            seen = reg.projectOf(project).beneficiary;\n            address other = seen == w1 ? w2 : w1;\n            vm.prank(seen);\n            try reg.setBeneficiary(project, other) {} catch {}\n            opened = _tryChallenge(seen);\n        }\n\n        assertTrue(\n            opened,\n            \"a watching beneficiary blocks every challenge with a gas-only setBeneficiary front-run\"\n        );\n    }\n\n    /// @dev Tries both challenge entry points the way a challenger that saw `seen` would.\n    function _tryChallenge(address seen) internal returns (bool) {\n        vm.prank(challenger);\n        try reg.challengeForBeneficiary(project, \"rate guard removed in v2\", seen) returns (bytes32) {\n            return true;\n        } catch {}\n        vm.prank(challenger);\n        try reg.challenge(project, \"rate guard removed in v2\") returns (bytes32) {\n            return true;\n        } catch {}\n        return false;\n    }\n}","reproduction":"State: project P listed with beneficiary W1 (applyListing then a signed yes), block.timestamp past challengeOpenAt, no question open, challenger C holds 5.5 test IMD approved to the registry. Round i: (1) C reads projectOf(P).beneficiary == W_i and sends challengeForBeneficiary(P, 'rate guard removed in v2', W_i); (2) W_i's setBeneficiary(P, W_other) is included first: it passes (listed, no ask open, msg.sender is the beneficiary) and sets beneficiaryPinRequired[P] = true; (3) C's transaction reverts BeneficiaryChanged(W_i, W_other) at line 277, and C's fallback challenge(P, reason) reverts BeneficiaryPinRequired at line 253. Repeat with the wallets swapped. Expected: after the cooldown a challenger can always get one question filed by paying fee and bond. Actual: after 3 rounds the mock Intake holds exactly one request (the application), C's balance is unchanged, P is still listed, and no challenge question was ever created. Reproduced by running the attached proof (test/scratch/Proof_f42dd7d1f078.t.sol): it fails on this tree with 'a watching beneficiary blocks every challenge with a gas-only setBeneficiary front-run'.","severity":"medium","snippet":"        if (p.beneficiary != expectedBeneficiary) {\n            revert BeneficiaryChanged(expectedBeneficiary, p.beneficiary);\n        }","title":"A listed project's beneficiary can block every challenge for free by front-running each one with a beneficiary handoff"},{"citation":"resolved","description":"From audit_economics; reproduced. One question per project is open at a time (AskOpen, line 274) and a settled challenge starts no cooldown (challengeOpenAt is written only on listing, line 354). A challenge by the beneficiary itself risks no bond: on yes the bond goes to p.beneficiary (line 362, itself), on no to asker (line 367, itself), on failure or expiry to asker (line 414, itself); only the 0.5 IMD oracle fee is spent. So the beneficiary can front-run each hostile challengeForBeneficiary with its own challenge carrying a bland reason; the hostile call reverts AskOpen before paying and its [REASON] text, the only channel by which a challenger points the panel at a specific violation, is never sent. Different mechanism from finding 1 (AskOpen rather than BeneficiaryChanged) and not free of risk: every self-challenge still puts the project in front of a 15-seat panel judging all eight rules, and a signed no delists it, which bounds the damage; hence low. The existing test test_selfChallengeOccupiesSlotOnlyUntilItSettles records that the slot can be bought but not that the buyer bears no bond risk or can repeat it. Possible fixes are design decisions for the author: a short per-project cooldown after any cleared or defended challenge, or refusing a challenge whose msg.sender equals p.beneficiary (sybil wallets then still cost only the fee, since the bond returns to the asker on no).","line":362,"path":"src/ProjectRegistry.sol","reproduction":"State: project P listed, beneficiary B, cooldown passed, B holds >= 16.5 test IMD approved. Loop 3 times: (1) B calls challengeForBeneficiary(P, 'routine check', B): 5.5 IMD pulled, Ask.Challenge open. (2) Challenger C calls challengeForBeneficiary(P, 'credits outside trades', B): reverts AskOpen (line 274); C paid nothing and no Intake body contains C's reason. (3) Intake delivers a signed yes: line 362 pays 5 IMD to p.beneficiary = B; P stays listed; challengeOpenAt unchanged. Expected per design ('anyone can challenge a listed project with a bond' after the cooldown): C's reason reaches the panel or B's blocking costs B a bond. Actual, from test/scratch/Repro.t.sol test_selfChallengePreemptsHostileAtFeeOnly: after 3 rounds B's balance fell by exactly 1.5e18 (three fees, every bond came back), C's balance unchanged, intake.count() == 4 (one application plus three self-challenges), P listed.","severity":"low","snippet":"            if (challengeBond != 0) oracleAsset.safeTransfer(p.beneficiary, challengeBond);","title":"Beneficiary can pre-empt every hostile challenge with a self-challenge that risks only the 0.5 IMD fee, so the challenger's reason never reaches the panel"},{"citation":"resolved","description":"Merged from audit_math (low) and audit_permissions (info); reproduced. The brief and docs/design.md ('It was issued after the question was asked, so an older answer can't be reused') require issuedAt >= askedAt. The check subtracts ISSUED_AT_TOLERANCE (5 minutes, defined in OracleAttestation.sol:139 for future clock skew) on the lower bound too, so an attestation issued up to 300 s before p.askedAt passes. No unprivileged path exploits it: the attestation must still be signed by the oracle signer for this contract, be a bool under chain 1 from a 15/11 panel, be delivered by the Intake under this project's open intake id, and have an unconsumed oracle requestId. It only weakens the stated defence against the trusted writer mispairing an answer to a question cleared (onOracleFailure/expire, never consumed) within the last five minutes with a new ask on the same project. Panel answers take minutes, so an honest answer is never stamped before the block that asked; the tolerance is only needed on the future side. Fix: `if (a.issuedAt < p.askedAt) revert AnswerFromBeforeAsk(a.issuedAt);`.","line":332,"path":"src/ProjectRegistry.sol","reproduction":"applyListing for P at block.timestamp T (p.askedAt = T). The Intake calls onOracleResult(intakeId, a, sig) with a.issuedAt = T - 299, a.expiresAt = T + 1 day, chainId 1, panelSize 15, quorum 11, agreed 13, answerType bool, answer true, fresh requestId, signed by the oracle signer for this contract. Expected per the brief: revert AnswerFromBeforeAsk(T - 299). Actual: (T - 299) + 300 < T is false, the answer settles and P is listed (test/scratch/Repro.t.sol test_issuedAt299BeforeAskAccepted passes with isListed(P) == true). With a.issuedAt = T - 301 the call reverts AnswerFromBeforeAsk as stated (test_issuedAt301BeforeAskRejected).","severity":"low","snippet":"        if (uint256(a.issuedAt) + ISSUED_AT_TOLERANCE < p.askedAt) {\n            revert AnswerFromBeforeAsk(a.issuedAt);\n        }","title":"An answer issued up to five minutes before the ask is accepted, although the brief says only answers issued after the ask are"},{"citation":"resolved","description":"From audit_economics; reproduced, kept as a documented limit rather than a code defect. docs/design.md says the mainnet bond 'makes challenging a project just to annoy it costly, since a defended challenge pays the bond to the project'. That holds only when at least 11 of 15 seats agree yes. On status 2 (disagreed) the Intake calls onOracleFailure and _clear returns the bond to the asker (lines 413-414); nothing goes to the project, and since challengeOpenAt is only written on listing the same griefer can refile in the next block. While each question is open setBeneficiary reverts AskOpen (line 433). The refund on failure is deliberate and documented in the contract header (an honest challenger should not lose a bond to a panel failure), and the live rehearsals show splits are common (8/13, 9/13, then exactly 11/13). Expected griefing cost per round is therefore 0.5 IMD + P(decisive yes) x bond, and zero on Sepolia where test IMD is free. Harm is limited to the beneficiary being unable to hand off during open questions and the project paying attention; no funds are lost. The author may want a short post-clear cooldown or a per-asker rate limit if the deterrent matters on mainnet.","line":413,"path":"src/ProjectRegistry.sol","reproduction":"State: project P listed with beneficiary B, cooldown passed; griefer G holds 5.5 IMD per round. Loop 3 times: (1) G calls challengeForBeneficiary(P, 'spam', B): 5.5 IMD pulled. (2) B calls setBeneficiary(P, X): reverts AskOpen. (3) Intake reports status 2 'disagreed' through onOracleFailure under 200k gas: _clear pays 5 IMD back to G, emits AskCleared; B receives nothing. (4) G repeats in the next block without ChallengeTooSoon. Observed in test/scratch/Repro.t.sol test_splitPanelRefundsAndRefiles: G's balance fell by exactly 1.5e18 (three fees); B's balance 0. Expected under the design note: a griefing challenge costs the griefer the bond.","severity":"info","snippet":"        if (ask == Ask.Challenge && challengeBond != 0) {\n            oracleAsset.safeTransfer(asker, challengeBond);\n        }","title":"On a split panel the challenger's bond is refunded and the challenge can be refiled at once, so griefing a listed project costs only the fee"}],"hash":"6c34befcce8425d31271d1ad87af7a1faa814030cdc6b0a807c43e3bc9e56390","nodeId":"01433dc4-d14d-44ee-b5d6-3bf4f1cc7497","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds 4 findings and 11 coverage rows, all snippets verified against the tree.\n\n**What I checked**\n\n- Ran the full suite: 154 tests pass, plus the specialist's proof which fails for the stated reason. Against a public Sepolia RPC, all 5 fork tests pass, including the registry paying the real Intake v2.\n- Read live Sepolia state: Intake price is 0.5 test IMD, the live Stacker's IMD and SIMD match TestIMD and TestSIMD, and both callback selectors match.\n- Verified deployability: creation code 23,640 bytes, runtime 22,019 bytes, no forbidden opcodes, constructor makes no external call, manifest has 7 static args in declaration order with the agreed Sepolia values.\n- Compared the generated oracle body with the rehearsed version-2 body: same 12 keys, 8 rules each under 512 characters.\n\n**Findings kept**\n\n1. **Medium, merged from audit_flow and audit_permissions.** A beneficiary can block every challenge for free by front-running each one with `setBeneficiary`, since handoffs are unbounded and both challenge paths revert after one. The specialist's proof fails on this tree and is attached.\n2. **Low, from audit_economics.** A beneficiary can pre-empt hostile challenges with a self-challenge that risks only the fee. I downgraded the framing: each self-challenge still puts the project before the panel, which bounds the harm.\n3. **Low, merged from audit_math and audit_permissions.** An answer issued up to 300 seconds before the ask is accepted, contrary to the stated guarantee. Only the trusted writer could use it.\n4. **Info, from audit_economics.** A split panel refunds the bond and allows an immediate refile. This is a documented design choice, recorded as a limit.\n\nNothing beyond the specialists' leads surfaced in my own pass: the one-day expiry boundary, replay of a cleared answer into a later ask, relisting after delisting, and the Stacker's credit path all behave as intended.","treeHash":null,"usage":{"cachedInputTokens":1010616,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":23773,"runtime":"claude","turns":26,"wallClockMs":384534}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"28e346843ec15530","findings":[{"citation":"resolved","description":"Trust gap (access x asymmetry). The only actor who may call setBeneficiary is the project's current beneficiary (line 434), and setBeneficiary costs gas only: no fee, no bond, no cooldown, no limit on how often it may be called while no question is open. Every challenge path, however, is invalidated by a handoff: challengeForBeneficiary reverts BeneficiaryChanged when p.beneficiary differs from the wallet the challenger saw (lines 276-278), and challenge(project, reason) reverts BeneficiaryPinRequired forever after the first handoff (line 253). So a beneficiary that watches the mempool can front-run each challenge transaction with setBeneficiary(project, otherWallet), then hand back on the next attempt, alternating between two wallets it controls, and no challenge can ever be opened against the project. The challenger pays reverted-transaction gas each time; the beneficiary pays one cheap SSTORE. The design relies on challenges as the only way to delist a project that breaks the rules (docs/design.md: 'a project that starts cheating can still be challenged within a week, and its points stop from the block it is delisted'), and setBeneficiary is also how a project redirects its points to an arbitrary wallet without any panel review until a challenge; together, a project can both cheat and hold a wallet the panel never approved, permanently. The revision that added the BeneficiaryChanged check closed the earlier bond-redirect finding but created this lockout; the repository's tests only assert that the front-run reverts (test/RegistryRevisionRegression.t.sol test_pinnedChallengeRefusesFrontrunBeforeAnyPayment), never that a challenge remains possible afterwards. Minimal fixes that keep the agreed design: rate-limit handoffs (at most one per challengeCooldown, or refuse a handoff within PENDING_EXPIRY of the previous one), or make a handoff take effect after a delay during which the old beneficiary is still the one a challenge names and the one a defended bond is paid to.","line":276,"path":"src/ProjectRegistry.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {ProjectRegistry, IIntake} from \"src/ProjectRegistry.sol\";\nimport {OracleAttestation} from \"src/oracle/OracleAttestation.sol\";\n\n/// @dev Minimal stand-ins (no other test files are imported).\ncontract ProofIMD is ERC20 {\n    constructor() ERC20(\"test IMD\", \"IMD\") {}\n\n    function mint(address to, uint256 amount) external {\n        _mint(to, amount);\n    }\n}\n\ncontract ProofIntake is IIntake {\n    bytes32 public constant ACTION = \"oracle.request@oracle-1\";\n    uint256 public count;\n    mapping(bytes32 => bool) public completed;\n\n    function priceOf(bytes32 action, address) external pure returns (uint256) {\n        return action == ACTION ? 0.5e18 : 0;\n    }\n\n    function requestWithFailure(bytes32, bytes calldata, Callback calldata, bytes4, address asset, uint256 amount)\n        external\n        returns (bytes32 id)\n    {\n        IERC20(asset).transferFrom(msg.sender, address(0x7EA5), amount);\n        id = keccak256(abi.encode(address(this), ++count));\n    }\n\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) {\n        return (address(0), address(0), bytes4(0), completed[id]);\n    }\n}\n\ncontract ProofProject {}\n\n/// @title A listed project's beneficiary can refuse every challenge for free.\n/// @notice `challengeForBeneficiary` reverts when the beneficiary differs from the one the challenger\n/// saw, and after the first handoff `challenge` reverts with `BeneficiaryPinRequired`. A beneficiary\n/// that front-runs each challenge with `setBeneficiary` to its other wallet (and back next time)\n/// therefore blocks every challenge at the cost of gas only, so a violating project can never be\n/// delisted. This test fails on the current code: neither round opens a challenge. It passes once a\n/// handoff can no longer invalidate a pending challenge (a rate-limited or delayed handoff, or a\n/// challenge that proceeds against the beneficiary in force when it was sent).\ncontract BeneficiaryToggleLockoutTest is Test {\n    uint256 internal constant KEY = 0xA11CE;\n\n    ProofIMD internal imd;\n    ProofIntake internal intake;\n    ProjectRegistry internal reg;\n    address internal project;\n    address internal w1 = makeAddr(\"beneficiary-wallet-1\");\n    address internal w2 = makeAddr(\"beneficiary-wallet-2\");\n    address internal challenger = makeAddr(\"challenger\");\n\n    function setUp() public {\n        vm.chainId(11_155_111);\n        vm.warp(1_760_000_000);\n        vm.roll(11_896_540);\n        imd = new ProofIMD();\n        intake = new ProofIntake();\n        reg = new ProjectRegistry(\n            address(intake), address(imd), makeAddr(\"stacker\"), vm.addr(KEY), 1, 5e18, 1 hours\n        );\n        project = address(new ProofProject());\n\n        // List the project with w1 as beneficiary.\n        address applicant = makeAddr(\"applicant\");\n        imd.mint(applicant, 1e18);\n        vm.startPrank(applicant);\n        imd.approve(address(reg), type(uint256).max);\n        bytes32 id = reg.applyListing(project, \"Proj\", \"https://example.org/x\", 50, w1);\n        vm.stopPrank();\n\n        OracleAttestation.Attestation memory a;\n        a.requestId = bytes32(uint256(1) << 128);\n        a.chainId = 1;\n        a.answerType = OracleAttestation.ANSWER_BOOL;\n        a.answer = abi.encode(true);\n        a.panelSize = 15;\n        a.quorum = 11;\n        a.agreed = 12;\n        a.issuedAt = uint64(block.timestamp);\n        a.expiresAt = uint64(block.timestamp + 1 days);\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(KEY, reg.attestationDigest(a));\n        vm.prank(address(intake));\n        reg.onOracleResult(id, a, abi.encodePacked(r, s, v));\n        assertTrue(reg.isListed(project));\n\n        // Cooldown over; the challenger holds the fee and the bond.\n        vm.warp(block.timestamp + 1 hours);\n        imd.mint(challenger, 100e18);\n        vm.prank(challenger);\n        imd.approve(address(reg), type(uint256).max);\n    }\n\n    function test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() public {\n        bool opened;\n\n        // Round 1: the challenger saw w1; w1 front-runs with a handoff to w2.\n        address seen = reg.projectOf(project).beneficiary;\n        assertEq(seen, w1);\n        vm.prank(w1);\n        try reg.setBeneficiary(project, w2) {} catch {}\n        opened = _tryChallenge(seen);\n\n        // Round 2: the challenger saw whatever is current now; that wallet hands back to the other.\n        if (!opened) {\n            seen = reg.projectOf(project).beneficiary;\n            address other = seen == w1 ? w2 : w1;\n            vm.prank(seen);\n            try reg.setBeneficiary(project, other) {} catch {}\n            opened = _tryChallenge(seen);\n        }\n\n        // Round 3, same pattern, to show it never ends.\n        if (!opened) {\n            seen = reg.projectOf(project).beneficiary;\n            address other = seen == w1 ? w2 : w1;\n            vm.prank(seen);\n            try reg.setBeneficiary(project, other) {} catch {}\n            opened = _tryChallenge(seen);\n        }\n\n        assertTrue(\n            opened,\n            \"a watching beneficiary blocks every challenge with a gas-only setBeneficiary front-run\"\n        );\n    }\n\n    /// @dev Tries both challenge entry points the way a challenger that saw `seen` would.\n    function _tryChallenge(address seen) internal returns (bool) {\n        vm.prank(challenger);\n        try reg.challengeForBeneficiary(project, \"rate guard removed in v2\", seen) returns (bytes32) {\n            return true;\n        } catch {}\n        vm.prank(challenger);\n        try reg.challenge(project, \"rate guard removed in v2\") returns (bytes32) {\n            return true;\n        } catch {}\n        return false;\n    }\n}","reproduction":"State: project P listed with beneficiary W1 (an application answered yes), cooldown elapsed, no question open, challenger C holds 5.5 test IMD approved to the registry. 1) C sees projectOf(P).beneficiary == W1 and sends challengeForBeneficiary(P, 'reason', W1). 2) W1, watching the mempool, sends setBeneficiary(P, W2) with higher priority; it succeeds (W1 is the beneficiary, P is listed, no ask is open) and sets beneficiaryPinRequired[P] = true. 3) C's transaction reverts BeneficiaryChanged(W1, W2); C's alternative challenge(P, 'reason') reverts BeneficiaryPinRequired. 4) C now reads W2 and sends challengeForBeneficiary(P, 'reason', W2); W2 front-runs with setBeneficiary(P, W1); C reverts again. Steps 3-4 repeat indefinitely. Expected: a listed project can always be challenged after its cooldown by paying the fee and the bond. Actual: the beneficiary alone decides whether any challenge is ever opened, so a project in breach is never delisted and keeps earning points. The proof test (test/scratch/BeneficiaryToggleLockout.t.sol) plays three rounds against local stand-ins and fails on the current code because no round opens a challenge.","severity":"medium","snippet":"        if (p.beneficiary != expectedBeneficiary) {\n            revert BeneficiaryChanged(expectedBeneficiary, p.beneficiary);\n        }","title":"A listed project's beneficiary can block every challenge for free by front-running each one with a beneficiary handoff"},{"citation":"resolved","description":"The brief and docs/design.md ('It was issued after the question was asked, so an older answer can't be reused') state that onOracleResult accepts only a signature issued after the ask. The check subtracts ISSUED_AT_TOLERANCE (5 minutes) first, so an attestation whose issuedAt lies up to 300 seconds before p.askedAt passes. No unprivileged path exploits this: the Intake pairs each answer with its own request id, the attestation must still be signed for this contract with a bool answer, chainId 1 and a 15/11 panel, and _consume refuses a request id used before. It only weakens the defence against a mispaired answer by the trusted writer (an answer to a cleared question re-presented under a question asked within five minutes of it). Recorded as a documented deviation from the stated guarantee, not as an exploitable defect; if the guarantee is meant literally, drop the tolerance on this side (the attester's clock running slow only delays an honest answer by at most the drift).","line":332,"path":"src/ProjectRegistry.sol","reproduction":"Project P: applyListing at block time T (p.askedAt = T). The Intake delivers under P's open intake id an attestation with issuedAt = T - 299, expiresAt > now, chainId 1, panelSize 15, quorum 11, agreed 11, answerType bool, a fresh requestId, signed by the oracle signer for this contract. Expected per the brief: revert AnswerFromBeforeAsk. Actual: the check (T - 299) + 300 < T is false, the answer settles the question and lists or rejects P. With issuedAt = T - 301 it reverts as stated.","severity":"info","snippet":"        if (uint256(a.issuedAt) + ISSUED_AT_TOLERANCE < p.askedAt) {\n            revert AnswerFromBeforeAsk(a.issuedAt);\n        }","title":"An answer issued up to five minutes before the ask is accepted, although the brief says only answers issued after the ask are"}],"hash":"6f9ba7674080a748fb48b70ecbf052506986f1b61353dadd8091254dc87b052f","nodeId":"969308d3-8aea-4d34-8cac-f72630ce9d21","outcome":"completed","summary":"The review is complete. The findings are in `.imd-findings.json` at the repository root, with a coverage row for every listed entry point. No tracked file was changed; the only additions are the findings file and the scratch proof.\n\n**What I found**\n\n- **Medium: a listed project's beneficiary can veto every challenge for free.** The revision that made `challengeForBeneficiary` revert when the beneficiary differs from the one the challenger saw, combined with the permanent `BeneficiaryPinRequired` block on the legacy `challenge` path, lets a beneficiary front-run each challenge with a gas-only `setBeneficiary` to its other wallet and hand back on the next attempt. No challenge can ever open, so a project in breach is never delisted and keeps earning points. The handoff itself gets no panel review until a challenge, which this makes unreachable. The proof test under `test/scratch/BeneficiaryToggleLockout.t.sol` plays three rounds against local stand-ins and fails on the current code. Minimal fixes that keep the design are a rate limit on handoffs or a delayed handoff during which the old beneficiary is still the one a challenge names and a defended bond pays.\n- **Info: answers issued up to five minutes before the ask are accepted**, while the brief and design doc say only answers issued after the ask are. No unprivileged path exploits it, since the Intake pairs answers and request ids are consumed once. Recorded as a stated-guarantee deviation only.\n\n**What holds in my area**\n\n- No owner exists anywhere, the signer setter is internal and unexposed, and there is no fallback or receive. Fixed signer and action id are a known limit in the design doc.\n- Both callbacks accept only the Intake and only this contract's own open request. The expire window is disjoint from the result window, and every close path moves exactly one bond to the party recorded at ask time.\n- The manifest matches the brief: one registry, seven static arguments wired to the live Stacker, notes under the length cap, and a constructor with no external call.\n- Application-slot spam by a third party is real but already listed as a known limit, so it is not reported as a defect.\n\n**Check status**\n\n- Full offline suite: 150 passed, 8 fork tests skipped without RPC settings.\n- Proof test: fails on the current tree as required.","treeHash":null,"usage":{"cachedInputTokens":1168440,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":39188,"runtime":"claude","turns":29,"wallClockMs":557069}},{"artifacts":[],"attempt":1,"bundleHash":"b873f519273d8f00fd9400a01ca5f26869efa6e6fbcdbd23cb222de6cc1c7246","device":"dedd4428da8fa41e","findings":[],"hash":"77f4fcfde5c71e9428b4abbb9c9048d1965114580eba05a52d627914c90c7202","nodeId":"65e978f4-3130-46df-8f99-a0a9723f82d1","outcome":"completed","summary":"The test suite already covered this registry thoroughly, so I added one small file, `test/RegistryCooldownBoundary.t.sol`, with 4 tests on the challenge cooldown. `forge test` passes: 154 tests pass and 8 Sepolia fork tests are skipped, since there is no RPC on this machine (162 in total, up from the brief's 158).\n\n**What was already there:** 158 tests (150 offline plus the 8 fork tests), and all of them passed before I changed anything. They include invariant tests over random call sequences for both the registry's money and the Stacker.\n\n**What the new tests check:**\n- A challenge one second before the cooldown ends is rejected with `ChallengeTooSoon`.\n- A challenge exactly when the cooldown ends goes through.\n- When a challenge fails and the project stays listed, the cooldown does not restart, so the next challenge can be filed straight away. This matches the brief.\n- The constructor rejects a cooldown one second over `MAX_CHALLENGE_COOLDOWN` (365 days) and accepts exactly the maximum.\n\n**Not done:**\n- **Commit:** the file is in the working tree but not committed, because git has no author name or email set on this machine.\n- **Fork tests:** the 8 fork tests against live Sepolia still need to be run with `ETH_RPC_URL` and `SEPOLIA_RPC_URL` set.\n\nI found no defects, so there is no `.imd-findings.json`.","treeHash":"04ddd44cc2628e4746c6cd450db93d0a0f118751","usage":{"cachedInputTokens":271754,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":2430,"runtime":"claude","turns":7,"wallClockMs":137329}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"99c6d0bcc495ad61","findings":[{"citation":"resolved","description":"challengeForBeneficiary reverts, before pulling the fee or the bond, whenever the stored beneficiary differs from the one the challenger named (src/ProjectRegistry.sol:276-278). setBeneficiary (src/ProjectRegistry.sol:430-439) may be called by the current beneficiary any number of times while no question is open, at no cost but gas, and the first move to a different wallet sets beneficiaryPinRequired so that the compat entry point challenge() reverts for good (src/ProjectRegistry.sol:253). Nothing bounds how often the beneficiary may move. A beneficiary that watches the public mempool therefore wins every race: it sees challengeForBeneficiary(project, reason, X) pending, lands setBeneficiary(project, Y) first, and the challenge reverts with BeneficiaryChanged(X, Y); the challenger retries naming Y and the beneficiary moves to Z; and so on. No question is ever filed, nothing is paid, and the project stays listed past its cooldown indefinitely, so the brief's guarantee that a listed project can be challenged after the cooldown (and the design note that a project that starts cheating can be delisted within a week) does not hold against an attentive beneficiary. The front-run check is deliberate (test_pinnedChallengeRefusesFrontrunBeforeAnyPayment) and protects the challenger's fee; the defect is that the same check can be triggered without limit. Conditions: a beneficiary that monitors the mempool, and a challenger using the public mempool (a private relay sidesteps the race for that one challenge but does not fix the contract). No funds are at risk; the harm is that the challenge mechanism, and with it delisting, is unavailable for that project. This is the code the mainnet registry will use, where the cooldown is 7 days and listing decides which credits earn points. Minimal fix that keeps the pin design: bound beneficiary handoffs, for example refuse setBeneficiary more than once per challengeCooldown (store a handoffAt and revert while block.timestamp < handoffAt + challengeCooldown), or make a handoff two-step with a delay during which the old beneficiary still counts for challenges, so a challenger can always get one question filed between moves.","line":276,"path":"src/ProjectRegistry.sol","reproduction":"State: a project listed with beneficiary B (any applyListing followed by a signed yes), block.timestamp past challengeOpenAt. Sequence, repeated for i = 1..n: (1) challenger reads projectOf(project).beneficiary == B_i and broadcasts challengeForBeneficiary(project, \"It credits outside trades.\", B_i); (2) B_i's transaction setBeneficiary(project, B_{i+1}) is included first (no question is open, so it passes); (3) the challenger's transaction executes: p.beneficiary == B_{i+1} != B_i, reverts BeneficiaryChanged(B_i, B_{i+1}) at src/ProjectRegistry.sol:277; (4) challenge(project, reason) also reverts BeneficiaryPinRequired at src/ProjectRegistry.sol:253 because step 2 set beneficiaryPinRequired[project] = true. Expected: after the cooldown a challenger can always file a challenge against a listed project. Actual: after n rounds the mock Intake still holds exactly one request (the application), the challenger's balance is unchanged, the project is still listed, and no panel question was ever asked. Verified with a Foundry test over 5 rounds (test/scratch/ChallengeDodge.t.sol, run with forge test --match-path test/scratch/ChallengeDodge.t.sol): intake.count() == 1, isListed(project) == true, challenger balance == 100e18 after all rounds.","severity":"medium","snippet":"        if (p.beneficiary != expectedBeneficiary) {\n            revert BeneficiaryChanged(expectedBeneficiary, p.beneficiary);\n        }","title":"A listed project's beneficiary can keep every challenge from opening by moving the beneficiary ahead of each challengeForBeneficiary"}],"hash":"7defd06ee397589cd0341cff1ae63007a625a3068acb299fe320ad2d0d2f4eb6","nodeId":"9e194dbb-79dd-4e6e-aff0-70fd7209baed","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with one substantiated finding and ten coverage rows (all eight listed entry points plus two invariant rows). The scratch directory is removed and the tree is otherwise unchanged.\n\n**What I checked**\n\n- Read the registry, the oracle library, the manifest, and the Execution Trace, Periphery and First Principles guides, and traced every entry point through its guards, state writes, bond movements and failure paths.\n- Pulled the live Intake v2's verified source from Sourcify. Its `complete` is writer-only, its failure path checks the request id in the arguments, and its `requests` getter returns exactly the four fields the registry's interface expects, so `expire` reads it correctly.\n- Read live Sepolia state over a public RPC: the oracle price is 0.5 test IMD, callback gas is 1,000,000, the Stacker's IMD and SIMD are the launch #1129 pair, and the test IMD is a plain mintable OpenZeppelin ERC-20 with no fee or pause.\n- Generated the body the contract actually sends and diffed it against the rehearsed version 2 body. Keys, rules and settings match exactly, every rule is under 512 characters, and the longest possible question is 1,113 characters.\n- Ran the full suite offline: 150 passed, 8 fork tests skipped, none failed. The manifest test accepts the registry-only launch.json, whose seven arguments match the brief.\n\n**Finding (medium)**\n\nA listed project's beneficiary can block every challenge by moving the beneficiary to another wallet ahead of each pinned challenge. The challenge then reverts before paying, the compat `challenge` entry point is permanently disabled after the first move, and nothing limits how often the handoff may repeat. I verified the sequence over five rounds in a Foundry test: no question was ever filed and the project stayed listed. The suggested fix keeps the pin design and bounds handoffs to one per cooldown or makes them two-step.\n\n**Not reached**\n\nNothing in the assigned area was left untraced. The fork tests were not run because no RPC variable is configured, but the live reads above cover what they check.","treeHash":null,"usage":{"cachedInputTokens":1798590,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":39757,"runtime":"claude","turns":39,"wallClockMs":620333}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d63ea36a2b809080","findings":[{"citation":"resolved","description":"Round 2 settlement of finding cdec4c331f951b5b57d037e0281e688f1c633320f23f0eedb327b401a55c0966 (originally from audit_economics; the same mechanism is reported again this round by audit_economics 48e2833d and is merged here). The behaviour still reproduces on the revised tree: one question per project is open at a time (`if (p.ask != Ask.None) revert AskOpen();`, line 284), a settled challenge starts no cooldown (challengeOpenAt is written only on listing, line 364), and a challenge filed by the beneficiary itself risks no bond: on yes the bond goes to p.beneficiary (line 372, itself), on no or on failure/expiry to asker (lines 377 and 424, itself). So the beneficiary can front-run each hostile challengeForBeneficiary with its own bland challenge; the hostile call reverts AskOpen before paying and its [REASON] text never reaches the panel. The handoff rate limit added this round (HANDOFF_INTERVAL) does not touch this path and was not meant to. The author answered [disputed] with reasons I accept: refusing msg.sender == beneficiary is defeated by any other wallet, and a post-challenge cooldown would let a beneficiary buy immunity with a self-challenge, which the existing test_defendedSelfChallengeDoesNotRenewImmunity guards against. Every self-challenge still puts the project before a 15-seat panel judging all eight rules, and a signed no delists it, which bounds the harm. Recorded by the author in ADAPTATION.md. Kept at low as a documented limit of the challenge mechanism; it does not need to reopen the work.","line":372,"path":"src/ProjectRegistry.sol","reproduction":"Re-run this round on the revised code (test/scratch/Settle.t.sol test_selfChallengePreemptsHostileAtFeeOnly, passes, i.e. the behaviour is present). State: project P listed with beneficiary B through RegistryBase._listed(), B funded and approved, block.timestamp warped past challengeOpenAt. Loop 3 times: (1) B calls challengeForBeneficiary(P, 'routine check', B): 5.5e18 pulled, Ask.Challenge open. (2) challenger C calls challengeForBeneficiary(P, 'credits outside trades', B): reverts AskOpen; C pays nothing and no Intake body contains C's reason. (3) the mock Intake delivers a signed yes: line 372 pays 5e18 to p.beneficiary == B. Expected under the brief's 'anyone can challenge a listed project with a bond after the cooldown': C's reason reaches the panel or B's blocking costs B a bond. Actual: after 3 rounds B's balance fell by exactly 1.5e18 (three fees, every bond back), C's balance unchanged, intake.count() == 4 (one application plus three self-challenges), P still listed.","severity":"low","snippet":"            if (challengeBond != 0) oracleAsset.safeTransfer(p.beneficiary, challengeBond);","title":"Beneficiary can pre-empt every hostile challenge with a self-challenge that risks only the 0.5 IMD fee (settled: accepted as a documented design limit, no change required for this launch)"},{"citation":"resolved","description":"Round 2 settlement of finding 0a2f8d12108da5fa3df2d8918606a76904977bd7098e5485b90844ae272f953b (merged from audit_math and audit_permissions; reported again this round by audit_math 4d5774de and audit_permissions 8ca37beb, merged here). Still reproduces unchanged: the lower bound subtracts ISSUED_AT_TOLERANCE (5 minutes, src/oracle/OracleAttestation.sol line 139, defined for future clock skew), so an attestation issued up to 300 s before p.askedAt settles the question. The brief and docs/design.md state that only answers issued after the ask are accepted. No unprivileged path reaches it: the attestation must be delivered by the Intake under this project's open intake id, signed by the oracle signer for this contract, be a bool under chain 1 from a 15/11 panel, and carry an unconsumed requestId; it only weakens the defence against the trusted writer mispairing an answer to a question cleared within the last five minutes with a new ask on the same project. The author answered [disputed]: the tolerance guards liveness (attester stamps issuedAt from its own clock, the callback is attempted once and never retried) and the check enforces the intent to within drift; recorded in ADAPTATION.md. Since panel answers take minutes, a slow attester clock would need to lag the ask block by more than the panel's answer time before a strict bound refused an honest answer, so the liveness cost is small, but it is a legitimate trade-off for the author to make. Kept at low as a documented deviation from the brief's wording; no change required for this launch. The minimal fix if the wording is meant literally remains `if (a.issuedAt < p.askedAt) revert AnswerFromBeforeAsk(a.issuedAt);`.","line":342,"path":"src/ProjectRegistry.sol","reproduction":"Re-run this round on the revised code (test/scratch/Settle.t.sol test_issuedAt299BeforeAskAccepted and test_issuedAt301BeforeAskRejected, both pass). applyListing for P at block.timestamp T (p.askedAt = T). The mock Intake calls onOracleResult(intakeId, a, sig) with a.issuedAt = T - 299, a.expiresAt = T + 1 day, chainId 1, panelSize 15, quorum 11, agreed 13, answerType bool, answer true, a fresh requestId, signed by the oracle signer for this contract, under 200,000 gas. Expected per the brief: revert AnswerFromBeforeAsk(T - 299). Actual: (T - 299) + 300 < T is false, the answer settles and isListed(P) == true. With a.issuedAt = T - 301 the callback reverts and P is not listed.","severity":"low","snippet":"        if (uint256(a.issuedAt) + ISSUED_AT_TOLERANCE < p.askedAt) {","title":"An answer issued up to five minutes before the ask is accepted, although the brief says only answers issued after the ask are (settled: author keeps the tolerance for liveness; documented deviation, t"},{"citation":"resolved","description":"Round 2 settlement of finding 139e729cb127a4b4e8328b9f4ad8d19672289b450c6b8c44404160425788359f (from audit_economics; reported again this round as 375b610f, merged here). Still reproduces: on status 2 (disagreed) the Intake calls onOracleFailure and _clear returns the bond to the asker (lines 423-424), nothing goes to the project, and since challengeOpenAt is written only on listing the same griefer can refile in the next block. While a question is open setBeneficiary reverts AskOpen (line 444), which with the new HANDOFF_INTERVAL also means a beneficiary whose one-per-day handoff window opens during a griefing run simply waits for the slot. The refund on failure is deliberate and documented in the contract header (an honest challenger must not lose a bond to a panel split, and the writer could force the same refund by withholding until expire), and the live rehearsals show splits are common. The author answered [disputed] and recorded it in ADAPTATION.md as a documented limit; a post-clear cooldown would have the immunity problem noted in the first finding. Harm is limited to the beneficiary being unable to hand off during open questions and the project paying attention; no funds are lost. Kept at info; no change required.","line":424,"path":"src/ProjectRegistry.sol","reproduction":"Re-run this round on the revised code (test/scratch/Settle.t.sol test_splitPanelRefundsAndRefiles, passes). State: project P listed with beneficiary B, cooldown passed; griefer G (the challenger account) funded. Loop 3 times: (1) G calls challengeForBeneficiary(P, 'spam', B): 5.5e18 pulled. (2) B calls setBeneficiary(P, X): reverts AskOpen. (3) the mock Intake reports status 2 'disagreed' through onOracleFailure under 200,000 gas: _clear pays 5e18 back to G and emits AskCleared; B receives nothing. (4) G refiles in the next block without ChallengeTooSoon. Observed: G's balance fell by exactly 1.5e18 (three fees), B's balance 0, P still listed. Expected under the design note that a griefing challenge costs the griefer the bond.","severity":"info","snippet":"            oracleAsset.safeTransfer(asker, challengeBond);","title":"On a split panel the challenger's bond is refunded and the challenge can be refiled at once, so griefing a listed project costs only the fee (settled: documented limit, no change required)"}],"hash":"86e1b4baf81eb950b3d5f49a19e6b764d6c87a11d243e2ebae10821e317c31ae","nodeId":"01433dc4-d14d-44ee-b5d6-3bf4f1cc7497","outcome":"completed","summary":"The review is settled and written to `.imd-findings.json`. No file in the tree was changed; the scratch tests I used are removed and `git status` is clean apart from the findings file.\n\n**Round-1 medium (handoff lockout, 047a2339): fixed.** The attached proof passes on this tree. `setBeneficiary` now refuses a second change of wallet within one day with `HandoffTooSoon`, the same-wallet set stays a no-op, and the clock survives delisting and relisting, so it cannot be reset. My own three-round retry test confirms a challenger naming the wallet in force always gets a question filed. The constructor and manifest are unchanged. Runtime grew to 22,294 bytes, still under the limit. The full suite passes with 166 tests and 8 fork tests skipped.\n\n**Three advisory findings: still reproduce, kept as settled design limits.** I re-ran each reproduction against the revised code and all three behave exactly as reported. The author disputed changing them with reasons I accept, so each is recorded as low or info with a note that no change is required for this launch:\n\n- **Self-challenge pre-emption at fee only** (low). A beneficiary's own challenge risks no bond and occupies the single slot. Alternative fixes have the costs the author names.\n- **Answer issued up to 300 s before the ask accepted** (low). Reachable only through the trusted writer. The author keeps the tolerance for liveness.\n- **Split panel refunds the bond and the challenge can be refiled** (info). The documented refund-on-failure rule.\n\nThe specialists' four reports this round are the same items, merged into these three, and the independent tester found nothing. The static-analysis lines did not reproduce: the flagged unused return in `expire` is in fact used, and the reentrancy lines sit behind `nonReentrant`.\n\nOne remark, not a finding: the manifest notes still say the runtime is 22,019 bytes, which is now 275 bytes stale. Notes are explanatory text, so this does not affect deployment.","treeHash":null,"usage":{"cachedInputTokens":829630,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":18300,"runtime":"claude","turns":22,"wallClockMs":311461}},{"artifacts":[],"attempt":1,"bundleHash":"5ab57f7386ebbce102b3caea8f5d8c5a1c085fc16775c8a7b6994ef72e52d732","device":"91067b3439961e55","findings":[],"hash":"9032d0f4a2fa2bf70a0c477dfd379964555f40151d951773482b614283b4a89f","nodeId":"ebab8f2d-84ba-415c-96dd-b128bd0af7b2","outcome":"completed","summary":"The revision is complete and verified.\n\n**Reopened finding, fixed.** The reviewer's proof failed on the starting tree and passes now. A listed project's beneficiary could refuse every challenge for free by moving the wallet ahead of each `challengeForBeneficiary` and back before the next. The fix in `src/ProjectRegistry.sol` is the smallest one that keeps the pin design: a change of wallet is allowed at most once per day, reverting with `HandoffTooSoon` otherwise, and the next open time is public as `handoffOpenAt(project)`. Setting the same wallet again still counts as nothing. Authorization, the lock while a question is open, the permanent pin and the front-run check are unchanged, so a challenger who retries against the wallet now in force always gets a question filed.\n\n**Tests.** Two regression tests were added to `test/RegistryRevisionRegression.t.sol`: the reviewer's toggle scenario end to end, and the interval boundary with no-op, defended challenge, delisting and relisting. Two existing tests that moved a wallet and back in one block now warp past the interval. Both invariant handlers model the interval and expect the revert on a second move inside it.\n\n| Check | Result |\n|---|---|\n| forge build | passes |\n| forge test | 152 passed, 8 fork tests skipped without RPC |\n| Reviewer proof | passes on the result |\n| Runtime size | 22,294 bytes, under EIP-170 |\n| forge fmt --check | clean |\n\n**Advisory findings, answered as disputed with reasons** in `.imd-responses.json` and ADAPTATION.md:\n- Self-challenge pre-emption and split-panel refiling reproduce, but both suggested fixes either are defeated by a second wallet or would let a beneficiary buy immunity through a self-challenge, which the existing audit guard forbids. Left as documented design limits.\n- Accepting an answer issued up to five minutes before the ask reproduces, but it is reachable only by the trusted writer and the tolerance protects liveness against clock drift on a callback that is never retried. Left unchanged.\n\n**Other files.** ADAPTATION.md records the change, why it was needed, and every finding's disposition. The `setBeneficiary` row in docs/design.md mentions the one-per-day handoff. The constructor and launch.json are untouched, the scratch directory is removed, and git status shows only the six intended files plus the responses file.","treeHash":"36bcfca7780533610282c38f380110186e1d3726","usage":{"cachedInputTokens":1106077,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":27196,"runtime":"claude","turns":41,"wallClockMs":396729}},{"artifacts":[],"attempt":1,"bundleHash":"f9d37ba4b7e9f93d26a6164047adef5c2dea0f0a508e6bc8f1fcc08628afa9c2","device":"a18a0c6087e1362f","findings":[],"hash":"a68c567f86f9e0f6e50a478daf8babe4b5288dde3f96dc52ca4b69c3471387c6","nodeId":"40ac2d1c-d644-465d-8a19-bfae24a96780","outcome":"completed","summary":"I rewrote `launch.json` for Sepolia test run 3. The previous attempt was rejected only because it left the file untouched, so this run makes a real edit while keeping the manifest's contract list and arguments exactly as the brief specifies.\n\n**What the manifest lists:** one contract, `ProjectRegistry`, with seven constructor arguments in declaration order.\n- Intake v2 at 0xa43e…de82.\n- Sepolia test IMD at 0x44a1…f89a as the oracle asset.\n- The live Stacker of launch #1294 at 0x0457…314d.\n- The oracle signer at 0x5598…2982.\n- Question chain id 1, challenge bond 5e18, cooldown 3600.\n\nThere is no Stacker, TestIMD or TestSIMD entry and no owner argument, matching the contract, which has no owner and whose constructor makes no external call. The file has exactly the keys kind, contracts and notes.\n\n**What changed:** only the notes string. It now carries the brief's facts for the reviewer: the constructor mapping with the meaning of each value, why no $owner appears, why the Stacker is not redeployed, the rules version and intake behavior, the runtime size and gas estimate, and the README follow-up. The notes are 2,561 characters, under the 4,000 limit.\n\n**Checks:**\n- `forge build` compiles cleanly with solc 0.8.26.\n- `forge test`: 152 passed, 0 failed, 8 skipped. The skipped tests are the fork tests, which need RPC URLs that are not set here.\n- `test/Deployment.t.sol`, which reads this manifest, passed all 4 tests.\n- `git status` shows launch.json as the only modified file, with no stray files.\n\nI could not run the provided protected check locally. It needs factory settings such as the factory address, chain id and per-contract code and salt that only the verification step supplies.\n\nThe README line for \"Sepolia test run 3\" still has to be added once the registry is live, which is outside the paths this task may change.","treeHash":"8ee61f2a857b8f2c09cbc3019853c99389750a82","usage":{"cachedInputTokens":234984,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":3968,"runtime":"claude","turns":8,"wallClockMs":80209}},{"artifacts":[],"attempt":1,"bundleHash":"fdf1d58fd5393099e636d045a9f756c0ee56fd92b56b2c35d876dc3967a560f5","device":"a4c81f495eb81dd0","findings":[],"hash":"d57ef1d34662c6af46c2de356ba2ae9fadefeb9522d93d38c822a72474935512","nodeId":"65e978f4-3130-46df-8f99-a0a9723f82d1","outcome":"completed","summary":"Done. The suite passes with the new file, and the working tree only touches `test/`.\n\n**What I found.** The implementation round added a one-handoff-per-day rule to `setBeneficiary` for the reviewer's front-run finding, and already modeled it in both invariant handlers plus two deterministic regressions. No reviewer findings were addressed to this test node, so this revision adds only the edges that change left untested. I read the new code adversarially and found no defect to report: the one oddity, that a relisted project's new beneficiary inherits what is left of the old wallet's interval, is documented design and harmless, so no findings file was written.\n\n**What I added.** `test/RegistryHandoffInterval.t.sol`, eight tests on the mock Intake:\n\n- Two fuzz tests at 1,000 runs. One sweeps the elapsed time across the boundary and checks the exact opening time, that a refused handoff changes nothing, and that the next interval runs from the second handoff. The other checks the property the rule exists for: at any time inside the interval the beneficiary cannot move the wallet ahead of a challenge, so a challenge naming the wallet in force is filed and charged exactly once, the defended bond goes to that wallet, and the legacy entry point stays closed.\n- Failure-path checks: a third wallet is refused like a move back, and the earlier checks still come first inside the interval, so an outsider or the previous wallet gets a different error than the wallet in charge.\n- Clock behaviour: an application naming a new wallet is not a handoff and neither needs nor restarts the interval, a failed or expired question leaves the clock alone, a rejected application leaves nothing to hand off, and each project has its own clock.\n\nI also added a row for the file to `test/ADVERSARIAL_COVERAGE.md`.\n\n**Verification.** Full `forge test`:\n\n```\nRan 26 test suites: 164 tests passed, 0 failed, 8 skipped (172 total tests)\n```\n\nThe 8 skipped are the fork tests that need an RPC. `git status --porcelain` shows only the new test file and the coverage note. The README row for \"Sepolia test run 3\" still waits on the live address, which does not exist yet.","treeHash":"b3fb0d197f5bb0e339985c78a866632b60147828","usage":{"cachedInputTokens":846749,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":15304,"runtime":"claude","turns":23,"wallClockMs":538417}}],"verification":[{"checks":[{"durationMs":8976,"exitCode":0,"name":"build","output":"Compiling 77 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.87s\nCompiler run successful!\n","passed":true},{"durationMs":4818,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 539.73µs (207.34µs CPU time)\n\nRan 1 test for test/RegistrySepoliaFork.t.sol:RegistrySepoliaForkTest\n[SKIP] test_sepolia_applyPaysTheRealIntake_thenAnswerLists() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 472.76µs (31.64µs CPU time)\n\nRan 4 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerIsThisBuild() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 4 skipped; finished in 678.74µs (116.17µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419482)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.05ms (828.91µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162651)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.38ms (129.07µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156293)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.34ms (173.51µs CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181781)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13664)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69567)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64591)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.99ms (684.79µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128234)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140182)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140266)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.95ms (206.23µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171535)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.13ms (221.65µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190529)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.33ms (293.60µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910410)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637844)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.18ms (1.43ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950224, ~: 2950055)\nLogs:\n  Bound result 73179594023797861407\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 8844751)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 20725223)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 5898443)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9016507)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 280662)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6097752)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3065613)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4169818)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 344695)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 44.52ms (62.40ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 24225)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 7785997)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4217889)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 146.68ms (30.02ms CPU time)\n\nRan 1 test for test/StackerInvariant.t.sol:StackerInvariantTest\n[PASS]\nStackerInvariantTest invariants:\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_totalsConsistent\n[PASS] invariant_vaultConservation\n StackerInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭----------------+-------------+-------+---------+----------╮\n| Contract       | Selector    | Calls | Reverts | Discards |\n+===========================================================+\n| StackerHandler | advance     | 403   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 438   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 402   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 424   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 381   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 3000000000000000000\n  Bound result 1\n  Bound result 4\n  Bound result 10\n  Bound result 8020202827\n  Bound result 4891\n  Bound result 1\n  Bound result 242\n  Bound result 1\n  Bound result 4\n  Bound result 255\n  Bound result 9\n  Bound result 1\n  Bound result 376051079409278372378\n  Bound result 9\n  Bound result 34\n  Bound result 10\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 576.97ms (572.53ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392277, ~: 392094)\nLogs:\n  Bound result 25886585114944544100887\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367321, ~: 368801)\nLogs:\n  Bound result 1\n  Bound result 0\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430069, ~: 430194)\nLogs:\n  Bound result 29703074\n  Bound result 1\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56037)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131214)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9371828)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378414)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370521)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383268)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508017)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617727)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374387)\n[PASS] test_credit_totalsAndEvent() (gas: 493973)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80024)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531558)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397349)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791551)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053516)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 592.70ms (353.74ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976780, ~: 976766)\nLogs:\n  Bound result 96627015391411881972817\n  Bound result 510937925904980453694\n  Bound result 42\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935297, ~: 2930169)\nLogs:\n  Bound result 104442540682231\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598484)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117568)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937399)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738536)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925677)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 592.69ms (1.04s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243059, ~: 6243022)\nLogs:\n  Bound result 123\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6327056, ~: 6334217)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4675407, ~: 3278676)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121973, ~: 6121734)\nLogs:\n  Bound result 10\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3258989)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3249448)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9341850)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6101775)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3436587)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4035392)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10303825)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3249737)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6375024)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3373189)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9489240)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6249718)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6263625)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6246728)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3471103)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3380979)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 592.69ms (1.67s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3443761, ~: 3408963)\nLogs:\n  Bound result 7\n  Bound result 12\n  Bound result 76\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6455411, ~: 6402999)\nLogs:\n  Bound result 31\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3690022)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3308106)\n[PASS] test_challengeMaximumReason() (gas: 6790375)\n[PASS] test_challengeMinimumReason() (gas: 6291205)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53511669)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3592970)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 592.72ms (1.09s CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 222689, ~: 55448)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 362238, ~: 47467)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3375074)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3063808)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3073562)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3145373)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3070602)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 2961512)\n[PASS] test_apply_validation() (gas: 562562)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 5750213)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6028458)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 8851245)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 8849483)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 5980327)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6118047)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74024)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 5803854)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5678025)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 2901601)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 5859668)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3140492)\n[PASS] test_yes_listsFromThisBlock() (gas: 3004433)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 592.73ms (74.08ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229775, ~: 229550)\nLogs:\n  Bound result 32083043351708437\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1542190, ~: 1369873)\nLogs:\n  Bound result 9\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388719, ~: 388677)\nLogs:\n  Bound result 859347994960938492935203\n  Bound result 609154362318632042970337\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 740844, ~: 761752)\nLogs:\n  Bound result 8173736555475029427903\n  Bound result 58948369677077683042029\n  Bound result 46058\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 683054, ~: 688826)\nLogs:\n  Bound result 70834239190978607456700\n  Bound result 32119194302238975030047\n  Bound result 52007669050990188481966\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 491290, ~: 510483)\nLogs:\n  Bound result 6316967078478552836\n  Bound result 994960938492935203\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615593)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365161)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591023)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662705)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238830)\n[PASS] test_credit_oneWei() (gas: 361738)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468463)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326667)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 736980)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91064)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522294)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 592.93ms (2.84s CPU time)\n\nRan 16 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8876829, ~: 8873857)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 5983425, ~: 5977671)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945183, ~: 6945346)\nLogs:\n  Bound result 93\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084102, ~: 3083831)\nLogs:\n  Bound result 201\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 5990791)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 5968641)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6395740)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16578)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3144931)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 11984191)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6368740)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6103756)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6491198)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 8859745)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 5983026)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6078659)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 593.02ms (1.89s CPU time)\n\nRan 2 tests for test/ProjectRegistryInvariant.t.sol:ProjectRegistryInvariantTest\n[PASS]\nProjectRegistryInvariantTest invariants:\n[PASS] invariant_holdsOnlyOpenBonds\n[PASS] invariant_listingCounts\n[PASS] invariant_recordsConsistent\n ProjectRegistryInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| RegistryHandler | answer            | 227   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 261   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 254   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 261   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 270   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 249   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 260   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 266   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 45\n  Bound result 8651\n  Bound result 35993\n  Bound result 93\n  Bound result 31\n  Bound result 1000\n  Bound result 3090\n  Bound result 14\n  Bound result 86400\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18034462)\nLogs:\n  Bound result 50\n  Bound result 25\n  Bound result 100\n  Bound result 172800\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 712.61ms (713.69ms CPU time)\n\nRan 2 tests for test/StackerInvariantExtended.t.sol:StackerInvariantExtendedTest\n[PASS]\nStackerInvariantExtendedTest invariants:\n[PASS] invariant_imdSupplyConservation\n[PASS] invariant_pauseAndOwnershipStateMachine\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_stackerTotals\n[PASS] invariant_vaultConservation\n[PASS] invariant_vaultSolvent\n StackerInvariantExtendedTest invariants (runs: 128, calls: 6144, reverts: 0)\n\n╭-----------------+----------------+-------+---------+----------╮\n| Contract        | Selector       | Calls | Reverts | Discards |\n+===============================================================+\n| ExtendedHandler | advance        | 484   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 504   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 505   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 477   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 454   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 471   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 492   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 474   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 451   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 480   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 445   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 437   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 470   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 18644\n  Bound result 16384\n  Bound result 2127\n  Bound result 10\n  Bound result 20714453771770111932240\n  Bound result 382\n  Bound result 10\n  Bound result 2877\n  Bound result 10000000000000000000000\n  Bound result 9639\n  Bound result 15995\n  Bound result 4999999999999999999997\n  Bound result 8790283200293394399322\n  Bound result 391722894296\n  Bound result 64\n  Bound result 11\n  Bound result 244\n  Bound result 3281\n  Bound result 4\n  Bound result 10000000000000000000000\n  Bound result 9472\n  Bound result 125924499474030\n  Bound result 128260\n  Bound result 127\n  Bound result 9127\n  Bound result 4935\n  Bound result 281\n  Bound result 1000000000000000000\n  Bound result 2\n  Bound result 12102\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540137)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.10s (4.09s CPU time)\n\nRan 3 tests for test/RegistryAccountingInvariant.t.sol:RegistryAccountingInvariantTest\n[PASS]\nRegistryAccountingInvariantTest invariants:\n[PASS] invariant_eachActorGetsExactlyTheirEntitlement\n[PASS] invariant_requestsAndListingsMatchIndependentHistory\n RegistryAccountingInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+----------------------+-------+---------+----------╮\n| Contract                  | Selector             | Calls | Reverts | Discards |\n+===============================================================================+\n| RegistryAccountingHandler | ask                  | 1809  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1819  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1843  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1832  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1841  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1809  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1844  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1809  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1778  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6039\n  Bound result 1374\n  Bound result 91\n  Bound result 2540\n  Bound result 63\n  Bound result 56\n  Bound result 4\n  Bound result 6704\n  Bound result 6\n  Bound result 853\n  Bound result 51\n  Bound result 3\n  Bound result 60\n  Bound result 100\n  Bound result 845\n  Bound result 35\n  Bound result 1\n  Bound result 9\n  Bound result 3\n  Bound result 489795449801505140\n  Bound result 92\n  Bound result 11\n  Bound result 6\n  Bound result 2\n  Bound result 2\n  Bound result 119757\n  Bound result 31\n  Bound result 1\n  Bound result 27199\n  Bound result 8\n  Bound result 92\n  Bound result 17178\n  Bound result 3\n  Bound result 2\n  Bound result 28\n  Bound result 3\n  Bound result 935\n  Bound result 147142\n  Bound result 50\n  Bound result 1657221164449380031\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 38562110)\nLogs:\n  Bound result 25\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 2\n  Bound result 50\n  Bound result 3\n  Bound result 50\n  Bound result 4\n  Bound result 50\n  Bound result 172800\n  Bound result 1\n  Bound result 0\n  Bound result 50\n  Bound result 123\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n\n[PASS] test_handlerRetainsBeneficiaryPinAcrossHandoffsAndRelisting() (gas: 15379768)\nLogs:\n  Bound result 50\n  Bound result 0\n  Bound result 0\n  Bound result 50\n  Bound result 500000000000000000\n  Bound result 50\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.72s (4.73s CPU time)\n\nRan 24 test suites in 4.72s (14.47s CPU time): 150 tests passed, 0 failed, 8 skipped (158 total tests)\n","passed":true},{"durationMs":61,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ProjectRegistry.applyListing(address,string,string,uint16,address)\",\"ProjectRegistry.challenge(address,string)\",\"ProjectRegistry.challengeForBeneficiary(address,string,address)\",\"ProjectRegistry.expire(address)\",\"ProjectRegistry.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"ProjectRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"ProjectRegistry.setBeneficiary(address,address)\",\"Stacker.credit(address,uint256)\"],\"files\":{\".github/ISSUE_TEMPLATE/listing-application.yml\":88,\".github/workflows/pages.yml\":38,\".gitignore\":4,\"ADAPTATION.md\":20,\"NEXT_SESSION.md\":66,\"README.md\":242,\"app.js\":1368,\"docs/design.md\":304,\"docs/explainer.html\":247,\"docs/history.md\":197,\"docs/listing.md\":96,\"docs/panel-rules-v2-rehearsal-body.json\":28,\"docs/panel-rules-v2.md\":42,\"docs/plea-test-run-2.md\":34,\"favicon.svg\":11,\"foundry.toml\":26,\"index.html\":167,\"jobs/1-sepolia-launch.md\":23,\"jobs/2-sepolia-site.md\":18,\"jobs/3-list-plea.md\":21,\"jobs/4-mainnet-launch.md\":16,\"jobs/5-sepolia-v2-launch.md\":12,\"jobs/5-sepolia-v2-site.md\":10,\"jobs/6-sepolia-v2-site.md\":30,\"jobs/7-sepolia-v2-site-pages.md\":22,\"jobs/requests/3-list-plea.json\":10,\"jobs/requests/4-mainnet-launch.json\":31,\"jobs/requests/5-sepolia-v2-launch-only.json\":31,\"jobs/requests/5-sepolia-v2-workflow.json\":50,\"jobs/requests/6-sepolia-v2-site.json\":15,\"jobs/requests/7-sepolia-v2-site-pages.json\":15,\"launch.json\":18,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":618,\"src/Stacker.sol\":98,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":41,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":102,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":233,\"test/RegistryAccountingInvariant.t.sol\":534,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryCallbackGas.t.sol\":111,\"test/RegistryRevisionRegression.t.sol\":334,\"test/RegistrySepoliaFork.t.sol\":111,\"test/SepoliaFork.t.sol\":97,\"test/Stacker.t.sol\":420,\"test/StackerEdges.t.sol\":390,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5e92eb46c042b88d34acdf2efb3cc8caa1a81cca32d7edb824eb607d491c354e","verifiedTreeHash":"2e30844b5e128062d9e99f73d878435b854f327f","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":8572,"exitCode":0,"name":"build","output":"Compiling 77 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.46s\nCompiler run successful!\n","passed":true},{"durationMs":4706,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RegistrySepoliaFork.t.sol:RegistrySepoliaForkTest\n[SKIP] test_sepolia_applyPaysTheRealIntake_thenAnswerLists() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 338.91µs (38.68µs CPU time)\n\nRan 3 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 547.36µs (95.82µs CPU time)\n\nRan 4 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerIsThisBuild() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 4 skipped; finished in 551.36µs (198.64µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419482)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 932.30µs (752.80µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910410)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637844)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 977.90µs (997.98µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162651)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.47ms (278.65µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156293)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.41ms (278.70µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190529)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.54ms (198.18µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128234)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140182)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140266)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.17ms (382.32µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171535)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.11ms (232.02µs CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181781)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13664)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69567)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64591)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 3.87ms (704.96µs CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950267, ~: 2950079)\nLogs:\n  Bound result 15925\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 8844751)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 20725223)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 5898443)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9016507)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 280662)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6097752)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3065613)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4169818)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 344695)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 85.87ms (95.11ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392192, ~: 392076)\nLogs:\n  Bound result 1000000000000\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367827, ~: 368853)\nLogs:\n  Bound result 31\n  Bound result 23\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430158, ~: 430206)\nLogs:\n  Bound result 3650\n  Bound result 31\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56037)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131214)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9371828)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378414)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370521)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383268)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508017)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617727)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374387)\n[PASS] test_credit_totalsAndEvent() (gas: 493973)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80024)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531558)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397349)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791551)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053516)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 158.21ms (157.21ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 222353, ~: 55497)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 373096, ~: 47467)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3375074)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3063808)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3073562)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3145373)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3070602)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 2961512)\n[PASS] test_apply_validation() (gas: 562562)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 5750213)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6028458)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 8851245)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 8849483)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 5980327)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6118047)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74024)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 5803854)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5678025)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 2901601)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 5859668)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3140492)\n[PASS] test_yes_listsFromThisBlock() (gas: 3004433)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 475.70ms (59.98ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 24483)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 7785997)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4217889)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 481.72ms (17.34ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229773, ~: 229550)\nLogs:\n  Bound result 19698\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1553203, ~: 1370545)\nLogs:\n  Bound result 9\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388738, ~: 388695)\nLogs:\n  Bound result 280\n  Bound result 190\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 740653, ~: 761728)\nLogs:\n  Bound result 100000000000000000000000\n  Bound result 2193687970\n  Bound result 37764228759292030947201\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682487, ~: 688802)\nLogs:\n  Bound result 2454011335236\n  Bound result 2031734062015811485684\n  Bound result 85646394309111949039930\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 491627, ~: 510495)\nLogs:\n  Bound result 1769352838889669867\n  Bound result 322681269115403989\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615593)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365161)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591023)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662705)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238830)\n[PASS] test_credit_oneWei() (gas: 361738)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468463)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326667)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 736980)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91064)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522294)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 514.30ms (2.06s CPU time)\n\nRan 16 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8876929, ~: 8873857)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 5983619, ~: 5977671)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945124, ~: 6945346)\nLogs:\n  Bound result 30\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084182, ~: 3084513)\nLogs:\n  Bound result 34838\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 5990791)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 5968641)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6395740)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16578)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3144931)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 11984191)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6368740)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6103756)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6491198)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 8859745)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 5983026)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6078659)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 514.40ms (1.78s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243067, ~: 6243034)\nLogs:\n  Bound result 8988\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6326090, ~: 6334217)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4780141, ~: 6257273)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121974, ~: 6121734)\nLogs:\n  Bound result 27\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3258989)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3249448)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9341850)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6101775)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3436587)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4035392)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10303825)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3249737)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6375024)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3373189)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9489240)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6249718)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6263625)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6246728)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3471103)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3380979)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 514.67ms (1.69s CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976741, ~: 976754)\nLogs:\n  Bound result 99999000000000000021061\n  Bound result 6517889768633886\n  Bound result 8961510221289786\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935560, ~: 2941029)\nLogs:\n  Bound result 12514264337593543950303\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598484)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117568)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937399)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738536)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925677)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 514.71ms (807.35ms CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3438378, ~: 3408432)\nLogs:\n  Bound result 24\n  Bound result 15\n  Bound result 26\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6450798, ~: 6398294)\nLogs:\n  Bound result 260\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3690022)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3308106)\n[PASS] test_challengeMaximumReason() (gas: 6790375)\n[PASS] test_challengeMinimumReason() (gas: 6291205)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53511669)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3592970)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 514.89ms (1.05s CPU time)\n\nRan 1 test for test/StackerInvariant.t.sol:StackerInvariantTest\n[PASS]\nStackerInvariantTest invariants:\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_totalsConsistent\n[PASS] invariant_vaultConservation\n StackerInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭----------------+-------------+-------+---------+----------╮\n| Contract       | Selector    | Calls | Reverts | Discards |\n+===========================================================+\n| StackerHandler | advance     | 384   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 400   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 428   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 434   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 402   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 691615346293511744229\n  Bound result 2\n  Bound result 999999000000000000001\n  Bound result 10\n  Bound result 242\n  Bound result 6549\n  Bound result 999990000000000000000000\n  Bound result 5\n  Bound result 1\n  Bound result 11772\n  Bound result 1766\n  Bound result 10\n  Bound result 10098\n  Bound result 691614346293511744229\n  Bound result 3534\n  Bound result 804\n  Bound result 37951505297574578\n  Bound result 216\n  Bound result 600000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 602.49ms (600.59ms CPU time)\n\nRan 2 tests for test/ProjectRegistryInvariant.t.sol:ProjectRegistryInvariantTest\n[PASS]\nProjectRegistryInvariantTest invariants:\n[PASS] invariant_holdsOnlyOpenBonds\n[PASS] invariant_listingCounts\n[PASS] invariant_recordsConsistent\n ProjectRegistryInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| RegistryHandler | answer            | 268   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 250   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 261   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 246   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 244   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 260   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 268   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 251   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 22444\n  Bound result 123620\n  Bound result 4683\n  Bound result 51\n  Bound result 25\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18034462)\nLogs:\n  Bound result 50\n  Bound result 25\n  Bound result 100\n  Bound result 172800\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 677.04ms (679.25ms CPU time)\n\nRan 2 tests for test/StackerInvariantExtended.t.sol:StackerInvariantExtendedTest\n[PASS]\nStackerInvariantExtendedTest invariants:\n[PASS] invariant_imdSupplyConservation\n[PASS] invariant_pauseAndOwnershipStateMachine\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_stackerTotals\n[PASS] invariant_vaultConservation\n[PASS] invariant_vaultSolvent\n StackerInvariantExtendedTest invariants (runs: 128, calls: 6144, reverts: 0)\n\n╭-----------------+----------------+-------+---------+----------╮\n| Contract        | Selector       | Calls | Reverts | Discards |\n+===============================================================+\n| ExtendedHandler | advance        | 486   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 516   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 449   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 442   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 478   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 485   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 471   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 471   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 461   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 483   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 452   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 474   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 476   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 23388943633854004941396\n  Bound result 4\n  Bound result 25\n  Bound result 11\n  Bound result 10000000\n  Bound result 3473428596000823219701\n  Bound result 3596000823219726861063\n  Bound result 1350\n  Bound result 9999999999999999999997\n  Bound result 800714\n  Bound result 512\n  Bound result 1040933690525904790912\n  Bound result 9218\n  Bound result 999911\n  Bound result 10\n  Bound result 1599200\n  Bound result 64\n  Bound result 6517187\n  Bound result 620425340\n  Bound result 1408\n  Bound result 6\n  Bound result 10000000000000000000000\n  Bound result 2\n  Bound result 51\n  Bound result 8944869659966808785035\n  Bound result 9\n  Bound result 280\n  Bound result 432858239980163\n  Bound result 9\n  Bound result 300\n  Bound result 1412270007830944903517\n  Bound result 13977\n  Bound result 19130\n  Bound result 7234\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540137)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.86s (3.86s CPU time)\n\nRan 3 tests for test/RegistryAccountingInvariant.t.sol:RegistryAccountingInvariantTest\n[PASS]\nRegistryAccountingInvariantTest invariants:\n[PASS] invariant_eachActorGetsExactlyTheirEntitlement\n[PASS] invariant_requestsAndListingsMatchIndependentHistory\n RegistryAccountingInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+----------------------+-------+---------+----------╮\n| Contract                  | Selector             | Calls | Reverts | Discards |\n+===============================================================================+\n| RegistryAccountingHandler | ask                  | 1863  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1775  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1793  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1776  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1813  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1867  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1853  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1865  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1779  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 625\n  Bound result 1686015053842265377\n  Bound result 81\n  Bound result 3773\n  Bound result 5108\n  Bound result 59\n  Bound result 5302\n  Bound result 465\n  Bound result 0\n  Bound result 1\n  Bound result 1690567687614133797\n  Bound result 48\n  Bound result 1\n  Bound result 26427\n  Bound result 4101\n  Bound result 927\n  Bound result 33\n  Bound result 0\n  Bound result 1\n  Bound result 262\n  Bound result 959548718743750997\n  Bound result 12360\n  Bound result 859983870753541408\n  Bound result 36\n  Bound result 85\n  Bound result 666915866\n  Bound result 6041\n  Bound result 52\n  Bound result 393677087818600\n  Bound result 19959\n  Bound result 0\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 38562110)\nLogs:\n  Bound result 25\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 2\n  Bound result 50\n  Bound result 3\n  Bound result 50\n  Bound result 4\n  Bound result 50\n  Bound result 172800\n  Bound result 1\n  Bound result 0\n  Bound result 50\n  Bound result 123\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n\n[PASS] test_handlerRetainsBeneficiaryPinAcrossHandoffsAndRelisting() (gas: 15379768)\nLogs:\n  Bound result 50\n  Bound result 0\n  Bound result 0\n  Bound result 50\n  Bound result 500000000000000000\n  Bound result 50\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.59s (4.61s CPU time)\n\nRan 24 test suites in 4.60s (13.53s CPU time): 150 tests passed, 0 failed, 8 skipped (158 total tests)\n","passed":true},{"durationMs":66,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ProjectRegistry.applyListing(address,string,string,uint16,address)\",\"ProjectRegistry.challenge(address,string)\",\"ProjectRegistry.challengeForBeneficiary(address,string,address)\",\"ProjectRegistry.expire(address)\",\"ProjectRegistry.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"ProjectRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"ProjectRegistry.setBeneficiary(address,address)\",\"Stacker.credit(address,uint256)\"],\"files\":{\".github/ISSUE_TEMPLATE/listing-application.yml\":88,\".github/workflows/pages.yml\":38,\".gitignore\":4,\"ADAPTATION.md\":20,\"NEXT_SESSION.md\":66,\"README.md\":242,\"app.js\":1368,\"docs/design.md\":304,\"docs/explainer.html\":247,\"docs/history.md\":197,\"docs/listing.md\":96,\"docs/panel-rules-v2-rehearsal-body.json\":28,\"docs/panel-rules-v2.md\":42,\"docs/plea-test-run-2.md\":34,\"favicon.svg\":11,\"foundry.toml\":26,\"index.html\":167,\"jobs/1-sepolia-launch.md\":23,\"jobs/2-sepolia-site.md\":18,\"jobs/3-list-plea.md\":21,\"jobs/4-mainnet-launch.md\":16,\"jobs/5-sepolia-v2-launch.md\":12,\"jobs/5-sepolia-v2-site.md\":10,\"jobs/6-sepolia-v2-site.md\":30,\"jobs/7-sepolia-v2-site-pages.md\":22,\"jobs/requests/3-list-plea.json\":10,\"jobs/requests/4-mainnet-launch.json\":31,\"jobs/requests/5-sepolia-v2-launch-only.json\":31,\"jobs/requests/5-sepolia-v2-workflow.json\":50,\"jobs/requests/6-sepolia-v2-site.json\":15,\"jobs/requests/7-sepolia-v2-site-pages.json\":15,\"launch.json\":18,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":618,\"src/Stacker.sol\":98,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":41,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":102,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":233,\"test/RegistryAccountingInvariant.t.sol\":534,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryCallbackGas.t.sol\":111,\"test/RegistryRevisionRegression.t.sol\":334,\"test/RegistrySepoliaFork.t.sol\":111,\"test/SepoliaFork.t.sol\":97,\"test/Stacker.t.sol\":420,\"test/StackerEdges.t.sol\":390,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"69471015229afe27800da80809f1cb8b0e0048a283a3f90bc701eb91c5aa7e3b","verifiedTreeHash":"dbade4dbf694b025ea9f49d7f8108c15222c4b8d","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":8866,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.76s\nCompiler run successful!\n","passed":true},{"durationMs":4655,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RegistrySepoliaFork.t.sol:RegistrySepoliaForkTest\n[SKIP] test_sepolia_applyPaysTheRealIntake_thenAnswerLists() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 357.04µs (50.29µs CPU time)\n\nRan 3 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 432.72µs (63.80µs CPU time)\n\nRan 4 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerIsThisBuild() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 4 skipped; finished in 493.40µs (205.83µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419482)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 758.58µs (600.72µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910410)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637844)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.00ms (1.12ms CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162651)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.86ms (200.18µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156293)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.91ms (237.02µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190529)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 11.60ms (143.88µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128234)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140182)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140266)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 12.22ms (318.09µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171535)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.25ms (359.13µs CPU time)\n\nRan 4 tests for test/RegistryCooldownBoundary.t.sol:RegistryCooldownBoundaryTest\n[PASS] test_challengeExactlyAtCooldown_succeeds() (gas: 5794902)\n[PASS] test_challengeOneSecondBeforeCooldown_reverts() (gas: 3045480)\n[PASS] test_constructor_rejectsCooldownAboveMax() (gas: 14194)\n[PASS] test_keptChallenge_doesNotRestartCooldown() (gas: 8789771)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 15.99ms (14.48ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 24225)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 7785997)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4217889)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 85.11ms (34.82ms CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181781)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13664)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69567)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64591)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 92.68ms (28.89ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392274, ~: 392118)\nLogs:\n  Bound result 26\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367601, ~: 368861)\nLogs:\n  Bound result 116843227038738797059097\n  Bound result 4138378352\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430162, ~: 430206)\nLogs:\n  Bound result 499999999999999999999999\n  Bound result 14436293944\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56037)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131214)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9371828)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378414)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370521)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383268)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508017)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617727)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374387)\n[PASS] test_credit_totalsAndEvent() (gas: 493973)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80024)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531558)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397349)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791551)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053516)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 95.20ms (200.15ms CPU time)\n\nRan 1 test for test/StackerInvariant.t.sol:StackerInvariantTest\n[PASS]\nStackerInvariantTest invariants:\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_totalsConsistent\n[PASS] invariant_vaultConservation\n StackerInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭----------------+-------------+-------+---------+----------╮\n| Contract       | Selector    | Calls | Reverts | Discards |\n+===========================================================+\n| StackerHandler | advance     | 428   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 434   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 404   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 405   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 377   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 13260\n  Bound result 10\n  Bound result 201\n  Bound result 6\n  Bound result 4\n  Bound result 1145243556070\n  Bound result 6843\n  Bound result 213493191435246164532\n  Bound result 8\n  Bound result 96\n  Bound result 5\n  Bound result 977\n  Bound result 25000000000000000000000\n  Bound result 4276624629\n  Bound result 17\n  Bound result 7\n  Bound result 5\n  Bound result 6\n  Bound result 1090\n  Bound result 7\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 488.32ms (486.30ms CPU time)\n\nRan 16 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8877054, ~: 8877054)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 5983861, ~: 5983861)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945098, ~: 6945346)\nLogs:\n  Bound result 57\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084116, ~: 3083831)\nLogs:\n  Bound result 280\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 5990791)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 5968641)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6395740)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16578)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3144931)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 11984191)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6368740)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6103756)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6491198)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 8859745)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 5983026)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6078659)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 562.69ms (929.44ms CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3440270, ~: 3408750)\nLogs:\n  Bound result 24\n  Bound result 66\n  Bound result 28\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6446851, ~: 6388897)\nLogs:\n  Bound result 187\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3690022)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3308106)\n[PASS] test_challengeMaximumReason() (gas: 6790375)\n[PASS] test_challengeMinimumReason() (gas: 6291205)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53511669)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3592970)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 569.26ms (1.05s CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 210545, ~: 55448)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 427367, ~: 47467)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3375074)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3063808)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3073562)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3145373)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3070602)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 2961512)\n[PASS] test_apply_validation() (gas: 562562)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 5750213)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6028458)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 8851245)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 8849483)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 5980327)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6118047)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74024)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 5803854)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5678025)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 2901601)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 5859668)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3140492)\n[PASS] test_yes_listsFromThisBlock() (gas: 3004433)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 574.57ms (70.77ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950229, ~: 2950061)\nLogs:\n  Bound result 4215\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 8844751)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 20725223)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 5898443)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9016507)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 280662)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6097752)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3065613)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4169818)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 344695)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 574.64ms (633.10ms CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243058, ~: 6243010)\nLogs:\n  Bound result 4117323642022674006282381470490144528593413209078729971219527763666977039884\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6325868, ~: 6334217)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4765324, ~: 3278676)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6122000, ~: 6121734)\nLogs:\n  Bound result 14\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3258989)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3249448)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9341850)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6101775)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3436587)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4035392)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10303825)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3249737)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6375024)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3373189)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9489240)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6249718)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6263625)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6246728)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3471103)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3380979)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 574.74ms (1.57s CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976770, ~: 976761)\nLogs:\n  Bound result 99819671822405221536143\n  Bound result 62514264337593543158053\n  Bound result 62514264337593543950334\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935228, ~: 2930169)\nLogs:\n  Bound result 5777\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598484)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117568)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937399)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738536)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925677)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 574.82ms (1.15s CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229778, ~: 229562)\nLogs:\n  Bound result 737732318861079567252547\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1510133, ~: 1369861)\nLogs:\n  Bound result 8\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388750, ~: 388695)\nLogs:\n  Bound result 1000000000000000000000000\n  Bound result 400926535011081726516\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 742602, ~: 761776)\nLogs:\n  Bound result 4832320533896774661012\n  Bound result 99999999999999999999999\n  Bound result 99999999999999999999999\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 683492, ~: 688838)\nLogs:\n  Bound result 6477501436346857855675\n  Bound result 60027057565783831656315\n  Bound result 7420881\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 489684, ~: 510483)\nLogs:\n  Bound result 242\n  Bound result 5956\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615593)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365161)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591023)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662705)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238830)\n[PASS] test_credit_oneWei() (gas: 361738)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468463)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326667)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 736980)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91064)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522294)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 574.87ms (2.48s CPU time)\n\nRan 2 tests for test/ProjectRegistryInvariant.t.sol:ProjectRegistryInvariantTest\n[PASS]\nProjectRegistryInvariantTest invariants:\n[PASS] invariant_holdsOnlyOpenBonds\n[PASS] invariant_listingCounts\n[PASS] invariant_recordsConsistent\n ProjectRegistryInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| RegistryHandler | answer            | 251   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 266   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 267   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 264   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 247   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 260   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 254   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 239   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 127\n  Bound result 25\n  Bound result 123683\n  Bound result 55\n  Bound result 1035\n  Bound result 1\n  Bound result 32231\n  Bound result 9514\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18034462)\nLogs:\n  Bound result 50\n  Bound result 25\n  Bound result 100\n  Bound result 172800\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 669.22ms (663.41ms CPU time)\n\nRan 2 tests for test/StackerInvariantExtended.t.sol:StackerInvariantExtendedTest\n[PASS]\nStackerInvariantExtendedTest invariants:\n[PASS] invariant_imdSupplyConservation\n[PASS] invariant_pauseAndOwnershipStateMachine\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_stackerTotals\n[PASS] invariant_vaultConservation\n[PASS] invariant_vaultSolvent\n StackerInvariantExtendedTest invariants (runs: 128, calls: 6144, reverts: 0)\n\n╭-----------------+----------------+-------+---------+----------╮\n| Contract        | Selector       | Calls | Reverts | Discards |\n+===============================================================+\n| ExtendedHandler | advance        | 482   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 460   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 461   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 522   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 501   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 463   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 427   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 458   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 480   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 432   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 497   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 482   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 479   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 200\n  Bound result 6367891383552638119061\n  Bound result 412212483072090364\n  Bound result 30000\n  Bound result 1631\n  Bound result 64\n  Bound result 1408\n  Bound result 20295\n  Bound result 10\n  Bound result 5862311413175698478182\n  Bound result 15796\n  Bound result 2604\n  Bound result 242766704\n  Bound result 5566\n  Bound result 85238\n  Bound result 1350362926\n  Bound result 9\n  Bound result 6\n  Bound result 284\n  Bound result 100000000000000000000\n  Bound result 21\n  Bound result 16096\n  Bound result 910484756\n  Bound result 10000000000000000000000\n  Bound result 18921\n  Bound result 281\n  Bound result 33977636888845534486099\n  Bound result 12345\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540137)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.91s (3.91s CPU time)\n\nRan 3 tests for test/RegistryAccountingInvariant.t.sol:RegistryAccountingInvariantTest\n[PASS]\nRegistryAccountingInvariantTest invariants:\n[PASS] invariant_eachActorGetsExactlyTheirEntitlement\n[PASS] invariant_requestsAndListingsMatchIndependentHistory\n RegistryAccountingInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+----------------------+-------+---------+----------╮\n| Contract                  | Selector             | Calls | Reverts | Discards |\n+===============================================================================+\n| RegistryAccountingHandler | ask                  | 1748  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1857  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1752  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1833  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1802  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1868  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1839  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1821  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1864  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5555\n  Bound result 667\n  Bound result 498\n  Bound result 3707953492\n  Bound result 26571\n  Bound result 13065\n  Bound result 3\n  Bound result 4916\n  Bound result 41\n  Bound result 322461224812014414\n  Bound result 896810034227594862\n  Bound result 92\n  Bound result 1045831443953764887\n  Bound result 119485999117\n  Bound result 621851493085150698\n  Bound result 3\n  Bound result 21\n  Bound result 14154\n  Bound result 1\n  Bound result 22444\n  Bound result 1\n  Bound result 430\n  Bound result 98\n  Bound result 65\n  Bound result 18\n  Bound result 64\n  Bound result 201\n  Bound result 63\n  Bound result 12396\n  Bound result 49\n  Bound result 47\n  Bound result 332459563041078138\n  Bound result 1\n  Bound result 6\n  Bound result 15\n  Bound result 116799081943\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 38562110)\nLogs:\n  Bound result 25\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 2\n  Bound result 50\n  Bound result 3\n  Bound result 50\n  Bound result 4\n  Bound result 50\n  Bound result 172800\n  Bound result 1\n  Bound result 0\n  Bound result 50\n  Bound result 123\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n\n[PASS] test_handlerRetainsBeneficiaryPinAcrossHandoffsAndRelisting() (gas: 15379768)\nLogs:\n  Bound result 50\n  Bound result 0\n  Bound result 0\n  Bound result 50\n  Bound result 500000000000000000\n  Bound result 50\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.55s (4.57s CPU time)\n\nRan 25 test suites in 4.56s (13.98s CPU time): 154 tests passed, 0 failed, 8 skipped (162 total tests)\n","passed":true},{"durationMs":65,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ProjectRegistry.applyListing(address,string,string,uint16,address)\",\"ProjectRegistry.challenge(address,string)\",\"ProjectRegistry.challengeForBeneficiary(address,string,address)\",\"ProjectRegistry.expire(address)\",\"ProjectRegistry.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"ProjectRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"ProjectRegistry.setBeneficiary(address,address)\",\"Stacker.credit(address,uint256)\"],\"files\":{\".github/ISSUE_TEMPLATE/listing-application.yml\":88,\".github/workflows/pages.yml\":38,\".gitignore\":4,\"ADAPTATION.md\":20,\"NEXT_SESSION.md\":66,\"README.md\":242,\"app.js\":1368,\"docs/design.md\":304,\"docs/explainer.html\":247,\"docs/history.md\":197,\"docs/listing.md\":96,\"docs/panel-rules-v2-rehearsal-body.json\":28,\"docs/panel-rules-v2.md\":42,\"docs/plea-test-run-2.md\":34,\"favicon.svg\":11,\"foundry.toml\":26,\"index.html\":167,\"jobs/1-sepolia-launch.md\":23,\"jobs/2-sepolia-site.md\":18,\"jobs/3-list-plea.md\":21,\"jobs/4-mainnet-launch.md\":16,\"jobs/5-sepolia-v2-launch.md\":12,\"jobs/5-sepolia-v2-site.md\":10,\"jobs/6-sepolia-v2-site.md\":30,\"jobs/7-sepolia-v2-site-pages.md\":22,\"jobs/requests/3-list-plea.json\":10,\"jobs/requests/4-mainnet-launch.json\":31,\"jobs/requests/5-sepolia-v2-launch-only.json\":31,\"jobs/requests/5-sepolia-v2-workflow.json\":50,\"jobs/requests/6-sepolia-v2-site.json\":15,\"jobs/requests/7-sepolia-v2-site-pages.json\":15,\"launch.json\":18,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":618,\"src/Stacker.sol\":98,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":41,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":102,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":233,\"test/RegistryAccountingInvariant.t.sol\":534,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryCallbackGas.t.sol\":111,\"test/RegistryCooldownBoundary.t.sol\":44,\"test/RegistryRevisionRegression.t.sol\":334,\"test/RegistrySepoliaFork.t.sol\":111,\"test/SepoliaFork.t.sol\":97,\"test/Stacker.t.sol\":420,\"test/StackerEdges.t.sol\":390,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"77f4fcfde5c71e9428b4abbb9c9048d1965114580eba05a52d627914c90c7202","verifiedTreeHash":"04ddd44cc2628e4746c6cd450db93d0a0f118751","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":8526,"exitCode":0,"name":"build","output":"Compiling 77 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.41s\nCompiler run successful!\n","passed":true},{"durationMs":5090,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RegistrySepoliaFork.t.sol:RegistrySepoliaForkTest\n[SKIP] test_sepolia_applyPaysTheRealIntake_thenAnswerLists() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 333.87µs (37.10µs CPU time)\n\nRan 3 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 440.07µs (91.93µs CPU time)\n\nRan 4 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerIsThisBuild() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 4 skipped; finished in 528.27µs (274.78µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419548)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 621.67µs (477.80µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910410)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637844)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 923.13µs (940.76µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171491)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.88ms (132.65µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190485)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.04ms (136.42µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162607)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.40ms (334.18µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128234)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140200)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140284)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.20ms (348.56µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156249)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.08ms (267.02µs CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181693)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13664)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69523)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64547)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.20ms (1.04ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 328802, ~: 55473)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 351405, ~: 47489)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3374744)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3063698)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3073408)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3145395)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3070624)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 2961534)\n[PASS] test_apply_validation() (gas: 562892)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 5750257)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6028437)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 8851331)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 8849440)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 5980530)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6118070)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74068)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 5803898)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5678087)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 2901667)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 5859624)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3162983)\n[PASS] test_yes_listsFromThisBlock() (gas: 3004411)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 64.47ms (67.31ms CPU time)\n\nRan 1 test for test/StackerInvariant.t.sol:StackerInvariantTest\n[PASS]\nStackerInvariantTest invariants:\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_totalsConsistent\n[PASS] invariant_vaultConservation\n StackerInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭----------------+-------------+-------+---------+----------╮\n| Contract       | Selector    | Calls | Reverts | Discards |\n+===========================================================+\n| StackerHandler | advance     | 446   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 382   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 394   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 425   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 401   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 340\n  Bound result 6\n  Bound result 2\n  Bound result 3\n  Bound result 11\n  Bound result 2\n  Bound result 4\n  Bound result 4602\n  Bound result 77000000000000000000\n  Bound result 13\n  Bound result 4\n  Bound result 5\n  Bound result 14436\n  Bound result 2192845057\n  Bound result 6627\n  Bound result 157198260\n  Bound result 2\n  Bound result 6\n  Bound result 86400\n  Bound result 14256\n  Bound result 1010\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 506.60ms (501.08ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976771, ~: 976743)\nLogs:\n  Bound result 99999000000001180058203\n  Bound result 2646\n  Bound result 3273568481\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935402, ~: 2941029)\nLogs:\n  Bound result 12514264337593543950334\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598484)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117568)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937399)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738536)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925677)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 540.77ms (929.85ms CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243038, ~: 6242989)\nLogs:\n  Bound result 169165663564235922889446925774825378478362957951624\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6328006, ~: 6334728)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4738381, ~: 3278654)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121985, ~: 6121713)\nLogs:\n  Bound result 3\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3258923)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3249382)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9364320)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6101843)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3436610)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4035194)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10303144)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3249671)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6375048)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3373212)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9489198)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6249697)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6263560)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6246751)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3471059)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3380979)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 567.03ms (1.62s CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392332, ~: 392118)\nLogs:\n  Bound result 19763\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 368590, ~: 368819)\nLogs:\n  Bound result 999999999999999999999998\n  Bound result 267334493254906517174397\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430118, ~: 430194)\nLogs:\n  Bound result 267334493254610060264301\n  Bound result 499999999999999999999998\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56037)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131214)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9371828)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378414)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370521)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383268)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508017)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617727)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374387)\n[PASS] test_credit_totalsAndEvent() (gas: 493973)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80024)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531558)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397349)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791551)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053516)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 567.12ms (1.12s CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8876876, ~: 8873704)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6006369, ~: 6000219)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945094, ~: 6945303)\nLogs:\n  Bound result 81\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084050, ~: 3083765)\nLogs:\n  Bound result 1045\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 5990747)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6437205)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 5968626)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6395718)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12028381)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3144758)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12020538)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6391290)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6103778)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6527392)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 8859745)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 5995950)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6078615)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 567.18ms (2.01s CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 24225)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 7895468)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4217889)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 567.26ms (46.29ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950292, ~: 2950111)\nLogs:\n  Bound result 46101\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 8867242)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 20725207)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 5898421)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9016487)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 280684)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6097820)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3065547)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4169862)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 344739)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 567.19ms (568.39ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229777, ~: 229550)\nLogs:\n  Bound result 525570780632362472653787\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1519528, ~: 1369861)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388751, ~: 388683)\nLogs:\n  Bound result 3008\n  Bound result 2188\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 736908, ~: 761698)\nLogs:\n  Bound result 68144349666900136328707\n  Bound result 1439387\n  Bound result 30857340832781953103443\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 681082, ~: 688790)\nLogs:\n  Bound result 24576\n  Bound result 2504\n  Bound result 34\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 490303, ~: 510423)\nLogs:\n  Bound result 9221645171643615585\n  Bound result 965918288749721435\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615593)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365161)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591023)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662705)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238830)\n[PASS] test_credit_oneWei() (gas: 361738)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468463)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326667)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 736980)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91064)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522294)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 567.26ms (3.31s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3437879, ~: 3408025)\nLogs:\n  Bound result 8\n  Bound result 13\n  Bound result 95\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6447506, ~: 6395791)\nLogs:\n  Bound result 3\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3690000)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3308084)\n[PASS] test_challengeMaximumReason() (gas: 6790354)\n[PASS] test_challengeMinimumReason() (gas: 6291184)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53526332)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3593126)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 567.51ms (987.37ms CPU time)\n\nRan 2 tests for test/ProjectRegistryInvariant.t.sol:ProjectRegistryInvariantTest\n[PASS]\nProjectRegistryInvariantTest invariants:\n[PASS] invariant_holdsOnlyOpenBonds\n[PASS] invariant_listingCounts\n[PASS] invariant_recordsConsistent\n ProjectRegistryInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| RegistryHandler | answer            | 257   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 255   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 254   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 271   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 246   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 249   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 255   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 261   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 50\n  Bound result 97\n  Bound result 130318\n  Bound result 70\n  Bound result 300\n  Bound result 1175\n  Bound result 172799\n  Bound result 1287\n  Bound result 1000\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18034501)\nLogs:\n  Bound result 50\n  Bound result 25\n  Bound result 100\n  Bound result 172800\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 646.49ms (649.30ms CPU time)\n\nRan 2 tests for test/StackerInvariantExtended.t.sol:StackerInvariantExtendedTest\n[PASS]\nStackerInvariantExtendedTest invariants:\n[PASS] invariant_imdSupplyConservation\n[PASS] invariant_pauseAndOwnershipStateMachine\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_stackerTotals\n[PASS] invariant_vaultConservation\n[PASS] invariant_vaultSolvent\n StackerInvariantExtendedTest invariants (runs: 128, calls: 6144, reverts: 0)\n\n╭-----------------+----------------+-------+---------+----------╮\n| Contract        | Selector       | Calls | Reverts | Discards |\n+===============================================================+\n| ExtendedHandler | advance        | 461   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 495   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 457   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 487   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 461   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 489   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 488   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 478   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 477   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 501   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 462   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 456   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 432   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 16209\n  Bound result 3791\n  Bound result 1\n  Bound result 1\n  Bound result 1665\n  Bound result 793578\n  Bound result 3146\n  Bound result 24576\n  Bound result 733262\n  Bound result 4\n  Bound result 1005101394057500517001\n  Bound result 22748\n  Bound result 3317985048561825520\n  Bound result 6\n  Bound result 5728\n  Bound result 6\n  Bound result 16966966696543232385476\n  Bound result 10\n  Bound result 5000\n  Bound result 5\n  Bound result 10\n  Bound result 10\n  Bound result 200000\n  Bound result 24927971548\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540137)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.92s (3.92s CPU time)\n\nRan 3 tests for test/RegistryAccountingInvariant.t.sol:RegistryAccountingInvariantTest\n[PASS]\nRegistryAccountingInvariantTest invariants:\n[PASS] invariant_eachActorGetsExactlyTheirEntitlement\n[PASS] invariant_requestsAndListingsMatchIndependentHistory\n RegistryAccountingInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+----------------------+-------+---------+----------╮\n| Contract                  | Selector             | Calls | Reverts | Discards |\n+===============================================================================+\n| RegistryAccountingHandler | ask                  | 1848  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1844  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1867  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1809  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1792  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1813  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1856  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1761  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1794  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 75\n  Bound result 679\n  Bound result 55555756221020859\n  Bound result 1\n  Bound result 2229\n  Bound result 15160\n  Bound result 264337593543950335\n  Bound result 15625\n  Bound result 2000\n  Bound result 26\n  Bound result 40\n  Bound result 1920336004577743723\n  Bound result 14155\n  Bound result 50\n  Bound result 272721684367959328\n  Bound result 15938\n  Bound result 171725683261\n  Bound result 84\n  Bound result 36\n  Bound result 300\n  Bound result 0\n  Bound result 37\n  Bound result 0\n  Bound result 112\n  Bound result 58\n  Bound result 4\n  Bound result 3\n  Bound result 9705\n  Bound result 3641\n  Bound result 0\n  Bound result 8\n  Bound result 0\n  Bound result 1\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 38742041)\nLogs:\n  Bound result 25\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 2\n  Bound result 50\n  Bound result 3\n  Bound result 50\n  Bound result 4\n  Bound result 50\n  Bound result 172800\n  Bound result 1\n  Bound result 0\n  Bound result 50\n  Bound result 123\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n\n[PASS] test_handlerRetainsBeneficiaryPinAcrossHandoffsAndRelisting() (gas: 15880086)\nLogs:\n  Bound result 50\n  Bound result 0\n  Bound result 0\n  Bound result 50\n  Bound result 500000000000000000\n  Bound result 86400\n  Bound result 1\n  Bound result 50\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.99s (5.00s CPU time)\n\nRan 24 test suites in 4.99s (14.66s CPU time): 152 tests passed, 0 failed, 8 skipped (160 total tests)\n","passed":true},{"durationMs":77,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ProjectRegistry.applyListing(address,string,string,uint16,address)\",\"ProjectRegistry.challenge(address,string)\",\"ProjectRegistry.challengeForBeneficiary(address,string,address)\",\"ProjectRegistry.expire(address)\",\"ProjectRegistry.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"ProjectRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"ProjectRegistry.setBeneficiary(address,address)\",\"Stacker.credit(address,uint256)\"],\"files\":{\".github/ISSUE_TEMPLATE/listing-application.yml\":88,\".github/workflows/pages.yml\":38,\".gitignore\":4,\"ADAPTATION.md\":59,\"NEXT_SESSION.md\":66,\"README.md\":242,\"app.js\":1368,\"docs/design.md\":304,\"docs/explainer.html\":247,\"docs/history.md\":197,\"docs/listing.md\":96,\"docs/panel-rules-v2-rehearsal-body.json\":28,\"docs/panel-rules-v2.md\":42,\"docs/plea-test-run-2.md\":34,\"favicon.svg\":11,\"foundry.toml\":26,\"index.html\":167,\"jobs/1-sepolia-launch.md\":23,\"jobs/2-sepolia-site.md\":18,\"jobs/3-list-plea.md\":21,\"jobs/4-mainnet-launch.md\":16,\"jobs/5-sepolia-v2-launch.md\":12,\"jobs/5-sepolia-v2-site.md\":10,\"jobs/6-sepolia-v2-site.md\":30,\"jobs/7-sepolia-v2-site-pages.md\":22,\"jobs/requests/3-list-plea.json\":10,\"jobs/requests/4-mainnet-launch.json\":31,\"jobs/requests/5-sepolia-v2-launch-only.json\":31,\"jobs/requests/5-sepolia-v2-workflow.json\":50,\"jobs/requests/6-sepolia-v2-site.json\":15,\"jobs/requests/7-sepolia-v2-site-pages.json\":15,\"launch.json\":18,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":634,\"src/Stacker.sol\":98,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":41,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":102,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryCallbackGas.t.sol\":111,\"test/RegistryRevisionRegression.t.sol\":418,\"test/RegistrySepoliaFork.t.sol\":111,\"test/SepoliaFork.t.sol\":97,\"test/Stacker.t.sol\":420,\"test/StackerEdges.t.sol\":390,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1718,"exitCode":0,"name":"slither","output":"[medium/medium] unused-return at src/ProjectRegistry.sol:402: ProjectRegistry.expire(address) (src/ProjectRegistry.sol#402-411) ignores return value by (None,None,None,completed) = intake.requests(intakeId) (src/ProjectRegistry.sol#407)\n[medium/medium] unused-return at src/oracle/OracleAttestation.sol:171: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/oracle/OracleAttestation.sol#171-189) ignores return value by (recovered,err,None) = ECDSA.tryRecover(digest,signature) (src/oracle/OracleAttestation.sol#184)\n[low/medium] reentrancy-benign at src/Stacker.sol:71: Reentrancy in Stacker.credit(address,uint256) (src/Stacker.sol#71-97):\n[low/medium] reentrancy-benign at src/ProjectRegistry.sol:304: Reentrancy in ProjectRegistry._ask(address,ProjectRegistry.Project,string,uint256) (src/ProjectRegistry.sol#304-322):\n[low/medium] timestamp at src/ProjectRegistry.sol:441: ProjectRegistry.setBeneficiary(address,address) (src/ProjectRegistry.sol#441-455) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:328: ProjectRegistry.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/ProjectRegistry.sol#328-380) uses timestamp for comparisons\n[low/medium] timestamp at src/oracle/OracleAttestation.sol:171: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/oracle/OracleAttestation.sol#171-189) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:402: ProjectRegistry.expire(address) (src/ProjectRegistry.sol#402-411) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:277: ProjectRegistry._challenge(address,string,address) (src/ProjectRegistry.sol#277-295) uses timestamp for comparisons","passed":true},{"durationMs":439,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/Stacker.sol:80: Reentrancy: State change after external call (2 places)\n[low] internal-function-used-once at src/oracle/OracleAttestation.sol:209: Internal Function Used Only Once\n[low] require-revert-in-loop at src/ProjectRegistry.sol:627: Loop Contains `require`/`revert`\n[low] uninitialized-local-variable at src/ProjectRegistry.sol:627: Uninitialized Local Variable\n[low] unused-public-function at src/ProjectRegistry.sol:460: Public Function Not Used Internally","passed":true},{"durationMs":1908,"exitCode":0,"name":"proof 047a2339e83e","output":"Compiling 57 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.36s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-89cbd91b/Proof_047a2339e83e.t.sol:BeneficiaryToggleLockoutTest\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 494885)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.33ms (441.34µs CPU time)\n\nRan 1 test suite in 2.97ms (2.33ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9032d0f4a2fa2bf70a0c477dfd379964555f40151d951773482b614283b4a89f","verifiedTreeHash":"36bcfca7780533610282c38f380110186e1d3726","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":8812,"exitCode":0,"name":"build","output":"Compiling 77 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.72s\nCompiler run successful!\n","passed":true},{"durationMs":5021,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RegistrySepoliaFork.t.sol:RegistrySepoliaForkTest\n[SKIP] test_sepolia_applyPaysTheRealIntake_thenAnswerLists() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 328.48µs (43.53µs CPU time)\n\nRan 3 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 514.25µs (123.84µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419548)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 584.94µs (442.36µs CPU time)\n\nRan 4 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerIsThisBuild() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 4 skipped; finished in 609.68µs (233.10µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162607)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.57ms (161.83µs CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181693)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13664)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69523)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64547)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.81ms (721.40µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156249)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.10ms (284.44µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171491)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.27ms (195.13µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128234)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140200)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140284)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.49ms (321.79µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190485)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.53ms (142.14µs CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 25588)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 7895468)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4217889)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 72.14ms (26.14ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392278, ~: 392124)\nLogs:\n  Bound result 9449181344880933850509\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367971, ~: 368819)\nLogs:\n  Bound result 2965982426831151\n  Bound result 2\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430102, ~: 430194)\nLogs:\n  Bound result 94957247544575390158366\n  Bound result 23291133281326955499156\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56037)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131214)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9371828)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378414)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370521)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383268)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508017)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617727)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374387)\n[PASS] test_credit_totalsAndEvent() (gas: 493973)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80024)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531558)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397349)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791551)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053516)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 111.03ms (173.78ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 222347, ~: 55526)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 351408, ~: 47489)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3374744)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3063698)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3073408)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3145395)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3070624)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 2961534)\n[PASS] test_apply_validation() (gas: 562892)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 5750257)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6028437)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 8851331)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 8849440)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 5980530)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6118070)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74068)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 5803898)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5678087)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 2901667)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 5859624)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3162983)\n[PASS] test_yes_listsFromThisBlock() (gas: 3004411)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 288.55ms (71.81ms CPU time)\n\nRan 1 test for test/StackerInvariant.t.sol:StackerInvariantTest\n[PASS]\nStackerInvariantTest invariants:\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_totalsConsistent\n[PASS] invariant_vaultConservation\n StackerInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭----------------+-------------+-------+---------+----------╮\n| Contract       | Selector    | Calls | Reverts | Discards |\n+===========================================================+\n| StackerHandler | advance     | 412   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 441   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 382   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 425   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 388   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 9\n  Bound result 2275\n  Bound result 2\n  Bound result 146\n  Bound result 2099076377\n  Bound result 1530\n  Bound result 1\n  Bound result 1\n  Bound result 3\n  Bound result 945\n  Bound result 4\n  Bound result 999999000000000000001\n  Bound result 2461\n  Bound result 10\n  Bound result 9\n  Bound result 5722\n  Bound result 280\n  Bound result 97\n  Bound result 10\n  Bound result 97\n  Bound result 8\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 497.29ms (495.40ms CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3441949, ~: 3408739)\nLogs:\n  Bound result 10\n  Bound result 27\n  Bound result 30\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6447316, ~: 6393501)\nLogs:\n  Bound result 31\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3690000)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3308084)\n[PASS] test_challengeMaximumReason() (gas: 6790354)\n[PASS] test_challengeMinimumReason() (gas: 6291184)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53526332)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3593126)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 497.90ms (923.71ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229776, ~: 229550)\nLogs:\n  Bound result 800000000000000000\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1506611, ~: 1369837)\nLogs:\n  Bound result 6\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388748, ~: 388695)\nLogs:\n  Bound result 25\n  Bound result 13\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 741824, ~: 761704)\nLogs:\n  Bound result 99994999999999999999991\n  Bound result 1064470259\n  Bound result 7256\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682996, ~: 688802)\nLogs:\n  Bound result 813\n  Bound result 11570\n  Bound result 9500000000000000000\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 490820, ~: 510483)\nLogs:\n  Bound result 3091153379598771377\n  Bound result 139212187432439466\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615593)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365161)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591023)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662705)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238830)\n[PASS] test_credit_oneWei() (gas: 361738)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468463)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326667)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 736980)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91064)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522294)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 522.11ms (1.32s CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8876776, ~: 8873704)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6006175, ~: 6000219)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945153, ~: 6945303)\nLogs:\n  Bound result 28\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084092, ~: 3083765)\nLogs:\n  Bound result 14574\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 5990747)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6437205)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 5968626)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6395718)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12028381)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3144758)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12020538)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6391290)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6103778)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6527392)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 8859745)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 5995950)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6078615)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 522.21ms (1.77s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243037, ~: 6242989)\nLogs:\n  Bound result 1097262976812\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6328055, ~: 6334195)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4759167, ~: 3278654)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121963, ~: 6121713)\nLogs:\n  Bound result 0\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3258923)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3249382)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9364320)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6101843)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3436610)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4035194)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10303144)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3249671)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6375048)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3373212)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9489198)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6249697)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6263560)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6246751)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3471059)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3380979)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 522.14ms (1.81s CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910410)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637844)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 522.16ms (1.06ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950273, ~: 2950111)\nLogs:\n  Bound result 877115\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 8867242)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 20725207)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 5898421)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9016487)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 280684)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6097820)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3065547)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4169862)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 344739)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 522.17ms (117.35ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976813, ~: 976754)\nLogs:\n  Bound result 99999000000000517440285\n  Bound result 13791\n  Bound result 18053\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935776, ~: 2941065)\nLogs:\n  Bound result 12514264337593543950335\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598484)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117568)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937399)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738536)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925677)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 522.27ms (1.04s CPU time)\n\nRan 2 tests for test/ProjectRegistryInvariant.t.sol:ProjectRegistryInvariantTest\n[PASS]\nProjectRegistryInvariantTest invariants:\n[PASS] invariant_holdsOnlyOpenBonds\n[PASS] invariant_listingCounts\n[PASS] invariant_recordsConsistent\n ProjectRegistryInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| RegistryHandler | answer            | 249   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 256   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 270   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 269   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 257   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 261   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 258   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 228   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 109\n  Bound result 60\n  Bound result 42\n  Bound result 73\n  Bound result 9170\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18034501)\nLogs:\n  Bound result 50\n  Bound result 25\n  Bound result 100\n  Bound result 172800\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 606.60ms (607.82ms CPU time)\n\nRan 2 tests for test/StackerInvariantExtended.t.sol:StackerInvariantExtendedTest\n[PASS]\nStackerInvariantExtendedTest invariants:\n[PASS] invariant_imdSupplyConservation\n[PASS] invariant_pauseAndOwnershipStateMachine\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_stackerTotals\n[PASS] invariant_vaultConservation\n[PASS] invariant_vaultSolvent\n StackerInvariantExtendedTest invariants (runs: 128, calls: 6144, reverts: 0)\n\n╭-----------------+----------------+-------+---------+----------╮\n| Contract        | Selector       | Calls | Reverts | Discards |\n+===============================================================+\n| ExtendedHandler | advance        | 516   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 446   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 490   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 454   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 480   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 435   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 494   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 424   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 466   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 468   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 496   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 488   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 487   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4533\n  Bound result 97\n  Bound result 3\n  Bound result 7794\n  Bound result 3\n  Bound result 14078\n  Bound result 6\n  Bound result 31\n  Bound result 19378\n  Bound result 5\n  Bound result 10\n  Bound result 14\n  Bound result 2\n  Bound result 16994000002\n  Bound result 16384\n  Bound result 27588658\n  Bound result 9\n  Bound result 5565\n  Bound result 18254581879\n  Bound result 3\n  Bound result 10\n  Bound result 8350\n  Bound result 442505593\n  Bound result 9469136266688988188323\n  Bound result 999981\n  Bound result 22444\n  Bound result 24576\n  Bound result 70\n  Bound result 18083\n  Bound result 8613289412\n  Bound result 50\n  Bound result 362124\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540137)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.75s (3.75s CPU time)\n\nRan 3 tests for test/RegistryAccountingInvariant.t.sol:RegistryAccountingInvariantTest\n[PASS]\nRegistryAccountingInvariantTest invariants:\n[PASS] invariant_eachActorGetsExactlyTheirEntitlement\n[PASS] invariant_requestsAndListingsMatchIndependentHistory\n RegistryAccountingInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+----------------------+-------+---------+----------╮\n| Contract                  | Selector             | Calls | Reverts | Discards |\n+===============================================================================+\n| RegistryAccountingHandler | ask                  | 1865  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1809  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1785  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1866  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1849  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1805  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1816  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1785  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1804  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 264337553929869078\n  Bound result 539378776694947925\n  Bound result 31\n  Bound result 10536\n  Bound result 10612\n  Bound result 5693\n  Bound result 55\n  Bound result 933\n  Bound result 126\n  Bound result 24\n  Bound result 27\n  Bound result 19172\n  Bound result 980477304808868868\n  Bound result 83248\n  Bound result 1\n  Bound result 579\n  Bound result 2\n  Bound result 3898\n  Bound result 3\n  Bound result 100\n  Bound result 88\n  Bound result 4\n  Bound result 401030258721710443\n  Bound result 1569098\n  Bound result 4\n  Bound result 1221\n  Bound result 11\n  Bound result 21054\n  Bound result 264337553929869078\n  Bound result 4370\n  Bound result 1675781056\n  Bound result 5278\n  Bound result 4596\n  Bound result 0\n  Bound result 1705875327891684125\n  Bound result 81\n  Bound result 21801\n  Bound result 1\n  Bound result 50\n  Bound result 171984126201523827\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 38742041)\nLogs:\n  Bound result 25\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 2\n  Bound result 50\n  Bound result 3\n  Bound result 50\n  Bound result 4\n  Bound result 50\n  Bound result 172800\n  Bound result 1\n  Bound result 0\n  Bound result 50\n  Bound result 123\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n\n[PASS] test_handlerRetainsBeneficiaryPinAcrossHandoffsAndRelisting() (gas: 15880086)\nLogs:\n  Bound result 50\n  Bound result 0\n  Bound result 0\n  Bound result 50\n  Bound result 500000000000000000\n  Bound result 86400\n  Bound result 1\n  Bound result 50\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.93s (4.94s CPU time)\n\nRan 24 test suites in 4.93s (13.90s CPU time): 152 tests passed, 0 failed, 8 skipped (160 total tests)\n","passed":true},{"durationMs":54,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ProjectRegistry.applyListing(address,string,string,uint16,address)\",\"ProjectRegistry.challenge(address,string)\",\"ProjectRegistry.challengeForBeneficiary(address,string,address)\",\"ProjectRegistry.expire(address)\",\"ProjectRegistry.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"ProjectRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"ProjectRegistry.setBeneficiary(address,address)\",\"Stacker.credit(address,uint256)\"],\"files\":{\".github/ISSUE_TEMPLATE/listing-application.yml\":88,\".github/workflows/pages.yml\":38,\".gitignore\":4,\"ADAPTATION.md\":59,\"NEXT_SESSION.md\":66,\"README.md\":242,\"app.js\":1368,\"docs/design.md\":304,\"docs/explainer.html\":247,\"docs/history.md\":197,\"docs/listing.md\":96,\"docs/panel-rules-v2-rehearsal-body.json\":28,\"docs/panel-rules-v2.md\":42,\"docs/plea-test-run-2.md\":34,\"favicon.svg\":11,\"foundry.toml\":26,\"index.html\":167,\"jobs/1-sepolia-launch.md\":23,\"jobs/2-sepolia-site.md\":18,\"jobs/3-list-plea.md\":21,\"jobs/4-mainnet-launch.md\":16,\"jobs/5-sepolia-v2-launch.md\":12,\"jobs/5-sepolia-v2-site.md\":10,\"jobs/6-sepolia-v2-site.md\":30,\"jobs/7-sepolia-v2-site-pages.md\":22,\"jobs/requests/3-list-plea.json\":10,\"jobs/requests/4-mainnet-launch.json\":31,\"jobs/requests/5-sepolia-v2-launch-only.json\":31,\"jobs/requests/5-sepolia-v2-workflow.json\":50,\"jobs/requests/6-sepolia-v2-site.json\":15,\"jobs/requests/7-sepolia-v2-site-pages.json\":15,\"launch.json\":18,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":634,\"src/Stacker.sol\":98,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":41,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":102,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryCallbackGas.t.sol\":111,\"test/RegistryRevisionRegression.t.sol\":418,\"test/RegistrySepoliaFork.t.sol\":111,\"test/SepoliaFork.t.sol\":97,\"test/Stacker.t.sol\":420,\"test/StackerEdges.t.sol\":390,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a68c567f86f9e0f6e50a478daf8babe4b5288dde3f96dc52ca4b69c3471387c6","verifiedTreeHash":"8ee61f2a857b8f2c09cbc3019853c99389750a82","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":9359,"exitCode":0,"name":"build","output":"Compiling 79 files with Solc 0.8.26\nSolc 0.8.26 finished in 9.26s\nCompiler run successful!\n","passed":true},{"durationMs":5218,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RegistrySepoliaFork.t.sol:RegistrySepoliaForkTest\n[SKIP] test_sepolia_applyPaysTheRealIntake_thenAnswerLists() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 453.79µs (43.74µs CPU time)\n\nRan 3 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 479.20µs (64.18µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419548)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 561.97µs (427.34µs CPU time)\n\nRan 4 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerIsThisBuild() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 4 skipped; finished in 579.76µs (141.91µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156249)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.87ms (192.21µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162607)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.04ms (178.17µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190485)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.34ms (200.86µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910410)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637844)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.41ms (1.27ms CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181693)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13664)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69523)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64547)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.67ms (865.58µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128234)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140200)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140284)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.11ms (271.05µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171491)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.11ms (269.31µs CPU time)\n\nRan 4 tests for test/RegistryCooldownBoundary.t.sol:RegistryCooldownBoundaryTest\n[PASS] test_challengeExactlyAtCooldown_succeeds() (gas: 5794925)\n[PASS] test_challengeOneSecondBeforeCooldown_reverts() (gas: 3045503)\n[PASS] test_constructor_rejectsCooldownAboveMax() (gas: 14194)\n[PASS] test_keptChallenge_doesNotRestartCooldown() (gas: 8789795)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.31ms (6.20ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392277, ~: 392106)\nLogs:\n  Bound result 486224935535109149890637\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367631, ~: 368801)\nLogs:\n  Bound result 1109947052141822\n  Bound result 172790\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430105, ~: 430194)\nLogs:\n  Bound result 172790\n  Bound result 1109947052141822\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56037)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131214)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9371828)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378414)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370521)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383268)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508017)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617727)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374387)\n[PASS] test_credit_totalsAndEvent() (gas: 493973)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80024)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531558)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397349)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791551)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053516)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 217.74ms (251.54ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950282, ~: 2950111)\nLogs:\n  Bound result 481359513343946643\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 8867242)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 20725207)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 5898421)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9016487)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 280684)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6097820)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3065547)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4169862)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 344739)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 298.53ms (309.20ms CPU time)\n\nRan 1 test for test/StackerInvariant.t.sol:StackerInvariantTest\n[PASS]\nStackerInvariantTest invariants:\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_totalsConsistent\n[PASS] invariant_vaultConservation\n StackerInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭----------------+-------------+-------+---------+----------╮\n| Contract       | Selector    | Calls | Reverts | Discards |\n+===========================================================+\n| StackerHandler | advance     | 416   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 416   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 352   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 424   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 440   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 512\n  Bound result 1046363170\n  Bound result 1800003600\n  Bound result 287906182093653768802\n  Bound result 6974\n  Bound result 1064470260\n  Bound result 10\n  Bound result 659\n  Bound result 447936323843494743417111\n  Bound result 2000000000000000000\n  Bound result 9\n  Bound result 6\n  Bound result 1576\n  Bound result 15186\n  Bound result 2\n  Bound result 5\n  Bound result 342912741\n  Bound result 200\n  Bound result 2\n  Bound result 3600\n  Bound result 14925\n  Bound result 8\n  Bound result 8\n  Bound result 3875367892\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 501.26ms (499.32ms CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8876826, ~: 8873704)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6006272, ~: 6000219)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945102, ~: 6945303)\nLogs:\n  Bound result 79\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084044, ~: 3083765)\nLogs:\n  Bound result 9919954\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 5990747)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6437205)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 5968626)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6395718)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12028381)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3144758)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12020538)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6391290)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6103778)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6527392)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 8859745)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 5995950)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6078615)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 552.66ms (945.49ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976756, ~: 976766)\nLogs:\n  Bound result 99999000000000000006201\n  Bound result 62514264337591203209806\n  Bound result 7590\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935308, ~: 2930169)\nLogs:\n  Bound result 1523\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598484)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117568)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937399)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738536)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925677)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 569.73ms (692.37ms CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6227538, ~: 6227689)\nLogs:\n  Bound result 3600\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3159762, ~: 3157287)\nLogs:\n  Bound result 0\n\n[PASS] test_checksBeforeTheIntervalStillComeFirst() (gas: 6181673)\n[PASS] test_clockIsPerProject() (gas: 6191563)\n[PASS] test_expiredAndFailedQuestionsLeaveTheClockAlone() (gas: 8927684)\n[PASS] test_handoffEmitsEventAndStartsExactInterval() (gas: 3134744)\n[PASS] test_intervalRefusesAThirdWalletToo() (gas: 3177538)\n[PASS] test_relistingByApplicationNamesANewWalletWithoutAHandoff() (gas: 17842014)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 575.78ms (900.32ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 24225)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 7895468)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4217889)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 578.04ms (17.49ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229800, ~: 229562)\nLogs:\n  Bound result 355668741944970246887663\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1498895, ~: 1162420)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388737, ~: 388689)\nLogs:\n  Bound result 723676570096510508830\n  Bound result 0\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 739187, ~: 761752)\nLogs:\n  Bound result 255\n  Bound result 12\n  Bound result 500000000000000000\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682518, ~: 688814)\nLogs:\n  Bound result 255\n  Bound result 12\n  Bound result 500000000000000000\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 487732, ~: 510483)\nLogs:\n  Bound result 221\n  Bound result 236917359366206688\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615593)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365161)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591023)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662705)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238830)\n[PASS] test_credit_oneWei() (gas: 361738)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468463)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326667)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 736980)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91064)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522294)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 577.99ms (2.50s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3449286, ~: 3413035)\nLogs:\n  Bound result 32\n  Bound result 66\n  Bound result 27\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6448076, ~: 6392466)\nLogs:\n  Bound result 126\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3690000)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3308084)\n[PASS] test_challengeMaximumReason() (gas: 6790354)\n[PASS] test_challengeMinimumReason() (gas: 6291184)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53526332)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3593126)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 577.90ms (1.17s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243033, ~: 6242989)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6327927, ~: 6334728)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4854933, ~: 6257252)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121977, ~: 6121713)\nLogs:\n  Bound result 8\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3258923)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3249382)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9364320)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6101843)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3436610)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4035194)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10303144)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3249671)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6375048)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3373212)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9489198)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6249697)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6263560)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6246751)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3471059)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3380979)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 578.00ms (2.12s CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 282151, ~: 55531)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 351406, ~: 47489)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3374744)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3063698)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3073408)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3145395)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3070624)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 2961534)\n[PASS] test_apply_validation() (gas: 562892)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 5750257)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6028437)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 8851331)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 8849440)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 5980530)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6118070)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74068)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 5803898)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5678087)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 2901667)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 5859624)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3162983)\n[PASS] test_yes_listsFromThisBlock() (gas: 3004411)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 578.03ms (75.85ms CPU time)\n\nRan 2 tests for test/ProjectRegistryInvariant.t.sol:ProjectRegistryInvariantTest\n[PASS]\nProjectRegistryInvariantTest invariants:\n[PASS] invariant_holdsOnlyOpenBonds\n[PASS] invariant_listingCounts\n[PASS] invariant_recordsConsistent\n ProjectRegistryInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| RegistryHandler | answer            | 249   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 237   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 255   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 261   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 259   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 251   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 261   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 275   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 71\n  Bound result 52\n  Bound result 493\n  Bound result 10129\n  Bound result 64\n  Bound result 13\n  Bound result 25\n  Bound result 93532\n  Bound result 66\n  Bound result 66\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18034501)\nLogs:\n  Bound result 50\n  Bound result 25\n  Bound result 100\n  Bound result 172800\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 580.44ms (582.58ms CPU time)\n\nRan 2 tests for test/StackerInvariantExtended.t.sol:StackerInvariantExtendedTest\n[PASS]\nStackerInvariantExtendedTest invariants:\n[PASS] invariant_imdSupplyConservation\n[PASS] invariant_pauseAndOwnershipStateMachine\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_stackerTotals\n[PASS] invariant_vaultConservation\n[PASS] invariant_vaultSolvent\n StackerInvariantExtendedTest invariants (runs: 128, calls: 6144, reverts: 0)\n\n╭-----------------+----------------+-------+---------+----------╮\n| Contract        | Selector       | Calls | Reverts | Discards |\n+===============================================================+\n| ExtendedHandler | advance        | 459   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 494   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 447   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 507   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 424   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 484   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 504   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 442   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 481   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 512   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 462   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 471   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 457   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 26\n  Bound result 5\n  Bound result 2529\n  Bound result 2827\n  Bound result 15952\n  Bound result 7245\n  Bound result 256\n  Bound result 18082\n  Bound result 957821\n  Bound result 842863\n  Bound result 13961\n  Bound result 10\n  Bound result 7\n  Bound result 200000000000000000\n  Bound result 1807653962\n  Bound result 2016921281579096938862\n  Bound result 5126\n  Bound result 69\n  Bound result 5631\n  Bound result 1493926328\n  Bound result 1979\n  Bound result 515836082\n  Bound result 2811760177\n  Bound result 4465511848\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540137)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.88s (3.88s CPU time)\n\nRan 3 tests for test/RegistryAccountingInvariant.t.sol:RegistryAccountingInvariantTest\n[PASS]\nRegistryAccountingInvariantTest invariants:\n[PASS] invariant_eachActorGetsExactlyTheirEntitlement\n[PASS] invariant_requestsAndListingsMatchIndependentHistory\n RegistryAccountingInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+----------------------+-------+---------+----------╮\n| Contract                  | Selector             | Calls | Reverts | Discards |\n+===============================================================================+\n| RegistryAccountingHandler | ask                  | 1819  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1788  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1820  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1854  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1775  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1835  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1847  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1809  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1837  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 264337593543950334\n  Bound result 27\n  Bound result 119140\n  Bound result 51\n  Bound result 264337553929869078\n  Bound result 2\n  Bound result 264337593543950335\n  Bound result 4304\n  Bound result 1335943375\n  Bound result 1154\n  Bound result 1\n  Bound result 3\n  Bound result 1\n  Bound result 1\n  Bound result 245\n  Bound result 15632\n  Bound result 37\n  Bound result 25\n  Bound result 3\n  Bound result 72\n  Bound result 85\n  Bound result 1692700474\n  Bound result 14616\n  Bound result 3\n  Bound result 5327426446623\n  Bound result 26\n  Bound result 18846\n  Bound result 9\n  Bound result 172800\n  Bound result 9\n  Bound result 25\n  Bound result 20905\n  Bound result 657221200720445939\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 38742041)\nLogs:\n  Bound result 25\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n  Bound result 0\n  Bound result 50\n  Bound result 2\n  Bound result 50\n  Bound result 3\n  Bound result 50\n  Bound result 4\n  Bound result 50\n  Bound result 172800\n  Bound result 1\n  Bound result 0\n  Bound result 50\n  Bound result 123\n  Bound result 0\n  Bound result 50\n  Bound result 1\n  Bound result 50\n\n[PASS] test_handlerRetainsBeneficiaryPinAcrossHandoffsAndRelisting() (gas: 15880086)\nLogs:\n  Bound result 50\n  Bound result 0\n  Bound result 0\n  Bound result 50\n  Bound result 500000000000000000\n  Bound result 86400\n  Bound result 1\n  Bound result 50\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.11s (5.12s CPU time)\n\nRan 26 test suites in 5.12s (15.21s CPU time): 164 tests passed, 0 failed, 8 skipped (172 total tests)\n","passed":true},{"durationMs":63,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ProjectRegistry.applyListing(address,string,string,uint16,address)\",\"ProjectRegistry.challenge(address,string)\",\"ProjectRegistry.challengeForBeneficiary(address,string,address)\",\"ProjectRegistry.expire(address)\",\"ProjectRegistry.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"ProjectRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"ProjectRegistry.setBeneficiary(address,address)\",\"Stacker.credit(address,uint256)\"],\"files\":{\".github/ISSUE_TEMPLATE/listing-application.yml\":88,\".github/workflows/pages.yml\":38,\".gitignore\":4,\"ADAPTATION.md\":59,\"NEXT_SESSION.md\":66,\"README.md\":242,\"app.js\":1368,\"docs/design.md\":304,\"docs/explainer.html\":247,\"docs/history.md\":197,\"docs/listing.md\":96,\"docs/panel-rules-v2-rehearsal-body.json\":28,\"docs/panel-rules-v2.md\":42,\"docs/plea-test-run-2.md\":34,\"favicon.svg\":11,\"foundry.toml\":26,\"index.html\":167,\"jobs/1-sepolia-launch.md\":23,\"jobs/2-sepolia-site.md\":18,\"jobs/3-list-plea.md\":21,\"jobs/4-mainnet-launch.md\":16,\"jobs/5-sepolia-v2-launch.md\":12,\"jobs/5-sepolia-v2-site.md\":10,\"jobs/6-sepolia-v2-site.md\":30,\"jobs/7-sepolia-v2-site-pages.md\":22,\"jobs/requests/3-list-plea.json\":10,\"jobs/requests/4-mainnet-launch.json\":31,\"jobs/requests/5-sepolia-v2-launch-only.json\":31,\"jobs/requests/5-sepolia-v2-workflow.json\":50,\"jobs/requests/6-sepolia-v2-site.json\":15,\"jobs/requests/7-sepolia-v2-site-pages.json\":15,\"launch.json\":18,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":634,\"src/Stacker.sol\":98,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":102,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryCallbackGas.t.sol\":111,\"test/RegistryCooldownBoundary.t.sol\":44,\"test/RegistryHandoffInterval.t.sol\":235,\"test/RegistryRevisionRegression.t.sol\":418,\"test/RegistrySepoliaFork.t.sol\":111,\"test/SepoliaFork.t.sol\":97,\"test/Stacker.t.sol\":420,\"test/StackerEdges.t.sol\":390,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d57ef1d34662c6af46c2de356ba2ae9fadefeb9522d93d38c822a72474935512","verifiedTreeHash":"b3fb0d197f5bb0e339985c78a866632b60147828","verifierVersion":"0.1.0+fb8278c5"}]}