{"assessments":[],"deployments":[{"attestationHash":"8e828c4ca559aa25317da936a2ef9594a7e781f9b702277af6e778b0351cd3ab","chainId":1,"contracts":[{"address":"0x7f53fa1543c682bb5de3f50c2cf3d1842ae57faa","blockNumber":26180923,"name":"ProjectRegistry","role":"other","txHash":"0x8e7b64499648572a04496d6a80f8910d8b90657a754efd5be4711ef9292837a9"}],"id":"f8d0776c-bd2f-4ae9-bb1a-fb4f81002fbd","manifestHash":"762015e02d339a02cf614ae99336ee64c39702a2ea758423c27f031a10d00c06","status":"live"}],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"4a9a5a47-2aef-4bb1-badc-7c3d79da55f8","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"28231a9f62647a61b1e412337713f326b134e8c59cab22bc497c2316f082e652","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":"a0a4ed2c6b541cc97ff6e7b8e4a9da432ce92746499bab4dcfbfd1486162889a","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":"2b1bdf61567e9c35cf9c3e14654e36edeb6afc6fd02eb71e26164b6cd7c31c36","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":"d20c6ceff2e0c876d010d12c75f887d4b8aa2916e03cc11e8c9d6c4931b3a5ae","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":"03b5ebbb15d4feb35a39518a6ba8974616c2d3e8ee9deb7889fe254c535f6510","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":"9bac3d3e943171cc69b78d9ec9832595ad65772a38a716b9343b7f5c57e0119a","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":"c75440bc40b1ba501e9262ba2df2a385513c9a0db7dc2dc9022f8d34ea1614b6","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":"d99b53dd64d31f05b0ae7899e9ee1824ceb96628d1e62d361cb80b285acc4466","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"aed233163b57c06c074e97094ded1bae782afcd543ba0cab14e9165b9ba83963","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 mainnet ProjectRegistry from this repository (the launch-mainnet branch, which is main without .github/workflows; do not add any workflow file): deploy only the ProjectRegistry, exactly as launch.json lists it, on Ethereum mainnet, wired to imd/acc's live mainnet Stacker and to IdentityMD's Intake v2. It decides which projects' cashback earns points, through IdentityMD oracle panels, with no owner. It is the code of Sepolia test run 6 (launch #1463, 0x30a3bb4d75989cb19f83607abc2dffe52a253384), byte for byte: test run 5's registry (launch #1428, tested live: a rejection, a listing and a defended challenge) with one rule text clarified, version 3.1 of the panel rules (the trader rule rejects the router itself and says the address msgSender() reports is a valid trader even when it is a contract; rehearsed with a real panel, 11 of 11 true). 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 (Ethereum mainnet, one contract):\n- ProjectRegistry(intake, oracleAsset, stacker, oracleSigner, questionChainId, challengeBond, challengeCooldown) = (0xa43e6f75ee006411f79ac1c84120606c2330de82 Intake v2, 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 IMD, 0x06909f672301f28a810f78cfe7a754851269f4f0 the live mainnet Stacker of launch #1409, 0x5598aa9146215bc13eb26f2c692ad1461fd32982 oracle signer, 1, 20e18, 604800). launch.json already lists exactly this: a 20 IMD challenge bond and a 7-day cooldown, agreed by the owner.\n- Do not deploy a Stacker: 0x0690...f4f0 is live (src/Stacker.sol, launch #1409) and primed. The registry only names it 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. applyListing(project, name, sourceUrl, rateBps 25-100, beneficiary): when the project reports an owner through owner() (projectOwner: a staticcall capped at 30,000 gas reading at most 32 bytes; a revert, a malformed answer or zero means no owner), only that owner or the project itself may apply (NotProjectOwner, before any fee); a project without an owner can be applied for by anyone. Anyone may challengeForBeneficiary(project, reason, beneficiary) a listed project after its cooldown. Each ask pays the oracle fee read live from the Intake (ORACLE_FEE(), 0.5 IMD), plus the 20 IMD bond for a challenge, and asks Intake v2 one yes-or-no question with requestWithFailure, with the 8 rules of version 3.1 (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 (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, cooldown not restarted); no rejects, or delists from that block (bond back). onOracleFailure (0xa7980e31) only clears the open question and returns a bond; expire clears one after a day or once the Intake completed it. A bond the token refuses is recorded in bondOwed and claimed with claimBond(to). setBeneficiary waits while a question is open and changes the wallet at most once per day. Questions are filed under chain 1.\n- Known limit, accepted by the owner: The registry's one-question-per-project slot can be held by a listed project's own beneficiary challenging it (0.5 IMD per round, bond returned when defended; outsiders revert AskOpen while it is open). The owner accepts this as a documented design limit: each round holds the slot only until the panel answers, re-judges the project under the full rules and buys no immunity (a defended challenge does not restart the cooldown); refusing the beneficiary as caller would not close it (a second wallet gets the same result). It was reproduced and accepted as low by the judges of launches #1371, #1378, #1428 and #1463. Do not change ProjectRegistry.sol for it; record it as accepted.\n- test/mocks and test/trial hold test doubles and trial contracts only. Keep foundry.toml as it is (solc 0.8.26, cancun, 10,000 runs, bytecode_hash none).\n\nFACTS (read on chain 2026-10-12, Ethereum block 26,178,270): Intake v2 sells the question for 0.5 IMD (priceOf) and delivers answers with 200,000 callback gas. The registry's runtime is 23,295 bytes; deploying it estimates about 5.16M gas. Mainnet fork with the real Intake and IMD (test/RegistryMainnetFork.t.sol): a stranger is refused for an owned project, the owner's application pays the Intake 0.5 IMD and opens our request, a listing answer uses 100,341 gas and a defended challenge 112,901 gas (the 20 IMD bond paid to the beneficiary), both within 200,000.\n\nTESTS: forge test passes (246 tests: 232 run offline; 12 fork tests run when ETH_RPC_URL and SEPOLIA_RPC_URL are set; 2 Stacker-manifest checks skip because this launch.json lists the registry). test/Deployment.t.sol checks this manifest (mainnet IMD, the live Stacker, 20 IMD, 7 days); test/RegistryApplicantGate.t.sol owner-only applications; test/RegistryPolicyRevision.t.sol the version 3.1 rules; test/RegistryCallbackGas.t.sol and test/RegistryBondOwed.t.sol answers within 200,000 gas. Keep all of them passing.\n\nREADME: once live, add the registry's address to the Ethereum mainnet Deployments table.","parentJobId":null,"planHash":"62a87c8a99e765214ee75ed8a2dd6737f01e9af31cdc7c161674abacc9a20f71","previousHash":"265e84e9fe692ce9a7be9a0a135099f8c2544bbc374a38370762d98eeaf5eeb9","projectId":"4a9a5a47-2aef-4bb1-badc-7c3d79da55f8","publication":{"commit":"7229ac37ea14c5d141084c40ff10cedc88228238","deliveredAt":"2026-10-13T03:36:11.445Z","repoUrl":"https://github.com/identity-md-launches/launch-1495-launch-imd-acc-s-mainnet-projectregistry"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"1af16c1989f0472cac46342179408005cacdefa22220780d29693a01e9e2f16f","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"79373c79d1351eba","findings":[{"citation":"resolved","description":"Merged from audit_math, audit_permissions and audit_flow (same root cause). applyListing (line 270) and setBeneficiary (line 522) refuse address(this) as a bond recipient because 'a defended bond sent here would be an unrecoverable token self-transfer'. claimBond, the third place a bond leaves the contract to a caller-chosen wallet, checks only the zero address. With to == address(this), bondOwed[msg.sender] is set to 0 (line 499) and oracleAsset.safeTransfer(address(this), amount) is an ERC20 self-transfer that succeeds with no balance change, so the IMD stays in the registry where no function can ever move it (no owner, no sweep; _payBond and claimBond only pay amounts already accounted for). Impact is bounded to the claimant's own bond, needs the claimant to pass the registry's address, and on mainnet bondOwed is only populated when IMD refuses a transfer, so low. Minimal fix that preserves the design: `if (to == address(this)) revert InvalidBeneficiary();` in claimBond. Verified: both specialists' proofs fail on this tree with 'next call did not revert as expected'; the attached one is the natural-flow version.","line":496,"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 IMD stand-in that refuses transfers to one blocked wallet (the way a token with a\n/// block list would), so a bond becomes `bondOwed` instead of being paid at once.\ncontract BlockingIMD is ERC20 {\n    address public blocked;\n\n    constructor() ERC20(\"IMD\", \"IMD\") {}\n\n    function mint(address to, uint256 amount) external {\n        _mint(to, amount);\n    }\n\n    function setBlocked(address who) external {\n        blocked = who;\n    }\n\n    function _update(address from, address to, uint256 value) internal override {\n        require(to != blocked, \"blocked\");\n        super._update(from, to, value);\n    }\n}\n\ncontract MinimalIntake is IIntake {\n    bytes32 public constant ACTION = \"oracle.request@oracle-1\";\n    uint256 public count;\n    bytes32 public lastId;\n\n    struct Req {\n        address payer;\n        address target;\n        bytes4 selector;\n        bool completed;\n    }\n\n    mapping(bytes32 => Req) internal _reqs;\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 callback,\n        bytes4,\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(address(this), ++count));\n        _reqs[id] = Req(msg.sender, callback.target, callback.selector, false);\n        lastId = id;\n    }\n\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) {\n        Req storage r = _reqs[id];\n        return (r.payer, r.target, r.selector, r.completed);\n    }\n\n    function deliver(bytes32 id, OracleAttestation.Attestation calldata a, bytes calldata sig)\n        external\n        returns (bool ok)\n    {\n        Req storage r = _reqs[id];\n        r.completed = true;\n        (ok,) = r.target.call{gas: 200_000}(abi.encodeWithSelector(r.selector, id, a, sig));\n    }\n}\n\ncontract Project {}\n\ncontract ClaimBondSelfTransferTest is Test {\n    uint256 internal constant SIGNER_KEY = 0xA11CE;\n    uint256 internal constant BOND = 20e18;\n    uint64 internal constant COOLDOWN = 7 days;\n\n    BlockingIMD internal imd;\n    MinimalIntake internal intake;\n    ProjectRegistry internal reg;\n    address internal project;\n    address internal owner = address(0xB0B);\n    address internal challenger = address(0xC0FFEE);\n\n    function setUp() public virtual {\n        imd = new BlockingIMD();\n        intake = new MinimalIntake();\n        reg = new ProjectRegistry(\n            address(intake), address(imd), address(0x57AC), vm.addr(SIGNER_KEY), 1, BOND, COOLDOWN\n        );\n        project = address(new Project());\n        imd.mint(owner, 100e18);\n        imd.mint(challenger, 100e18);\n        vm.prank(owner);\n        imd.approve(address(reg), type(uint256).max);\n        vm.prank(challenger);\n        imd.approve(address(reg), type(uint256).max);\n    }\n\n    function _list() internal {\n        vm.prank(owner);\n        bytes32 id = reg.applyListing(project, \"Proj\", \"https://example.org/p\", 50, owner);\n        OracleAttestation.Attestation memory a;\n        a.requestId = keccak256(\"oracle-request-1\");\n        a.chainId = 1;\n        a.questionHash = keccak256(\"q\");\n        a.answerType = 0;\n        a.answer = abi.encode(true);\n        a.fromBlock = uint64(block.number);\n        a.toBlock = uint64(block.number);\n        a.panelJobId = keccak256(\"job\");\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        (uint8 v, bytes32 r, bytes32 s) = vm.sign(SIGNER_KEY, reg.attestationDigest(a));\n        assertTrue(intake.deliver(id, a, abi.encodePacked(r, s, v)));\n        assertTrue(reg.isListed(project));\n    }\n\n    /// @dev A challenger the token blocks gets its bond recorded in `bondOwed` when the question\n    /// expires. `claimBond(address(registry))` then zeroes the debt with a token self-transfer:\n    /// the 20 IMD stay in the registry and nobody can ever take them out. `applyListing` and\n    /// `setBeneficiary` refuse the registry as a recipient for exactly this reason; `claimBond`\n    /// does not. The test expects the same refusal and so fails on the current code.\n    function test_claimBondToRegistryStrandsTheBond() public {\n        _list();\n        vm.warp(block.timestamp + COOLDOWN);\n        vm.prank(challenger);\n        reg.challengeForBeneficiary(project, \"Check the fee guard.\", owner);\n        assertEq(imd.balanceOf(address(reg)), BOND, \"bond escrowed\");\n\n        imd.setBlocked(challenger);\n        vm.warp(block.timestamp + 1 days + 1);\n        reg.expire(project);\n        assertEq(reg.bondOwed(challenger), BOND, \"bond owed to the blocked challenger\");\n\n        vm.prank(challenger);\n        vm.expectRevert(ProjectRegistry.InvalidBeneficiary.selector);\n        reg.claimBond(address(reg));\n\n        // What should hold once the registry refuses itself as a claim target:\n        assertEq(reg.bondOwed(challenger), BOND, \"debt untouched\");\n        assertEq(imd.balanceOf(address(reg)), BOND, \"bond still claimable\");\n    }\n}","reproduction":"State: registry with launch.json's constants (bond 20e18, cooldown 7 days), a listed project P, an oracle asset that refuses transfers to challenger C. 1) C calls challengeForBeneficiary(P, 'Check the fee guard.', beneficiary): registry holds 20 IMD. 2) The token starts refusing C; warp to askedAt + 1 day + 1; anyone calls expire(P): _payBond(C) fails, bondOwed[C] == 20e18, registry balance 20e18. 3) C calls claimBond(address(registry)). Expected (consistent with applyListing/setBeneficiary): revert InvalidBeneficiary, bondOwed[C] stays 20e18. Actual: succeeds, emits BondClaimed(C, registry, 20e18), bondOwed[C] == 0, registry balance still 20e18, C's balance unchanged, and no later call can release the 20 IMD. Run: forge test --match-path test/scratch/ClaimBondSelf.t.sol -> FAIL 'next call did not revert as expected'.","severity":"low","snippet":"        if (to == address(0)) revert ZeroAddress();","title":"claimBond(to) accepts the registry itself as recipient: the self-transfer zeroes the debt and strands the bond forever"},{"citation":"resolved","description":"From audit_economics; reproduced. The owner-only gate protects only projects whose owner() returns an address. A project with no owner() (projectOwner(P) == 0, the common case for a Uniswap v4 hook or pool) can be applied for by anyone with any beneficiary, and while that question is open the project's own team reverts AskOpen (line 282). The stranger's application is rejected by the panel (beneficiary rule) or refused, which frees the slot, but the stranger can re-apply in the same block as the Intake's complete transaction, so the team must win a mempool race every round. Cost to the griefer: the 0.5 IMD oracle fee per round and no bond, since applications post none. The team loses nothing on chain but cannot get listed, and its traders earn no points. This is a sibling of the accepted self-challenge limit (same one-slot design, different actor: any stranger; different target: every ownerless unlisted project) and is not in the accepted text. It follows from the stated design ('a project without an owner can be applied for by anyone'), so no code change is proposed; the owner should either record it beside the accepted limit as a documented design limit, or decide to require a bond on applications so holding the slot costs the same as holding it by challenge. A project team can also sidestep it by having the contract expose owner().","line":273,"path":"src/ProjectRegistry.sol","reproduction":"State: registry as launch.json deploys it, MockIntake, project P = a contract with no owner() (projectOwner(P) == 0), griefer G and team T each holding IMD approved to the registry. Loop 3 times: 1) G: applyListing(P, 'Hook', 'https://hook.example', 50, G) -> succeeds, G pays 0.5 IMD, slot open. 2) T: applyListing(P, 'Hook', 'https://hook.example', 50, T) -> reverts AskOpen. 3) Intake delivers the panel's signed false (15/11/11) -> Rejected, slot free; G repeats step 1 in the same block. Expected: an ownerless project can be listed by its team. Actual: T's application reverts AskOpen in every round; G has paid exactly 1.5 IMD for three rounds with no bond at risk; isListed(P) == false. Scratch test test/scratch/OwnerlessSlot.t.sol (asserts exactly this) passes on this tree.","severity":"low","snippet":"        if (owner_ != address(0) && msg.sender != owner_ && msg.sender != project) {","title":"An ownerless project's application slot can be held by any stranger at 0.5 IMD per round, deferring the team's own application indefinitely"},{"citation":"resolved","description":"Recorded as accepted per the brief (judged low in launches #1371, #1378, #1428 and #1463); from audit_economics. The beneficiary, or any wallet it controls, calls challengeForBeneficiary on its own project each time the slot frees; outsiders revert AskOpen while the question is open. Each round costs the beneficiary the 0.5 IMD fee; the 20 IMD bond returns to it on a defence (line 412 pays p.beneficiary) and on a delisting (asker == beneficiary). It buys no immunity: each round re-judges the project under the full rules, a defended challenge does not restart challengeOpenAt (line 404 is written only on an Apply yes), and a no delists it. Refusing the beneficiary as caller would not close it. No change to ProjectRegistry.sol.","line":324,"path":"src/ProjectRegistry.sol","reproduction":"State: P listed with beneficiary B, block.timestamp >= challengeOpenAt. 1) B: challengeForBeneficiary(P, 'self', B) -> pays 0.5 IMD + 20 IMD bond, slot open. 2) outsider O: challengeForBeneficiary(P, 'fee guard', B) -> reverts AskOpen. 3) panel yes -> Defended, 20 IMD back to B, challengeOpenAt unchanged; B repeats step 1 in the same block. Net cost to B: 0.5 IMD per round. Accepted; traced in code, exercised by test/RegistrySelfBeneficiary.t.sol.","severity":"info","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"Accepted design limit recorded: a listed project's beneficiary can hold its question slot by self-challenging after the cooldown"},{"citation":"resolved","description":"Merged from audit_permissions, audit_flow and audit_economics (same root cause). The registry has no owner by the brief's design, so oracleSigner is written once by the constructor (_setOracleSigner, OracleAttestation.sol line 203, is reachable nowhere else), and intake, ACTION, PANEL_SIZE and QUORUM are immutable or constant. The supplied oracle-consumer reference asks that these be owner-settable; the brief's no-owner requirement wins, so this is not a defect but a liveness dependency to accept explicitly like the self-challenge limit. Consequences, each only IdentityMD can cause: (A) a signer rotation to a key other than 0x5598...2982 with no ERC-1271 answerer at that address makes every onOracleResult revert BadSignature (OracleAttestation.sol line 188), each ask still pays 0.5 IMD, and open questions end only through expire (bonds return, fees do not); (B) Intake.setPrice(ACTION, IMD, 0) makes ORACLE_FEE() 0 and _ask revert OracleUnavailable before taking anything, the right behaviour; (C) Intake.setCallbackGas below ~113k (Intake source: callbackGas is owner-settable, 200,000 today) makes a defended challenge run out of gas in complete's stipend, recorded undelivered, bond back via expire. In every case listed projects stay listed, nothing can be listed or delisted, no funds are lost, and the remedy is a new registry plus repointing the off-chain points counter (the Stacker never reads the registry).","line":205,"path":"src/ProjectRegistry.sol","reproduction":"State: registry live; the attester signs with key K2 != oracleSigner and 0x5598...2982 has no code. 1) applicant: applyListing(P, ...) pays 0.5 IMD to the Intake and opens a request. 2) writer: Intake.complete(id, 0, h, uri, abi.encode(id, a, sigK2)) -> onOracleResult reverts BadSignature; Completed(delivered=false). 3) anyone: expire(P) -> AskCleared; a challenger's bond returns, the fee does not. Expected under the reference: rotate the signer and continue; actual: immutable by the accepted design.","severity":"info","snippet":"    ) OracleAttestationConsumer(oracleSigner_) {","title":"Trust assumption: the oracle signer, Intake, action and panel size are fixed at deployment with no owner, so an oracle-side change freezes the listing set until a replacement registry is deployed"},{"citation":"resolved","description":"From audit_flow; verified against Intake v2's verified source on Sourcify (chain 1, 0xa43e...de82): complete(requestId, status, resultHash, uri, args) marks requests[requestId].completed and, for status 0, calls the callback with bytes.concat(selector, args) without comparing args to requestId; only for status != 0 does it require args[0:32] == requestId. So the bytes32 intakeId the registry receives in onOracleResult is chosen by the writer, and the attestation carries no field the registry compares to its own question (questionHash is unchecked because the window is relative; a.requestId is the oracle UUID, consumed once). The contract header (lines 44-47) already names the writer as trusted for exactly this pairing, so this is a recorded trust assumption, not a defect. A writer bug could settle project X's open request with the panel's answer for project Y's open question (both this registry's); _consume prevents only reusing the same UUID. If ever wanted without an owner: ask with an absolute block window, store oracleQuestionHash at ask time and require a.questionHash to match.","line":392,"path":"src/ProjectRegistry.sol","reproduction":"State: project X has an open challenge (intakeId iX) and project Y an open application (iY), both on this registry. Writer calls Intake.complete(iX, 0, h, uri, abi.encode(iY, aY, sigY)) where aY is the panel's signed yes for Y. Intake marks iX completed and calls registry.onOracleResult(iY, aY, sigY): projectOfIntake[iY] == Y, signature valid, panel valid, UUID unconsumed -> Y is listed on an answer the Intake recorded against X; X's slot stays open until expire returns the challenger's bond. Expected: an answer applies only to the request the Intake completed; actual: whichever open id the writer places first in args. Requires the trusted writer to misbehave.","severity":"info","snippet":"        // The Intake pairs this answer to our question. Also refuse reuse across different asks.","title":"Trust boundary: the answer-to-question pairing is the Intake writer's; the live Intake forwards a status-0 callback's arguments verbatim and the registry pins no questionHash"}],"hash":"03b5ebbb15d4feb35a39518a6ba8974616c2d3e8ee9deb7889fe254c535f6510","nodeId":"12931aef-4cb3-40ed-9513-6b1fb918348b","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds 5 findings and 12 coverage rows. No source file was changed.\n\n**Verdict:** no critical, high or medium defect. The code deploys under the factory (runtime 23,427 bytes, init code with arguments about 25,230 bytes, constructor makes no external call, 7 manifest arguments in order and none zero), and the full suite passes with 247 tests and 14 skipped fork or Stacker-manifest tests.\n\n**Findings kept, after reproduction:**\n\n- **Low, merged from three specialists:** `claimBond(address(this))` zeroes the debt and leaves the bond stranded in the registry, unlike `applyListing` and `setBeneficiary` which refuse the registry's own address. Both attached proofs fail on this tree for the stated reason. I attached the natural-flow proof. Self-harm only, so low.\n- **Low, from audit_economics:** any stranger can hold an ownerless project's application slot for the oracle fee per round with no bond, so the team's own application reverts `AskOpen` every round. I reproduced it with a scratch test over three rounds. It is a sibling of the accepted self-challenge limit but not in the accepted text, so I recommend recording it as an accepted limit or deciding on an application bond. No code change proposed.\n- **Info:** the accepted self-challenge limit, recorded as the brief asks.\n- **Info, merged from three specialists:** the oracle signer, Intake and panel constants are fixed with no owner, so a signer rotation, price retirement or lower callback gas freezes the listing set until a replacement registry. Funds are not lost.\n- **Info, from audit_flow:** I verified against the Intake's Sourcify source that status-0 callbacks forward the writer's arguments verbatim, so answer pairing is the writer's. The contract header already names this trust.\n\n**Dropped or downgraded:** nothing was dropped as unreproducible. The static-analysis lines are false positives or deliberate code: the `expire` unused-return is used, the unsafe ERC20 call is the intentional `_tryTransfer`, and the Stacker reentrancy line sits under `nonReentrant`.\n\n**Coverage:** all 9 entry points answered, 6 holding and 3 referencing findings, plus 3 invariant rows. The scratch directory was removed, so the working tree holds only the findings file.","treeHash":null,"usage":{"cachedInputTokens":676287,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":19397,"runtime":"claude","turns":19,"wallClockMs":353340}},{"artifacts":[],"attempt":1,"bundleHash":"308fb38c4f3e42233a2dc76103415fd39afcfa71d2e322176fb23b211eb3f58c","device":"575a41a8798743c2","findings":[],"hash":"28231a9f62647a61b1e412337713f326b134e8c59cab22bc497c2316f082e652","nodeId":"0b6f4bbc-b750-4d05-a37f-8ccecd2747aa","outcome":"completed","summary":"Fixed the reproduced bond-loss issue by rejecting the registry itself as beneficiary. Added seven tests and documented the accepted self-challenge limit in `ADAPTATION.md`.\n\n`forge build` and `forge test` pass: **239 passed, 0 failed, 14 expected skips**.\n\nManifest and protected configuration are unchanged. Deployment and the README’s confirmed address update remain with IMD’s deployment step.","treeHash":"042d90bcacf9a1d38b8f9f9db2178a52ccdf8421","usage":{"cachedInputTokens":1408000,"inputTokens":111209,"model":"gpt-6-astra","outputTokens":10230,"runtime":"codex","turns":6,"wallClockMs":397648}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9b06782c7559b54c","findings":[{"citation":"resolved","description":"applyListing (line 270) and setBeneficiary (line 522) both refuse address(this) because 'a defended bond sent here would be an unrecoverable token self-transfer'. claimBond, the third place a bond is paid out to a caller-chosen wallet, has no such guard. bondOwed[msg.sender] is zeroed, safeTransfer(this, amount) is a successful self-transfer, and the IMD stays in the registry with no function that can ever move it (the registry has no owner, no sweep, and _payBond/claimBond only pay amounts already accounted for). Asymmetry between the three payout sites; impact is limited to the claimant's own bond and needs the claimant to pass the registry's address, hence low. Fix: `if (to == address(this)) revert InvalidBeneficiary();` in claimBond (any revert satisfies the proof).","line":496,"path":"src/ProjectRegistry.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {ProjectRegistry, IIntake} from \"src/ProjectRegistry.sol\";\nimport {OracleAttestation} from \"src/oracle/OracleAttestation.sol\";\n\ncontract BlockIMD 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 w, bool on) external {\n        blocked[w] = on;\n    }\n\n    function _update(address from, address to, uint256 v) internal override {\n        require(!blocked[to], \"blocked\");\n        super._update(from, to, v);\n    }\n}\n\ncontract Intake is IIntake {\n    struct Req {\n        address target;\n        bytes4 sel;\n        bytes4 fail;\n        bool done;\n    }\n\n    mapping(bytes32 => Req) public r;\n    uint256 n;\n\n    function priceOf(bytes32, address) external pure returns (uint256) {\n        return 0.5e18;\n    }\n\n    function requestWithFailure(bytes32, bytes calldata, Callback calldata cb, bytes4 f, address asset, uint256 amt)\n        external\n        returns (bytes32 id)\n    {\n        IERC20(asset).transferFrom(msg.sender, address(0xBEEF), amt);\n        id = keccak256(abi.encode(++n));\n        r[id] = Req(cb.target, cb.selector, f, false);\n    }\n\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) {\n        return (address(0), r[id].target, r[id].sel, r[id].done);\n    }\n\n    function fail(bytes32 id) external {\n        r[id].done = true;\n        (bool ok,) = r[id].target.call{gas: 200_000}(\n            abi.encodeWithSelector(r[id].fail, id, uint8(2), bytes32(\"disagreed\"), uint16(0), uint16(0), bytes(\"\"))\n        );\n        require(ok);\n    }\n}\n\ncontract Project {\n    function owner() external pure returns (address) {\n        return address(0);\n    }\n}\n\n/// Shows that `claimBond(address(this))` moves an owed bond into the registry itself, where no\n/// function can ever release it. Fails on the current code (the transfer succeeds and the bond is\n/// stranded); passes once `claimBond` refuses the registry's own address like `applyListing` and\n/// `setBeneficiary` already do.\ncontract ClaimBondSelfTest is Test {\n    BlockIMD imd = new BlockIMD();\n    Intake intake = new Intake();\n    ProjectRegistry reg;\n    address challenger = makeAddr(\"challenger\");\n    address project = address(new Project());\n\n    function setUp() public {\n        reg = new ProjectRegistry(address(intake), address(imd), address(0x5747), address(0xA11CE), 1, 20e18, 7 days);\n        imd.mint(challenger, 100e18);\n        vm.prank(challenger);\n        imd.approve(address(reg), type(uint256).max);\n        // list the project directly by storage so a challenge can be opened\n        // slot 0 of _projects[project]: ask(0) listed(1) at byte 1\n        bytes32 slot = keccak256(abi.encode(project, uint256(5)));\n        bytes32 word = vm.load(address(reg), slot);\n        word = bytes32(uint256(word) | (uint256(1) << 8));\n        vm.store(address(reg), slot, word);\n        assertTrue(reg.isListed(project));\n    }\n\n    function test_claimBondToRegistryStrandsBond() public {\n        vm.prank(challenger);\n        bytes32 id = reg.challengeForBeneficiary(project, \"reason\", address(0));\n        imd.setBlocked(challenger, true);\n        intake.fail(id); // bond refused -> owed\n        assertEq(reg.bondOwed(challenger), 20e18);\n        imd.setBlocked(challenger, false);\n\n        uint256 held = imd.balanceOf(address(reg));\n        vm.prank(challenger);\n        vm.expectRevert();\n        reg.claimBond(address(reg));\n\n        // (expected after the fix) the bond is still owed, still claimable elsewhere, and the\n        // registry's balance did not absorb it.\n        assertEq(reg.bondOwed(challenger), 20e18);\n        assertEq(imd.balanceOf(address(reg)), held);\n        vm.prank(challenger);\n        reg.claimBond(challenger);\n        assertEq(imd.balanceOf(challenger), 100e18 - 0.5e18);\n        assertEq(imd.balanceOf(address(reg)), 0);\n    }\n}","reproduction":"State: a challenger whose refund the token refused, so bondOwed[challenger] == 20e18 (e.g. after onOracleFailure/expire with the challenger blocked by the token). Call: challenger -> claimBond(address(registry)). Expected: revert, bond still owed and claimable to another wallet. Actual: call succeeds, bondOwed[challenger] == 0, registry IMD balance stays 20e18, BondClaimed(challenger, registry, 20e18) emitted, and no path can release the 20 IMD. Proof test test/scratch/ClaimBondSelf.t.sol fails on this tree with 'next call did not revert as expected'.","severity":"low","snippet":"        if (to == address(0)) revert ZeroAddress();\n        uint256 amount = bondOwed[msg.sender];\n        if (amount == 0) revert NothingOwed();\n        bondOwed[msg.sender] = 0;\n        oracleAsset.safeTransfer(to, amount);","title":"claimBond(to) accepts the registry's own address and strands the owed bond forever"},{"citation":"resolved","description":"Documented trust assumption, recorded so the judge sees its concrete shape. The registry has no owner by design, so every oracle dependency is fixed for life: oracleSigner (OracleAttestation.sol:142, set only in the constructor; the supplied oracle-consumer reference says intake, action, asset/price and signer must be 'constructor input and owner-settable, never a constant'), the Intake address, ACTION and PANEL_SIZE/QUORUM. Read live on mainnet (block ~26,180,856): the oracle signer 0x5598...2982 is a bare EOA (no code), so there is no ERC-1271 registry behind it that IdentityMD could rotate keys inside; the Intake is Ownable with setPrice(action, asset, amount) and setCallbackGas(gas) (callbackGas is 200,000 today). Each of these changes by IdentityMD leaves listed projects listed forever and nothing listable or delistable; funds are not lost (open bonds come back through expire), but the registry's one job stops and the only remedy is deploying a replacement registry and repointing the off-chain points counter. Not a code defect under the agreed no-owner design; a low-severity liveness dependency the owner should accept explicitly like the self-challenge limit.","line":205,"path":"src/ProjectRegistry.sol","reproduction":"State A: the plane signs with a new key K2 (signer rotation). Any onOracleResult(intakeId, a, sig) with a valid K2 signature reverts BadSignature (OracleAttestation.sol:188) because ECDSA recovers K2 != oracleSigner and the EOA 0x5598...2982 answers no ERC-1271; every open question then ends through expire, bond returned, no listing or delisting ever settles again. State B: Intake.setPrice(ACTION, IMD, 0) -> ORACLE_FEE() == 0 -> _ask reverts OracleUnavailable (line 349) for every applyListing/challenge. State C: Intake.setCallbackGas(100_000) -> a defended challenge (112,901 gas measured on the fork) always runs out of gas inside complete's fixed stipend, is recorded undelivered, and the bond returns via expire while the project cannot be judged. Expected under the reference: a settable signer/intake/action; actual: immutable with no owner, by the accepted design.","severity":"low","snippet":"    ) OracleAttestationConsumer(oracleSigner_) {","title":"No recovery path for oracle-side changes: a signer rotation, action retirement or lower callback gas freezes the listing set permanently"},{"citation":"resolved","description":"Recorded as a trust-boundary note with the concrete mechanism, not as a defect: the contract header already names the writer as trusted. In the verified Intake v2 source (Sourcify, 0xa43e...de82) complete(requestId, status, ...) marks requests[requestId].completed and for status 0 forwards `args` verbatim as `selector ++ args`; only for status != 0 does it check args[0:32] == requestId. So the bytes32 intakeId the registry receives in onOracleResult is chosen by the writer, not by the Intake, and the attestation carries no field the registry compares to its own question (questionHash is unchecked because the window is relative, a.requestId is the oracle UUID). A writer bug that completes request X with an attestation signed for question Y (both ours, both open) lists/delists the wrong project and pays Y's bond on X's answer; _consume prevents only reuse of the same UUID. Mitigation if ever wanted without an owner: ask with an absolute window and store oracleQuestionHash at ask time, then require a.questionHash == stored (the reference's pinning pattern). Severity info: requires the trusted writer to misbehave.","line":392,"path":"src/ProjectRegistry.sol","reproduction":"State: project X has an open challenge (intakeId iX) and project Y an open application (iY). Writer calls Intake.complete(iX, 0, h, uri, abi.encode(iY, aY, sigY)) where aY is the panel's 'yes' for Y's question, signed for this registry. Intake marks iX completed and calls registry.onOracleResult(iY, aY, sigY). Registry: projectOfIntake[iY] == Y, signature valid, panel valid, a.requestId unconsumed -> Y is listed on an answer the Intake recorded against X; iX is now completed on the Intake with the registry's slot for X still open until expire returns the challenger's bond. Expected: an answer applies only to the request the Intake completed; actual: whichever open request id the writer places first in args.","severity":"info","snippet":"        // The Intake pairs this answer to our question. Also refuse reuse across different asks.\n        _consume(a.requestId);","title":"Answer-to-question pairing is entirely the writer's: the live Intake does not bind a status-0 callback's first argument to the completed request, and the registry checks no questionHash"}],"hash":"2b1bdf61567e9c35cf9c3e14654e36edeb6afc6fd02eb71e26164b6cd7c31c36","nodeId":"95fb3c70-94b6-4642-b3a1-20629831c19c","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the findings and a full coverage record. No repository files were changed. The findings file and the scratch test are both excluded from git.\n\n**Outcome: no critical, high or medium defect in the control flow.** Three items are recorded, two low and one informational.\n\n- **Low, confirmed with a failing proof test.** `claimBond(to)` does not refuse the registry's own address, unlike `applyListing` and `setBeneficiary`. A claimant who passes the registry's address zeroes their owed bond, the token self-transfer succeeds, and the IMD is stranded in a contract with no sweep. The proof under `test/scratch/ClaimBondSelf.t.sol` fails on the current tree and passes with any revert added.\n- **Low, trust and liveness.** The registry has no owner, so its oracle signer, Intake, action id and panel constants are fixed for life. On mainnet the oracle signer is a bare externally owned account with no code, so a key rotation by IdentityMD makes every answer fail signature verification. The Intake owner can also retire the action or lower the callback gas. Each of those freezes the listing set permanently with no funds lost. This is the agreed design, recorded so the owner accepts it explicitly.\n- **Info, trust boundary.** The verified Intake v2 source forwards a status 0 callback's arguments verbatim and binds the first argument to the request only for failures. Answer-to-question pairing therefore rests on the writer alone, and the registry checks no question hash. The contract header already names the writer as trusted.\n\n**What was verified.** The full suite passes offline (239 passed, 14 skipped for fork and manifest reasons). The mainnet fork test passed against a public RPC, confirming the fee, the request tuple decoding, and the callback gas figures. The vendored attestation library matches the canonical copy except for an intentional ECDSA-then-ERC-1271 order. The live Intake marks a request completed before calling the callback and refuses a second completion, so `expire` and `onOracleResult` cannot both settle one question. IMD is a plain LayerZero OFT token with no hooks, pause or blocklist, so no reentrancy or refused-transfer path exists through the token today.\n\n**Coverage.** All nine listed entry points have rows: eight hold and `claimBond` carries finding 1. Three invariant rows are added. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":1818328,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":46012,"runtime":"claude","turns":37,"wallClockMs":760002}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"72f49cf84b9ab056","findings":[{"citation":"resolved","description":"Boundary (sentinel-address) gap. applyListing (line 270) and setBeneficiary (line 522) refuse address(this) as a bond recipient with the comment 'A defended bond sent here would be an unrecoverable token self-transfer'. claimBond, the only other place a bond leaves the contract, checks only for the zero address. With to == address(this), oracleAsset.safeTransfer(address(this), amount) is an ERC20 self-transfer that succeeds (IMD is a plain OZ-style ERC20: balance unchanged), bondOwed[msg.sender] has already been set to 0, and the 20 IMD stay in the registry with no function able to move them again. The invariant 'registry IMD balance == open challenge bonds + sum(bondOwed)' is broken by exactly one bond. Impact is limited to the claimant's own bond and needs the claimant to pass the registry's address, so low. The same class as the guarded cases, which is why the registry's own design treats it as a defect worth a check. Minimal fix: in claimBond, `if (to == address(this)) revert InvalidBeneficiary();` (one comparison, no design change). Note the reproduction needs a token that refuses one recipient to populate bondOwed; on mainnet IMD (an OFT without a block list) bondOwed is reached only through that defensive branch, which further bounds the impact.","line":495,"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 IMD stand-in that refuses transfers to one blocked wallet (the way a token with a\n/// block list would), so a bond becomes `bondOwed` instead of being paid at once.\ncontract BlockingIMD is ERC20 {\n    address public blocked;\n\n    constructor() ERC20(\"IMD\", \"IMD\") {}\n\n    function mint(address to, uint256 amount) external {\n        _mint(to, amount);\n    }\n\n    function setBlocked(address who) external {\n        blocked = who;\n    }\n\n    function _update(address from, address to, uint256 value) internal override {\n        require(to != blocked, \"blocked\");\n        super._update(from, to, value);\n    }\n}\n\ncontract MinimalIntake is IIntake {\n    bytes32 public constant ACTION = \"oracle.request@oracle-1\";\n    uint256 public count;\n    bytes32 public lastId;\n\n    struct Req {\n        address payer;\n        address target;\n        bytes4 selector;\n        bool completed;\n    }\n\n    mapping(bytes32 => Req) internal _reqs;\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 callback,\n        bytes4,\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(address(this), ++count));\n        _reqs[id] = Req(msg.sender, callback.target, callback.selector, false);\n        lastId = id;\n    }\n\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) {\n        Req storage r = _reqs[id];\n        return (r.payer, r.target, r.selector, r.completed);\n    }\n\n    function deliver(bytes32 id, OracleAttestation.Attestation calldata a, bytes calldata sig)\n        external\n        returns (bool ok)\n    {\n        Req storage r = _reqs[id];\n        r.completed = true;\n        (ok,) = r.target.call{gas: 200_000}(abi.encodeWithSelector(r.selector, id, a, sig));\n    }\n}\n\ncontract Project {}\n\ncontract ClaimBondSelfTransferTest is Test {\n    uint256 internal constant SIGNER_KEY = 0xA11CE;\n    uint256 internal constant BOND = 20e18;\n    uint64 internal constant COOLDOWN = 7 days;\n\n    BlockingIMD internal imd;\n    MinimalIntake internal intake;\n    ProjectRegistry internal reg;\n    address internal project;\n    address internal owner = address(0xB0B);\n    address internal challenger = address(0xC0FFEE);\n\n    function setUp() public virtual {\n        imd = new BlockingIMD();\n        intake = new MinimalIntake();\n        reg = new ProjectRegistry(\n            address(intake), address(imd), address(0x57AC), vm.addr(SIGNER_KEY), 1, BOND, COOLDOWN\n        );\n        project = address(new Project());\n        imd.mint(owner, 100e18);\n        imd.mint(challenger, 100e18);\n        vm.prank(owner);\n        imd.approve(address(reg), type(uint256).max);\n        vm.prank(challenger);\n        imd.approve(address(reg), type(uint256).max);\n    }\n\n    function _list() internal {\n        vm.prank(owner);\n        bytes32 id = reg.applyListing(project, \"Proj\", \"https://example.org/p\", 50, owner);\n        OracleAttestation.Attestation memory a;\n        a.requestId = keccak256(\"oracle-request-1\");\n        a.chainId = 1;\n        a.questionHash = keccak256(\"q\");\n        a.answerType = 0;\n        a.answer = abi.encode(true);\n        a.fromBlock = uint64(block.number);\n        a.toBlock = uint64(block.number);\n        a.panelJobId = keccak256(\"job\");\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        (uint8 v, bytes32 r, bytes32 s) = vm.sign(SIGNER_KEY, reg.attestationDigest(a));\n        assertTrue(intake.deliver(id, a, abi.encodePacked(r, s, v)));\n        assertTrue(reg.isListed(project));\n    }\n\n    /// @dev A challenger the token blocks gets its bond recorded in `bondOwed` when the question\n    /// expires. `claimBond(address(registry))` then zeroes the debt with a token self-transfer:\n    /// the 20 IMD stay in the registry and nobody can ever take them out. `applyListing` and\n    /// `setBeneficiary` refuse the registry as a recipient for exactly this reason; `claimBond`\n    /// does not. The test expects the same refusal and so fails on the current code.\n    function test_claimBondToRegistryStrandsTheBond() public {\n        _list();\n        vm.warp(block.timestamp + COOLDOWN);\n        vm.prank(challenger);\n        reg.challengeForBeneficiary(project, \"Check the fee guard.\", owner);\n        assertEq(imd.balanceOf(address(reg)), BOND, \"bond escrowed\");\n\n        imd.setBlocked(challenger);\n        vm.warp(block.timestamp + 1 days + 1);\n        reg.expire(project);\n        assertEq(reg.bondOwed(challenger), BOND, \"bond owed to the blocked challenger\");\n\n        vm.prank(challenger);\n        vm.expectRevert(ProjectRegistry.InvalidBeneficiary.selector);\n        reg.claimBond(address(reg));\n\n        // What should hold once the registry refuses itself as a claim target:\n        assertEq(reg.bondOwed(challenger), BOND, \"debt untouched\");\n        assertEq(imd.balanceOf(address(reg)), BOND, \"bond still claimable\");\n    }\n}","reproduction":"State: registry with the mainnet constants (bond 20e18, cooldown 7 days), a listed project P, a token that refuses transfers to wallet C. Steps: (1) C calls challengeForBeneficiary(P, 'Check the fee guard.', beneficiary): registry holds 20 IMD. (2) The token starts refusing C; warp askedAt + 1 day + 1; anyone calls expire(P): _payBond(C) fails, bondOwed[C] = 20e18, registry balance 20e18. (3) C calls claimBond(address(registry)). Expected (consistent with applyListing/setBeneficiary): revert InvalidBeneficiary, bondOwed[C] stays 20e18. Actual: the call succeeds, bondOwed[C] == 0, registry balance still 20e18, C's balance unchanged; no later call can release the 20 IMD. Run: forge test --match-path test/scratch/ClaimBondSelf.t.sol (fails on this code with 'next call did not revert as expected').","severity":"low","snippet":"    function claimBond(address to) external nonReentrant {\n        if (to == address(0)) revert ZeroAddress();","title":"claimBond(to) accepts the registry itself as recipient: a self-transfer zeroes the debt and strands the bond forever"}],"hash":"9bac3d3e943171cc69b78d9ec9832595ad65772a38a716b9343b7f5c57e0119a","nodeId":"211d619f-2998-4909-a923-59ba111272c8","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds one finding plus a coverage row for every listed entry point.\n\n**Result: the registry's math holds; one low-severity boundary defect.** The contract has no division, scaling or decimal conversion, so the Math Precision guide reduces to bounds, casts and timestamp or block arithmetic, all of which are checked arithmetic on values that cannot reach their limits. The Boundary and Numerical Gap passes found one gap.\n\n- **Low: claimBond accepts the registry itself as recipient.** `applyListing` and `setBeneficiary` refuse `address(this)` because a bond sent there is an unrecoverable self-transfer. `claimBond` only refuses the zero address. A claimant who passes the registry's address has its debt zeroed while the 20 IMD stay in the contract forever, breaking the balance-equals-bonds-owed invariant by one bond. The proof at `test/scratch/ClaimBondSelf.t.sol` fails on the current code and passes with a one-line `InvalidBeneficiary` check. Impact is bounded to the claimant's own bond, and on mainnet IMD the `bondOwed` branch is only reached through the defensive path.\n\n**What I verified against live state**, not just the mocks:\n\n- The mainnet fork test passed against the real Intake and IMD through a public RPC: fee 0.5 IMD, listing answer 100,341 gas, defended answer 112,901 gas.\n- The Intake's verified source confirms `requests()` returns exactly the four fields the registry decodes, `completed` is set before the callback, the body cap is 16,384 bytes, and it pulls exactly the amount the registry approves.\n- The cold `bondOwed` callback branch delivers within 200,000 gas, and the `expire` and `TooLate` deadlines are complementary at the exact second with no overlap or gap.\n- The full offline suite passes, and the manifest has the right keys, seven string arguments in declaration order and notes under the limit.\n\n**Checked and found sound, with no finding:** the 30,000-gas `owner()` cap cannot be starved into an owner-only bypass, since the rest of the call needs far more gas than 1/64 of what remains. Panel bounds are inclusive at 15 seats and 11 agreeing. The issued-at window and the bond escrow equal the payout on every settle and clear path.\n\n**Not reached:** nothing in the assigned area. The Stacker row is marked holds as out of area and not part of this deployment.","treeHash":null,"usage":{"cachedInputTokens":2711916,"inputTokens":866,"model":"claude-fable-5-1","outputTokens":41465,"runtime":"claude","turns":28,"wallClockMs":594263}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9ab27edcfd62be02","findings":[{"citation":"resolved","description":"Economic Security / Flow Gap (execution x first principles). The owner-only gate at lines 272-275 only protects projects that report an owner(). A Uniswap v4 hook or pool with no owner() (the common case the rules name as the typical venue) is treated as ownerless, so anyone may open its one question slot by applying with any beneficiary. While that question is open the project's real team cannot apply (AskOpen). The stranger's application is rejected by the panel (beneficiary rule), but the stranger can back-run the Intake's complete transaction and re-apply in the same block, so the slot is never free for the team unless it wins a mempool race every round. Cost to the griefer: 0.5 IMD per round (the oracle fee, no bond), roughly 144 IMD per day at 10-minute panel rounds; the team pays nothing but cannot get listed and loses the points its traders would have earned. The accepted limit in the brief covers a listed project's own beneficiary holding the slot through self-challenges; this pre-listing variant has a different actor (any stranger) and target (every ownerless project) and is not in the accepted text. Verified by a scratch test against MockIntake: the team's applyListing reverts AskOpen in both rounds and the griefer's two rounds cost exactly 1 IMD. Suggested handling: either record it beside the accepted limit as a documented design limit (an application is free to open and bond-less, so no cheaper on-chain defence exists without changing the one-slot design), or require a bond on applications too so holding the slot has the same price as holding it by challenge; both are owner decisions, so no code change is proposed here.","line":282,"path":"src/ProjectRegistry.sol","reproduction":"State: ProjectRegistry as launch.json deploys it; project P is a contract whose owner() reverts or is absent (projectOwner(P) == 0); griefer G and team T each hold IMD approved to the registry. 1) G: applyListing(P, \"Hook\", \"https://hook.example\", 50, G) -> succeeds, G pays 0.5 IMD, slot open. 2) T: applyListing(P, \"Hook\", \"https://hook.example\", 50, T) -> reverts AskOpen (expected: the project's real team can file). 3) Intake delivers the panel's signed false -> Rejected, slot free. 4) In the same block G repeats step 1; T's step 2 reverts again. Expected: an ownerless project can be listed by its team; actual: the listing is deferred indefinitely for 0.5 IMD per panel round, with no bond at risk for G.","severity":"low","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"Ownerless project's application slot can be held by any stranger at 0.5 IMD per round, blocking the team's own application"},{"citation":"resolved","description":"Recorded as accepted, per the brief: this is the known limit reproduced and accepted as low by the judges of launches #1371, #1378, #1428 and #1463. The beneficiary (or any wallet it controls) calls challengeForBeneficiary on its own project each time the slot frees; outsiders revert AskOpen while the question is open. Each round costs the beneficiary 0.5 IMD (the 20 IMD bond returns to it on a defence and on a delisting, since asker and beneficiary coincide). It buys no immunity: each round re-judges the project under the full rules, a defended challenge does not restart challengeOpenAt (line 404 is only written on an Apply yes), and a no delists it. Refusing the beneficiary as caller would not close it. No change to ProjectRegistry.sol is proposed.","line":324,"path":"src/ProjectRegistry.sol","reproduction":"State: P listed with beneficiary B, block.timestamp >= challengeOpenAt. 1) B: challengeForBeneficiary(P, \"self\", B) -> pays 0.5 IMD + 20 IMD bond, slot open. 2) outsider O: challengeForBeneficiary(P, \"fee guard\", B) -> reverts AskOpen. 3) panel yes -> Defended, 20 IMD back to B, challengeOpenAt unchanged; B repeats step 1 in the same block. Net cost to B: 0.5 IMD per round. Accepted.","severity":"info","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"Accepted design limit recorded: a listed project's beneficiary can hold its question slot by self-challenging after the cooldown"},{"citation":"resolved","description":"Economic Security (dependency failure). The registry has no owner by the brief's design, so oracleSigner is set once in the constructor (ProjectRegistry.sol line 205) and _setOracleSigner is never reachable again. The oracle-consumer reference asks that the signer be owner-settable so a rotation needs no redeploy; the brief's no-owner requirement wins, but the economic consequence should be recorded as a trust assumption: if IdentityMD rotates the key behind 0x5598...2982, every answer afterwards reverts BadSignature in onOracleResult, the Intake marks the request completed and undelivered, and each ask has already paid 0.5 IMD to the Intake's payTo. Challenge bonds are not lost (expire returns them once the Intake shows completed), but every fee is. Listed projects stay listed and unchallengeable in effect, since no challenge can settle. Mitigation is operational: the Stacker never reads the registry, so a new registry can be deployed and the off-chain points indexer repointed. Not a code defect under the agreed design.","line":142,"path":"src/oracle/OracleAttestation.sol","reproduction":"State: registry live; IdentityMD's attester signs with a new key K2 != oracleSigner. 1) applicant: applyListing(P, ...) -> pays 0.5 IMD to the Intake. 2) writer: Intake.complete(id, 0, ..., args signed by K2) -> onOracleResult reverts BadSignature; Completed(delivered=false). 3) anyone: expire(P) -> clears. Expected (reference): rotate the signer and continue; actual: every ask burns 0.5 IMD with no answer until a new registry is deployed.","severity":"info","snippet":"    address public oracleSigner;","title":"Trust assumption: the oracle signer is fixed at deployment with no owner, so a signer rotation by IdentityMD makes every later ask a 0.5 IMD loss until the registry is replaced"}],"hash":"a0a4ed2c6b541cc97ff6e7b8e4a9da432ce92746499bab4dcfbfd1486162889a","nodeId":"c1b5d3bb-1cb5-4d21-bf41-9ae84f2295a2","outcome":"completed","summary":"Review complete. The findings file is written and every snippet matches the tree; the scratch tests are removed and the working tree is clean.\n\n**Outcome:** no medium or higher defect in the economics of the ProjectRegistry. The file holds one low finding, two info entries, and 13 coverage rows (all 9 listed entry points plus 3 invariants and the manifest).\n\n**What I verified, beyond reading the code**\n\n- Offline suite: 239 passed, 14 skipped, 0 failed.\n- Mainnet fork test against a public RPC: passes, fee 0.5 IMD, listing answer 100,341 gas, defended answer 112,889 gas.\n- Pulled the deployed Intake v2 and IMD sources from Sourcify. The Intake's request struct is exactly the 4 fields the registry decodes, so `expire` reads the real `completed` flag. The Intake pulls exactly `amount` to its `payTo`, marks a request completed before calling back, and gives the callback a fixed 200,000 gas. IMD is a plain OpenZeppelin ERC20 inside a LayerZero OFT with no pause, fee, blocklist or transfer hook, so no party has a gas or reentrancy lever inside the callback and the `bondOwed` path is dead but correct on mainnet.\n- Question and definition lengths at maximal inputs stay under the paid-door caps, so no body is refused at the asker's expense.\n\n**Findings**\n\n1. **Low.** An ownerless project's application slot can be held by any stranger for 0.5 IMD per panel round. The owner gate only protects projects that report an owner; a hook with none can be applied for by anyone, the team's own application reverts `AskOpen`, and the stranger can re-apply in the block the rejection lands. Reproduced with a scratch test (two rounds cost the griefer exactly 1 IMD, no bond). This is a pre-listing variant of the accepted self-challenge limit with a different actor and target, so I left the handling to the owner: document it beside the accepted limit, or price applications with a bond.\n2. **Info.** The accepted self-challenge slot hold, recorded as the brief asked, with its cost and why it buys no immunity.\n3. **Info.** Trust assumption: with no owner, the oracle signer cannot be rotated. A key rotation by IdentityMD would make every later ask a 0.5 IMD loss until a new registry is deployed. Bonds are still recoverable through `expire`.\n\n**Coverage:** bond conservation, the one-slot state coupling, the listing and cooldown coupling, handoff front-running, late and replayed callbacks, third-party questions naming the registry, and the manifest arguments all hold. `Stacker.credit` is outside the registry economics and already live; it holds. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":1846488,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":44227,"runtime":"claude","turns":36,"wallClockMs":722715}},{"artifacts":[],"attempt":1,"bundleHash":"d052c294406f8e40e51091924411bc2875eb29e80c276d794497ed890f0056ae","device":"820ba900755d37ad","findings":[],"hash":"aed233163b57c06c074e97094ded1bae782afcd543ba0cab14e9165b9ba83963","nodeId":"05f8be65-143a-4c5b-84d0-631a2cadbca4","outcome":"completed","summary":"Added deferred-bond invariants and claim rollback/reentrancy tests, plus coverage documentation recording the accepted self-challenge limit. All changes are under `test/`.\n\nVerification passed:\n- `forge build`\n- `forge test`: **247 passed, 0 failed, 14 skipped**.\n\nSkips comprise 12 RPC-dependent fork tests and 2 Stacker-manifest checks. No new defect was reproduced.","treeHash":"804e68f8fab6ad9384ba8f12b50478f2897afd2d","usage":{"cachedInputTokens":2096512,"inputTokens":126710,"model":"gpt-6-astra","outputTokens":15448,"runtime":"codex","turns":6,"wallClockMs":539775}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"74a99f640688d37b","findings":[{"citation":"resolved","description":"Asymmetry pass (recipient validation across the three places a bond recipient is chosen). applyListing (line 270) and setBeneficiary (line 522) both refuse address(this) as a beneficiary because 'a defended bond sent here would be an unrecoverable token self-transfer'. claimBond, the third recipient-choosing path, only refuses the zero address. OpenZeppelin ERC20.transfer to the token holder itself succeeds, so bondOwed[msg.sender] is zeroed while the IMD stays in the registry, where no function can ever move it. Impact is self-harm only (the claimant chooses `to`), no third party loses anything, so this is recorded for completeness of the recipient-check symmetry and not as a defect that needs a revision. Verified with a scratch Foundry test (registry deployed with a plain OZ ERC20 as oracle asset, bondOwed[alice] set to 20e18 via stdstore, registry funded 20e18; alice calls claimBond(address(reg))): bondOwed[alice] == 0 afterwards, registry balance still 20e18, alice balance 0.","line":495,"path":"src/ProjectRegistry.sol","reproduction":"State: bondOwed[alice] = 20e18 (any defended or returned bond the token once refused), registry holds 20e18 IMD. Call: vm.prank(alice); reg.claimBond(address(reg)). Expected (by symmetry with applyListing/setBeneficiary): revert InvalidBeneficiary. Actual: succeeds, emits BondClaimed(alice, reg, 20e18), bondOwed[alice] == 0, IERC20(imd).balanceOf(reg) unchanged at 20e18 and unrecoverable.","severity":"info","snippet":"    function claimBond(address to) external nonReentrant {\n        if (to == address(0)) revert ZeroAddress();\n        uint256 amount = bondOwed[msg.sender];\n        if (amount == 0) revert NothingOwed();\n        bondOwed[msg.sender] = 0;\n        oracleAsset.safeTransfer(to, amount);","title":"claimBond(to) accepts the registry itself as recipient, unlike applyListing and setBeneficiary, so a claimant can strand its own bond"},{"citation":"resolved","description":"Access-control map: the registry exposes no privileged function at all (no owner, no setter), which is what the brief asks for and is not a defect. The consequence worth recording as a trust assumption, per the oracle-consumer background ('the intake, the action id, the asset and price, the signer: constructor input and owner-settable, never a constant'), is liveness: `_setOracleSigner` is only reachable from the constructor, and ACTION is a constant. If IdentityMD ever signs with a key other than 0x5598aa9146215bc13eb26f2c692ad1461fd32982 (and does not keep an ERC-1271 answerer at that address, e.g. through an EIP-7702 delegation, which `_verifyAttestation` lines 184-188 would accept), every answer reverts BadSignature, each applyListing/challenge still pays the 0.5 IMD fee to the Intake, and the only exit is `expire` after a day (bonds come back, fees do not). If the action is retired, ORACLE_FEE() reads 0 and `_ask` reverts OracleUnavailable before taking anything, which is the right behaviour. No unprivileged actor can trigger this; it is the accepted price of having no owner, recorded here so the judge sees it was weighed rather than missed.","line":203,"path":"src/oracle/OracleAttestation.sol","reproduction":"State: oracle signer rotated off chain to key K2 != 0x5598...2982, no code at 0x5598...2982. Call: applicant.applyListing(project, ...) pays 0.5 IMD to the Intake and opens a request; writer delivers an attestation signed by K2 via Intake.complete -> onOracleResult reverts BadSignature (OracleAttestation.sol:188). Expected under a rotatable design: a setter moves `oracleSigner` and the answer settles. Actual: the question can only be cleared by expire(project) after PENDING_EXPIRY; the fee is spent and the registry is permanently inert for new listings.","severity":"info","snippet":"    function _setOracleSigner(address signer) internal {\n        if (signer == address(0)) revert ZeroSigner();\n        oracleSigner = signer;\n        emit OracleSignerSet(signer);\n    }","title":"Trust assumption to record: the oracle signer and action id cannot be rotated (no owner), so a signer rotation by IdentityMD makes every later paid question unanswerable"}],"hash":"c75440bc40b1ba501e9262ba2df2a385513c9a0db7dc2dc9022f8d34ea1614b6","nodeId":"a2ef01a4-713e-48fe-9223-118f77f28131","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the report. The working tree is otherwise unchanged: the scratch test is deleted and the findings file is excluded from git.\n\n**Outcome: no permission bypass, trust-gap or asymmetric loss found in the registry.** The access model is small and every path I traced holds. Two informational notes are recorded with reproductions, neither needing a revision.\n\n**What I checked, against the Access Control, Trust Gap and Asymmetry guides:**\n- The full permission map. There is no privileged role at all after deployment. Every state-changing path is permissionless-and-paid, scoped to the caller, or restricted to the Intake.\n- The applicant gate. The `owner()` staticcall is capped at 30,000 gas, reads exactly 32 bytes and rejects dirty upper bits. A revert, empty, oversized or out-of-gas answer reads as no owner, and `NotProjectOwner` fires before any fee is pulled.\n- Callback forgery through the Intake. A stranger can pay 0.5 IMD and name the registry as callback target, but the Intake passes its own request id, which is not in `projectOfIntake`, so both callbacks revert `UnknownRequest`. Routing a foreign selector through the Intake reaches only functions that revert or are permissionless anyway.\n- Paired paths. Apply-yes versus apply-no, challenge-yes versus challenge-no, result versus failure versus expire, and the three places a bond recipient is chosen. The settle-time bond recipient is the pinned wallet, because `setBeneficiary` is refused while a question is open.\n- The accepted limit. A beneficiary self-challenge has no cheaper or longer variant on chain. Each round costs the fee, the bond returns, the cooldown is set only on listing, and only the writer's liveness can stretch a round to a day.\n- The manifest. The seven constructor arguments match the brief in declaration order, and the cooldown sits under the 365-day guard.\n\n**The two informational notes:**\n1. `claimBond(to)` accepts the registry itself as recipient, unlike `applyListing` and `setBeneficiary` which refuse it. A claimant can strand its own bond. Confirmed with a scratch test. Self-harm only.\n2. The oracle signer and action id cannot be rotated because there is no owner, as the brief requires. Recorded as a liveness trust assumption: a signer rotation by IdentityMD would make every later paid question unanswerable, with bonds recoverable via `expire` but fees spent.\n\n**Coverage:** all nine entry points have rows, eight marked holds and `claimBond` marked finding 1. Five invariant rows are added. One row is marked unreached: the live Intake v2 behaviour, since no RPC was available here and I relied on the committed fork test and the brief's on-chain figures. The suite passed offline with 239 tests and 14 skipped fork or manifest checks.","treeHash":null,"usage":{"cachedInputTokens":1035193,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":40574,"runtime":"claude","turns":29,"wallClockMs":614492}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"72ae9b5bbd1a54b6","findings":[{"citation":"resolved","description":"applyListing (line 265) and setBeneficiary (line 518) refuse only the zero address as beneficiary, so the registry's own address can be stored as a project's beneficiary. When a challenge against such a project is defended, onOracleResult pays the 20 IMD bond with _tryTransfer(address(this), bond): an ERC-20 self-transfer succeeds, so _payBond takes the success path and records nothing in bondOwed. The IMD then sits in the registry's balance with no function able to move it (claimBond pays only bondOwed[msg.sender], and the registry never calls claimBond on itself). Each defended challenge against that project burns another challenger's 20 IMD. Reachable state: a project whose owner() returns the registry address (the project then applies for itself, as the owner-only gate allows), or a listed project's beneficiary handing off to the registry with setBeneficiary; in both cases the panel is asked about the registry as beneficiary and may answer yes, since the beneficiary rule only asks that it be the project's owner. Not a theft vector (the beneficiary gives up the bond it would otherwise receive), but the accounting invariant that the registry's balance equals open bonds plus bondOwed is broken permanently. Minimal fix preserving the design: in applyListing and setBeneficiary, revert when beneficiary == address(this) (alongside the ZeroAddress check), or make _payBond treat to == address(this) as a refused transfer so the bond is recorded in bondOwed for the challenger instead.","line":409,"path":"src/ProjectRegistry.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ERC20} from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {ProjectRegistry, IIntake} from \"src/ProjectRegistry.sol\";\nimport {OracleAttestation} from \"src/oracle/OracleAttestation.sol\";\n\ncontract PlainIMD is ERC20 {\n    constructor() ERC20(\"IMD\", \"IMD\") {}\n\n    function mint(address to, uint256 amount) external {\n        _mint(to, amount);\n    }\n}\n\n/// @dev A project whose owner() is the registry itself (an owner can hand a project to any address).\ncontract RegistryOwnedProject {\n    address public owner;\n\n    constructor(address owner_) {\n        owner = owner_;\n    }\n}\n\ncontract Intake is IIntake {\n    bytes32 internal constant ACTION = \"oracle.request@oracle-1\";\n\n    struct Req {\n        address target;\n        bytes4 selector;\n        bool completed;\n    }\n\n    mapping(bytes32 => Req) internal reqs;\n    uint256 internal n;\n    bytes32 public lastId;\n\n    function priceOf(bytes32 action, address) external pure returns (uint256) {\n        return action == ACTION ? 0.5e18 : 0;\n    }\n\n    function requestWithFailure(bytes32, bytes calldata, Callback calldata cb, bytes4, address asset, uint256 amount)\n        external\n        returns (bytes32 id)\n    {\n        IERC20(asset).transferFrom(msg.sender, address(0x7EA5), amount);\n        id = keccak256(abi.encode(++n));\n        reqs[id] = Req(cb.target, cb.selector, false);\n        lastId = id;\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) external returns (bool ok) {\n        reqs[id].completed = true;\n        (ok,) = reqs[id].target.call{gas: 200_000}(abi.encodeWithSelector(reqs[id].selector, id, a, sig));\n    }\n}\n\ncontract RegistrySelfBeneficiaryTest is Test {\n    uint256 internal constant SIGNER_KEY = 0xA11CE;\n    uint256 internal constant BOND = 20e18;\n\n    PlainIMD internal imd;\n    Intake internal intake;\n    ProjectRegistry internal registry;\n    RegistryOwnedProject internal project;\n    address internal applicant = address(0xA1);\n    address internal challenger = address(0xC1);\n\n    function setUp() public {\n        vm.warp(1_700_000_000);\n        imd = new PlainIMD();\n        intake = new Intake();\n        registry = new ProjectRegistry(\n            address(intake), address(imd), address(0x57ac), vm.addr(SIGNER_KEY), 1, BOND, 7 days\n        );\n        project = new RegistryOwnedProject(address(registry));\n        imd.mint(applicant, 10e18);\n        imd.mint(challenger, 100e18);\n        vm.prank(applicant);\n        imd.approve(address(registry), type(uint256).max);\n        vm.prank(challenger);\n        imd.approve(address(registry), type(uint256).max);\n        imd.mint(address(project), 10e18);\n        vm.prank(address(project));\n        imd.approve(address(registry), type(uint256).max);\n    }\n\n    function _yes(uint256 nonce) internal view returns (OracleAttestation.Attestation memory a, bytes memory sig) {\n        a = OracleAttestation.Attestation({\n            requestId: bytes32(nonce),\n            chainId: 1,\n            questionHash: bytes32(uint256(0x11)),\n            answerType: 0,\n            answer: abi.encode(true),\n            figure: 0,\n            fromBlock: 0,\n            toBlock: 0,\n            blockHash: bytes32(0),\n            panelJobId: bytes32(0),\n            panelSize: 15,\n            quorum: 11,\n            agreed: 11,\n            issuedAt: uint64(block.timestamp),\n            expiresAt: uint64(block.timestamp + 1 days)\n        });\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(SIGNER_KEY, registry.attestationDigest(a));\n        sig = abi.encodePacked(r, s, v);\n    }\n\n    /// @dev Expected: the registry refuses itself as a beneficiary (or records the bond as owed so\n    /// someone can claim it). Actual: the application is accepted, and a defended challenge pays the\n    /// 20 IMD bond to the registry's own balance with no bondOwed entry, so nobody can ever take it.\n    function test_bondPaidToRegistryItselfIsLostForever() public {\n        // The registry is the project's owner, so only it (or the project) may apply: the project applies.\n        vm.prank(address(project));\n        registry.applyListing(address(project), \"Venue\", \"https://venue.example/src\", 50, address(registry));\n        (OracleAttestation.Attestation memory a, bytes memory sig) = _yes(1);\n        assertTrue(intake.deliver(intake.lastId(), a, sig));\n        assertTrue(registry.isListed(address(project)));\n\n        vm.warp(block.timestamp + 7 days);\n        uint256 before = imd.balanceOf(address(registry));\n        vm.prank(challenger);\n        registry.challenge(address(project), \"it does not meet the rules\");\n        (a, sig) = _yes(2);\n        assertTrue(intake.deliver(intake.lastId(), a, sig));\n        assertTrue(registry.isListed(address(project)), \"defended\");\n\n        // The bond now sits in the registry with no owner: not owed to anyone, and no function moves it.\n        assertEq(imd.balanceOf(address(registry)), before + BOND, \"bond stays in the registry\");\n        assertEq(registry.bondOwed(address(registry)), 0, \"and is not recorded as owed\");\n        // What should hold instead: the registry's balance is fully explained by open bonds and bondOwed.\n        assertEq(imd.balanceOf(address(registry)), 0, \"registry holds IMD nobody can claim\");\n    }\n\n    function test_setBeneficiaryAcceptsRegistryItself() public {\n        RegistryOwnedProject p2 = new RegistryOwnedProject(address(0));\n        vm.prank(applicant);\n        registry.applyListing(address(p2), \"Venue\", \"https://venue.example/src\", 50, applicant);\n        (OracleAttestation.Attestation memory a, bytes memory sig) = _yes(3);\n        assertTrue(intake.deliver(intake.lastId(), a, sig));\n        vm.prank(applicant);\n        vm.expectRevert(ProjectRegistry.ZeroAddress.selector);\n        registry.setBeneficiary(address(p2), address(registry));\n    }\n}","reproduction":"Deploy ProjectRegistry(intake, imd, stacker, signer, 1, 20e18, 7 days). Deploy a project P whose owner() returns the registry's address. P calls applyListing(P, \"Venue\", \"https://venue.example/src\", 50, address(registry)): accepted (expected: a revert refusing the registry as beneficiary). Deliver a signed yes (panel 15, quorum 11, agreed 11): P is listed with beneficiary == registry. Warp 7 days; challenger calls challenge(P, reason) paying 0.5 IMD fee + 20 IMD bond; deliver a signed yes. Actual: imd.balanceOf(registry) rises by 20e18 while bondOwed[registry] == 0 and no function can move it. Expected: the bond reaches a party that can claim it (bondOwed) or the beneficiary was refused at application. Second input: a listed project's beneficiary calls setBeneficiary(P, address(registry)); actual: accepted and emits BeneficiarySet; expected: revert. Run test/scratch/RegistrySelfBeneficiary.t.sol: both tests fail on the current code.","severity":"low","snippet":"            _payBond(p.beneficiary);","title":"A challenge bond paid to the registry itself as beneficiary is lost: no bondOwed entry, no way out"},{"citation":"resolved","description":"Recorded as accepted, per the brief: the beneficiary (or any wallet it controls) of a listed project may call challengeForBeneficiary on its own project once the cooldown has passed, paying 0.5 IMD per round; while the question is open every outsider's challenge reverts AskOpen (line 321), and when the panel defends the project the 20 IMD bond returns to the beneficiary itself (line 409), so each round costs only the fee. The registry re-judges the project under the full rules each round and a defended challenge does not restart challengeOpenAt, so no immunity is bought and the slot is held only until the panel answers (or a day, after which anyone may call expire). The owner accepted this as low; the judges of launches #1371, #1378, #1428 and #1463 reproduced and accepted it. No change to ProjectRegistry.sol is requested for it.","line":321,"path":"src/ProjectRegistry.sol","reproduction":"List project P with beneficiary B (signed yes). Warp past challengeOpenAt. B calls challengeForBeneficiary(P, \"ok\", B): accepted, pays 0.5 IMD fee and the 20 IMD bond. Outsider O calls challengeForBeneficiary(P, \"breaks rule\", B) while it is open: reverts AskOpen. Panel answers yes: B receives its 20 IMD bond back, P stays listed, challengeOpenAt unchanged, and O may now challenge. Net cost to B per round: 0.5 IMD; outsiders are delayed, never refused.","severity":"info","snippet":"        if (p.ask != Ask.None) revert AskOpen();","title":"Accepted design limit: a listed project's own beneficiary can hold its question slot by challenging itself"},{"citation":"resolved","description":"Read in full: src/ProjectRegistry.sol (709 lines) and src/oracle/OracleAttestation.sol (265 lines), launch.json, docs/panel-rules-v2.md, test/mocks/MockIntake.sol, test/Base.t.sol, the setup of test/RegistryBondOwed.t.sol, and the protected rehearsal test. Not reviewed: src/Stacker.sol (live at 0x0690...f4f0 since launch #1409, not in this manifest, never called by the registry) and the test doubles under test/trial. Could not be reached: the live Ethereum mainnet Intake v2, IMD and Stacker (no ETH_RPC_URL or SEPOLIA_RPC_URL in this environment), so the 12 fork tests, including the one that checks the real Intake's requests() tuple that expire relies on, and the 200,000-gas measurements against the real IMD were not re-run here; they rest on the brief's facts of 2026-10-12. Verified locally: forge test passes 232 of 232 offline tests (14 skipped: 12 fork, 2 Stacker-manifest); callback selectors onOracleResult = 0x510379c7 and onOracleFailure = 0xa7980e31 match the brief; the Attestation struct, type string and domain match the oracle-consumer reference (only the signature-check ordering differs: ECDSA first, then ERC-1271, which the conformance test accepts); runtime 23,295 bytes, under EIP-170, with no DELEGATECALL, CALLCODE or SELFDESTRUCT; no owner, proxy, initializer, pause, mint or seizure path; the constructor makes no external call; launch.json has exactly kind/contracts/notes, one contract, seven constructor words matching the brief's addresses and values, notes 1,538 characters; the version 3.1 trader rule in code matches docs/panel-rules-v2.md; each rule is under 512 characters and each question under 2,000 (existing tests). Entry points checked: applyListing (owner gate before any fee, AskOpen/AlreadyListed, text filter excludes quotes, backslashes and brackets), challenge/challengeForBeneficiary (listed, no open ask, cooldown, pinned beneficiary before fee), onOracleResult (Intake only, own open request, TooLate, signature in own domain, issuedAt after ask, panel 15/11, consume once, settle), onOracleFailure (Intake only, own request, clear and refund), expire (after a day or once the Intake completed it), claimBond, setBeneficiary (listed, no open ask, beneficiary only, one handoff per day). No reentrancy path: all value-moving functions are nonReentrant and the only external calls after state changes go to the Intake and the IMD token. The accounting invariant (balance = open bonds + bondOwed) holds except in the self-beneficiary case reported above.","line":53,"path":"src/ProjectRegistry.sol","reproduction":"Not a defect: the coverage statement the acceptance criteria ask for. Commands run: forge test --fuzz-runs 256 (232 passed, 0 failed, 14 skipped); cast sig for both callbacks; a scan of forge inspect deployedBytecode for opcodes 0xf4, 0xf2 and 0xff (none found).","severity":"info","snippet":"contract ProjectRegistry is OracleAttestationConsumer, ReentrancyGuard {","title":"Review scope and coverage: what was read, what was verified, what could not be reached"}],"hash":"d20c6ceff2e0c876d010d12c75f887d4b8aa2916e03cc11e8c9d6c4931b3a5ae","nodeId":"f8a274c3-66d4-4ff8-8da2-867341b9bedb","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. No source file was changed; the only new files are the findings file and the scratch test under test/scratch.\n\n**Outcome:** the registry as submitted is sound for launch. One low defect, one accepted design limit recorded as the brief asked, and a coverage statement.\n\n**Findings**\n\n- **Low, bond lost when the registry is its own beneficiary.** Both `applyListing` and `setBeneficiary` refuse only the zero address, so a project can name the registry's own address as beneficiary. A defended challenge then pays the 20 IMD bond to the registry itself. The self-transfer succeeds, so nothing is recorded in `bondOwed` and no function can ever move it. Reachable when a project's `owner()` returns the registry and the project applies for itself. The scratch test test/scratch/RegistrySelfBeneficiary.t.sol fails on the current code and is attached as proof. Minimal fix: reject `beneficiary == address(this)` in both functions, or have the bond payer treat its own address as a refused transfer.\n- **Info, accepted limit.** A listed project's beneficiary can hold the question slot by challenging itself at 0.5 IMD per round. Recorded as accepted per the brief, with no change requested.\n- **Info, scope and coverage.** States what was read and what could not be reached.\n\n**What I verified locally**\n\n- forge test passes all 232 offline tests, with 14 skipped (12 fork, 2 Stacker-manifest).\n- Callback selectors match the brief, the attestation struct and domain match the oracle-consumer reference, and the conformance test passes.\n- The runtime is 23,295 bytes with no DELEGATECALL, CALLCODE or SELFDESTRUCT. No owner, proxy, initializer, pause, mint or seizure path exists.\n- launch.json matches the brief: one contract, seven constructor words with the stated addresses and values, notes under 4,000 characters.\n- The version 3.1 trader rule in code matches docs/panel-rules-v2.md.\n\n**Not reached:** the live mainnet Intake v2, IMD and Stacker. No RPC URL is set here, so the fork tests and the 200,000-gas measurements rest on the brief's facts of 2026-10-12. src/Stacker.sol was not reviewed because it is not deployed by this launch and the registry never calls it.","treeHash":null,"usage":{"cachedInputTokens":1556019,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":34536,"runtime":"claude","turns":25,"wallClockMs":595987}},{"artifacts":[],"attempt":1,"bundleHash":"c451d839b72200bdc5fb70d290cce0aa0325d9d7602207c1dc3c0f7aa4add435","device":"6d41a24119881b34","findings":[],"hash":"d99b53dd64d31f05b0ae7899e9ee1824ceb96628d1e62d361cb80b285acc4466","nodeId":"8ca915e9-c734-4eff-9ef6-c126bf8ae373","outcome":"completed","summary":"Updated only `launch.json`. Preserved the approved mainnet constructor arguments and documented test run 6 plus the accepted self-challenge limit.\n\nValidation passed:\n- Manifest schema and constructor ABI checks\n- `forge build`\n- `forge test`: 239 passed, 0 failed; 12 fork tests and 2 Stacker checks skipped.","treeHash":"d65730cbd8bdabfb1f13769911cf048056b61ab9","usage":{"cachedInputTokens":397824,"inputTokens":46792,"model":"gpt-6-astra","outputTokens":4847,"runtime":"codex","turns":4,"wallClockMs":192701}}],"verification":[{"checks":[{"durationMs":14393,"exitCode":0,"name":"build","output":"Compiling 93 files with Solc 0.8.26\nSolc 0.8.26 finished in 14.27s\nCompiler run successful!\n","passed":true},{"durationMs":6592,"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 273.08µs (61.69µs CPU time)\n\nRan 5 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_firstCreditNeedsInitializationGas() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\n[SKIP] test_fork_readmeBudgetFundsColdFirstCredit() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 446.21µs (68.18µs CPU time)\n\nRan 5 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerValidCreditMatchesMainnetCandidate() (gas: 0)\n[SKIP] test_sepolia_mainnetCandidateRejectsLegacyUnreachableRecipients() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 398.09µs (59.80µs CPU time)\n\nRan 2 tests for test/MainnetLaunchRegression.t.sol:MainnetLaunchRegressionTest\n[SKIP] test_manifestCreate2WorksWithoutDependenciesOrInitialization() (gas: 0)\n[SKIP] test_manifestPinsExactlyOneMainnetStacker() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 2 skipped; finished in 390.97µs (221.69µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419613)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 852.87µs (702.57µs CPU time)\n\nRan 1 test for test/RegistryMainnetFork.t.sol:RegistryMainnetForkTest\n[SKIP] test_mainnet_ownerAppliesToTheRealIntake_listedThenDefended() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 1.87ms (28.10µs CPU time)\n\nRan 2 tests for test/RegistryPolicyRevision.t.sol:RegistryPolicyRevisionTest\n[PASS] test_applicationAndChallengeRequireResolvedTraderAndExcludeLpFees() (gas: 6829118)\n[PASS] test_lpRebateDefeatsGrossFeeFloor() (gas: 5991)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.17ms (1.33ms CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162585)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.42ms (146.17µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910632)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637955)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.47ms (856.70µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190510)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.27ms (170.18µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128213)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140179)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140262)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.87ms (222.25µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156227)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.01ms (136.48µs CPU time)\n\nRan 9 tests for test/TrialVenue.t.sol:TrialVenueTest\n[PASS] test_buyCreditsHalfTheFeeAndBurnsTheOtherHalf() (gas: 434566)\n[PASS] test_gasIsCheckedBeforeTheCredit() (gas: 124458)\n[PASS] test_invalidTradersNeverResolve() (gas: 65332)\n[PASS] test_ownerCanOnlySeedOnce() (gas: 56951)\n[PASS] test_pausedVaultPaysPlainImd() (gas: 305091)\n[PASS] test_registryReadsTheOwner() (gas: 17255)\n[PASS] test_routerCallerResolvesToItsActiveCaller() (gas: 784096)\n[PASS] test_sellCreditsHalfTheFeeAndBurnsTheOtherHalf() (gas: 588348)\n[PASS] test_unknownContractCallerGetsNoCashbackItIsBurned() (gas: 572622)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.09ms (3.85ms CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171507)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.32ms (134.01µs CPU time)\n\nRan 4 tests for test/RegistryCooldownBoundary.t.sol:RegistryCooldownBoundaryTest\n[PASS] test_challengeExactlyAtCooldown_succeeds() (gas: 6106573)\n[PASS] test_challengeOneSecondBeforeCooldown_reverts() (gas: 3201501)\n[PASS] test_constructor_rejectsCooldownAboveMax() (gas: 14194)\n[PASS] test_keptChallenge_doesNotRestartCooldown() (gas: 9279267)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.97ms (2.44ms CPU time)\n\nRan 9 tests for test/RegistryApplicantGate.t.sol:RegistryApplicantGateTest\n[PASS] test_anyoneMayStillChallengeAnOwnedProject() (gas: 6420742)\n[PASS] test_misbehavingOwnerReadsAsNone() (gas: 15582598)\n[PASS] test_noOwnerFunctionOpenToAnyone() (gas: 3089189)\n[PASS] test_ownerChangeMovesTheRight() (gas: 3436229)\n[PASS] test_ownerMayApply() (gas: 3320997)\n[PASS] test_projectItselfMayApply() (gas: 3381856)\n[PASS] test_renouncedOwnerOpenToAnyone() (gas: 3284007)\n[PASS] test_squatterCannotBlockTheTeam() (gas: 3550174)\n[PASS] test_strangerRefusedBeforePaying() (gas: 390876)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 7.62ms (6.75ms CPU time)\n\nRan 8 tests for test/RegistryBondOwed.t.sol:RegistryBondOwedTest\n[PASS] test_blockedBeneficiary_signedYes_defendsAndOwesBond() (gas: 1111540)\n[PASS] test_blockedChallenger_expireClearsAndOwesBond() (gas: 939032)\n[PASS] test_blockedChallenger_failureClearsAndOwesBond() (gas: 1232683)\n[PASS] test_blockedChallenger_signedNo_delistsAndOwesBond() (gas: 1219736)\n[PASS] test_claimBond_refusesZeroAddressAndNothingOwed() (gas: 67159)\n[PASS] test_falseReturningToken_owesBond() (gas: 1052745)\n[PASS] test_owedBondsAccumulate() (gas: 1421953)\n[PASS] test_unblocked_paysAtOnce() (gas: 950815)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 9.12ms (6.24ms CPU time)\n\nRan 6 tests for test/RegistrySelfBeneficiary.t.sol:RegistrySelfBeneficiaryTest\n[PASS] test_acceptedSelfChallengeHoldsSlotUntilAnswerWithoutNewCooldown() (gas: 9460831)\n[PASS] test_applicationRefusesRegistryBeforeFeeOrRequest() (gas: 171010)\n[PASS] test_contractBeneficiaryStillReceivesBondAndCanHandOff() (gas: 6434857)\n[PASS] test_handoffRefusesRegistryAndPreservesBondRecipient() (gas: 6367548)\n[PASS] test_registryOwnedProjectCannotApplyWithRegistryAsBeneficiary() (gas: 507127)\n[PASS] test_rejectedHandoffDoesNotConsumeDailyHandoff() (gas: 3287504)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 9.62ms (8.45ms CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181781)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13686)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69545)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64569)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 9.88ms (6.63ms CPU time)\n\nRan 1 test for test/RegistryMainnetLaunch.t.sol:RegistryMainnetLaunchTest\n[PASS] test_manifestDeploysOnlyRegistryOnEmptyMainnet() (gas: 14029904)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 19.09ms (17.93ms CPU time)\n\nRan 7 tests for test/TraderResolution.t.sol:TraderResolutionTest\n[PASS] test_directNoCodeSenderCanBeResolvedWithoutTxOrigin() (gas: 303966)\n[PASS] test_emptyHookDataResolvesActiveMsgSenderAndCannotBeSwept() (gas: 381420)\n[PASS] test_hookDataTakesPrecedenceAndSupportsContractWallets() (gas: 477363)\n[PASS] test_invalidHookDataPaysPlainImdToKnownCallerNeverInvalidRecipient() (gas: 882426)\n[PASS] test_legacyEmptyHookDataCreditsRouterAndAnyoneCanSweep() (gas: 433080)\n[PASS] test_pausedVaultPaysPlainImdToResolvedMsgSender() (gas: 301439)\n[PASS] test_unknownContractOrInvalidMsgSenderNeverBecomesTheRecipient() (gas: 522893)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 19.18ms (5.89ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25953)\n[PASS] test_launchManifest_knownShape() (gas: 25352)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8416607)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4294851)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 63.44ms (19.99ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 3106311, ~: 3106154)\nLogs:\n  Bound result 79840068081194201631\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 9334621)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 21881719)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 6210874)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9528279)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 281247)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6409682)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3221678)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4326584)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 345326)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 64.82ms (80.10ms CPU time)\n\nRan 5 tests for test/StackerAuditRegression.t.sol:StackerAuditRegressionTest\n[PASS] testFuzz_unreachableRecipientsRejectedBeforeAndAfterFirstCredit(uint256,bool) (runs: 256, μ: 1444496, ~: 1398295)\n[PASS] test_creditToImdTokenRevertsWithoutEffects() (gas: 362704)\n[PASS] test_creditToStackerRevertsWithoutEffects() (gas: 364669)\n[PASS] test_creditToVaultRevertsWithoutEffects() (gas: 364714)\n[PASS] test_zeroAmountStillRejectsUnreachableRecipients() (gas: 1092757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 156.13ms (155.48ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 394510, ~: 394359)\nLogs:\n  Bound result 1462494298126859\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367460, ~: 368936)\nLogs:\n  Bound result 2278129715653499598\n  Bound result 2278129715653499596\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430332, ~: 430416)\nLogs:\n  Bound result 499999999999999999999999\n  Bound result 2278129715653499598\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56148)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131325)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9375713)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378525)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370632)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383379)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508239)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617949)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374498)\n[PASS] test_credit_totalsAndEvent() (gas: 494195)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80135)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531891)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397571)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791662)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053849)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 231.71ms (329.44ms 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          | 248   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 238   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 230   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 280   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 252   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 267   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 267   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 57600\n  Bound result 91\n  Bound result 32\n  Bound result 65\n  Bound result 12869\n  Bound result 82\n  Bound result 118800\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18968878)\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 595.45ms (594.90ms 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     | 433   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 405   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 403   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 405   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 402   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 12615\n  Bound result 2\n  Bound result 2\n  Bound result 1589\n  Bound result 66\n  Bound result 64\n  Bound result 200000000000000000\n  Bound result 9\n  Bound result 246022358071945079066470\n  Bound result 112664352383932\n  Bound result 258436108235942076090\n  Bound result 6406\n  Bound result 752\n  Bound result 2463\n  Bound result 64\n  Bound result 110608516426806006147645\n  Bound result 5\n  Bound result 275990068137685379466999\n  Bound result 69\n  Bound result 6839\n  Bound result 999999999999999999997\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 675.27ms (671.36ms CPU time)\n\nRan 17 tests for test/StackerDependencyFailures.t.sol:StackerDependencyFailuresTest\n[PASS] testFuzz_shortAssetReturnFailsBeforeAnyApproval(uint8) (runs: 1000, μ: 674623, ~: 674352)\nLogs:\n  Bound result 9\n\n[PASS] testFuzz_shortDepositReturnIsAtomic(uint8,bool,uint96) (runs: 1000, μ: 904550, ~: 931057)\nLogs:\n  Bound result 28\n  Bound result 7764\n\n[PASS] testFuzz_tokenFailureIsAtomic(uint8,uint96,bool) (runs: 1000, μ: 842731, ~: 840448)\nLogs:\n  Bound result 2\n  Bound result 13030\n\n[PASS] testFuzz_vaultPullFailureIsAtomic(uint8,uint96,bool) (runs: 1000, μ: 877092, ~: 878052)\nLogs:\n  Bound result 1\n  Bound result 227\n\n[PASS] test_assetRevertDataBubblesAndDoesNotPrimeApproval() (gas: 670793)\n[PASS] test_dirtyAssetAddressIsRejectedBeforeAnyApproval() (gas: 673028)\n[PASS] test_falseApprovalRollsBackAndNextCreditRevalidates() (gas: 798887)\n[PASS] test_falsePullAfterMovingOneWeiRollsBackFirstApproval() (gas: 831737)\n[PASS] test_falseVaultPullRollsBackBothTransfersAndFirstApproval() (gas: 871106)\n[PASS] test_invalidBooleanApprovalRollsBack() (gas: 798824)\n[PASS] test_invalidBooleanPullRollsBack() (gas: 831884)\n[PASS] test_invalidBooleanVaultPullRollsBackEntireProjectBalance() (gas: 871365)\n[PASS] test_missingDepositReturnRollsBackActualMint() (gas: 936401)\n[PASS] test_oneByteShortDepositReturnRollsBackActualMintAndHold() (gas: 865107)\n[PASS] test_revertingApprovalRollsBackAndNextCreditRevalidates() (gas: 804553)\n[PASS] test_revertingPullBubblesErrorAfterAnEarlierCredit() (gas: 838492)\n[PASS] test_revertingVaultPullAfterEarlierCreditLeavesMatureSharesAlone() (gas: 867788)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 767.02ms (1.27s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6539352, ~: 6539487)\nLogs:\n  Bound result 5000\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3315890, ~: 3314072)\nLogs:\n  Bound result 5000\n\n[PASS] test_checksBeforeTheIntervalStillComeFirst() (gas: 6493598)\n[PASS] test_clockIsPerProject() (gas: 6503818)\n[PASS] test_expiredAndFailedQuestionsLeaveTheClockAlone() (gas: 9417371)\n[PASS] test_handoffEmitsEventAndStartsExactInterval() (gas: 3290917)\n[PASS] test_intervalRefusesAThirdWalletToo() (gas: 3333746)\n[PASS] test_relistingByApplicationNamesANewWalletWithoutAHandoff() (gas: 18821659)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 767.14ms (1.49s CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 358191, ~: 55898)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 394326, ~: 47867)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3531117)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3219851)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3229539)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3317268)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3227423)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 3117533)\n[PASS] test_apply_validation() (gas: 567226)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 6062321)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6362238)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 9363040)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 9339341)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 6314280)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6469424)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74067)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 6115895)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5990106)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3057732)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 6171710)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3319132)\n[PASS] test_yes_listsFromThisBlock() (gas: 3160454)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 767.07ms (54.21ms CPU time)\n\nRan 8 tests for test/StackerGas.t.sol:StackerGasTest\n[PASS] testFuzz_readmeLateFailurePaysOnceAndNextCreditWorks(uint96,bool,bool) (runs: 1000, μ: 3268131, ~: 3268017)\nLogs:\n  Bound result 5621289596893452\n\n[PASS] test_oldGasCapFailsRepeatedlyAndDoesNotPrimeVault() (gas: 600749)\n[PASS] test_readmeBudgetFundsColdFirstCredit() (gas: 359519)\n[PASS] test_readmeFallbackAfterFirstMintReturnsZeroShares() (gas: 3264309)\n[PASS] test_readmeFallbackAfterRepeatMintReverts() (gas: 3264412)\n[PASS] test_readmeFallbackHasGasEvenWhenCreditExhaustsItsBudget() (gas: 473042)\n[PASS] test_readmeFallbackPaysPlainImdWhenVaultFails() (gas: 272236)\n[PASS] test_readmeGasGuardRejectsLowEstimateBeforeFallback() (gas: 94010)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 797.89ms (799.04ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976883, ~: 976865)\nLogs:\n  Bound result 99999000000000000027189\n  Bound result 1123\n  Bound result 24585\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935777, ~: 2941251)\nLogs:\n  Bound result 324059536281642673\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598595)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117679)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937621)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738736)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925987)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 797.94ms (1.46s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6554665, ~: 6554617)\nLogs:\n  Bound result 1327\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6640455, ~: 6646682)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 5030200, ~: 6568873)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6433579, ~: 6433340)\nLogs:\n  Bound result 9\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3414922)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3405381)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9831731)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6413357)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3592763)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4190907)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10613885)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3405670)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6686933)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3529365)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9956450)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6561303)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6575234)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6558379)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3627102)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3537524)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 797.91ms (2.58s CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 9345362, ~: 9348335)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6340780, ~: 6346544)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 7327172, ~: 7327363)\nLogs:\n  Bound result 47\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3240073, ~: 3239786)\nLogs:\n  Bound result 17\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 6302462)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6764366)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 6302572)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6723080)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12674465)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3300977)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12666281)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6742710)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6415451)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6854511)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 9349350)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 6329990)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6390657)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 803.98ms (1.37s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3616581, ~: 3580779)\nLogs:\n  Bound result 6\n  Bound result 12\n  Bound result 80\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6784583, ~: 6721393)\nLogs:\n  Bound result 92\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3862252)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3504752)\n[PASS] test_challengeMaximumReason() (gas: 7118201)\n[PASS] test_challengeMinimumReason() (gas: 6643534)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53799580)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3750569)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 804.14ms (1.25s CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 234710, ~: 234498)\nLogs:\n  Bound result 670165921710573556416405\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1530538, ~: 1370410)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388834, ~: 388782)\nLogs:\n  Bound result 25518697540506526774\n  Bound result 17227996338015676038\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 739900, ~: 761962)\nLogs:\n  Bound result 80371205823896891864971\n  Bound result 88094456725350998825295\n  Bound result 5742953876583165\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 682578, ~: 689054)\nLogs:\n  Bound result 21350\n  Bound result 4049\n  Bound result 24000000000000000000000\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 488843, ~: 510490)\nLogs:\n  Bound result 8827460615043205235\n  Bound result 518697540506526774\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615815)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365250)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591245)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662927)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238919)\n[PASS] test_credit_oneWei() (gas: 361849)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468574)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326778)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 737091)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91175)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522405)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 806.05ms (3.53s 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        | 427   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 485   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 427   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 465   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 490   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 473   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 501   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 498   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 463   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 507   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 461   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 469   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 478   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 12166\n  Bound result 1359182279\n  Bound result 6\n  Bound result 3568704237663412027393\n  Bound result 5\n  Bound result 17015\n  Bound result 411000\n  Bound result 1\n  Bound result 9\n  Bound result 177000\n  Bound result 752813454244517249120\n  Bound result 3294\n  Bound result 201\n  Bound result 5000000000000000000000\n  Bound result 563550\n  Bound result 281\n  Bound result 15\n  Bound result 14473\n  Bound result 4934\n  Bound result 18343\n  Bound result 1300000\n  Bound result 75\n  Bound result 3000000000000000000\n  Bound result 2\n  Bound result 22444\n  Bound result 367\n  Bound result 26\n  Bound result 1049067454380413116867\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540803)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.16s (4.16s 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                  | 1790  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1793  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1832  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1774  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1857  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1858  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1815  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1816  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1849  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2138\n  Bound result 53\n  Bound result 12\n  Bound result 24\n  Bound result 4\n  Bound result 65056\n  Bound result 11\n  Bound result 79\n  Bound result 836282758\n  Bound result 170985\n  Bound result 1\n  Bound result 14987\n  Bound result 632\n  Bound result 36\n  Bound result 81\n  Bound result 50\n  Bound result 264337593543950305\n  Bound result 775646967661854546\n  Bound result 432821236853925990\n  Bound result 28\n  Bound result 6498\n  Bound result 18\n  Bound result 86218\n  Bound result 43\n  Bound result 33\n  Bound result 14936\n  Bound result 10583\n  Bound result 19920\n  Bound result 14755\n  Bound result 82597\n  Bound result 28\n  Bound result 184\n  Bound result 13\n  Bound result 295254489\n  Bound result 0\n  Bound result 12713\n  Bound result 45\n  Bound result 32\n  Bound result 25\n  Bound result 3\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 40458439)\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: 16504440)\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.22s (5.23s CPU time)\n\nRan 3 tests for test/StackerHoldInvariant.t.sol:StackerHoldInvariantTest\n[PASS]\nStackerHoldInvariantTest invariants:\n[PASS] invariant_balancesAndHistoricalCashbackAreConserved\n[PASS] invariant_holdFollowsSharesAndCannotBeClearedByTimestamp\n StackerHoldInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+----------------------+-------+---------+----------╮\n| Contract           | Selector             | Calls | Reverts | Discards |\n+========================================================================+\n| StackerHoldHandler | advance              | 2071  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | credit               | 2088  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | donate               | 1977  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | exit                 | 2044  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | probeRenouncedPowers | 2027  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | transferShares       | 2094  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | unauthorizedExit     | 2013  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | zeroAction           | 2070  | 0       | 0        |\n╰--------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4847\n  Bound result 1294\n  Bound result 7\n  Bound result 2376452954\n  Bound result 8173629657664079000533\n  Bound result 1294\n  Bound result 508832537444364260550\n  Bound result 0\n  Bound result 102292978034045001019\n  Bound result 1568\n  Bound result 8\n  Bound result 13027\n  Bound result 410000\n  Bound result 1\n  Bound result 1346\n  Bound result 5\n  Bound result 8487\n  Bound result 32421\n  Bound result 6104772617183011475831\n  Bound result 16223\n  Bound result 11764\n  Bound result 15951\n  Bound result 1\n  Bound result 6\n  Bound result 657392849\n  Bound result 758350005829470280582\n  Bound result 0\n  Bound result 2000000000000000000\n  Bound result 14751\n  Bound result 10000\n  Bound result 10000000000000000002\n  Bound result 6\n  Bound result 10667\n  Bound result 0\n  Bound result 9997999999999999954519\n\n[PASS] test_handlerExercisesHeldDelegatedAndMatureExits() (gas: 3851200)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000000000\n\n[PASS] test_handlerExercisesZeroSharesFailureBeforeInitialization() (gas: 2872846)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 10000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 6.46s (6.46s CPU time)\n\nRan 39 test suites in 6.46s (24.84s CPU time): 239 tests passed, 0 failed, 14 skipped (253 total tests)\n","passed":true},{"durationMs":84,"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\":5,\"ADAPTATION.md\":93,\"NEXT_SESSION.md\":73,\"README.md\":283,\"app.js\":2272,\"docs/data-api.md\":97,\"docs/design.md\":322,\"docs/explainer.html\":247,\"docs/history.md\":388,\"docs/listing.md\":97,\"docs/panel-rules-v2-rehearsal-body.json\":28,\"docs/panel-rules-v2.md\":88,\"docs/plea-handoff.md\":73,\"docs/plea-test-run-2.md\":34,\"favicon.svg\":11,\"foundry.toml\":26,\"index.html\":166,\"jobs/1-sepolia-launch.md\":23,\"jobs/10-sepolia-v4-launch.md\":13,\"jobs/11-sepolia-v5-launch.md\":13,\"jobs/12-mainnet-registry-launch.md\":13,\"jobs/13-sepolia-v6-launch.md\":13,\"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/10-sepolia-v4-launch.json\":31,\"jobs/requests/11-sepolia-v5-launch.json\":31,\"jobs/requests/12-mainnet-registry-launch.json\":31,\"jobs/requests/13-sepolia-v6-launch.json\":31,\"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\":47,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":713,\"src/Stacker.sol\":104,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1599,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":144,\"test/FactoryRehearsal.t.sol\":47,\"test/MAINNET_TEST_COVERAGE.md\":45,\"test/MainnetFork.t.sol\":141,\"test/MainnetLaunchRegression.t.sol\":99,\"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/RegistryApplicantGate.t.sol\":166,\"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/RegistryMainnetFork.t.sol\":110,\"test/RegistryMainnetLaunch.t.sol\":86,\"test/RegistryPolicyRevision.t.sol\":50,\"test/RegistryRevisionRegression.t.sol\":418,\"test/RegistrySelfBeneficiary.t.sol\":148,\"test/RegistrySepoliaFork.t.sol\":113,\"test/SepoliaFork.t.sol\":141,\"test/Stacker.t.sol\":423,\"test/StackerAuditRegression.t.sol\":99,\"test/StackerDependencyFailures.t.sol\":288,\"test/StackerEdges.t.sol\":391,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerGas.t.sol\":186,\"test/StackerHoldInvariant.t.sol\":346,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/TraderResolution.t.sol\":229,\"test/TrialVenue.t.sol\":147,\"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,\"test/trial/TrialVenue.sol\":222,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":35,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":27,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":180,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50,\"tools/site-check/trial.mjs\":156,\"tools/snapshot/build.mjs\":291,\"tools/snapshot/chains.json\":29,\"tools/snapshot/test.sh\":57},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1626,"exitCode":0,"name":"slither","output":"[medium/medium] unused-return at src/oracle/OracleAttestation.sol:171: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/oracle/OracleAttestation.sol#171-189) ignores return value by (recovered,err,None) = ECDSA.tryRecover(digest,signature) (src/oracle/OracleAttestation.sol#184)\n[medium/medium] unused-return at src/ProjectRegistry.sol:442: ProjectRegistry.expire(address) (src/ProjectRegistry.sol#442-451) ignores return value by (None,None,None,completed) = intake.requests(intakeId) (src/ProjectRegistry.sol#447)\n[low/medium] reentrancy-benign at src/ProjectRegistry.sol:344: Reentrancy in ProjectRegistry._ask(address,ProjectRegistry.Project,string,uint256) (src/ProjectRegistry.sol#344-362):\n[low/medium] reentrancy-benign at src/Stacker.sol:74: Reentrancy in Stacker.credit(address,uint256) (src/Stacker.sol#74-103):\n[low/medium] timestamp at src/ProjectRegistry.sol:368: ProjectRegistry.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/ProjectRegistry.sol#368-420) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:317: ProjectRegistry._challenge(address,string,address) (src/ProjectRegistry.sol#317-335) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:516: ProjectRegistry.setBeneficiary(address,address) (src/ProjectRegistry.sol#516-531) uses timestamp for comparisons\n[low/medium] timestamp at src/oracle/OracleAttestation.sol:171: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/oracle/OracleAttestation.sol#171-189) uses timestamp for comparisons\n[low/medium] timestamp at src/ProjectRegistry.sol:442: ProjectRegistry.expire(address) (src/ProjectRegistry.sol#442-451) uses timestamp for comparisons","passed":true},{"durationMs":436,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/Stacker.sol:86: Reentrancy: State change after external call (2 places)\n[low] internal-function-used-once at src/oracle/OracleAttestation.sol:209: Internal Function Used Only Once\n[low] large-numeric-literal at src/ProjectRegistry.sol:100: Large Numeric Literal\n[low] require-revert-in-loop at src/ProjectRegistry.sol:706: Loop Contains `require`/`revert`\n[low] uninitialized-local-variable at src/ProjectRegistry.sol:706: Uninitialized Local Variable\n[low] unsafe-erc20-operation at src/ProjectRegistry.sol:482: Unsafe ERC20 Operation\n[low] unused-public-function at src/ProjectRegistry.sol:536: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"28231a9f62647a61b1e412337713f326b134e8c59cab22bc497c2316f082e652","verifiedTreeHash":"042d90bcacf9a1d38b8f9f9db2178a52ccdf8421","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":14292,"exitCode":0,"name":"build","output":"Compiling 95 files with Solc 0.8.26\nSolc 0.8.26 finished in 14.17s\nCompiler run successful!\n","passed":true},{"durationMs":6620,"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 339.34µs (66.56µs CPU time)\n\nRan 2 tests for test/MainnetLaunchRegression.t.sol:MainnetLaunchRegressionTest\n[SKIP] test_manifestCreate2WorksWithoutDependenciesOrInitialization() (gas: 0)\n[SKIP] test_manifestPinsExactlyOneMainnetStacker() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 2 skipped; finished in 384.34µs (218.96µs CPU time)\n\nRan 5 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerValidCreditMatchesMainnetCandidate() (gas: 0)\n[SKIP] test_sepolia_mainnetCandidateRejectsLegacyUnreachableRecipients() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 429.51µs (63.25µs CPU time)\n\nRan 1 test for test/RegistryMainnetFork.t.sol:RegistryMainnetForkTest\n[SKIP] test_mainnet_ownerAppliesToTheRealIntake_listedThenDefended() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 378.14µs (31.75µs CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419613)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 786.98µs (610.86µs CPU time)\n\nRan 5 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_firstCreditNeedsInitializationGas() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\n[SKIP] test_fork_readmeBudgetFundsColdFirstCredit() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 1.47ms (227.18µs CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910632)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637955)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.36ms (1.04ms CPU time)\n\nRan 7 tests for test/TraderResolution.t.sol:TraderResolutionTest\n[PASS] test_directNoCodeSenderCanBeResolvedWithoutTxOrigin() (gas: 303966)\n[PASS] test_emptyHookDataResolvesActiveMsgSenderAndCannotBeSwept() (gas: 381420)\n[PASS] test_hookDataTakesPrecedenceAndSupportsContractWallets() (gas: 477363)\n[PASS] test_invalidHookDataPaysPlainImdToKnownCallerNeverInvalidRecipient() (gas: 882426)\n[PASS] test_legacyEmptyHookDataCreditsRouterAndAnyoneCanSweep() (gas: 433080)\n[PASS] test_pausedVaultPaysPlainImdToResolvedMsgSender() (gas: 301439)\n[PASS] test_unknownContractOrInvalidMsgSenderNeverBecomesTheRecipient() (gas: 522893)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.24ms (1.23ms CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162585)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.27ms (158.08µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190510)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.36ms (168.46µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171507)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.35ms (210.17µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128213)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140179)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140262)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.44ms (232.48µs CPU time)\n\nRan 2 tests for test/RegistryPolicyRevision.t.sol:RegistryPolicyRevisionTest\n[PASS] test_applicationAndChallengeRequireResolvedTraderAndExcludeLpFees() (gas: 6829118)\n[PASS] test_lpRebateDefeatsGrossFeeFloor() (gas: 5991)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.17ms (1.38ms CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156227)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.48ms (181.73µs CPU time)\n\nRan 5 tests for test/RegistryBondClaimAtomicity.t.sol:RegistryBondClaimAtomicityTest\n[PASS] test_falseReturnAfterTransferRollsBackClaimAndCanRetry() (gas: 504828)\n[PASS] test_noReturnTokenCanPayAClaimWithoutLeavingPhantomDebt() (gas: 239234)\n[PASS] test_noReturnTokenCanSettleTheOtherBondWithoutRecordingDebt() (gas: 344624)\n[PASS] test_reentrantRecipientCannotClaimTwiceOrConsumeAnotherBond() (gas: 385682)\n[PASS] test_revertAfterTransferRollsBackClaimAndCanRetry() (gas: 504294)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 4.28ms (1.07ms CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181781)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13686)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69545)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64569)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 5.10ms (1.52ms CPU time)\n\nRan 6 tests for test/RegistrySelfBeneficiary.t.sol:RegistrySelfBeneficiaryTest\n[PASS] test_acceptedSelfChallengeHoldsSlotUntilAnswerWithoutNewCooldown() (gas: 9460831)\n[PASS] test_applicationRefusesRegistryBeforeFeeOrRequest() (gas: 171010)\n[PASS] test_contractBeneficiaryStillReceivesBondAndCanHandOff() (gas: 6434857)\n[PASS] test_handoffRefusesRegistryAndPreservesBondRecipient() (gas: 6367548)\n[PASS] test_registryOwnedProjectCannotApplyWithRegistryAsBeneficiary() (gas: 507127)\n[PASS] test_rejectedHandoffDoesNotConsumeDailyHandoff() (gas: 3287504)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 6.35ms (5.35ms CPU time)\n\nRan 4 tests for test/RegistryCooldownBoundary.t.sol:RegistryCooldownBoundaryTest\n[PASS] test_challengeExactlyAtCooldown_succeeds() (gas: 6106573)\n[PASS] test_challengeOneSecondBeforeCooldown_reverts() (gas: 3201501)\n[PASS] test_constructor_rejectsCooldownAboveMax() (gas: 14194)\n[PASS] test_keptChallenge_doesNotRestartCooldown() (gas: 9279267)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.63ms (2.91ms CPU time)\n\nRan 9 tests for test/RegistryApplicantGate.t.sol:RegistryApplicantGateTest\n[PASS] test_anyoneMayStillChallengeAnOwnedProject() (gas: 6420742)\n[PASS] test_misbehavingOwnerReadsAsNone() (gas: 15582598)\n[PASS] test_noOwnerFunctionOpenToAnyone() (gas: 3089189)\n[PASS] test_ownerChangeMovesTheRight() (gas: 3436229)\n[PASS] test_ownerMayApply() (gas: 3320997)\n[PASS] test_projectItselfMayApply() (gas: 3381856)\n[PASS] test_renouncedOwnerOpenToAnyone() (gas: 3284007)\n[PASS] test_squatterCannotBlockTheTeam() (gas: 3550174)\n[PASS] test_strangerRefusedBeforePaying() (gas: 390876)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 9.23ms (8.14ms CPU time)\n\nRan 1 test for test/RegistryMainnetLaunch.t.sol:RegistryMainnetLaunchTest\n[PASS] test_manifestDeploysOnlyRegistryOnEmptyMainnet() (gas: 14029904)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 14.40ms (14.31ms CPU time)\n\nRan 9 tests for test/TrialVenue.t.sol:TrialVenueTest\n[PASS] test_buyCreditsHalfTheFeeAndBurnsTheOtherHalf() (gas: 434566)\n[PASS] test_gasIsCheckedBeforeTheCredit() (gas: 124458)\n[PASS] test_invalidTradersNeverResolve() (gas: 65332)\n[PASS] test_ownerCanOnlySeedOnce() (gas: 56951)\n[PASS] test_pausedVaultPaysPlainImd() (gas: 305091)\n[PASS] test_registryReadsTheOwner() (gas: 17255)\n[PASS] test_routerCallerResolvesToItsActiveCaller() (gas: 784096)\n[PASS] test_sellCreditsHalfTheFeeAndBurnsTheOtherHalf() (gas: 588348)\n[PASS] test_unknownContractCallerGetsNoCashbackItIsBurned() (gas: 572622)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 19.81ms (1.90ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25953)\n[PASS] test_launchManifest_knownShape() (gas: 25352)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8416607)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4294851)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 25.51ms (28.61ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 345619, ~: 55872)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 348132, ~: 47867)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3531117)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3219851)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3229539)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3317268)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3227423)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 3117533)\n[PASS] test_apply_validation() (gas: 567226)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 6062321)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6362238)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 9363040)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 9339341)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 6314280)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6469424)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74067)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 6115895)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5990106)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3057732)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 6171710)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3319132)\n[PASS] test_yes_listsFromThisBlock() (gas: 3160454)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 96.51ms (87.08ms CPU time)\n\nRan 8 tests for test/RegistryBondOwed.t.sol:RegistryBondOwedTest\n[PASS] test_blockedBeneficiary_signedYes_defendsAndOwesBond() (gas: 1111540)\n[PASS] test_blockedChallenger_expireClearsAndOwesBond() (gas: 939032)\n[PASS] test_blockedChallenger_failureClearsAndOwesBond() (gas: 1232683)\n[PASS] test_blockedChallenger_signedNo_delistsAndOwesBond() (gas: 1219736)\n[PASS] test_claimBond_refusesZeroAddressAndNothingOwed() (gas: 67159)\n[PASS] test_falseReturningToken_owesBond() (gas: 1052745)\n[PASS] test_owedBondsAccumulate() (gas: 1421953)\n[PASS] test_unblocked_paysAtOnce() (gas: 950815)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 114.69ms (9.01ms CPU time)\n\nRan 5 tests for test/StackerAuditRegression.t.sol:StackerAuditRegressionTest\n[PASS] testFuzz_unreachableRecipientsRejectedBeforeAndAfterFirstCredit(uint256,bool) (runs: 256, μ: 1447653, ~: 1398331)\n[PASS] test_creditToImdTokenRevertsWithoutEffects() (gas: 362704)\n[PASS] test_creditToStackerRevertsWithoutEffects() (gas: 364669)\n[PASS] test_creditToVaultRevertsWithoutEffects() (gas: 364714)\n[PASS] test_zeroAmountStillRejectsUnreachableRecipients() (gas: 1092757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 148.79ms (147.83ms CPU time)\n\nRan 8 tests for test/StackerGas.t.sol:StackerGasTest\n[PASS] testFuzz_readmeLateFailurePaysOnceAndNextCreditWorks(uint96,bool,bool) (runs: 1000, μ: 3268149, ~: 3268041)\nLogs:\n  Bound result 7548461135486951436409\n\n[PASS] test_oldGasCapFailsRepeatedlyAndDoesNotPrimeVault() (gas: 600749)\n[PASS] test_readmeBudgetFundsColdFirstCredit() (gas: 359519)\n[PASS] test_readmeFallbackAfterFirstMintReturnsZeroShares() (gas: 3264309)\n[PASS] test_readmeFallbackAfterRepeatMintReverts() (gas: 3264412)\n[PASS] test_readmeFallbackHasGasEvenWhenCreditExhaustsItsBudget() (gas: 473042)\n[PASS] test_readmeFallbackPaysPlainImdWhenVaultFails() (gas: 272236)\n[PASS] test_readmeGasGuardRejectsLowEstimateBeforeFallback() (gas: 94010)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 570.49ms (569.99ms 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     | 410   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 430   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 408   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 417   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 383   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5\n  Bound result 6\n  Bound result 255597577904709147480986\n  Bound result 12867\n  Bound result 7\n  Bound result 10\n  Bound result 4\n  Bound result 280\n  Bound result 32421\n  Bound result 1700000000\n  Bound result 3698\n  Bound result 1000000\n  Bound result 1\n  Bound result 11662\n  Bound result 1\n  Bound result 9\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 585.15ms (581.39ms 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            | 252   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 246   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 275   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 263   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 249   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 264   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 243   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 256   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 301\n  Bound result 49\n  Bound result 30976\n  Bound result 99\n  Bound result 157395\n  Bound result 48\n  Bound result 71\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18968878)\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 666.11ms (666.98ms CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976883, ~: 976877)\nLogs:\n  Bound result 39149407497516682704255\n  Bound result 32231\n  Bound result 49617827228060308616\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935400, ~: 2930480)\nLogs:\n  Bound result 23286718393944496003338\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598595)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117679)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937621)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738736)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925987)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 672.74ms (674.85ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 3106321, ~: 3106154)\nLogs:\n  Bound result 5066936979\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 9334621)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 21881719)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 6210874)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9528279)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 281247)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6409682)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3221678)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4326584)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 345326)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 682.66ms (706.75ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 394514, ~: 394353)\nLogs:\n  Bound result 999999999999999999999998\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367688, ~: 368926)\nLogs:\n  Bound result 733682124787549515472961\n  Bound result 325862860683846859789544\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430356, ~: 430428)\nLogs:\n  Bound result 446411853644848602726703\n  Bound result 233682124787549515472961\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56148)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131325)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9375713)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378525)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370632)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383379)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508239)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617949)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374498)\n[PASS] test_credit_totalsAndEvent() (gas: 494195)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80135)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531891)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397571)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791662)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053849)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 690.08ms (561.23ms CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 234709, ~: 234486)\nLogs:\n  Bound result 826808118606626037405559\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1507678, ~: 1162876)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388843, ~: 388782)\nLogs:\n  Bound result 4050\n  Bound result 2000\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 743620, ~: 762010)\nLogs:\n  Bound result 11155111\n  Bound result 177000\n  Bound result 2790\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 683310, ~: 689084)\nLogs:\n  Bound result 75691636683580587324491\n  Bound result 2132267007463\n  Bound result 63041276679859044439176\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 490515, ~: 510478)\nLogs:\n  Bound result 2763849342489073771\n  Bound result 217106528637773630\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615815)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365250)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591245)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662927)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238919)\n[PASS] test_credit_oneWei() (gas: 361849)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468574)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326778)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 737091)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91175)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522405)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 690.13ms (2.13s CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 9345087, ~: 9341940)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6340248, ~: 6334146)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 7327174, ~: 7327363)\nLogs:\n  Bound result 64\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3240081, ~: 3239786)\nLogs:\n  Bound result 18302847\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 6302462)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6764366)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 6302572)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6723080)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12674465)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3300977)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12666281)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6742710)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6415451)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6854511)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 9349350)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 6329990)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6390657)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 717.98ms (1.54s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3619743, ~: 3580937)\nLogs:\n  Bound result 1\n  Bound result 15\n  Bound result 97\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6785752, ~: 6725827)\nLogs:\n  Bound result 2\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3862252)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3504752)\n[PASS] test_challengeMaximumReason() (gas: 7118201)\n[PASS] test_challengeMinimumReason() (gas: 6643534)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53799580)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3750569)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 718.05ms (1.45s CPU time)\n\nRan 17 tests for test/StackerDependencyFailures.t.sol:StackerDependencyFailuresTest\n[PASS] testFuzz_shortAssetReturnFailsBeforeAnyApproval(uint8) (runs: 1000, μ: 674644, ~: 674352)\nLogs:\n  Bound result 15\n\n[PASS] testFuzz_shortDepositReturnIsAtomic(uint8,bool,uint96) (runs: 1000, μ: 902793, ~: 884905)\nLogs:\n  Bound result 29\n  Bound result 12514264337593543950333\n\n[PASS] testFuzz_tokenFailureIsAtomic(uint8,uint96,bool) (runs: 1000, μ: 842917, ~: 845418)\nLogs:\n  Bound result 1\n  Bound result 4219698755659827\n\n[PASS] testFuzz_vaultPullFailureIsAtomic(uint8,uint96,bool) (runs: 1000, μ: 877030, ~: 876271)\nLogs:\n  Bound result 3\n  Bound result 45\n\n[PASS] test_assetRevertDataBubblesAndDoesNotPrimeApproval() (gas: 670793)\n[PASS] test_dirtyAssetAddressIsRejectedBeforeAnyApproval() (gas: 673028)\n[PASS] test_falseApprovalRollsBackAndNextCreditRevalidates() (gas: 798887)\n[PASS] test_falsePullAfterMovingOneWeiRollsBackFirstApproval() (gas: 831737)\n[PASS] test_falseVaultPullRollsBackBothTransfersAndFirstApproval() (gas: 871106)\n[PASS] test_invalidBooleanApprovalRollsBack() (gas: 798824)\n[PASS] test_invalidBooleanPullRollsBack() (gas: 831884)\n[PASS] test_invalidBooleanVaultPullRollsBackEntireProjectBalance() (gas: 871365)\n[PASS] test_missingDepositReturnRollsBackActualMint() (gas: 936401)\n[PASS] test_oneByteShortDepositReturnRollsBackActualMintAndHold() (gas: 865107)\n[PASS] test_revertingApprovalRollsBackAndNextCreditRevalidates() (gas: 804553)\n[PASS] test_revertingPullBubblesErrorAfterAnEarlierCredit() (gas: 838492)\n[PASS] test_revertingVaultPullAfterEarlierCreditLeavesMatureSharesAlone() (gas: 867788)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 706.47ms (937.30ms CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6539344, ~: 6539487)\nLogs:\n  Bound result 8656\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3316227, ~: 3314072)\nLogs:\n  Bound result 80369\n\n[PASS] test_checksBeforeTheIntervalStillComeFirst() (gas: 6493598)\n[PASS] test_clockIsPerProject() (gas: 6503818)\n[PASS] test_expiredAndFailedQuestionsLeaveTheClockAlone() (gas: 9417371)\n[PASS] test_handoffEmitsEventAndStartsExactInterval() (gas: 3290917)\n[PASS] test_intervalRefusesAThirdWalletToo() (gas: 3333746)\n[PASS] test_relistingByApplicationNamesANewWalletWithoutAHandoff() (gas: 18821659)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 718.19ms (1.26s CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6554669, ~: 6554617)\nLogs:\n  Bound result 33155355678974309385501550847368317395806222172477163215917261549657439693927\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6638303, ~: 6646149)\nLogs:\n  Bound result 0\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 5080311, ~: 6568873)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6433615, ~: 6433340)\nLogs:\n  Bound result 11\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3414922)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3405381)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9831731)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6413357)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3592763)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4190907)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10613885)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3405670)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6686933)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3529365)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9956450)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6561303)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6575234)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6558379)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3627102)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3537524)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 718.26ms (2.62s 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        | 468   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 502   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 475   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 475   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 441   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 439   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 472   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 461   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 447   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 478   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 471   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 508   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 507   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6844\n  Bound result 10000\n  Bound result 32\n  Bound result 10\n  Bound result 100\n  Bound result 172800\n  Bound result 4420344838293130505600\n  Bound result 127\n  Bound result 106740194337880139761\n  Bound result 6091009117539529338\n  Bound result 8273\n  Bound result 2\n  Bound result 6784247067953537247501\n  Bound result 3259\n  Bound result 11155111\n  Bound result 15934\n  Bound result 10289059577467858275961\n  Bound result 17745\n  Bound result 500000000000000000\n  Bound result 18329\n  Bound result 2000000000000000000\n  Bound result 7000000000000000000\n  Bound result 2\n  Bound result 756896655670665045581\n  Bound result 1761649582\n  Bound result 8\n  Bound result 96590067909647712\n  Bound result 6211\n  Bound result 10\n  Bound result 2628\n  Bound result 1110259864725\n  Bound result 4573669666283595493962\n  Bound result 4\n  Bound result 1716\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540803)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.18s (4.18s CPU time)\n\nRan 3 tests for test/RegistryDeferredBondInvariant.t.sol:RegistryDeferredBondInvariantTest\n[PASS]\nRegistryDeferredBondInvariantTest invariants:\n[PASS] invariant_deferredClaimsDoNotChangeQuestionsOrImmunity\n[PASS] invariant_liveBondsAndDeferredClaimsRemainFullyBacked\n RegistryDeferredBondInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+---------------+-------+---------+----------╮\n| Contract            | Selector      | Calls | Reverts | Discards |\n+==================================================================+\n| DeferredBondHandler | advance       | 2003  | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| DeferredBondHandler | claim         | 2054  | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| DeferredBondHandler | donate        | 2068  | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| DeferredBondHandler | handoff       | 2015  | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| DeferredBondHandler | openChallenge | 2110  | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| DeferredBondHandler | paymentPolicy | 2079  | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| DeferredBondHandler | replayFailure | 2054  | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| DeferredBondHandler | resolve       | 2001  | 0       | 0        |\n╰---------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 184746855926320845\n  Bound result 18\n  Bound result 0\n  Bound result 3488\n  Bound result 1\n  Bound result 407008\n  Bound result 11726\n  Bound result 479092\n  Bound result 12891\n  Bound result 701406687\n  Bound result 385874\n  Bound result 4\n  Bound result 10762\n  Bound result 1\n  Bound result 8433\n  Bound result 17754\n  Bound result 3276341860\n  Bound result 2\n  Bound result 5\n  Bound result 1\n  Bound result 5516\n  Bound result 535450\n  Bound result 2\n  Bound result 1016\n  Bound result 5\n\n[PASS] test_accumulatedClaimsCannotSpendOtherProjectsOpenBonds() (gas: 2571595)\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 5\n  Bound result 5\n\n[PASS] test_handlerExercisesEverySettlementAndRefundRecipient() (gas: 15326707)\nLogs:\n  Bound result 0\n  Bound result 1\n  Bound result 2\n  Bound result 3\n  Bound result 4\n  Bound result 5\n  Bound result 172800\n  Bound result 0\n  Bound result 1\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.32s (4.31s 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                  | 1798  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1807  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1876  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1830  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1804  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1860  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1821  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1734  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1854  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 31\n  Bound result 95\n  Bound result 18034\n  Bound result 15943\n  Bound result 47\n  Bound result 993949379993476725\n  Bound result 83\n  Bound result 19596\n  Bound result 1\n  Bound result 15\n  Bound result 24211\n  Bound result 1071981162278908401\n  Bound result 1287\n  Bound result 1056\n  Bound result 5277\n  Bound result 6544\n  Bound result 26\n  Bound result 20981253944\n  Bound result 91\n  Bound result 1658670658620854546\n  Bound result 3\n  Bound result 8999\n  Bound result 63\n  Bound result 30000\n  Bound result 59\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 40458439)\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: 16504440)\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.22s (5.23s CPU time)\n\nRan 3 tests for test/StackerHoldInvariant.t.sol:StackerHoldInvariantTest\n[PASS]\nStackerHoldInvariantTest invariants:\n[PASS] invariant_balancesAndHistoricalCashbackAreConserved\n[PASS] invariant_holdFollowsSharesAndCannotBeClearedByTimestamp\n StackerHoldInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+----------------------+-------+---------+----------╮\n| Contract           | Selector             | Calls | Reverts | Discards |\n+========================================================================+\n| StackerHoldHandler | advance              | 2048  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | credit               | 2068  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | donate               | 2020  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | exit                 | 2045  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | probeRenouncedPowers | 2104  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | transferShares       | 1963  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | unauthorizedExit     | 2085  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | zeroAction           | 2051  | 0       | 0        |\n╰--------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 719206528\n  Bound result 96\n  Bound result 6309380974794374906315\n  Bound result 4\n  Bound result 7376\n  Bound result 258\n  Bound result 41906179\n  Bound result 6203\n  Bound result 5\n  Bound result 682069432216768\n  Bound result 8\n  Bound result 8\n  Bound result 2338296719286746008407\n  Bound result 800000000000000000\n  Bound result 2043631732643947490310285952\n  Bound result 8485\n  Bound result 10\n  Bound result 10\n  Bound result 1295\n  Bound result 2827\n  Bound result 2\n  Bound result 17\n  Bound result 6\n  Bound result 8110\n  Bound result 2699\n  Bound result 376\n  Bound result 3952968998802107979890\n  Bound result 3024572530003952245116\n  Bound result 13\n  Bound result 6109\n  Bound result 2\n  Bound result 9\n  Bound result 7\n  Bound result 1294\n  Bound result 6\n  Bound result 1687044374\n\n[PASS] test_handlerExercisesHeldDelegatedAndMatureExits() (gas: 3851200)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000000000\n\n[PASS] test_handlerExercisesZeroSharesFailureBeforeInitialization() (gas: 2872846)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 10000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 6.50s (6.50s CPU time)\n\nRan 41 test suites in 6.51s (28.82s CPU time): 247 tests passed, 0 failed, 14 skipped (261 total tests)\n","passed":true},{"durationMs":84,"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\":5,\"ADAPTATION.md\":93,\"NEXT_SESSION.md\":73,\"README.md\":283,\"app.js\":2272,\"docs/data-api.md\":97,\"docs/design.md\":322,\"docs/explainer.html\":247,\"docs/history.md\":388,\"docs/listing.md\":97,\"docs/panel-rules-v2-rehearsal-body.json\":28,\"docs/panel-rules-v2.md\":88,\"docs/plea-handoff.md\":73,\"docs/plea-test-run-2.md\":34,\"favicon.svg\":11,\"foundry.toml\":26,\"index.html\":166,\"jobs/1-sepolia-launch.md\":23,\"jobs/10-sepolia-v4-launch.md\":13,\"jobs/11-sepolia-v5-launch.md\":13,\"jobs/12-mainnet-registry-launch.md\":13,\"jobs/13-sepolia-v6-launch.md\":13,\"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/10-sepolia-v4-launch.json\":31,\"jobs/requests/11-sepolia-v5-launch.json\":31,\"jobs/requests/12-mainnet-registry-launch.json\":31,\"jobs/requests/13-sepolia-v6-launch.json\":31,\"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\":47,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":713,\"src/Stacker.sol\":104,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1599,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":144,\"test/FactoryRehearsal.t.sol\":47,\"test/MAINNET_TEST_COVERAGE.md\":45,\"test/MainnetFork.t.sol\":141,\"test/MainnetLaunchRegression.t.sol\":99,\"test/OracleConsumerConformance.t.sol\":140,\"test/ProjectRegistry.t.sol\":596,\"test/ProjectRegistryInvariant.t.sol\":238,\"test/REGISTRY_DEFERRED_BOND_COVERAGE.md\":54,\"test/RegistryAccountingInvariant.t.sol\":552,\"test/RegistryAdversarial.t.sol\":446,\"test/RegistryApplicantGate.t.sol\":166,\"test/RegistryAuditRegression.t.sol\":157,\"test/RegistryBodyProperties.t.sol\":224,\"test/RegistryBondClaimAtomicity.t.sol\":225,\"test/RegistryBondOwed.t.sol\":290,\"test/RegistryCallbackGas.t.sol\":111,\"test/RegistryCooldownBoundary.t.sol\":44,\"test/RegistryDeferredBondInvariant.t.sol\":440,\"test/RegistryHandoffInterval.t.sol\":235,\"test/RegistryMainnetFork.t.sol\":110,\"test/RegistryMainnetLaunch.t.sol\":86,\"test/RegistryPolicyRevision.t.sol\":50,\"test/RegistryRevisionRegression.t.sol\":418,\"test/RegistrySelfBeneficiary.t.sol\":148,\"test/RegistrySepoliaFork.t.sol\":113,\"test/SepoliaFork.t.sol\":141,\"test/Stacker.t.sol\":423,\"test/StackerAuditRegression.t.sol\":99,\"test/StackerDependencyFailures.t.sol\":288,\"test/StackerEdges.t.sol\":391,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerGas.t.sol\":186,\"test/StackerHoldInvariant.t.sol\":346,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/TraderResolution.t.sol\":229,\"test/TrialVenue.t.sol\":147,\"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,\"test/trial/TrialVenue.sol\":222,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":35,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":27,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":180,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50,\"tools/site-check/trial.mjs\":156,\"tools/snapshot/build.mjs\":291,\"tools/snapshot/chains.json\":29,\"tools/snapshot/test.sh\":57},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"aed233163b57c06c074e97094ded1bae782afcd543ba0cab14e9165b9ba83963","verifiedTreeHash":"804e68f8fab6ad9384ba8f12b50478f2897afd2d","verifierVersion":"0.1.0+327e1e9f"},{"checks":[{"durationMs":13797,"exitCode":0,"name":"build","output":"Compiling 93 files with Solc 0.8.26\nSolc 0.8.26 finished in 13.68s\nCompiler run successful!\n","passed":true},{"durationMs":6537,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/RegistrySepoliaFork.t.sol:RegistrySepoliaForkTest\n[SKIP] test_sepolia_applyPaysTheRealIntake_thenAnswerLists() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 1.11ms (552.44µs CPU time)\n\nRan 2 tests for test/MainnetLaunchRegression.t.sol:MainnetLaunchRegressionTest\n[SKIP] test_manifestCreate2WorksWithoutDependenciesOrInitialization() (gas: 0)\n[SKIP] test_manifestPinsExactlyOneMainnetStacker() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 2 skipped; finished in 1.26ms (1.09ms CPU time)\n\nRan 1 test for test/FactoryRehearsal.t.sol:FactoryRehearsalTest\n[PASS] test_sepoliaFactoryDeploysBothInOrderOnAnEmptyChain() (gas: 419613)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.57ms (1.43ms CPU time)\n\nRan 5 tests for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP] test_fork_creditNewThenRepeatTrader() (gas: 0)\n[SKIP] test_fork_firstCreditNeedsInitializationGas() (gas: 0)\n[SKIP] test_fork_liveFacts() (gas: 0)\n[SKIP] test_fork_oneBlockHoldThenRedeem() (gas: 0)\n[SKIP] test_fork_readmeBudgetFundsColdFirstCredit() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 3.15ms (52.38µs CPU time)\n\nRan 5 tests for test/SepoliaFork.t.sol:SepoliaForkTest\n[SKIP] test_sepolia_creditEventAndTotals() (gas: 0)\n[SKIP] test_sepolia_liveFacts() (gas: 0)\n[SKIP] test_sepolia_liveStackerValidCreditMatchesMainnetCandidate() (gas: 0)\n[SKIP] test_sepolia_mainnetCandidateRejectsLegacyUnreachableRecipients() (gas: 0)\n[SKIP] test_sepolia_pausedVaultRevertsThenRecovers() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 3.05ms (65.61µs CPU time)\n\nRan 1 test for test/RegistryMainnetFork.t.sol:RegistryMainnetForkTest\n[SKIP] test_mainnet_ownerAppliesToTheRealIntake_listedThenDefended() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 3.13ms (28.82µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdListingTest\n[PASS] test_coldApplicationYes_deliveredWithin200k() (gas: 162585)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.69ms (1.65ms CPU time)\n\nRan 5 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 181781)\n[PASS] test_callbackSelectorIsCanonical() (gas: 3671)\n[PASS] test_digestMatchesTheProtocol() (gas: 13686)\n[PASS] test_protocolSignaturePassesVerificationBeforePanelPolicy() (gas: 69545)\n[PASS] test_tamperingTheProtocolVectorFailsSignatureVerification() (gas: 64569)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 5.84ms (13.77ms CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdRejectionTest\n[PASS] test_coldApplicationNo_deliveredWithin200k() (gas: 156227)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.20ms (336.73µs CPU time)\n\nRan 7 tests for test/TraderResolution.t.sol:TraderResolutionTest\n[PASS] test_directNoCodeSenderCanBeResolvedWithoutTxOrigin() (gas: 303966)\n[PASS] test_emptyHookDataResolvesActiveMsgSenderAndCannotBeSwept() (gas: 381420)\n[PASS] test_hookDataTakesPrecedenceAndSupportsContractWallets() (gas: 477363)\n[PASS] test_invalidHookDataPaysPlainImdToKnownCallerNeverInvalidRecipient() (gas: 882426)\n[PASS] test_legacyEmptyHookDataCreditsRouterAndAnyoneCanSweep() (gas: 433080)\n[PASS] test_pausedVaultPaysPlainImdToResolvedMsgSender() (gas: 301439)\n[PASS] test_unknownContractOrInvalidMsgSenderNeverBecomesTheRecipient() (gas: 522893)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 6.30ms (2.04ms CPU time)\n\nRan 2 tests for test/RegistryPolicyRevision.t.sol:RegistryPolicyRevisionTest\n[PASS] test_applicationAndChallengeRequireResolvedTraderAndExcludeLpFees() (gas: 6829118)\n[PASS] test_lpRebateDefeatsGrossFeeFloor() (gas: 5991)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.47ms (2.95ms CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDefenseTest\n[PASS] test_coldDefendedChallenge_deliveredWithin200k() (gas: 190510)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.63ms (285.83µs CPU time)\n\nRan 3 tests for test/RegistryCallbackGas.t.sol:RegistryColdFailureTest\n[PASS] test_coldChallengeAfterDeadline_canExpire() (gas: 128213)\n[PASS] test_coldDisagreedChallenge_deliveredWithin200k() (gas: 140179)\n[PASS] test_coldRefusedChallenge_deliveredWithin200k() (gas: 140262)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 6.77ms (322.11µs CPU time)\n\nRan 1 test for test/RegistryCallbackGas.t.sol:RegistryColdDelistingTest\n[PASS] test_coldDelistedChallenge_deliveredWithin200k() (gas: 171507)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.49ms (346.18µs CPU time)\n\nRan 9 tests for test/TrialVenue.t.sol:TrialVenueTest\n[PASS] test_buyCreditsHalfTheFeeAndBurnsTheOtherHalf() (gas: 434566)\n[PASS] test_gasIsCheckedBeforeTheCredit() (gas: 124458)\n[PASS] test_invalidTradersNeverResolve() (gas: 65332)\n[PASS] test_ownerCanOnlySeedOnce() (gas: 56951)\n[PASS] test_pausedVaultPaysPlainImd() (gas: 305091)\n[PASS] test_registryReadsTheOwner() (gas: 17255)\n[PASS] test_routerCallerResolvesToItsActiveCaller() (gas: 784096)\n[PASS] test_sellCreditsHalfTheFeeAndBurnsTheOtherHalf() (gas: 588348)\n[PASS] test_unknownContractCallerGetsNoCashbackItIsBurned() (gas: 572622)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 6.89ms (3.06ms CPU time)\n\nRan 9 tests for test/RegistryApplicantGate.t.sol:RegistryApplicantGateTest\n[PASS] test_anyoneMayStillChallengeAnOwnedProject() (gas: 6420742)\n[PASS] test_misbehavingOwnerReadsAsNone() (gas: 15582598)\n[PASS] test_noOwnerFunctionOpenToAnyone() (gas: 3089189)\n[PASS] test_ownerChangeMovesTheRight() (gas: 3436229)\n[PASS] test_ownerMayApply() (gas: 3320997)\n[PASS] test_projectItselfMayApply() (gas: 3381856)\n[PASS] test_renouncedOwnerOpenToAnyone() (gas: 3284007)\n[PASS] test_squatterCannotBlockTheTeam() (gas: 3550174)\n[PASS] test_strangerRefusedBeforePaying() (gas: 390876)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 10.68ms (6.88ms CPU time)\n\nRan 6 tests for test/RegistrySelfBeneficiary.t.sol:RegistrySelfBeneficiaryTest\n[PASS] test_acceptedSelfChallengeHoldsSlotUntilAnswerWithoutNewCooldown() (gas: 9460831)\n[PASS] test_applicationRefusesRegistryBeforeFeeOrRequest() (gas: 171010)\n[PASS] test_contractBeneficiaryStillReceivesBondAndCanHandOff() (gas: 6434857)\n[PASS] test_handoffRefusesRegistryAndPreservesBondRecipient() (gas: 6367548)\n[PASS] test_registryOwnedProjectCannotApplyWithRegistryAsBeneficiary() (gas: 507127)\n[PASS] test_rejectedHandoffDoesNotConsumeDailyHandoff() (gas: 3287504)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 10.66ms (6.84ms CPU time)\n\nRan 2 tests for test/VaultTrustRegression.t.sol:VaultTrustRegressionTest\n[PASS] test_dustHoldThroughStackerAndDirectVault() (gas: 910632)\n[PASS] test_vaultOwnerCanSweepCashback() (gas: 637955)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.22ms (2.49ms CPU time)\n\nRan 4 tests for test/RegistryCooldownBoundary.t.sol:RegistryCooldownBoundaryTest\n[PASS] test_challengeExactlyAtCooldown_succeeds() (gas: 6106573)\n[PASS] test_challengeOneSecondBeforeCooldown_reverts() (gas: 3201501)\n[PASS] test_constructor_rejectsCooldownAboveMax() (gas: 14194)\n[PASS] test_keptChallenge_doesNotRestartCooldown() (gas: 9279267)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 8.20ms (6.66ms CPU time)\n\nRan 8 tests for test/RegistryBondOwed.t.sol:RegistryBondOwedTest\n[PASS] test_blockedBeneficiary_signedYes_defendsAndOwesBond() (gas: 1111540)\n[PASS] test_blockedChallenger_expireClearsAndOwesBond() (gas: 939032)\n[PASS] test_blockedChallenger_failureClearsAndOwesBond() (gas: 1232683)\n[PASS] test_blockedChallenger_signedNo_delistsAndOwesBond() (gas: 1219736)\n[PASS] test_claimBond_refusesZeroAddressAndNothingOwed() (gas: 67159)\n[PASS] test_falseReturningToken_owesBond() (gas: 1052745)\n[PASS] test_owedBondsAccumulate() (gas: 1421953)\n[PASS] test_unblocked_paysAtOnce() (gas: 950815)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 18.79ms (13.88ms CPU time)\n\nRan 1 test for test/RegistryMainnetLaunch.t.sol:RegistryMainnetLaunchTest\n[PASS] test_manifestDeploysOnlyRegistryOnEmptyMainnet() (gas: 14036236)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 40.58ms (40.32ms CPU time)\n\nRan 23 tests for test/ProjectRegistry.t.sol:ProjectRegistryTest\n[PASS] testFuzz_apply_nameIsSafeOrRefused(bytes) (runs: 256, μ: 345313, ~: 55837)\n[PASS] testFuzz_apply_rate(uint16) (runs: 256, μ: 359680, ~: 47867)\n[PASS] test_answer_freshnessAndPanelChecks() (gas: 3531117)\n[PASS] test_answer_mustBeSignedByTheOracleForThisContract() (gas: 3219851)\n[PASS] test_answer_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3229539)\n[PASS] test_apply_bodyIsTheOracleBody() (gas: 3317268)\n[PASS] test_apply_oneOpenQuestionAtATime_andNotWhenListed() (gas: 3227423)\n[PASS] test_apply_paysExactlyTheFeeAndAsks() (gas: 3117533)\n[PASS] test_apply_validation() (gas: 567226)\n[PASS] test_callbackOutOfGas_isRecoverableThroughExpire() (gas: 6062321)\n[PASS] test_challenge_defended_bondToBeneficiary_noNewCooldown() (gas: 6362238)\n[PASS] test_challenge_failureOrExpiry_returnsTheBond_projectStaysListed() (gas: 9363040)\n[PASS] test_challenge_lost_delistsFromThisBlock_bondBack() (gas: 9339341)\n[PASS] test_challenge_onlyListed_afterCooldown_oneAtATime() (gas: 6314280)\n[PASS] test_challenge_paysFeeAndBond_bodyNamesTheReason() (gas: 6469424)\n[PASS] test_constructor_rejectsZeroAddresses() (gas: 6519)\n[PASS] test_constructor_wiring() (gas: 74067)\n[PASS] test_expire_afterADay_orWhenTheIntakeCompletedWithoutAnAnswer() (gas: 6115895)\n[PASS] test_failure_clearsTheApplication_andNeverLists() (gas: 5990106)\n[PASS] test_failure_onlyFromTheIntake_onlyForOurOpenRequest() (gas: 3057732)\n[PASS] test_no_rejects_andTheProjectCanApplyAgain() (gas: 6171710)\n[PASS] test_setBeneficiary_onlyTheBeneficiaryOfAListedProject() (gas: 3319132)\n[PASS] test_yes_listsFromThisBlock() (gas: 3160454)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 41.32ms (51.36ms CPU time)\n\nRan 5 tests for test/StackerAuditRegression.t.sol:StackerAuditRegressionTest\n[PASS] testFuzz_unreachableRecipientsRejectedBeforeAndAfterFirstCredit(uint256,bool) (runs: 256, μ: 1446455, ~: 1398331)\n[PASS] test_creditToImdTokenRevertsWithoutEffects() (gas: 362704)\n[PASS] test_creditToStackerRevertsWithoutEffects() (gas: 364669)\n[PASS] test_creditToVaultRevertsWithoutEffects() (gas: 364714)\n[PASS] test_zeroAmountStillRejectsUnreachableRecipients() (gas: 1092757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 108.55ms (108.48ms CPU time)\n\nRan 10 tests for test/RegistryAuditRegression.t.sol:RegistryAuditRegressionTest\n[PASS] testFuzz_applicationPaysCurrentPrice(uint96) (runs: 256, μ: 3106349, ~: 3106148)\nLogs:\n  Bound result 14323432\n\n[PASS] test_defendedChallengeFromAnotherWalletDoesNotRenewImmunity() (gas: 9334621)\n[PASS] test_defendedSelfChallengeDoesNotRenewImmunity() (gas: 21881719)\n[PASS] test_permissionlessApplicantCanOccupySlotUntilRejected() (gas: 6210874)\n[PASS] test_priceRiseAndFall_preserveBondAndExactPayment() (gas: 9528279)\n[PASS] test_retiredActionApplicationMovesNothing() (gas: 281247)\n[PASS] test_retiredActionRefusesBeforePaymentAndPreservesListing() (gas: 6409682)\n[PASS] test_signedAnswerMustReachItsOwnQuorum() (gas: 3221678)\n[PASS] test_stakingFaucetTokenCannotPayOracleFee() (gas: 4326584)\n[PASS] test_staleExactApprovalCannotSpendAnUnexpectedPriceIncrease() (gas: 345326)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 130.14ms (136.02ms CPU time)\n\nRan 20 tests for test/Stacker.t.sol:StackerTest\n[PASS] testFuzz_credit(address,uint256) (runs: 256, μ: 394618, ~: 394425)\nLogs:\n  Bound result 87722973415749670916205\n\n[PASS] testFuzz_credit_shortAllowanceAlwaysReverts(uint256,uint256) (runs: 256, μ: 367756, ~: 368888)\nLogs:\n  Bound result 8\n  Bound result 2\n\n[PASS] testFuzz_credit_twoTradersProportional(uint256,uint256) (runs: 256, μ: 430325, ~: 430416)\nLogs:\n  Bound result 3882\n  Bound result 8\n\n[PASS] test_constructor_doesNotCallExistingVaultOrToken() (gas: 56148)\n[PASS] test_constructor_vaultWithoutCode_creditCannotMove() (gas: 131325)\n[PASS] test_constructor_wiringWithoutExternalCalls() (gas: 43846)\n[PASS] test_credit_manyProjectsAndTraders() (gas: 9375713)\n[PASS] test_credit_revertsOnShortAllowance() (gas: 378525)\n[PASS] test_credit_revertsOnShortBalance() (gas: 370632)\n[PASS] test_credit_revertsOnZeroShares() (gas: 383379)\n[PASS] test_credit_revertsWhenVaultPaused() (gas: 508239)\n[PASS] test_credit_sharesFollowVaultPrice() (gas: 617949)\n[PASS] test_credit_sharesGoOnlyToTrader() (gas: 374498)\n[PASS] test_credit_totalsAndEvent() (gas: 494195)\n[PASS] test_credit_zeroAmountReturnsZeroNoEvent() (gas: 80135)\n[PASS] test_credit_zeroTraderReverts() (gas: 66272)\n[PASS] test_failedFirstCredit_rollsBackApprovalAndRetriesValidation() (gas: 531891)\n[PASS] test_firstCredit_approvesOnce_andLaterCreditsStillWork() (gas: 397571)\n[PASS] test_firstCredit_revertsOnAssetMismatch() (gas: 791662)\n[PASS] test_integrator_tryCatchSurvivesPausedVault() (gas: 1053849)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 172.05ms (190.85ms CPU time)\n\nRan 4 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_emptyChainRehearsal_constructorPasses() (gas: 25953)\n[PASS] test_launchManifest_knownShape() (gas: 26593)\n[PASS] test_registry_emptyChainRehearsal_constructorPasses() (gas: 8416607)\n[PASS] test_runtimeSizeAndNoEscapeOpcodes() (gas: 4294851)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 531.90ms (25.26ms CPU time)\n\nRan 18 tests for test/RegistryRevisionRegression.t.sol:RegistryRevisionRegressionTest\n[PASS] testFuzz_answerIsConsumedAcrossApplications(bool) (runs: 256, μ: 9344987, ~: 9341940)\n[PASS] testFuzz_beneficiaryUnlocksAfterFailureOrExpiry(bool) (runs: 256, μ: 6340054, ~: 6334146)\n[PASS] testFuzz_challengeAllowsRateChangesWithinTheRules(uint16) (runs: 256, μ: 7327171, ~: 7327363)\nLogs:\n  Bound result 84\n\n[PASS] testFuzz_validCooldownCanList(uint64) (runs: 256, μ: 3240073, ~: 3239786)\nLogs:\n  Bound result 36584\n\n[PASS] test_applicationAnswerCannotDefendAChallengeAndSpendItsBond() (gas: 6302462)\n[PASS] test_beneficiaryCannotBlockEveryChallengeByTogglingWallets() (gas: 6764366)\n[PASS] test_beneficiaryCannotTransferAfterChallengeDelists() (gas: 6302572)\n[PASS] test_challengeBodyLimitsAndConsumerDomain() (gas: 6723080)\n[PASS] test_constructorRefusesOverflowingAndExcessiveCooldowns() (gas: 16556)\n[PASS] test_handoffIntervalBoundaryAndRelisting() (gas: 12674465)\n[PASS] test_invalidAnswerDoesNotConsumeUUID() (gas: 3300977)\n[PASS] test_legacyChallengeCannotChargeAfterAnyBeneficiaryHandoff() (gas: 12666281)\n[PASS] test_openChallengeLocksBeneficiaryAndDefendedBondDestination() (gas: 6742710)\n[PASS] test_pinnedChallengePreservesCooldownAndSlotRules() (gas: 6415451)\n[PASS] test_pinnedChallengeRefusesFrontrunBeforeAnyPayment() (gas: 6854511)\n[PASS] test_selfChallengeOccupiesSlotOnlyUntilItSettles() (gas: 9349350)\n[PASS] test_settingSameBeneficiaryDoesNotDisableLegacyChallenge() (gas: 6329990)\n[PASS] test_zeroAndMaximumCooldownCanList() (gas: 6390657)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 686.70ms (1.22s CPU time)\n\nRan 8 tests for test/RegistryHandoffInterval.t.sol:RegistryHandoffIntervalTest\n[PASS] testFuzz_challengeNamingTheWalletInForceAlwaysFiles(uint64) (runs: 1000, μ: 6539341, ~: 6539487)\nLogs:\n  Bound result 5825\n\n[PASS] testFuzz_secondHandoffBoundary(uint64) (runs: 1000, μ: 3315807, ~: 3314072)\nLogs:\n  Bound result 39813\n\n[PASS] test_checksBeforeTheIntervalStillComeFirst() (gas: 6493598)\n[PASS] test_clockIsPerProject() (gas: 6503818)\n[PASS] test_expiredAndFailedQuestionsLeaveTheClockAlone() (gas: 9417371)\n[PASS] test_handoffEmitsEventAndStartsExactInterval() (gas: 3290917)\n[PASS] test_intervalRefusesAThirdWalletToo() (gas: 3333746)\n[PASS] test_relistingByApplicationNamesANewWalletWithoutAHandoff() (gas: 18821659)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 696.73ms (919.18ms CPU time)\n\nRan 17 tests for test/StackerDependencyFailures.t.sol:StackerDependencyFailuresTest\n[PASS] testFuzz_shortAssetReturnFailsBeforeAnyApproval(uint8) (runs: 1000, μ: 674617, ~: 674352)\nLogs:\n  Bound result 7\n\n[PASS] testFuzz_shortDepositReturnIsAtomic(uint8,bool,uint96) (runs: 1000, μ: 902382, ~: 884389)\nLogs:\n  Bound result 1\n  Bound result 37321836421573376299568\n\n[PASS] testFuzz_tokenFailureIsAtomic(uint8,uint96,bool) (runs: 1000, μ: 842796, ~: 840448)\nLogs:\n  Bound result 1\n  Bound result 13132\n\n[PASS] testFuzz_vaultPullFailureIsAtomic(uint8,uint96,bool) (runs: 1000, μ: 877079, ~: 878031)\nLogs:\n  Bound result 2\n  Bound result 43755510519557886615413\n\n[PASS] test_assetRevertDataBubblesAndDoesNotPrimeApproval() (gas: 670793)\n[PASS] test_dirtyAssetAddressIsRejectedBeforeAnyApproval() (gas: 673028)\n[PASS] test_falseApprovalRollsBackAndNextCreditRevalidates() (gas: 798887)\n[PASS] test_falsePullAfterMovingOneWeiRollsBackFirstApproval() (gas: 831737)\n[PASS] test_falseVaultPullRollsBackBothTransfersAndFirstApproval() (gas: 871106)\n[PASS] test_invalidBooleanApprovalRollsBack() (gas: 798824)\n[PASS] test_invalidBooleanPullRollsBack() (gas: 831884)\n[PASS] test_invalidBooleanVaultPullRollsBackEntireProjectBalance() (gas: 871365)\n[PASS] test_missingDepositReturnRollsBackActualMint() (gas: 936401)\n[PASS] test_oneByteShortDepositReturnRollsBackActualMintAndHold() (gas: 865107)\n[PASS] test_revertingApprovalRollsBackAndNextCreditRevalidates() (gas: 804553)\n[PASS] test_revertingPullBubblesErrorAfterAnEarlierCredit() (gas: 838492)\n[PASS] test_revertingVaultPullAfterEarlierCreditLeavesMatureSharesAlone() (gas: 867788)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 705.99ms (1.69s CPU time)\n\nRan 8 tests for test/StackerGas.t.sol:StackerGasTest\n[PASS] testFuzz_readmeLateFailurePaysOnceAndNextCreditWorks(uint96,bool,bool) (runs: 1000, μ: 3268147, ~: 3268017)\nLogs:\n  Bound result 114005263853767\n\n[PASS] test_oldGasCapFailsRepeatedlyAndDoesNotPrimeVault() (gas: 600749)\n[PASS] test_readmeBudgetFundsColdFirstCredit() (gas: 359519)\n[PASS] test_readmeFallbackAfterFirstMintReturnsZeroShares() (gas: 3264309)\n[PASS] test_readmeFallbackAfterRepeatMintReverts() (gas: 3264412)\n[PASS] test_readmeFallbackHasGasEvenWhenCreditExhaustsItsBudget() (gas: 473042)\n[PASS] test_readmeFallbackPaysPlainImdWhenVaultFails() (gas: 272236)\n[PASS] test_readmeGasGuardRejectsLowEstimateBeforeFallback() (gas: 94010)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 706.06ms (703.71ms CPU time)\n\nRan 20 tests for test/RegistryAdversarial.t.sol:RegistryAdversarialTest\n[PASS] testFuzz_nonCanonicalBoolCannotDelist(uint256) (runs: 1000, μ: 6554658, ~: 6554617)\nLogs:\n  Bound result 115792089237316195423570985007226406215939081747516107369255565325850740982014\n\n[PASS] testFuzz_oldCallbacksCannotCloseReplacementApplication(uint8) (runs: 1000, μ: 6640595, ~: 6646682)\nLogs:\n  Bound result 2\n\n[PASS] testFuzz_pendingDeadlineStillAllowsAnswerButNotExpiry(bool,bool) (runs: 1000, μ: 4976467, ~: 3434609)\n[PASS] testFuzz_shortBoolEncodingCannotReleaseBond(uint8) (runs: 1000, μ: 6433568, ~: 6433340)\nLogs:\n  Bound result 15\n\n[PASS] test_answerBeforeAskToleranceHasExactBoundary() (gas: 3414922)\n[PASS] test_attestationExpiryIsInclusive() (gas: 3405381)\n[PASS] test_beneficiaryHandoverWaitsForSettlementAndRevokesOldWallet() (gas: 9831731)\n[PASS] test_challengeCooldownHasExactBoundary() (gas: 6413357)\n[PASS] test_challengeShortAllowanceCannotBorrowDonatedFunds() (gas: 3592763)\n[PASS] test_emptyAndMalformedSignaturesCannotSettle() (gas: 4190907)\n[PASS] test_everySignedFieldIsAuthenticatedBeforeABondCanMove() (gas: 10613885)\n[PASS] test_futureIssuedAtToleranceHasExactBoundary() (gas: 3405670)\n[PASS] test_intakeRevertRollsBackFeeBondApprovalAndOpenRecord() (gas: 6686933)\n[PASS] test_maximumFeeAdditionRevertsWithoutChangingListing() (gas: 3529365)\n[PASS] test_oldChallengeCannotRefundTwiceOrCloseNewChallenge() (gas: 9956450)\n[PASS] test_oneSecondAfterDeadlineCannotReleaseBondToBeneficiary() (gas: 6561303)\n[PASS] test_signatureForSameAddressOnAnotherChainCannotReleaseBond() (gas: 6575234)\n[PASS] test_starvedChallengeCallbackRefundsOnlyChallenger() (gas: 6558379)\n[PASS] test_thirdPartyPaidQuestionCannotListOurProject() (gas: 3627102)\n[PASS] test_tokenReturningFalseCannotCreatePaidRequest() (gas: 3537524)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 706.09ms (2.05s CPU time)\n\nRan 7 tests for test/StackerExternalCalls.t.sol:StackerExternalCallsTest\n[PASS] testFuzz_creditMatchesDirectDepositFromSameVaultState(uint96,uint96,uint96) (runs: 1000, μ: 976804, ~: 976853)\nLogs:\n  Bound result 99999000000000000016329\n  Bound result 18811\n  Bound result 2220\n\n[PASS] testFuzz_lateFailureRollsBackAllEffects(uint96,bool,bool) (runs: 1000, μ: 2935569, ~: 2930480)\nLogs:\n  Bound result 1393\n\n[PASS] test_anotherCallersApprovalCannotBeSpent() (gas: 598595)\n[PASS] test_noReturnTokenStillMovesExactAssetsAndShares() (gas: 3117679)\n[PASS] test_oneWeiLateRevertRollsBackFirstApproval() (gas: 2937621)\n[PASS] test_tokenReentryDuringApprovalAndPullCannotCreateExtraCashback() (gas: 3738736)\n[PASS] test_zeroShareReturnRollsBackAnActualMint() (gas: 2925987)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 706.23ms (1.40s CPU time)\n\nRan 8 tests for test/RegistryBodyProperties.t.sol:RegistryBodyPropertiesTest\n[PASS] testFuzz_applicationBodyRoundTripsValidText(bytes32,uint8,uint8,uint16) (runs: 1000, μ: 3620163, ~: 3583250)\nLogs:\n  Bound result 24\n  Bound result 166\n  Bound result 85\n\n[PASS] testFuzz_challengeBodyRoundTripsValidText(bytes32,uint16) (runs: 1000, μ: 6791392, ~: 6724686)\nLogs:\n  Bound result 28\n\n[PASS] test_applicationMaximumTextAndRate() (gas: 3862252)\n[PASS] test_applicationMinimumTextAndRate() (gas: 3504752)\n[PASS] test_challengeMaximumReason() (gas: 7118201)\n[PASS] test_challengeMinimumReason() (gas: 6643534)\n[PASS] test_everyForbiddenByteIsRejectedInEveryUserTextFieldBeforePayment() (gas: 53799580)\n[PASS] test_textLengthsJustOutsideLimitsAreAtomic() (gas: 3750569)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 706.31ms (1.42s CPU time)\n\nRan 19 tests for test/StackerEdges.t.sol:StackerEdgesTest\n[PASS] testFuzz_credit_pausedAlwaysRevertsAndMovesNothing(address,uint256) (runs: 1000, μ: 234730, ~: 234510)\nLogs:\n  Bound result 999999999999999999999997\n\n[PASS] testFuzz_credit_repeatedCyclesExtractNoDust(uint256,uint8) (runs: 1000, μ: 1562416, ~: 1371076)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_credit_shortBalanceAlwaysReverts(uint256,uint256) (runs: 1000, μ: 388852, ~: 388806)\nLogs:\n  Bound result 3600\n  Bound result 127\n\n[PASS] testFuzz_credit_thenRedeem_noFreeProfit(uint256,uint256,uint256) (runs: 1000, μ: 736857, ~: 761914)\nLogs:\n  Bound result 62655136779866659092226\n  Bound result 92930994910152543054804\n  Bound result 22172\n\n[PASS] testFuzz_credit_traderValueWithinOneShareOfAmount(uint256,uint256,uint256) (runs: 1000, μ: 681848, ~: 689012)\nLogs:\n  Bound result 99999999999999999999997\n  Bound result 36681180552667787733217\n  Bound result 81211818703843064555931\n\n[PASS] testFuzz_credit_zeroSharesGuardTracksVaultPreview(uint256,uint256) (runs: 1000, μ: 490799, ~: 510594)\nLogs:\n  Bound result 127\n  Bound result 3600\n\n[PASS] test_credit_allowanceConsumedExactly_secondCallReverts() (gas: 615815)\n[PASS] test_credit_astronomicalButRepresentable() (gas: 365250)\n[PASS] test_credit_balanceConsumedExactly_secondCallReverts() (gas: 591245)\n[PASS] test_credit_eventMatchesReturnAndBalanceDeltaAtNonUnitPrice() (gas: 662927)\n[PASS] test_credit_maxUint_revertsCleanlyInVaultMath() (gas: 238919)\n[PASS] test_credit_oneWei() (gas: 361849)\n[PASS] test_credit_pausedBeatsShortAllowance_nothingPulled() (gas: 468574)\n[PASS] test_credit_projectIsTrader_countedOnBothSides() (gas: 326778)\n[PASS] test_credit_reentrancyFromVaultIsBlocked() (gas: 737091)\n[PASS] test_credit_zeroAmountWhilePaused_returnsZeroWithoutTouchingVault() (gas: 91175)\n[PASS] test_credit_zeroTraderWhilePaused_stillZeroTrader() (gas: 89528)\n[PASS] test_credit_zeroTraderWithShortAllowance_stillZeroTrader() (gas: 285166)\n[PASS] test_strayImdInStacker_isNeverSpentByCredit() (gas: 522405)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 706.34ms (2.77s 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            | 237   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | applyFor          | 288   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | challengeFor      | 254   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | completeAndExpire | 271   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | expireStale       | 259   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | failFor           | 233   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | handOver          | 251   | 0       | 0        |\n|-----------------+-------------------+-------+---------+----------|\n| RegistryHandler | passTime          | 255   | 0       | 0        |\n╰-----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 83\n  Bound result 48\n  Bound result 141518\n  Bound result 96000\n  Bound result 28\n  Bound result 121600\n  Bound result 64000\n  Bound result 4188\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 18968878)\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 733.17ms (734.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     | 391   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | credit      | 410   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | donate      | 448   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | redeem      | 411   | 0       | 0        |\n|----------------+-------------+-------+---------+----------|\n| StackerHandler | togglePause | 388   | 0       | 0        |\n╰----------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 22444\n  Bound result 48\n  Bound result 5\n  Bound result 4848\n  Bound result 4\n  Bound result 2083\n  Bound result 6199\n  Bound result 2097\n  Bound result 1\n  Bound result 7\n  Bound result 7\n  Bound result 5\n  Bound result 295789273272333\n  Bound result 7186\n  Bound result 255\n  Bound result 10\n  Bound result 5\n  Bound result 2\n  Bound result 6\n  Bound result 2011\n  Bound result 798521663520150633709\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 788.38ms (782.38ms 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        | 477   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | credit         | 489   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | creditTiny     | 481   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | depositDirect  | 469   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | donate         | 497   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | faucet         | 452   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | redeem         | 486   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | renounce       | 480   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | rescue         | 452   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | setAllowance   | 436   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | togglePause    | 444   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | transferShares | 473   | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| ExtendedHandler | withdraw       | 508   | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 853822313619728835068\n  Bound result 242\n  Bound result 813945\n  Bound result 2992622691351327754046\n  Bound result 279892027015993669662\n  Bound result 12199\n  Bound result 10000000000000000002\n  Bound result 200000\n  Bound result 10\n  Bound result 13538\n  Bound result 159153259696\n  Bound result 4998000000000000000000\n  Bound result 0\n  Bound result 943158537\n  Bound result 877\n  Bound result 20205\n  Bound result 6\n  Bound result 13143\n  Bound result 1909906903\n  Bound result 14722128459655588065397\n  Bound result 4810\n  Bound result 10\n  Bound result 7\n  Bound result 1\n  Bound result 1700000000\n  Bound result 564797\n  Bound result 26\n  Bound result 6924\n  Bound result 14252\n  Bound result 12988\n  Bound result 1678738771122924509594\n  Bound result 5729\n  Bound result 10\n  Bound result 40391\n\n[PASS] test_handlerReachesEveryCreditOutcome() (gas: 4540803)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 1\n  Bound result 50000000000000000000\n  Bound result 7\n  Bound result 24000000000000000000000\n  Bound result 100000000000000000000\n  Bound result 10000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 372757101\n  Bound result 684498244\n  Bound result 1000000000000000000\n  Bound result 2949193105425070115\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.14s (4.13s CPU time)\n\nRan 3 tests for test/RegistryAccountingInvariant.t.sol:RegistryAccountingInvariantTest\n[PASS]\nRegistryAccountingInvariantTest invariants:\n[PASS] invariant_eachActorGetsExactlyTheirEntitlement\n[PASS] invariant_requestsAndListingsMatchIndependentHistory\n RegistryAccountingInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------------+----------------------+-------+---------+----------╮\n| Contract                  | Selector             | Calls | Reverts | Discards |\n+===============================================================================+\n| RegistryAccountingHandler | ask                  | 1848  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | donate               | 1769  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | expire               | 1813  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | handOver             | 1897  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | passTime             | 1834  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | reprice              | 1807  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | settle               | 1873  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unauthorizedOrReplay | 1800  | 0       | 0        |\n|---------------------------+----------------------+-------+---------+----------|\n| RegistryAccountingHandler | unsafeChallenge      | 1743  | 0       | 0        |\n╰---------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 77\n  Bound result 8\n  Bound result 108384\n  Bound result 37\n  Bound result 39\n  Bound result 64398\n  Bound result 32\n  Bound result 11707\n  Bound result 264337553929803797\n  Bound result 3\n  Bound result 10534\n  Bound result 1\n  Bound result 14\n  Bound result 14385\n  Bound result 8075481462720227\n  Bound result 3132\n  Bound result 344563308079250734\n  Bound result 66\n  Bound result 2\n  Bound result 18038\n  Bound result 44\n  Bound result 101\n  Bound result 1\n  Bound result 15826\n  Bound result 40\n  Bound result 513\n  Bound result 16\n  Bound result 13362\n  Bound result 2\n  Bound result 2102\n  Bound result 96\n  Bound result 6\n  Bound result 9\n  Bound result 40\n  Bound result 19426\n  Bound result 25\n  Bound result 9835\n  Bound result 45\n  Bound result 1520\n  Bound result 2185\n  Bound result 12068\n  Bound result 301\n  Bound result 5\n\n[PASS] test_handlerReachesAllPayoutsAndChecksAfterEachTransition() (gas: 40458439)\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: 16504440)\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.28s (5.29s CPU time)\n\nRan 3 tests for test/StackerHoldInvariant.t.sol:StackerHoldInvariantTest\n[PASS]\nStackerHoldInvariantTest invariants:\n[PASS] invariant_balancesAndHistoricalCashbackAreConserved\n[PASS] invariant_holdFollowsSharesAndCannotBeClearedByTimestamp\n StackerHoldInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+----------------------+-------+---------+----------╮\n| Contract           | Selector             | Calls | Reverts | Discards |\n+========================================================================+\n| StackerHoldHandler | advance              | 2014  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | credit               | 2005  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | donate               | 2020  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | exit                 | 2123  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | probeRenouncedPowers | 2067  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | transferShares       | 2112  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | unauthorizedExit     | 2018  | 0       | 0        |\n|--------------------+----------------------+-------+---------+----------|\n| StackerHoldHandler | zeroAction           | 2025  | 0       | 0        |\n╰--------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 1491\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1\n  Bound result 50000000000000000\n  Bound result 0\n  Bound result 6210514243053326740597\n  Bound result 512\n  Bound result 7000000000000000000\n  Bound result 10\n  Bound result 28\n  Bound result 7\n  Bound result 1034007913129639680\n  Bound result 1\n  Bound result 0\n  Bound result 500000000000000000\n  Bound result 50000000000000000000\n  Bound result 5\n  Bound result 12\n  Bound result 8045940739423758205526\n  Bound result 10\n  Bound result 11024\n  Bound result 1\n  Bound result 8059423859105844777342\n  Bound result 9\n  Bound result 871782499075366097180\n  Bound result 255\n  Bound result 350000\n  Bound result 2760326451516704413549\n  Bound result 556\n  Bound result 365\n  Bound result 32690626404\n  Bound result 7687\n  Bound result 1\n  Bound result 5000000000000000000\n  Bound result 10750\n  Bound result 1083007139997101102212295\n  Bound result 3532\n\n[PASS] test_handlerExercisesHeldDelegatedAndMatureExits() (gas: 3851200)\nLogs:\n  Bound result 10000000000000000000\n  Bound result 2000000000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000000000\n  Bound result 1000000000000000000000000\n\n[PASS] test_handlerExercisesZeroSharesFailureBeforeInitialization() (gas: 2872846)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1\n  Bound result 10000000000000000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 6.42s (6.42s CPU time)\n\nRan 39 test suites in 6.43s (24.13s CPU time): 239 tests passed, 0 failed, 14 skipped (253 total tests)\n","passed":true},{"durationMs":91,"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\":5,\"ADAPTATION.md\":93,\"NEXT_SESSION.md\":73,\"README.md\":283,\"app.js\":2272,\"docs/data-api.md\":97,\"docs/design.md\":322,\"docs/explainer.html\":247,\"docs/history.md\":388,\"docs/listing.md\":97,\"docs/panel-rules-v2-rehearsal-body.json\":28,\"docs/panel-rules-v2.md\":88,\"docs/plea-handoff.md\":73,\"docs/plea-test-run-2.md\":34,\"favicon.svg\":11,\"foundry.toml\":26,\"index.html\":166,\"jobs/1-sepolia-launch.md\":23,\"jobs/10-sepolia-v4-launch.md\":13,\"jobs/11-sepolia-v5-launch.md\":13,\"jobs/12-mainnet-registry-launch.md\":13,\"jobs/13-sepolia-v6-launch.md\":13,\"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/10-sepolia-v4-launch.json\":31,\"jobs/requests/11-sepolia-v5-launch.json\":31,\"jobs/requests/12-mainnet-registry-launch.json\":31,\"jobs/requests/13-sepolia-v6-launch.json\":31,\"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\":47,\"remappings.txt\":3,\"src/ProjectRegistry.sol\":713,\"src/Stacker.sol\":104,\"src/oracle/OracleAttestation.sol\":265,\"style.css\":1599,\"test/ADVERSARIAL_COVERAGE.md\":42,\"test/Base.t.sol\":58,\"test/Deployment.t.sol\":144,\"test/FactoryRehearsal.t.sol\":47,\"test/MAINNET_TEST_COVERAGE.md\":45,\"test/MainnetFork.t.sol\":141,\"test/MainnetLaunchRegression.t.sol\":99,\"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/RegistryApplicantGate.t.sol\":166,\"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/RegistryMainnetFork.t.sol\":110,\"test/RegistryMainnetLaunch.t.sol\":86,\"test/RegistryPolicyRevision.t.sol\":50,\"test/RegistryRevisionRegression.t.sol\":418,\"test/RegistrySelfBeneficiary.t.sol\":148,\"test/RegistrySepoliaFork.t.sol\":113,\"test/SepoliaFork.t.sol\":141,\"test/Stacker.t.sol\":423,\"test/StackerAuditRegression.t.sol\":99,\"test/StackerDependencyFailures.t.sol\":288,\"test/StackerEdges.t.sol\":391,\"test/StackerExternalCalls.t.sol\":257,\"test/StackerGas.t.sol\":186,\"test/StackerHoldInvariant.t.sol\":346,\"test/StackerInvariant.t.sol\":148,\"test/StackerInvariantExtended.t.sol\":495,\"test/TraderResolution.t.sol\":229,\"test/TrialVenue.t.sol\":147,\"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,\"test/trial/TrialVenue.sol\":222,\"tools/site-check/.gitignore\":2,\"tools/site-check/README.md\":35,\"tools/site-check/behavior.mjs\":124,\"tools/site-check/flows.mjs\":173,\"tools/site-check/fork-answer.sh\":27,\"tools/site-check/layout.mjs\":88,\"tools/site-check/lib.mjs\":180,\"tools/site-check/package-lock.json\":22,\"tools/site-check/package.json\":9,\"tools/site-check/refresh-bug.mjs\":50,\"tools/site-check/trial.mjs\":156,\"tools/snapshot/build.mjs\":291,\"tools/snapshot/chains.json\":29,\"tools/snapshot/test.sh\":57},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d99b53dd64d31f05b0ae7899e9ee1824ceb96628d1e62d361cb80b285acc4466","verifiedTreeHash":"d65730cbd8bdabfb1f13769911cf048056b61ab9","verifierVersion":"0.1.0+327e1e9f"}]}