{"assessments":[],"deployments":[{"attestationHash":"458495188b78e4d048c27491b80cd0b59a43820d223b56e94c55525d535375af","chainId":11155111,"contracts":[{"address":"0x9b466d1527322435dc7fdd97bc862b49c177fc2d","blockNumber":11897213,"name":"ProjectRegistry","role":"other","txHash":"0x363ada35537638d03ae76f3f26133905c18ede7618350c14469877bb2422e524"}],"id":"14535ed5-9f71-4ac3-b0f8-645f8c10e32d","manifestHash":"064cff62f36c421f4ed512d6d50692586733aa09ddf7d37d28b3b5e2d40e831f","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":"99f41994-1d2e-4e28-9a9b-338f78f576bf","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"eab6ec479f461f45dfbcf369487e018cd190e54b06126862271d636ec6c1b6d7","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":"5a5271b86622a7544b08220e829339e9d261c59bec22f419d65e53912f9a8a6a","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":"a51ff3c1b0eb9cd61cfaafcc7fe18c6f1e4fd0928ff9e6c1bd8feae63b17abd7","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":"810934b862ddb53e97a830fca9404151961043cc8b3d68b3b4ce303a3a781326","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":"477057698a4bf7d982a1995f9ad8f934e9eaa7e8149f9b430391a0ed9ab1b0d9","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":"153a60badf8d2e4f78214c73def9c4911f59bfc469f503d2796dade399638837","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":"1795ffb9acd4fe371eb71a8040b3d1a074c734603fc98841555021a3b3f87bf9","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":"051206e6986642dd8d6515c93b70b428a5a2aac6207dd62e652a268d799764b4","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"a72062e227eccfe1339e83d756fe4c0e9de89788c9e2bfdc25b5a60781ba3d6f","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 (the launch-sepolia branch, which is the sepolia branch without .github/workflows): 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. A first attempt (job 6478f77c) passed its audit but was never deployed, because its delivery was refused on a GitHub workflow file; this commit has no .github/workflows (do not add any) and already carries that audit's fix: a beneficiary handoff at most once per day. 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 (with the library's 300-second tolerance), 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 and changes the wallet at most once per day (HANDOFF_INTERVAL, HandoffTooSoon otherwise). 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,985): 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,294 bytes; deploying it estimates about 35.2M gas on Sepolia's current schedule (test run 2's two contracts used 39.8M through the factory).\n\nTESTS: forge test passes (172 tests: 164 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. test/RegistryHandoffInterval.t.sol and test/RegistryRevisionRegression.t.sol cover the handoff rule. 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":"f469b91c9b6bdd5e31a10419305a59b9201fcb0eac87aeaa3f07c39cbece1b6f","previousHash":"7384f564a00542ac4bb06bb3fbf8eee34d90887ab4d96050a7e6da748995b405","projectId":"99f41994-1d2e-4e28-9a9b-338f78f576bf","publication":{"commit":"e6a9e072006d1ee5ca66e50ec3d002f30a1697a8","deliveredAt":"2026-10-12T06:51:01.222Z","repoUrl":"https://github.com/identity-md-launches/launch-1371-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":"ff086dc8c3c3a8a43cee1b3dbd62f2047fcf288f361487a491edb27ae7b55d84","state":"completed","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"e8020785adce026f8b28cee5249265048b71ba3106a2c555399837baeb50effa","device":"d11ea2b5e05fa7a8","findings":[],"hash":"051206e6986642dd8d6515c93b70b428a5a2aac6207dd62e652a268d799764b4","nodeId":"46bd416f-6820-4092-a9f9-88d174128a83","outcome":"completed","summary":"The manifest is written and verified. The work is done.\n\n**What changed**\n\nlaunch.json is the only modified file. The prior attempt was rejected because it produced no diff, so this attempt rewrote the manifest with the same seven constructor arguments and a fuller notes string.\n\n- Kind \"evm_contracts\", one contract, ProjectRegistry, keys limited to kind, contracts and notes.\n- Constructor arguments in declaration order: Intake v2, the Sepolia test IMD, test run 2's live Stacker, the oracle signer, chain id 1, a 5e18 bond and a 3600 second cooldown. All are strings and match the brief and the constructor in src/ProjectRegistry.sol.\n- No $owner, because the registry has no owner and takes none.\n- Notes now describe the launch-sepolia branch, the refused delivery of job 6478fF7c and its once-per-day handoff fix carried here, the live Stacker and test pair that are not redeployed, the oracle flow, and the pending README entry. They run to 2,722 characters, under the 4,000 limit.\n\n**Verification**\n\n- `forge build` compiles cleanly on solc 0.8.26.\n- `forge test` passes: 170 tests, 0 failures, 8 fork tests skipped without RPC URLs. That includes the manifest shape test and the empty-chain CREATE2 rehearsal in test/Deployment.t.sol, which read the arguments from launch.json.\n- No .github/workflows directory exists, and git shows launch.json as the only changed file.\n\nThe README \"Sepolia test run 3\" entry waits until the registry is live and is outside this task's writable paths, so it was not touched.","treeHash":"328b242203f75af4ae8fdfe06e83cbbbef255449","usage":{"cachedInputTokens":248731,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":3694,"runtime":"claude","turns":7,"wallClockMs":106870}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"45aa937328087de3","findings":[],"hash":"153a60badf8d2e4f78214c73def9c4911f59bfc469f503d2796dade399638837","nodeId":"3202a2ad-cce5-4738-9c29-98a4c858826d","outcome":"completed","summary":"Review complete. The math, boundary and numerical-gap audit of the ProjectRegistry found no defects, and `.imd-findings.json` holds an empty findings list with a coverage row for all 8 entry points plus three invariants and the manifest. The working tree is otherwise clean.\n\n**What I checked**\n\n- Every arithmetic site in `src/ProjectRegistry.sol` and `src/oracle/OracleAttestation.sol`. There is no division, multiplication or decimal scaling anywhere, so the rounding and precision failure modes in the Math Precision guide do not apply. The only operations are checked additions on time and fees, plus uint64 casts of block values. Every time comparison widens to uint256 first, and the cooldown is capped at 365 days, so none can overflow.\n- Exact boundaries, each confirmed against the code with a passing test. The issued-at tolerance at ±300 s, the attestation expiry inclusive, the one-day deadline where an answer is still accepted and `expire` is refused, then both flip one second later. The challenge cooldown and the handoff interval at `openAt - 1` versus `openAt`. Rate limits at 24, 25, 100 and 101. The panel floor (15, 11, 11) accepted and every single-field shortfall refused, including quorum 12 with 11 agreeing.\n- Value conservation. Each ask pulls fee plus bond and approves exactly the fee, so no residual allowance survives, including after a price change. All three settlement paths move exactly one bond, and a zero-bond deployment skips the transfer consistently on every path.\n- Boundaries with the live chain. A public Sepolia RPC was reachable, so all 8 fork tests ran and passed today. The live Intake returns a 0.5 test-IMD price, a 1,000,000 callback gas allowance, and a 4-word `requests` tuple, which is what `expire` decodes. The cold 200k-gas tests cover the mainnet stipend for all four outcomes.\n- Body limits. All 8 definitions stay under 512 bytes at the maximum rate, and the question stays under 2000 bytes with a 48-byte name and 200-byte URL.\n\n**One trust note, not a finding.** The callback accepts an attestation whose `agreed` exceeds `panelSize`. Only the oracle signer can produce that, and a signer willing to do so could sign a consistent one instead, so it has no exploit path. It is recorded in the coverage row for the callback.\n\n**Not reached.** Nothing in the assigned area was left unexamined. The self-challenge pattern, where a beneficiary front-runs a hostile challenge with its own at 0.5 IMD each, is an economic design question outside this area and is left to the specialist covering it.","treeHash":null,"usage":{"cachedInputTokens":1249972,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":31162,"runtime":"claude","turns":40,"wallClockMs":480972}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3bed38612db34f32","findings":[{"citation":"resolved","description":"The registry has no owner by design, so the three IdentityMD dependencies it trusts are fixed for life: `oracleSigner` (set once by OracleAttestationConsumer's constructor; `_setOracleSigner` is internal and never exposed), `intake` (immutable) and `ACTION` (a constant). The oracle-consumer reference says every one of these is normally constructor input and owner-settable so that a new action version (oracle-2) or a signer rotation does not need a redeploy. The brief explicitly chooses no owner and asks that the contracts stay as they are, so this is not a defect to fix but a trust assumption the owner and the judge should record: IdentityMD can at any time make this registry inert, with no way for imd/acc to repair it other than deploying a new registry. Funds are not at risk: an open challenge bond is returned to the challenger through `expire` after a day (or at once if the Intake completed the request), and applications hold no funds. Listing state is frozen as it stands: no project can be listed, delisted or challenged again. This finding only documents the dependency; it reports no permission bypass.","line":81,"path":"src/ProjectRegistry.sol","reproduction":"State A (signer rotated): IdentityMD rotates the oracle signer to a new key K2 and signs all later attestations with K2. A challenger calls challengeForBeneficiary(P, reason, B) paying 0.5 + 5 test IMD; the Intake later calls onOracleResult(intakeId, a, sig) with a valid K2 signature. Expected (if rotation were supported): the answer settles. Actual: _verifyAttestation reverts BadSignature (ECDSA recovers K2 != oracleSigner, ERC-1271 staticcall to the EOA 0x5598...2982 returns false), the Intake marks the request completed, anyone calls expire(P) and the bond goes back; P can never be delisted and no project can ever be listed again. State B (action retired): Intake.priceOf(\"oracle.request@oracle-1\", 0x44a1...f89a) returns 0 after IMD moves to oracle-2. Every applyListing/challenge call reverts OracleUnavailable at line 309 forever. In both states no funds are lost; the registry must be redeployed.","severity":"info","snippet":"    bytes32 public constant ACTION = \"oracle.request@oracle-1\";","title":"Trust assumption: no rotation path for the oracle signer, Intake or action; a signer rotation or retirement of oracle-1 leaves the registry permanently inert (agreed no-owner design)"}],"hash":"1795ffb9acd4fe371eb71a8040b3d1a074c734603fc98841555021a3b3f87bf9","nodeId":"338d408a-012d-4470-a25c-bb3f7bdf4172","outcome":"completed","summary":"The findings file is valid, the quoted snippet matches line 81 of the registry, and the working tree is otherwise untouched.\n\n**Result: no permission defect found in the Access Control, Trust Gap or Asymmetry areas.** The review file holds one info-level trust assumption and a coverage row for every listed entry point.\n\nWhat I checked:\n\n- **Access control.** Every state-changing path was traced for its guard. The two callbacks accept only the Intake and only an intake id this registry opened. A third party who pays the Intake for their own question naming this contract gets UnknownRequest. setBeneficiary is restricted to the current beneficiary of a listed project with no open ask. There is no owner, initializer, upgrade path or signer setter to escalate through.\n- **Asymmetry.** Writers and readers of every Project field, the pin flag and the handoff clock were diffed. Defend and delist paths move exactly the bond, once, to the locked beneficiary or the challenger. The expire boundary is disjoint from the TooLate boundary. Relisting through a fresh application names a new wallet only after a panel yes, and keeps the pin and handoff clock as documented.\n- **Trust gap.** The known residual limits, a third party holding the application slot for one fee per round and a beneficiary self-challenging to occupy the slot, are already covered by the author's tests as accepted bounds. The handoff-once-per-day fix does what it claims. A front-running handoff makes the compat challenge revert before any payment and the pinned retry always files.\n- **Manifest.** launch.json has only the schema keys, seven string arguments in declaration order, and the exact addresses and values from the brief. The callback selectors recompute to 0x510379c7 and 0xa7980e31.\n\nThe one recorded item is informational. The oracle signer, Intake and action id are fixed for life because the registry has no owner, which the brief requests. If IdentityMD rotates the signer or retires oracle-1, every answer reverts BadSignature or every ask reverts OracleUnavailable, bonds are recoverable through expire, and the registry must be redeployed.\n\nThe full suite passes locally. The README states 172 tests, while forge reports 178 in total, 170 run and 8 fork tests skipped. That is a documentation count, not a defect.","treeHash":null,"usage":{"cachedInputTokens":768066,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":28218,"runtime":"claude","turns":23,"wallClockMs":503178}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bc1e515ca5c78ac4","findings":[],"hash":"3d96d31da2285b44722e390e2cdd066d756bbf1b4ed917d579367ccca2987405","nodeId":"46bd416f-6820-4092-a9f9-88d174128a83","outcome":"failed","summary":"the task produced no changes; the agent's last message was: The manifest is complete and verified. I left launch.json exactly as the tree already carries it, because it already describes the accepted implementation and passes every check it is judged against.\n\n**What launch.json says**\n\n- Kind \"evm_contracts\", one contract, ProjectRegistry, no extra keys, all arguments and notes as strings.\n- Seven constructor arguments in declaration order: Intake v2, the Sepolia test IMD, test run 2's live Stacker, the oracle signer, chain id 1, a 5e18 bond and a 3600 second cooldown.\n- No $owner, which is correct: the registry has no owner and its constructor takes none.\n- Notes run to 1,397 characters and describe the Sepolia test run 3 wiring, the once-per-day handoff rule, and that no Stacker or test token is redeployed.\n\n**What I verified**\n\n- The arguments match the constructor signature in src/ProjectRegistry.sol and the addresses and values in the brief.\n- `forge build` compiles cleanly on solc 0.8.26.\n- `forge test` passes: 170 tests, 0 failures, 8 fork tests skipped without RPC URLs. That includes the manifest shape test and the factory rehearsal in test/Deployment.t.sol, plus the handoff interval and revision regression suites.\n- I rehearsed the protected probe in test/scratch with the init code built from the manifest's own arguments, under chain id 11155111 on an empty chain. It deployed at the predicted CREATE2 address, and the runtime is within EIP-170 with no forbidden opcodes. Init code is 24,139 bytes, well under the probe's limit.\n- No .github/workflows directory exists, and git shows no tracked file changed.\n\nThe README entry for \"Sepolia test run 3\" is deferred by the brief until the registry is live and is outside this task's writable paths, so it was not touched.","treeHash":null,"usage":{"cachedInputTokens":334632,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":4493,"runtime":"claude","turns":13,"wallClockMs":102961}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4ca9ed4f0937da89","findings":[{"citation":"resolved","description":"(Merged: audit_flow 3759ed8e.) Each project has one question slot, and _challenge refuses a second challenge with AskOpen before taking any payment. A beneficiary B that watches the mempool can front-run an honest challengeForBeneficiary(P, reason, B) with challengeForBeneficiary(P, \"routine check\", B). B's bond always comes back to B: on yes it goes to p.beneficiary (line 372: `oracleAsset.safeTransfer(p.beneficiary, challengeBond)`), which is B. On no, failure or expire it goes to the asker, also B. So each round costs B only the oracle fee. The cooldown does not restart, so the race repeats every time the slot reopens. The panel still checks every rule, so the project is still judged. What is lost is the challenger's [REASON] hint, the only way to point the panel at a specific violation. Low: a griefing and information loss, not a way around the panel. Possible fix that keeps the design: let another caller add a reason to an open challenge (an event only), or send a self-challenge's defended bond elsewhere.","line":284,"path":"src/ProjectRegistry.sol","reproduction":"Reproduced with a scratch Foundry test on the registry, using a minimal Intake mock. State: P listed with beneficiary B (answer 15/11/11 yes), 1h cooldown elapsed, B holds IMD approved to the registry. Three rounds: B calls challengeForBeneficiary(P,\"routine check\",B); honest wallet H's challengeForBeneficiary(P,\"owner withdraws locked LP\",B) reverts AskOpen (H pays nothing); a signed yes is delivered. Result: B's balance is down exactly 1.5e18 (3 x 0.5 fee; the 5e18 bond came back each time), H's balance is unchanged, P is still listed, and no question with H's reason was ever filed. Expected: a challenger naming the wallet in force gets its question filed.","severity":"low","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"A beneficiary can front-run every honest challenge with its own self-challenge, at the 0.5 IMD fee per round with no bond at risk, so the challenger's reason never reaches the panel"},{"citation":"resolved","description":"(write_foundry_tests 2e59525a.) Every path that closes a challenge pushes the bond in the same call: onOracleResult on a delisting (line 377), and _clear, used by onOracleFailure and expire (line 424). If the token reverts on a transfer to the asker (a blocklist, or a pause that lasts longer than the day), the answer callback reverts inside the Intake's try, and expire reverts every time. p.ask then stays Challenge forever: there is no new challenge (AskOpen), no handoff, and no delisting. The project stays listed. Its team could buy this immunity by challenging from a wallet the token issuer blocks. This cannot happen on Sepolia run 3, where test IMD 0x44a1...f89a is a plain mintable ERC-20 that transfers to any non-zero address, so it is low. It matters for an oracle asset that gates transfers. Fix: record the refund as owed and let the challenger withdraw it (pull payment), so clearing the question does not depend on the transfer.","line":424,"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\ncontract BlocklistIMD is ERC20 {\n    mapping(address => bool) public blocked;\n    constructor() ERC20(\"Blocklist IMD\", \"bIMD\") {}\n    function mint(address to, uint256 amount) external { _mint(to, amount); }\n    function block_(address who, bool on) external { blocked[who] = on; }\n    function _update(address from, address to, uint256 value) internal override {\n        require(!blocked[to], \"blocked\");\n        super._update(from, to, value);\n    }\n}\n\ncontract Intake is IIntake {\n    bytes32 constant ACTION = \"oracle.request@oracle-1\";\n    struct Req { address target; bytes4 sel; bytes4 onFailure; bool completed; }\n    mapping(bytes32 => Req) r;\n    uint256 n;\n    function priceOf(bytes32 action, address) external pure returns (uint256) { return action == ACTION ? 0.5e18 : 0; }\n    function requestWithFailure(bytes32, bytes calldata, Callback calldata cb, bytes4 onFailure, address asset, uint256 amount) external returns (bytes32 id) {\n        IERC20(asset).transferFrom(msg.sender, address(0x7EA5), amount);\n        id = keccak256(abi.encode(++n));\n        r[id] = Req(cb.target, cb.selector, onFailure, false);\n    }\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) { return (address(0), r[id].target, r[id].sel, r[id].completed); }\n    function deliver(bytes32 id, OracleAttestation.Attestation calldata a, bytes calldata sig) external returns (bool ok) {\n        r[id].completed = true;\n        (ok,) = r[id].target.call{gas: 200_000}(abi.encodeWithSelector(r[id].sel, id, a, sig));\n    }\n}\n\ncontract Project {}\n\n/// Fails on the current code: a challenger the token refuses to pay can never have its\n/// challenge cleared, so the project's slot is frozen. Passes once clearing a question no\n/// longer depends on paying the challenger in the same call (for example a pull-based refund).\ncontract BlockedChallengerFreezesSlotTest is Test {\n    uint256 constant KEY = 0xA11CE;\n    Intake intake;\n    BlocklistIMD imd;\n    ProjectRegistry reg;\n    address project;\n    address applicant = makeAddr(\"applicant\");\n    address challenger = makeAddr(\"challenger\");\n    address beneficiary = makeAddr(\"beneficiary\");\n    uint256 uuid;\n\n    function setUp() public {\n        vm.roll(1000);\n        vm.warp(1_700_000_000);\n        intake = new Intake();\n        imd = new BlocklistIMD();\n        reg = new ProjectRegistry(address(intake), address(imd), address(0x57AC), vm.addr(KEY), 1, 5e18, 1 hours);\n        project = address(new Project());\n        imd.mint(applicant, 100e18);\n        imd.mint(challenger, 100e18);\n        vm.prank(applicant);\n        imd.approve(address(reg), type(uint256).max);\n        vm.prank(challenger);\n        imd.approve(address(reg), type(uint256).max);\n    }\n\n    function _att(bool yes) internal returns (OracleAttestation.Attestation memory a) {\n        a.requestId = bytes32(++uuid << 128);\n        a.chainId = 1;\n        a.answer = abi.encode(yes);\n        a.panelSize = 15;\n        a.quorum = 11;\n        a.agreed = 11;\n        a.issuedAt = uint64(block.timestamp);\n        a.expiresAt = uint64(block.timestamp + 1 days);\n    }\n\n    function _sig(OracleAttestation.Attestation memory a) internal view returns (bytes memory) {\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(KEY, reg.attestationDigest(a));\n        return abi.encodePacked(r, s, v);\n    }\n\n    function test_blockedChallengerCannotFreezeTheSlot() public {\n        vm.prank(applicant);\n        bytes32 id = reg.applyListing(project, \"P\", \"https://x.example/p\", 50, beneficiary);\n        OracleAttestation.Attestation memory a = _att(true);\n        assertTrue(intake.deliver(id, a, _sig(a)));\n        assertTrue(reg.isListed(project));\n        vm.warp(block.timestamp + 1 hours);\n        vm.prank(challenger);\n        id = reg.challenge(project, \"Review.\");\n        imd.block_(challenger, true);\n\n        // A signed 'no' cannot be settled (the bond refund reverts) and the Intake does not retry.\n        a = _att(false);\n        intake.deliver(id, a, _sig(a));\n\n        // Expected: the question can still be cleared, by anyone, once the Intake completed it\n        // or after a day. Actual on the current code: expire reverts with the token's error.\n        vm.warp(block.timestamp + 2 days);\n        reg.expire(project);\n        assertEq(uint8(reg.projectOf(project).ask), uint8(ProjectRegistry.Ask.None), \"slot cleared\");\n        // And the project is challengeable again.\n        vm.prank(applicant);\n        reg.challengeForBeneficiary(project, \"Again.\", beneficiary);\n    }\n}","reproduction":"Ran the attached proof: it FAILS on the current code with 'blocked'. Setup: an ERC-20 that reverts transfers to blocked addresses. Project listed via a signed yes; after 1h the challenger calls challenge(P,\"Review.\"); the token then blocks the challenger. A signed no is delivered: the callback reverts and the Intake marks the request completed. After warping 2 days, expire(P) reverts 'blocked'. Expected: the slot is cleared and P can be challenged again. Actual: expire reverts forever.","severity":"low","snippet":"            oracleAsset.safeTransfer(asker, challengeBond);","title":"If the oracle asset refuses a transfer to the challenger, the challenge can never be settled or cleared, and the project's question slot is stuck for good"},{"citation":"resolved","description":"(write_foundry_tests 2f3d468c.) The panel check (lines 345-350) never requires agreed <= panelSize or quorum <= panelSize. The fields are signed, so only a buggy or compromised signer could produce such an attestation, and that signer could just sign a consistent yes instead. Adding `|| a.agreed > a.panelSize || a.quorum > a.panelSize` would make a malformed attestation fail closed.","line":346,"path":"src/ProjectRegistry.sol","reproduction":"Read from lines 345-350: an attestation signed by the oracle signer for this registry, with panelSize=15, quorum=11, agreed=40 and answer=true, passes every condition there, and the project is listed. Expected: WrongPanel.","severity":"info","snippet":"            a.chainId != questionChainId || a.panelSize < PANEL_SIZE || a.quorum < QUORUM","title":"onOracleResult does not check that agreed and quorum fit within panelSize"},{"citation":"resolved","description":"(Merged: audit_flow 0f9748d6 and audit_permissions 6f3bf689, one root cause.) ACTION is a constant, intake is immutable, and oracleSigner can only be set by the constructor (_setOracleSigner is internal and nothing exposes it). The oracle-consumer reference expects these to be owner-settable, but the brief chooses no owner, so this is recorded as a trust assumption, not a defect to fix. No funds can be stranded: a challenge bond comes back through expire after a day, and applications hold no funds. But listings freeze as they stand, and the only fix is a new registry.","line":81,"path":"src/ProjectRegistry.sol","reproduction":"Case 1: Intake.priceOf(ACTION, 0x44a1...f89a) returns 0. Then every applyListing and challenge reverts OracleUnavailable at line 309 (`if (fee == 0) revert OracleUnavailable();`). Case 2: the signer rotates to K2. Then _verifyAttestation reverts BadSignature on every answer, expire returns the bond, and no project can be listed or delisted again.","severity":"info","snippet":"    bytes32 public constant ACTION = \"oracle.request@oracle-1\";","title":"Trust assumption (agreed no-owner design): the oracle signer, Intake and action can never be changed, so a signer rotation or retirement of oracle-1 leaves the registry permanently unable to list or d"},{"citation":"resolved","description":"(audit_flow 7c2de576.) The relative window {\"hours\":1} makes questionHash impossible to compute in advance, and onOracleResult never compares a.questionHash. An answer signed for one of this registry's questions is therefore accepted for any other open request of this registry if the writer routes it there. Only the trusted writer can do this; the contract header documents the trust.","line":352,"path":"src/ProjectRegistry.sol","reproduction":"A has an open application with intake id X; B has an open challenge with intake id Y. The Intake calls onOracleResult(Y, aA, sigA), where aA is the signed yes for A's question. Every check passes, B is settled as defended, and the bond goes to B's beneficiary. A's answer is then AlreadyConsumed, and A is cleared by expire.","severity":"info","snippet":"        // The Intake pairs this answer to our question. Also refuse reuse across different asks.","title":"Trust assumption: answers are paired to requests by the Intake writer, not by a pinned questionHash"}],"hash":"477057698a4bf7d982a1995f9ad8f934e9eaa7e8149f9b430391a0ed9ab1b0d9","nodeId":"1fa3ee68-7907-44d0-9167-463db2517ed5","outcome":"completed","summary":"I found nothing that blocks this launch. The registry deploys exactly as `launch.json` lists it, wired as the brief says. I kept two low findings and three info notes, all reproduced against the code, and wrote them with the coverage record to `.imd-findings.json`. No repository files were changed; my scratch tests are deleted.\n\n**Deployment checks:**\n- **Size:** the registry's deployed code is 22,294 bytes (limit 24,576) and its creation code 23,915 bytes (limit 49,152).\n- **Constructor:** it makes no external call, and the manifest's seven arguments match the brief in order.\n- **Tests:** the full `forge test` run passed 199 tests, more than the 172 the brief mentions. The fork tests need an RPC URL, which this machine doesn't have.\n\n**Kept findings:**\n1. **Low – a beneficiary can pre-empt honest challenges (`src/ProjectRegistry.sol:284`).** The beneficiary front-runs each challenge with one of its own. The honest call reverts `AskOpen` without paying, and the bond comes back to the beneficiary whatever the answer. Each round costs only the 0.5 IMD fee. The panel still judges every rule, but the honest challenger's reason never reaches it. My scratch test confirmed it: after 3 rounds the beneficiary was down exactly 1.5 IMD, the honest wallet's balance was unchanged, and the project was still listed.\n2. **Low – a challenger the token won't pay locks the project's question slot for good (`src/ProjectRegistry.sol:424`).** Every path that closes a challenge sends the bond back in the same call. If the token refuses that transfer, the oracle's answer can't be applied and `expire` reverts every time. The project then stays listed with no way to delist it. I ran the specialist's attached proof and it fails on the current code for the stated reason, so I kept it on this finding. This can't happen on Sepolia, where the test IMD is a plain ERC-20; it matters for a token that can block wallets.\n3. **Info – no check that `agreed` and `quorum` are at most `panelSize` (line 346).** A signed answer with 40 agreeing out of 15 would be accepted. Only a faulty or compromised signer could produce one.\n4. **Info – the signer, Intake and action can never be changed.** This is the agreed no-owner design, recorded as a trust assumption. If the signer key rotates or `oracle-1` is retired, nothing can be listed or delisted again without a new registry; no funds get stuck. Two specialists reported this separately and I merged them into one.\n5. **Info – answers are paired to questions by the Intake's writer, not by the question hash.** The contract already documents this trust.\n\n**Coverage:** `setBeneficiary`, `applyListing` and `Stacker.credit` hold. The other five entry points carry the findings above. `Stacker.credit` isn't deployed by this launch; it's the live Stacker at 0x0457…314d.","treeHash":null,"usage":{"cachedInputTokens":693271,"inputTokens":20,"model":"claude-opus-5-5","outputTokens":10594,"runtime":"claude","turns":11,"wallClockMs":136074}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ef5038c1bdac3372","findings":[],"hash":"5a5271b86622a7544b08220e829339e9d261c59bec22f419d65e53912f9a8a6a","nodeId":"27dfd09b-1dfa-4db8-a082-8870f0d6a117","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with an empty findings list and a full coverage record. The working tree is otherwise clean (the scratch test was removed, and `.imd-findings.json` is ignored by git).\n\n**Result: no reproducible economic, invariant or flow-gap defect in the ProjectRegistry.** The test suite passes offline (170 tests, 8 fork tests skipped without an RPC).\n\nWhat I checked in the assigned area:\n- **Value flows.** Every bond pulled has exactly one exit, the bond is immutable, fees are forwarded in the same transaction, and no approval lingers. The suite's accounting invariant confirms the balance equals the open bonds under repricing and donations.\n- **Timers and boundaries.** The cooldown, handoff interval, pending expiry and the answer's TooLate boundary are consistent with each other. The defended bond always reaches the wallet named when the challenge opened, since the beneficiary is locked while a question is open.\n- **Answer routing.** A stranger's paid question signed for this contract arrives under a foreign Intake id and reverts. Failures move only the challenger's own bond, the same outcome expire gives a day later.\n- **Manifest and body.** launch.json has exactly the schema keys and the seven constructor arguments in the brief's order. The emitted body equals the rehearsed version-2 body character for character apart from the consumer address, with all eight rules under 512 characters and a runtime of 22,294 bytes.\n\nRecorded as trust assumptions rather than defects: the fixed signer and action id in an ownerless contract, the writer's ability to withhold answers, and the documented slot-occupancy limit.\n\nNot reached: the live Intake's completion semantics and callback gas (fork tests need an RPC), the off-chain indexer, and the launch policy's gas ceiling against the 35.2M estimate.","treeHash":null,"usage":{"cachedInputTokens":1947965,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":32677,"runtime":"claude","turns":37,"wallClockMs":509087}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5fd2de06561c50a4","findings":[{"citation":"resolved","description":"applyListing is open to anyone and posts no bond (the last argument of _ask is 0), while a project may have only one open question (line 242 reverts AskOpen). A wallet that is not the project's owner can therefore file an application it knows the panel will refuse (wrong beneficiary or a rate that is not the one in force) and refile it the moment the rejection lands, so the real owner's applyListing reverts with AskOpen every time. Each round costs the griefer only the 0.5 IMD fee plus gas and holds the slot for one panel run (about 6 minutes on Sepolia per docs/history.md section 17), or up to PENDING_EXPIRY (1 day) if the writer never answers. Nothing is lost by the owner and nothing is mis-listed, and the griefer must win an ordering race against the owner at every rejection block, so this is a liveness cost, not a loss of funds. The previous audit accepted the challenge-side version of the same slot-taking as a design limit; the application side has no bond to lean on. A fix that adds an application bond refunded on a yes or a failure and forfeited on a no changes the agreed economics (who receives a forfeited bond, and honest applicants would also post it), so it is a scope decision for the owner rather than a one-line change; the cheaper alternative is to leave it and document that an application griefing campaign costs 0.5 IMD per panel round.","line":249,"path":"src/ProjectRegistry.sol","reproduction":"State: project P (any contract), owner O, griefer G, both with IMD approved to the registry. 1) G calls applyListing(P, \"P\", \"https://p.example\", 25, G) -> Applied, slot taken. 2) O calls applyListing(P, \"P\", \"https://p.example\", 50, O) -> reverts AskOpen. 3) The Intake delivers a signed false -> Rejected(P). 4) G repeats step 1 in the same block, before O's retry. Repeating three rounds in test/scratch/Residuals.t.sol::test_applicationSlotGriefing: G's balance falls by exactly 1.5e18 (three fees), P is never listed, and O's three attempts all revert AskOpen. Expected: an owner's application can always be filed within a bounded time or the griefer pays more than the fee; actual: the slot is held indefinitely for 0.5 IMD per panel round.","severity":"low","snippet":"        intakeId = _ask(project, p, _applyBody(project, name, sourceUrl, rateBps, beneficiary), 0);","title":"Applications carry no bond, so one wallet can hold a project's single ask slot for the oracle fee alone"},{"citation":"resolved","description":"Read in full: src/ProjectRegistry.sol (634 lines), src/oracle/OracleAttestation.sol (265), src/Stacker.sol (98, not deployed by this launch), test/mocks/MockIntake.sol, test/mocks/TestIMD.sol, test/RegistrySepoliaFork.t.sol, launch.json, foundry.toml, docs/panel-rules-v2.md, docs/history.md sections 17-22, jobs/8-sepolia-v3-launch.md, test/ADVERSARIAL_COVERAGE.md. Inherited OpenZeppelin code (EIP712, ECDSA, SignatureChecker, SafeERC20, ReentrancyGuard, Strings) was read only at the call sites. Not reachable as source: the live Intake v2 (0xa43e...de82) and IntakeDelivery, and IdentityMD's Sepolia test IMD 0x44a1...f89a; those were checked only through their on-chain behaviour. Checks run: forge test, 164 offline tests pass, 0 fail; the 8 fork tests pass against public Sepolia and mainnet RPCs (live Stacker 0x0457...314d is this build byte for byte; the real Intake v2 takes requestWithFailure, charges exactly 0.5 test IMD, exposes requests(bytes32) as (payer,target,selector,completed) and emits FailureHookSet with 0xa7980e31; onOracleResult listing path costs 99,877 gas). Run 2's live registry 0x3a3b...920e accepted a real signed answer (block 11,896,180, tx 0x6d8c9309...c0d1bd) under the same checks (chainId 1, panelSize 15, quorum 11, agreed 12), so the WrongPanel and chainId thresholds match what the oracle signs. All 8 rules are under 512 bytes (longest feeGuard 472, trading 446 with a 42-char address); applyQuestion and challengeQuestion at maximum inputs are 1,013 and 1,107 bytes (limit 2,000). The deployed runtime is 22,294 bytes with no DELEGATECALL, CALLCODE or SELFDESTRUCT outside push data; the constructor makes no external call; there is no owner, mint, pause, proxy or initializer. Mainnet IMD 0xd34a...63b7 exposes no pause, blacklist or mint selector (52 selectors scanned), so a bond recipient cannot be blocked from receiving; the Sepolia test IMD exposes mint(address,uint256) and the plain ERC20 set only. Sepolia block gas limit is 200M, so the 35.2M deploy estimate fits. launch.json has the schema's three keys, one contract, seven string arguments in constructor order matching the brief, notes under 4,000 characters. Leads checked and rejected with the guard that stops them: compat challenge() front-run by a first setBeneficiary (the handoff sets beneficiaryPinRequired first, so challenge reverts BeneficiaryPinRequired before any payment; test/scratch/Residuals.t.sol); replay of an answer across asks (_consume on the oracle UUID plus projectOfIntake cleared in _close); answer for an expired-then-refiled ask (old intakeId unknown); handoff during an open question (AskOpen first); bond paid twice (state closed before transfers, nonReentrant); reentrancy through the IMD (plain ERC20, no hooks); expire racing the callback (expire inside the day requires completed, which the Intake sets only when it completes). Test edges not exercised by the suite: the ERC-1271 fallback in _verifyAttestation (never reached with the EOA signer; it only matters if the signer is ever a contract), and no test deploys through the protected factory probe with the real launch.json bytes (the fork test deploys directly). No critical, high or medium defect was found; a clean review is not proof that none exists.","line":53,"path":"src/ProjectRegistry.sol","reproduction":"Not a defect. Commands used: forge test; SEPOLIA_RPC_URL=https://ethereum-sepolia-rpc.publicnode.com ETH_RPC_URL=https://ethereum-rpc.publicnode.com forge test --match-path 'test/*Fork.t.sol'; cast logs on 0x3a3bfcb65614292b0ec7c62f9e3a5dac003b920e for Rejected(address,bytes32) from block 11891109; cast call priceOf and callbackGas() on the Intake (0.5e18, 1,000,000); selector scans of the IMD bytecodes; test/scratch/Lengths.t.sol and test/scratch/Opcodes.t.sol for the rule lengths and opcode scan.","severity":"info","snippet":"contract ProjectRegistry is OracleAttestationConsumer, ReentrancyGuard {","title":"Scope and coverage of this review: contracts read, live dependencies reached, leads rejected"}],"hash":"810934b862ddb53e97a830fca9404151961043cc8b3d68b3b4ce303a3a781326","nodeId":"33b83ef0-057a-4433-8050-77aaafc1fdc7","outcome":"completed","summary":"Taylor, the review is done and the findings file is written. Nothing else is pending.\n\n**Outcome:** no critical, high or medium defect in the registry as it arrived. One low finding and one scope note are in `.imd-findings.json`. No repository file was changed. Only the scratch test supporting the low finding sits under test/scratch.\n\n**What I read:** all three contracts in src, the oracle library, the Intake mock, the fork test, launch.json, the panel rules and history sections 17 to 22. The live Intake v2, IntakeDelivery and IdentityMD's Sepolia test IMD have no source in the tree, so I checked them only through on-chain behavior.\n\n**What I verified live:**\n- The 164 offline tests pass, and all 8 fork tests pass against public Sepolia and mainnet RPCs. The live Stacker is this build byte for byte.\n- Run 2's registry accepted a real signed answer at block 11,896,180 with panel 15, quorum 11, agreed 12 and chain 1, so the WrongPanel and chain checks match what the oracle signs.\n- All 8 rules fit under 512 bytes. Longest is feeGuard at 472. Both questions stay under 2,000 at maximum input.\n- The runtime is 22,294 bytes with no DELEGATECALL, CALLCODE or SELFDESTRUCT. Mainnet IMD has no pause or blocklist selector, so a bond recipient cannot be wedged.\n- Sepolia's block gas limit is 200M, so the 35.2M deploy estimate fits.\n\n**The low finding:** applications post no bond, so a griefer can hold a project's single ask slot by refiling a doomed application after each rejection, for 0.5 IMD per panel round. The owner's `applyListing` reverts with AskOpen each time. Nothing is lost or mis-listed. Adding an application bond changes the agreed economics, so I flagged it as an owner decision rather than a required fix.\n\n**Leads rejected:** the un-pinned compat `challenge` cannot be redirected by a front-run handoff, because the handoff sets the pin first and the challenge reverts before paying. Replay, reentrancy, double bond payment, handoff during an open question and the expire race all hit a guard.\n\n**Untested edges worth knowing:** the ERC-1271 fallback in signature verification is never reached with the EOA signer, and no test deploys through the protected factory probe with the real manifest bytes.","treeHash":null,"usage":{"cachedInputTokens":1123207,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":44185,"runtime":"claude","turns":26,"wallClockMs":649013}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1507f63d3f1b973a","findings":[{"citation":"resolved","description":"Execution-trace / operation-interleaving sibling of the handoff front-run the first audit fixed. A project has one question slot; `_challenge` refuses any second challenge with AskOpen before any payment. A beneficiary that watches the mempool can front-run an honest `challengeForBeneficiary(project, reason, beneficiary)` with its own `challengeForBeneficiary(project, \"routine check\", beneficiary)`. The honest transaction reverts unpaid; the panel is asked with the beneficiary's reason, never the challenger's. The beneficiary's bond always returns to itself: on \"yes\" `onOracleResult` pays it to `p.beneficiary` (line 372), on \"no\" to `asker` (line 377), and on a failure or `expire` to `asker` (line 424). So each cycle costs the beneficiary exactly the 0.5 IMD oracle fee, and it can repeat on every later attempt (the cooldown does not restart, so the slot reopens as soon as the self-challenge settles, and the race recurs). The question text tells the panel to check every rule regardless, so the project is still judged; what is lost is the challenger's hint (`[REASON]...[/REASON]`), which is the only channel for pointing a 15-agent panel at a subtle violation (for example a specific rescue function that lets the owner withdraw 'locked' liquidity). Unlike the fixed handoff variant it cannot refuse the question itself, hence low. test/RegistryRevisionRegression.t.sol:405 documents the slot occupation but not the repeatable front-run or the zero bond risk. Possible mitigations that keep the agreed design: let a second challenger attach a reason to an open challenge (one extra event, no second question), or treat a challenge whose asker equals the beneficiary (or a defended challenge) as not returning the bond to the asker/beneficiary but to the next challenger; both are design calls for the author.","line":284,"path":"src/ProjectRegistry.sol","reproduction":"State: project P listed, beneficiary B, cooldown elapsed, B holds >= 5.5 IMD approved to the registry. Sequence per cycle: (1) honest wallet H broadcasts challengeForBeneficiary(P, \"owner withdraws locked LP via rescue()\", B); (2) B front-runs with challengeForBeneficiary(P, \"routine check\", B) -> pulls 0.5 IMD fee + 5 IMD bond, p.ask = Challenge; (3) H's tx executes: line 284 reverts AskOpen, H pays nothing and no question carrying H's reason is filed (intake.bodyOf(id) contains \"[REASON]routine check[/REASON]\"); (4) panel answers yes -> onOracleResult transfers the 5 IMD bond to p.beneficiary == B; project stays listed, challengeOpenAt unchanged. Repeat on every later honest attempt. Expected: a challenger naming the wallet in force gets its question filed (the property test/RegistryHandoffInterval.t.sol:107 states). Actual: after 3 cycles B is down exactly 1.5 IMD (fees only), H still holds its full balance and no question with H's reason ever reached the panel. Verified with a scratch Foundry test against MockIntake (3 cycles: B's balance delta == 3 * 0.5e18, H's balance unchanged, every filed body carried B's reason).","severity":"low","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"Beneficiary can pre-empt every honest challenge's reason by front-running with a self-challenge, at 0.5 IMD per cycle and never risking the bond"},{"citation":"resolved","description":"The brief asks for no owner and the manifest deploys it that way, so this is the agreed design, documented here as the oracle-consumer reference asks ('every one of these is constructor input and owner-settable, never a constant'). ACTION is a constant and intake/oracleAsset are immutable. `_ask` reads `intake.priceOf(ACTION, oracleAsset)` live and reverts OracleUnavailable when it is 0. If IdentityMD retires `oracle.request@oracle-1` (a version `oracle-2`), stops selling in the Sepolia test IMD 0x44a1...f89a, or replaces Intake v2 at that address, every `applyListing` and `challenge`/`challengeForBeneficiary` reverts before payment, nothing new can be listed, and every currently listed project stays listed with no way to delist it (only an answered challenge clears `listed`). The Stacker never reads the registry, so the mitigation is a replacement registry plus an indexer switch, not a loss of funds; no bond can be stranded because a bond is only held while a question is open, and `expire` still works without the Intake after a day. test/RegistryAuditRegression.t.sol:86 covers the revert path.","line":309,"path":"src/ProjectRegistry.sol","reproduction":"State: Intake.priceOf(bytes32(\"oracle.request@oracle-1\"), 0x44a1...f89a) returns 0 (action retired or asset changed by the Intake owner 0x047F...54B7 read live on Sepolia). Call applyListing(anyContract, \"P\", \"https://p.example\", 50, wallet) or challengeForBeneficiary(listedProject, \"r\", itsBeneficiary): expected per the reference, a consumer that can be re-pointed; actual, revert OracleUnavailable at line 309 forever, with listed projects frozen as listed.","severity":"info","snippet":"        if (fee == 0) revert OracleUnavailable();","title":"Trust assumption: with no owner, a retired `oracle-1` action or a moved price asset leaves the registry permanently unable to list or delist"},{"citation":"resolved","description":"Documented in the contract header and inherent to the relative window ({\"hours\":1}) the body uses, which makes `questionHash` uncomputable in advance (oracle-consumer reference). `onOracleResult` checks the sender, that the intake id is its own open request, the signature for this contract, issuedAt after the ask, chain 1 and the 15/11 panel, and consumes `a.requestId`; it never compares `a.questionHash` to the question it paid for. A signed attestation for any question this registry asked is therefore accepted for any other open request of this registry whose ask is within a day. Only the writer (a trusted role) can route an answer to the wrong intake id, so this is recorded as the trust boundary the design accepts, not a defect; it is the same for mainnet. Noted because the Sepolia run is meant to exercise exactly this pairing live (applications, a listing and a challenge).","line":353,"path":"src/ProjectRegistry.sol","reproduction":"State: project A has an open application (intake id X), project B has an open challenge (intake id Y), both asked within the last day. The writer calls onOracleResult(Y, a, sig) where `a` is the oracle's signed 'true' for A's question (requestId UUID_A, chainId 1, 15/11/13, issuedAt now). Expected: refused as an answer to a different question. Actual: every check passes, UUID_A is consumed, B's challenge is settled as defended and the 5 IMD bond goes to B's beneficiary; A's application later gets UnknownRequest/AlreadyConsumed and must be cleared by expire after a day.","severity":"info","snippet":"        _consume(a.requestId);","title":"Trust assumption: the answer is bound to the request only by the Intake writer's pairing, not by a pinned questionHash"}],"hash":"a51ff3c1b0eb9cd61cfaafcc7fe18c6f1e4fd0928ff9e6c1bd8feae63b17abd7","nodeId":"5635c683-80fb-4e56-8302-b054003acdbd","outcome":"completed","summary":"The review is complete. The findings file is valid JSON with 3 findings and 13 coverage rows, the scratch test is removed, and the working tree has no stray files (the findings file is excluded by the repository's own git exclude rules, as intended).\n\n**Outcome: no critical, high or medium defect in the registry's control flow.** The entry points behave as the brief specifies, and I verified the live dependencies rather than assuming them.\n\n**What I checked**\n\n- All 170 offline tests pass, and I ran the 8 fork tests against public Sepolia and mainnet RPCs. All 8 pass. The live Intake sells the question for 0.5 test IMD, gives callbacks 1,000,000 gas, and its `requests` getter returns the 4-word layout the registry decodes.\n- The oracle library matches the canonical copy in struct, type string, domain and hashing. It differs only in formatting and an ECDSA-first signature check that is a superset of the canonical one. The conformance vector passes.\n- The Intake completes a request and attempts the callback in the same transaction on Sepolia. I confirmed this from a completion transaction on the test run 2 registry, so the early `expire` path cannot be raced.\n- The manifest lists one contract with the seven agreed arguments in order, the constructor makes no external call, and no workflow files exist.\n- Question bodies stay within every paid-door limit at maximum text lengths, and the rules text matches the rehearsal body.\n\n**Findings written**\n\n1. **Low.** A beneficiary can front-run every honest challenge with a self-challenge carrying its own reason. The honest transaction reverts before paying, and the beneficiary's bond always returns to itself, so each cycle costs it only the 0.5 IMD fee. The project is still judged, but the challenger's hint never reaches the panel. I confirmed the sequence with a scratch Foundry test over three cycles. This is the sibling of the handoff front-run the first audit fixed, and it needs a design decision rather than a code patch.\n2. **Info.** With no owner, a retired `oracle-1` action or a moved price asset leaves the registry permanently unable to list or delist. This is the agreed design, recorded as a trust assumption.\n3. **Info.** The answer is bound to the request only by the Intake writer's pairing, since the relative window makes the question hash uncomputable in advance. Recorded as the accepted trust boundary.\n\nThe findings for the application, challenge, failure, result, expire and handoff entry points, plus the live Stacker's credit path, each have a coverage row.","treeHash":null,"usage":{"cachedInputTokens":1514970,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":41332,"runtime":"claude","turns":46,"wallClockMs":619747}},{"artifacts":[],"attempt":1,"bundleHash":"5099b7ad4e20dad53a1867cb77306efc391ea81ad4dcda158b5b0b8ab5a905d2","device":"bdd9b74dce66953d","findings":[{"description":"Every path that closes a challenge pushes the bond with safeTransfer in the same call: to the challenger on a delisting (line 377), on a failure (line 396) and on expire (lines 402-427). If the oracle asset refuses a transfer to the challenger's wallet (a blocklist, a pause that outlives the day, a wallet the token freezes), the delivery callback reverts inside the Intake's try, and then `expire` reverts too, every time, because `_clear` must pay the challenger before it can clear the ask. The project's slot stays `Ask.Challenge` indefinitely: no new challenge (AskOpen), no beneficiary handoff (AskOpen), no delisting, and the project stays listed and earning points with no way left to remove it. A listed project's team could buy this immunity if the token's issuer can be made to block one of their own wallets. This does not affect Sepolia test run 3: the Sepolia test IMD 0x44a1...f89a is a plain mintable ERC-20 with no blocklist or pause, so the condition cannot arise there. It matters if the mainnet IMD (0xd34a...63b7) or any future oracle asset gates transfers; a pull-based refund (record the owed bond, let the challenger withdraw it) would make clearing independent of the transfer. The beneficiary side is already graceful: a defended bond that cannot be paid fails the callback, and `expire` returns it to the challenger (test/RegistryPayoutEdges.t.sol).","line":424,"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\ncontract BlocklistIMD is ERC20 {\n    mapping(address => bool) public blocked;\n    constructor() ERC20(\"Blocklist IMD\", \"bIMD\") {}\n    function mint(address to, uint256 amount) external { _mint(to, amount); }\n    function block_(address who, bool on) external { blocked[who] = on; }\n    function _update(address from, address to, uint256 value) internal override {\n        require(!blocked[to], \"blocked\");\n        super._update(from, to, value);\n    }\n}\n\ncontract Intake is IIntake {\n    bytes32 constant ACTION = \"oracle.request@oracle-1\";\n    struct Req { address target; bytes4 sel; bytes4 onFailure; bool completed; }\n    mapping(bytes32 => Req) r;\n    uint256 n;\n    function priceOf(bytes32 action, address) external pure returns (uint256) { return action == ACTION ? 0.5e18 : 0; }\n    function requestWithFailure(bytes32, bytes calldata, Callback calldata cb, bytes4 onFailure, address asset, uint256 amount) external returns (bytes32 id) {\n        IERC20(asset).transferFrom(msg.sender, address(0x7EA5), amount);\n        id = keccak256(abi.encode(++n));\n        r[id] = Req(cb.target, cb.selector, onFailure, false);\n    }\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) { return (address(0), r[id].target, r[id].sel, r[id].completed); }\n    function deliver(bytes32 id, OracleAttestation.Attestation calldata a, bytes calldata sig) external returns (bool ok) {\n        r[id].completed = true;\n        (ok,) = r[id].target.call{gas: 200_000}(abi.encodeWithSelector(r[id].sel, id, a, sig));\n    }\n}\n\ncontract Project {}\n\n/// Fails on the current code: a challenger the token refuses to pay can never have its\n/// challenge cleared, so the project's slot is frozen. Passes once clearing a question no\n/// longer depends on paying the challenger in the same call (for example a pull-based refund).\ncontract BlockedChallengerFreezesSlotTest is Test {\n    uint256 constant KEY = 0xA11CE;\n    Intake intake;\n    BlocklistIMD imd;\n    ProjectRegistry reg;\n    address project;\n    address applicant = makeAddr(\"applicant\");\n    address challenger = makeAddr(\"challenger\");\n    address beneficiary = makeAddr(\"beneficiary\");\n    uint256 uuid;\n\n    function setUp() public {\n        vm.roll(1000);\n        vm.warp(1_700_000_000);\n        intake = new Intake();\n        imd = new BlocklistIMD();\n        reg = new ProjectRegistry(address(intake), address(imd), address(0x57AC), vm.addr(KEY), 1, 5e18, 1 hours);\n        project = address(new Project());\n        imd.mint(applicant, 100e18);\n        imd.mint(challenger, 100e18);\n        vm.prank(applicant);\n        imd.approve(address(reg), type(uint256).max);\n        vm.prank(challenger);\n        imd.approve(address(reg), type(uint256).max);\n    }\n\n    function _att(bool yes) internal returns (OracleAttestation.Attestation memory a) {\n        a.requestId = bytes32(++uuid << 128);\n        a.chainId = 1;\n        a.answer = abi.encode(yes);\n        a.panelSize = 15;\n        a.quorum = 11;\n        a.agreed = 11;\n        a.issuedAt = uint64(block.timestamp);\n        a.expiresAt = uint64(block.timestamp + 1 days);\n    }\n\n    function _sig(OracleAttestation.Attestation memory a) internal view returns (bytes memory) {\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(KEY, reg.attestationDigest(a));\n        return abi.encodePacked(r, s, v);\n    }\n\n    function test_blockedChallengerCannotFreezeTheSlot() public {\n        vm.prank(applicant);\n        bytes32 id = reg.applyListing(project, \"P\", \"https://x.example/p\", 50, beneficiary);\n        OracleAttestation.Attestation memory a = _att(true);\n        assertTrue(intake.deliver(id, a, _sig(a)));\n        assertTrue(reg.isListed(project));\n        vm.warp(block.timestamp + 1 hours);\n        vm.prank(challenger);\n        id = reg.challenge(project, \"Review.\");\n        imd.block_(challenger, true);\n\n        // A signed 'no' cannot be settled (the bond refund reverts) and the Intake does not retry.\n        a = _att(false);\n        intake.deliver(id, a, _sig(a));\n\n        // Expected: the question can still be cleared, by anyone, once the Intake completed it\n        // or after a day. Actual on the current code: expire reverts with the token's error.\n        vm.warp(block.timestamp + 2 days);\n        reg.expire(project);\n        assertEq(uint8(reg.projectOf(project).ask), uint8(ProjectRegistry.Ask.None), \"slot cleared\");\n        // And the project is challengeable again.\n        vm.prank(applicant);\n        reg.challengeForBeneficiary(project, \"Again.\", beneficiary);\n    }\n}","reproduction":"Registry on an ERC-20 that reverts transfers to a blocked address. List a project; after the cooldown, challenger C calls challenge(); the token then blocks C. Deliver a signed 'no' through the Intake: expected the project is delisted or at least the question can be cleared; actual the callback reverts (bond to C fails), the Intake marks the request completed, and expire(project) reverts with the token's error both before and after the one-day deadline. challengeForBeneficiary and setBeneficiary both revert AskOpen forever after.","severity":"low","title":"A challenger the oracle asset refuses to pay freezes the project's question slot for good"},{"description":"The panel check requires panelSize >= 15, quorum >= 11, agreed >= 11 and agreed >= quorum, but not agreed <= panelSize or quorum <= panelSize. An attestation with panelSize 15, quorum 11, agreed 40 is accepted and lists the project. The fields are signed by the oracle signer, so only a buggy or compromised attester can produce one, and such an attester could sign a plain consistent 'yes' anyway, so nothing is gained by the inconsistency. Recorded for completeness: a one-line sanity check (agreed <= panelSize) would make a malformed attestation fail closed instead of settling. No test asserts the current acceptance.","line":345,"path":"src/ProjectRegistry.sol","reproduction":"Open an application; deliver through the Intake an attestation signed by the oracle signer for this registry with panelSize=15, quorum=11, agreed=40, answer=true. Expected: refused as an impossible panel (WrongPanel). Actual: accepted; the project is listed.","severity":"info","title":"onOracleResult does not check that the signed agreement fits the signed panel"}],"hash":"a72062e227eccfe1339e83d756fe4c0e9de89788c9e2bfdc25b5a60781ba3d6f","nodeId":"0c0d2ee5-f54d-4781-b93f-a3f3d34d44ee","outcome":"completed","summary":"The findings file is in place and valid; git hides it by the repository's own exclude rule, which is how the network collects it. Everything is done and verified.\n\n## Summary\n\n**Delivered.** Three new test files under `test/`, 29 tests, plus the coverage table entry. The full suite passes:\n\n| Run | Result |\n| --- | --- |\n| `forge build` | clean |\n| `forge test` | 201 passed, 0 failed, 8 fork tests skipped (no RPC) |\n\n**What the new tests cover**\n\n- **test/RegistrySepoliaRun3.t.sol** deploys the registry from launch.json's own arguments on chain 11155111, with test doubles etched at the live Intake and test-IMD addresses. It checks the fee is read live from the Intake address, the body routes to chain 1 while naming Sepolia, the live Stacker and this registry, and the eight version-2 rules match the spec in docs/panel-rules-v2.md character for character. Since the oracle's key is not ours, it proves nothing else can settle: a fuzzed set of other keys, another registry's or chain's signature, and every plausible setter all fail. Refusals, split panels, expiry and challenges on unlisted projects run with the Sepolia bond and cooldown.\n- **test/RegistrySignerAuthority.t.sol** covers the signature verification branches no earlier test reached: high-s, compact and zero-based-v encodings, every single-bit corruption, a signer key with delegated code, an ERC-1271 key registry that accepts and rotates, reverting or malformed contract signers, and an attacker's own 1271 contract.\n- **test/RegistryPayoutEdges.t.sol** covers a payout the token refuses, panels larger than asked, fuzzed panel-field boundaries, a zero-bond registry and two registries sharing one signer.\n\n**Two findings reported in .imd-findings.json**, neither affecting this Sepolia run:\n\n- **Low:** a challenger whose wallet the oracle asset refuses to pay freezes the project's slot forever, because every clearing path pushes the bond in the same call and `expire` reverts with it. The Sepolia test IMD has no blocklist or pause, so this cannot happen in test run 3. It matters if the mainnet IMD gates transfers. The attached proof test fails on the current code with the token's error.\n- **Info:** the panel check does not require `agreed` to fit `panelSize`, so a signed but impossible panel is accepted.\n\n**Still owed to live state:** the 8 fork tests, including the one that checks the real Intake's `requests()` getter shape, need `SEPOLIA_RPC_URL` and `ETH_RPC_URL` and were skipped here. The README deployment-table entry is outside the paths this task may write.","treeHash":"9f8b097a606f5a385abf35b3ea70590f960af581","usage":{"cachedInputTokens":2130300,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":49214,"runtime":"claude","turns":46,"wallClockMs":772511}},{"artifacts":[],"attempt":1,"bundleHash":"f44062e8fbf01fc412522fccedccd99f251739fbe3afd55f263f8908f192b094","device":"a7b8747ac077deb9","findings":[],"hash":"eab6ec479f461f45dfbcf369487e018cd190e54b06126862271d636ec6c1b6d7","nodeId":"9a225bc1-2b8f-4603-ba1f-ea6325481331","outcome":"completed","summary":"Everything is green. The deliverable is complete.\n\n**Outcome.** The registry ships as it arrived: no change to `src/`, `launch.json`, or the build configuration, and nothing added under `.github`. Build is clean. The offline suite passes with an empty environment, and the 8 fork tests pass against live Sepolia and mainnet through public nodes.\n\n| Check | Result |\n|---|---|\n| Offline tests (delivered tree) | 170 pass, 8 fork tests skipped |\n| Fork tests with RPC URLs set | 8 pass (Sepolia block 11,897,092) |\n| Registry runtime | 22,294 bytes, no forbidden opcodes |\n\n**Audit finding 4bc1aedb (low, slot griefing).** It reproduces exactly as described: three refused applications cost the griefer 1.5 test IMD and block the project's own application each round. I kept the contract unchanged, since the brief fixes the source and the audit itself says an application bond is an owner economics decision. The cost and the one-day bound are now pinned by five tests in `test/RegistryApplicationSlot.t.sol` and stated in the design doc's known limits. The info finding needed no change.\n\n**Files changed**\n- `ADAPTATION.md` (new): every rule checked, the audit decisions, each change and its reason, the checks run.\n- `test/RegistryApplicationSlot.t.sol` (new): the finding's reproduction, refusal and failure freeing the slot at once, the day-long expiry bound, and a fuzz that refused terms never reach a listing.\n- `test/Deployment.t.sol`: a new rehearsal reads the seven arguments from launch.json, deploys the registry through CREATE2 on an empty Sepolia-id chain, and checks the predicted address, wiring to the live Stacker, runtime limits, and the absence of an owner.\n- `docs/design.md`: the spam limit now states the one-day bound and why no bond is added.\n- `README.md`: a \"Sepolia test run 3 (launching)\" section with the registry row, address left open until deployment.\n\n**Left for after deployment.** The README row's address and explorer verification can only be filled in once the registry is live, and the test-run-2 site still points at the run-2 registry.","treeHash":"141c46bb9a0481ca501026f0cb93d42cacf3cdd6","usage":{"cachedInputTokens":1049867,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":22087,"runtime":"claude","turns":37,"wallClockMs":468719}}],"verification":[{"checks":[{"durationMs":23823,"exitCode":0,"name":"build","output":"Compiling 80 files with Solc 0.8.26\nSolc 0.8.26 finished in 23.56s\nCompiler run successful!\n","passed":true},{"durationMs":10137,"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 1.02ms (100.02µ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 1.96ms (255.49µ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 2.10ms (1.52ms 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 2.13ms (94.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.39ms (3.53ms 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 8.19ms (3.96ms 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 9.89ms (464.70µ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 9.73ms (5.56ms 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 9.72ms (354.01µ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 9.71ms (321.73µ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 13.64ms (11.78ms 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 34.38ms (17.97ms CPU time)\n\nRan 5 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 26022)\n[PASS] test_launchManifest_knownShape() (gas: 26446)\n[PASS] test_launchManifest_registryDeploysThroughFactoryOnEmptySepolia() (gas: 13245660)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 7895826)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4218009)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 81.17ms (94.50ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392311, ~: 392118)\nLogs:\n  Bound result 503402767245\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 368481, ~: 368861)\nLogs:\n  Bound result 90000000000000000000\n  Bound result 301\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430205, ~: 430230)\nLogs:\n  Bound result 301\n  Bound result 90000000000000000000\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 506.36ms (532.57ms CPU time)\n\nRan 5 tests for test/RegistryApplicationSlot.t.sol:RegistryApplicationSlotTest\n[PASS] testFuzz_refusedTermsNeverReachTheListing(uint16,address) (runs: 256, μ: 5825503, ~: 5825691)\nLogs:\n  Bound result 36\n\n[PASS] test_applicationSlotCostsTheFullFeePerPanelRound() (gas: 11806825)\n[PASS] test_completedButUndeliveredGriefingRoundIsClearedWithinTheDay() (gas: 5778188)\n[PASS] test_failedGriefingRoundFreesTheSlotAtOnce() (gas: 5787997)\n[PASS] test_unansweredGriefingRoundIsClearedByAnyoneAfterADay() (gas: 5868453)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 550.78ms (548.20ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950290, ~: 2950111)\nLogs:\n  Bound result 2389\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 1.01s (1.03s CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976816, ~: 976754)\nLogs:\n  Bound result 99999000062220299039753\n  Bound result 14\n  Bound result 84678\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935080, ~: 2930169)\nLogs:\n  Bound result 58\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 1.31s (1.84s 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     | 391   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 432   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 402   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 394   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 429   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2811760177\n  Bound result 978325343293618674393\n  Bound result 2202\n  Bound result 1436\n  Bound result 77000000000000000000\n  Bound result 1800000000\n  Bound result 218406928001190710901\n  Bound result 148179719135876748244697\n  Bound result 8\n  Bound result 242\n  Bound result 1423044924\n  Bound result 75\n  Bound result 14861\n  Bound result 4\n  Bound result 7\n  Bound result 999990000000000000000000\n  Bound result 3588\n  Bound result 1785289048\n  Bound result 48\n  Bound result 10060\n  Bound result 7\n  Bound result 10\n  Bound result 200\n  Bound result 4921\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.35s (1.34s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3442351, ~: 3409463)\nLogs:\n  Bound result 13\n  Bound result 15\n  Bound result 96\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6451687, ~: 6396405)\nLogs:\n  Bound result 25\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 1.39s (1.97s 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, μ: 6945051, ~: 6945301)\nLogs:\n  Bound result 26\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084058, ~: 3083765)\nLogs:\n  Bound result 341\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 1.39s (3.96s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6227552, ~: 6227689)\nLogs:\n  Bound result 84061\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3160044, ~: 3157969)\nLogs:\n  Bound result 2607\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 1.39s (2.11s CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229793, ~: 229574)\nLogs:\n  Bound result 1000000000000000000000000\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1570290, ~: 1370521)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388754, ~: 388695)\nLogs:\n  Bound result 13627\n  Bound result 9235\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 736949, ~: 761704)\nLogs:\n  Bound result 14949367323769157472283\n  Bound result 1806\n  Bound result 16914051133046082246\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 681848, ~: 688814)\nLogs:\n  Bound result 14949367323769157472283\n  Bound result 1806\n  Bound result 16914051133046082246\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 491725, ~: 510495)\nLogs:\n  Bound result 22862\n  Bound result 13627\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 1.39s (3.71s CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 281257, ~: 55495)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 416534, ~: 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 1.39s (128.85ms CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243043, ~: 6243001)\nLogs:\n  Bound result 29732200092909\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6327355, ~: 6334195)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4720376, ~: 3278654)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121956, ~: 6121713)\nLogs:\n  Bound result 7\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 1.39s (5.52s 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            | 264   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 254   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 263   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 256   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 249   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 248   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 258   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 256   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 158800\n  Bound result 7000\n  Bound result 27395\n  Bound result 10\n  Bound result 91912\n  Bound result 25\n  Bound result 10836\n  Bound result 10\n  Bound result 25\n  Bound result 11103\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 1.67s (1.67s 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        | 497   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 504   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 461   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 483   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 448   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 447   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 459   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 463   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 502   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 461   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 478   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 470   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 471   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 999000000000000000000\n  Bound result 7\n  Bound result 49\n  Bound result 1500000000000000000\n  Bound result 16864\n  Bound result 5613470191030444268687\n  Bound result 20098\n  Bound result 1425\n  Bound result 1\n  Bound result 1800003600\n  Bound result 200000\n  Bound result 18215052983712225998425\n  Bound result 1019359806\n  Bound result 26\n  Bound result 52100049362\n  Bound result 3\n  Bound result 10000000000000000000000\n  Bound result 6894\n  Bound result 999000000000000000000\n  Bound result 800000000000000000\n  Bound result 20365\n  Bound result 7\n  Bound result 17346\n  Bound result 999991\n  Bound result 1629640314061770373992\n  Bound result 217449169479\n  Bound result 18088805308540387328\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 7.89s (7.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                  | 1784  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1897  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1940  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1716  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1815  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1811  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1753  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1865  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1803  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6774\n  Bound result 47\n  Bound result 9545\n  Bound result 14155\n  Bound result 4410\n  Bound result 102414\n  Bound result 8\n  Bound result 1349273430401263944\n  Bound result 2961\n  Bound result 7061\n  Bound result 10532\n  Bound result 32\n  Bound result 33\n  Bound result 93\n  Bound result 15\n  Bound result 32\n  Bound result 0\n  Bound result 45\n  Bound result 23890\n  Bound result 1\n  Bound result 26\n  Bound result 826074472\n  Bound result 18736\n  Bound result 31\n  Bound result 2\n  Bound result 49\n  Bound result 1797\n  Bound result 1294\n  Bound result 1378898258\n  Bound result 81\n  Bound result 5\n  Bound result 34\n  Bound result 0\n  Bound result 25\n  Bound result 1030\n  Bound result 24041\n  Bound result 2\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 9.85s (9.89s CPU time)\n\nRan 27 test suites in 9.86s (32.66s CPU time): 170 tests passed, 0 failed, 8 skipped (178 total tests)\n","passed":true},{"durationMs":158,"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,\".gitignore\":4,\"ADAPTATION.md\":76,\"NEXT_SESSION.md\":66,\"README.md\":250,\"app.js\":1368,\"docs/design.md\":304,\"docs/explainer.html\":247,\"docs/history.md\":218,\"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/8-sepolia-v3-launch.md\":13,\"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,\"jobs/requests/8-sepolia-v3-launch.json\":31,\"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\":195,\"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/RegistryApplicationSlot.t.sol\":111,\"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":"051206e6986642dd8d6515c93b70b428a5a2aac6207dd62e652a268d799764b4","verifiedTreeHash":"328b242203f75af4ae8fdfe06e83cbbbef255449","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":10517,"exitCode":0,"name":"build","output":"Compiling 83 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.40s\nCompiler run successful!\n","passed":true},{"durationMs":5080,"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 290.29µs (40.15µ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 450.41µs (32.85µ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 521.23µs (74.58µ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 775.40µs (618.53µ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 2.49ms (881.62µ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.61ms (169.64µ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.90ms (398.19µ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 6.45ms (352.02µ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 7.18ms (210.22µ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 7.93ms (343.28µ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 17.87ms (20.81ms 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 19.70ms (1.50ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950300, ~: 2950099)\nLogs:\n  Bound result 1573\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 116.08ms (119.76ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392228, ~: 392094)\nLogs:\n  Bound result 12\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 368256, ~: 368861)\nLogs:\n  Bound result 1288936539220608164\n  Bound result 465335\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430194, ~: 430206)\nLogs:\n  Bound result 465335\n  Bound result 1288936539220608164\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 157.18ms (224.32ms CPU time)\n\nRan 6 tests for test/RegistryPayoutEdges.t.sol:RegistryPayoutEdgesTest\n[PASS] testFuzz_panelBoundaries(uint16,uint16,uint16) (runs: 500, μ: 2950376, ~: 2945134)\nLogs:\n  Bound result 17\n  Bound result 13\n  Bound result 14\n\n[PASS] test_blockedApplicant_canStillBeAnsweredAndListed() (gas: 4023487)\n[PASS] test_blockedBeneficiary_defenceFailsButTheBondIsNotStranded() (gas: 10127802)\n[PASS] test_largerPanelThanAskedIsAccepted() (gas: 2976525)\n[PASS] test_twoRegistriesDoNotShareAnswersOrConsumption() (gas: 8790101)\n[PASS] test_zeroBondRegistry_neverTransfersOnSettlement() (gas: 8835110)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 195.01ms (209.42ms CPU time)\n\nRan 5 tests for test/RegistryApplicationSlot.t.sol:RegistryApplicationSlotTest\n[PASS] testFuzz_refusedTermsNeverReachTheListing(uint16,address) (runs: 256, μ: 5825510, ~: 5825691)\nLogs:\n  Bound result 95\n\n[PASS] test_applicationSlotCostsTheFullFeePerPanelRound() (gas: 11806825)\n[PASS] test_completedButUndeliveredGriefingRoundIsClearedWithinTheDay() (gas: 5778188)\n[PASS] test_failedGriefingRoundFreesTheSlotAtOnce() (gas: 5787997)\n[PASS] test_unansweredGriefingRoundIsClearedByAnyoneAfterADay() (gas: 5868453)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 309.78ms (315.72ms 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     | 406   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 406   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 417   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 422   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 397   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 7\n  Bound result 500000000000000000\n  Bound result 1511535\n  Bound result 520\n  Bound result 999000000000000000000\n  Bound result 90000000000000000000\n  Bound result 2270\n  Bound result 128\n  Bound result 841654492002783786248\n  Bound result 3\n  Bound result 6\n  Bound result 9\n  Bound result 13065\n  Bound result 999995000000000000000000\n  Bound result 2\n  Bound result 10\n  Bound result 659918\n  Bound result 14924\n  Bound result 4\n  Bound result 100000000000000000000000\n  Bound result 6\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 648.25ms (645.78ms CPU time)\n\nRan 13 tests for test/RegistrySepoliaRun3.t.sol:RegistrySepoliaRun3Test\n[PASS] testFuzz_applicationRateReachesThePanelTwice(uint16) (runs: 300, μ: 3090468, ~: 3090637)\nLogs:\n  Bound result 26\n\n[PASS] testFuzz_noOtherKeyCanSettle(uint256) (runs: 300, μ: 3081198, ~: 3081179)\nLogs:\n  Bound result 37445970048330436346868124157198438\n\n[PASS] test_answerSignedForAnotherRegistryOrAnotherChainIsRefused() (gas: 2948065)\n[PASS] test_applicationBody_namesSepoliaTheLiveStackerAndThisRegistry() (gas: 3107444)\n[PASS] test_applicationDefinitions_areVersionTwoVerbatim() (gas: 3139659)\n[PASS] test_challengeOnAnUnlistedProjectMovesNothing() (gas: 2991863)\n[PASS] test_failureCallbackFitsMainnetGasToo() (gas: 2905300)\n[PASS] test_failureFromAnyoneButTheIntakeIsRefused() (gas: 2912936)\n[PASS] test_manifestWiring_andTheFeeIsReadLiveFromTheIntakeAddress() (gas: 3017053)\n[PASS] test_noOwnerAndNoWayToRotateTheSignerOrTheWiring() (gas: 157295)\n[PASS] test_refusedApplication_spendsTheFeeAndFreesTheProject() (gas: 5720624)\n[PASS] test_splitPanel_clearsWithoutListing_andTheProjectCanAskAgain() (gas: 5648144)\n[PASS] test_unansweredApplication_isClearedByAnyoneAfterADay() (gas: 2937849)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 660.84ms (338.98ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229746, ~: 229550)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1527425, ~: 1370491)\nLogs:\n  Bound result 9\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388738, ~: 388683)\nLogs:\n  Bound result 17953\n  Bound result 512\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 740477, ~: 761704)\nLogs:\n  Bound result 127\n  Bound result 1000000000000000000\n  Bound result 7000000000000000000\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682874, ~: 688802)\nLogs:\n  Bound result 38060925312011009866090\n  Bound result 81466009824870360174034\n  Bound result 2\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 490877, ~: 510391)\nLogs:\n  Bound result 3600\n  Bound result 11167\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 660.78ms (1.20s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6227541, ~: 6227689)\nLogs:\n  Bound result 72000\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3159908, ~: 3157969)\nLogs:\n  Bound result 84861\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 660.86ms (884.04ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 282715, ~: 55531)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 438245, ~: 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 660.96ms (93.11ms CPU time)\n\nRan 10 tests for test/RegistrySignerAuthority.t.sol:RegistrySignerAuthorityTest\n[PASS] testFuzz_anyCorruptedSignatureIsRefused(uint16) (runs: 500, μ: 2952638, ~: 2952396)\nLogs:\n  Bound result 2\n\n[PASS] test_attackersOwnContractSignerIsNeverConsulted() (gas: 3318399)\n[PASS] test_bareKeySigner_hasNoContractPath() (gas: 2938087)\n[PASS] test_compactSignatureIsRefused() (gas: 2931992)\n[PASS] test_erc1271Signer_acceptsItsListedKeyAndRotatesWithoutRedeploy() (gas: 6602002)\n[PASS] test_erc1271Signer_revertingOrMalformedAnswersAreRefusals() (gas: 6149395)\n[PASS] test_malleableHighSSignatureIsRefused() (gas: 3038086)\n[PASS] test_noFunctionChangesTheSigner() (gas: 91441)\n[PASS] test_signerKeyWithDelegatedCodeStillSettlesByECDSA() (gas: 6028120)\n[PASS] test_zeroBasedVIsRefused() (gas: 2927612)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 660.94ms (666.93ms CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8877201, ~: 8880099)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6006999, ~: 6012617)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945094, ~: 6945303)\nLogs:\n  Bound result 64\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084050, ~: 3083765)\nLogs:\n  Bound result 65\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 660.92ms (1.36s CPU time)\n\nRan 5 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 26022)\n[PASS] test_launchManifest_knownShape() (gas: 25116)\n[PASS] test_launchManifest_registryDeploysThroughFactoryOnEmptySepolia() (gas: 13239423)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 7895826)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4218009)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 661.16ms (62.94ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976794, ~: 976766)\nLogs:\n  Bound result 99999000000000000024035\n  Bound result 3041954474\n  Bound result 13955\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935153, ~: 2930169)\nLogs:\n  Bound result 53976926\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 660.94ms (1.13s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243034, ~: 6242989)\nLogs:\n  Bound result 29192932184790322450354630452002825890452273\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6327864, ~: 6334461)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4797801, ~: 6257252)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121957, ~: 6121713)\nLogs:\n  Bound result 23\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 661.17ms (2.38s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3438790, ~: 3407395)\nLogs:\n  Bound result 1\n  Bound result 193\n  Bound result 25\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6455669, ~: 6397072)\nLogs:\n  Bound result 132\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 661.15ms (1.34s 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            | 234   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 296   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 265   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 248   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 253   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 263   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 224   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 265   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 30465\n  Bound result 6964\n  Bound result 12345\n  Bound result 163973\n  Bound result 25\n  Bound result 12877\n  Bound result 1\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 720.51ms (725.03ms 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        | 452   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 479   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 493   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 426   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 447   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 456   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 492   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 491   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 476   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 490   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 511   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 461   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 470   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4990000000000000000000\n  Bound result 50000000000000000000\n  Bound result 1299\n  Bound result 996550\n  Bound result 38682250524354142340665\n  Bound result 90000000000000000000\n  Bound result 13875198432464909586848\n  Bound result 15995\n  Bound result 45041905120333808562971\n  Bound result 95\n  Bound result 18714\n  Bound result 10\n  Bound result 127\n  Bound result 4\n  Bound result 3\n  Bound result 5340\n  Bound result 2000\n  Bound result 1800003600\n  Bound result 1800000000\n  Bound result 2827\n  Bound result 9999999999999999999998\n  Bound result 924632\n  Bound result 401207\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.77s (3.77s 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                  | 1824  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1880  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1744  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1868  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1833  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1775  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1793  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1772  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1895  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 20996\n  Bound result 3\n  Bound result 570495712629424742\n  Bound result 64\n  Bound result 157198260\n  Bound result 50\n  Bound result 11\n  Bound result 97\n  Bound result 5991\n  Bound result 36\n  Bound result 3603\n  Bound result 18\n  Bound result 7647\n  Bound result 9\n  Bound result 1\n  Bound result 89\n  Bound result 72\n  Bound result 23587057030370892\n  Bound result 21851\n  Bound result 14\n  Bound result 0\n  Bound result 15\n  Bound result 3570\n  Bound result 4\n  Bound result 1257\n  Bound result 7151596217168367\n  Bound result 1297\n  Bound result 980477286938948110\n  Bound result 106461\n  Bound result 62\n  Bound result 3\n  Bound result 49152\n  Bound result 30\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.96s (4.98s CPU time)\n\nRan 30 test suites in 4.96s (17.55s CPU time): 199 tests passed, 0 failed, 8 skipped (207 total tests)\n","passed":true},{"durationMs":92,"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,\".gitignore\":4,\"ADAPTATION.md\":76,\"NEXT_SESSION.md\":66,\"README.md\":250,\"app.js\":1368,\"docs/design.md\":304,\"docs/explainer.html\":247,\"docs/history.md\":218,\"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/8-sepolia-v3-launch.md\":13,\"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,\"jobs/requests/8-sepolia-v3-launch.json\":31,\"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\":45,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":195,\"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/RegistryApplicationSlot.t.sol\":111,\"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/RegistryPayoutEdges.t.sol\":221,\"test/RegistryRevisionRegression.t.sol\":418,\"test/RegistrySepoliaFork.t.sol\":111,\"test/RegistrySepoliaRun3.t.sol\":339,\"test/RegistrySignerAuthority.t.sol\":255,\"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":"a72062e227eccfe1339e83d756fe4c0e9de89788c9e2bfdc25b5a60781ba3d6f","verifiedTreeHash":"9f8b097a606f5a385abf35b3ea70590f960af581","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":9787,"exitCode":0,"name":"build","output":"Compiling 80 files with Solc 0.8.26\nSolc 0.8.26 finished in 9.68s\nCompiler run successful!\n","passed":true},{"durationMs":5201,"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 324.73µs (38.41µ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 395.54µs (54.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.23µs (86.41µ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 662.74µs (525.59µ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.52ms (254.46µ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.52ms (183.56µ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.15ms (229.24µ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 4.57ms (997.96µ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 6.49ms (8.19ms 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 6.97ms (135.43µ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.32ms (600.35µ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 7.56ms (218.56µs CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 234602, ~: 55531)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 362261, ~: 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 55.39ms (88.66ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950286, ~: 2950111)\nLogs:\n  Bound result 23482\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 70.36ms (83.30ms CPU time)\n\nRan 5 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 26022)\n[PASS] test_launchManifest_knownShape() (gas: 25116)\n[PASS] test_launchManifest_registryDeploysThroughFactoryOnEmptySepolia() (gas: 13239423)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 7895826)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4218009)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 181.86ms (54.12ms 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     | 429   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 427   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 403   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 373   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 416   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4804669392185681446566\n  Bound result 242\n  Bound result 3\n  Bound result 7\n  Bound result 5119\n  Bound result 10000000000000000002\n  Bound result 4\n  Bound result 48\n  Bound result 4\n  Bound result 7\n  Bound result 553384164587067724134854\n  Bound result 6852\n  Bound result 719412171412057284063\n  Bound result 9\n  Bound result 8299\n  Bound result 32421\n  Bound result 5\n  Bound result 830708940377754996259\n  Bound result 6592\n  Bound result 1000000000000000000000\n  Bound result 1\n  Bound result 1000000000000\n  Bound result 9\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 559.87ms (552.17ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392321, ~: 392106)\nLogs:\n  Bound result 165232534855678806288477\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367771, ~: 368861)\nLogs:\n  Bound result 1141367417\n  Bound result 861563396\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430167, ~: 430206)\nLogs:\n  Bound result 861563396\n  Bound result 1141367417\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 569.32ms (1.13s CPU time)\n\nRan 5 tests for test/RegistryApplicationSlot.t.sol:RegistryApplicationSlotTest\n[PASS] testFuzz_refusedTermsNeverReachTheListing(uint16,address) (runs: 256, μ: 5825511, ~: 5825696)\nLogs:\n  Bound result 64\n\n[PASS] test_applicationSlotCostsTheFullFeePerPanelRound() (gas: 11806825)\n[PASS] test_completedButUndeliveredGriefingRoundIsClearedWithinTheDay() (gas: 5778188)\n[PASS] test_failedGriefingRoundFreesTheSlotAtOnce() (gas: 5787997)\n[PASS] test_unansweredGriefingRoundIsClearedByAnyoneAfterADay() (gas: 5868453)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 584.20ms (587.12ms CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3444745, ~: 3410108)\nLogs:\n  Bound result 13\n  Bound result 187\n  Bound result 52\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6448324, ~: 6399753)\nLogs:\n  Bound result 1\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 584.39ms (1.16s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6227535, ~: 6227689)\nLogs:\n  Bound result 82818\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3159782, ~: 3157969)\nLogs:\n  Bound result 12\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 587.50ms (1.03s CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8876751, ~: 8873704)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6006127, ~: 6000219)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945122, ~: 6945303)\nLogs:\n  Bound result 25\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084050, ~: 3083765)\nLogs:\n  Bound result 48\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 587.49ms (2.22s CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976821, ~: 976754)\nLogs:\n  Bound result 99999000000000000015573\n  Bound result 12673\n  Bound result 1517\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935455, ~: 2941029)\nLogs:\n  Bound result 20344\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 587.47ms (1.15s CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229783, ~: 229562)\nLogs:\n  Bound result 48\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1526591, ~: 1369885)\nLogs:\n  Bound result 4\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388734, ~: 388683)\nLogs:\n  Bound result 61955984742675053827712\n  Bound result 29975662562375627457179\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 739111, ~: 761716)\nLogs:\n  Bound result 56372888356778597212532\n  Bound result 3\n  Bound result 55810050493623573617896\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682407, ~: 688802)\nLogs:\n  Bound result 56372888356778597212532\n  Bound result 3\n  Bound result 55810050493623573617896\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 491141, ~: 510423)\nLogs:\n  Bound result 4108270210897227615\n  Bound result 984742675053827712\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 587.46ms (2.29s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243040, ~: 6242989)\nLogs:\n  Bound result 50\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6329386, ~: 6334728)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4855149, ~: 6257252)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121986, ~: 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 587.84ms (2.22s 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            | 235   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 268   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 230   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 259   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 274   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 251   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 265   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 266   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 49\n  Bound result 21451\n  Bound result 28\n  Bound result 28\n  Bound result 95\n  Bound result 147200\n  Bound result 62\n  Bound result 200\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 596.13ms (592.53ms 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         | 456   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 474   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 477   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 472   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 495   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 457   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 479   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 478   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 468   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 472   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 474   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 458   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 254\n  Bound result 10\n  Bound result 1\n  Bound result 2073564179956964767803\n  Bound result 130\n  Bound result 1299\n  Bound result 10\n  Bound result 2758\n  Bound result 3\n  Bound result 397624369709360432251\n  Bound result 1015\n  Bound result 2187340383054190346240\n  Bound result 10566\n  Bound result 38697698\n  Bound result 4053061012934685786634\n  Bound result 512\n  Bound result 483415\n  Bound result 12\n  Bound result 9\n  Bound result 5\n  Bound result 883622943317\n  Bound result 31\n  Bound result 77000000000000000000\n  Bound result 100\n  Bound result 49\n  Bound result 2187340383054190347540\n  Bound result 255\n  Bound result 6160\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.01s (4.01s 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                  | 1791  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1871  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1807  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1792  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1822  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1777  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1872  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1867  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1785  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 13243\n  Bound result 127\n  Bound result 8\n  Bound result 14239\n  Bound result 5037\n  Bound result 14006\n  Bound result 29\n  Bound result 3\n  Bound result 83\n  Bound result 50842725876562173\n  Bound result 1071\n  Bound result 54\n  Bound result 1\n  Bound result 82\n  Bound result 609\n  Bound result 791112145\n  Bound result 68\n  Bound result 6724\n  Bound result 15421\n  Bound result 12455\n  Bound result 12672\n  Bound result 775646967661854546\n  Bound result 1\n  Bound result 401570204937247588\n  Bound result 1851412808806228218\n  Bound result 183\n  Bound result 5056\n  Bound result 26\n  Bound result 131889\n  Bound result 10\n  Bound result 775646967661854553\n  Bound result 7524\n  Bound result 31\n  Bound result 14066\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.10s (5.12s CPU time)\n\nRan 27 test suites in 5.10s (15.29s CPU time): 170 tests passed, 0 failed, 8 skipped (178 total tests)\n","passed":true},{"durationMs":60,"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,\".gitignore\":4,\"ADAPTATION.md\":76,\"NEXT_SESSION.md\":66,\"README.md\":250,\"app.js\":1368,\"docs/design.md\":304,\"docs/explainer.html\":247,\"docs/history.md\":218,\"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/8-sepolia-v3-launch.md\":13,\"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,\"jobs/requests/8-sepolia-v3-launch.json\":31,\"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\":195,\"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/RegistryApplicationSlot.t.sol\":111,\"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":"eab6ec479f461f45dfbcf369487e018cd190e54b06126862271d636ec6c1b6d7","verifiedTreeHash":"141c46bb9a0481ca501026f0cb93d42cacf3cdd6","verifierVersion":"0.1.0+fb8278c5"}]}