{"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":"87fc50ef-4459-4b7a-90f0-e5399043a2b9","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"55a7273cff6062e03547ad504d26456ef01b99ff29379209e4889572b8b6f037","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":"c68f89f9a9f8980b565186cfb9c46513786083d356d8842321f8fa74446acc09","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":"a17ea56cfd40e5aeb0b045e58c0c9a84c62c084cfb8f5ddbbbf7fc11f58db235","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":"f969dbebf2d8d34ea4eb74c8a108ddee9dc8a4db57807c2fd04305df8ea4fb36","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":"b1d5b5b06e18d6285011ba30cefc0b26680a8d821f3dc29659cf748b5de0e5c7","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":"521417effcc324e5c2b510e6e2d423aefd6aa044cf9712751e4788b948d25040","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":"ff0b4d1e3a823e8d95f20cfb5fc7932511a68d240e724fc6f57c2b2d4d6859dc","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":"7e2c125a4446d1cfd97c316e6c5c9af2f0bdabfa6c3f992db52cf5ba515a59dd","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"f6e2be3cd1c278bf9b380aa85c2efdcd714d4014479df86825082e14085590cd","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Launch imd/acc's fourth and last Sepolia test run from this repository (the launch-sepolia branch, which is the sepolia branch without .github/workflows; do not add any workflow file): deploy only the ProjectRegistry, exactly as launch.json lists it, wired to test run 2's live Stacker and to IdentityMD's Intake v2. This registry is the code the mainnet registry will use, with Sepolia settings. It is test run 3's registry (launch #1371, 0x9b466d1527322435dc7fdd97bc862b49c177fc2d) plus the fix for that launch's judged low: a bond the oracle asset refuses to pay no longer holds a question open. This run tests the registry live (applications, a listing and a challenge) before mainnet. imd/acc pays trading cashback to traders as staked IMD (sIMD), 0.25% to 1% of each trade at each project's choice, funded from the project's existing fees; only credits from listed projects earn points.\n\nDEPLOY (Sepolia, one contract):\n- ProjectRegistry(intake, oracleAsset, stacker, oracleSigner, questionChainId, challengeBond, challengeCooldown) = (0xa43e6f75ee006411f79ac1c84120606c2330de82 Intake v2, 0x44a1cd38474fb1748400e7deb5f8d786cce3f89a Sepolia test IMD, 0x0457276d7b036818b3eddc1a4a3fceda61e9314d the live Stacker of launch #1294, 0x5598aa9146215bc13eb26f2c692ad1461fd32982 oracle signer, 1, 5e18, 3600). launch.json already lists exactly this.\n- Do not deploy a Stacker, TestIMD or TestSIMD. The Stacker at 0x0457...314d is live and runs src/Stacker.sol byte for byte (test/SepoliaFork.t.sol checks it) on the live TestIMD 0x2b69...1e82 and TestSIMD 0xf9e2...1cc1 of launch #1129, and PLEA's hook already credits through it. The registry only names the Stacker in its questions and never calls it.\n- src/ProjectRegistry.sol and src/oracle/OracleAttestation.sol stay as they are: no owner; the constructor makes no external call. Anyone calls applyListing(project, name, sourceUrl, rateBps 25-100, beneficiary) or, for a listed project, challengeForBeneficiary(project, reason, beneficiary), paying the oracle fee read live from the Intake (ORACLE_FEE(), 0.5 test IMD) plus the bond for a challenge; the registry asks Intake v2 one yes-or-no question with requestWithFailure, with the 8 rules of version 2 (docs/panel-rules-v2.md), each under 512 characters. onOracleResult (0x510379c7) accepts only the Intake, only its own open request, each answer once, only a signature by the oracle signer for this contract issued after the ask (with the library's 300-second tolerance), from a panel of 15 with at least 11 agreeing: yes lists from that block, or keeps a challenged project (bond to its beneficiary, without restarting the cooldown); no rejects, or delists from that block (bond back). A challenge asks about the project's current rate within 25-100 bps. onOracleFailure (0xa7980e31) only clears the open question and returns a bond; expire clears one after a day or once the Intake completed it. Paying a bond never blocks these: if the token refuses the transfer, the bond is recorded in bondOwed (BondOwed) and its recipient takes it later with claimBond(to), to any wallet. setBeneficiary waits while a question is open and changes the wallet at most once per day (HANDOFF_INTERVAL, HandoffTooSoon otherwise). Questions are filed under chain 1 (the oracle has no Sepolia RPC) and name Sepolia in the text.\n- test/mocks and test/trial hold test doubles only. Keep foundry.toml as it is (solc 0.8.26, cancun, 10,000 runs, bytecode_hash none).\n\nFACTS (read on Sepolia 2026-10-12, block 11,897,397): Intake v2 is live (callback gas 1,000,000) and sells the question for 0.5 of the test IMD, which anyone can mint. The live Stacker's IMD() and SIMD() are TestIMD and TestSIMD; TestSIMD is not paused. The registry's runtime is 22,736 bytes; deploying it estimates about 35.9M gas on Sepolia's current schedule (test run 3's registry deployed through the factory at 11,897,213).\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/Deployment.t.sol checks this manifest: the registry alone, wired to the live Stacker, with the agreed Sepolia bond and cooldown. test/RegistryBondOwed.t.sol covers owed bonds (a token that blocks the challenger or the beneficiary, or returns false; answers delivered with 200k gas); test/RegistryHandoffInterval.t.sol and test/RegistryRevisionRegression.t.sol cover the handoff rule. Keep all of them passing.\n\nREADME: once live, add the registry's address as \"Sepolia test run 4\" in the Deployments table.","parentJobId":null,"planHash":"cc477698fa5f8cfa2886070ed7036a9d61a13cb10eb5c6a8c24aacb8bca068a0","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"87fc50ef-4459-4b7a-90f0-e5399043a2b9","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1378-launch-imd-acc-s-fourth-last"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51142","feedbackHash":"cfca93f95a186d3b5bb4918db453b9d05fbdd3a42458cad3cb765f6560f2496e","nodeKey":"adapt_contract_project","submissionHash":"55a7273cff6062e03547ad504d26456ef01b99ff29379209e4889572b8b6f037","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51473","feedbackHash":"cad89454b6097e588f7f6db464a9bd976da6520c29f871b53aa89deafc778408","nodeKey":"audit_economics","submissionHash":"c68f89f9a9f8980b565186cfb9c46513786083d356d8842321f8fa74446acc09","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51507","feedbackHash":"170d2e0513bda4023cf4cb7636376941941d3dfddfa9e435714439a06dfa750b","nodeKey":"audit_flow","submissionHash":"a17ea56cfd40e5aeb0b045e58c0c9a84c62c084cfb8f5ddbbbf7fc11f58db235","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52163","feedbackHash":"25155500a6f767f6ca73365cd8edb2fa6b770fbd630da6467d857c16a85b7a83","nodeKey":"audit_imported_code","submissionHash":"f969dbebf2d8d34ea4eb74c8a108ddee9dc8a4db57807c2fd04305df8ea4fb36","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51423","feedbackHash":"c2a612e83e80d97b689788d3eac2191357f6ef8848621cc414c87561eb273d20","nodeKey":"audit_judge","submissionHash":"b1d5b5b06e18d6285011ba30cefc0b26680a8d821f3dc29659cf748b5de0e5c7","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52019","feedbackHash":"95d727165023e0f5a7acde4f73ce7c6b52d19e27c18407bea71c5e101e23f5ef","nodeKey":"audit_math","submissionHash":"521417effcc324e5c2b510e6e2d423aefd6aa044cf9712751e4788b948d25040","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51082","feedbackHash":"8840479e8c95dc85eef399362b0b4eaee598d32c50382082f4c6b414cc061145","nodeKey":"audit_permissions","submissionHash":"ff0b4d1e3a823e8d95f20cfb5fc7932511a68d240e724fc6f57c2b2d4d6859dc","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52162","feedbackHash":"3a9aea65acd3e2725aeed40d1864c67a4c05788d9a01603802c71cad4c786d87","nodeKey":"manifest","submissionHash":"7e2c125a4446d1cfd97c316e6c5c9af2f0bdabfa6c3f992db52cf5ba515a59dd","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52289","feedbackHash":"4add1e20065ae6ff835d633dee1fa5ff7418eedee082671abcdf1944a9763e79","nodeKey":"write_foundry_tests","submissionHash":"f6e2be3cd1c278bf9b380aa85c2efdcd714d4014479df86825082e14085590cd","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"c9edee21d78b23a2ac5712132becbd952f39828c3903af17eda148377e27fc16","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ef31844bb462de78","findings":[],"hash":"298097095aa2f76901c475b1818f02f4cd1e21b0d8045fe950afbf609573175f","nodeId":"fafe7301-4ab2-4cce-a77b-970302cbc9ca","outcome":"failed","summary":"the task produced no changes; the agent's last message was: The existing launch.json already matches the brief exactly, so no edit was needed and the working tree is clean.\n\nWhat I verified:\n\n- **Manifest shape**: only the keys kind, contracts and notes. One contract, ProjectRegistry, with seven constructor arguments in declaration order. Notes are 1,580 characters, under the 4,000 limit.\n- **Constructor arguments**: Intake v2, Sepolia test IMD, the live Stacker of launch #1294, the oracle signer, chain id 1, bond 5e18 and cooldown 3600. They match the brief case-insensitively and the constructor in src/ProjectRegistry.sol (address, address, address, address, uint256, uint256, uint64). No owner argument exists, which matches the ownerless design.\n- **Build and tests**: forge build succeeds. forge test ran 192 tests with 184 passing, 0 failing and 8 fork tests skipped for lack of RPC URLs. test/Deployment.t.sol passes, including the empty-chain constructor rehearsal and the manifest-shape check.\n- **Protected check**: runtime is 22,736 bytes, under the 24,576 EIP-170 limit, and the no-escape-opcode test passes.\n\nNo files were changed. The README \"Sepolia test run 4\" row can only be added after the deployment address exists, which is outside this manifest-only assignment.","treeHash":null,"usage":{"cachedInputTokens":238624,"inputTokens":162,"model":"claude-fable-5-1","outputTokens":2314,"runtime":"claude","turns":6,"wallClockMs":63214}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"be3be4cc237417f9","findings":[{"citation":"resolved","description":"Boundary: the external call to the oracle asset's transfer in _tryTransfer, reached from _payBond inside onOracleResult / onOracleFailure, which the Intake runs with a 200k gas stipend on mainnet (1M on Sepolia). Assumption: 'Settling or clearing a question never waits on paying a bond: if the token refuses the transfer, the bond is recorded in bondOwed' (README, launch.json notes, the _payBond comment). The fallback needs about 24k gas after the call returns (SSTORE of a fresh bondOwed slot 22,100 plus the BondOwed event and the tail of the callback). Actual: call(gas(), ...) hands the token 63/64 of whatever is left. A refusal that spends the gas it was given before reverting (instead of an early require) leaves the registry 1/64 of the remainder, far below 24k, so the callback itself runs out of gas, the Intake records 'not delivered', the signed verdict is discarded and the project keeps its pre-answer state until anyone calls expire a day later, which then records the owed bond because it runs with the caller's gas. Measured: with such a token the delivery fails at 200k and at 1M gas; after expire bondOwed is 5e18. Reachability for this launch: none observed. The oracle asset is immutable and the live Sepolia test IMD 0x44a1...f89a is a 1,821-byte plain ERC20 (no EIP-1967 implementation slot, symbol IMD, 18 decimals); its transfer paid a real 5e18 bond through a 200k callback on a Sepolia fork in 128,956 gas (fresh recipient) and 109,933 gas (refund). Mainnet IMD is documented as a LayerZero OFT without transfer fees. So this is a limit of the guarantee as written, not a loss on this deployment; reported as info for the mainnet copy of this code. Suggested minimal fix preserving the design: forward a bounded amount of gas to the token in _tryTransfer (for example call(min(gas(), 100000), ...) or any cap that leaves at least ~30k for the bondOwed write), so an expensive refusal is treated like any other refusal. Trade-off: a token whose honest transfer needs more than the cap would always be recorded as owed and paid through claimBond, which is still the documented recovery path. All other arithmetic and boundary checks in the registry were traced and hold (see coverage).","line":456,"path":"src/ProjectRegistry.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {ProjectRegistry, IIntake} from \"src/ProjectRegistry.sol\";\nimport {OracleAttestation} from \"src/oracle/OracleAttestation.sol\";\n\n/// @dev An oracle asset that refuses a blocked recipient only after spending the gas it was\n/// given (a refusal that is expensive instead of early). Everything else is a plain ERC20.\ncontract GasBurningIMD is ERC20 {\n    mapping(address => bool) public blocked;\n\n    constructor() ERC20(\"IMD\", \"IMD\") {}\n\n    function mint(address to, uint256 a) external {\n        _mint(to, a);\n    }\n\n    function setBlocked(address who, bool on) external {\n        blocked[who] = on;\n    }\n\n    function transfer(address to, uint256 value) public override returns (bool) {\n        if (blocked[to]) {\n            uint256 x;\n            while (gasleft() > 2_000) {\n                x = uint256(keccak256(abi.encode(x)));\n            }\n            revert(\"blocked\");\n        }\n        return super.transfer(to, value);\n    }\n}\n\n/// @dev Intake stand-in that delivers answers with exactly 200k gas inside a try, like mainnet.\ncontract CappedIntake is IIntake {\n    bytes32 internal constant ACTION = \"oracle.request@oracle-1\";\n\n    struct Req {\n        address target;\n        bytes4 selector;\n        bytes4 onFailure;\n        bool completed;\n    }\n\n    mapping(bytes32 => Req) internal reqs;\n    uint256 internal n;\n\n    function priceOf(bytes32 action, address) external pure returns (uint256) {\n        return action == ACTION ? 0.5e18 : 0;\n    }\n\n    function requestWithFailure(\n        bytes32,\n        bytes calldata,\n        Callback calldata cb,\n        bytes4 onFailure,\n        address asset,\n        uint256 amount\n    ) external returns (bytes32 id) {\n        IERC20(asset).transferFrom(msg.sender, address(0x7EA5), amount);\n        id = keccak256(abi.encode(++n));\n        reqs[id] = Req(cb.target, cb.selector, onFailure, false);\n    }\n\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) {\n        return (address(0), reqs[id].target, reqs[id].selector, reqs[id].completed);\n    }\n\n    function deliver(bytes32 id, OracleAttestation.Attestation calldata a, bytes calldata sig)\n        external\n        returns (bool ok)\n    {\n        reqs[id].completed = true;\n        (ok,) = reqs[id].target.call{gas: 200_000}(\n            abi.encodeWithSelector(reqs[id].selector, id, a, sig)\n        );\n    }\n}\n\ncontract SomeProject {}\n\n/// @dev \"Settling never waits on paying a bond\" must also hold when the token's refusal is\n/// expensive: the signed answer must settle within the 200k callback and the bond be owed.\ncontract GasBurnProofTest is Test {\n    uint256 internal constant KEY = 0xA11CE;\n    uint256 internal constant BOND = 5e18;\n\n    CappedIntake internal intake;\n    GasBurningIMD internal imd;\n    ProjectRegistry internal reg;\n    address internal project;\n    address internal applicant = makeAddr(\"applicant\");\n    address internal challenger = makeAddr(\"challenger\");\n    address internal beneficiary = makeAddr(\"beneficiary\");\n    uint256 internal uuid;\n\n    function setUp() public {\n        vm.roll(1000);\n        vm.warp(1_700_000_000);\n        intake = new CappedIntake();\n        imd = new GasBurningIMD();\n        reg = new ProjectRegistry(\n            address(intake), address(imd), address(0x57AC), vm.addr(KEY), 1, BOND, 1 hours\n        );\n        project = address(new SomeProject());\n        imd.mint(applicant, 100e18);\n        imd.mint(challenger, 100e18);\n        vm.prank(applicant);\n        imd.approve(address(reg), type(uint256).max);\n        vm.prank(challenger);\n        imd.approve(address(reg), type(uint256).max);\n    }\n\n    function _att(bool yes) internal returns (OracleAttestation.Attestation memory a) {\n        a.requestId = bytes32(++uuid << 128);\n        a.chainId = 1;\n        a.answer = abi.encode(yes);\n        a.panelSize = 15;\n        a.quorum = 11;\n        a.agreed = 11;\n        a.issuedAt = uint64(block.timestamp);\n        a.expiresAt = uint64(block.timestamp + 1 days);\n    }\n\n    function _sig(OracleAttestation.Attestation memory a) internal view returns (bytes memory) {\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(KEY, reg.attestationDigest(a));\n        return abi.encodePacked(r, s, v);\n    }\n\n    function test_expensiveRefusal_signedNoStillSettlesWithin200k() public {\n        vm.prank(applicant);\n        bytes32 id = reg.applyListing(project, \"P\", \"https://x.example/p\", 50, beneficiary);\n        OracleAttestation.Attestation memory a = _att(true);\n        assertTrue(intake.deliver(id, a, _sig(a)));\n        assertTrue(reg.isListed(project));\n\n        vm.warp(block.timestamp + 1 hours);\n        vm.prank(challenger);\n        id = reg.challengeForBeneficiary(project, \"Review.\", beneficiary);\n        imd.setBlocked(challenger, true);\n\n        a = _att(false);\n        // Expected: the answer settles (delists) and the bond is owed. Actual on this code: the\n        // token burns the forwarded gas, the callback runs out of gas, the question stays open.\n        assertTrue(intake.deliver(id, a, _sig(a)), \"signed no must settle within 200k\");\n        assertFalse(reg.isListed(project), \"delisted\");\n        assertEq(uint8(reg.projectOf(project).ask), uint8(ProjectRegistry.Ask.None), \"slot cleared\");\n        assertEq(reg.bondOwed(challenger), BOND, \"bond owed, not lost\");\n    }\n}","reproduction":"State: registry with oracleAsset = an ERC20 whose transfer(to, v) reverts only after burning the forwarded gas when `to` is blocked (test/scratch/GasBurnProof.t.sol, GasBurningIMD), bond 5e18, cooldown 1h, Intake stand-in that calls the callback with exactly 200,000 gas inside a try. Steps: 1) applicant applyListing(project, 'P', 'https://x.example/p', 50, beneficiary); deliver a signed yes -> listed. 2) warp +1h; challenger challengeForBeneficiary(project, 'Review.', beneficiary); registry holds 5e18. 3) token.setBlocked(challenger, true). 4) Intake delivers a signed no (panel 15/11/11, chainId 1) with 200k gas. Expected (per the bondOwed design): delivered == true, isListed(project) == false, projectOf(project).ask == None, bondOwed(challenger) == 5e18. Actual: delivered == false (callback out of gas after the token consumed 63/64 of the remaining gas), isListed(project) == true, ask still Challenge, bondOwed(challenger) == 0; the same with a 1,000,000 gas stipend. Only after warp +1 day +1 does expire(project) clear the slot and set bondOwed(challenger) = 5e18, and the panel's delist verdict is lost. Run: forge test --match-path test/scratch/GasBurnProof.t.sol  -> FAIL 'signed no must settle within 200k'. With a plain ERC20 (OpenZeppelin) in the same scenario the delivery succeeds, which is what test/RegistryBondOwed.t.sol covers (early-revert and false-return refusals only).","severity":"info","snippet":"ok := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)","title":"_tryTransfer forwards all remaining gas to the oracle asset, so a refusal that is expensive instead of early still holds the question open (boundary x invariant)"}],"hash":"521417effcc324e5c2b510e6e2d423aefd6aa044cf9712751e4788b948d25040","nodeId":"b7fedad1-1376-4334-8945-eb0a12768c6e","outcome":"completed","summary":"Review complete. The findings are in `.imd-findings.json` (valid JSON, 1 finding, 12 coverage rows). No tracked file changed; the findings file and `test/scratch/` are excluded by the repository's own git exclude list.\n\n**What I audited.** The math, boundary and numerical-gap surface of `src/ProjectRegistry.sol` and the attestation library, against the Pashov Math Precision, Boundary and Numerical Gap guides. The registry has no division or scaling at all, so the surface is time boundaries, text caps, uint64 casts, the oracle fee and bond additions, callback gas, and the return-data decoding of the bond transfer.\n\n**Result: no defect that affects this launch.** One info-level item for the mainnet copy of this code:\n\n- **Expensive refusal defeats the owed-bond guarantee** (`src/ProjectRegistry.sol:456`). The bond payout forwards all remaining gas to the token. A token whose refusal burns the forwarded gas instead of reverting early leaves the registry too little to record the owed bond, so the 200k callback itself fails and the signed verdict is lost until `expire` a day later. Not reachable here: the oracle asset is immutable, and I read the live Sepolia test IMD as a 1,821-byte plain ERC20 with no proxy slot. A proof test that fails on the current code is embedded in the finding; a bounded gas forward is the suggested fix.\n\n**Boundaries verified with numbers, on this tree and live:**\n\n| Check | Measured | Cap |\n|---|---|---|\n| Longest panel rule (feeGuard) | 472 bytes | 512 |\n| Worst-case challenge question | 1,113 bytes | 2,000 |\n| Worst-case body | 3,826 bytes | 16,384 |\n| Callback gas, largest path (defended, live token, fresh recipient) | 128,956 | 200,000 |\n| Runtime size | 22,736 bytes | 24,576 |\n| launch.json notes | 1,580 chars | 4,000 |\n\nThe deadline, tolerance, cooldown and handoff comparisons are all exact and complementary at the boundary second. On a Sepolia fork the live Intake's `requests()` decodes as the registry expects, and a real bond was paid and refunded through the 200k callback. Test run 2's live registry has already accepted a signed answer filed under chain 1, which settles the `WrongPanel` chain check. The manifest matches the brief's seven arguments in order.\n\n**Coverage.** All 9 listed entry points have a row: 8 hold, `onOracleResult` carries the info finding. Not reached: the mainnet IMD token's transfer behaviour, which I could only take from the README's description.","treeHash":null,"usage":{"cachedInputTokens":3463811,"inputTokens":674,"model":"claude-fable-5-1","outputTokens":68321,"runtime":"claude","turns":62,"wallClockMs":1061324}},{"artifacts":[],"attempt":1,"bundleHash":"4bea6b9562f76dd98f6039232777d7a4231d13cd645ab81bd7c9ba281d1f3841","device":"e57a8e639cccfbab","findings":[],"hash":"55a7273cff6062e03547ad504d26456ef01b99ff29379209e4889572b8b6f037","nodeId":"6b391d90-602d-44b2-b07a-9008cae61694","outcome":"completed","summary":"The build is clean with no notes on the new test, and the working tree holds only the three intended paths.\n\n**Outcome.** The registry on this branch already meets every launch rule and carries the fix the brief asks for, so `src/` is unchanged. I added the adaptation notes, a reproduction test for the audit's two lows, and the README entry for test run 4.\n\n**What I verified**\n- `forge build` passes with the project's own configuration (solc 0.8.26, cancun, 10,000 runs, no bytecode hash).\n- `forge test` with an empty environment: 174 passed, 0 failed, 8 skipped (the fork tests, which need RPC URLs). The suite is now 182 tests.\n- The constructor takes 7 static arguments, makes no external call, and deploys on an empty chain in test/Deployment.t.sol. The runtime is under EIP-170 and has no forbidden opcodes. No owner exists, so nothing can fall to the factory or IMD.\n- The existing launch.json matches the brief exactly and the deployment test accepts it. I did not touch it, the build configuration, or anything under `.github/`.\n\n**The audit's two lows.** Both reproduced against the mock Intake exactly as described, and I left the contract as it is. The self-challenge front-run is the finding test run 3's judge accepted as a design limit, and the doomed-application slot is a known limit in docs/design.md. The mitigations the audit offers are bypassed by a second wallet or require a project-owner notion the registry deliberately lacks, and the only effective one changes the defended bond's destination, which the brief fixes. test/RegistryAuditLows.t.sol pins what each limit costs the attacker and what it cannot do. ADAPTATION.md gives the full reasoning.\n\n**Left open for after deployment.** The README's \"Sepolia test run 4\" row says the address is to be filled in once live, since it is only known after the launch. No stand-in was written.","treeHash":"ad6be9b15aa59ba9e952d634f07943a25b5fbbee","usage":{"cachedInputTokens":1250967,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":23066,"runtime":"claude","turns":30,"wallClockMs":378568}},{"artifacts":[],"attempt":2,"bundleHash":"a39c2029df0a18e7c6d417bffaaa1edcb484227bbf19dec2d1029237885afe3d","device":"f9cb4fd544aa3c68","findings":[],"hash":"7e2c125a4446d1cfd97c316e6c5c9af2f0bdabfa6c3f992db52cf5ba515a59dd","nodeId":"fafe7301-4ab2-4cce-a77b-970302cbc9ca","outcome":"completed","summary":"Done. I rewrote launch.json so this attempt records a real change, and all checks pass.\n\n**What changed**\n\n- **launch.json only.** The contract list and the seven constructor arguments are unchanged: Intake v2, the Sepolia test IMD, the live Stacker of launch #1294, the oracle signer, chain id 1, bond 5e18, cooldown 3600, in the constructor's declaration order.\n- **Notes rewritten** to describe test run 4 precisely: test run 3's registry at launch #1371 plus the owed-bond fix, the 8 version-2 rules, both entry points and their rate range, the onOracleResult and onOracleFailure rules, expire, the handoff interval, the live facts read at block 11,897,397, and the pending README row. Notes are 3,030 characters, under the 4,000 limit, with only the keys kind, contracts and notes.\n\n**Verification**\n\n- `forge build` succeeds.\n- `forge test`: 174 passed, 0 failed, 8 fork tests skipped without RPC URLs. The manifest shape test, the empty-chain constructor rehearsal and the runtime-size test in test/Deployment.t.sol all pass.\n- The protected test, rehearsed from test/scratch with the real creation code, the manifest's arguments and a placeholder factory on chain 11155111, passes: runtime present, under EIP-170, no forbidden opcodes.\n- git shows launch.json as the only modified file.\n\n**Left out on purpose:** the README \"Sepolia test run 4\" row needs the deployed address, which does not exist until the launch runs, and README is outside this task's allowed paths.","treeHash":"957e77f9797d1aee4490e349da3ff54a93958dde","usage":{"cachedInputTokens":398257,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":6113,"runtime":"claude","turns":11,"wallClockMs":133591}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2dc755dfe7bd177c","findings":[{"citation":"resolved","description":"The comment above `_tryTransfer` (lines 448-449) says it applies the same checks as OpenZeppelin's SafeERC20. It does not for one shape of return data: when `transfer` returns between 1 and 31 bytes, SafeERC20's `abi.decode(returndata, (bool))` reverts (so a caller's whole transaction reverts and nothing is double counted), while `_tryTransfer` copies those bytes into scratch memory, reads the full 32-byte word (the copied bytes plus whatever was left in scratch) and compares it to 1, which fails. `_payBond` then takes that as 'the token refused' and adds the bond to `bondOwed[to]` although the token already moved it. The registry then owes a bond it no longer holds; the next `claimBond` or a later `_payBond` is paid from other challengers' open bonds, and the last recipient is short. The oracle asset is immutable and fixed by the manifest to the Sepolia test IMD (0x44a1...f89a; checked live: a plain OpenZeppelin ERC20 that returns a 32-byte word, with no owner, pause or blocklist) and on mainnet to IMD, neither of which can return short data, so this is not reachable in this deployment. It is reported because the stated SafeERC20 parity is the justification for the new bond-owed path, and because a future registry on another token would inherit the divergence. The minimal fix is to require `returnSize >= 32` before trusting `returnValue`, treating shorter non-empty return data as a failed transfer only if the balance did not move, or more simply to measure the registry's balance before and after the call and use that as the success signal.","line":460,"path":"src/ProjectRegistry.sol","reproduction":"Deploy ProjectRegistry with an oracle asset whose `transfer` moves the tokens and then returns a single byte 0x01 (test/scratch/ShortReturnToken.t.sol, `ShortReturnIMD`). List a project (applyListing + a signed yes), warp past the cooldown, challengeForBeneficiary with a 5e18 bond (registry balance 5e18). Deliver a signed `no` through the Intake callback. Expected (SafeERC20 semantics or correct accounting): either the bond is paid and `bondOwed[challenger]` stays 0, or nothing moves and the bond is owed. Actual: the challenger's balance rises by 5e18, the registry's balance falls to 0, and `bondOwed(challenger)` == 5e18 as well, so the registry owes 5e18 it does not hold. `forge test --match-path test/scratch/ShortReturnToken.t.sol` passes, i.e. the double accounting is observed.","severity":"info","snippet":"        ok = ok && (returnSize == 0 ? token.code.length > 0 : returnValue == 1);","title":"_tryTransfer treats 1-31 bytes of return data as a refusal after the tokens moved, so a bond can be paid and recorded as owed at once (unreachable with the launch's oracle asset)"}],"hash":"a17ea56cfd40e5aeb0b045e58c0c9a84c62c084cfb8f5ddbbbf7fc11f58db235","nodeId":"2614350a-dac3-4e7e-8a9b-d32e70b3b39f","outcome":"completed","summary":"The review is complete. `.imd-findings.json` holds one substantiated finding and a coverage row for every listed entry point plus three invariant rows. No tracked file was changed; only the findings file and two scratch tests exist, both excluded from git.\n\n**Outcome: no defect of medium or higher severity in the registry's control flow.** The one finding is informational.\n\n**Finding 1 (info)** at `src/ProjectRegistry.sol:460`. The new bond-payment helper claims SafeERC20 parity but diverges for a token whose `transfer` returns 1 to 31 bytes. SafeERC20 reverts there. The registry instead treats a completed transfer as refused and also records the bond in `bondOwed`, so it owes a bond it no longer holds. A scratch test under `test/scratch/ShortReturnToken.t.sol` shows the double accounting. It is unreachable in this launch because the oracle asset is immutable and fixed to the Sepolia test IMD, which I checked live and which is a plain OpenZeppelin ERC20 with no owner, pause or blocklist. I reported it because that parity claim is the justification for the owed-bond fix this run exists to test.\n\n**What I verified against the live chain**, beyond the offline suite:\n\n- The eight fork tests pass against Sepolia through a public RPC. An application pays the real Intake v2 0.5 test IMD and registers both selectors.\n- The live Intake's record for test run 3's cleared request decodes exactly as the interface `expire` relies on, with the fourth word `completed = true`.\n- The oracle's real rehearsal attestation, signed by the launch's signer for its consumer address, replays through `onOracleResult` in a registry deployed at that address and lists the project. That confirms the EIP-712 domain, struct, chain id 1 and panel 15/11 checks against what the live oracle actually signs. See `test/scratch/LiveAttestation.t.sol`.\n- The manifest has only the schema keys, seven arguments in declaration order matching the brief, notes under the limit, and a 22,736-byte runtime without forbidden opcodes.\n\n**Not re-reported:** the self-challenge slot-taking and the doomed-application slot-holding, both previously judged and accepted as design limits and now pinned by the last contributor's tests. The beneficiary and rate rules remain panel policy rather than contract enforcement, as the design states.\n\n**Coverage:** all nine entry points have a row. Eight hold. `onOracleResult` and the balance invariant point to finding 1. `Stacker.credit` is outside this launch and is never called by the registry.","treeHash":null,"usage":{"cachedInputTokens":2438760,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":52479,"runtime":"claude","turns":49,"wallClockMs":791102}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"56e50117311155be","findings":[{"citation":"resolved","description":"applyListing (line 252) and _challenge (line 294) both refuse with AskOpen while a question is open, and the slot goes to whoever lands first. Taking it costs only the live oracle fee: a challenge bond comes back on a signed yes to p.beneficiary (the same owner when the challenger is the beneficiary's second wallet), and an application posts no bond. A beneficiary watching the mempool can therefore front-run every hostile challengeForBeneficiary(project, reason, B) with challengeForBeneficiary(project, 'all fine', B) from another wallet; the hostile call reverts AskOpen, the bland self-challenge settles minutes later with the bond back to B, and the cycle repeats. The hostile reason never reaches the panel (the panel still judges every rule, which bounds the harm, since an honest panel can delist on the self-challenge). Symmetrically anyone can keep an unlisted project from being listed by front-running the owner's applyListing with an application naming a wrong rate or beneficiary, rejected each round for 0.5 IMD. No funds are lost; the guarantee the HANDOFF_INTERVAL comment states (a challenger who retries 'always gets a question filed') holds against handoffs only, not against slot occupancy. Merged from audit_permissions; reproduced offline. Design trade-off for the author: for example, allow a second challenge while one is open when the new challenger pays its own fee and bond (settled in order), or refuse a challenge from the project's current beneficiary and forfeit the bond on a defended self-challenge.","line":294,"path":"src/ProjectRegistry.sol","reproduction":"test/scratch/Repro.t.sol test_slotGriefing_challengeAndApply (passes, i.e. the behaviour is observed). MockIntake + MintableIMD, bond 5e18, cooldown 1h. (1) owner applyListing(P,'P','https://x.example/p',50,B); deliver signed yes; warp +1h. Loop 5x: prank(second) challengeForBeneficiary(P,'all fine',B) succeeds; prank(honest) challengeForBeneficiary(P,'credits the owner outside trades',B) reverts AskOpen; deliver signed yes with 200k gas -> P stays listed, bond 5e18 back to B. After 5 rounds B+second are down exactly 5*0.5e18 and honest never had a question filed. Expected: a challenger naming the wallet in force gets a question filed; actual: AskOpen every round. (2) fresh unlisted P: loop 5x prank(griefer) applyListing(P,'P','https://x.example/p',25,griefer) succeeds; prank(owner) applyListing(P,...,50,B) reverts AskOpen; deliver signed no. P never listed, griefer down 5*0.5e18.","severity":"low","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"One open question per project is first-come, so a 0.5 IMD self-challenge or a rival application keeps a third party's challenge or application out indefinitely"},{"citation":"resolved","description":"The bondOwed design promises that settling or clearing a question never waits on paying a bond. _payBond -> _tryTransfer uses call(gas(), ...), handing the token 63/64 of what is left of the Intake's 200k (mainnet) or 1M (Sepolia) stipend. A token whose refusal spends the forwarded gas before reverting leaves the registry about 1/64 of the remainder, below the ~24k the fallback needs (fresh bondOwed SSTORE + BondOwed event + tail), so the callback itself runs out of gas, the Intake records 'not delivered', the signed verdict is discarded, and the project keeps its pre-answer state until expire a day later (which then records the owed bond, running with the caller's gas). The oracle asset is immutable and the manifest fixes it to the Sepolia test IMD 0x44a1...f89a, a plain OpenZeppelin ERC20 (mainnet: IMD, an OFT without transfer fees), neither of which can behave this way, so this is a limit of the guarantee as written rather than a loss on this deployment. Merged from audit_math; its proof was run and fails for the stated reason. Minimal fix preserving the design: forward a bounded gas amount in _tryTransfer (for example min(gas(), 100000)) so an expensive refusal is treated as any other refusal; a token whose honest transfer needs more than the cap would be recorded as owed and paid through claimBond, the documented recovery path.","line":456,"path":"src/ProjectRegistry.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {ProjectRegistry, IIntake} from \"src/ProjectRegistry.sol\";\nimport {OracleAttestation} from \"src/oracle/OracleAttestation.sol\";\n\n/// @dev An oracle asset that refuses a blocked recipient only after spending the gas it was\n/// given (a refusal that is expensive instead of early). Everything else is a plain ERC20.\ncontract GasBurningIMD is ERC20 {\n    mapping(address => bool) public blocked;\n\n    constructor() ERC20(\"IMD\", \"IMD\") {}\n\n    function mint(address to, uint256 a) external {\n        _mint(to, a);\n    }\n\n    function setBlocked(address who, bool on) external {\n        blocked[who] = on;\n    }\n\n    function transfer(address to, uint256 value) public override returns (bool) {\n        if (blocked[to]) {\n            uint256 x;\n            while (gasleft() > 2_000) {\n                x = uint256(keccak256(abi.encode(x)));\n            }\n            revert(\"blocked\");\n        }\n        return super.transfer(to, value);\n    }\n}\n\n/// @dev Intake stand-in that delivers answers with exactly 200k gas inside a try, like mainnet.\ncontract CappedIntake is IIntake {\n    bytes32 internal constant ACTION = \"oracle.request@oracle-1\";\n\n    struct Req {\n        address target;\n        bytes4 selector;\n        bytes4 onFailure;\n        bool completed;\n    }\n\n    mapping(bytes32 => Req) internal reqs;\n    uint256 internal n;\n\n    function priceOf(bytes32 action, address) external pure returns (uint256) {\n        return action == ACTION ? 0.5e18 : 0;\n    }\n\n    function requestWithFailure(\n        bytes32,\n        bytes calldata,\n        Callback calldata cb,\n        bytes4 onFailure,\n        address asset,\n        uint256 amount\n    ) external returns (bytes32 id) {\n        IERC20(asset).transferFrom(msg.sender, address(0x7EA5), amount);\n        id = keccak256(abi.encode(++n));\n        reqs[id] = Req(cb.target, cb.selector, onFailure, false);\n    }\n\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) {\n        return (address(0), reqs[id].target, reqs[id].selector, reqs[id].completed);\n    }\n\n    function deliver(bytes32 id, OracleAttestation.Attestation calldata a, bytes calldata sig)\n        external\n        returns (bool ok)\n    {\n        reqs[id].completed = true;\n        (ok,) = reqs[id].target.call{gas: 200_000}(\n            abi.encodeWithSelector(reqs[id].selector, id, a, sig)\n        );\n    }\n}\n\ncontract SomeProject {}\n\n/// @dev \"Settling never waits on paying a bond\" must also hold when the token's refusal is\n/// expensive: the signed answer must settle within the 200k callback and the bond be owed.\ncontract GasBurnProofTest is Test {\n    uint256 internal constant KEY = 0xA11CE;\n    uint256 internal constant BOND = 5e18;\n\n    CappedIntake internal intake;\n    GasBurningIMD internal imd;\n    ProjectRegistry internal reg;\n    address internal project;\n    address internal applicant = makeAddr(\"applicant\");\n    address internal challenger = makeAddr(\"challenger\");\n    address internal beneficiary = makeAddr(\"beneficiary\");\n    uint256 internal uuid;\n\n    function setUp() public {\n        vm.roll(1000);\n        vm.warp(1_700_000_000);\n        intake = new CappedIntake();\n        imd = new GasBurningIMD();\n        reg = new ProjectRegistry(\n            address(intake), address(imd), address(0x57AC), vm.addr(KEY), 1, BOND, 1 hours\n        );\n        project = address(new SomeProject());\n        imd.mint(applicant, 100e18);\n        imd.mint(challenger, 100e18);\n        vm.prank(applicant);\n        imd.approve(address(reg), type(uint256).max);\n        vm.prank(challenger);\n        imd.approve(address(reg), type(uint256).max);\n    }\n\n    function _att(bool yes) internal returns (OracleAttestation.Attestation memory a) {\n        a.requestId = bytes32(++uuid << 128);\n        a.chainId = 1;\n        a.answer = abi.encode(yes);\n        a.panelSize = 15;\n        a.quorum = 11;\n        a.agreed = 11;\n        a.issuedAt = uint64(block.timestamp);\n        a.expiresAt = uint64(block.timestamp + 1 days);\n    }\n\n    function _sig(OracleAttestation.Attestation memory a) internal view returns (bytes memory) {\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(KEY, reg.attestationDigest(a));\n        return abi.encodePacked(r, s, v);\n    }\n\n    function test_expensiveRefusal_signedNoStillSettlesWithin200k() public {\n        vm.prank(applicant);\n        bytes32 id = reg.applyListing(project, \"P\", \"https://x.example/p\", 50, beneficiary);\n        OracleAttestation.Attestation memory a = _att(true);\n        assertTrue(intake.deliver(id, a, _sig(a)));\n        assertTrue(reg.isListed(project));\n\n        vm.warp(block.timestamp + 1 hours);\n        vm.prank(challenger);\n        id = reg.challengeForBeneficiary(project, \"Review.\", beneficiary);\n        imd.setBlocked(challenger, true);\n\n        a = _att(false);\n        // Expected: the answer settles (delists) and the bond is owed. Actual on this code: the\n        // token burns the forwarded gas, the callback runs out of gas, the question stays open.\n        assertTrue(intake.deliver(id, a, _sig(a)), \"signed no must settle within 200k\");\n        assertFalse(reg.isListed(project), \"delisted\");\n        assertEq(uint8(reg.projectOf(project).ask), uint8(ProjectRegistry.Ask.None), \"slot cleared\");\n        assertEq(reg.bondOwed(challenger), BOND, \"bond owed, not lost\");\n    }\n}","reproduction":"forge test --match-path test/scratch/Proof_5afcac8cfb28.t.sol -> FAIL 'signed no must settle within 200k'. State: registry with oracleAsset = GasBurningIMD (transfer(to,v) burns gas until gasleft()<2000 then reverts when `to` is blocked), bond 5e18, cooldown 1h, Intake stand-in delivering with exactly 200,000 gas in a try. Steps: applyListing(project,'P','https://x.example/p',50,beneficiary); deliver signed yes -> listed; warp +1h; challenger challengeForBeneficiary(project,'Review.',beneficiary) (registry holds 5e18); token.setBlocked(challenger,true); deliver signed no (panel 15/11/11, chainId 1). Expected: delivered == true, isListed == false, ask == None, bondOwed(challenger) == 5e18. Actual: delivered == false, isListed == true, ask still Challenge, bondOwed(challenger) == 0; same at a 1,000,000 stipend. Only expire(project) after +1 day +1 clears the slot and records the bond; the panel's delist verdict is lost.","severity":"info","snippet":"            ok := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)","title":"_tryTransfer forwards all remaining gas to the oracle asset, so a refusal that burns gas instead of reverting early still holds the question open (unreachable with the launch's fixed asset)"},{"citation":"resolved","description":"When transfer returns between 1 and 31 bytes, the registry copies them into scratch memory, reads the whole 32-byte word and compares it to 1, which fails, so _payBond adds the bond to bondOwed[to] although the token already moved it. SafeERC20.safeTransfer (the comparison the comment at lines 448-449 draws) reverts on the same shape, so the whole transaction rolls back and nothing is double counted; the registry's code is OpenZeppelin's _callOptionalReturnBool, which shares the divergence. The registry then owes a bond it no longer holds, and the next claimBond or _payBond is paid from other challengers' open bonds, leaving the last recipient short. The oracle asset is immutable and fixed to the Sepolia test IMD (mainnet IMD), standard ERC20s returning a 32-byte word, so not reachable in this deployment; recorded because the stated SafeERC20 parity justifies the new bond-owed path and a registry on another token would inherit it. Merged from audit_flow. Minimal fix: require returnSize >= 32 before trusting returnValue, or compare the registry's balance before and after the call.","line":460,"path":"src/ProjectRegistry.sol","reproduction":"test/scratch/Repro.t.sol test_shortReturn_doubleAccounting (passes, i.e. the double accounting is observed). Registry on ShortReturnIMD (an OZ ERC20 whose transfer moves the tokens then returns one byte 0x01), bond 5e18. applyListing + signed yes; warp +1h; honest challengeForBeneficiary(project,'Review.',B); registry balance 5e18. Deliver signed no with 200k gas. Expected: either bond paid and bondOwed(honest) == 0, or nothing moved and bond owed. Actual: honest's balance +5e18, registry balance 0, and bondOwed(honest) == 5e18.","severity":"info","snippet":"        ok = ok && (returnSize == 0 ? token.code.length > 0 : returnValue == 1);","title":"_tryTransfer treats 1-31 bytes of return data as a refusal even when the tokens moved, so a bond can be paid and recorded as owed at once (unreachable with the launch's fixed asset)"},{"citation":"resolved","description":"claimBond refuses only the zero address. A creditor who passes address(registry) as `to` has bondOwed zeroed while the tokens move from the registry to itself; the bond is then owed to nobody and no function can release it (the registry has no owner or sweep). Self-inflicted and costs only the caller, like sending tokens to a contract by mistake, so not a defect of the agreed design; recorded so 'to any wallet' is read as 'any wallet but the registry'. Merged from write_foundry_tests. Cheap hardening: if (to == address(this)) revert ZeroAddress(); or a dedicated error.","line":466,"path":"src/ProjectRegistry.sol","reproduction":"test/scratch/Repro.t.sol test_claimBond_toRegistryStrands (passes, i.e. observed). List a project, challenge with 5e18 bond, deliver a signed no while transfer to the challenger returns false (bondOwed[challenger] = 5e18, registry balance 5e18). prank(challenger) claimBond(address(reg)). Expected: refused, or the bond reaches a wallet. Actual: succeeds, bondOwed(challenger) == 0, registry balance still 5e18 with no open question and nothing owed.","severity":"info","snippet":"        if (to == address(0)) revert ZeroAddress();","title":"claimBond(to) accepts the registry's own address and strands the claimed bond"},{"citation":"resolved","description":"The brief asks for no owner and the code honours it: intake, oracleAsset, oracleSigner are constructor-only and ACTION is a constant. The oracle-consumer reference states the opposite requirement for consumers (owner-settable intake, action, asset, price and signer so a new action version or a rotated key needs no redeploy); the task rules win, so this is not a defect, but the consequence is a trust assumption for mainnet: if IdentityMD rotates the signer key, every onOracleResult reverts BadSignature (OracleAttestation.sol:188), and if oracle-1 stops being sold, priceOf returns 0 and every applyListing/challenge reverts OracleUnavailable (line 319). In either case no challenge can settle, every project listed at that moment stays listed and keeps earning points, no new project can be listed, and the only recourse is a new registry plus an off-chain switch of the points indexer (which the contract's own docs name as the intended answer). Merged from audit_permissions.","line":81,"path":"src/ProjectRegistry.sol","reproduction":"State: project P listed. Rotate the oracle signer off chain to key K2 (registry.oracleSigner stays 0x5598...2982). challengeForBeneficiary(P, reason, B) files and pays fee + bond; deliver an attestation signed by K2: onOracleResult reverts BadSignature, the Intake records not delivered, expire(P) after a day returns the bond; P stays listed. Equivalently with intake.priceOf(ACTION, asset) == 0 (MockIntake.setPrice(0)): applyListing and challengeForBeneficiary revert OracleUnavailable.","severity":"info","snippet":"    bytes32 public constant ACTION = \"oracle.request@oracle-1\";","title":"Trust assumption: Intake, action id, oracle asset and oracle signer are fixed at deployment, so a signer rotation or the retirement of oracle-1 freezes the registry with every listed project listed fo"}],"hash":"b1d5b5b06e18d6285011ba30cefc0b26680a8d821f3dc29659cf748b5de0e5c7","nodeId":"e408ab6c-bd79-47ba-865d-05b4393c7d4d","outcome":"completed","summary":"The review is complete. The findings file is in place and the tree shows no tracked-file changes (scratch tests and the findings file are untracked, which git status confirms as clean).\n\n**Outcome:** no blocking defect. The registry as built, and the manifest as written, deploy and behave as the brief describes. Every specialist finding reproduced against the code, and I kept all five after rerunning each one, at the severities below. My own pass over the nine entry points, the manifest, the factory limits, and the oracle body found nothing the specialists missed.\n\n**Findings written to `.imd-findings.json`:**\n\n1. **Low, slot griefing.** One open question per project is first-come. A beneficiary's second wallet can front-run every hostile challenge with a bland self-challenge for 0.5 IMD a round, and anyone can keep an unlisted project from ever being listed the same way. No funds lost. Reproduced offline with the mocks in a scratch test.\n2. **Info, unbounded gas to the token.** The bond-payment call forwards all remaining gas, so a token that burns gas before refusing still makes the callback run out and holds the question open. The specialist's proof fails on this code for exactly that reason and is attached. Unreachable with the fixed Sepolia test IMD or mainnet IMD.\n3. **Info, short return data.** A token that moves tokens and returns 1 to 31 bytes is treated as a refusal, so the bond is paid and recorded as owed at once. Reproduced in a scratch test. Unreachable with the fixed asset.\n4. **Info, claimBond to the registry.** Passing the registry's own address as destination zeroes the debt and strands the tokens. Self-inflicted only.\n5. **Info, trust assumption.** Signer, Intake, action and asset are fixed at deployment as the brief requires, so a signer rotation or retirement of oracle-1 freezes the registry with current listings in place.\n\n**Coverage:** all nine entry points answered. Four map to the findings above, five hold. Three extra rows record the manifest and factory checks (seven string args in order, notes at 3,030 of 4,000 characters, runtime 22,736 bytes, no forbidden opcodes), the oracle body limits, and the full suite result of 186 passed with 8 fork tests skipped offline.\n\n**Not verified:** the live Sepolia state (Intake price, Stacker bytecode) since the fork tests need RPC URLs that were not set. The README's test run 4 address is correctly left as a post-launch step.","treeHash":null,"usage":{"cachedInputTokens":1061283,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":23784,"runtime":"claude","turns":23,"wallClockMs":433172}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc34db8e17664ebd","findings":[],"hash":"c68f89f9a9f8980b565186cfb9c46513786083d356d8842321f8fa74446acc09","nodeId":"8c8a2044-ac1d-4c7c-a945-d872e3612152","outcome":"completed","summary":"The review is complete and the findings file is written.\n\n**Result:** no substantiated economic defect in the ProjectRegistry for this launch. The findings list in `.imd-findings.json` is empty, with a 13-row coverage record covering all 9 listed entry points plus three invariants and one unreached item.\n\n**What I checked, against the Economic Security, Invariant and Flow Gap guides:**\n- Value flows: the fee is pulled at the live Intake price and approved exactly, so the Intake can never reach held bonds. Each challenge holds exactly one bond, which leaves exactly once, to the beneficiary pinned at ask time or back to the asker. The registry balance always covers open bonds plus owed bonds.\n- The owed-bond fix: a refusing token records the bond instead of blocking settlement. I measured the worst callback paths at 97k to 104k gas, about half the 200k mainnet stipend.\n- Dependency failure: a stopped Intake, a paused or blocklisting asset, or a withheld answer strands no funds. Open questions settle or expire, and refused payouts stay claimable to any wallet.\n- Handoff and front-running: a pending challenge's bond cannot be redirected, and a beneficiary can refuse a challenge by handoff at most once per day.\n- The full suite passes offline (174 passed, 8 fork tests skipped).\n\n**Known limits I did not re-report:** a beneficiary's self-challenge and a stranger's doomed application each occupy the project's single question slot for the fee alone. Both are documented as accepted design limits in `docs/history.md` and `ADAPTATION.md` and are pinned by existing regression tests.\n\n**Unreached:** the live Sepolia fork tests could not run here without an RPC, so the live Intake's `requests()` tuple shape and the 1M callback gas rest on the earlier fork run recorded in the README.","treeHash":null,"usage":{"cachedInputTokens":1011354,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":29207,"runtime":"claude","turns":26,"wallClockMs":548765}},{"artifacts":[],"attempt":1,"bundleHash":"875815581c91542c1028dafa681f0d9fcb17042fcce33342b089d81ad5b11b1f","device":"ee9fbaf2480d1034","findings":[{"description":"claimBond refuses only the zero address as destination. A creditor who passes the registry itself as `to` has their bondOwed zeroed while the tokens move from the registry to the registry, so the bond is no longer owed to anyone and no function can ever release it (the registry has no owner or sweep). This is self-inflicted and costs only the caller, like sending a token to a contract address by mistake, so it is not a defect in the agreed design; it is noted so the launch's documentation of 'to any wallet' is read as 'any wallet but the registry'. A cheap hardening, if wanted, is `if (to == address(this)) revert ZeroAddress();` or a dedicated error.","line":465,"path":"src/ProjectRegistry.sol","reproduction":"Fixture of test/RegistryTryTransferEdges.t.sol: list a project, challenge it with 5e18 bond, deliver a signed 'no' while the token returns false to the challenger (bondOwed[challenger] = 5e18, registry balance 5e18). Then, as the challenger, call claimBond(address(registry)). Expected (reading the NatSpec): either refused, or the bond reaches a wallet. Actual: the call succeeds, bondOwed[challenger] == 0, and the registry's balance is still 5e18 with no open question and nothing owed, permanently.","severity":"info","title":"claimBond(to) accepts the registry's own address and strands the claimed bond"}],"hash":"f6e2be3cd1c278bf9b380aa85c2efdcd714d4014479df86825082e14085590cd","nodeId":"3cb8ccf8-9019-4ef8-8459-3f8d67193a74","outcome":"completed","summary":"The task is complete. The findings file is excluded from git by the harness's own exclude rule, which is expected since the harness collects it from the working tree.\n\n**Outcome:** `forge build` and `forge test` pass. The suite now has 194 tests: 186 run offline and 8 fork tests skip without an RPC. I also ran the 8 fork tests against live Sepolia and mainnet through a public endpoint, and all passed.\n\n**What I added** (all under `test/`):\n\n- **`test/RegistryBondOwedInvariant.t.sol`**: invariant tests over random call sequences for the value the registry holds, with a token whose refusal to pay each wallet flips at random (by reverting or returning false). Applications, challenges, answers delivered with 200k gas, failures, expiries and claims interleave across 3 projects and 4 actors. Invariants: the registry holds exactly the open bonds plus what it owes, each wallet is owed and holds exactly its signed entitlement, the token is conserved, and no approval is left to the Intake. A deterministic path proves the campaign reaches every owed outcome. 128 runs at depth 48, zero reverts.\n- **`test/RegistryTryTransferEdges.t.sol`**: the registry's own transfer read in `_tryTransfer` judged on every return shape. No return data and over-long data count as paid. `false`, a non-boolean word, a one-byte return, an empty revert and a 4 KiB revert are owed and still settle within 200k gas. Also: an owed bond is settled once (replayed answer, late failure, expire, consumed request id all refused), survives relisting and later payouts, only the creditor claims, a failed claim keeps the debt, and a claim never touches an open bond.\n- **`test/ADVERSARIAL_COVERAGE.md`**: two rows describing the new files.\n\n**Live facts confirmed on Sepolia** at block 11,897,538: the Intake sells the question for 0.5 test IMD, the live Stacker's IMD and SIMD are the launch #1129 pair, and test run 3's registry has bond 5e18 and cooldown 3600, matching launch.json.\n\n**Finding reported** in `.imd-findings.json`, severity info only: `claimBond` accepts the registry's own address as destination, which zeroes the debt and strands the tokens with no owner to sweep them. It is self-inflicted and costs only the caller, so I did not treat it as a defect in the agreed design. I found no defect in the owed-bond fix itself. I did not change src, foundry.toml, launch.json or the README; the README's \"Sepolia test run 4\" row waits on the live address and is outside my write paths.","treeHash":"b4e7c5abb28557014f77990faeed0fa38652d9d9","usage":{"cachedInputTokens":1478435,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":43141,"runtime":"claude","turns":36,"wallClockMs":708434}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"52c98c0dc01791cd","findings":[{"citation":"resolved","description":"A listed project may hold only one open question, and anyone may challenge. The beneficiary (or any wallet it controls) can therefore watch the mempool for challengeForBeneficiary and file its own challenge first, with an innocuous reason. The outsider's transaction reverts AskOpen and pays nothing, but its reason never reaches the panel; the panel judges the beneficiary's question instead. On a signed yes the bond goes to p.beneficiary, i.e. back to the beneficiary itself, so each cycle costs it only the 0.5 IMD oracle fee plus gas, and it can repeat at every retry. HANDOFF_INTERVAL (lines 90-95) closes the handoff version of this race and its comment promises that a challenger who retries always gets a question filed; the self-challenge version remains open. The panel still reviews the code against all rules, so a clearly non-compliant project is not protected, but the challenger's specific evidence is suppressed and a borderline project can keep buying reviews on its own terms. Possible mitigations that keep the agreed design: pay a defended bond to the challenger only when challenger != beneficiary (otherwise burn it or keep it owed to nobody), or impose a per-project minimum interval between challenges from the beneficiary's wallet.","line":294,"path":"src/ProjectRegistry.sol","reproduction":"State: project listed, beneficiary B, cooldown passed. Mempool: C sends challengeForBeneficiary(project, 'It credits outside trades.', B). B front-runs with challengeForBeneficiary(project, 'Fine.', B): B pays 0.5 fee + 5 bond. C's tx reverts AskOpen. Intake answers yes to B's question: onOracleResult pays the 5 IMD bond to p.beneficiary == B; project stays listed; B is out only 0.5 IMD. Repeat for every retry by C. Expected per the HANDOFF_INTERVAL comment: a retrying challenger always gets a question filed. Actual: C never gets one. test/scratch/SelfChallengeFrontRun.t.sol runs three cycles against the mock Intake and asserts B's net cost is exactly 3 * 0.5e18 while C reverts each time.","severity":"low","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"Beneficiary can refuse every outside challenge by front-running it with a self-challenge, at the oracle fee only"},{"citation":"resolved","description":"applyListing is open to anyone and takes the beneficiary and rate from the caller. While its question is open (until the panel answers, or a day if the writer never calls back), the project owner's own application reverts AskOpen. An attacker who names itself as beneficiary, or a rate the code does not match, gets a signed no from the panel a few minutes later and can immediately apply again; there is no cooldown after a rejection and the only cost is the 0.5 IMD fee per cycle. Nothing is lost on chain (the owner's call reverts before paying), but a listing can be held back indefinitely for 0.5 IMD per panel round, and each round spends panel capacity. A short re-application cooldown per project after a signed rejection, or restricting re-application after a rejection to the beneficiary the project's owner names, would bound this without an owner role.","line":252,"path":"src/ProjectRegistry.sol","reproduction":"State: project P (a contract) not listed, no open question. Attacker A calls applyListing(P, 'x', 'https://a.example/x', 25, A) paying 0.5 IMD. Owner O then calls applyListing(P, 'PLEA', 'https://github.com/khaed1/plea', 50, O): reverts AskOpen. Intake delivers a signed no (beneficiary rule fails): Rejected, slot cleared. A calls applyListing again in the same block as the answer. O's next attempt reverts AskOpen again. Expected: the owner can get its application filed within bounded time; actual: only when A stops paying 0.5 IMD per round.","severity":"low","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"Anyone can occupy a project's application slot with a doomed application and delay its real listing"},{"citation":"resolved","description":"Read in full: src/ProjectRegistry.sol (679 lines, the one contract launch.json deploys), src/oracle/OracleAttestation.sol (library and consumer base), src/Stacker.sol (not deployed by this manifest; only named in questions), test/mocks/MockIntake.sol, test/RegistryBondOwed.t.sol, test/RegistryCallbackGas.t.sol, test/Deployment.t.sol, test/RegistrySepoliaFork.t.sol, test/ProjectRegistry.t.sol (fixture), parts of test/RegistryAdversarial.t.sol and test/RegistryHandoffInterval.t.sol, docs/panel-rules-v2.md, launch.json, the protected rehearsal test and the four pinned references. Not reachable: the live Intake v2 (0xa43e...de82), the Sepolia test IMD and the live Stacker, since this worker has no RPC; the 8 fork tests were skipped and the Intake's requests() tuple shape, callback gas (1M on Sepolia) and the body's acceptance by the paid door rest on the fork test and test run 3's live history. Checks run: forge build (solc 0.8.26, cancun, 10,000 runs) and forge test: 172 passed, 0 failed, 8 skipped. Measured with a scratch test: apply question 1,016 and challenge question 1,113 chars (limit 2,000); longest definition (feeGuard) 472 chars (limit 512), 8 definitions as docs/panel-rules-v2.md lists; body 3,694 bytes; runtime 22,736 bytes (limit 24,576), no DELEGATECALL/CALLCODE/SELFDESTRUCT (Deployment.t.sol's scan passes). Selectors: onOracleResult 0x510379c7, onOracleFailure 0xa7980e31. Manifest: only kind/contracts/notes, one contract, 7 string arguments in declaration order matching the brief, notes 1,580 chars. Traced and found guarded: callback sender and request ownership (NotIntake, UnknownRequest), one-time consumption of a.requestId, issuedAt against askedAt with the 300 s tolerance, panel 15/11 with agreed >= quorum, chain 1 filing, checks-effects-interactions on every bond payment with nonReentrant on every state-changing entry except setBeneficiary (which only moves a wallet pointer and is blocked while a question is open), bond accounting (held bonds + bondOwed equal the registry's balance in the suite's invariant), expire only after a day or after the Intake marked the request completed, the once-per-day handoff, and the empty-chain constructor. Trust assumptions, not defects: the Intake's writer pairs answers to requests and can withhold one (a withheld or late 'no' leaves a project listed until re-challenged); the oracle signer is one hot key; ACTION, panel size and quorum are constants with no owner, so an oracle action version change or a different fee asset needs a redeployed registry, as the brief accepts.","line":53,"path":"src/ProjectRegistry.sol","reproduction":null,"severity":"info","snippet":"contract ProjectRegistry is OracleAttestationConsumer, ReentrancyGuard {","title":"Coverage: contracts read and checks run"}],"hash":"f969dbebf2d8d34ea4eb74c8a108ddee9dc8a4db57807c2fd04305df8ea4fb36","nodeId":"8067c88f-4b54-4f94-9927-8807d18fc8d4","outcome":"completed","summary":"The review is complete and the findings file is written.\n\n**Outcome:** no critical, high or medium defect in the registry as it arrived. The file `.imd-findings.json` holds two low findings and one info entry with the coverage statement.\n\n**Findings**\n- **Low, self-challenge front-run (line 294).** A listed project's beneficiary can watch the mempool and file its own challenge ahead of any outsider's. The outsider's call reverts with `AskOpen`, and the beneficiary's bond comes back to itself on a signed yes, so each cycle costs it only the 0.5 IMD fee. The handoff interval's comment promises a retrying challenger always gets a question filed, and this route breaks that promise. A scratch test runs three cycles and confirms the net cost is exactly three fees.\n- **Low, application-slot griefing (line 252).** Anyone can hold a project's application slot with a doomed application naming themselves as beneficiary. The owner's own application reverts until the panel rejects, and there is no cooldown after a rejection, so the attacker can repeat at 0.5 IMD per round.\n- **Info, coverage.** Lists what was read, what could not be reached, and what was measured.\n\n**What was checked and held**\n- Build and the offline suite pass with 172 tests, 8 fork tests skipped for lack of an RPC.\n- Callback access, request ownership, one-time consumption, issuedAt tolerance, panel 15 of 11, bond accounting and checks-effects-interactions all trace through guards as the brief describes.\n- Generated text stays within the oracle's limits. The longest rule is 472 of 512 characters and the questions are about 1,100 of 2,000.\n- Runtime is 22,736 bytes with no forbidden opcodes, and the manifest matches the brief's seven constructor arguments in order.\n\n**Not reachable:** the live Intake v2, test IMD and Stacker on Sepolia. The Intake's getter shape, the 1M callback gas and the paid door's acceptance of the body rest on the fork test and test run 3's history rather than on anything I could run here.\n\nNo tracked file was changed. The two scratch tests live under test/scratch and are not kept.","treeHash":null,"usage":{"cachedInputTokens":1105721,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":35332,"runtime":"claude","turns":30,"wallClockMs":548066}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f47f953f8e35921e","findings":[{"citation":"resolved","description":"Access x economics x asymmetry seam. applyListing and _challenge both refuse while p.ask != Ask.None, and the slot is taken by whoever lands first; the only cost of taking it is the live oracle fee (0.5 IMD), because a challenge bond comes back on a signed yes (to p.beneficiary, which is the same owner when the challenger is the beneficiary's other wallet) and an application posts no bond at all. A beneficiary that watches the mempool therefore has a second dodge besides the handoff that HANDOFF_INTERVAL closed: front-run every hostile challengeForBeneficiary(project, reason, B) with challengeForBeneficiary(project, \"all fine\", B) from another wallet. The hostile call reverts with AskOpen, the bland self-challenge is answered minutes later, the bond returns to B, and the next hostile attempt is front-run again. The hostile challenger's reason never reaches the panel; the panel still judges every rule, so an honest 11-of-15 panel can still delist on the self-challenge, which bounds the harm, but the challenger has no way to put their evidence in front of the panel. Symmetrically, anyone can keep an unlisted project from ever being listed by front-running the owner's applyListing with an application naming a wrong rate or beneficiary (rejected by the panel, 0.5 IMD each), round after round. No funds are lost; the guarantee that a challenge or application 'always gets a question filed' (the comment at HANDOFF_INTERVAL) holds only against handoffs, not against slot occupancy. A minimal mitigation that keeps the design: let a challenge be filed while another challenge is open when the new challenger pays its own fee and bond and the questions are settled in order; or, cheaper, refuse a challenge from a wallet that is the project's current beneficiary and make a defended self-challenge forfeit the bond rather than return it (does not cover a second wallet). This is a design trade-off for the author to decide; reported so it is a known limitation before mainnet.","line":294,"path":"src/ProjectRegistry.sol","reproduction":"Offline, with the repository's MockIntake and MintableIMD (test/mocks/MockIntake.sol). State: owner applies for project P with beneficiary B, panel signs yes, warp 1 hour past challengeOpenAt. Loop 5 times: (1) vm.prank(secondWallet); reg.challengeForBeneficiary(P, \"all fine\", B) succeeds; (2) vm.prank(honest); reg.challengeForBeneficiary(P, \"credits the owner outside trades\", B) reverts AskOpen; (3) deliver a signed yes with 200k gas: P stays listed, bond 5e18 paid to B. After 5 rounds the beneficiary's two wallets together are down exactly 5 * 0.5e18 and the honest challenger has never had a question filed. Expected: a challenger naming the wallet in force gets a question filed (the property the handoff interval was added for); actual: AskOpen every round. Second sequence: unlisted P; loop 5 times: vm.prank(griefer); reg.applyListing(P, \"P\", \"https://x.example/p\", 25, griefer) succeeds; vm.prank(owner); reg.applyListing(P, \"P\", \"https://x.example/p\", 50, B) reverts AskOpen; deliver a signed no. Griefer is down 5 * 0.5e18; P never listed. Both sequences were run as test/scratch/SlotGriefing.t.sol and pass as described.","severity":"low","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"One open question per project is first-come: a beneficiary's second wallet or any griefer can keep a third party's challenge or application out for 0.5 IMD per panel round"},{"citation":"resolved","description":"The brief asks for no owner and the code honours it: intake, oracleAsset and oracleSigner are constructor-only (immutable or set once by OracleAttestationConsumer), and ACTION is a constant. The supplied oracle-consumer reference states the opposite requirement for consumers ('Every one of these is constructor input and owner-settable, never a constant ... A new action version (oracle-2) or a moved price must not need a redeploy'). The task rules win, so this is not a defect, but the consequence should be stated as a trust assumption for mainnet: if IdentityMD rotates the signer key, or stops selling oracle-1 (priceOf returns 0 -> OracleUnavailable), no challenge can ever settle (onOracleResult reverts BadSignature, or cannot be asked at all), so every project listed at that moment stays listed and keeps earning points with no way to delist it, and no new project can be listed; the only recourse is a new registry and an off-chain switch of the points indexer. The registry's own docs say it can be replaced without touching the Stacker, which is the intended answer; it is recorded here so the judge and author see the dependency explicitly.","line":81,"path":"src/ProjectRegistry.sol","reproduction":"State: project P listed. Change the oracle signer off chain to a new key K2 (the registry's oracleSigner stays 0x5598...2982). challengeForBeneficiary(P, reason, B) files and pays fee + bond; the writer delivers an attestation signed by K2: onOracleResult reverts BadSignature (OracleAttestation.sol:188), the Intake records the callback as not delivered, expire(P) after a day returns the bond. Expected per the oracle-consumer reference: an owner rotates the signer and the next challenge settles; actual: no path exists in the contract, P stays listed indefinitely. Equivalently, with intake.priceOf(ACTION, asset) == 0, every applyListing and challenge reverts OracleUnavailable (ProjectRegistry.sol:319).","severity":"info","snippet":"    bytes32 public constant ACTION = \"oracle.request@oracle-1\";","title":"Trust assumption: the Intake, action id, asset and oracle signer are immutable, so a signer rotation or the retirement of oracle-1 freezes the registry with every listed project listed for good"}],"hash":"ff0b4d1e3a823e8d95f20cfb5fc7932511a68d240e724fc6f57c2b2d4d6859dc","nodeId":"e1963836-8b79-4b6e-a683-f62968070032","outcome":"completed","summary":"The review is complete and recorded in `.imd-findings.json`. No source, test, or configuration file was changed. The scratch reproduction was removed.\n\n**Outcome of the permissions audit (Access Control, Trust Gap, Asymmetry) on the ProjectRegistry**\n\nThe permission model holds. Every state-changing entry point was traced for its guard, state writes and failure paths, and the full offline suite passes.\n\n| Check | Result |\n| --- | --- |\n| Offline tests | 174 passed, 0 failed, 8 fork tests skipped |\n| Manifest | matches the brief exactly, notes 1,580 chars |\n\n**Findings recorded**\n\n- **Low, open-question slot griefing.** One question per project is first come, first served, and holding it costs only the 0.5 IMD fee. The beneficiary's second wallet can front-run every hostile challenge with a bland self-challenge whose bond comes back on a yes, so the hostile challenger's reason never reaches the panel. Anyone can likewise keep an unlisted project out by front-running the owner's application with a bogus one. I reproduced both sequences offline over five rounds. No funds are lost and an honest panel can still delist on a self-challenge, so the severity is low and the mitigation is a design decision for the author.\n- **Info, immutable oracle wiring as a trust assumption.** The brief asks for no owner, and the code honours it, but the oracle-consumer reference says the signer, action id and intake must be owner-settable. If the signer rotates or oracle-1 is retired, every listed project stays listed for good and nothing new can be listed. Recorded as a documented dependency, not a defect.\n\n**What held under review**\n\n- The callback accepts only the Intake, only its own open request, each attestation once, signed for this contract after the ask, from a 15-of-11 panel. The yes and no branches write mirrored state.\n- The failure hook and expire clear symmetrically and never move value beyond returning the challenger's own bond.\n- The handoff rule blocks any change of the bond destination while a question is open, and the legacy challenge entry point is closed for good after the first handoff.\n- Bond accounting conserves: each close path pays or owes exactly one bond, and claimBond zeroes before paying.\n- The launch manifest, constructor argument order and the Deployment test agree with the brief.\n\n**Coverage.** All nine listed entry points have a row, plus two invariant rows. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":877036,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":32592,"runtime":"claude","turns":27,"wallClockMs":507650}}],"verification":[{"checks":[{"durationMs":9813,"exitCode":0,"name":"build","output":"Compiling 81 files with Solc 0.8.26\nSolc 0.8.26 finished in 9.71s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n  --> test/RegistryAuditLows.t.sol:27:13:\n   |\n27 |             uint256 before = imd.balanceOf(beneficiary);\n   |             ^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> test/RegistryAuditLows.t.sol:52:9:\n   |\n52 |         uint256 before = imd.balanceOf(beneficiary);\n   |         ^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":5227,"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 368.89µs (39.96µs CPU time)\n\nRan 3 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 463.39µs (60.05µ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 613.72µs (481.60µ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 4.05ms (157.04µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910410)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637844)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.72ms (6.01ms 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 5.88ms (218.15µ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 6.53ms (260.42µ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 6.88ms (271.61µ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 7.62ms (259.46µ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.08ms (2.47ms 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 8.77ms (7.70ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 318090, ~: 55507)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 481665, ~: 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 42.87ms (53.66ms 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 98.35ms (9.82ms 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 2635\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 128.96ms (136.71ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392336, ~: 392130)\nLogs:\n  Bound result 904147394810362800967496\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367408, ~: 368777)\nLogs:\n  Bound result 490546307402109721914231\n  Bound result 199363340265927026884898\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430111, ~: 430194)\nLogs:\n  Bound result 299240939250709491483535\n  Bound result 490546307402109721914231\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56037)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131214)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9371828)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378414)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370521)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383268)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508017)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617727)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374387)\n[PASS] test_credit_totalsAndEvent() (gas: 493973)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80024)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531558)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397349)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791551)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053516)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 163.36ms (163.90ms 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: 24599)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8199369)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4217889)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 467.72ms (23.10ms CPU time)\n\nRan 2 tests for test/RegistryAuditLows.t.sol:RegistryAuditLowsTest\n[PASS] test_doomedApplicationHoldsTheSlotOnlyUntilAnsweredAndNeverLists() (gas: 12053826)\n[PASS] test_selfChallengeCycleCostsOnlyTheFeeAndNeverRenewsImmunity() (gas: 24037276)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 590.56ms (19.13ms CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3444804, ~: 3410214)\nLogs:\n  Bound result 9\n  Bound result 14\n  Bound result 28\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6449287, ~: 6392177)\nLogs:\n  Bound result 93\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 591.59ms (1.22s CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976810, ~: 976754)\nLogs:\n  Bound result 99999000000000000001330\n  Bound result 23802\n  Bound result 5565\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935244, ~: 2930169)\nLogs:\n  Bound result 21955\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598484)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117568)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937399)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738536)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925677)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 591.61ms (1.16s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6227563, ~: 6227692)\nLogs:\n  Bound result 24576\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3160008, ~: 3157969)\nLogs:\n  Bound result 13\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 594.40ms (987.78ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229789, ~: 229562)\nLogs:\n  Bound result 968764717249594219981856\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1569056, ~: 1370533)\nLogs:\n  Bound result 7\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388750, ~: 388683)\nLogs:\n  Bound result 748918706903203058264491\n  Bound result 567874811092825951133726\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 741102, ~: 761728)\nLogs:\n  Bound result 199806638031\n  Bound result 27775522842455598853112\n  Bound result 69823491201102384067616\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682777, ~: 688814)\nLogs:\n  Bound result 55474439646537649664702\n  Bound result 84706219466375450789924\n  Bound result 58419576546330779422746\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 490316, ~: 510483)\nLogs:\n  Bound result 451908802115343570\n  Bound result 360812971961628583\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615593)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365161)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591023)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662705)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238830)\n[PASS] test_credit_oneWei() (gas: 361738)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468463)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326667)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 736980)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91064)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522294)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 594.25ms (1.61s CPU time)\n\nRan 4 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerIsThisBuild() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 4 skipped; finished in 601.59ms (128.27µs CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8877207, ~: 8880080)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6007030, ~: 6012600)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945087, ~: 6945306)\nLogs:\n  Bound result 32\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084058, ~: 3083765)\nLogs:\n  Bound result 28591947\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 601.62ms (1.76s 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 11155111\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6327099, ~: 6334177)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4681349, ~: 3278654)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121972, ~: 6121713)\nLogs:\n  Bound result 1\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 601.73ms (2.37s 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     | 439   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 430   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 378   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 381   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 420   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 64953105881319\n  Bound result 2228\n  Bound result 2827\n  Bound result 4178\n  Bound result 75\n  Bound result 772302552793575680817388\n  Bound result 12345\n  Bound result 10\n  Bound result 8091\n  Bound result 301\n  Bound result 4\n  Bound result 10\n  Bound result 13649\n  Bound result 4711\n  Bound result 242\n  Bound result 755\n  Bound result 6489\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 660.74ms (654.03ms 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          | 267   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 278   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 244   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 270   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 240   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 233   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 239   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 26\n  Bound result 2000\n  Bound result 91\n  Bound result 14785\n  Bound result 123\n  Bound result 60595\n  Bound result 121268\n  Bound result 26\n  Bound result 59\n  Bound result 7168\n  Bound result 100\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 717.81ms (719.03ms CPU time)\n\nRan 2 tests for test/StackerInvariantExtended.t.sol:StackerInvariantExtendedTest\n[PASS]\nStackerInvariantExtendedTest invariants:\n[PASS] invariant_imdSupplyConservation\n[PASS] invariant_pauseAndOwnershipStateMachine\n[PASS] invariant_stackerHoldsNothing\n[PASS] invariant_stackerTotals\n[PASS] invariant_vaultConservation\n[PASS] invariant_vaultSolvent\n StackerInvariantExtendedTest invariants (runs: 128, calls: 6144, reverts: 0)\n\n╭-----------------+----------------+-------+---------+----------╮\n| Contract        | Selector       | Calls | Reverts | Discards |\n+===============================================================+\n| ExtendedHandler | advance        | 451   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 430   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 465   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 478   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 484   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 480   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 516   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 458   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 426   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 468   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 497   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 482   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 509   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 18446744073709551615\n  Bound result 5846\n  Bound result 1535678930233736911023\n  Bound result 659918\n  Bound result 77000000000000000000\n  Bound result 3290396324\n  Bound result 14294\n  Bound result 49999999999999999999981\n  Bound result 1\n  Bound result 8\n  Bound result 2267\n  Bound result 31792\n  Bound result 9923000000000000000000\n  Bound result 3972652732062824923137\n  Bound result 1\n  Bound result 512\n  Bound result 8714712340367612035970\n  Bound result 3688\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540137)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.02s (4.02s 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                  | 1753  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1827  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1833  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1782  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1830  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1867  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1767  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1892  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1833  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 95865\n  Bound result 337080322571173828\n  Bound result 3249\n  Bound result 160542\n  Bound result 1\n  Bound result 31\n  Bound result 11013\n  Bound result 1244041349058519065\n  Bound result 31\n  Bound result 36\n  Bound result 31\n  Bound result 12\n  Bound result 53\n  Bound result 32\n  Bound result 13647\n  Bound result 128\n  Bound result 62\n  Bound result 88\n  Bound result 1775646942255134597\n  Bound result 211382882698268769\n  Bound result 4\n  Bound result 26\n  Bound result 90\n  Bound result 3600\n  Bound result 32\n  Bound result 11539\n  Bound result 5000\n  Bound result 4\n  Bound result 1\n  Bound result 4\n  Bound result 12428\n  Bound result 1327516735\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.12s (5.13s CPU time)\n\nRan 28 test suites in 5.13s (16.25s CPU time): 174 tests passed, 0 failed, 8 skipped (182 total tests)\n","passed":true},{"durationMs":77,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ProjectRegistry.applyListing(address,string,string,uint16,address)\",\"ProjectRegistry.challenge(address,string)\",\"ProjectRegistry.challengeForBeneficiary(address,string,address)\",\"ProjectRegistry.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\":97,\"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\":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\":18,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":679,\"src/Stacker.sol\":98,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":102,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditLows.t.sol\":94,\"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\":97,\"test/Stacker.t.sol\":420,\"test/StackerEdges.t.sol\":390,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"55a7273cff6062e03547ad504d26456ef01b99ff29379209e4889572b8b6f037","verifiedTreeHash":"ad6be9b15aa59ba9e952d634f07943a25b5fbbee","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":10217,"exitCode":0,"name":"build","output":"Compiling 81 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.09s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n  --> test/RegistryAuditLows.t.sol:27:13:\n   |\n27 |             uint256 before = imd.balanceOf(beneficiary);\n   |             ^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> test/RegistryAuditLows.t.sol:52:9:\n   |\n52 |         uint256 before = imd.balanceOf(beneficiary);\n   |         ^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":5249,"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 485.95µs (43.45µs CPU time)\n\nRan 3 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 734.00µs (81.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 1.18ms (981.52µs CPU time)\n\nRan 4 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerIsThisBuild() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 4 skipped; finished in 1.46ms (102.88µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156249)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.52ms (233.31µ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.34ms (350.16µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910410)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637844)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.24ms (1.40ms 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.98ms (201.05µ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 3.10ms (974.02µ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 3.12ms (185.37µ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 7.93ms (183.44µs 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 9.56ms (7.94ms CPU time)\n\nRan 2 tests for test/RegistryAuditLows.t.sol:RegistryAuditLowsTest\n[PASS] test_doomedApplicationHoldsTheSlotOnlyUntilAnsweredAndNeverLists() (gas: 12053826)\n[PASS] test_selfChallengeCycleCostsOnlyTheFeeAndNeverRenewsImmunity() (gas: 24037276)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.35ms (9.79ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 246315, ~: 55470)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 449102, ~: 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 43.14ms (59.37ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950305, ~: 2950123)\nLogs:\n  Bound result 15842456744745170664\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 146.46ms (159.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     | 411   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 397   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 415   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 418   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 407   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 13\n  Bound result 3\n  Bound result 7\n  Bound result 15489\n  Bound result 1486\n  Bound result 9\n  Bound result 380008180178997147725\n  Bound result 7936\n  Bound result 558932880698045927389516\n  Bound result 25\n  Bound result 9\n  Bound result 1359182279\n  Bound result 9\n  Bound result 3600\n  Bound result 4\n  Bound result 336172340346280866215\n  Bound result 6241\n  Bound result 500000000000000000000000\n  Bound result 31\n  Bound result 3\n  Bound result 6\n  Bound result 999995000000000000000000\n  Bound result 999999999999999999976\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 658.65ms (655.28ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976797, ~: 976756)\nLogs:\n  Bound result 99999000000000000002585\n  Bound result 564\n  Bound result 13237\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935397, ~: 2941029)\nLogs:\n  Bound result 4628219554432736427393\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598484)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117568)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937399)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738536)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925677)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 673.66ms (1.34s 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 676.77ms (4.04ms 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: 26063)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8199369)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4217889)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 676.87ms (38.24ms CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3437629, ~: 3407026)\nLogs:\n  Bound result 3\n  Bound result 15\n  Bound result 28\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6447949, ~: 6392173)\nLogs:\n  Bound result 240\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 676.81ms (1.33s CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8877631, ~: 8880080)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6007853, ~: 6012600)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945109, ~: 6945306)\nLogs:\n  Bound result 72\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084084, ~: 3083765)\nLogs:\n  Bound result 21293712\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 676.81ms (1.83s CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392263, ~: 392106)\nLogs:\n  Bound result 90000000000000000000\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367551, ~: 368813)\nLogs:\n  Bound result 2771641\n  Bound result 2632763\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430109, ~: 430206)\nLogs:\n  Bound result 150270201939519842952773\n  Bound result 2771641\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56037)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131214)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9371828)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378414)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370521)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383268)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508017)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617727)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374387)\n[PASS] test_credit_totalsAndEvent() (gas: 493973)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80024)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531558)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397349)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791551)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053516)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 676.87ms (269.97ms CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243020, ~: 6242972)\nLogs:\n  Bound result 92\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6328689, ~: 6334710)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4783173, ~: 6257246)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121976, ~: 6121713)\nLogs:\n  Bound result 9\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 676.05ms (2.38s CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229768, ~: 229550)\nLogs:\n  Bound result 620630339223521533775169\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1518047, ~: 1369843)\nLogs:\n  Bound result 7\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388717, ~: 388671)\nLogs:\n  Bound result 733692783606660476918187\n  Bound result 629800186198322527998321\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 740290, ~: 761764)\nLogs:\n  Bound result 2000000000000000000\n  Bound result 16384\n  Bound result 7000000000000000000\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682668, ~: 688826)\nLogs:\n  Bound result 2000000000000000000\n  Bound result 16384\n  Bound result 7000000000000000000\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 488327, ~: 510332)\nLogs:\n  Bound result 9793398785476752145\n  Bound result 340\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615593)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365161)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591023)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662705)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238830)\n[PASS] test_credit_oneWei() (gas: 361738)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468463)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326667)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 736980)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91064)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522294)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 676.92ms (2.82s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6227556, ~: 6227692)\nLogs:\n  Bound result 82865\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3159697, ~: 3157287)\nLogs:\n  Bound result 65\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 676.94ms (1.35s 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            | 266   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 249   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 250   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 255   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 250   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 249   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 266   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 263   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 75\n  Bound result 25\n  Bound result 19200\n  Bound result 52\n  Bound result 86\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 846.37ms (847.92ms 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        | 509   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 459   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 541   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 464   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 500   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 473   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 442   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 463   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 454   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 466   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 456   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 450   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 467   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 3274\n  Bound result 4523857024733440252827\n  Bound result 38552989400811\n  Bound result 2490\n  Bound result 8759665397185837637\n  Bound result 6000000000000000000\n  Bound result 17554\n  Bound result 5000000000000000000000\n  Bound result 317845916\n  Bound result 10\n  Bound result 1286863523773954249005\n  Bound result 8\n  Bound result 10\n  Bound result 100\n  Bound result 2919842136122\n  Bound result 50000000000000000000000\n  Bound result 96\n  Bound result 2681\n  Bound result 5617863474595507103535414\n  Bound result 49994999999999999999981\n  Bound result 22663436894503763079492\n  Bound result 9500000000000000000\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540137)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.14s (4.14s 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                  | 1813  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1873  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1822  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1787  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1762  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1884  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1757  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1871  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1815  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2261864592\n  Bound result 264337553929869076\n  Bound result 317881\n  Bound result 86400\n  Bound result 7\n  Bound result 91\n  Bound result 264337553929869076\n  Bound result 14248\n  Bound result 145\n  Bound result 2\n  Bound result 27199\n  Bound result 1\n  Bound result 91\n  Bound result 84\n  Bound result 1707\n  Bound result 2\n  Bound result 6613\n  Bound result 5\n  Bound result 2594760\n  Bound result 3\n  Bound result 12345\n  Bound result 27\n  Bound result 36\n  Bound result 82544\n  Bound result 11\n  Bound result 1\n  Bound result 64\n  Bound result 24576\n  Bound result 36\n  Bound result 107354814\n  Bound result 12761\n  Bound result 6191543\n  Bound result 36\n  Bound result 2350\n  Bound result 14\n  Bound result 5\n  Bound result 1\n  Bound result 1793156749778634\n  Bound result 56\n  Bound result 85\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.11s (5.13s CPU time)\n\nRan 28 test suites in 5.11s (17.08s CPU time): 174 tests passed, 0 failed, 8 skipped (182 total tests)\n","passed":true},{"durationMs":101,"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\":97,\"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\":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\":18,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":679,\"src/Stacker.sol\":98,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":102,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditLows.t.sol\":94,\"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\":97,\"test/Stacker.t.sol\":420,\"test/StackerEdges.t.sol\":390,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"7e2c125a4446d1cfd97c316e6c5c9af2f0bdabfa6c3f992db52cf5ba515a59dd","verifiedTreeHash":"957e77f9797d1aee4490e349da3ff54a93958dde","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":10797,"exitCode":0,"name":"build","output":"Compiling 83 files with Solc 0.8.26\nSolc 0.8.26 finished in 10.70s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n  --> test/RegistryAuditLows.t.sol:27:13:\n   |\n27 |             uint256 before = imd.balanceOf(beneficiary);\n   |             ^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> test/RegistryAuditLows.t.sol:52:9:\n   |\n52 |         uint256 before = imd.balanceOf(beneficiary);\n   |         ^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":5164,"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 440.95µs (49.31µs CPU time)\n\nRan 4 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerIsThisBuild() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 4 skipped; finished in 545.23µs (62.13µs CPU time)\n\nRan 3 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 549.24µs (58.96µ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 729.04µs (603.08µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910410)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637844)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.47ms (1.74ms 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.68ms (255.12µ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.34ms (223.56µ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.56ms (908.23µ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.82ms (200.64µ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 3.85ms (275.38µ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 10.08ms (345.20µs CPU time)\n\nRan 2 tests for test/RegistryAuditLows.t.sol:RegistryAuditLowsTest\n[PASS] test_doomedApplicationHoldsTheSlotOnlyUntilAnsweredAndNeverLists() (gas: 12053826)\n[PASS] test_selfChallengeCycleCostsOnlyTheFeeAndNeverRenewsImmunity() (gas: 24037276)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 16.20ms (14.59ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 282170, ~: 55531)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 362259, ~: 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 47.60ms (67.82ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 2950293, ~: 2950111)\nLogs:\n  Bound result 3491365\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 92.31ms (105.27ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 392320, ~: 392118)\nLogs:\n  Bound result 19503\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367804, ~: 368851)\nLogs:\n  Bound result 755858587356429228410074\n  Bound result 74069840\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430126, ~: 430194)\nLogs:\n  Bound result 74069840\n  Bound result 255858587356429228410074\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56037)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131214)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9371828)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378414)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370521)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383268)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508017)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617727)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374387)\n[PASS] test_credit_totalsAndEvent() (gas: 493973)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80024)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531558)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397349)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791551)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053516)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 136.97ms (146.84ms 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     | 414   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 429   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 388   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 384   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 433   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2957397979\n  Bound result 328\n  Bound result 2\n  Bound result 64\n  Bound result 636103799587065419122\n  Bound result 1855\n  Bound result 3\n  Bound result 8\n  Bound result 3500914324\n  Bound result 66\n  Bound result 3\n  Bound result 999990000000000000000000\n  Bound result 500000000000000000000000\n  Bound result 10\n  Bound result 4\n  Bound result 10\n  Bound result 3\n  Bound result 908843030870970167319\n  Bound result 999999999999999999999997\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 535.20ms (533.49ms 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 659.98ms (4.45ms CPU time)\n\nRan 10 tests for test/RegistryTryTransferEdges.t.sol:RegistryTryTransferEdgesTest\n[PASS] testFuzz_owedSumsAndClaimsOnce(uint8) (runs: 64, μ: 11180936, ~: 8938359)\nLogs:\n  Bound result 2\n\n[PASS] test_claimLeavesOpenBondAlone() (gas: 11875616)\n[PASS] test_claimRevertsWithoutLosingTheDebt() (gas: 6228323)\n[PASS] test_onlyTheCreditorClaims() (gas: 6215534)\n[PASS] test_owedBondIsSettledOnce() (gas: 8975559)\n[PASS] test_owedBondSurvivesRelistingAndLaterPayouts() (gas: 11926828)\n[PASS] test_payingShapes_bondPaidAtOnce() (gas: 17885836)\n[PASS] test_refusalLiftedBeforeAnswer_paysAtOnce() (gas: 6005530)\n[PASS] test_refusingShapes_bondOwedAndQuestionSettles() (gas: 30220410)\n[PASS] test_refusingShapes_defendedBondOwedToBeneficiary() (gas: 26725342)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 660.02ms (254.51ms CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 8876857, ~: 8873685)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6006352, ~: 6000202)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 6945134, ~: 6945306)\nLogs:\n  Bound result 81\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3084084, ~: 3083765)\nLogs:\n  Bound result 17957\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 660.01ms (1.22s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6227540, ~: 6227692)\nLogs:\n  Bound result 85098\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3159972, ~: 3157969)\nLogs:\n  Bound result 2298\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 705.99ms (1.23s 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: 24599)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8199369)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4217889)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 706.11ms (28.75ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 229764, ~: 229550)\nLogs:\n  Bound result 7\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1512020, ~: 1162432)\nLogs:\n  Bound result 5\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388733, ~: 388695)\nLogs:\n  Bound result 671884796204794680920805\n  Bound result 507592190656477788954829\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 741867, ~: 761682)\nLogs:\n  Bound result 75\n  Bound result 25000000000000000000000\n  Bound result 768\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682451, ~: 688778)\nLogs:\n  Bound result 75\n  Bound result 25000000000000000000000\n  Bound result 768\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 490034, ~: 510483)\nLogs:\n  Bound result 8326985552990544188\n  Bound result 796204794680920805\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615593)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365161)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591023)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662705)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238830)\n[PASS] test_credit_oneWei() (gas: 361738)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468463)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326667)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 736980)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91064)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522294)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 706.16ms (2.55s 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 706.25ms (8.62ms CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6243022, ~: 6242972)\nLogs:\n  Bound result 138799123152865530\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6326917, ~: 6334177)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4750250, ~: 3278654)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6121953, ~: 6121713)\nLogs:\n  Bound result 3\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 706.38ms (2.10s CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976770, ~: 976749)\nLogs:\n  Bound result 99999000000000000061248\n  Bound result 206395465924\n  Bound result 1000889102421743\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935293, ~: 2930169)\nLogs:\n  Bound result 1056258280444582622\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598484)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117568)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937399)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738536)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925677)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 706.37ms (1.41s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3445139, ~: 3410729)\nLogs:\n  Bound result 12\n  Bound result 106\n  Bound result 50\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6447519, ~: 6394923)\nLogs:\n  Bound result 1\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 706.41ms (1.36s 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            | 279   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 275   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 240   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 245   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 230   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 240   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 250   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 289   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6400\n  Bound result 24576\n  Bound result 12800\n  Bound result 30\n  Bound result 7060\n  Bound result 88\n  Bound result 11567\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 756.97ms (759.13ms CPU time)\n\nRan 2 tests for test/RegistryBondOwedInvariant.t.sol:RegistryBondOwedInvariantTest\n[PASS]\nRegistryBondOwedInvariantTest invariants:\n[PASS] invariant_eachWalletOwedAndPaidExactly\n[PASS] invariant_holdsOpenBondsPlusOwed\n[PASS] invariant_tokenConserved\n RegistryBondOwedInvariantTest invariants (runs: 128, calls: 6144, reverts: 0)\n\n╭-----------------+--------------+-------+---------+----------╮\n| Contract        | Selector     | Calls | Reverts | Discards |\n+=============================================================+\n| BondOwedHandler | answer       | 787   | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| BondOwedHandler | applyFor     | 808   | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| BondOwedHandler | challengeFor | 735   | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| BondOwedHandler | claim        | 766   | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| BondOwedHandler | expireFor    | 763   | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| BondOwedHandler | failFor      | 725   | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| BondOwedHandler | passTime     | 741   | 0       | 0        |\n|-----------------+--------------+-------+---------+----------|\n| BondOwedHandler | setRefusal   | 819   | 0       | 0        |\n╰-----------------+--------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 135761\n  Bound result 27\n  Bound result 27200\n  Bound result 164816\n  Bound result 80\n  Bound result 26\n  Bound result 4781\n  Bound result 8\n  Bound result 0\n  Bound result 12345\n  Bound result 28\n  Bound result 5609\n\n[PASS] test_handlerReachesEveryOwedOutcome() (gas: 26951179)\nLogs:\n  Bound result 50\n  Bound result 1\n  Bound result 50\n  Bound result 2\n  Bound result 2\n  Bound result 0\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.82s (1.82s 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        | 487   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 455   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 458   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 494   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 471   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 445   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 447   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 511   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 515   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 462   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 476   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 444   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 479   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 19482\n  Bound result 24402903308841181211507\n  Bound result 24999999999999999999997\n  Bound result 1971\n  Bound result 3\n  Bound result 17238\n  Bound result 12345678901234567890\n  Bound result 10000000000000000002\n  Bound result 4\n  Bound result 9\n  Bound result 31257725253515\n  Bound result 4096\n  Bound result 86400\n  Bound result 127\n  Bound result 17694\n  Bound result 1384\n  Bound result 6000000000000000000\n  Bound result 11995\n  Bound result 1518\n  Bound result 451\n  Bound result 805\n  Bound result 16624\n  Bound result 35136328051\n  Bound result 500000000000000000\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540137)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.08s (4.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                  | 1839  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1808  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1790  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1797  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1930  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1754  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1811  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1830  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1825  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1249\n  Bound result 47\n  Bound result 1\n  Bound result 482534821\n  Bound result 15432\n  Bound result 19936\n  Bound result 50\n  Bound result 14610\n  Bound result 1\n  Bound result 94\n  Bound result 843285074938515438\n  Bound result 836282756\n  Bound result 44\n  Bound result 1344759726150164393\n  Bound result 2233625730\n  Bound result 27\n  Bound result 14348\n  Bound result 2992\n  Bound result 1\n  Bound result 72\n  Bound result 19997\n  Bound result 24\n  Bound result 5523\n  Bound result 7\n  Bound result 91\n  Bound result 63\n  Bound result 0\n  Bound result 31\n  Bound result 49\n  Bound result 3240701122\n  Bound result 99\n  Bound result 4\n  Bound result 2\n  Bound result 3087665782\n  Bound result 672460672852649060\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.06s (5.08s CPU time)\n\nRan 30 test suites in 5.07s (19.50s CPU time): 186 tests passed, 0 failed, 8 skipped (194 total tests)\n","passed":true},{"durationMs":75,"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\":97,\"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\":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\":18,\"listings/sepolia.json\":1,\"llms.txt\":37,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":679,\"src/Stacker.sol\":98,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1400,\"test/ADVERSARIAL_COVERAGE.md\":44,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":124,\"test/FactoryRehearsal.t.sol\":47,\"test/MainnetFork.t.sol\":102,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryAuditLows.t.sol\":94,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryBondOwed.t.sol\":290,\"test/RegistryBondOwedInvariant.t.sol\":372,\"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/RegistryTryTransferEdges.t.sol\":429,\"test/SepoliaFork.t.sol\":97,\"test/Stacker.t.sol\":420,\"test/StackerEdges.t.sol\":390,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/VaultTrustRegression.t.sol\":41,\"test/mocks/MockIntake.sol\":108,\"test/mocks/TestIMD.sol\":41,\"test/mocks/TestSIMD.sol\":178,\"test/trial/SelfCredit.sol\":35,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":24,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":26,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":179,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f6e2be3cd1c278bf9b380aa85c2efdcd714d4014479df86825082e14085590cd","verifiedTreeHash":"b4e7c5abb28557014f77990faeed0fa38652d9d9","verifierVersion":"0.1.0+fb8278c5"}]}