{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"cf76678d-aad4-413e-b24a-1066e990237d","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"2147ac8be050cf189eb6dcf7304690c1ef1e622ee44382cc0bae3c1e7eca12bd","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":"2aeaaa007a0ade2fa6526e0cf738f2a9abd91d247d1bca04ecd49d2bc3413142","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":"a882245a10e481df9e4577e3268444f159f93dc642d442e758a3560ecf19ecfb","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":"0e0d7be62c9a60f15a3b6565ead80be4a5877c878e840654dfa435dd33f062b2","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":"1f52037395e3835e11cd26629eacedf6b50af03194d2071b428a60b989677c64","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":"7b3703652efdab8e2d7cb7f83b1108cac11ddf6c3aecdee222b8c6b0d4add1fb","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":"d9c73f0b987076e7b8e939886201d8918bea84cb38394b9bbbb76f842827f1ca","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":"f7f77b2dd1d84fb426d8bfb85be33435ff86010ec6a9972d3ea784dfaa508fc4","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"970a252f53690b8b846026be21d00b017eb15584057cde5540dc6dde959c2e1f","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 on Ethereum mainnet from this repository: deploy only the Stacker, exactly as launch.json lists it, against the real IMD and the real staked-IMD vault. 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; the Stacker is the shared, ownerless funnel every project calls. This exact contract runs live on Sepolia (launch #1294, after that launch's audit changed its constructor); the first Sepolia Stacker (launch #1129) also stored per-trader totals.\n\nDEPLOY (Ethereum mainnet, one contract):\n- Stacker(imd, sImd) with imd = 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 (IMD) and sImd = 0x9efa934d9fad4ae28c998a40195646b965a97247 (StakedIMD, sIMD). launch.json already lists exactly this.\n- src/Stacker.sol stays as it is: no owner, admin, fee, pause or upgrade; immutable IMD and SIMD; credit(trader, imdAmount) pulls IMD from msg.sender and calls sIMD.deposit(imdAmount, trader); per-project totals and the grand total on chain; event Stacked(project, trader, imd, shares), from which per-trader figures and points are computed. The constructor only stores the two addresses and makes no external call; the first non-zero credit checks sIMD.asset() == IMD and approves the vault once, and a failed credit rolls both back. test/Stacker.t.sol, test/StackerExternalCalls.t.sol and test/FactoryRehearsal.t.sol cover this.\n- src/ProjectRegistry.sol and src/oracle/ are in the repository but not deployed in this launch: the mainnet registry is a later launch.\n- TestIMD and TestSIMD in test/mocks are test doubles (TestSIMD is the StakedIMD source with only its name changed) and are not deployed. Keep foundry.toml as it is (solc 0.8.26, cancun, 10,000 runs, bytecode_hash none; 10,000 runs keeps the runtime free of byte patterns a linear scan reads as CALLCODE).\n\nFACTS (read on chain 2026-10-12, block 26,173,849):\n- IMD is a LayerZero OFT: a standard 18-decimal ERC-20 with no transfer fee, no pause and no rebasing.\n- sIMD: ERC-4626 over IMD, decimals 24 (offset 6), owner() = 0x0 (renounced, so nobody can pause or rescue), paused() = false, about 1.81M IMD staked. One-block hold: any positive mint stamps the receiver, who cannot withdraw or redeem in that block.\n- Mainnet fork, this exact build: deploy 584,421 gas; the first credit ever 231,847 gas (it also checks and approves the vault), a credit to a new trader 135,735, a repeat credit 101,535 (whole transactions); the Stacker keeps 0 IMD and 0 sIMD.\n\nTESTS: forge test passes (180 tests: 172 run offline; 8 fork tests run when ETH_RPC_URL and SEPOLIA_RPC_URL are set and are skipped otherwise). test/MainnetFork.t.sol runs against live IMD and sIMD; it checks the vault's facts, a new and a repeat credit, and the one-block hold then a redeem. Keep all of them passing.\n\nREADME: once live, add the Stacker's mainnet address to the Deployments table. Keep the integration rules: approve the Stacker once; compute the project's rate (0.25% to 1%) in IMD, with the part of its fee that leaves the project (liquidity, burns, prizes) at least as large as the cashback; call credit inside try/catch and pay plain IMD to the trader on failure, so a trade never reverts because of imd/acc; pass the real trader (router hookData, else sender, never tx.origin); check gasleft() before the call instead of letting a wallet's gas estimate pick a path without cashback.","parentJobId":null,"planHash":"b17b68d1fd60c82ef44946d13f3c82512a77a6bab1633103d0bf2e3106aaadcc","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"cf76678d-aad4-413e-b24a-1066e990237d","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1409-launch-imd-acc-ethereum-mainnet"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52209","feedbackHash":"f755e104644b46893a5bfbecfdaf95e0433566654083159c52fae7f7360c4273","nodeKey":"adapt_contract_project","submissionHash":"2147ac8be050cf189eb6dcf7304690c1ef1e622ee44382cc0bae3c1e7eca12bd","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51332","feedbackHash":"720c96a69cc9c1d738db7497a902a9f156cb5faaab904a99b86dd73ed7820cdb","nodeKey":"adapt_contract_project","submissionHash":"e9836d01405f234fc28cc821021f8ebc0011d69c2cadbf69ac80086d4318e5cb","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52188","feedbackHash":"199ee12913dd1f56177b02064d276f7ae9998a2681de9ef8a07977338750df63","nodeKey":"audit_economics","submissionHash":"2aeaaa007a0ade2fa6526e0cf738f2a9abd91d247d1bca04ecd49d2bc3413142","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51130","feedbackHash":"dba26718048771e2eacf9379ea1dce0916174091cb1851a3dd85e2f5c166fcf6","nodeKey":"audit_flow","submissionHash":"a882245a10e481df9e4577e3268444f159f93dc642d442e758a3560ecf19ecfb","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52151","feedbackHash":"2c9b4f21f43b07339b2416d7308a56de223163e3fbb44110c0506eae68f022b7","nodeKey":"audit_imported_code","submissionHash":"0e0d7be62c9a60f15a3b6565ead80be4a5877c878e840654dfa435dd33f062b2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51083","feedbackHash":"c17a961ca5d41e5c3229a3a700c506f041273398dbb38baea260045b7452299d","nodeKey":"audit_judge","submissionHash":"1f52037395e3835e11cd26629eacedf6b50af03194d2071b428a60b989677c64","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52261","feedbackHash":"327aab96ed7854e4508bc2bd86b68cebbc98bf298741b760da6a1a03ccd365b2","nodeKey":"audit_judge","submissionHash":"46c1c2141b01e5a881c3ac20a750a5f3d8d6ff825be8ee735eadd90c0ecc1ae6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52130","feedbackHash":"2bd5616b4cd57b9af9d0a8f2e503ccab27a0d8ab1df585f648ac2d950fc91db5","nodeKey":"audit_math","submissionHash":"7b3703652efdab8e2d7cb7f83b1108cac11ddf6c3aecdee222b8c6b0d4add1fb","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51214","feedbackHash":"ab24e41d8201b7d466eb680979585298ba3f246a010e1cc1e3dcc7fac610a65c","nodeKey":"audit_permissions","submissionHash":"d9c73f0b987076e7b8e939886201d8918bea84cb38394b9bbbb76f842827f1ca","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50970","feedbackHash":"daaee46e00e887ab6e61d5430f51004e5f37646866de2a87f3809a7e428c3ca8","nodeKey":"manifest","submissionHash":"18591ab26845dbd465620738b79e7a7dbae373f7774eda3ef7ff7b2e5a52a4aa","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52693","feedbackHash":"1ccc6a947ac6d4f0a9f6373e2f8224d5154a150353c416f136ab51c140deb824","nodeKey":"manifest","submissionHash":"f7f77b2dd1d84fb426d8bfb85be33435ff86010ec6a9972d3ea784dfaa508fc4","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51325","feedbackHash":"4c2240b7942694e89f5ce4dc6935b6cd503630a3bae0d13671dd06ce382f10ba","nodeKey":"write_foundry_tests","submissionHash":"cdeea972d70c3f75752e5c5594032c80cba6a8d6d0e75761cba28b2aa662fee8","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51184","feedbackHash":"914920928a5f2d48e4f7689aa648255ffe7a8c5922e1b20be7abb4a6ae7d2034","nodeKey":"write_foundry_tests","submissionHash":"970a252f53690b8b846026be21d00b017eb15584057cde5540dc6dde959c2e1f","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"eb932bb9d251dbd3a5248916c27726a04f2d8e40d28f24d7915c29d3caca40d5","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"cdeffb0cd839cbf7","findings":[{"citation":"resolved","description":"The only trader check is against the zero address. A project that passes `address(stacker)` (for example a hook whose trader fallback is the contract it is calling) or `address(sImd)` gets a successful credit: IMD is pulled, the vault mints shares to that address, and `Stacked` is emitted. The Stacker has no owner, no sweep and no function that moves sIMD, so shares minted to it can never be redeemed; shares minted to the vault itself are equally unreachable. This breaks the documented invariant 'holds nothing: 0 IMD and 0 sIMD between calls' (README, Stacker table) and the Stacker's own `test_credit_fuzz` deliberately excludes these two inputs (test/Stacker.t.sol:368 `vm.assume(who != address(0) && who != address(stacker) && who != address(sImd))`), so the case is untested. Impact is limited to the cashback of the project that makes the mistake, which is why this is low. Minimal fix that keeps the design: `if (trader == address(0) || trader == address(this) || trader == address(SIMD)) revert ZeroTrader();` (or a dedicated error), so the integrator's try/catch pays plain IMD instead of burning the cashback into an unreachable balance.","line":76,"path":"src/Stacker.sol","reproduction":"State: Stacker deployed against TestIMD/TestSIMD (or the live pair), project holds 2e18 IMD and has approved the Stacker. Calls: vm.prank(project); shares = stacker.credit(address(stacker), 1e18); then stacker.credit(address(sImd), 1e18). Expected: both revert and nothing moves (a wrong-party credit should fall into the integrator's catch branch). Actual: both succeed; sImd.balanceOf(address(stacker)) == shares (1e24 on an empty vault) and sImd.balanceOf(address(sImd)) == shares2, and no code path can ever move either balance. Verified with test/scratch/Probe.t.sol::test_traderIsStacker_sharesStuck (passes on current code, i.e. the stuck state is reachable).","severity":"low","snippet":"        if (trader == address(0)) revert ZeroTrader();","title":"credit() accepts the Stacker or the vault itself as trader and the minted sIMD is locked forever"},{"citation":"resolved","description":"Rule 4 tells integrators to require enough gas for `credit` up front and rule 5 gives 136k (new trader) and 102k (repeat) with a x1.3 margin. Because the constructor makes no external call (launch rehearsal rule), the first non-zero credit after mainnet deployment additionally calls `sIMD.asset()`, writes `_vaultReady` and runs `forceApprove` (two cold SSTOREs plus the extra calls): the brief's own fork figure is 231,847 gas for that transaction, which is above 136k x 1.3 = 177k. A hook that forwards the table's budget (or whose gasleft() check is tuned to it) runs out of gas inside `credit`, the try/catch pays plain IMD, and `_vaultReady` stays false, so the NEXT credit from any project costs the same again. The Stacker is never primed until some caller happens to supply the larger budget; on a chain where every integrator follows the README, that may be never, and no credit earns points or sIMD meanwhile. The on-chain code is not wrong; the launch handoff and the README are. Fix: (a) after deployment, make one 1-wei (or small) `credit` from the deployer/'stack to myself' tool to prime the vault check and approval before any project goes live, and record it in the Deployments table; (b) add the one-time first-credit cost (about 232k whole-transaction) to the gas table and to rule 4 so a gas check uses it until the Stacker is primed, or simply says 'require >= 250k'.","line":166,"path":"README.md","reproduction":"Mainnet fork (ETH_RPC_URL set), fresh `new Stacker(IMD, SIMD)`, project funded and approved. Call 1: address(stacker).call{gas: 177_000}(abi.encodeCall(Stacker.credit, (trader, 1e18))) -> returns ok == false (out of gas in the vault check / approve), IMD.allowance(stacker, SIMD) is still 0. Call 2: stacker.credit(trader, 1e18) with full gas -> succeeds (258,605 internal gas measured). Call 3: the same 177_000-gas call for a new trader -> ok == true. Expected by an integrator reading the table: call 1 succeeds. Verified with test/scratch/ForkGas.t.sol::test_firstCreditNeedsMoreGasThanTable against https://ethereum-rpc.publicnode.com on 2026-10-12.","severity":"low","snippet":"   | Ethereum mainnet (this Stacker, fork test) | 136k | 102k |","title":"README gas table omits the first-ever credit (~232k gas) and nothing primes the vault at launch, so gas checks calibrated to the table send every credit to the plain-IMD fallback until someone pays th"},{"citation":"resolved","description":"The live vault stamps `lastDepositBlock[to]` on every positive mint and refuses withdraw/redeem from a stamped owner in that block (maxRedeem/maxWithdraw return 0, redeem reverts with RedeemMoreThanMax). `credit` is permissionless and a 1-wei deposit mints about 1e6 shares (decimals offset 6), so anyone can front-run a trader's exit with `credit(trader, 1)` for 1 wei of IMD plus about 100k gas, and repeat it every block. This is a property of the renounced vault (a direct `sIMD.deposit(1, victim)` does the same), so the Stacker adds no new capability and no Stacker-side guard is possible without refusing legitimate small credits; it is reported so the adapter and the README's trader-facing text do not promise 'redeem any time after the next block'. No funds are lost; the victim's exit is delayed for as long as the griefer keeps paying gas.","line":89,"path":"src/Stacker.sol","reproduction":"Block N: project calls stacker.credit(trader, 10e18) -> trader holds shares. Block N+1: griefer (any funded address that approved the Stacker) calls stacker.credit(trader, 1); then trader calls sImd.redeem(shares, trader, trader). Expected (per the one-block hold's stated purpose): the trader, who deposited a block ago, can redeem. Actual: sImd.maxRedeem(trader) == 0 and the redeem reverts; the trader must wait for a block in which nobody credits them. Verified with test/scratch/Probe.t.sol::test_oneWeiCreditBlocksRedeemThisBlock on TestSIMD, which is the live vault's source with only the name changed.","severity":"info","snippet":"        shares = SIMD.deposit(imdAmount, trader);","title":"Any caller can stamp a trader's one-block hold through credit(trader, 1): a 1-wei credit blocks that trader's withdraw/redeem for the block"},{"citation":"resolved","description":"Read in full: src/Stacker.sol (the only contract this launch deploys), src/ProjectRegistry.sol and src/oracle/OracleAttestation.sol (in the tree, not deployed here), test/mocks/TestIMD.sol and TestSIMD.sol (TestSIMD is the live vault's source), launch.json, foundry.toml, the Stacker test files (Stacker.t.sol partially, StackerEdges, StackerExternalCalls, MainnetFork, Base) and the protected floor test. Checked and found correct: launch.json has only kind/contracts/notes, one contract named Stacker, two string address arguments in constructor order that checksum to the IMD and sIMD addresses in the brief, notes under 4,000 characters; the constructor makes no external call; `credit` is nonReentrant, checks-effects order is transfer -> deposit -> state -> event with every failure (allowance, balance, paused vault, zero shares, late vault revert) rolling back the transfer, the approval and `_vaultReady`; the Stacker keeps 0 IMD and 0 sIMD (stray IMD sent directly is stuck but never spent); the infinite approval goes only to the immutable vault; shares are minted straight to the trader; no owner, admin, fee, pause, upgrade, DELEGATECALL, CALLCODE or SELFDESTRUCT (compiled runtime of 2,362 bytes scanned with the protected test's opcode walk: none found). Executed: `forge test` (172 offline tests pass, 8 fork tests skipped) and the three MainnetFork tests against the live IMD and sIMD on a public mainnet RPC (all pass: asset() == IMD, owner() == 0, not paused, decimals 24, new and repeat credit, hold then redeem). Not reached: the live IMD OFT's Solidity source was not read, only its on-chain behaviour exercised on the fork (transferFrom from the Stacker with a max allowance, deal() works, no fee); the ProjectRegistry and oracle were read for understanding but not fuzzed or audited to the same depth since they are a later launch, with one note for that review: the registry trusts the Intake to pair an attestation with the right intakeId and does not compare a.questionHash with the body it sent, which is a stated trust assumption, not a defect. No critical, high or medium defect was found in the Stacker; the low and info items above are the complete list.","line":28,"path":"src/Stacker.sol","reproduction":"Not a defect. Commands run: `forge build`; `forge test`; `ETH_RPC_URL=https://ethereum-rpc.publicnode.com forge test --mc MainnetFork -vv`; opcode scan of out/Stacker.sol/Stacker.json deployedBytecode; `cast to-check-sum-address` on both launch.json arguments.","severity":"info","snippet":"contract Stacker is ReentrancyGuard {","title":"Scope and coverage of this review"}],"hash":"0e0d7be62c9a60f15a3b6565ead80be4a5877c878e840654dfa435dd33f062b2","nodeId":"fb0ab538-9809-45ee-bbfa-de4e77e631c6","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds four entries. The git tree is otherwise unchanged (the findings file is ignored by git, and the scratch tests were removed).\n\n**Verdict:** no critical, high or medium defect in the Stacker. The contract does what the brief says: ownerless, immutable IMD and sIMD, no external call in the constructor, one-time vault check and approval, every failure path rolls back the pull, the approval and the ready flag, shares minted straight to the trader, no forbidden opcodes in the 2,362-byte runtime. The manifest is valid and both constructor arguments checksum to the addresses in the brief. All 172 offline tests pass, and I also ran the three mainnet fork tests against a public RPC, where they pass against the live IMD and sIMD.\n\n**Findings written:**\n\n- **Low, `src/Stacker.sol:76`.** `credit` accepts the Stacker itself or the vault as the trader. The shares then sit in an address with no way to move them, which breaks the documented \"holds no sIMD\" invariant. The fuzz test in Stacker.t.sol explicitly excludes these two inputs. Suggested fix is a two-address extension of the existing zero-trader check.\n- **Low, `README.md:166`.** The gas table lists 136k and 102k but the first credit ever costs about 232k, and nothing primes the vault at launch. On a fork, a call with the table's 1.3x budget fails on a fresh Stacker and succeeds once primed. Recommend a 1-wei priming credit in the launch handoff and a table row for the one-time cost.\n- **Info, `src/Stacker.sol:89`.** A 1-wei credit stamps the trader's one-block hold, so anyone can delay a trader's redeem by one block per 1 wei plus gas. This is a property of the renounced vault, reachable directly too, so no Stacker fix is proposed. Noted so trader-facing text does not overpromise.\n- **Info, coverage.** Lists what was read in full (Stacker, ProjectRegistry, oracle, both mocks, manifest, config, Stacker tests, protected floor), what was executed, and what was not reached: the live IMD OFT's source was only exercised on the fork, not read, and the registry and oracle were read but not audited to the same depth since they are a later launch.\n\n**Next step for the adapter:** decide whether to add the trader guard and the priming credit before the mainnet deploy. Neither changes the launch manifest.","treeHash":null,"usage":{"cachedInputTokens":923883,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":23244,"runtime":"claude","turns":31,"wallClockMs":434860}},{"artifacts":[],"attempt":1,"bundleHash":"90198ce80a2f8afdfcdefec7ae1db3f4087de76061013d15c0a1ace128644572","device":"c2a0c6e1f08b5974","findings":[],"hash":"18591ab26845dbd465620738b79e7a7dbae373f7774eda3ef7ff7b2e5a52a4aa","nodeId":"6a451abf-b9ad-412b-9893-75dd42e83a1b","outcome":"completed","summary":"Updated [launch.json](/home/imd/.identitymd/work/cf76678d-aad4-413e-b24a-1066e990237d/6a451abf-b9ad-412b-9893-75dd42e83a1b/launch.json), preserving the sole `Stacker` deployment and approved addresses, with clarified integration notes.\n\nValidation passed: manifest structure, constructor ABI, and `forge build`. `forge test`: **181 passed, 0 failed, 11 skipped** because RPC URLs were unset.\n\nOnly `launch.json` changed.","treeHash":"f67cdad18ca808a6fcc2a1583091de5ded3c6bcf","usage":{"cachedInputTokens":202496,"inputTokens":75670,"model":"gpt-6-astra","outputTokens":2989,"runtime":"codex","turns":3,"wallClockMs":110656}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc7103e773ea194a","findings":[{"citation":"resolved","description":"Settlement note: finding 92b47490 (rule 3 'else sender' credits the router) is FIXED in README rule 3 (line 166), src/ProjectRegistry.sol:536 and the docs, and test/TraderResolution.t.sol reproduces the loss on the legacy branch and the corrected resolution; finding 162145369 (LP fees counted as leaving) is FIXED at src/ProjectRegistry.sol:541 and README lines 125/164. The one place the old text survives is the manifest's notes, written by the manifest step before this revision and re-applied unchanged (commit 8de11ad): 'Resolve the real trader from router hookData, otherwise sender, never tx.origin' is exactly the rule the fix retired (a hook that follows it credits Universal Router and the shares are sweepable), and 'the fee portion leaving the project for liquidity, burns or prizes' is the fee guard that counted LP fees. Notes are explanatory and carry no deployment authority (schema: kind, contracts, notes), the constructor arguments and contract are correct, and the deployed bytecode is unaffected, so this is information only. It matters because the signed manifest is the record admission and later readers see; its notes should match README rule 3 and rule 1 (resolve valid hookData, else the active IMsgSender(sender).msgSender(), else sender only if it has no code; qualifying outflow excludes LP fees and amounts returned to trader, owner or team). Fix: the manifest step rewrites the two sentences; nothing else in launch.json changes.","line":12,"path":"launch.json","reproduction":"Read launch.json line 12 and README.md line 166 side by side. Expected: the manifest's summary of rule 3 matches the README and src/ProjectRegistry.sol:536 ('else IMsgSender(sender).msgSender() during the swap, else sender only if sender has no code'). Actual: the manifest says 'otherwise sender'. Behavioural consequence of following the manifest text, already reproduced in the tree: forge test --offline --match-path test/TraderResolution.t.sol --match-test test_legacyEmptyHookDataCreditsRouterAndAnyoneCanSweep passes, i.e. with the legacy 'else sender' branch a swap through the router model with empty hookData mints the sIMD to the router and an unrelated searcher sweeps it. Likewise launch.json's 'leaving the project for liquidity' versus src/ProjectRegistry.sol:541 'LP fees do not count'.","severity":"info","snippet":"  \"notes\": \"Deploy only Stacker for imd/acc on Ethereum mainnet. Constructor arguments are the real IMD token followed by the real StakedIMD (sIMD) vault. Both addresses are immutable. Stacker has no owner, admin, fee, pause or upgrade. Its constructor stores the addresses without external calls; the first non-zero credit checks sIMD.asset() == IMD and approves the vault once. A failed credit rolls back validation, approval and transfers. credit(trader, imdAmount) pulls IMD from the calling project and calls sIMD.deposit(imdAmount, trader), minting shares directly to the trader. Per-project IMD and share totals and the grand IMD total are stored on chain; per-trader figures and points are computed from Stacked(project, trader, imd, shares) events. ProjectRegistry, oracle contracts and test doubles are outside this deployment. Projects approve Stacker once and fund their chosen 0.25%-1% cashback rate from existing fees, with the fee portion leaving the project for liquidity, burns or pr","title":"launch.json notes restate the retired integration rules (sender fallback, liquidity counted as leaving) that this revision replaced"},{"citation":"resolved","description":"Settlement of finding 41a89fc7 (stale test count): the author's answer is right that their checkout ran 203 tests, and the figure they wrote was correct when written. The discrepancy both rounds has the same cause: the independent tester's accepted files (test/StackerHoldInvariant.t.sol with 3 tests, test/StackerDependencyFailures.t.sol with 17, test/MainnetLaunchRegression.t.sol with 2, plus additions to StackerGas) are merged into the tree after the author's revision ('imd: combine accepted dependencies', commit 4b506b9), so any count the author writes is overtaken when the branches are combined. The tree in front of me runs 228. Every test passes offline and on both forks, so this is documentation only; ADAPTATION.md lines 47, 94 and 100 carry the same stale figures. Suggested fix that stops the drift: state the count as 'forge test --offline reports the total; 11 fork tests are skipped without RPC URLs' instead of a number, or recount after the combine step.","line":14,"path":"jobs/4-mainnet-launch.md","reproduction":"forge test --offline at the repository root: 'Ran 34 test suites ... 217 tests passed, 0 failed, 11 skipped (228 total tests)'. Per-suite sum of the 'Ran N tests for' lines is 228. ETH_RPC_URL=https://ethereum-rpc.publicnode.com forge test --match-path test/MainnetFork.t.sol: 5 passed; SEPOLIA_RPC_URL=https://ethereum-sepolia-rpc.publicnode.com forge test --match-path 'test/*SepoliaFork.t.sol': 6 passed (5 + 1). Expected from the text: 203 total, 192 offline. Actual: 228, 217.","severity":"info","snippet":"TESTS: forge test passes (203 tests: 192 run offline; 11 fork tests run when ETH_RPC_URL and SEPOLIA_RPC_URL are set and are skipped otherwise). This revision started from 192 tests (181 offline, 11 fork) and adds 11 offline regressions; see ADAPTATION.md for the measured results. test/MainnetFork.t.sol runs against live IMD and sIMD; it checks the vault's facts, a new and a repeat credit, and the one-block hold then a redeem. Keep all of them passing.","title":"Launch text count is stale again: it says 203 tests (192 offline, 11 fork) but the combined tree runs 228 (217 offline, 11 fork)"},{"citation":"resolved","description":"Settlement of finding b4b0143b (application-slot squatting), which I reported as low and advisory. The author disputes it only as a required change in this Stacker-only revision, confirms the behaviour with test/RegistryPolicyRevision.t.sol::test_applicationSlotCanBeReoccupiedAfterFailureNoAndExpiry (four stranger applications across an unsigned failure, a signed no and an expiry, each blocking the legitimate applicant for one fee and no bond), and records it in docs/design.md line 88 ('Blocking by spam ... needs a separate application-policy decision before the later mainnet registry launch'). I accept that: ProjectRegistry is not in launch.json, the Stacker never reads it, and the fix needs a state-machine decision (application bond or re-application priority) that belongs to the registry launch's own review. Recorded here at info so the deferral stays on the record and is not read as fixed; it does not block this deployment. It must be settled before the registry launch, where it is a broken liveness guarantee (medium).","line":252,"path":"src/ProjectRegistry.sol","reproduction":"forge test --offline --match-path test/RegistryPolicyRevision.t.sol --match-test test_applicationSlotCanBeReoccupiedAfterFailureNoAndExpiry passes, i.e. demonstrates the behaviour: on the local fixture a stranger applies for project P, the owner's applyListing reverts AskOpen; after intake failure, a signed no and an expiry the stranger re-applies in the clearing block each time and the owner reverts AskOpen again, at a cost of exactly four oracle fees and no bond. Expected for the later registry launch: the legitimate applicant can file within bounded time or the squatter risks a bond. Actual: unbounded exclusion for one fee per cycle. No mainnet impact from this launch.","severity":"info","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"Deferred by agreement: anyone can hold a project's single open-question slot for one oracle fee per cycle (registry, not deployed in this launch)"}],"hash":"1f52037395e3835e11cd26629eacedf6b50af03194d2071b428a60b989677c64","nodeId":"72ec1848-e9ea-4de8-8880-fe36980a6832","outcome":"completed","summary":"Review settled and written to `.imd-findings.json` (3 info findings, 14 coverage rows, every snippet checked against its file line). No file other than the findings file was changed.\n\n**Settlement of the five earlier findings**\n\n- **Rule 3 credits a sweepable router (medium): fixed.** README rule 3, the registry's `trader` rule text and the docs now resolve valid hookData, else the router's active msgSender(), else sender only when it has no code, and reject router recipients. The new TraderResolution suite reproduces the old loss on a legacy branch and covers the corrected paths, invalid data, malformed or reverting accessors and the plain-IMD fallback.\n- **IMD token accepted as share recipient (low): fixed.** The guard at src/Stacker.sol:80 now rejects the token, before any amount handling or external call. The regression tests pass offline, and the Sepolia fork test confirms the candidate rejects all three unreachable recipients.\n- **LP fees counted as leaving (low): fixed.** The feeGuard rule and README exclude LP fees and anything returned to trader, owner or team, and the universal net-cost claim is gone.\n- **Application-slot squatting (low, registry): deferral accepted.** The author confirmed the behaviour with a test, documented it in the design doc, and deferred the policy decision to the registry launch. The registry is not deployed here, so I recorded it at info so it stays on the record without blocking.\n- **Stale test count (info): still stale.** The author's 203 was correct in their checkout. The tester's accepted files were merged afterwards, so the combined tree runs 228. Recorded again as info with the cause.\n\n**One new item, info only.** The manifest's notes, written by the manifest step before this revision and re-applied unchanged, still say \"otherwise sender\" and count liquidity as leaving. The constructor arguments and the contract are correct, so this is text drift in the signed record, not a deployment defect.\n\n**Verification run.** Offline: 217 passed, 0 failed, 11 skipped. Mainnet fork against a public RPC: 5 passed, including the cold first credit under the README's gas budget. Sepolia fork: 6 passed. The two slither leads (ignored returns in expire and the attestation verifier) are intentional and the needed values are checked. Nothing blocks the launch.","treeHash":null,"usage":{"cachedInputTokens":756302,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":16305,"runtime":"claude","turns":24,"wallClockMs":293551}},{"artifacts":[],"attempt":1,"bundleHash":"4c18e491996ee071ca6c5fc4e75dddefe86ec5d80b1f18cd1c3bdb5e83feaf27","device":"4539d3d0693a7444","findings":[],"hash":"2147ac8be050cf189eb6dcf7304690c1ef1e622ee44382cc0bae3c1e7eca12bd","nodeId":"033947ec-84a3-4eba-bbd9-b42c1609fde8","outcome":"completed","summary":"Implemented router-resolution guidance, the IMD recipient guard, and LP-fee policy corrections. Updated `ADAPTATION.md` and answered all nine findings in `.imd-responses.json`.\n\nValidation passed: `forge build`, 192 offline tests, all 11 fork tests, and the protected deployment check.\n\nRegistry application-slot squatting remains documented and deferred to its later launch. No mainnet transaction was broadcast.","treeHash":"8e29b8b74b8443cb17a0f470dfa8b02c2a102525","usage":{"cachedInputTokens":3054336,"inputTokens":126832,"model":"gpt-6-astra","outputTokens":29220,"runtime":"codex","turns":9,"wallClockMs":929410}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d4b53d656a3fbe07","findings":[{"citation":"resolved","description":"The integration rule tells a hook to take the trader from hookData and otherwise fall back to `sender`. In a Uniswap v4 hook, `sender` in beforeSwap/afterSwap is the contract that called PoolManager.swap, i.e. the router, not the person trading. Uniswap's Universal Router passes the user's hookData through unchanged and the default is empty, so for every frontend swap the hook resolves trader = UniversalRouter and calls Stacker.credit(UniversalRouter, cashback). The Stacker's recipient guard (src/Stacker.sol:80) only rejects address(0), itself and the vault, so the sIMD is minted to the router. Universal Router's SWEEP command is permissionless (it is designed to hold no funds), so the next searcher takes the sIMD. The project has paid its cashback, the trader got nothing, and the `Stacked` event records the router as `trader`, so trader points accrue to the router address. The same text is the registry's panel rule (src/ProjectRegistry.sol:536 and docs/panel-rules-v2.md:14: 'with the swap sender as the fallback; that address counts as the trader of that trade'), so a listed project behaving this way passes a challenge, and docs/design.md:12 and docs/listing.md:50 repeat it. Rule 6 ('support the router's msgSender') points at the remedy but rule 3 and the panel rule do not require it. Suggested fix, preserving the rule's intent: resolve trader as hookData, else `IMsgSender(sender).msgSender()` when `sender` exposes it, else `sender` only if `sender` has no code (or is not a known router); when no trader can be resolved, pay the plain-IMD fallback to the resolved msgSender instead of crediting. Mirror that wording in the panel `trader` rule so the registry does not bless the leak.","line":166,"path":"README.md","reproduction":"State: a listed hook H integrating per README rule 3 on a PLEA/IMD v4 pool; trader T swaps through Universal Router R with empty hookData (the Uniswap frontend default). Trace: PoolManager calls H.afterSwap(sender=R, ..., hookData=\"\"); H resolves trader = R; H calls stacker.credit(R, cashback) which passes the checks at src/Stacker.sol:79-80 and mints sIMD to R; Stacked(H, R, cashback, shares) is emitted. Then anyone calls R.execute with a SWEEP command for the sIMD token to their own address and receives the shares. Expected: T receives sIMD worth `cashback` IMD and the points. Actual: R holds the sIMD until a searcher sweeps it; T receives nothing; points are attributed to R. The registry's panel rule text accepts this behaviour, so a challenge on that ground is answered 'yes' (stays listed).","severity":"medium","snippet":"3. **Pay the real trader.** Read it from the router's `hookData`, fall back to `sender`, never use `tx.origin`. Validate the resolved recipient; the zero address, Stacker and vault are invalid recipients. Catching an invalid-recipient error does not correct a wrongly resolved trader for the plain-IMD fallback.","title":"Integration rule 3 and the panel's trader rule pay cashback to a router when hookData carries no trader; anyone can sweep it"},{"citation":"resolved","description":"applyListing is open to anyone and a project has exactly one open question at a time (AskOpen). An application carries no bond, only the oracle fee, and the panel's 'no' or a failure/expiry simply clears the slot. A stranger can therefore apply for a competitor's project with a wrong beneficiary, let the panel reject it, and re-apply in the same block as the rejection callback (backrun), or atomically `expire` and re-apply after a day of silence. The real owner's applyListing reverts with AskOpen in every block, so the project never gets listed and never earns points. Cost to the attacker: one oracle fee (0.5 IMD on the mainnet settings in docs/design.md:79) per panel cycle (about one hour), no bond at risk; the owner's only recourse is to win a mempool race against a bot that backruns the callback. The challenge path is protected from this by the bond paid to the beneficiary on a defended challenge; the application path has no equivalent. This contract is not in this launch (the registry is a later launch) but it is in the listed entry points. Possible fixes that keep 'anyone may apply': an application bond returned on 'yes' and forfeited (or paid to the next successful applicant/beneficiary) on a signed 'no'; or a per-project re-application cooldown that is waived for the beneficiary named in the rejected application only if that beneficiary differs, so the party the panel refused cannot immediately re-occupy the slot.","line":252,"path":"src/ProjectRegistry.sol","reproduction":"Reproduced in test/scratch/RegistrySquat.t.sol on the local fixture (MockIntake, fee 0.5 IMD, bond 5 IMD). 1) SquatBot calls applyListing(P, \"squat\", \"https://example.invalid\", 25, address(bot)): slot opens, 0.5 IMD paid. 2) The owner's applyListing(P, \"PLEA\", \"https://github.com/khaed1/plea\", 50, beneficiary) reverts AskOpen. 3) The panel answers false (beneficiary rule): Rejected, slot cleared; in the same block the bot calls applyListing again; the owner's call reverts AskOpen again. 4) No answer for a day: the bot calls expire(P) then applyListing in one transaction; the owner's call reverts AskOpen again. Total cost to the bot after three cycles: exactly 1.5 IMD (3 fees), no bond. Expected: a legitimate owner can get its application filed within bounded time or the squatter bears a cost comparable to a challenge bond. Actual: the owner is excluded for as long as the squatter pays one fee per cycle.","severity":"medium","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"Anyone can hold a project's single open-question slot for one oracle fee per cycle, blocking its real application indefinitely"},{"citation":"resolved","description":"`forge test --offline` on this tree runs 192 tests: 181 pass offline and 11 are skipped fork tests (5 MainnetFork, 5 SepoliaFork, 1 RegistrySepoliaFork). The job text (and the launch brief derived from it) says 180 tests, 172 offline and 8 fork. All tests pass, including the 5 mainnet fork tests run here against https://ethereum-rpc.publicnode.com at block 26,176,349, so this is a documentation drift, not a failure; it matters only because the README/job text is the record a later reader uses to judge whether the suite ran whole.","line":14,"path":"jobs/4-mainnet-launch.md","reproduction":"Run `forge test --offline` at the repository root. Expected per the job text: 180 tests (172 run, 8 skipped). Actual: 'Ran 29 test suites ... 181 tests passed, 0 failed, 11 skipped (192 total tests)'. With ETH_RPC_URL set, `forge test --mc MainnetFork` runs 5 (not fewer) fork tests, all passing.","severity":"info","snippet":"TESTS: forge test passes (180 tests: 172 run offline; 8 fork tests run when ETH_RPC_URL and SEPOLIA_RPC_URL are set and are skipped otherwise). test/MainnetFork.t.sol runs against live IMD and sIMD; it checks the vault's facts, a new and a repeat credit, and the one-block hold then a redeem. Keep all of them passing.","title":"Stated test count is stale: 180 (172 offline + 8 fork) versus 192 in the tree (181 offline + 11 fork)"}],"hash":"2aeaaa007a0ade2fa6526e0cf738f2a9abd91d247d1bca04ecd49d2bc3413142","nodeId":"20ff517a-b418-4a99-a5bf-f5c643b318ca","outcome":"completed","summary":"The review is complete. The findings file at `.imd-findings.json` holds 3 findings and 12 coverage rows, all snippets copied from the tree.\n\n**What I checked**\n\n- The Stacker's economics against the live mainnet vault, read at block 26,176,349: asset is IMD, owner renounced, not paused, 24 decimals, 1.799M IMD staked, and one wei deposits at 125,375 shares. Deposit rounding loses under one share per credit, donations change share count but not value, the zero-share guard is unreachable at live state, and the Stacker ends every call holding nothing. IMD is not a proxy and has no pause function.\n- All 181 offline tests pass, and the 5 mainnet fork tests pass against a public RPC, including the gas-budget cases.\n- The manifest lists the two correct addresses in constructor order with only the schema's keys.\n- The registry's bond and fee flows on every settle, failure, expire and claim branch.\n\n**Findings**\n\n1. **Medium, README rule 3 and the panel's trader rule.** Falling back to `sender` in a v4 hook names the router when hookData is empty, which is the Uniswap frontend default. The sIMD is minted to the Universal Router, whose sweep command is permissionless, so searchers take the cashback and points land on the router's address. The same wording is in the registry's panel rule, so a challenge on that ground would be defended. Rule 6 hints at the fix (the router's `msgSender()`) but nothing requires it.\n2. **Medium, ProjectRegistry.applyListing.** A stranger can occupy a project's one open-question slot for one oracle fee per cycle with no bond at risk, backrunning each rejection or expiring and re-applying atomically, so the real owner's application reverts with AskOpen forever. Reproduced in a scratch test. The registry is a later launch, but it is in the entry-point list.\n3. **Info.** The job text's test count is stale: the tree has 192 tests (181 offline plus 11 fork), not 180.\n\n**Coverage.** All nine entry points have rows: applyListing is a finding, the other eight hold, plus three invariant rows for Stacker conservation, the manifest, and the fork suite. Nothing was left unreached. The one-block hold griefing via a dust credit is a vault property already covered by the existing VaultTrustRegression test, so I did not report it.","treeHash":null,"usage":{"cachedInputTokens":1656983,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":37122,"runtime":"claude","turns":37,"wallClockMs":683844}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dedc96e38388cb45","findings":[{"citation":"resolved","description":"Merged from audit_flow (low) and audit_economics (medium): one root cause. In a Uniswap v4 hook the `sender` argument of beforeSwap/afterSwap is msg.sender of PoolManager.swap, which for every interface or aggregator swap is a router (Universal Router, V4Router), never the person trading. The Uniswap interface sends empty hookData by default. A hook that implements rule 3 as written (`hookData, else sender`) therefore calls Stacker.credit(router, cashback) on every such swap: the project's IMD is pulled, the sIMD is minted to the router, and Stacked names the router as trader, so points accrue to the router. The Stacker cannot detect this: src/Stacker.sol:80 only rejects address(0), itself and the vault, and the router is a valid ERC-20 holder. Universal Router's SWEEP command is permissionless (execute() has no access control; Payments.sweep transfers the router's whole balance of a token to the given recipient), so the next searcher takes the sIMD. The same wording is the registry's panel `trader` rule (src/ProjectRegistry.sol:536, 'with the swap sender as the fallback; that address counts as the trader of that trade'), so a listed project behaving this way passes a challenge. Rule 6 ('support the router's msgSender') points at the remedy but rule 3 does not require it. Loss is the cashback of each affected trade, paid by the project and received by nobody the project intended; medium because it is a loss under a specific but common condition (a hook following the published rule literally with frontend swaps). The deployed Stacker code is correct; the defect is in the integration rule the brief asks to keep and in the registry's rule text. Fix that keeps the rule's intent and order: resolve trader as hookData, else IMsgSender(sender).msgSender() when sender exposes it, else sender only when sender has no code; otherwise pay the plain-IMD fallback to the resolved msgSender. Mirror that wording in the registry's `trader` rule (a later launch).","line":166,"path":"README.md","reproduction":"Hook H implements rule 3 literally: trader = hookData.length == 20 ? address(bytes20(hookData)) : sender. User T swaps through Universal Router R with hookData = 0x (the frontend default). PoolManager calls H.afterSwap(sender = R, ..., hookData = \"\"); H resolves trader = R and calls stacker.credit(R, cashback). Expected (brief: 'pay the real trader'): T holds the sIMD and the points. Actual: credit passes the checks at src/Stacker.sol:79-80, mints the shares to R, emits Stacked(H, R, cashback, shares); anyone then calls R.execute with a SWEEP command naming the sIMD token and their own address and receives the shares. Locally this is the ordinary success path of credit with any contract address as trader: with the test fixture, `stacker.credit(address(routerMock), 1e18)` returns shares > 0 and `sImd.balanceOf(address(routerMock)) == shares` (same mechanism as test/scratch/ImdRecipient.t.sol, which passes with the IMD token as recipient).","severity":"medium","snippet":"3. **Pay the real trader.** Read it from the router's `hookData`, fall back to `sender`, never use `tx.origin`. Validate the resolved recipient; the zero address, Stacker and vault are invalid recipients. Catching an invalid-recipient error does not correct a wrongly resolved trader for the plain-IMD fallback.","title":"Integration rule 3 'fall back to sender' credits the Uniswap v4 router, not the trader; the shares are then sweepable by anyone"},{"citation":"resolved","description":"From audit_economics (medium), reproduced. applyListing is open to anyone, a project has exactly one open question (AskOpen), an application carries no bond, and a failure, a signed 'no' or an expiry only clears the slot. A stranger can apply for a competitor's project with a wrong beneficiary or rate, let the panel refuse it, and re-apply in the same block as the clearing callback, or call expire and re-apply in one transaction after a day of silence. The real owner's applyListing reverts AskOpen every time. Cost to the squatter: one oracle fee (0.5 IMD on the mainnet settings in docs/design.md) per panel cycle, no bond at risk; the owner's only recourse is winning a mempool race against a bot that backruns the callback. The challenge path is protected by its bond; the application path has no equivalent. Severity recalibrated to low for this launch: ProjectRegistry is not deployed here (the mainnet registry is a later launch), so there is no mainnet impact from this deployment, but the defect should be fixed before the registry launch, where it is a broken liveness guarantee (medium). Fixes that keep 'anyone may apply': an application bond returned on 'yes' and forfeited on a signed 'no'; or a per-project re-application cooldown after a refused or expired application that is waived for a different beneficiary.","line":252,"path":"src/ProjectRegistry.sol","reproduction":"test/scratch/RegistrySquat.t.sol (run: forge test --offline --match-path test/scratch/RegistrySquat.t.sol, passes, i.e. demonstrates the behaviour) on the local fixture (MockIntake, fee 0.5 IMD, bond 5 IMD, cooldown 1h). 1) bot calls applyListing(P, \"squat\", \"https://example.invalid\", 25, bot): slot opens, 0.5 IMD paid. 2) owner's applyListing(P, \"PLEA\", \"https://github.com/x/plea\", 50, owner) reverts AskOpen. 3) intake.fail(id, 2, \"split\", 200k) clears the slot; in the same block bot applies again; owner reverts AskOpen again. 4) warp 1 day + 1 s; bot calls expire(P) then applyListing; owner reverts AskOpen again. Assertions: bot spent exactly 3 * 0.5 IMD and no bond; isListed(P) is false. Expected: a legitimate applicant can file within bounded time or the squatter bears a cost comparable to a challenge bond. Actual: the owner is excluded for as long as the squatter pays one fee per cycle.","severity":"low","snippet":"if (p.ask != Ask.None) revert AskOpen();","title":"Anyone can hold a project's single open-question slot for one oracle fee per cycle, blocking the real application (registry, not deployed in this launch)"},{"citation":"resolved","description":"From audit_flow, reproduced. The mainnet adaptation added InvalidTrader for address(this) and address(SIMD) because sIMD minted to either can never be moved. The IMD token itself, the third address the Stacker already holds, is in the same position (an OFT with no token-rescue function) and is not rejected. A hook following README rule 3 resolves the trader from caller-supplied hookData, so a swapper or a buggy hook that resolves to the IMD address makes credit succeed, pulls the project's cashback, mints shares no code can redeem or transfer, and emits Stacked(project, IMD, ...). README rule 3 lists only 'the zero address, Stacker and vault' as invalid recipients, so integrators validating against that list will not catch it either. Loss is bounded to the cashback of each such trade and is mostly self-inflicted, hence low. Minimal fix that preserves the design: also revert InvalidTrader when trader == address(IMD), and add the token to README rule 3. Reported because the adaptation presents the two-address guard as closing this class.","line":80,"path":"src/Stacker.sol","reproduction":"test/scratch/ImdRecipient.t.sol (forge test --offline --match-path test/scratch/ImdRecipient.t.sol passes, i.e. demonstrates the behaviour): deal 1e18 IMD to project, project approves the Stacker; vm.prank(project): credit(address(stacker), 1e18) reverts InvalidTrader, credit(address(sImd), 1e18) reverts InvalidTrader, but credit(address(imd), 1e18) returns shares > 0, sImd.balanceOf(address(imd)) == shares, imd.balanceOf(project) == 0, projectStacked[project] == 1e18, and Stacked is emitted with trader = the IMD token. Expected by parity with the two existing guards: revert InvalidTrader and move nothing.","severity":"low","snippet":"if (trader == address(this) || trader == address(SIMD)) revert InvalidTrader();","title":"Recipient guard rejects the Stacker and the vault but not the IMD token contract, an equally unreachable share holder"},{"citation":"resolved","description":"From audit_math, reproduced by tracing the rule text. The feeGuard rule (and README line 125, 'so trading with yourself to farm points always costs more than it brings back') compares only the sizes of fee parts by destination class: fees to liquidity providers and locked liquidity count as leaving for good. It never accounts for the trader being the recipient of the 'leaving' part. A wash trader who is also the dominant in-range LP of the listed pool gets almost all of the LP fee back, so the inequality holds while the net cost of a point collapses. Policy text only: points are computed off chain and nothing is promised, and the registry is not deployed in this launch, hence low. Fix options: count LP fees as leaving only to the extent they do not return to the trader (not verifiable on chain), exclude LP fees from the leaving part, or have the indexer discount points from traders who are in-range LPs of the same pool.","line":541,"path":"src/ProjectRegistry.sol","reproduction":"Listed project: a v4 hook on an IMD/X pool, LP fee 1% (to LPs), hook fee 1% of the IMD side credited as cashback at 100 bps (C = 1%, owner part O = 0, leaving part L = 1% >= C, so feeGuard passes). Attacker, not owner or team, adds narrow-range liquidity so it holds 99% of in-range liquidity. Round trip of 1,000 IMD -> X -> IMD, with credits on both legs: per leg Stacker.credit(attacker, 10e18) emits Stacked(project, attacker, 10e18, shares) and the ~10 IMD LP fee returns ~9.9 IMD to the attacker. Per round trip: 20 points, ~20 IMD of sIMD plus ~19.8 IMD of LP fees back, cost ~0.2 IMD plus gas. Expected per README line 125: farming 20 points costs at least 20 IMD net. Actual: about 0.2 IMD, roughly 0.01 IMD per point.","severity":"low","snippet":"'\",\"feeGuard\":\"Split the trading fee into three parts: the cashback; the parts that come back to the owner or team (owner share, treasury, liquidity or reserves the owner or team can withdraw); and the parts that leave for good (burned tokens, prizes paid to others, fees to third parties, locked value as in lockedValue). The parts that leave for good must add up to at least the cashback. If the rate or the fee split can change, the code must keep this true for every allowed setting.\",\"lockedValue\":\"Liquidity or reserves that no owner or team wallet can ever withdraw count as leaving for good, even if the contract itself can move them between its own positions or pools.\"'","title":"Fee guard counts LP fees as 'leaving for good' even when the self-trader is the LP, so wash-trading points can cost far less than the stated floor"},{"citation":"resolved","description":"Merged from audit_flow and audit_economics (both info). The job text, and the task brief derived from it, carry a count from before the mainnet adaptation and the independent tester's additions. The specialists measured 192; the tree in front of me runs 210. Every test passes, so this is documentation drift only; it matters so a verifier comparing counts does not read the extra tests as unexpected. ADAPTATION.md's own figure (181/11, 192) is also stale now.","line":14,"path":"jobs/4-mainnet-launch.md","reproduction":"forge test --offline at the repository root: 'Ran 32 test suites ... 199 tests passed, 0 failed, 11 skipped (210 total tests)'. ETH_RPC_URL=https://ethereum-rpc.publicnode.com forge test --match-path test/MainnetFork.t.sol: 5 passed, 0 failed (live IMD and sIMD, including the cold first credit under the README budget). Expected from the text: 180 total, 172 offline, 8 fork. Actual: 210, 199, 11.","severity":"info","snippet":"TESTS: forge test passes (180 tests: 172 run offline; 8 fork tests run when ETH_RPC_URL and SEPOLIA_RPC_URL are set and are skipped otherwise). test/MainnetFork.t.sol runs against live IMD and sIMD; it checks the vault's facts, a new and a repeat credit, and the one-block hold then a redeem. Keep all of them passing.","title":"Launch text understates the suite: it says 180 tests (172 offline, 8 fork) but the tree runs 210 (199 offline, 11 fork)"}],"hash":"46c1c2141b01e5a881c3ac20a750a5f3d8d6ff825be8ee735eadd90c0ecc1ae6","nodeId":"72ec1848-e9ea-4de8-8880-fe36980a6832","outcome":"completed","summary":"The review is complete. The findings file is at `.imd-findings.json` with 5 findings and 12 coverage rows, and no tracked file was changed.\n\n**What I verified**\n\n- `src/Stacker.sol` holds as deployed: guards, one-time asset check and approval with rollback, exact-amount pull and deposit, totals and event, reentrancy guard. The 5 mainnet fork tests pass live against the real IMD and sIMD. The compiled runtime is 2,528 bytes with no forbidden opcodes under the protected test's exact scan, and `launch.json` matches the brief's two checksummed addresses.\n- All 9 listed entry points are answered. 7 hold, 2 carry findings. The slither leads on `tryRecover` and `expire` return values are wrong: both values are checked.\n\n**Findings kept, after reproduction and merging**\n\n1. **Medium, README rule 3.** \"Fall back to sender\" credits the Uniswap v4 router on every frontend swap with empty hookData, and Universal Router's permissionless sweep lets anyone take the sIMD. Merged from two specialists. The deployed code is fine; the fix is wording in the integration rule and later the registry's trader rule.\n2. **Low, registry `applyListing`.** A squatter holds a project's single application slot for one oracle fee per cycle. Reproduced in a scratch test. Downgraded from medium because the registry is not deployed in this launch, with a note to fix it before that launch.\n3. **Low, `Stacker.credit` line 80.** The IMD token is accepted as a share recipient while the Stacker and vault are rejected. Reproduced in a scratch test.\n4. **Low, registry fee guard text.** LP fees count as leaving even when the wash-trader is the LP. Policy text only.\n5. **Info, job text.** Stated test count is stale. Actual run: 199 offline passed, 11 fork skipped, 210 total.\n\nNo critical or high finding, so no proof files were attached. Scratch tests live under `test/scratch/` and are not kept.","treeHash":null,"usage":{"cachedInputTokens":803102,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":26466,"runtime":"claude","turns":22,"wallClockMs":399962}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1c29c7c6e4cf57eb","findings":[{"citation":"resolved","description":"The fee-guard rule the panel applies (and README line 125 / rule 1 restate) counts fees paid to liquidity providers as 'leaving for good' ('fees to third parties', and LP liquidity no owner/team can withdraw per lockedValue). It only compares the sizes of fee parts; it never accounts for the trader being the recipient of the 'leaving' part. A wash trader who is also the dominant in-range LP of the listed pool gets almost all of the 'leaving' fee back, so the inequality L >= C holds while the net cost of a point collapses far below 1 IMD. This breaks the guarantee the guard is stated to buy: 'so trading with yourself to farm points always costs more than it brings back'. Seam (boundary x invariant): the invariant 'self-trade cost >= cashback' is checked on fee shares by destination class, but is false at the boundary where the trader's LP share f -> 1. Not deployed in this launch (registry and points are off-chain/later), hence low; it affects the points that the Stacked events feed.","line":541,"path":"src/ProjectRegistry.sol","reproduction":"Listed project: Uniswap v4 hook on an IMD/X pool, LP fee 1% (to LPs), hook fee 1% of the IMD side, all of it credited as cashback at rate 100 bps (C = 1%, owner part O = 0, leaving part L = 1% >= C, so the panel's feeGuard is met). Attacker (not owner/team, so the panel cannot see it) adds narrow-range liquidity around the current price so it holds f = 99% of in-range liquidity. Round trip: swap 1,000 IMD -> X, then X -> IMD (the hook credits on buys and sells, as PLEA v10 does). Per leg: cashback 10 IMD credited via Stacker.credit(attacker, 10e18) -> Stacked(project, attacker, 10e18, shares); LP fee ~10 IMD, of which 9.9 returns to the attacker as LP fees. Net per round trip: points +20 (20 IMD stacked), value returned ~20 IMD sIMD + ~19.8 IMD LP fees; cost ~0.2 IMD of LP fee to the other 1% of liquidity plus gas (round-trip price impact inside own liquidity is returned). Expected per README:125: farming 20 points costs more than 20 IMD-worth brought back (net cost >= C = 20 IMD). Actual: net cost ~0.2 IMD, i.e. ~0.01 IMD per point, 100x below the guard's intended floor; repeating N times farms 20N points for ~0.2N IMD. Fix: count LP fees as leaving only to the extent the pool's LPs are not the trader (unverifiable on chain), or require the leaving part to exclude LP fees, or have the indexer discount points from traders that are in-range LPs of the same pool/same tx-sender clusters.","severity":"low","snippet":"            '\",\"feeGuard\":\"Split the trading fee into three parts: the cashback; the parts that come back to the owner or team (owner share, treasury, liquidity or reserves the owner or team can withdraw); and the parts that leave for good (burned tokens, prizes paid to others, fees to third parties, locked value as in lockedValue). The parts that leave for good must add up to at least the cashback. If the rate or the fee split can change, the code must keep this true for every allowed setting.\",\"lockedValue\":\"Liquidity or reserves that no owner or team wallet can ever withdraw count as leaving for good, even if the contract itself can move them between its own positions or pools.\"'","title":"Fee guard counts LP fees as 'leaving' even when the self-trader is the LP, so wash-trading points cost ~1% of the stated floor"}],"hash":"7b3703652efdab8e2d7cb7f83b1108cac11ddf6c3aecdee222b8c6b0d4add1fb","nodeId":"67081e45-d282-4e67-906a-70ef0e0d9ddf","outcome":"completed","summary":"I found nothing to fix in the math of the Stacker, the one contract this launch deploys. I filed one low finding about the off-chain points rules, and wrote it with coverage rows for all 9 entry points to `.imd-findings.json`. I changed no repository files. The offline suite passes: 181 passed, 0 failed, 11 skipped (fork tests without RPC). The brief and README say 180 tests (172 offline, 8 fork); the actual total is 192, so those counts are out of date.\n\n**Stacker.credit: holds**\n- **Rounding:** the vault rounds shares down. With sIMD's 6-decimal offset, a trader loses less than one share, about 1e-6 of a token's smallest unit.\n- **Zero shares and donation attacks:** the `ZeroShares` check rolls the whole credit back. Forcing a zero-share result with 1.81M IMD staked would take a donation of about 1.8e12 IMD, which isn't possible.\n- **Totals:** the running totals use checked additions and are capped by IMD's total supply. `totalStacked` always equals the sum of the per-project totals exactly.\n- **Edge amounts:** a zero amount skips the vault check, the approval and every state change. The maximum value reverts cleanly in the vault's math.\n- **First credit:** the vault check and approval roll back if the credit fails. The one-time unlimited approval can never run out.\n\n**ProjectRegistry (not deployed in this launch): every entry point holds**\n- The rate limits (25 to 100 bps) and text-length limits are inclusive and checked before any payment.\n- Time arithmetic is widened before adding or safely bounded, so it can't overflow.\n- The 1-day expiry boundary leaves no overlap and no gap: an answer is accepted up to exactly one day after the ask, and `expire` is open from one second later. Cooldown, handoff and the 5-minute clock tolerance also behave at their exact edges.\n- Fee and bond amounts add up: the registry pulls the fee plus bond, approves exactly the fee, and pays out one bond per settled question.\n- The panel check requires at least 15 seats and at least 11 agreeing, and never fewer than the stated quorum.\n\n**Finding 1 (low): the fee guard doesn't stop cheap self-trading for points.** The listing rule (`src/ProjectRegistry.sol:541`, restated in the README) counts fees paid to liquidity providers as money that leaves the project. It ignores the case where the self-trader is also the main liquidity provider.\n- **Example:** a pool with a 1% LP fee and 1% cashback meets the rule. An attacker holding 99% of the active liquidity trades 1,000 IMD back and forth.\n- **Result:** they get 20 points and roughly 39.8 IMD back, for about 0.2 IMD plus gas.\n- **Why it matters:** the README says self-trading for points \"always costs more than it brings back\", which assumes a net cost of at least 20 IMD here. The actual cost is about 100 times lower.\n\nIt is low because points are off-chain, nothing is promised, and the registry isn't part of this launch. No proof test is attached, since only critical and high findings need one.\n\nThe static-analysis leads I checked (unused return values, timestamp comparisons, state written after an external call) don't hold up as math defects. I didn't run the fork tests because no RPC was configured, so the live mainnet vault was not checked directly; I relied on the brief's on-chain facts.","treeHash":null,"usage":{"cachedInputTokens":910222,"inputTokens":28,"model":"claude-opus-5-5","outputTokens":13932,"runtime":"claude","turns":14,"wallClockMs":243069}},{"artifacts":[],"attempt":1,"bundleHash":"f273e1e058ecea20cc42117b1de303e7521aea2f6bf2a3cf674bedb1988e0f13","device":"540f6378761dba26","findings":[],"hash":"970a252f53690b8b846026be21d00b017eb15584057cde5540dc6dde959c2e1f","nodeId":"cfeb95a8-4704-4e5b-b5f1-f159d70ce65c","outcome":"completed","summary":"Added seven tests under `test/` covering vault-transfer failures, atomic rollback, single fallback payouts, and recovery, including two 1,000-run fuzz tests.\n\n`forge build` and `forge test` pass: **217 passed, 0 failed, 11 skipped**. Existing invariants pass. Fork tests remain unrun without RPC settings.","treeHash":"d24da220e4e1111bc34eddad1bf91d3a1ee19453","usage":{"cachedInputTokens":1924608,"inputTokens":130864,"model":"gpt-6-astra","outputTokens":10114,"runtime":"codex","turns":7,"wallClockMs":422268}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"232b62e021f6f394","findings":[{"citation":"resolved","description":"The mainnet adaptation added InvalidTrader for address(this) and address(SIMD) because sIMD shares minted to either can never be moved (ADAPTATION.md, 'Unreachable share recipients'). The IMD token itself (0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7, verified source BridgedFP: OFT + name/symbol setters, no token-rescue function) is the third address the Stacker already knows that is in exactly the same position, and it is not rejected. A hook following README rule 3 resolves the trader from caller-supplied hookData; a swapper (or a buggy hook) that resolves to the IMD address makes credit succeed, pulls the project's cashback, mints shares to the token contract where no code can redeem or transfer them, and emits Stacked(project, IMD, ...), so the indexer attributes points to the token contract. The README's rule 3 lists only 'the zero address, Stacker and vault' as invalid recipients, so integrators validating against that list will not catch it either. Impact is bounded to the cashback of each such trade and is mostly self-inflicted by the swapper, hence low; it is reported because the launch record presents the two-address guard as closing this class. Minimal fix that preserves the design: also revert InvalidTrader when trader == address(IMD), and list the token in README rule 3. Execution-trace note: the rest of credit's control flow holds: ZeroTrader and InvalidTrader run before any external call, the zero-amount early return happens before vault validation, _vaultReady and the max approval are set before the pull and are rolled back with it on any later revert (verified with LateFailureVault and on a mainnet fork), nonReentrant covers the one entry point, and the OFT has no transfer hooks.","line":80,"path":"src/Stacker.sol","reproduction":"Local (any fixture): deal 1e18 IMD to `project`, project approves the Stacker, then `vm.prank(project); stacker.credit(address(imd), 1e18)`. Expected (by parity with the Stacker and vault guards): revert InvalidTrader, nothing moves. Actual: returns shares > 0, `sImd.balanceOf(address(imd)) == shares`, `imd.balanceOf(project) == 0`, `projectStacked[project] == 1e18`, and a Stacked event with trader = the IMD token. Run from test/scratch: `forge test --match-path test/scratch/ImdRecipient.t.sol` passed (asserting the credit succeeds). On mainnet the same call with trader = 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7 mints sIMD to the OFT contract, whose verified source (Sourcify exact match, BridgedFP.sol) has no function that can move an ERC-20 it holds.","severity":"low","snippet":"        if (trader == address(this) || trader == address(SIMD)) revert InvalidTrader();","title":"Recipient guard rejects the Stacker and the vault but not the IMD token contract, an equally unreachable share holder"},{"citation":"resolved","description":"First-principles check of the integration rules the task says to keep. In a Uniswap v4 hook, the `sender` argument of beforeSwap/afterSwap is the contract that called PoolManager.swap, which for every interface or aggregator swap is a router (Universal Router, V4Router), never the user. The Uniswap interface passes empty hookData by default, so a hook that implements rule 3 literally ('hookData, else sender') calls credit(router, cashback) on every such swap: the IMD is pulled from the project, the sIMD shares are minted to the router (which has no way to redeem or move them), and Stacked attributes the points to the router. Rule 6 later says to 'support the router's msgSender', which is the actual fix (IMsgSender(sender).msgSender(), the interface Uniswap's routers expose), but rule 3 and the registry's listing definition (src/ProjectRegistry.sol line 536: 'with the swap sender as the fallback') both state the raw sender as the fallback. The Stacker cannot detect this (the router is a valid address), so the loss is per trade and bounded to the cashback; low. Minimal fix that keeps the agreed rule order: in rule 3 define the fallback as the router's msgSender() when the sender exposes it, and only then the raw sender; the registry's definition text is outside this launch.","line":166,"path":"README.md","reproduction":"Hook H implements rule 3 as written: `trader = hookData.length == 20 ? address(bytes20(hookData)) : sender`. A user swaps through the Universal Router (sender = router, hookData = 0x). H computes cashback = fee * rate and calls `stacker.credit(router, cashback)`. Expected per the brief ('pay the real trader'): the swapper receives the sIMD. Actual: credit succeeds, `sIMD.balanceOf(router)` grows by the shares, the swapper receives nothing, and the Stacked event names the router as trader. Locally this is the ordinary success path of `credit` with trader = any contract address, e.g. `stacker.credit(address(someRouterMock), 1e18)` returns shares and `sImd.balanceOf(address(someRouterMock)) == shares`.","severity":"low","snippet":"3. **Pay the real trader.** Read it from the router's `hookData`, fall back to `sender`, never use `tx.origin`. Validate the resolved recipient; the zero address, Stacker and vault are invalid recipients. Catching an invalid-recipient error does not correct a wrongly resolved trader for the plain-IMD fallback.","title":"Integration rule 'fall back to sender' credits the router, not the trader, for Uniswap v4 swaps that carry no hookData"},{"citation":"resolved","description":"The job text (and the task brief derived from it) carries the count from before the mainnet adaptation added StackerAuditRegression, StackerGas and two more mainnet fork tests. ADAPTATION.md already states the correct figures (181 passed, 11 skipped offline; 192 with both RPCs). Only the record is wrong; every test passes. Worth correcting so a verifier comparing counts does not read the extra tests as unexpected.","line":14,"path":"jobs/4-mainnet-launch.md","reproduction":"`forge test` in this tree: 'Ran 29 test suites ... 181 tests passed, 0 failed, 11 skipped (192 total tests)'. With `ETH_RPC_URL=https://ethereum-rpc.publicnode.com forge test --match-path test/MainnetFork.t.sol`: 5 passed; with `SEPOLIA_RPC_URL=https://ethereum-sepolia-rpc.publicnode.com forge test --match-path 'test/*SepoliaFork.t.sol'`: 6 passed (5 + 1). Expected from the text: 172 offline and 8 fork tests. Actual: 181 and 11.","severity":"info","snippet":"TESTS: forge test passes (180 tests: 172 run offline; 8 fork tests run when ETH_RPC_URL and SEPOLIA_RPC_URL are set and are skipped otherwise). test/MainnetFork.t.sol runs against live IMD and sIMD; it checks the vault's facts, a new and a repeat credit, and the one-block hold then a redeem. Keep all of them passing.","title":"Launch text understates the suite: it says 180 tests (172 offline, 8 forks) but the tree runs 192 (181 offline, 11 forks)"}],"hash":"a882245a10e481df9e4577e3268444f159f93dc642d442e758a3560ecf19ecfb","nodeId":"2e52d9fd-9f1a-43c0-8d5e-2fa7e24c8d72","outcome":"completed","summary":"The review is complete. The findings file is written, the working tree is otherwise unchanged, and the scratch tests are removed.\n\n**Outcome.** The Stacker's control flow holds for the mainnet launch. No critical, high or medium defects. I recorded two low findings and one informational note in `.imd-findings.json`, with a coverage row for all nine listed entry points plus five invariant rows.\n\n**What I verified**\n\n- **Execution trace of credit.** Guards run before any external call. The zero-amount return precedes vault validation. The ready flag and the max approval are set before the pull and roll back with it on any later revert. The guard is single-entry and the token has no transfer hooks, so the static-analysis reentrancy leads do not reach a failing state.\n- **Periphery against live mainnet.** Sourcify exact matches show the live vault is the test double apart from name, symbol and pragma, with identical Solady sources. IMD is a LayerZero OFT on OpenZeppelin 5.4 with no fee, pause or hooks, and it does not decrement a max allowance. Live reads confirm the vault's asset, renounced owner, unpaused state and 24 decimals.\n- **Launch artifacts.** The manifest matches the brief and schema. I ran the supplied protected test on the exact creation bytecode: it passes with a 2,528-byte runtime and no escape opcodes.\n- **Tests.** The offline suite passes. All five mainnet fork tests and all six Sepolia fork tests pass against public RPCs, including the 177k out-of-gas rollback and the 350k cold first credit.\n\n**Findings**\n\n1. **Low, src/Stacker.sol line 80.** The recipient guard rejects the Stacker and the vault but not the IMD token contract, which can equally never move sIMD. A credit naming the token as trader succeeds and strands the shares. I reproduced this with a scratch test.\n2. **Low, README.md line 166.** Rule 3 says to fall back to `sender`. In a Uniswap v4 hook that is the router, so interface swaps with empty hookData credit the router and strand the cashback. Rule 6 already names the correct resolution through the router's msgSender.\n3. **Info, jobs/4-mainnet-launch.md line 14.** The launch text says 180 tests with 8 forks. The tree runs 192 with 11 forks, as the adaptation notes already state.\n\n**Not reached.** I did not measure whole-transaction gas against the brief's exact figures, only that the documented budgets succeed on the fork. I did not audit the registry or oracle beyond a control-flow trace, since they are not deployed in this launch.","treeHash":null,"usage":{"cachedInputTokens":2340052,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":47423,"runtime":"claude","turns":52,"wallClockMs":786651}},{"artifacts":[],"attempt":1,"bundleHash":"2b8e854a4e887ea7565b7636f63fd43fd67336eae42da1b7acd507cdfe89bfb4","device":"33ce0bb3dec09f0b","findings":[],"hash":"cdeea972d70c3f75752e5c5594032c80cba6a8d6d0e75761cba28b2aa662fee8","nodeId":"cfeb95a8-4704-4e5b-b5f1-f159d70ce65c","outcome":"completed","summary":"Added tests for the exact mainnet deployment, dependency-failure rollback, and randomized hold/conservation invariants. Changes are confined to `test/`.\n\nVerification passed:\n\n- `forge build`\n- `forge test`: **199 passed, 0 failed, 11 skipped**\n\nThe skipped fork tests still require mainnet/Sepolia RPC configuration.","treeHash":"ac6bef76c554d75d35d43a5b2c937041e1601505","usage":{"cachedInputTokens":2998912,"inputTokens":136883,"model":"gpt-6-astra","outputTokens":19091,"runtime":"codex","turns":7,"wallClockMs":675572}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dd2ee4882a1be950","findings":[],"hash":"d9c73f0b987076e7b8e939886201d8918bea84cb38394b9bbbb76f842827f1ca","nodeId":"a63205eb-53c5-4e5f-af74-dc4818678773","outcome":"completed","summary":"The review is complete. The findings file holds an empty findings list and 11 coverage rows, and the working tree is clean apart from that file.\n\n**Result: no reproducible defect in the access-control, trust-gap or asymmetry area.**\n\nWhat I verified:\n- **Stacker.credit** pulls only the caller's own IMD, mints only to the trader, rejects zero, self and vault recipients before any transfer, and is fully under the reentrancy guard. The one-time max approval to the immutable vault can only be spent by the Stacker's own deposit call. A failed first credit rolls back both the flag and the approval.\n- **Launch manifest** lists exactly the Stacker with the live IMD and sIMD addresses in declaration order. The protected floor rehearsal with the real init code passes, and no owner, admin, fee, pause or upgrade exists in the ABI.\n- **Live facts** at block 26,176,338 match the brief: vault asset is IMD, owner renounced, not paused, 24 decimals. The offline suite passes and all 5 mainnet fork tests pass against the local endpoint.\n- **ProjectRegistry entry points** all hold under my lenses. The one seam I chased hardest was whether anyone could race `expire` between the Intake completing a request and delivering its callback to void an unfavourable answer. The verified Intake v2 source sets the completed flag and calls the callback in the same transaction, and the callback is non-reentrant, so no such window exists.\n\nDocumented trust assumptions, recorded in coverage rather than as findings: the open-application spam cost is already acknowledged in the design notes, the vault's one-block hold can be stamped by any 1 wei deposit and is covered by an existing regression test, and IMD's OFT owner is not renounced, which is outside the Stacker's code.","treeHash":null,"usage":{"cachedInputTokens":1213441,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":29563,"runtime":"claude","turns":34,"wallClockMs":478599}},{"artifacts":[],"attempt":1,"bundleHash":"265f5df761b81b064076b2b07479747e5f75ff0024d5990f5d07e4e698e1c386","device":"c0e6ac7ffff8e2ca","findings":[],"hash":"e9836d01405f234fc28cc821021f8ebc0011d69c2cadbf69ac80086d4318e5cb","nodeId":"033947ec-84a3-4eba-bbd9-b42c1609fde8","outcome":"completed","summary":"Completed the launch adaptation: fixed unsafe recipients, corrected first-credit gas guidance, added regressions, and documented all findings in `ADAPTATION.md`.\n\nValidation passed: clean `forge build`, 181 offline tests, all 192 tests with RPCs, and the protected deployment checks.\n\nManifest and dependencies remain unchanged. No mainnet transaction was broadcast; the deployment address remains pending.","treeHash":"718db885e255028536c3caae3d0d749bff77cbef","usage":{"cachedInputTokens":1799808,"inputTokens":110576,"model":"gpt-6-astra","outputTokens":19458,"runtime":"codex","turns":8,"wallClockMs":648220}},{"artifacts":[],"attempt":1,"bundleHash":"ac8c350117869b361c34d0a13412a8f9137b9b716b114de653f07bd8e4f04654","device":"ea20ea7fff8df204","findings":[],"hash":"f7f77b2dd1d84fb426d8bfb85be33435ff86010ec6a9972d3ea784dfaa508fc4","nodeId":"6a451abf-b9ad-412b-9893-75dd42e83a1b","outcome":"completed","summary":"Updated only `launch.json`, normalizing the real IMD and sIMD addresses to the brief’s exact strings. Stacker remains the sole deployment; arguments match its compiled constructor ABI.\n\n`forge build` passed. `forge test`: 192 passed, 0 failed, 11 fork tests skipped without RPC URLs. Manifest checks and `git diff --check` passed.","treeHash":"f04ca0f9a123962bbcd7606e1a494fd2ba4e66b8","usage":{"cachedInputTokens":151040,"inputTokens":20105,"model":"gpt-6.1-sol","outputTokens":1572,"runtime":"codex","turns":3,"wallClockMs":82407}}],"verification":[{"checks":[{"durationMs":10415,"exitCode":0,"name":"build","output":"Compiling 82 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.31s\nCompiler run successful!\n","passed":true},{"durationMs":5258,"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 441.94µs (52.09µs CPU time)\n\nRan 5 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_liveStackerValidCreditMatchesMainnetCandidate() (gas: 0)\n[SKIP] test_sepolia_mainnetCandidateRejectsLegacyUnreachableRecipients() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 542.82µs (63.79µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419526)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 948.45µs (763.60µs CPU time)\n\nRan 5 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_firstCreditNeedsInitializationGas() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\n[SKIP] test_fork_readmeBudgetFundsColdFirstCredit() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 926.02µs (174.87µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910552)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637915)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 939.99µs (937.32µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128217)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140183)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140267)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.03ms (213.31µ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.20ms (163.99µs CPU time)\n\nRan 5 tests for test/StackerGas.t.sol:StackerGasTest\n[PASS] test_oldGasCapFailsRepeatedlyAndDoesNotPrimeVault() (gas: 600669)\n[PASS] test_readmeBudgetFundsColdFirstCredit() (gas: 359500)\n[PASS] test_readmeFallbackHasGasEvenWhenCreditExhaustsItsBudget() (gas: 473042)\n[PASS] test_readmeFallbackPaysPlainImdWhenVaultFails() (gas: 272196)\n[PASS] test_readmeGasGuardRejectsLowEstimateBeforeFallback() (gas: 93987)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.20ms (787.68µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171485)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.23ms (146.50µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190488)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.42ms (144.79µ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: 8789798)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.81ms (2.70ms 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 6.29ms (971.12µ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 9.54ms (157.69µs CPU time)\n\nRan 4 tests for test/StackerAuditRegression.t.sol:StackerAuditRegressionTest\n[PASS] testFuzz_unreachableRecipientsRejectedBeforeAndAfterFirstCredit(uint256,bool) (runs: 256, μ: 1002469, ~: 956806)\n[PASS] test_creditToStackerRevertsWithoutEffects() (gas: 325847)\n[PASS] test_creditToVaultRevertsWithoutEffects() (gas: 325826)\n[PASS] test_zeroAmountStillRejectsUnreachableRecipients() (gas: 651753)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 75.04ms (74.35ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392358, ~: 392201)\nLogs:\n  Bound result 999999999999999999999997\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367412, ~: 368896)\nLogs:\n  Bound result 6\n  Bound result 5\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430297, ~: 430348)\nLogs:\n  Bound result 101\n  Bound result 6\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56108)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131285)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9374313)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378485)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370592)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383339)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508159)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617869)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374458)\n[PASS] test_credit_totalsAndEvent() (gas: 494115)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80095)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531771)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397491)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791622)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053729)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 139.97ms (157.65ms CPU time)\n\nRan 8 tests for test/RegistryBondOwed.t.sol:RegistryBondOwedTest\n[PASS] test_blockedBeneficiary_signedYes_defendsAndOwesBond() (gas: 1110574)\n[PASS] test_blockedChallenger_expireClearsAndOwesBond() (gas: 938046)\n[PASS] test_blockedChallenger_failureClearsAndOwesBond() (gas: 1231384)\n[PASS] test_blockedChallenger_signedNo_delistsAndOwesBond() (gas: 1218816)\n[PASS] test_claimBond_refusesZeroAddressAndNothingOwed() (gas: 67205)\n[PASS] test_falseReturningToken_owesBond() (gas: 1051689)\n[PASS] test_owedBondsAccumulate() (gas: 1420615)\n[PASS] test_unblocked_paysAtOnce() (gas: 949759)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 341.89ms (9.36ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976839, ~: 976825)\nLogs:\n  Bound result 58534057458836208053646\n  Bound result 26477024729773918\n  Bound result 355515917800551269274\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935757, ~: 2941171)\nLogs:\n  Bound result 6861\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598555)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117639)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937541)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738664)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925875)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 429.80ms (739.20ms CPU time)\n\nRan 1 test for test/StackerInvariant.t.sol:StackerInvariantTest\n[PASS]\nStackerInvariantTest invariants:\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_totalsConsistent\n[PASS] invariant_vaultConservation\n StackerInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭----------------+-------------+-------+---------+----------╮\n| Contract       | Selector    | Calls | Reverts | Discards |\n+===========================================================+\n| StackerHandler | advance     | 390   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 414   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 380   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 420   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 444   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 8\n  Bound result 10\n  Bound result 5\n  Bound result 1\n  Bound result 997999999999999999991\n  Bound result 5460\n  Bound result 1\n  Bound result 375838254045896945060945\n  Bound result 1000000000000\n  Bound result 6845\n  Bound result 5\n  Bound result 2\n  Bound result 958\n  Bound result 22787602\n  Bound result 7000000000000000000\n  Bound result 2\n  Bound result 462126170791183393840\n  Bound result 365124624602176124064\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 546.15ms (543.57ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 16093)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8199369)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4275570)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 549.34ms (24.93ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 210678, ~: 55529)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 492520, ~: 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: 5750239)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6028440)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 8851297)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 8849434)\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: 74090)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 5803862)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5678069)\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 566.48ms (57.38ms CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8877082, ~: 8880080)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6006788, ~: 6012600)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945070, ~: 6945306)\nLogs:\n  Bound result 60\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084050, ~: 3083765)\nLogs:\n  Bound result 11169038\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 5990730)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6437199)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 5968620)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6395718)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12028378)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3144758)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12020558)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6391316)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6103781)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6527386)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 8859748)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 5995976)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6078615)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 566.54ms (1.20s CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950295, ~: 2950111)\nLogs:\n  Bound result 1965597521593300\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 8867245)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 20725225)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 5898421)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9016484)\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 569.50ms (95.10ms CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3437980, ~: 3408326)\nLogs:\n  Bound result 15\n  Bound result 50\n  Bound result 50\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6442167, ~: 6388378)\nLogs:\n  Bound result 24\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3690000)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3308084)\n[PASS] test_challengeMaximumReason() (gas: 6790348)\n[PASS] test_challengeMinimumReason() (gas: 6291178)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53526332)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3593126)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 581.52ms (1.16s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243026, ~: 6242984)\nLogs:\n  Bound result 306177762412870598930114870585839269430428281973877359661310\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6327512, ~: 6334710)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4765086, ~: 3278654)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121969, ~: 6121713)\nLogs:\n  Bound result 2\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3258923)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3249382)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9364349)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6101843)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3436610)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4035194)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10303138)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3249671)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6375042)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3373212)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9489195)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6249680)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6263563)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6246734)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3471059)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3380979)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 581.71ms (2.32s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6227566, ~: 6227692)\nLogs:\n  Bound result 6718\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3160170, ~: 3157969)\nLogs:\n  Bound result 131323\n\n[PASS] test_checksBeforeTheIntervalStillComeFirst() (gas: 6181667)\n[PASS] test_clockIsPerProject() (gas: 6191563)\n[PASS] test_expiredAndFailedQuestionsLeaveTheClockAlone() (gas: 8927650)\n[PASS] test_handoffEmitsEventAndStartsExactInterval() (gas: 3134790)\n[PASS] test_intervalRefusesAThirdWalletToo() (gas: 3177538)\n[PASS] test_relistingByApplicationNamesANewWalletWithoutAHandoff() (gas: 17842028)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 581.61ms (805.47ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 232527, ~: 232298)\nLogs:\n  Bound result 575970240207459881305566\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1462238, ~: 1162704)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388811, ~: 388766)\nLogs:\n  Bound result 279219358127\n  Bound result 245874525523\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 741591, ~: 761846)\nLogs:\n  Bound result 77230816520797857801753\n  Bound result 531642\n  Bound result 47819093762290316970514\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682914, ~: 688950)\nLogs:\n  Bound result 17947620050074541276557\n  Bound result 84310272826986001748759\n  Bound result 64628934806337324630938\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 489874, ~: 510554)\nLogs:\n  Bound result 4779\n  Bound result 1000000000000000000\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615735)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365218)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591165)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662847)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238887)\n[PASS] test_credit_oneWei() (gas: 361809)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468534)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326738)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 737051)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91135)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522365)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 581.75ms (2.46s 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            | 267   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 232   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 270   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 236   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 271   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 258   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 264   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 250   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 57101\n  Bound result 157507\n  Bound result 50\n  Bound result 38\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18034441)\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 613.15ms (614.89ms 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        | 490   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 534   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 476   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 482   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 459   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 446   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 454   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 477   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 474   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 469   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 486   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 460   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 437   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 50\n  Bound result 100000000000000000000\n  Bound result 200\n  Bound result 2\n  Bound result 3\n  Bound result 2877\n  Bound result 410000\n  Bound result 1\n  Bound result 92792835152423\n  Bound result 10\n  Bound result 117300738\n  Bound result 659918\n  Bound result 17\n  Bound result 19237\n  Bound result 11\n  Bound result 18093\n  Bound result 4728\n  Bound result 24999999999999999999997\n  Bound result 130362613\n  Bound result 512\n  Bound result 896635\n  Bound result 500\n  Bound result 338968\n  Bound result 49\n  Bound result 410000\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540563)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.75s (3.75s CPU time)\n\nRan 3 tests for test/RegistryAccountingInvariant.t.sol:RegistryAccountingInvariantTest\n[PASS]\nRegistryAccountingInvariantTest invariants:\n[PASS] invariant_eachActorGetsExactlyTheirEntitlement\n[PASS] invariant_requestsAndListingsMatchIndependentHistory\n RegistryAccountingInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+----------------------+-------+---------+----------╮\n| Contract                  | Selector             | Calls | Reverts | Discards |\n+===============================================================================+\n| RegistryAccountingHandler | ask                  | 1772  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1810  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1836  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1835  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1852  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1823  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1812  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1838  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1806  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 24576\n  Bound result 61\n  Bound result 4199\n  Bound result 41\n  Bound result 572787076\n  Bound result 26\n  Bound result 93\n  Bound result 25\n  Bound result 12625\n  Bound result 3801688\n  Bound result 21678\n  Bound result 46\n  Bound result 14023\n  Bound result 840068081194201632\n  Bound result 96\n  Bound result 88832\n  Bound result 264337553929869076\n  Bound result 6191542\n  Bound result 249\n  Bound result 17277680004083635\n  Bound result 11556\n  Bound result 48\n  Bound result 16287\n  Bound result 97\n  Bound result 93\n  Bound result 28\n  Bound result 3\n  Bound result 113\n  Bound result 1891295326585\n  Bound result 13572\n  Bound result 7\n  Bound result 0\n  Bound result 25\n  Bound result 1\n  Bound result 84\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 38742833)\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: 15880704)\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.15s (5.17s CPU time)\n\nRan 29 test suites in 5.15s (15.65s CPU time): 181 tests passed, 0 failed, 11 skipped (192 total tests)\n","passed":true},{"durationMs":70,"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.claimBond(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\":54,\"NEXT_SESSION.md\":66,\"README.md\":258,\"app.js\":1368,\"docs/design.md\":305,\"docs/explainer.html\":247,\"docs/history.md\":233,\"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/9-sepolia-v3-relaunch.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,\"jobs/requests/9-sepolia-v3-relaunch.json\":31,\"launch.json\":13,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":679,\"src/Stacker.sol\":102,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":141,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryBondOwed.t.sol\":290,\"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\":141,\"test/Stacker.t.sol\":420,\"test/StackerAuditRegression.t.sol\":91,\"test/StackerEdges.t.sol\":391,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerGas.t.sol\":114,\"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":"18591ab26845dbd465620738b79e7a7dbae373f7774eda3ef7ff7b2e5a52a4aa","verifiedTreeHash":"f67cdad18ca808a6fcc2a1583091de5ded3c6bcf","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":10769,"exitCode":0,"name":"build","output":"Compiling 84 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.67s\nCompiler run successful!\n","passed":true},{"durationMs":5220,"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 410.22µs (36.67µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419526)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 713.58µs (538.82µs CPU time)\n\nRan 5 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_firstCreditNeedsInitializationGas() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\n[SKIP] test_fork_readmeBudgetFundsColdFirstCredit() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 730.28µs (123.30µs CPU time)\n\nRan 5 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_liveStackerValidCreditMatchesMainnetCandidate() (gas: 0)\n[SKIP] test_sepolia_mainnetCandidateRejectsLegacyUnreachableRecipients() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 607.06µs (154.40µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156249)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.68ms (239.66µs CPU time)\n\nRan 5 tests for test/StackerGas.t.sol:StackerGasTest\n[PASS] test_oldGasCapFailsRepeatedlyAndDoesNotPrimeVault() (gas: 600749)\n[PASS] test_readmeBudgetFundsColdFirstCredit() (gas: 359540)\n[PASS] test_readmeFallbackHasGasEvenWhenCreditExhaustsItsBudget() (gas: 473042)\n[PASS] test_readmeFallbackPaysPlainImdWhenVaultFails() (gas: 272236)\n[PASS] test_readmeGasGuardRejectsLowEstimateBeforeFallback() (gas: 93987)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.84ms (674.47µ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.02ms (844.40µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162607)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.02ms (183.13µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910632)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637955)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.20ms (1.04ms CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190488)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.37ms (148.74µs CPU time)\n\nRan 7 tests for test/TraderResolution.t.sol:TraderResolutionTest\n[PASS] test_directNoCodeSenderCanBeResolvedWithoutTxOrigin() (gas: 303966)\n[PASS] test_emptyHookDataResolvesActiveMsgSenderAndCannotBeSwept() (gas: 381420)\n[PASS] test_hookDataTakesPrecedenceAndSupportsContractWallets() (gas: 477363)\n[PASS] test_invalidHookDataPaysPlainImdToKnownCallerNeverInvalidRecipient() (gas: 882426)\n[PASS] test_legacyEmptyHookDataCreditsRouterAndAnyoneCanSweep() (gas: 433080)\n[PASS] test_pausedVaultPaysPlainImdToResolvedMsgSender() (gas: 301439)\n[PASS] test_unknownContractOrInvalidMsgSenderNeverBecomesTheRecipient() (gas: 522893)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.39ms (1.44ms CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128217)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140183)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140267)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.47ms (210.80µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171485)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.48ms (162.01µs CPU time)\n\nRan 8 tests for test/RegistryBondOwed.t.sol:RegistryBondOwedTest\n[PASS] test_blockedBeneficiary_signedYes_defendsAndOwesBond() (gas: 1111110)\n[PASS] test_blockedChallenger_expireClearsAndOwesBond() (gas: 938582)\n[PASS] test_blockedChallenger_failureClearsAndOwesBond() (gas: 1232186)\n[PASS] test_blockedChallenger_signedNo_delistsAndOwesBond() (gas: 1219352)\n[PASS] test_claimBond_refusesZeroAddressAndNothingOwed() (gas: 67205)\n[PASS] test_falseReturningToken_owesBond() (gas: 1052225)\n[PASS] test_owedBondsAccumulate() (gas: 1421417)\n[PASS] test_unblocked_paysAtOnce() (gas: 950295)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 4.87ms (7.06ms CPU time)\n\nRan 3 tests for test/RegistryPolicyRevision.t.sol:RegistryPolicyRevisionTest\n[PASS] test_applicationAndChallengeRequireResolvedTraderAndExcludeLpFees() (gas: 6776893)\n[PASS] test_applicationSlotCanBeReoccupiedAfterFailureNoAndExpiry() (gas: 12156052)\n[PASS] test_lpRebateDefeatsGrossFeeFloor() (gas: 5991)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 21.83ms (3.52ms CPU time)\n\nRan 5 tests for test/StackerAuditRegression.t.sol:StackerAuditRegressionTest\n[PASS] testFuzz_unreachableRecipientsRejectedBeforeAndAfterFirstCredit(uint256,bool) (runs: 256, μ: 1452475, ~: 1499757)\n[PASS] test_creditToImdTokenRevertsWithoutEffects() (gas: 362704)\n[PASS] test_creditToStackerRevertsWithoutEffects() (gas: 364669)\n[PASS] test_creditToVaultRevertsWithoutEffects() (gas: 364714)\n[PASS] test_zeroAmountStillRejectsUnreachableRecipients() (gas: 1092757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 105.70ms (105.07ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 394588, ~: 394401)\nLogs:\n  Bound result 47\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 368034, ~: 368936)\nLogs:\n  Bound result 121821770941771882163172\n  Bound result 2\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430384, ~: 430428)\nLogs:\n  Bound result 2\n  Bound result 121821770941771882163172\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56148)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131325)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9375713)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378525)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370632)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383379)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508239)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617949)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374498)\n[PASS] test_credit_totalsAndEvent() (gas: 494195)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80135)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531891)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397571)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791662)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053849)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 496.30ms (203.34ms 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     | 419   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 388   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 412   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 430   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 399   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 918733236886303075100969\n  Bound result 1000000000000000000000\n  Bound result 281\n  Bound result 400000\n  Bound result 281\n  Bound result 4\n  Bound result 1\n  Bound result 893\n  Bound result 31\n  Bound result 5\n  Bound result 691282150\n  Bound result 7\n  Bound result 4502431\n  Bound result 999999999999999999999999\n  Bound result 10\n  Bound result 2\n  Bound result 7040\n  Bound result 770\n  Bound result 4\n  Bound result 135\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 561.32ms (558.59ms CPU time)\n\nRan 2 tests for test/ProjectRegistryInvariant.t.sol:ProjectRegistryInvariantTest\n[PASS]\nProjectRegistryInvariantTest invariants:\n[PASS] invariant_holdsOnlyOpenBonds\n[PASS] invariant_listingCounts\n[PASS] invariant_recordsConsistent\n ProjectRegistryInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| RegistryHandler | answer            | 254   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 231   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 250   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 254   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 264   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 263   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 229   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 303   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 84\n  Bound result 48\n  Bound result 142368\n  Bound result 30000\n  Bound result 25\n  Bound result 34217\n  Bound result 60\n  Bound result 3764\n  Bound result 30\n  Bound result 35\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18834932)\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 616.62ms (619.60ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 15356)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8224150)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4294731)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 626.70ms (19.92ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 354824, ~: 55484)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 311112, ~: 47489)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3508161)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3197115)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3206825)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3292399)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3204041)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 3094951)\n[PASS] test_apply_validation() (gas: 562892)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 6017073)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6317465)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 9295930)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 9271876)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 6269555)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6422379)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74090)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 6070696)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5944903)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3035084)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 6126458)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3296400)\n[PASS] test_yes_listsFromThisBlock() (gas: 3137828)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 626.66ms (48.65ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 3083731, ~: 3083534)\nLogs:\n  Bound result 20333\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 9267485)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 21725714)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 6165255)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9461119)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 280890)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6364855)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3198964)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4303491)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 344947)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 626.63ms (120.44ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976860, ~: 976865)\nLogs:\n  Bound result 99999000000000910484759\n  Bound result 5045\n  Bound result 2653\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935549, ~: 2930480)\nLogs:\n  Bound result 706\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598595)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117679)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937621)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738736)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925987)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 626.63ms (1.19s CPU time)\n\nRan 4 tests for test/RegistryCooldownBoundary.t.sol:RegistryCooldownBoundaryTest\n[PASS] test_challengeExactlyAtCooldown_succeeds() (gas: 6061757)\n[PASS] test_challengeOneSecondBeforeCooldown_reverts() (gas: 3178920)\n[PASS] test_constructor_rejectsCooldownAboveMax() (gas: 14194)\n[PASS] test_keptChallenge_doesNotRestartCooldown() (gas: 9212238)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 635.06ms (4.11ms CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 9276781, ~: 9273934)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6294747, ~: 6289227)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 7275658, ~: 7275837)\nLogs:\n  Bound result 76\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3217512, ~: 3217182)\nLogs:\n  Bound result 13021\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 6257562)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6717150)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 6257645)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6675961)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12584237)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3278175)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12576416)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6695625)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6370613)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6807338)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 9282189)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 6285001)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6345449)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 635.05ms (1.26s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6494387, ~: 6494524)\nLogs:\n  Bound result 69303\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3293475, ~: 3291386)\nLogs:\n  Bound result 155554\n\n[PASS] test_checksBeforeTheIntervalStillComeFirst() (gas: 6448499)\n[PASS] test_clockIsPerProject() (gas: 6458397)\n[PASS] test_expiredAndFailedQuestionsLeaveTheClockAlone() (gas: 9350092)\n[PASS] test_handoffEmitsEventAndStartsExactInterval() (gas: 3268207)\n[PASS] test_intervalRefusesAThirdWalletToo() (gas: 3310955)\n[PASS] test_relistingByApplicationNamesANewWalletWithoutAHandoff() (gas: 18686914)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 635.14ms (1.27s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3594605, ~: 3556193)\nLogs:\n  Bound result 1\n  Bound result 92\n  Bound result 93\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6737897, ~: 6670858)\nLogs:\n  Bound result 244\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3837328)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3479830)\n[PASS] test_challengeMaximumReason() (gas: 7071032)\n[PASS] test_challengeMinimumReason() (gas: 6596360)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53659749)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3726543)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 635.24ms (1.27s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6509850, ~: 6509804)\nLogs:\n  Bound result 509\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6594889, ~: 6601011)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 5052397, ~: 6524078)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6388808, ~: 6388545)\nLogs:\n  Bound result 29\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3392340)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3382799)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9764595)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6368674)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3570236)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4168611)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10569970)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3383088)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6642139)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3506838)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9889442)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6516512)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6530395)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6513566)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3604476)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3514607)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 635.18ms (1.47s CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 234745, ~: 234510)\nLogs:\n  Bound result 1000000000000000000000000\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1550564, ~: 1370434)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388828, ~: 388782)\nLogs:\n  Bound result 5359069942155\n  Bound result 4799575034877\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 738890, ~: 761938)\nLogs:\n  Bound result 15\n  Bound result 1700000000\n  Bound result 3395723176\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682617, ~: 689036)\nLogs:\n  Bound result 15\n  Bound result 1700000000\n  Bound result 3395723176\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 492082, ~: 510594)\nLogs:\n  Bound result 9536742674903701731\n  Bound result 5359069942155\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615815)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365250)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591245)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662927)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238919)\n[PASS] test_credit_oneWei() (gas: 361849)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468574)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326778)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 737091)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91175)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522405)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 635.22ms (2.61s 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        | 488   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 474   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 427   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 474   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 453   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 459   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 489   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 474   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 488   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 477   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 531   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 451   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 459   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 14808\n  Bound result 13873\n  Bound result 49999999980000000000001\n  Bound result 3098\n  Bound result 1950940078\n  Bound result 1000000\n  Bound result 6218\n  Bound result 1419\n  Bound result 1\n  Bound result 75\n  Bound result 41875\n  Bound result 946019\n  Bound result 5363\n  Bound result 19603\n  Bound result 134604\n  Bound result 67655422\n  Bound result 211871\n  Bound result 50\n  Bound result 3279\n  Bound result 3\n  Bound result 7306977497919249502511\n  Bound result 999000000000000000000\n  Bound result 25\n  Bound result 18802\n  Bound result 25875946416375151031924\n  Bound result 42000000000000000000\n  Bound result 6992578303361268536476\n  Bound result 42000000000000000000\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540803)\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.90s (3.89s CPU time)\n\nRan 3 tests for test/RegistryAccountingInvariant.t.sol:RegistryAccountingInvariantTest\n[PASS]\nRegistryAccountingInvariantTest invariants:\n[PASS] invariant_eachActorGetsExactlyTheirEntitlement\n[PASS] invariant_requestsAndListingsMatchIndependentHistory\n RegistryAccountingInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+----------------------+-------+---------+----------╮\n| Contract                  | Selector             | Calls | Reverts | Discards |\n+===============================================================================+\n| RegistryAccountingHandler | ask                  | 1848  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1788  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1755  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1849  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1842  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1831  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1809  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1843  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1819  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 28\n  Bound result 66\n  Bound result 2193\n  Bound result 36\n  Bound result 1197\n  Bound result 12346\n  Bound result 17\n  Bound result 50\n  Bound result 419105325740578811\n  Bound result 5553\n  Bound result 0\n  Bound result 4962\n  Bound result 993949379993476666\n  Bound result 111837\n  Bound result 31\n  Bound result 3813\n  Bound result 66\n  Bound result 28\n  Bound result 14075\n  Bound result 41\n  Bound result 0\n  Bound result 658670674930721637\n  Bound result 17970\n  Bound result 13468\n  Bound result 9705\n  Bound result 29393\n  Bound result 1\n  Bound result 141515\n  Bound result 33\n  Bound result 93\n  Bound result 1999999999997500000\n  Bound result 101\n  Bound result 48\n  Bound result 2\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 40210610)\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: 16414571)\nLogs:\n  Bound result 50\n  Bound result 0\n  Bound result 0\n  Bound result 50\n  Bound result 500000000000000000\n  Bound result 86400\n  Bound result 1\n  Bound result 50\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.11s (5.13s CPU time)\n\nRan 31 test suites in 5.11s (17.15s CPU time): 192 tests passed, 0 failed, 11 skipped (203 total tests)\n","passed":true},{"durationMs":65,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ProjectRegistry.applyListing(address,string,string,uint16,address)\",\"ProjectRegistry.challenge(address,string)\",\"ProjectRegistry.challengeForBeneficiary(address,string,address)\",\"ProjectRegistry.claimBond(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\":107,\"NEXT_SESSION.md\":66,\"README.md\":260,\"app.js\":1368,\"docs/design.md\":305,\"docs/explainer.html\":247,\"docs/history.md\":233,\"docs/listing.md\":100,\"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/9-sepolia-v3-relaunch.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,\"jobs/requests/9-sepolia-v3-relaunch.json\":31,\"launch.json\":13,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":679,\"src/Stacker.sol\":104,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":141,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryBondOwed.t.sol\":290,\"test/RegistryCallbackGas.t.sol\":111,\"test/RegistryCooldownBoundary.t.sol\":44,\"test/RegistryHandoffInterval.t.sol\":235,\"test/RegistryPolicyRevision.t.sol\":69,\"test/RegistryRevisionRegression.t.sol\":418,\"test/RegistrySepoliaFork.t.sol\":111,\"test/SepoliaFork.t.sol\":141,\"test/Stacker.t.sol\":423,\"test/StackerAuditRegression.t.sol\":99,\"test/StackerEdges.t.sol\":391,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerGas.t.sol\":114,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/TraderResolution.t.sol\":229,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1616,"exitCode":0,"name":"slither","output":"[medium/medium] unused-return at src/oracle/OracleAttestation.sol:171: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/oracle/OracleAttestation.sol#171-189) ignores return value by (recovered,err,None) = ECDSA.tryRecover(digest,signature) (src/oracle/OracleAttestation.sol#184)\n[medium/medium] unused-return at src/ProjectRegistry.sol:412: ProjectRegistry.expire(address) (src/ProjectRegistry.sol#412-421) ignores return value by (None,None,None,completed) = intake.requests(intakeId) (src/ProjectRegistry.sol#417)\n[low/medium] reentrancy-benign at src/Stacker.sol:74: Reentrancy in Stacker.credit(address,uint256) (src/Stacker.sol#74-103):\n[low/medium] reentrancy-benign at src/ProjectRegistry.sol:314: Reentrancy in ProjectRegistry._ask(address,ProjectRegistry.Project,string,uint256) (src/ProjectRegistry.sol#314-332):\n[low/medium] timestamp at src/ProjectRegistry.sol:338: ProjectRegistry.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/ProjectRegistry.sol#338-390) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:287: ProjectRegistry._challenge(address,string,address) (src/ProjectRegistry.sol#287-305) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:412: ProjectRegistry.expire(address) (src/ProjectRegistry.sol#412-421) uses timestamp for comparisons\n[low/medium] timestamp at src/oracle/OracleAttestation.sol:171: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/oracle/OracleAttestation.sol#171-189) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:486: ProjectRegistry.setBeneficiary(address,address) (src/ProjectRegistry.sol#486-500) uses timestamp for comparisons","passed":true},{"durationMs":407,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/Stacker.sol:86: Reentrancy: State change after external call (2 places)\n[low] internal-function-used-once at src/oracle/OracleAttestation.sol:209: Internal Function Used Only Once\n[low] require-revert-in-loop at src/ProjectRegistry.sol:672: Loop Contains `require`/`revert`\n[low] uninitialized-local-variable at src/ProjectRegistry.sol:672: Uninitialized Local Variable\n[low] unsafe-erc20-operation at src/ProjectRegistry.sol:452: Unsafe ERC20 Operation\n[low] unused-public-function at src/ProjectRegistry.sol:505: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2147ac8be050cf189eb6dcf7304690c1ef1e622ee44382cc0bae3c1e7eca12bd","verifiedTreeHash":"8e29b8b74b8443cb17a0f470dfa8b02c2a102525","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":31017,"exitCode":0,"name":"build","output":"Compiling 87 files with Solc 0.8.26\nSolc 0.8.26 finished in 30.80s\nCompiler run successful!\n","passed":true},{"durationMs":12851,"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 514.08µs (31.07µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910632)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637955)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.59ms (1.77ms CPU time)\n\nRan 5 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_liveStackerValidCreditMatchesMainnetCandidate() (gas: 0)\n[SKIP] test_sepolia_mainnetCandidateRejectsLegacyUnreachableRecipients() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 767.18µs (93.19µ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 3.22ms (359.63µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190488)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.21ms (210.36µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128217)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140183)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140267)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.68ms (351.73µ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.14ms (276.06µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419526)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.54ms (5.26ms CPU time)\n\nRan 4 tests for test/RegistryCooldownBoundary.t.sol:RegistryCooldownBoundaryTest\n[PASS] test_challengeExactlyAtCooldown_succeeds() (gas: 6061757)\n[PASS] test_challengeOneSecondBeforeCooldown_reverts() (gas: 3178920)\n[PASS] test_constructor_rejectsCooldownAboveMax() (gas: 14194)\n[PASS] test_keptChallenge_doesNotRestartCooldown() (gas: 9212238)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 8.58ms (10.87ms CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171485)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.70ms (314.86µ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 8.60ms (1.22ms CPU time)\n\nRan 5 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_firstCreditNeedsInitializationGas() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\n[SKIP] test_fork_readmeBudgetFundsColdFirstCredit() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 9.49ms (277.55µs CPU time)\n\nRan 2 tests for test/MainnetLaunchRegression.t.sol:MainnetLaunchRegressionTest\n[PASS] test_manifestCreate2WorksWithoutDependenciesOrInitialization() (gas: 1835792)\n[PASS] test_manifestPinsExactlyOneMainnetStacker() (gas: 14432)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 12.29ms (12.22ms CPU time)\n\nRan 8 tests for test/RegistryBondOwed.t.sol:RegistryBondOwedTest\n[PASS] test_blockedBeneficiary_signedYes_defendsAndOwesBond() (gas: 1111110)\n[PASS] test_blockedChallenger_expireClearsAndOwesBond() (gas: 938582)\n[PASS] test_blockedChallenger_failureClearsAndOwesBond() (gas: 1232186)\n[PASS] test_blockedChallenger_signedNo_delistsAndOwesBond() (gas: 1219352)\n[PASS] test_claimBond_refusesZeroAddressAndNothingOwed() (gas: 67205)\n[PASS] test_falseReturningToken_owesBond() (gas: 1052225)\n[PASS] test_owedBondsAccumulate() (gas: 1421417)\n[PASS] test_unblocked_paysAtOnce() (gas: 950295)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 20.03ms (15.26ms CPU time)\n\nRan 3 tests for test/RegistryPolicyRevision.t.sol:RegistryPolicyRevisionTest\n[PASS] test_applicationAndChallengeRequireResolvedTraderAndExcludeLpFees() (gas: 6776893)\n[PASS] test_applicationSlotCanBeReoccupiedAfterFailureNoAndExpiry() (gas: 12156052)\n[PASS] test_lpRebateDefeatsGrossFeeFloor() (gas: 5991)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 54.51ms (15.63ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 330253, ~: 55470)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 402814, ~: 47489)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3508161)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3197115)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3206825)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3292399)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3204041)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 3094951)\n[PASS] test_apply_validation() (gas: 562892)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 6017073)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6317465)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 9295930)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 9271876)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 6269555)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6422379)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74090)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 6070696)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5944903)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3035084)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 6126458)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3296400)\n[PASS] test_yes_listsFromThisBlock() (gas: 3137828)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 105.82ms (102.30ms CPU time)\n\nRan 5 tests for test/StackerAuditRegression.t.sol:StackerAuditRegressionTest\n[PASS] testFuzz_unreachableRecipientsRejectedBeforeAndAfterFirstCredit(uint256,bool) (runs: 256, μ: 1443627, ~: 1398241)\n[PASS] test_creditToImdTokenRevertsWithoutEffects() (gas: 362704)\n[PASS] test_creditToStackerRevertsWithoutEffects() (gas: 364669)\n[PASS] test_creditToVaultRevertsWithoutEffects() (gas: 364714)\n[PASS] test_zeroAmountStillRejectsUnreachableRecipients() (gas: 1092757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 238.32ms (235.06ms CPU time)\n\nRan 7 tests for test/TraderResolution.t.sol:TraderResolutionTest\n[PASS] test_directNoCodeSenderCanBeResolvedWithoutTxOrigin() (gas: 303966)\n[PASS] test_emptyHookDataResolvesActiveMsgSenderAndCannotBeSwept() (gas: 381420)\n[PASS] test_hookDataTakesPrecedenceAndSupportsContractWallets() (gas: 477363)\n[PASS] test_invalidHookDataPaysPlainImdToKnownCallerNeverInvalidRecipient() (gas: 882426)\n[PASS] test_legacyEmptyHookDataCreditsRouterAndAnyoneCanSweep() (gas: 433080)\n[PASS] test_pausedVaultPaysPlainImdToResolvedMsgSender() (gas: 301439)\n[PASS] test_unknownContractOrInvalidMsgSenderNeverBecomesTheRecipient() (gas: 522893)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 646.70ms (3.48ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 3083696, ~: 3083516)\nLogs:\n  Bound result 14264337593543950335\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 9267485)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 21725714)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 6165255)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9461119)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 280890)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6364855)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3198964)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4303491)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 344947)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 840.20ms (209.59ms 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     | 432   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 396   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 445   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 387   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 388   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 5\n  Bound result 123\n  Bound result 6\n  Bound result 1294\n  Bound result 724\n  Bound result 2788\n  Bound result 6997\n  Bound result 92\n  Bound result 8\n  Bound result 3\n  Bound result 4\n  Bound result 24\n  Bound result 2\n  Bound result 9998000000000000000000\n  Bound result 6925\n  Bound result 949462212052113114916643\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.18s (1.18s CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 394599, ~: 394413)\nLogs:\n  Bound result 136\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 368359, ~: 368888)\nLogs:\n  Bound result 21565140130257142819505\n  Bound result 11700007676639208366745\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430314, ~: 430416)\nLogs:\n  Bound result 36406309835813629392740\n  Bound result 21565140130257142819505\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56148)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131325)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9375713)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378525)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370632)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383379)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508239)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617949)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374498)\n[PASS] test_credit_totalsAndEvent() (gas: 494195)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80135)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531891)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397571)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791662)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053849)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 1.40s (1.85s CPU time)\n\nRan 8 tests for test/StackerGas.t.sol:StackerGasTest\n[PASS] testFuzz_readmeLateFailurePaysOnceAndNextCreditWorks(uint96,bool,bool) (runs: 1000, μ: 3268135, ~: 3268005)\nLogs:\n  Bound result 2085359911279\n\n[PASS] test_oldGasCapFailsRepeatedlyAndDoesNotPrimeVault() (gas: 600749)\n[PASS] test_readmeBudgetFundsColdFirstCredit() (gas: 359519)\n[PASS] test_readmeFallbackAfterFirstMintReturnsZeroShares() (gas: 3264309)\n[PASS] test_readmeFallbackAfterRepeatMintReverts() (gas: 3264412)\n[PASS] test_readmeFallbackHasGasEvenWhenCreditExhaustsItsBudget() (gas: 473042)\n[PASS] test_readmeFallbackPaysPlainImdWhenVaultFails() (gas: 272236)\n[PASS] test_readmeGasGuardRejectsLowEstimateBeforeFallback() (gas: 94010)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 1.41s (1.43s CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 9277056, ~: 9273934)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6295280, ~: 6289227)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 7275650, ~: 7275837)\nLogs:\n  Bound result 64\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3217440, ~: 3217182)\nLogs:\n  Bound result 846289\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 6257562)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6717150)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 6257645)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6675961)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12584237)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3278175)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12576416)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6695625)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6370613)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6807338)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 9282189)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 6285001)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6345449)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 1.44s (2.80s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6509848, ~: 6509804)\nLogs:\n  Bound result 2000000000000000000000000\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6594402, ~: 6601011)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 5027121, ~: 6524078)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6388793, ~: 6388545)\nLogs:\n  Bound result 4\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3392340)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3382799)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9764595)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6368674)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3570236)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4168611)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10569970)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3383088)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6642139)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3506838)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9889442)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6516512)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6530395)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6513566)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3604476)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3514607)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 1.44s (3.42s CPU time)\n\nRan 17 tests for test/StackerDependencyFailures.t.sol:StackerDependencyFailuresTest\n[PASS] testFuzz_shortAssetReturnFailsBeforeAnyApproval(uint8) (runs: 1000, μ: 674632, ~: 674352)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_shortDepositReturnIsAtomic(uint8,bool,uint96) (runs: 1000, μ: 904576, ~: 931057)\nLogs:\n  Bound result 31\n  Bound result 2\n\n[PASS] testFuzz_tokenFailureIsAtomic(uint8,uint96,bool) (runs: 1000, μ: 842700, ~: 840263)\nLogs:\n  Bound result 3\n  Bound result 62104211\n\n[PASS] testFuzz_vaultPullFailureIsAtomic(uint8,uint96,bool) (runs: 1000, μ: 877117, ~: 878076)\nLogs:\n  Bound result 3\n  Bound result 62104211\n\n[PASS] test_assetRevertDataBubblesAndDoesNotPrimeApproval() (gas: 670793)\n[PASS] test_dirtyAssetAddressIsRejectedBeforeAnyApproval() (gas: 673028)\n[PASS] test_falseApprovalRollsBackAndNextCreditRevalidates() (gas: 798887)\n[PASS] test_falsePullAfterMovingOneWeiRollsBackFirstApproval() (gas: 831737)\n[PASS] test_falseVaultPullRollsBackBothTransfersAndFirstApproval() (gas: 871106)\n[PASS] test_invalidBooleanApprovalRollsBack() (gas: 798824)\n[PASS] test_invalidBooleanPullRollsBack() (gas: 831884)\n[PASS] test_invalidBooleanVaultPullRollsBackEntireProjectBalance() (gas: 871365)\n[PASS] test_missingDepositReturnRollsBackActualMint() (gas: 936401)\n[PASS] test_oneByteShortDepositReturnRollsBackActualMintAndHold() (gas: 865107)\n[PASS] test_revertingApprovalRollsBackAndNextCreditRevalidates() (gas: 804553)\n[PASS] test_revertingPullBubblesErrorAfterAnEarlierCredit() (gas: 838492)\n[PASS] test_revertingVaultPullAfterEarlierCreditLeavesMatureSharesAlone() (gas: 867788)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 1.44s (3.49s CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976914, ~: 976865)\nLogs:\n  Bound result 99999000000004202047188\n  Bound result 16347\n  Bound result 2698\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935973, ~: 2941287)\nLogs:\n  Bound result 2085359911279\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598595)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117679)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937621)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738736)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925987)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.44s (2.78s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3588147, ~: 3554315)\nLogs:\n  Bound result 15\n  Bound result 126\n  Bound result 66\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6745890, ~: 6681053)\nLogs:\n  Bound result 152\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3837328)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3479830)\n[PASS] test_challengeMaximumReason() (gas: 7071032)\n[PASS] test_challengeMinimumReason() (gas: 6596360)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53659749)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3726543)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 1.44s (2.67s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6494390, ~: 6494524)\nLogs:\n  Bound result 82806\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3293303, ~: 3291386)\nLogs:\n  Bound result 64398\n\n[PASS] test_checksBeforeTheIntervalStillComeFirst() (gas: 6448499)\n[PASS] test_clockIsPerProject() (gas: 6458397)\n[PASS] test_expiredAndFailedQuestionsLeaveTheClockAlone() (gas: 9350092)\n[PASS] test_handoffEmitsEventAndStartsExactInterval() (gas: 3268207)\n[PASS] test_intervalRefusesAThirdWalletToo() (gas: 3310955)\n[PASS] test_relistingByApplicationNamesANewWalletWithoutAHandoff() (gas: 18686914)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 1.44s (2.59s CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 234734, ~: 234510)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1540568, ~: 1370434)\nLogs:\n  Bound result 4\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388855, ~: 388794)\nLogs:\n  Bound result 144\n  Bound result 101\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 740016, ~: 761926)\nLogs:\n  Bound result 200000\n  Bound result 10000000000000000000\n  Bound result 602\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682861, ~: 689012)\nLogs:\n  Bound result 200000\n  Bound result 10000000000000000000\n  Bound result 602\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 491344, ~: 510594)\nLogs:\n  Bound result 2693\n  Bound result 144\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615815)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365250)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591245)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662927)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238919)\n[PASS] test_credit_oneWei() (gas: 361849)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468574)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326778)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 737091)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91175)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522405)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 1.44s (5.69s 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            | 277   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 258   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 260   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 248   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 259   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 229   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 258   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 259   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 66\n  Bound result 95\n  Bound result 171369\n  Bound result 4468\n  Bound result 66305\n  Bound result 26\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18834932)\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.47s (1.47s 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        | 470   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 466   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 474   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 472   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 451   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 469   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 483   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 505   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 509   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 470   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 463   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 481   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 431   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4\n  Bound result 4998\n  Bound result 6535\n  Bound result 555\n  Bound result 1\n  Bound result 8055\n  Bound result 10\n  Bound result 1294\n  Bound result 999911\n  Bound result 24\n  Bound result 19703\n  Bound result 724564549289188680\n  Bound result 4622542769827391081591\n  Bound result 100\n  Bound result 4000000000000000000\n  Bound result 2773067895698346968693\n  Bound result 6\n  Bound result 16645\n  Bound result 4\n  Bound result 49999999999999999999991\n  Bound result 2000\n  Bound result 7457596628739928352088\n  Bound result 10\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540803)\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 8.08s (8.08s 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                  | 1793  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1773  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1779  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1878  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1794  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1789  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1893  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1899  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1786  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2670\n  Bound result 11\n  Bound result 9480\n  Bound result 15323\n  Bound result 10\n  Bound result 60\n  Bound result 99\n  Bound result 42\n  Bound result 394868252920\n  Bound result 2738616725\n  Bound result 65\n  Bound result 2038466620\n  Bound result 65\n  Bound result 1\n  Bound result 4\n  Bound result 27\n  Bound result 5400\n  Bound result 127\n  Bound result 19\n  Bound result 2\n  Bound result 4012\n  Bound result 45\n  Bound result 89\n  Bound result 1657221164449380052\n  Bound result 4\n  Bound result 56\n  Bound result 1868\n  Bound result 32\n  Bound result 265370987701286505\n  Bound result 3054\n  Bound result 1000\n  Bound result 36\n  Bound result 6302\n  Bound result 41\n  Bound result 4\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 40210610)\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: 16414571)\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 11.35s (11.39s CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 15356)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8224150)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4294731)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 11.36s (35.12ms CPU time)\n\nRan 3 tests for test/StackerHoldInvariant.t.sol:StackerHoldInvariantTest\n[PASS]\nStackerHoldInvariantTest invariants:\n[PASS] invariant_balancesAndHistoricalCashbackAreConserved\n[PASS] invariant_holdFollowsSharesAndCannotBeClearedByTimestamp\n StackerHoldInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+----------------------+-------+---------+----------╮\n| Contract           | Selector             | Calls | Reverts | Discards |\n+========================================================================+\n| StackerHoldHandler | advance              | 1995  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | credit               | 2118  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | donate               | 2036  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | exit                 | 1960  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | probeRenouncedPowers | 2065  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | transferShares       | 2073  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | unauthorizedExit     | 2050  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | zeroAction           | 2087  | 0       | 0        |\n╰--------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 95\n  Bound result 6691\n  Bound result 5\n  Bound result 3286355799084\n  Bound result 301\n  Bound result 42951473029216\n  Bound result 13742758\n  Bound result 5\n  Bound result 1788\n  Bound result 8\n  Bound result 697925547228654071486\n  Bound result 80257855\n  Bound result 15854\n  Bound result 0\n  Bound result 0\n  Bound result 9989999999999999999901\n  Bound result 32\n  Bound result 2884\n  Bound result 66\n  Bound result 100\n  Bound result 9273\n  Bound result 8089\n  Bound result 10\n  Bound result 31536000\n  Bound result 4\n  Bound result 9\n  Bound result 2811760177\n  Bound result 10\n  Bound result 42799510975333903915\n  Bound result 7\n  Bound result 11802\n  Bound result 0\n  Bound result 6200\n  Bound result 1975\n  Bound result 5\n  Bound result 726940131391892\n  Bound result 1417\n  Bound result 715\n  Bound result 11155111\n  Bound result 784773\n  Bound result 5\n  Bound result 7311\n\n[PASS] test_handlerExercisesHeldDelegatedAndMatureExits() (gas: 3851200)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000000000\n\n[PASS] test_handlerExercisesZeroSharesFailureBeforeInitialization() (gas: 2872846)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 10000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 12.61s (12.61s CPU time)\n\nRan 34 test suites in 12.62s (60.95s CPU time): 217 tests passed, 0 failed, 11 skipped (228 total tests)\n","passed":true},{"durationMs":169,"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.claimBond(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\":107,\"NEXT_SESSION.md\":66,\"README.md\":260,\"app.js\":1368,\"docs/design.md\":305,\"docs/explainer.html\":247,\"docs/history.md\":233,\"docs/listing.md\":100,\"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/9-sepolia-v3-relaunch.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,\"jobs/requests/9-sepolia-v3-relaunch.json\":31,\"launch.json\":13,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":679,\"src/Stacker.sol\":104,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MAINNET_TEST_COVERAGE.md\":45,\"test/MainnetFork.t.sol\":141,\"test/MainnetLaunchRegression.t.sol\":86,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryBondOwed.t.sol\":290,\"test/RegistryCallbackGas.t.sol\":111,\"test/RegistryCooldownBoundary.t.sol\":44,\"test/RegistryHandoffInterval.t.sol\":235,\"test/RegistryPolicyRevision.t.sol\":69,\"test/RegistryRevisionRegression.t.sol\":418,\"test/RegistrySepoliaFork.t.sol\":111,\"test/SepoliaFork.t.sol\":141,\"test/Stacker.t.sol\":423,\"test/StackerAuditRegression.t.sol\":99,\"test/StackerDependencyFailures.t.sol\":288,\"test/StackerEdges.t.sol\":391,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerGas.t.sol\":186,\"test/StackerHoldInvariant.t.sol\":346,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/TraderResolution.t.sol\":229,\"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":"970a252f53690b8b846026be21d00b017eb15584057cde5540dc6dde959c2e1f","verifiedTreeHash":"d24da220e4e1111bc34eddad1bf91d3a1ee19453","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":11025,"exitCode":0,"name":"build","output":"Compiling 85 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.92s\nCompiler run successful!\n","passed":true},{"durationMs":6147,"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 361.66µs (36.42µs CPU time)\n\nRan 5 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_firstCreditNeedsInitializationGas() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\n[SKIP] test_fork_readmeBudgetFundsColdFirstCredit() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 455.61µs (63.48µs CPU time)\n\nRan 5 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_liveStackerValidCreditMatchesMainnetCandidate() (gas: 0)\n[SKIP] test_sepolia_mainnetCandidateRejectsLegacyUnreachableRecipients() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 401.06µs (77.26µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419526)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 593.83µs (465.36µ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.22ms (954.08µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162607)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.57ms (315.44µs CPU time)\n\nRan 2 tests for test/MainnetLaunchRegression.t.sol:MainnetLaunchRegressionTest\n[PASS] test_manifestCreate2WorksWithoutDependenciesOrInitialization() (gas: 1807724)\n[PASS] test_manifestPinsExactlyOneMainnetStacker() (gas: 14432)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.77ms (2.82ms 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.88ms (201.54µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910552)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637915)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.61ms (1.91ms CPU time)\n\nRan 5 tests for test/StackerGas.t.sol:StackerGasTest\n[PASS] test_oldGasCapFailsRepeatedlyAndDoesNotPrimeVault() (gas: 600669)\n[PASS] test_readmeBudgetFundsColdFirstCredit() (gas: 359500)\n[PASS] test_readmeFallbackHasGasEvenWhenCreditExhaustsItsBudget() (gas: 473042)\n[PASS] test_readmeFallbackPaysPlainImdWhenVaultFails() (gas: 272196)\n[PASS] test_readmeGasGuardRejectsLowEstimateBeforeFallback() (gas: 93987)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 4.10ms (1.90ms CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171485)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.52ms (376.83µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128217)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140183)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140267)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.32ms (516.45µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190488)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.39ms (355.02µ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: 8789798)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 12.40ms (7.07ms CPU time)\n\nRan 8 tests for test/RegistryBondOwed.t.sol:RegistryBondOwedTest\n[PASS] test_blockedBeneficiary_signedYes_defendsAndOwesBond() (gas: 1110574)\n[PASS] test_blockedChallenger_expireClearsAndOwesBond() (gas: 938046)\n[PASS] test_blockedChallenger_failureClearsAndOwesBond() (gas: 1231384)\n[PASS] test_blockedChallenger_signedNo_delistsAndOwesBond() (gas: 1218816)\n[PASS] test_claimBond_refusesZeroAddressAndNothingOwed() (gas: 67205)\n[PASS] test_falseReturningToken_owesBond() (gas: 1051689)\n[PASS] test_owedBondsAccumulate() (gas: 1420615)\n[PASS] test_unblocked_paysAtOnce() (gas: 949759)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 123.70ms (12.44ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392385, ~: 392177)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367782, ~: 368848)\nLogs:\n  Bound result 11155111\n  Bound result 535\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430228, ~: 430336)\nLogs:\n  Bound result 535\n  Bound result 11155111\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56108)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131285)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9374313)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378485)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370592)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383339)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508159)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617869)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374458)\n[PASS] test_credit_totalsAndEvent() (gas: 494115)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80095)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531771)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397491)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791622)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053729)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 200.53ms (224.92ms 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     | 426   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 396   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 416   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 434   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 376   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 7319594905\n  Bound result 1\n  Bound result 5875\n  Bound result 8698\n  Bound result 2000000000000000000\n  Bound result 8\n  Bound result 382\n  Bound result 54187708718731\n  Bound result 10\n  Bound result 2\n  Bound result 999999999999999999999997\n  Bound result 426569975648797525790\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 2\n  Bound result 1000000000000000000\n  Bound result 2411031535\n  Bound result 4\n  Bound result 26\n  Bound result 10\n  Bound result 20191955711998\n  Bound result 9\n  Bound result 10\n  Bound result 12685\n  Bound result 3586\n  Bound result 18\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 523.12ms (520.31ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 15356)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8199369)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4275570)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 672.14ms (28.58ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 232508, ~: 232286)\nLogs:\n  Bound result 999999999999999999999999\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1527631, ~: 1370864)\nLogs:\n  Bound result 7\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388793, ~: 388754)\nLogs:\n  Bound result 209209803996007703167960\n  Bound result 195491672001899834812037\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 737674, ~: 761894)\nLogs:\n  Bound result 591650368\n  Bound result 13698157607624525613209\n  Bound result 23284454867275624620636\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 681652, ~: 688992)\nLogs:\n  Bound result 87160954774160193340856\n  Bound result 1264631667\n  Bound result 16745164947848681060010\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 492771, ~: 510554)\nLogs:\n  Bound result 9656647008017866510\n  Bound result 226890829542277578\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615735)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365218)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591165)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662847)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238887)\n[PASS] test_credit_oneWei() (gas: 361809)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468534)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326738)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 737051)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91135)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522365)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 675.59ms (1.28s CPU time)\n\nRan 4 tests for test/StackerAuditRegression.t.sol:StackerAuditRegressionTest\n[PASS] testFuzz_unreachableRecipientsRejectedBeforeAndAfterFirstCredit(uint256,bool) (runs: 256, μ: 1009669, ~: 1058659)\n[PASS] test_creditToStackerRevertsWithoutEffects() (gas: 325847)\n[PASS] test_creditToVaultRevertsWithoutEffects() (gas: 325826)\n[PASS] test_zeroAmountStillRejectsUnreachableRecipients() (gas: 651753)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 675.70ms (675.02ms CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8876807, ~: 8873685)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6006255, ~: 6000202)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945106, ~: 6945306)\nLogs:\n  Bound result 98\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084060, ~: 3083765)\nLogs:\n  Bound result 14648671\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 5990730)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6437199)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 5968620)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6395718)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12028378)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3144758)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12020558)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6391316)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6103781)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6527386)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 8859748)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 5995976)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6078615)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 675.69ms (1.91s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6227547, ~: 6227692)\nLogs:\n  Bound result 47195\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3160020, ~: 3157969)\nLogs:\n  Bound result 123358\n\n[PASS] test_checksBeforeTheIntervalStillComeFirst() (gas: 6181667)\n[PASS] test_clockIsPerProject() (gas: 6191563)\n[PASS] test_expiredAndFailedQuestionsLeaveTheClockAlone() (gas: 8927650)\n[PASS] test_handoffEmitsEventAndStartsExactInterval() (gas: 3134790)\n[PASS] test_intervalRefusesAThirdWalletToo() (gas: 3177538)\n[PASS] test_relistingByApplicationNamesANewWalletWithoutAHandoff() (gas: 17842028)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 675.76ms (1.35s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243025, ~: 6242984)\nLogs:\n  Bound result 3477499851315366316938948685481505599395487657499091683962017885608192212107\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6327791, ~: 6334177)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4761955, ~: 3278654)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121967, ~: 6121713)\nLogs:\n  Bound result 11\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3258923)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3249382)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9364349)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6101843)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3436610)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4035194)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10303138)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3249671)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6375042)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3373212)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9489195)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6249680)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6263563)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6246734)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3471059)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3380979)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 675.86ms (2.58s CPU time)\n\nRan 13 tests for test/StackerDependencyFailures.t.sol:StackerDependencyFailuresTest\n[PASS] testFuzz_shortAssetReturnFailsBeforeAnyApproval(uint8) (runs: 1000, μ: 672682, ~: 672400)\nLogs:\n  Bound result 4\n\n[PASS] testFuzz_shortDepositReturnIsAtomic(uint8,bool,uint96) (runs: 1000, μ: 899634, ~: 926949)\nLogs:\n  Bound result 11\n  Bound result 592866944164382\n\n[PASS] testFuzz_tokenFailureIsAtomic(uint8,uint96,bool) (runs: 1000, μ: 820986, ~: 822431)\nLogs:\n  Bound result 2\n  Bound result 21487\n\n[PASS] test_assetRevertDataBubblesAndDoesNotPrimeApproval() (gas: 668819)\n[PASS] test_dirtyAssetAddressIsRejectedBeforeAnyApproval() (gas: 670988)\n[PASS] test_falseApprovalRollsBackAndNextCreditRevalidates() (gas: 778109)\n[PASS] test_falsePullAfterMovingOneWeiRollsBackFirstApproval() (gas: 810893)\n[PASS] test_invalidBooleanApprovalRollsBack() (gas: 778046)\n[PASS] test_invalidBooleanPullRollsBack() (gas: 811066)\n[PASS] test_missingDepositReturnRollsBackActualMint() (gas: 932226)\n[PASS] test_oneByteShortDepositReturnRollsBackActualMintAndHold() (gas: 858844)\n[PASS] test_revertingApprovalRollsBackAndNextCreditRevalidates() (gas: 781775)\n[PASS] test_revertingPullBubblesErrorAfterAnEarlierCredit() (gas: 815563)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 675.81ms (1.01s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3443234, ~: 3409140)\nLogs:\n  Bound result 1\n  Bound result 70\n  Bound result 92\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6447643, ~: 6393796)\nLogs:\n  Bound result 69\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3690000)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3308084)\n[PASS] test_challengeMaximumReason() (gas: 6790348)\n[PASS] test_challengeMinimumReason() (gas: 6291178)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53526332)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3593126)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 675.91ms (1.37s CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950288, ~: 2950111)\nLogs:\n  Bound result 1868017377250\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 8867245)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 20725225)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 5898421)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9016484)\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 676.38ms (693.95ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 221710, ~: 55470)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 405680, ~: 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: 5750239)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6028440)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 8851297)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 8849434)\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: 74090)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 5803862)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5678069)\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 676.39ms (77.63ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976852, ~: 976832)\nLogs:\n  Bound result 99999000000000000003649\n  Bound result 75335221410829525655206\n  Bound result 253474614682204\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935363, ~: 2930368)\nLogs:\n  Bound result 5753821282433651675\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598555)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117639)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937541)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738664)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925875)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 676.41ms (984.59ms CPU time)\n\nRan 2 tests for test/ProjectRegistryInvariant.t.sol:ProjectRegistryInvariantTest\n[PASS]\nProjectRegistryInvariantTest invariants:\n[PASS] invariant_holdsOnlyOpenBonds\n[PASS] invariant_listingCounts\n[PASS] invariant_recordsConsistent\n ProjectRegistryInvariantTest invariants (runs: 64, calls: 2048, reverts: 0)\n\n╭-----------------+-------------------+-------+---------+----------╮\n| Contract        | Selector          | Calls | Reverts | Discards |\n+==================================================================+\n| RegistryHandler | answer            | 264   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 237   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 261   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 276   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 258   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 238   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 262   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 252   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10311\n  Bound result 99\n  Bound result 72\n  Bound result 49\n  Bound result 24576\n  Bound result 60\n  Bound result 44237\n  Bound result 4\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18034441)\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 725.14ms (726.52ms 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        | 476   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 456   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 473   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 459   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 467   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 436   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 499   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 494   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 492   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 499   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 472   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 457   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 464   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 255\n  Bound result 10\n  Bound result 26\n  Bound result 999668\n  Bound result 10952\n  Bound result 36468206727320769299222\n  Bound result 12\n  Bound result 4812\n  Bound result 462536\n  Bound result 96\n  Bound result 1\n  Bound result 123\n  Bound result 1800003600\n  Bound result 10974\n  Bound result 354408264676072293660\n  Bound result 3182931544191680\n  Bound result 12127\n  Bound result 7722\n  Bound result 6000000000000000000\n  Bound result 255\n  Bound result 3\n  Bound result 200\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540563)\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.98s (3.98s 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                  | 1773  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1872  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1794  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1901  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1812  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1825  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1782  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1819  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1806  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 14076\n  Bound result 4398\n  Bound result 8\n  Bound result 10799\n  Bound result 32\n  Bound result 16777216\n  Bound result 16182\n  Bound result 12\n  Bound result 11\n  Bound result 28\n  Bound result 52587\n  Bound result 31\n  Bound result 411778\n  Bound result 60612\n  Bound result 1\n  Bound result 0\n  Bound result 96\n  Bound result 214236773206\n  Bound result 25320\n  Bound result 64\n  Bound result 0\n  Bound result 7471\n  Bound result 2182\n  Bound result 51\n  Bound result 208548897142763497\n  Bound result 0\n  Bound result 171239\n  Bound result 5\n  Bound result 4672234\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 38742833)\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: 15880704)\nLogs:\n  Bound result 50\n  Bound result 0\n  Bound result 0\n  Bound result 50\n  Bound result 500000000000000000\n  Bound result 86400\n  Bound result 1\n  Bound result 50\n  Bound result 1\n  Bound result 100\n  Bound result 0\n  Bound result 50\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.93s (4.95s CPU time)\n\nRan 3 tests for test/StackerHoldInvariant.t.sol:StackerHoldInvariantTest\n[PASS]\nStackerHoldInvariantTest invariants:\n[PASS] invariant_balancesAndHistoricalCashbackAreConserved\n[PASS] invariant_holdFollowsSharesAndCannotBeClearedByTimestamp\n StackerHoldInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+----------------------+-------+---------+----------╮\n| Contract           | Selector             | Calls | Reverts | Discards |\n+========================================================================+\n| StackerHoldHandler | advance              | 2075  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | credit               | 1998  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | donate               | 2058  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | exit                 | 1918  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | probeRenouncedPowers | 2119  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | transferShares       | 2100  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | unauthorizedExit     | 2041  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | zeroAction           | 2075  | 0       | 0        |\n╰--------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 3534\n  Bound result 82742073913\n  Bound result 9\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 14\n  Bound result 9017\n  Bound result 16013\n  Bound result 5000000000000000000\n  Bound result 5\n  Bound result 1\n  Bound result 126\n  Bound result 9\n  Bound result 9888\n  Bound result 10\n  Bound result 2\n  Bound result 16384\n  Bound result 32\n  Bound result 50\n  Bound result 3\n  Bound result 6\n  Bound result 8972234063092139120036\n  Bound result 72\n  Bound result 224654603515947959188\n  Bound result 1893\n  Bound result 9\n  Bound result 3640701045\n  Bound result 280\n  Bound result 6901\n  Bound result 0\n  Bound result 3\n\n[PASS] test_handlerExercisesHeldDelegatedAndMatureExits() (gas: 3851080)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000000000\n\n[PASS] test_handlerExercisesZeroSharesFailureBeforeInitialization() (gas: 2872766)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 10000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 6.05s (6.05s CPU time)\n\nRan 32 test suites in 6.05s (24.01s CPU time): 199 tests passed, 0 failed, 11 skipped (210 total tests)\n","passed":true},{"durationMs":90,"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.claimBond(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\":54,\"NEXT_SESSION.md\":66,\"README.md\":258,\"app.js\":1368,\"docs/design.md\":305,\"docs/explainer.html\":247,\"docs/history.md\":233,\"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/9-sepolia-v3-relaunch.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,\"jobs/requests/9-sepolia-v3-relaunch.json\":31,\"launch.json\":13,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":679,\"src/Stacker.sol\":102,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MAINNET_TEST_COVERAGE.md\":44,\"test/MainnetFork.t.sol\":141,\"test/MainnetLaunchRegression.t.sol\":86,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryBondOwed.t.sol\":290,\"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\":141,\"test/Stacker.t.sol\":420,\"test/StackerAuditRegression.t.sol\":91,\"test/StackerDependencyFailures.t.sol\":242,\"test/StackerEdges.t.sol\":391,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerGas.t.sol\":114,\"test/StackerHoldInvariant.t.sol\":346,\"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":"cdeea972d70c3f75752e5c5594032c80cba6a8d6d0e75761cba28b2aa662fee8","verifiedTreeHash":"ac6bef76c554d75d35d43a5b2c937041e1601505","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":9750,"exitCode":0,"name":"build","output":"Compiling 82 files with Solc 0.8.26\nSolc 0.8.26 finished in 9.66s\nCompiler run successful!\n","passed":true},{"durationMs":4948,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_firstCreditNeedsInitializationGas() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\n[SKIP] test_fork_readmeBudgetFundsColdFirstCredit() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 533.01µs (90.67µs CPU time)\n\nRan 1 test for test/RegistrySepoliaFork.t.sol:RegistrySepoliaForkTest\n[SKIP] test_sepolia_applyPaysTheRealIntake_thenAnswerLists() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 550.04µs (44.80µs CPU time)\n\nRan 5 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_liveStackerValidCreditMatchesMainnetCandidate() (gas: 0)\n[SKIP] test_sepolia_mainnetCandidateRejectsLegacyUnreachableRecipients() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 536.45µs (103.69µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419526)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 856.58µs (663.38µs CPU time)\n\nRan 5 tests for test/StackerGas.t.sol:StackerGasTest\n[PASS] test_oldGasCapFailsRepeatedlyAndDoesNotPrimeVault() (gas: 600669)\n[PASS] test_readmeBudgetFundsColdFirstCredit() (gas: 359500)\n[PASS] test_readmeFallbackHasGasEvenWhenCreditExhaustsItsBudget() (gas: 473042)\n[PASS] test_readmeFallbackPaysPlainImdWhenVaultFails() (gas: 272196)\n[PASS] test_readmeGasGuardRejectsLowEstimateBeforeFallback() (gas: 93987)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.70ms (685.92µs CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181693)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13664)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69523)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64547)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.95ms (789.76µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190488)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.42ms (135.60µ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.41ms (316.02µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171485)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.59ms (191.85µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910552)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637915)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.83ms (1.22ms 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 3.13ms (361.51µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128217)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140183)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140267)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 7.35ms (477.89µ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: 8789798)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.88ms (6.16ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 15356)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8199369)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4275570)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 31.87ms (34.55ms CPU time)\n\nRan 8 tests for test/RegistryBondOwed.t.sol:RegistryBondOwedTest\n[PASS] test_blockedBeneficiary_signedYes_defendsAndOwesBond() (gas: 1110574)\n[PASS] test_blockedChallenger_expireClearsAndOwesBond() (gas: 938046)\n[PASS] test_blockedChallenger_failureClearsAndOwesBond() (gas: 1231384)\n[PASS] test_blockedChallenger_signedNo_delistsAndOwesBond() (gas: 1218816)\n[PASS] test_claimBond_refusesZeroAddressAndNothingOwed() (gas: 67205)\n[PASS] test_falseReturningToken_owesBond() (gas: 1051689)\n[PASS] test_owedBondsAccumulate() (gas: 1420615)\n[PASS] test_unblocked_paysAtOnce() (gas: 949759)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 389.66ms (10.27ms CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8877032, ~: 8880080)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6006691, ~: 6012600)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945103, ~: 6945304)\nLogs:\n  Bound result 63\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084047, ~: 3083765)\nLogs:\n  Bound result 14351\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 5990730)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6437199)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 5968620)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6395718)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12028378)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3144758)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12020558)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6391316)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6103781)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6527386)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 8859748)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 5995976)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6078615)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 439.28ms (1.29s 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     | 431   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 355   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 401   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 446   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 415   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 8\n  Bound result 2365\n  Bound result 1\n  Bound result 93\n  Bound result 9998000000000000000000\n  Bound result 2\n  Bound result 9059784370087799245703942801\n  Bound result 48\n  Bound result 3\n  Bound result 2657\n  Bound result 244\n  Bound result 1\n  Bound result 2877\n  Bound result 10\n  Bound result 9\n  Bound result 96\n  Bound result 5\n  Bound result 1926\n  Bound result 52476115\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 516.35ms (513.86ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950270, ~: 2950111)\nLogs:\n  Bound result 3152\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 8867245)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 20725225)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 5898421)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9016484)\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 604.22ms (621.36ms CPU time)\n\nRan 4 tests for test/StackerAuditRegression.t.sol:StackerAuditRegressionTest\n[PASS] testFuzz_unreachableRecipientsRejectedBeforeAndAfterFirstCredit(uint256,bool) (runs: 256, μ: 1010863, ~: 1058659)\n[PASS] test_creditToStackerRevertsWithoutEffects() (gas: 325847)\n[PASS] test_creditToVaultRevertsWithoutEffects() (gas: 325826)\n[PASS] test_zeroAmountStillRejectsUnreachableRecipients() (gas: 651753)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 650.72ms (653.02ms CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3439953, ~: 3409885)\nLogs:\n  Bound result 6\n  Bound result 101\n  Bound result 49\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6455838, ~: 6395418)\nLogs:\n  Bound result 6\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3690000)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3308084)\n[PASS] test_challengeMaximumReason() (gas: 6790348)\n[PASS] test_challengeMinimumReason() (gas: 6291178)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53526332)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3593126)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 650.83ms (1.29s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243018, ~: 6242972)\nLogs:\n  Bound result 16912\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6328183, ~: 6334710)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4786349, ~: 6257246)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121962, ~: 6121713)\nLogs:\n  Bound result 16\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3258923)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3249382)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9364349)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6101843)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3436610)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4035194)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10303138)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3249671)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6375042)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3373212)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9489195)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6249680)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6263563)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6246734)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3471059)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3380979)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 653.83ms (1.62s CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976879, ~: 976825)\nLogs:\n  Bound result 1000000000000000002\n  Bound result 6854028\n  Bound result 87985484457261145881203\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935506, ~: 2930368)\nLogs:\n  Bound result 549116577572713\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598555)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117639)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937541)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738664)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925875)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 653.66ms (1.25s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6227538, ~: 6227692)\nLogs:\n  Bound result 3602\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3160063, ~: 3157969)\nLogs:\n  Bound result 172800\n\n[PASS] test_checksBeforeTheIntervalStillComeFirst() (gas: 6181667)\n[PASS] test_clockIsPerProject() (gas: 6191563)\n[PASS] test_expiredAndFailedQuestionsLeaveTheClockAlone() (gas: 8927650)\n[PASS] test_handoffEmitsEventAndStartsExactInterval() (gas: 3134790)\n[PASS] test_intervalRefusesAThirdWalletToo() (gas: 3177538)\n[PASS] test_relistingByApplicationNamesANewWalletWithoutAHandoff() (gas: 17842028)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 653.73ms (1.22s CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392368, ~: 392177)\nLogs:\n  Bound result 999000000000000000000\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367657, ~: 368926)\nLogs:\n  Bound result 434166808458223346817968\n  Bound result 350989830515555685252901\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430302, ~: 430360)\nLogs:\n  Bound result 490101251864914416010597\n  Bound result 434166808458223346817968\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56108)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131285)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9374313)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378485)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370592)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383339)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508159)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617869)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374458)\n[PASS] test_credit_totalsAndEvent() (gas: 494115)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80095)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531771)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397491)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791622)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053729)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 653.90ms (151.24ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 186235, ~: 55470)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 438243, ~: 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: 5750239)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6028440)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 8851297)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 8849434)\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: 74090)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 5803862)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5678069)\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 654.02ms (54.21ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 232515, ~: 232286)\nLogs:\n  Bound result 169456826205461593320959\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1532612, ~: 1370240)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388795, ~: 388766)\nLogs:\n  Bound result 244854796534221622186014\n  Bound result 710428556350835564259\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 742438, ~: 761834)\nLogs:\n  Bound result 55326619754545205419903\n  Bound result 3806964169429973\n  Bound result 9150684872257387550652\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 683308, ~: 688944)\nLogs:\n  Bound result 0\n  Bound result 8098874\n  Bound result 25356977811724048638780\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 491937, ~: 510566)\nLogs:\n  Bound result 5909092673668795597\n  Bound result 112565361339118682\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615735)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365218)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591165)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662847)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238887)\n[PASS] test_credit_oneWei() (gas: 361809)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468534)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326738)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 737051)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91135)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522365)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 653.95ms (3.47s 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            | 267   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 235   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 243   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 266   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 246   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 273   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 243   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 275   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 26\n  Bound result 26\n  Bound result 26\n  Bound result 25069\n  Bound result 10617\n  Bound result 289\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18034441)\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 755.81ms (756.74ms 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        | 462   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 484   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 477   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 473   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 479   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 496   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 478   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 451   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 474   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 485   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 487   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 452   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 446   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 547\n  Bound result 28905155593159240888310\n  Bound result 86400\n  Bound result 1400\n  Bound result 1889567281\n  Bound result 5000000000000000000000\n  Bound result 3\n  Bound result 4665\n  Bound result 24576\n  Bound result 1002\n  Bound result 7\n  Bound result 999000000000000000000\n  Bound result 96\n  Bound result 9322\n  Bound result 197806145\n  Bound result 21\n  Bound result 1800000000\n  Bound result 10000000000000000002\n  Bound result 10\n  Bound result 40000000000000000000000\n  Bound result 1000\n  Bound result 2000\n  Bound result 3\n  Bound result 60477\n  Bound result 5\n  Bound result 659918\n  Bound result 470\n  Bound result 950001\n  Bound result 3\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540563)\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.94s (3.94s 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                  | 1758  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1907  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1858  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1796  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1859  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1800  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1822  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1820  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1764  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1644\n  Bound result 1331711270\n  Bound result 94\n  Bound result 64\n  Bound result 52\n  Bound result 878\n  Bound result 27\n  Bound result 9479\n  Bound result 2444\n  Bound result 906934001580928800\n  Bound result 89\n  Bound result 5812\n  Bound result 136039776\n  Bound result 1948295130652109\n  Bound result 8594\n  Bound result 223847918615136\n  Bound result 408\n  Bound result 1399642816067827942\n  Bound result 26\n  Bound result 8\n  Bound result 17882\n  Bound result 20\n  Bound result 1\n  Bound result 2675064\n  Bound result 3\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 38742833)\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: 15880704)\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.85s (4.87s CPU time)\n\nRan 29 test suites in 4.86s (16.79s CPU time): 181 tests passed, 0 failed, 11 skipped (192 total tests)\n","passed":true},{"durationMs":62,"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.claimBond(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\":54,\"NEXT_SESSION.md\":66,\"README.md\":258,\"app.js\":1368,\"docs/design.md\":305,\"docs/explainer.html\":247,\"docs/history.md\":233,\"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/9-sepolia-v3-relaunch.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,\"jobs/requests/9-sepolia-v3-relaunch.json\":31,\"launch.json\":13,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":679,\"src/Stacker.sol\":102,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":141,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryBondOwed.t.sol\":290,\"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\":141,\"test/Stacker.t.sol\":420,\"test/StackerAuditRegression.t.sol\":91,\"test/StackerEdges.t.sol\":391,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerGas.t.sol\":114,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1535,"exitCode":0,"name":"slither","output":"[medium/medium] unused-return at src/oracle/OracleAttestation.sol:171: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/oracle/OracleAttestation.sol#171-189) ignores return value by (recovered,err,None) = ECDSA.tryRecover(digest,signature) (src/oracle/OracleAttestation.sol#184)\n[medium/medium] unused-return at src/ProjectRegistry.sol:412: ProjectRegistry.expire(address) (src/ProjectRegistry.sol#412-421) ignores return value by (None,None,None,completed) = intake.requests(intakeId) (src/ProjectRegistry.sol#417)\n[low/medium] reentrancy-benign at src/ProjectRegistry.sol:314: Reentrancy in ProjectRegistry._ask(address,ProjectRegistry.Project,string,uint256) (src/ProjectRegistry.sol#314-332):\n[low/medium] reentrancy-benign at src/Stacker.sol:74: Reentrancy in Stacker.credit(address,uint256) (src/Stacker.sol#74-101):\n[low/medium] timestamp at src/ProjectRegistry.sol:338: ProjectRegistry.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/ProjectRegistry.sol#338-390) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:287: ProjectRegistry._challenge(address,string,address) (src/ProjectRegistry.sol#287-305) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:412: ProjectRegistry.expire(address) (src/ProjectRegistry.sol#412-421) uses timestamp for comparisons\n[low/medium] timestamp at src/oracle/OracleAttestation.sol:171: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/oracle/OracleAttestation.sol#171-189) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:486: ProjectRegistry.setBeneficiary(address,address) (src/ProjectRegistry.sol#486-500) uses timestamp for comparisons","passed":true},{"durationMs":319,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/Stacker.sol:84: Reentrancy: State change after external call (2 places)\n[low] internal-function-used-once at src/oracle/OracleAttestation.sol:209: Internal Function Used Only Once\n[low] require-revert-in-loop at src/ProjectRegistry.sol:672: Loop Contains `require`/`revert`\n[low] uninitialized-local-variable at src/ProjectRegistry.sol:672: Uninitialized Local Variable\n[low] unsafe-erc20-operation at src/ProjectRegistry.sol:452: Unsafe ERC20 Operation\n[low] unused-public-function at src/ProjectRegistry.sol:505: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e9836d01405f234fc28cc821021f8ebc0011d69c2cadbf69ac80086d4318e5cb","verifiedTreeHash":"718db885e255028536c3caae3d0d749bff77cbef","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":10788,"exitCode":0,"name":"build","output":"Compiling 84 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.68s\nCompiler run successful!\n","passed":true},{"durationMs":4976,"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 311.94µs (37.09µs CPU time)\n\nRan 5 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_liveStackerValidCreditMatchesMainnetCandidate() (gas: 0)\n[SKIP] test_sepolia_mainnetCandidateRejectsLegacyUnreachableRecipients() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 449.88µs (168.64µs CPU time)\n\nRan 5 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_firstCreditNeedsInitializationGas() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\n[SKIP] test_fork_readmeBudgetFundsColdFirstCredit() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 453.05µs (188.71µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419526)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 544.80µs (420.43µ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.78ms (167.81µs CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181693)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13664)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69523)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64547)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.88ms (661.03µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171485)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.94ms (123.90µ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.88ms (300.38µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190488)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.61ms (199.48µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128217)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140183)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140267)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.59ms (257.46µs CPU time)\n\nRan 8 tests for test/RegistryBondOwed.t.sol:RegistryBondOwedTest\n[PASS] test_blockedBeneficiary_signedYes_defendsAndOwesBond() (gas: 1111110)\n[PASS] test_blockedChallenger_expireClearsAndOwesBond() (gas: 938582)\n[PASS] test_blockedChallenger_failureClearsAndOwesBond() (gas: 1232186)\n[PASS] test_blockedChallenger_signedNo_delistsAndOwesBond() (gas: 1219352)\n[PASS] test_claimBond_refusesZeroAddressAndNothingOwed() (gas: 67205)\n[PASS] test_falseReturningToken_owesBond() (gas: 1052225)\n[PASS] test_owedBondsAccumulate() (gas: 1421417)\n[PASS] test_unblocked_paysAtOnce() (gas: 950295)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 5.08ms (8.35ms CPU time)\n\nRan 3 tests for test/RegistryPolicyRevision.t.sol:RegistryPolicyRevisionTest\n[PASS] test_applicationAndChallengeRequireResolvedTraderAndExcludeLpFees() (gas: 6776893)\n[PASS] test_applicationSlotCanBeReoccupiedAfterFailureNoAndExpiry() (gas: 12156052)\n[PASS] test_lpRebateDefeatsGrossFeeFloor() (gas: 5991)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 6.18ms (4.58ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25809)\n[PASS] test_launchManifest_knownShape() (gas: 16093)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8224150)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4294731)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 34.93ms (17.88ms CPU time)\n\nRan 7 tests for test/TraderResolution.t.sol:TraderResolutionTest\n[PASS] test_directNoCodeSenderCanBeResolvedWithoutTxOrigin() (gas: 303966)\n[PASS] test_emptyHookDataResolvesActiveMsgSenderAndCannotBeSwept() (gas: 381420)\n[PASS] test_hookDataTakesPrecedenceAndSupportsContractWallets() (gas: 477363)\n[PASS] test_invalidHookDataPaysPlainImdToKnownCallerNeverInvalidRecipient() (gas: 882426)\n[PASS] test_legacyEmptyHookDataCreditsRouterAndAnyoneCanSweep() (gas: 433080)\n[PASS] test_pausedVaultPaysPlainImdToResolvedMsgSender() (gas: 301439)\n[PASS] test_unknownContractOrInvalidMsgSenderNeverBecomesTheRecipient() (gas: 522893)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.73ms (1.75ms CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910632)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637955)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.41ms (1.04ms CPU time)\n\nRan 4 tests for test/RegistryCooldownBoundary.t.sol:RegistryCooldownBoundaryTest\n[PASS] test_challengeExactlyAtCooldown_succeeds() (gas: 6061757)\n[PASS] test_challengeOneSecondBeforeCooldown_reverts() (gas: 3178920)\n[PASS] test_constructor_rejectsCooldownAboveMax() (gas: 14194)\n[PASS] test_keptChallenge_doesNotRestartCooldown() (gas: 9212238)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 62.17ms (4.67ms CPU time)\n\nRan 5 tests for test/StackerAuditRegression.t.sol:StackerAuditRegressionTest\n[PASS] testFuzz_unreachableRecipientsRejectedBeforeAndAfterFirstCredit(uint256,bool) (runs: 256, μ: 1448037, ~: 1398331)\n[PASS] test_creditToImdTokenRevertsWithoutEffects() (gas: 362704)\n[PASS] test_creditToStackerRevertsWithoutEffects() (gas: 364669)\n[PASS] test_creditToVaultRevertsWithoutEffects() (gas: 364714)\n[PASS] test_zeroAmountStillRejectsUnreachableRecipients() (gas: 1092757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 102.14ms (101.46ms CPU time)\n\nRan 5 tests for test/StackerGas.t.sol:StackerGasTest\n[PASS] test_oldGasCapFailsRepeatedlyAndDoesNotPrimeVault() (gas: 600749)\n[PASS] test_readmeBudgetFundsColdFirstCredit() (gas: 359540)\n[PASS] test_readmeFallbackHasGasEvenWhenCreditExhaustsItsBudget() (gas: 473042)\n[PASS] test_readmeFallbackPaysPlainImdWhenVaultFails() (gas: 272236)\n[PASS] test_readmeGasGuardRejectsLowEstimateBeforeFallback() (gas: 93987)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.44ms (609.89µs CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 3083700, ~: 3083528)\nLogs:\n  Bound result 21219\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 9267485)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 21725714)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 6165255)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9461119)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 280890)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6364855)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3198964)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4303491)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 344947)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 263.93ms (275.79ms 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     | 388   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 423   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 396   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 400   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 441   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 117300740\n  Bound result 732\n  Bound result 26\n  Bound result 2000000\n  Bound result 6719\n  Bound result 4\n  Bound result 1800000000\n  Bound result 683353023679682298812627\n  Bound result 3\n  Bound result 77000000000000000000\n  Bound result 8\n  Bound result 77000000001917308214\n  Bound result 566938203236380431754895\n  Bound result 15340\n  Bound result 100\n  Bound result 31\n  Bound result 10\n  Bound result 8\n  Bound result 7041\n  Bound result 2225\n  Bound result 3\n  Bound result 6000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 560.56ms (558.34ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 394529, ~: 394401)\nLogs:\n  Bound result 382\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367418, ~: 368888)\nLogs:\n  Bound result 13778\n  Bound result 4063\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430300, ~: 430398)\nLogs:\n  Bound result 177000\n  Bound result 123\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56148)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131325)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9375713)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378525)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370632)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383379)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508239)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617949)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374498)\n[PASS] test_credit_totalsAndEvent() (gas: 494195)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80135)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531891)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397571)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791662)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053849)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 574.97ms (1.22s CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 9276956, ~: 9273934)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6295086, ~: 6289227)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 7275592, ~: 7275837)\nLogs:\n  Bound result 50\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3217477, ~: 3217182)\nLogs:\n  Bound result 28828594\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 6257562)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6717150)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 6257645)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6675961)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12584237)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3278175)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12576416)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6695625)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6370613)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6807338)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 9282189)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 6285001)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6345449)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 575.09ms (1.42s CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 234715, ~: 234498)\nLogs:\n  Bound result 843151631522226664095412\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1523276, ~: 1162876)\nLogs:\n  Bound result 5\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388832, ~: 388782)\nLogs:\n  Bound result 296686960615971196684475\n  Bound result 46898071506890664045988\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 742400, ~: 761986)\nLogs:\n  Bound result 32594241616537495234590\n  Bound result 87872502241422545689756\n  Bound result 24903624611473674108944\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 683402, ~: 689048)\nLogs:\n  Bound result 4884619873878342853771\n  Bound result 20362335\n  Bound result 335199658028\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 488800, ~: 510443)\nLogs:\n  Bound result 9999999999999995001\n  Bound result 500000000000000000\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615815)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365250)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591245)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662927)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238919)\n[PASS] test_credit_oneWei() (gas: 361849)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468574)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326778)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 737091)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91175)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522405)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 469.88ms (1.04s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3588585, ~: 3554269)\nLogs:\n  Bound result 44\n  Bound result 123\n  Bound result 49\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6746077, ~: 6684306)\nLogs:\n  Bound result 86\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3837328)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3479830)\n[PASS] test_challengeMaximumReason() (gas: 7071032)\n[PASS] test_challengeMinimumReason() (gas: 6596360)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53659749)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3726543)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 575.18ms (1.17s CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 381237, ~: 55603)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 437204, ~: 47489)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3508161)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3197115)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3206825)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3292399)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3204041)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 3094951)\n[PASS] test_apply_validation() (gas: 562892)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 6017073)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6317465)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 9295930)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 9271876)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 6269555)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6422379)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74090)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 6070696)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5944903)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3035084)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 6126458)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3296400)\n[PASS] test_yes_listsFromThisBlock() (gas: 3137828)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 575.15ms (61.07ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976883, ~: 976877)\nLogs:\n  Bound result 99999005064119944341036\n  Bound result 62514264337593543158052\n  Bound result 52108344339\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935642, ~: 2941251)\nLogs:\n  Bound result 12514264337593543950335\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598595)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117679)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937621)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738736)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925987)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 540.27ms (911.74ms CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6509859, ~: 6509816)\nLogs:\n  Bound result 184883695037250936841663705139284261\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6593292, ~: 6601011)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 5024148, ~: 6524078)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6388793, ~: 6388545)\nLogs:\n  Bound result 0\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3392340)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3382799)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9764595)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6368674)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3570236)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4168611)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10569970)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3383088)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6642139)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3506838)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9889442)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6516512)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6530395)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6513566)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3604476)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3514607)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 575.23ms (2.00s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6494379, ~: 6494524)\nLogs:\n  Bound result 14213\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3293362, ~: 3291386)\nLogs:\n  Bound result 6016\n\n[PASS] test_checksBeforeTheIntervalStillComeFirst() (gas: 6448499)\n[PASS] test_clockIsPerProject() (gas: 6458397)\n[PASS] test_expiredAndFailedQuestionsLeaveTheClockAlone() (gas: 9350092)\n[PASS] test_handoffEmitsEventAndStartsExactInterval() (gas: 3268207)\n[PASS] test_intervalRefusesAThirdWalletToo() (gas: 3310955)\n[PASS] test_relistingByApplicationNamesANewWalletWithoutAHandoff() (gas: 18686914)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 575.24ms (1.15s 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            | 247   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 232   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 233   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 265   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 285   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 259   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 266   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 261   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 72\n  Bound result 96000\n  Bound result 83426\n  Bound result 50\n  Bound result 2827\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18834932)\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 623.63ms (627.29ms 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        | 447   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 481   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 431   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 490   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 499   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 448   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 487   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 476   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 457   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 498   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 488   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 518   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 424   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000000\n  Bound result 127\n  Bound result 7127\n  Bound result 6\n  Bound result 2608712012578325405349\n  Bound result 1\n  Bound result 14013\n  Bound result 1376\n  Bound result 2538\n  Bound result 1067638481980875537923\n  Bound result 2971\n  Bound result 64\n  Bound result 2254\n  Bound result 1979\n  Bound result 20000000000000000000\n  Bound result 3\n  Bound result 5\n  Bound result 6782\n  Bound result 16694\n  Bound result 242\n  Bound result 9313194553203098648577\n  Bound result 10\n  Bound result 533976\n  Bound result 976\n  Bound result 9928461891782872549115\n  Bound result 9868\n  Bound result 1049984\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540803)\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.85s (3.85s 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                  | 1867  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1848  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1858  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1762  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1781  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1921  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1794  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1792  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1761  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1609\n  Bound result 21652\n  Bound result 60\n  Bound result 27\n  Bound result 534\n  Bound result 177362148\n  Bound result 198\n  Bound result 0\n  Bound result 1330\n  Bound result 1\n  Bound result 898\n  Bound result 30\n  Bound result 170294\n  Bound result 1\n  Bound result 31087152953466237\n  Bound result 3395723176\n  Bound result 7444\n  Bound result 23859379\n  Bound result 11914\n  Bound result 44\n  Bound result 782685621977404598\n  Bound result 1\n  Bound result 33\n  Bound result 11619\n  Bound result 75\n  Bound result 27\n  Bound result 99910\n  Bound result 2\n  Bound result 75769\n  Bound result 1\n  Bound result 939384179176669692\n  Bound result 5131\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 40210610)\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: 16414571)\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.87s (4.89s CPU time)\n\nRan 31 test suites in 4.87s (14.86s CPU time): 192 tests passed, 0 failed, 11 skipped (203 total tests)\n","passed":true},{"durationMs":87,"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.claimBond(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\":107,\"NEXT_SESSION.md\":66,\"README.md\":260,\"app.js\":1368,\"docs/design.md\":305,\"docs/explainer.html\":247,\"docs/history.md\":233,\"docs/listing.md\":100,\"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/9-sepolia-v3-relaunch.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,\"jobs/requests/9-sepolia-v3-relaunch.json\":31,\"launch.json\":13,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":679,\"src/Stacker.sol\":104,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":141,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryBondOwed.t.sol\":290,\"test/RegistryCallbackGas.t.sol\":111,\"test/RegistryCooldownBoundary.t.sol\":44,\"test/RegistryHandoffInterval.t.sol\":235,\"test/RegistryPolicyRevision.t.sol\":69,\"test/RegistryRevisionRegression.t.sol\":418,\"test/RegistrySepoliaFork.t.sol\":111,\"test/SepoliaFork.t.sol\":141,\"test/Stacker.t.sol\":423,\"test/StackerAuditRegression.t.sol\":99,\"test/StackerEdges.t.sol\":391,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerGas.t.sol\":114,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/TraderResolution.t.sol\":229,\"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":"f7f77b2dd1d84fb426d8bfb85be33435ff86010ec6a9972d3ea784dfaa508fc4","verifiedTreeHash":"f04ca0f9a123962bbcd7606e1a494fd2ba4e66b8","verifierVersion":"0.1.0+fb8278c5"}]}