{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"b16833e2-091b-48ac-a988-776cbe75b0a1","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"274a10ad09c8be6dd6a0f6e772305180aacfbb120bbf8b792b590fbffada3590","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":"failed"},{"acceptedSubmissionHash":"13d5534611477670c592d04747b429c91a3a055197c55eb3f4a65d0d13f88c8d","dependsOn":["adapt_contract_project","write_foundry_tests","gas_and_size_report","manifest"],"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":"8468bbda40ce929c49a79771acb8d6232af34b92bed556b5e2549fe0d4fca514","dependsOn":["adapt_contract_project","write_foundry_tests","gas_and_size_report","manifest"],"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":"8f3ec3c57e5a8e5d219fbd0d568f1487079573ea7936bc1577ed5a89da95ced8","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":"9edabe41f16302eebba4c12fde1a5716063176c89bcf8354d8c9959a21a0265d","dependsOn":["adapt_contract_project","write_foundry_tests","gas_and_size_report","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":"waiting"},{"acceptedSubmissionHash":"a4190797fdd1b32d70d7efcb9279066a5fdc19cb28aafc9577a878026e8e99bc","dependsOn":["adapt_contract_project","write_foundry_tests","gas_and_size_report","manifest"],"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":"0036f20543cf3053edda66e238e72699b52d18ebcf90d0a4909e8ebcca17d88b","dependsOn":["adapt_contract_project","write_foundry_tests","gas_and_size_report","manifest"],"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":"95bd8ba51c0d5eca1ee33a13a227dc1d7b110a0c705d49935fdbb984b9eb04e1","dependsOn":["write_foundry_tests"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"30969efdf166eb4a7d01a215c4655adeac1cd303dea3ef1c3ba1fc75789474d4","skillId":"gas-and-size-report","tools":[]},"key":"gas_and_size_report","kind":"code","role":"tests","skillHash":"30969efdf166eb4a7d01a215c4655adeac1cd303dea3ef1c3ba1fc75789474d4","skillId":"gas-and-size-report","state":"waiting"},{"acceptedSubmissionHash":"9107b6169f4814d6e8e36499e5b4929fbb90f8472b977314a78da082f7999103","dependsOn":["audit_imported_code","adapt_contract_project","write_foundry_tests","gas_and_size_report"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"waiting"},{"acceptedSubmissionHash":"bb0b0de80dc17102d04ac8174afb58a3fc2458a066ee4d7998bd67688bd11cb3","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"waiting"}],"objective":"Launch the SECOND Quorum Compatibility Probe test on Ethereum mainnet, paired with IMD. This is not the production DAO launch. Use the exact pinned source and newly verified immutable core-creation package in PREREQUISITES.json; reuse the unchanged English constitution. Stop if prerequisites are not VERIFIED_DEPLOYED. Preserve immutable governance, fixed stake 62,500, one staking address per seat, unlimited seats, original/reward/purchased quotas, 3% IMD buy/sell tax, 50/50 accounting, work/allowance/suspension rules and factory-only new LP. The zero-argument token fixes both dependencies. Hook creates the actual core during official factory launch; no admin, proxy or mutable binding. Before handing work to manifest integration, verify getHookPermissions() returns exactly beforeInitialize, beforeAddLiquidity, beforeSwap, afterSwap (0x28c0), matching the manifest and address bits; do not defer missing Solidity interfaces to a launch.json-only worker. Run every test under the default test root including all 26 mandatory cases in ACCEPTANCE.json; no skips or weakened assertions. Validate approved governance buy/sell through the real pool, tax income during operating execution, unused-budget refunds, both-asset fees and ordinary service-failure rollback/retry. Verify package creation bytes against compiled core and constitution hash. Use current official opening policy and 90% pool/10% swarm, no founder allocation. Demonstrate real transaction gas under 16,777,216, initcode under 49,152 and runtimes under 24,576; a multi-week test harness gas allowance is not a transaction-cap waiver. Core changes require a newly reviewed package, never silently change immutable dependencies. Perform final actual chain bindings/registry checks; disclose payer-to-Hook future-fee handover if needed. No frontend, ENS, bots, recurring services or production release. A code publication alone is not acceptance.","parentJobId":null,"planHash":"0b5b6cbfe3938b0ba0bc75f3141fc2f080b1acb3f0f03bb7017277452555a6c9","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"b16833e2-091b-48ac-a988-776cbe75b0a1","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2270-launch-second-quorum-compatibility"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52188","feedbackHash":"0e8738a09aa6f0c3e6e922154a6400508e3e15396bcbd95e7dbdc95ed2afd3f2","nodeKey":"adapt_contract_project","submissionHash":"09196c158f3cabca94115b4b7ef7d4059b67be7c396313b77c275f66f3d20a19","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"50988","feedbackHash":"ba54f9abcbedcd427f27a6fa358598135d7f95976a564b98baa46d1aabb7cb6a","nodeKey":"adapt_contract_project","submissionHash":"274a10ad09c8be6dd6a0f6e772305180aacfbb120bbf8b792b590fbffada3590","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51538","feedbackHash":"1ea5ef27354d6e7b8dd29b3f65ab11c7c6b3dcdc45b353da96fa1222102313bf","nodeKey":"audit_economics","submissionHash":"13d5534611477670c592d04747b429c91a3a055197c55eb3f4a65d0d13f88c8d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"54233","feedbackHash":"86fe2b1cc39b3931670b24359f2fbc2f0597401d62ab98161925a1dfa2d395e8","nodeKey":"audit_flow","submissionHash":"8468bbda40ce929c49a79771acb8d6232af34b92bed556b5e2549fe0d4fca514","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52673","feedbackHash":"3821d5debf8fd1cc449cfcfd44519be6239ce3ce83c6805d1909f67f00b9171f","nodeKey":"audit_imported_code","submissionHash":"8f3ec3c57e5a8e5d219fbd0d568f1487079573ea7936bc1577ed5a89da95ced8","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52671","feedbackHash":"17e8eec14334798b654a19019c8f7b90da4fbada798f73795b4f8058a8e30264","nodeKey":"audit_judge","submissionHash":"9edabe41f16302eebba4c12fde1a5716063176c89bcf8354d8c9959a21a0265d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51442","feedbackHash":"f4318a4a443916c9754904b11c721a981c889637169da51138d3768001f7602f","nodeKey":"audit_math","submissionHash":"a4190797fdd1b32d70d7efcb9279066a5fdc19cb28aafc9577a878026e8e99bc","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52676","feedbackHash":"64342b30059abb180efe3f8551d9986ab2d4fa63bd043eb1d6e975139c8a6df3","nodeKey":"audit_permissions","submissionHash":"0036f20543cf3053edda66e238e72699b52d18ebcf90d0a4909e8ebcca17d88b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51728","feedbackHash":"506cda7249b85c17569bd357535294f9fd788060c88145095e91c17ae96379a9","nodeKey":"gas_and_size_report","submissionHash":"95bd8ba51c0d5eca1ee33a13a227dc1d7b110a0c705d49935fdbb984b9eb04e1","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51174","feedbackHash":"dd43eb40ffbdbec78bb9912f2cbc92f3933288be81fe7a101932c02ba1b9ba21","nodeKey":"manifest","submissionHash":"9107b6169f4814d6e8e36499e5b4929fbb90f8472b977314a78da082f7999103","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50986","feedbackHash":"a0483d566184e9bc13e77f8f4c90104cbdfba64295a5440b50544527654fa5da","nodeKey":"write_foundry_tests","submissionHash":"bb0b0de80dc17102d04ac8174afb58a3fc2458a066ee4d7998bd67688bd11cb3","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"d3a00e89ea2ce45b2594e9f9a89245636efe4f6ee720d166693771d64ecb3b7e","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"970da38f1d564250","findings":[],"hash":"0036f20543cf3053edda66e238e72699b52d18ebcf90d0a4909e8ebcca17d88b","nodeId":"52cf2294-5bf2-43ca-a336-fa7e40bd4a32","outcome":"completed","summary":"I found no permission defect I could reproduce, so `.imd-findings.json` has an empty findings list. It also has a coverage row for all 76 entry points: 61 `holds` and 15 `unreached`. I changed no files and wrote no Foundry proofs, since there was nothing to prove.\n\n**What I traced** (Access Control, Trust Gap and Asymmetry):\n- **`QuorumIssuanceHook`:**\n  - `getHookPermissions()` sets exactly beforeInitialize, beforeAddLiquidity, beforeSwap and afterSwap. The constructor checks the hook's address bits against that same list, and `launch.json` lists the same four.\n  - Every callback accepts calls only from the PoolManager and enforces this pair with fee 12500 and tick spacing 60.\n  - Only the factory that deployed the hook can initialize the pool (once) or add liquidity.\n  - Swaps must come through the hook's own router with a trader set.\n  - `rewardPaid` accepts calls only from the treasury.\n  - `collectPlatformFees` checks the factory's registry record and that the fee requester is the hook itself.\n- **`QuorumCoreCode.create`:** anyone can call it, but each new core's reward reporter is whoever called it, and the hook refuses any core whose reporter isn't the hook. The creation bytes are re-hashed on every call.\n- **`QuorumSwapRouter`:** the callback accepts only the PoolManager during an active trade. The trader is always `msg.sender`, there is a reentrancy flag, and both the 3% tax and the price bounds are checked.\n- **`QuorumTreasury`:**\n  - Every function that moves funds can only be called by `QuorumWork`.\n  - Operating plans can only spend operating funds.\n  - Income received while a plan runs is still split 50/50, and only the operating account can send it ETH.\n- **`QuorumOperatingAccount`:** only the treasury can call it. Calls to the two tokens are limited to `transfer`, approvals are cleared afterwards, and leftover balances go back to the treasury.\n- **`QuotaPrototype`:** every write function can only be called by the hook.\n- **`QuorumMembership` and `QuorumWork`:** the seat, agent and owner checks, plan-hash commitment, exclusion of targets and beneficiaries from voting, and ballot approval all hold.\n\n**Leads I checked and dropped:**\n- Treasury-held QPROBE can't be sold through the pool, because only purchased amounts carry a sell allowance. The design intends this and a test documents it.\n- An operating plan can deposit its own budget back as revenue. That only happens through a plan governance approved.\n\n**Not reached (15 rows):** `AuthenticatedRouterPrototype`, `RestrictedPoolPrototype`, `WorkCyclePrototype` and the `LocalToken`/`LocalSeats` fixtures. None of them is part of the launch the hook builds.\n\n**Not checked:** I didn't run the test suite, and I didn't check the factory's liquidity path, i.e. that the `sender` the hook sees when liquidity is added really is the factory. That needs the official factory's code or the mainnet chain, so a later check against the deployed contracts should confirm it.","treeHash":null,"usage":{"cachedInputTokens":470398,"inputTokens":18,"model":"claude-opus-5-5","outputTokens":8797,"runtime":"claude","turns":9,"wallClockMs":102295}},{"artifacts":[],"attempt":1,"bundleHash":"6fb4d3cfb12a5457eb3df3757697e2b847ebe1e834cce8bc864a06689c1e2397","device":"d4b53d656a3fbe07","findings":[],"hash":"09196c158f3cabca94115b4b7ef7d4059b67be7c396313b77c275f66f3d20a19","nodeId":"70507d0d-5227-4081-982f-c1d2b451083e","outcome":"completed","summary":"The revision is complete. The high finding reproduced and is fixed in the Core, which forces a new code package before this launch can proceed. The three advisory findings and the earlier audit items are answered in `.imd-responses.json`.\n\n**What reproduced and what I changed**\n\n- **Finding d4c39603 (high), fixed.** The reviewer's proof failed on the starting tree exactly as reported. `proposeOperation` let the proposer strike any seat by naming it as a beneficiary, call target or approval spender, and the two-thirds threshold then shrank with the electorate. In `src/QuorumWork.sol` such proposer-declared seats now stay in the electorate the threshold is computed from, while they still cannot vote. In the proof's scenario the threshold is six of nine instead of four of five, execution reverts, and the treasury keeps its funds. The proof passes, all 26 mandatory cases pass unchanged, and a new regression suite with three cases covers struck seats, a legitimately disclosed member beneficiary, and seat call targets and spenders.\n- **The three advisory findings** are confirmed by reading but disputed as design: the operating account's full return to operations is constitution line 54, direct transfers to the treasury are not income by design, and batched week settlement is the constitution's bounded settlement. None of them was changed.\n\n**The consequence I had to report rather than hide**\n\n`QuorumWork` is created inside the Core, so the Core's creation bytes changed. The immutable package already deployed on mainnet now carries the vulnerable bytes and must not launch. Following the brief's rule that core changes need a newly reviewed package, the prerequisites file is set to a non-deployed status with submission disallowed, the superseded package is recorded, and the submission gate now fails closed on four named checks, including a check that the token is not bound to the superseded package. The token still names that package only because the revised one has no address yet and a stand-in is forbidden.\n\n| Core creation | Superseded package | Revised tree |\n| --- | --- | --- |\n| bytes | 39,860 | 40,001 |\n| keccak256 | 0x3bd4bffb… | 0x3b42bdba… |\n\n**Verification run on this machine**\n\n- `forge build` and `forge test` with the verifier's fuzz seed: 45 tests in the tree pass plus the proof copy, no skips.\n- The project's local gate passes. The submission gate fails by design with the four documented blockers.\n- The acceptance runner confirms all 35 mandatory and supplementary cases ran and passed.\n\n**What the requester must do next**\n\nApprove the revised Core, deploy a new `QuorumCoreCode` package from the compiled creation bytes on Ethereum, verify it, bind its address in `src/QProbeToken.sol`, and set the prerequisites file back to verified. The hook, token constants, constitution, 0x28c0 permissions and pool terms are unchanged. The payer-to-Hook fee handover after launch still applies as documented.","treeHash":"54c3717ad80c204471943e63f90055817e106ea6","usage":{"cachedInputTokens":4512583,"inputTokens":1314,"model":"claude-fable-5-1","outputTokens":47135,"runtime":"claude","turns":42,"wallClockMs":866825}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b57ae3a96321a0e1","findings":[{"citation":"resolved","description":"proposeOperation lets the applicant pass up to 32 arbitrary 'beneficiaries' (plus 16 call targets and 16 approval spenders); every address in those lists is written to recused[id] with no check that it benefits from the plan, that it consents, or that the plan touches it. entryEligible (src/QuorumWork.sol:212) then removes every enrollment whose owner or agent appears there from the ballot before it is assembled, and threshold (line 225) is ceil(2/3) of the *assembled* electorate while _approved only requires voters>=5. The constitution's recusal rule exists so that interested seats cannot vote; here it becomes a lever by which the proposer picks who may vote. With N qualified seats, a proposer plus four allied seats (5 x 62,500 fixed stake, all refundable) declares every other seat except one as a beneficiary (up to 64 exclusions, so any DAO of up to ~70 members), leaves exactly 5 voters, casts 4 yes votes (threshold (5*2+2)/3 = 4) and executes a plan whose only call is a token transfer of the whole IMD and project operatingFunds (and ETH budget) to an outside wallet. Without the false declaration the same 4 yes votes among 9 voters fail (threshold 6). This violates 'Governance spends operations funds only' under ceil(2*electorate/3) approval and 'Quorum never silently decreases': the quorum is decreased by the proposer, silently, before assembly. Loss: all operatingFunds in both assets and operatingNative; protected pools are not reachable. Call targets are an equally free lever: a call to an EOA with empty calldata succeeds, so 16 more honest seats can be struck out that way. Minimal fix that preserves the design: compute threshold and the five-seat minimum from the full qualified count of the ballot's week (recused seats still count in the denominator and cannot vote), or alternatively require declared beneficiaries to appear in the plan (approval spender / call target / transfer recipient) and cap the number of seats a proposal may recuse relative to sourceCount.","line":178,"path":"src/QuorumWork.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.28;\n// Proof for: an operation proposer shrinks the electorate by declaring honest voters as\n// \"beneficiaries\" (QuorumWork.proposeOperation -> recused[id][addr]) and passes a treasury\n// draining plan with 4 colluding yes votes out of 10 qualified members.\n// This tree ships no forge-std, so the cheat-code interface is declared inline, as the\n// repository's own tests do.\nimport {QuorumLocalSystem} from \"src/QuorumLocalSystem.sol\";\nimport {QuorumMembership, IERC20Local} from \"src/QuorumMembership.sol\";\nimport {QuorumTreasury} from \"src/QuorumTreasury.sol\";\nimport {QuorumWork} from \"src/QuorumWork.sol\";\nimport {LocalToken} from \"src/LocalFixtures.sol\";\nimport {QuorumCodeCatalog} from \"src/QuorumCodeCatalog.sol\";\nimport {OperatingPlan, OperatingApproval, OperatingCall} from \"src/QuorumOperatingAccount.sol\";\n\ninterface ScratchVm {\n    function prank(address) external;\n    function warp(uint256) external;\n    function roll(uint256) external;\n    function setBlockhash(uint256, bytes32) external;\n    function readFile(string calldata) external view returns (string memory);\n}\n\ncontract RecusalCaptureTest {\n    ScratchVm constant vm = ScratchVm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n    uint256 constant MEMBERS = 10;\n    address constant ATTACKER_WALLET = address(0xBAD);\n    QuorumLocalSystem system;\n    QuorumMembership members;\n    QuorumTreasury funds;\n    QuorumWork work;\n    LocalToken stake;\n    LocalToken income;\n    uint256 initialWeek;\n    address[MEMBERS] owners;\n    address[MEMBERS] agents;\n\n    function setUp() public {\n        vm.warp(4 days + 100 weeks + 1 days);\n        vm.roll(10);\n        stake = new LocalToken();\n        income = new LocalToken();\n        system = new QuorumLocalSystem(\n            IERC20Local(address(stake)), IERC20Local(address(income)), 62_500 ether,\n            bytes(vm.readFile(\"constitution.en.md\")), new QuorumCodeCatalog()\n        );\n        members = system.membership();\n        funds = system.treasury();\n        work = system.work();\n        initialWeek = members.currentWeek();\n        for (uint256 i; i < MEMBERS; ++i) {\n            owners[i] = address(uint160(0x1000 + i));\n            agents[i] = address(uint160(0x2000 + i));\n            stake.mint(owners[i], 62_500 ether);\n            vm.prank(owners[i]);\n            stake.approve(address(members), 62_500 ether);\n            vm.prank(owners[i]);\n            members.authorize(agents[i], block.timestamp + 365 days);\n            bytes32 digest = members.constitutionHash();\n            vm.prank(agents[i]);\n            require(members.accept(owners[i], 1, digest) == i, \"enrollment id\");\n        }\n        income.mint(address(this), 1000 ether);\n        income.approve(address(funds), 1000 ether);\n        funds.depositRevenue(1000 ether); // 500 allowances, 500 operations\n    }\n\n    function tick() internal {\n        vm.roll(block.number + 1);\n        bytes32 anchor = keccak256(abi.encode(block.number - 1));\n        vm.setBlockhash(block.number - 1, anchor);\n        uint256 week = members.currentWeek();\n        uint256 hour = (block.timestamp - members.weekStart(week)) / 1 hours;\n        for (uint256 i; i < MEMBERS; ++i) {\n            if (members.live(i) && members.hourBitmap(i, week) & (uint256(1) << hour) == 0) {\n                uint256 revision = system.agendaRevision();\n                vm.prank(agents[i]);\n                members.respond(i, block.number - 1, anchor, revision, \"checked agenda\");\n                if (hour == 125) {\n                    vm.prank(agents[i]);\n                    members.report(i, \"weekly report\");\n                }\n            }\n        }\n    }\n\n    function maintainUntil(uint256 target) internal {\n        uint256 next = (block.timestamp / 1 hours + 1) * 1 hours;\n        while (next <= target) {\n            vm.warp(next);\n            uint256 week = members.currentWeek();\n            if (week > initialWeek && !funds.settled(week - 1)) {\n                while (!funds.settled(week - 1)) funds.settleWeek(week - 1, 32);\n            }\n            tick();\n            next += 1 hours;\n        }\n        vm.warp(target);\n    }\n\n    /// Five colluding seats (proposer 0 and voters 1..4) out of ten qualified members must not be\n    /// able to move the whole IMD operating balance to an outside wallet. Expected: the operation\n    /// is refused at proposal, assembly or execution, and the treasury keeps its operating funds.\n    function testFalseBeneficiaryDeclarationCannotCaptureOperatingFunds() public {\n        maintainUntil(members.weekStart(initialWeek + 2));\n        require(funds.qualifiedCount(initialWeek + 1) == MEMBERS, \"all ten qualified\");\n        uint256 operating = funds.operatingFunds();\n        require(operating == 500 ether, \"operating budget\");\n\n        OperatingPlan memory p;\n        p.primaryBudget = operating;\n        p.approvals = new OperatingApproval[](0);\n        p.calls = new OperatingCall[](1);\n        p.calls[0] = OperatingCall(\n            address(income), 0, abi.encodeCall(IERC20Local.transfer, (ATTACKER_WALLET, operating)), bytes32(0)\n        );\n        // Honest seats 6..9 are falsely declared as beneficiaries; seat 5 is left in so that the\n        // electorate still has five voters. Seats 1..4 collude with the proposer (seat 0).\n        address[] memory declared = new address[](4);\n        for (uint256 i; i < 4; ++i) declared[i] = owners[6 + i];\n\n        vm.prank(agents[0]);\n        (bool proposed, bytes memory ret) = address(work).call(\n            abi.encodeCall(QuorumWork.proposeOperation, (0, p, declared, \"Pay an outside contractor\"))\n        );\n        if (proposed) {\n            uint256 id = abi.decode(ret, (uint256));\n            (bool assembled,) = address(work).call(abi.encodeCall(QuorumWork.prepareBallot, (id, 32)));\n            if (assembled) {\n                QuorumWork.Ballot memory b = work.ballot(work.work(id).ballot);\n                // Nine seats other than the proposer are qualified; four honest ones were struck out.\n                // Allies 1..4 vote yes; every honest seat still eligible votes no. Votes a fixed\n                // implementation may refuse are ignored: only the end state is asserted.\n                for (uint256 i = 1; i < MEMBERS; ++i) {\n                    if (!work.eligible(work.work(id).ballot, i)) continue;\n                    vm.prank(agents[i]);\n                    address(work).call(abi.encodeCall(QuorumWork.vote, (id, i, i <= 4)));\n                }\n                maintainUntil(b.started + 120 hours);\n                (bool executed,) = address(work).call(abi.encodeCall(QuorumWork.executeOperation, (id, p)));\n                require(!executed, \"four colluding votes out of ten qualified seats executed the plan\");\n            }\n        }\n        require(income.balanceOf(ATTACKER_WALLET) == 0, \"operating funds captured by minority\");\n        require(funds.operatingFunds() == operating, \"operating funds moved\");\n    }\n}","reproduction":"State: 10 enrolled seats (owners 0x1000..0x1009, agents 0x2000..0x2009) all qualified for week W-1 and settled; treasury operatingFunds (IMD) = 500e18. Calls: (1) agent0: proposeOperation(0, plan{primaryBudget:500e18, calls:[income.transfer(0xBAD,500e18)]}, beneficiaries=[owners 6,7,8,9], 'Pay an outside contractor'). (2) prepareBallot(id,32) -> ballot.voters == 5 (seats 1..5; 6..9 excluded although the plan never touches them). (3) agents 1..4 vote yes, agent5 votes no. (4) warp started+120h; executeOperation(id, plan) succeeds. Actual: income.balanceOf(0xBAD)==500e18 and operatingFunds()==0 with 4 yes votes out of 10 qualified seats. Expected: the plan needs ceil(2*9/3)=6 yes votes among the nine non-applicant qualified seats, so execution reverts with 'approval' and operatingFunds stays 500e18. Proof test: test/scratch/RecusalCapture.t.sol (fails now with 'four colluding votes out of ten qualified seats executed the plan').","severity":"high","snippet":"        for(uint256 i;i<beneficiaries.length;++i)recused[id][beneficiaries[i]]=true;","title":"Operation proposer shrinks the electorate by declaring non-beneficiaries; a 5-seat minority can drain all operating funds"},{"citation":"resolved","description":"Every outgoing path of the treasury (_pay, executeOperating, _allowance) spends only ledger amounts, and the only way a ledger grows is _deposit's transferFrom with an exact-receipt delta check. A plain ERC20 transfer of IMD or QPROBE to the treasury address (a donation, a protocol that pays by transfer, fees mis-routed by a future requester, or tokens a work recipient sends back) raises balanceOf but no ledger, and nothing can ever move the surplus: the hook's flushRevenue and QuorumRevenueSink.flush only account balances held by the hook/sink, not by the treasury. The invariant 'balanceOf(treasury) == accountedAssetBalance' that the suites assert therefore only holds while nobody transfers to the address, and value that reaches it this way is permanently lost to the DAO. Minimal fix: a permissionless flush on the treasury that deposits balanceOf(this) - accountedAssetBalance(a) through the same 50/50 split (as the sink does), or document the address as non-receivable.","line":66,"path":"src/QuorumTreasury.sol","reproduction":"State: any deployed core; accountedBalance()==X. Call: imd.transfer(address(treasury), 1e18) from any holder. Actual: imd.balanceOf(treasury)==X+1e18, accountedBalance()==X, and no external function (depositRevenue requires transferFrom from msg.sender; pay/reserve/release are onlyWork and ledger-bounded) can ever allocate or withdraw the 1e18. Expected: a donation to the treasury address is either accounted (half allowances, half operations) or refused.","severity":"low","snippet":"        Ledger storage l=ledgers[a];return l.allowancePool+l.earnedAllowances+l.operatingFunds+l.reservedWork+l.earnedWork;","title":"IMD or project tokens sent directly to QuorumTreasury are stranded: no accounting path, no sweep"}],"hash":"13d5534611477670c592d04747b429c91a3a055197c55eb3f4a65d0d13f88c8d","nodeId":"42364896-f73a-4a8a-b4d6-d5b76e4ec7a0","outcome":"completed","summary":"Review complete. The findings file is written and verified against the tree.\n\n**Result: one high and one low finding in the economics area, written to `.imd-findings.json` with 80 coverage rows.**\n\n- **High, governance capture through the recusal list** (`src/QuorumWork.sol:178`). An operation proposer can name any addresses as \"beneficiaries\", and those seats are silently struck from the electorate before assembly. Combined with the 5-voter minimum and a threshold computed on the assembled electorate, a proposer plus four allied seats can pass a plan that transfers the entire IMD and project operating balance to an outside wallet, in any DAO of up to roughly 70 qualified seats. The proof test under `test/scratch/RecusalCapture.t.sol` builds a 10-seat core, strikes four honest seats, passes the drain with 4 yes votes, and fails on the current code with the expected message. The same 4 votes fail without the false declaration. The proof uses the repository's inline cheat-code interface because this tree ships no forge-std.\n- **Low, stranded direct transfers to the treasury** (`src/QuorumTreasury.sol:66`). Any token sent to the treasury by plain transfer raises its balance but no ledger, and no function can ever allocate or move it.\n\n**What I verified and found sound:** the 3% ceil tax on actual AMM deltas both ways with single atomic deposit, the 50/50 split per asset with odd unit to operations, the allowance-pool-equals-scheduled-sum invariant across batched settlement and carry, work reserve and release symmetry across every stage, quota ordering (purchase, then unlocked grant, then rewards), fixed stake carry and refund paths, operating execution isolation with non-nested income and un-resplit refunds, and the hook's pair, fee and initialization guards. The existing 82 positive and compatibility tests pass.\n\n**Not reached:** the legacy prototypes (AuthenticatedRouterPrototype, RestrictedPoolPrototype, WorkCyclePrototype) are outside the launch composition and are marked unreached. Behavior of the live IMD token under blacklist or pause was not testable here and is assumed standard.","treeHash":null,"usage":{"cachedInputTokens":2630399,"inputTokens":610,"model":"claude-fable-5-1","outputTokens":51225,"runtime":"claude","turns":42,"wallClockMs":809665}},{"artifacts":[],"attempt":1,"bundleHash":"d5b2c3eb0cca19d8429e42f12e62e6437d5f93e336dedd70b83b293ccef95ae0","device":"fa2b0b9c7ebc1547","findings":[],"hash":"274a10ad09c8be6dd6a0f6e772305180aacfbb120bbf8b792b590fbffada3590","nodeId":"70507d0d-5227-4081-982f-c1d2b451083e","outcome":"completed","summary":"Committed as `dae0a09`. The working tree is clean and the pinned suite hashes are untouched.\n\n**Outcome**: the project is ready for manifest dispatch for the second Quorum Compatibility Probe test. No file under `src/` changed, so the core creation hash, the zero-argument token and the hook's reviewed bytecode are exactly what was already verified.\n\n**What I verified**\n\n- Prerequisites are VERIFIED_DEPLOYED and I rechecked them live on Ethereum at block 26230371. The package's `creationHash()` and the bytes reconstructed from its two on-chain parts equal the compiled core byte for byte. The constitution contract's stored text equals the committed English text. IMD reports symbol IMD and 18 decimals.\n- `getHookPermissions()` returns exactly beforeInitialize, beforeAddLiquidity, beforeSwap, afterSwap, and the four callbacks carry the IHooks selectors. Undeclared callbacks are not implemented.\n- Transaction limits hold with the real factory bytecode: about 13.77M gas estimated for the full launch transaction in forge, and 13.25M in two Osaka Anvil rehearsals with the 16,777,216 cap enforced. Initcodes and all eleven deployed runtimes are under their caps.\n- Full default suite: 42 tests pass with the verifier's fuzz seed, including all 26 mandatory cases. The gate script passes in submission mode.\n\n**Audit findings**\n\n- The medium finding reproduced. With the payer as requester, platform-fee collection reverts and `claimFees` pays the payer. I kept the guard, since the hook cannot change the factory's requester and removing it would break 50/50 accounting, and added a test covering the one-time `setRequester(launchNumber, hook)` handover and the correct split afterwards. It is disclosed in README.md, ADAPTATION.md and PREREQUISITES.json as a required post-launch chain check.\n- The stale `launch.json` notes and `PREREQUISITES.json` lists both reproduced and are fixed. The manifest's structural fields are unchanged.\n\n**One disclosed risk**: both constructors need mainnet state. The token checks code at the pinned addresses and the hook creates the Core through the package, as the brief requires, so an admission simulation on an empty chain without a fork would revert. ADAPTATION.md lists this, along with the launch-reference items I deliberately did not apply, such as the ETH-settled hook fee and an owner argument, because the requester's immutable governance rules forbid them.\n\n**Open after this work**: IMD's manifest integration, audits and the official launch; then reading `Hook.core()` and the registry record, and the payer's `setRequester` handover.","treeHash":"49bcf03778e96ecda22e2f2fd019847d9db96d1b","usage":{"cachedInputTokens":2031590,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":48829,"runtime":"claude","turns":59,"wallClockMs":735381}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"13603a08ada71730","findings":[],"hash":"4508a7fa2b159679c689553d433e59b6588523a9a3ca5864a869b43fed651ca1","nodeId":"70507d0d-5227-4081-982f-c1d2b451083e","outcome":"failed","summary":"needs input: A newly reviewed and deployed immutable core-creation package (its mainnet address, creation keccak256 and part addresses) that fixes finding d4c39603750d: QuorumWork.proposeOperation (src/QuorumWork.sol:178-180) writes every caller-supplied beneficiary, call target and approval spender into recused[id], so the proposer chooses who may vote. Reproduced on this tree: with 10 qualified seats the proposer declares owners 6..9 as beneficiaries, the ballot shrinks to 5 voters, 4 colluding yes votes meet the 2/3 threshold and executeOperation sends all 500e18 operating IMD to 0xBAD (proof test/Proof_d4c39603750d fails with 'four colluding votes out of ten qualified seats executed the plan'). QuorumWork is created inside QuorumTreasury, which QuorumBoundCore creates, so any fix changes the Core creation bytes away from the deployed package 0xa4709b43764d74af689fdce38ea903c353dba8e5 (creationKeccak256 0x3bd4bffb...6c0d). The Hook creates the Core from that on-chain package, so a source-only fi","treeHash":null,"usage":{"cachedInputTokens":370364,"inputTokens":16,"model":"claude-opus-5-5","outputTokens":3745,"runtime":"claude","turns":8,"wallClockMs":67726}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d2b8b66fa0a1ce68","findings":[{"citation":"resolved","description":"QuorumOperatingAccount._returnAsset sweeps the account's ENTIRE balance of each supported asset and QuorumTreasury.executeOperating (src/QuorumTreasury.sol:153, `p.operatingFunds+=returnedPrimary;q.operatingFunds+=returnedProject;`) credits the whole swept amount to operatingFunds as an 'unused budget refund'. The sweep does not distinguish the budget the treasury just sent from tokens that were already sitting in the persistent operating account (a direct transfer from anyone, LP-fee or distributor payouts addressed to the account, or tokens left by an external call that paid the account). Every other income path (hook.flushRevenue, QuorumRevenueSink.flush, router tax) goes through _deposit and is split 50% allowancePool / 50% operatingFunds. Through the operating account the same tokens are booked 100% to operatingFunds and 0% to the members' allowance pool, so the 'separate 50/50 accounting per supported asset' rule can be sidestepped simply by choosing the operating account as the destination of a payment. Execution trace: executeOperating deducts plan.primaryBudget (say 0) -> execute() runs a harmless call -> _returnAsset reads balanceOf = 100e18 (the stray tokens) -> transfers 100e18 to treasury -> executeOperating adds 100e18 to p.operatingFunds; allowancePool and scheduledAsset are unchanged.","line":42,"path":"src/QuorumOperatingAccount.sol","reproduction":"State: launched system (ImdFactoryPositive setUp), 7 qualified members, treasury.operatingFunds()=X, allowancePool()=A. 1) imd.mint(attacker,100e18); vm.prank(attacker); imd.transfer(address(treasury.operatingAccount()),100e18). 2) Propose and approve any operating plan with primaryBudget=0, projectBudget=0, nativeBudget=0, approvals=[], calls=[{target: NormalOperationService, data: confirm()}]; vote 4 yes of 6; warp 120h. 3) work.executeOperation(id,plan). Expected (per the 50/50 rule applied to every other receipt): operatingFunds = X+50e18, allowancePool = A+50e18, scheduled(currentWeek+1) += 50e18. Actual: operatingFunds = X+100e18, allowancePool = A, scheduled unchanged; OperatingExecuted(0,0,0) is emitted and no Income event is emitted for the 100e18. The same 100e18 sent to the hook and flushed would have produced Income(...,100e18,...,50e18).","severity":"low","snippet":"        amount=IERC20Local(asset).balanceOf(address(this));\n        if(amount>0)require(IERC20Local(asset).transfer(treasury,amount),\"return funds\");","title":"Operating-account refund sweep returns stray balances as operating funds, bypassing the 50/50 income split"},{"citation":"resolved","description":"The treasury's five ledger buckets are the only spendable balances; every outward path (claimAllowance, pay, executeOperating) decrements a bucket before transferring. _deposit is the only function that increments buckets and it books exactly `amount` pulled by transferFrom from msg.sender (line 74-77). There is no function that reconciles token balance against accountedAssetBalance, so any supported-asset tokens that arrive by plain transfer are frozen forever: they are not allowance, not operating funds, and no entry point can move them. This is reachable from inside the protocol, not only by mistaken senders: QuorumWork.propose accepts recipient=address(treasury) (only recipient!=0 is checked, src/QuorumWork.sol:121), and _pay then does a self-transfer `IERC20Local(a).transfer(recipient,amount)` (line 132) which succeeds, decrements earnedWork and leaves the balance unchanged, so the whole work budget becomes dead balance; an approved operating call `imd.transfer(treasury,X)` (allowed by the 'token transfer only' guard) does the same.","line":65,"path":"src/QuorumTreasury.sol","reproduction":"State: launched system with treasury IMD balance == accountedBalance() == B. Input A: any EOA calls imd.transfer(address(treasury), 1e18). Afterwards imd.balanceOf(treasury) == B+1e18 while accountedBalance() == B; no call sequence (depositRevenue reverts 'exact receipt' for a different amount and cannot pull from the treasury's own balance; claimAllowance/pay/executeOperating only spend buckets) ever makes the 1e18 spendable. Input B (protocol path): with the budget vote machinery of GovernancePositive, call work.propose(applicant, worker, recipient=address(core.treasury()), budget=10e18, deadline, terms); assemble, approve, fund, submit, approve acceptance, accept, claim. Expected: a payment to a fixed recipient or a revert for a self-recipient. Actual: claim succeeds, Paid(id, treasury, 10e18) is emitted, earnedWork drops by 10e18, treasury balance is unchanged and accountedBalance() is now 10e18 below balanceOf; the 10e18 is unrecoverable by any entry point.","severity":"low","snippet":"    function accountedAssetBalance(address a) public view returns(uint256) {\n        Ledger storage l=ledgers[a];return l.allowancePool+l.earnedAllowances+l.operatingFunds+l.reservedWork+l.earnedWork;\n    }","title":"Tokens that reach QuorumTreasury outside _deposit are permanently unaccounted and unrecoverable"},{"citation":"resolved","description":"Each week's settlement snapshots rosterLimit = membership.enrollmentCount() and iterates ids 0..rosterLimit-1 (lines 93-96), calling membership.registeredAtStart and membership.qualified (which itself calls agenda.isSuspended -> work.isSuspended) for every id. enrollmentCount only grows: every key rotation (authorize+accept) and every exit creates or orphans an id that is still scanned forever, 32 ids per transaction (limit<=32). QuorumWork._newBallot (src/QuorumWork.sol:96-97) requires the preceding week to be settled, so no work, operation or suspension can be proposed and no delivery can be submitted until the full scan completes, every week, for the life of the DAO. A single 62,500-token stake can be recycled (accept -> requestExit -> wait 7 days -> withdraw -> authorize/accept from a fresh address) to add one permanent id per cycle at gas cost only, and ordinary churn does the same honestly. This is the Periphery guide's 'loop whose worst-case gas bricks critical protocol functions': there is no pruning of ended/exited ids and no per-week registration list.","line":89,"path":"src/QuorumTreasury.sol","reproduction":"State: enrollmentCount = E after churn (e.g. E = 100,000 reached by cycling the same stake through fresh addresses, or by years of ordinary rotation/exit). Input: at the start of any week W+1, anyone must call treasury.settleWeek(W, 32) until weekInfo(W).done; that is ceil(E/32) = 3,125 separate transactions for E=100,000, each doing 32 x (2 external view calls into membership, one of which calls back into work) before any proposal, operation, suspension or delivery for week W+1 can be created (QuorumWork._newBallot reverts 'settle preceding week' until then). Expected: settlement cost bounded by the active roster for the week. Actual: cost proportional to all ids ever issued, including ids whose endWeek < W or stake == 0, and it must be paid again every week. Measured on the launched fixture (GovernancePoolPositive setup, 7 live seats plus 57 enrollments that accepted and immediately requested exit, enrollmentCount=64): settleWeek(week,32) costs 578,079 gas for the first batch and 476,435 gas for the second, i.e. about 14,900 gas per id, exited ids included. So E=1,000 already needs 32 transactions and about 15M gas every week; E=100,000 needs 3,125 transactions and about 1.5 billion gas every week before any ballot can be created.","severity":"low","snippet":"            w.started=true;w.rosterLimit=membership.enrollmentCount();w.budget=scheduledAsset[address(asset)][week];","title":"settleWeek scans every enrollment id ever created; exited and rotated ids are never pruned, so weekly settlement cost grows without bound and gates all governance"}],"hash":"8468bbda40ce929c49a79771acb8d6232af34b92bed556b5e2549fe0d4fca514","nodeId":"8a5a8d77-59a0-467f-b0dc-31892178a9ab","outcome":"completed","summary":"Review complete. The findings file is written and validated, the scratch tests are removed, and the tree is otherwise unchanged.\n\n**Outcome.** The production control flow for the second Quorum Compatibility Probe launch holds up well under the Execution Trace, Periphery and First Principles checklists. I traced every state-changing entry point listed by the verifier, plus three invariants, and found no critical, high or medium defect. Three low-severity findings are recorded in `.imd-findings.json`, each with a concrete input or state, and the first two were confirmed by running scratch tests against the compiled system.\n\n**Findings.**\n- **Operating-account sweep bypasses the 50/50 split (low).** Any supported-asset balance already sitting on the persistent operating account is returned as an \"unused budget refund\" and booked 100% to operating funds. Confirmed: 100 IMD sent to the account before a no-op approved operation raised operatingFunds by exactly 100 IMD with zero allowance share.\n- **Direct transfers to the treasury are frozen forever (low).** No entry point reconciles balance against the ledger buckets. This is reachable from protocol paths too, since a work proposal may name the treasury itself as recipient and the resulting self-transfer silently drops the budget from earnedWork. Confirmed for the direct transfer case.\n- **Weekly settlement scans every enrollment id ever created (low).** Exited and rotated ids are never pruned and every ballot depends on the preceding week being settled. Measured about 14,900 gas per id and about 476k gas per batch of 32, so a roster history of 1,000 ids already costs 32 transactions each week.\n\n**Coverage.** All 78 listed entry points have rows, 74 marked holds and 4 pointing at the findings above, plus rows for the allowance-pool/scheduled-sum invariant, the once-only income split during operations, and the launch manifest's constructor-argument and 0x28c0 permission match. Nothing was left unreached. The hook callbacks, router settlement for both currency orders, treasury ledger math, work-cycle stage machine, suspension scheduling and membership key rotation were traced in depth. Prototype and local-fixture contracts were read and marked as non-launch surfaces.\n\n**What I could not do.** The full default test suite was not rerun end to end because the via-IR build alone took about 20 minutes of the budget; the 11 inherited pool and governance tests that my scratch suite pulled in all passed, and the factory launch measured 13,308,250 gas with an 18,154-byte hook initcode, consistent with the manifest's claims.","treeHash":null,"usage":{"cachedInputTokens":2867010,"inputTokens":706,"model":"claude-fable-5-1","outputTokens":62350,"runtime":"claude","turns":56,"wallClockMs":2827920}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"476778ae63dff113","findings":[{"citation":"resolved","description":"collectPlatformFees requires the factory's positionOf(launchNumber).requester to be the hook. In a real IMD launch the deployer sets requester to the payer/owner (e.g. mainnet launch 2176 had requester 0x92ce...90c4), not to the hook. The positive tests hide this because they set p.requester=factory.predictHook(...) at launch (test/compatibility/FixedTokenBindingPositive.t.sol:89), which the production deployer does not do. Until the payer calls LaunchFactory.setRequester(launchNumber, hook), the requester share of LP fees goes to the payer and does not reach the treasury. The 50/50 accounting of fee income is then not enforced by code.","line":82,"path":"src/QuorumIssuanceHook.sol","reproduction":"Run the FixedTokenBindingPositive setUp with p.requester=address(0xA11CE) (the payer) instead of the predicted hook, then call hook.collectPlatformFees(NUMBER). Expected: fees reach core.treasury(). Actual: it reverts with 'fee destination not bound'. factory.claimFees(NUMBER) still pays 0xA11CE. Fix or disclose: the payer must call setRequester(launchNumber, hook) after launch, and that handover must be shown in final chain checks.","severity":"medium","snippet":"        require(recipient==address(this),\"fee destination not bound\");","title":"Platform-fee collection reverts unless the factory requester is handed over from the payer to the Hook"},{"citation":"resolved","description":"The manifest notes say 'New code-package deployment and token address binding are pending user approval. Do not submit or deploy this draft.' PREREQUISITES.json says VERIFIED_DEPLOYED, QProbeToken already binds 0xa4709b43..., and onchain creationHash() equals the compiled QuorumBoundCore hash. The notes are stale and contradict the launch they describe.","line":28,"path":"launch.json","reproduction":"Read launch.json notes and compare them with PREREQUISITES.json status VERIFIED_DEPLOYED and src/QProbeToken.sol:9. Expected: the notes describe the deployable candidate. Actual: the notes say not to deploy.","severity":"low","snippet":"  \"notes\": \"LOCAL SECOND-TEST CANDIDATE ONLY. New code-package deployment and token address binding are pending user approval. Do not submit or deploy this draft. Preserve immutable constitution and all governance semantics. Hook permissions must match getHookPermissions() and 0x28c0. Production pool price must be derived from current official IMD policy and actual address order, not the placeholder initialPrice. Final external-code hashes and receipts must be verified before submission.\"","title":"launch.json notes forbid deployment and claim the package is still pending"},{"citation":"resolved","description":"requiredBeforeSubmission still lists deploying the new package and binding its address, plus a candidatePlaceholder 0x...c0de02. Meanwhile newDeploymentRequired=false. I verified independently that cast call 0xa4709b43...creationHash() on mainnet returns 0x3bd4bffb...6c0d. That equals keccak256 of the compiled QuorumBoundCore creation code (39,860 bytes). The constitution.en.md sha256 also equals bdcd5942...28d7, and both addresses have code. The deployment is done, so these list entries are stale. The remaining open items are explicit user approval and the official-policy/fee-handover check.","line":23,"path":"PREREQUISITES.json","reproduction":"Run jq .coreCode.newDeploymentRequired,.requiredBeforeSubmission PREREQUISITES.json. It returns false next to 'Deploy new package...'. Expected: consistent status.","severity":"info","snippet":"    \"Deploy new package and verify chain=1 receipts, runtime and creation bytes\",","title":"PREREQUISITES.json keeps stale pre-deployment requirements alongside VERIFIED_DEPLOYED"}],"hash":"8f3ec3c57e5a8e5d219fbd0d568f1487079573ea7936bc1577ed5a89da95ced8","nodeId":"8e14ace3-8d2d-4dbb-b46a-8ceba42047e5","outcome":"completed","summary":"I found no high or critical defects. The one real launch problem is that platform fees can't reach the treasury until the payer hands their fee position over to the Hook. I wrote three findings to `.imd-findings.json` and changed no repository files. I did not deploy anything and am not claiming a deployment succeeded.\n\n**What checks out:**\n- **Tests:** all 36 tests under the default test root pass with no skips, including the 26 mandatory cases in `ACCEPTANCE.json`.\n- **Core package:** the compiled `QuorumBoundCore` creation code is 39,860 bytes and its keccak256 is `0x3bd4bffb…6c0d`. That matches `PREREQUISITES.json`. On mainnet, `creationHash()` at `0xa4709b43…` returns the same value.\n- **Constitution:** the sha256 of `constitution.en.md` matches the pinned `bdcd5942…28d7`. Code exists at the constitution and core-package addresses, and `QProbeToken` binds both with no constructor arguments.\n- **Hook permissions:** `getHookPermissions()` returns exactly beforeInitialize, beforeAddLiquidity, beforeSwap and afterSwap. That matches `launch.json`, and the hook's own constructor checks the address bits. `beforeInitialize` only accepts the factory, and the pool settings fit the policy: fee 12500, tick spacing 60, 90% to the pool.\n- **Size and gas:** the factory launch uses about 13.31M execution gas; adding calldata cost I estimate it stays under 16,777,216. Hook initcode is 18,090 bytes and token initcode 3,087, both under 49,152. Every runtime is under 24,576; the largest is the hook at 8,314.\n\n**Findings:**\n1. **Medium – fee collection reverts in a real launch.** `QuorumIssuanceHook.sol:82` requires the factory's fee recipient for the launch to be the Hook. A real launch sets it to the payer, so `collectPlatformFees` reverts and the payer keeps the fees. The tests hide this by setting the recipient to the predicted Hook at launch. The payer has to call `LaunchFactory.setRequester(launchNumber, hook)`, and the final chain checks need to confirm it.\n2. **Low – stale `launch.json` notes.** They still say \"Do not submit or deploy this draft\" and describe the package as pending, which contradicts `PREREQUISITES.json`.\n3. **Info – stale entries in `PREREQUISITES.json`.** It still lists \"Deploy new package…\" and a placeholder address while also saying no new deployment is required.\n\n**Read:** every file in `src/` (all 19 contracts; the hook, router, quota, core package, token and launch-proof contracts in depth). I also read all the tests, `launch.json`, `PREREQUISITES.json`, `ACCEPTANCE.json`, the evidence and policy fixtures, and the external factory ABIs.\n\n**Not reached:**\n- I skimmed `QuorumTreasury`, `QuorumWork` and `QuorumMembership` rather than auditing them line by line; the passing tests are what cover them.\n- I only had the external factory and pool manager as compiled ABIs and bytecode, not their source.\n- I did not confirm on chain that the current official launch policy is still version 34.","treeHash":null,"usage":{"cachedInputTokens":533300,"inputTokens":26,"model":"claude-opus-5-5","outputTokens":6677,"runtime":"claude","turns":13,"wallClockMs":173509}},{"artifacts":[],"attempt":1,"bundleHash":"2f217f6ed2ffa5c728a9185382c7093a8e095a42c385f8b3ea216388410e0647","device":"e89087c02a1681bf","findings":[],"hash":"9107b6169f4814d6e8e36499e5b4929fbb90f8472b977314a78da082f7999103","nodeId":"fc8a0e0d-79c5-4666-a08a-081479f3d895","outcome":"completed","summary":"Updated only `launch.json`; notes remain under 4,000 characters and document verification, audit findings and the required fee handover.\n\n- Manifest checks and `forge build` passed.\n- All 108 tests passed, including all 26 mandatory cases, with the supplied seed.\n- Mainnet dependency bytes matched; local launch replay used 13,365,876 gas.\n\nOfficial deployment, final live bindings/registry checks and payer-to-Hook fee handover remain pending.","treeHash":"c85fa88620c0197b7fcc799db942829d0e8ee88d","usage":{"cachedInputTokens":1211520,"inputTokens":90194,"model":"gpt-6-astra","outputTokens":9618,"runtime":"codex","turns":6,"wallClockMs":281823}},{"artifacts":[],"attempt":1,"bundleHash":"dbdaea96576b1e4c96a71807c713b6e4656b4ba8d61a1d92f15bcbdb8a074c82","device":"d6415252dcd668d9","findings":[],"hash":"95bd8ba51c0d5eca1ee33a13a227dc1d7b110a0c705d49935fdbb984b9eb04e1","nodeId":"b6a26f86-4125-4045-ab74-31617c8d2859","outcome":"completed","summary":"Created [reports/gas.md](reports/gas.md) and [.gas-snapshot](.gas-snapshot).\n\n- Build and all 108 test results pass, including all mandatory cases.\n- Full launch: **13,365,876 gas**; initcode and runtimes fit.\n- The 128-contributor variant exceeds the cap; final metadata and live-launch checks remain pending.\n\nCommit blocked: Git could not create `.git/index.lock` because `.git` is read-only.","treeHash":"2603cd9cef297dfea218966dd796777e9d747642","usage":{"cachedInputTokens":8425856,"inputTokens":204360,"model":"gpt-6-astra","outputTokens":53280,"runtime":"codex","turns":9,"wallClockMs":1427294}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e293ff3324f7ddb5","findings":[{"citation":"resolved","description":"proposeOperation writes every caller-supplied beneficiary, call target and approval spender into recused[id] without checking the plan touches them; entryEligible drops those seats and threshold() is ceil(2/3) of the reduced voters count, with only voters>=5 required. Proposer chooses the electorate.","line":178,"path":"src/QuorumWork.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.28;\n// Proof for: an operation proposer shrinks the electorate by declaring honest voters as\n// \"beneficiaries\" (QuorumWork.proposeOperation -> recused[id][addr]) and passes a treasury\n// draining plan with 4 colluding yes votes out of 10 qualified members.\n// This tree ships no forge-std, so the cheat-code interface is declared inline, as the\n// repository's own tests do.\nimport {QuorumLocalSystem} from \"src/QuorumLocalSystem.sol\";\nimport {QuorumMembership, IERC20Local} from \"src/QuorumMembership.sol\";\nimport {QuorumTreasury} from \"src/QuorumTreasury.sol\";\nimport {QuorumWork} from \"src/QuorumWork.sol\";\nimport {LocalToken} from \"src/LocalFixtures.sol\";\nimport {QuorumCodeCatalog} from \"src/QuorumCodeCatalog.sol\";\nimport {OperatingPlan, OperatingApproval, OperatingCall} from \"src/QuorumOperatingAccount.sol\";\n\ninterface ScratchVm {\n    function prank(address) external;\n    function warp(uint256) external;\n    function roll(uint256) external;\n    function setBlockhash(uint256, bytes32) external;\n    function readFile(string calldata) external view returns (string memory);\n}\n\ncontract RecusalCaptureTest {\n    ScratchVm constant vm = ScratchVm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n    uint256 constant MEMBERS = 10;\n    address constant ATTACKER_WALLET = address(0xBAD);\n    QuorumLocalSystem system;\n    QuorumMembership members;\n    QuorumTreasury funds;\n    QuorumWork work;\n    LocalToken stake;\n    LocalToken income;\n    uint256 initialWeek;\n    address[MEMBERS] owners;\n    address[MEMBERS] agents;\n\n    function setUp() public {\n        vm.warp(4 days + 100 weeks + 1 days);\n        vm.roll(10);\n        stake = new LocalToken();\n        income = new LocalToken();\n        system = new QuorumLocalSystem(\n            IERC20Local(address(stake)), IERC20Local(address(income)), 62_500 ether,\n            bytes(vm.readFile(\"constitution.en.md\")), new QuorumCodeCatalog()\n        );\n        members = system.membership();\n        funds = system.treasury();\n        work = system.work();\n        initialWeek = members.currentWeek();\n        for (uint256 i; i < MEMBERS; ++i) {\n            owners[i] = address(uint160(0x1000 + i));\n            agents[i] = address(uint160(0x2000 + i));\n            stake.mint(owners[i], 62_500 ether);\n            vm.prank(owners[i]);\n            stake.approve(address(members), 62_500 ether);\n            vm.prank(owners[i]);\n            members.authorize(agents[i], block.timestamp + 365 days);\n            bytes32 digest = members.constitutionHash();\n            vm.prank(agents[i]);\n            require(members.accept(owners[i], 1, digest) == i, \"enrollment id\");\n        }\n        income.mint(address(this), 1000 ether);\n        income.approve(address(funds), 1000 ether);\n        funds.depositRevenue(1000 ether); // 500 allowances, 500 operations\n    }\n\n    function tick() internal {\n        vm.roll(block.number + 1);\n        bytes32 anchor = keccak256(abi.encode(block.number - 1));\n        vm.setBlockhash(block.number - 1, anchor);\n        uint256 week = members.currentWeek();\n        uint256 hour = (block.timestamp - members.weekStart(week)) / 1 hours;\n        for (uint256 i; i < MEMBERS; ++i) {\n            if (members.live(i) && members.hourBitmap(i, week) & (uint256(1) << hour) == 0) {\n                uint256 revision = system.agendaRevision();\n                vm.prank(agents[i]);\n                members.respond(i, block.number - 1, anchor, revision, \"checked agenda\");\n                if (hour == 125) {\n                    vm.prank(agents[i]);\n                    members.report(i, \"weekly report\");\n                }\n            }\n        }\n    }\n\n    function maintainUntil(uint256 target) internal {\n        uint256 next = (block.timestamp / 1 hours + 1) * 1 hours;\n        while (next <= target) {\n            vm.warp(next);\n            uint256 week = members.currentWeek();\n            if (week > initialWeek && !funds.settled(week - 1)) {\n                while (!funds.settled(week - 1)) funds.settleWeek(week - 1, 32);\n            }\n            tick();\n            next += 1 hours;\n        }\n        vm.warp(target);\n    }\n\n    /// Five colluding seats (proposer 0 and voters 1..4) out of ten qualified members must not be\n    /// able to move the whole IMD operating balance to an outside wallet. Expected: the operation\n    /// is refused at proposal, assembly or execution, and the treasury keeps its operating funds.\n    function testFalseBeneficiaryDeclarationCannotCaptureOperatingFunds() public {\n        maintainUntil(members.weekStart(initialWeek + 2));\n        require(funds.qualifiedCount(initialWeek + 1) == MEMBERS, \"all ten qualified\");\n        uint256 operating = funds.operatingFunds();\n        require(operating == 500 ether, \"operating budget\");\n\n        OperatingPlan memory p;\n        p.primaryBudget = operating;\n        p.approvals = new OperatingApproval[](0);\n        p.calls = new OperatingCall[](1);\n        p.calls[0] = OperatingCall(\n            address(income), 0, abi.encodeCall(IERC20Local.transfer, (ATTACKER_WALLET, operating)), bytes32(0)\n        );\n        // Honest seats 6..9 are falsely declared as beneficiaries; seat 5 is left in so that the\n        // electorate still has five voters. Seats 1..4 collude with the proposer (seat 0).\n        address[] memory declared = new address[](4);\n        for (uint256 i; i < 4; ++i) declared[i] = owners[6 + i];\n\n        vm.prank(agents[0]);\n        (bool proposed, bytes memory ret) = address(work).call(\n            abi.encodeCall(QuorumWork.proposeOperation, (0, p, declared, \"Pay an outside contractor\"))\n        );\n        if (proposed) {\n            uint256 id = abi.decode(ret, (uint256));\n            (bool assembled,) = address(work).call(abi.encodeCall(QuorumWork.prepareBallot, (id, 32)));\n            if (assembled) {\n                QuorumWork.Ballot memory b = work.ballot(work.work(id).ballot);\n                // Nine seats other than the proposer are qualified; four honest ones were struck out.\n                // Allies 1..4 vote yes; every honest seat still eligible votes no. Votes a fixed\n                // implementation may refuse are ignored: only the end state is asserted.\n                for (uint256 i = 1; i < MEMBERS; ++i) {\n                    if (!work.eligible(work.work(id).ballot, i)) continue;\n                    vm.prank(agents[i]);\n                    address(work).call(abi.encodeCall(QuorumWork.vote, (id, i, i <= 4)));\n                }\n                maintainUntil(b.started + 120 hours);\n                (bool executed,) = address(work).call(abi.encodeCall(QuorumWork.executeOperation, (id, p)));\n                require(!executed, \"four colluding votes out of ten qualified seats executed the plan\");\n            }\n        }\n        require(income.balanceOf(ATTACKER_WALLET) == 0, \"operating funds captured by minority\");\n        require(funds.operatingFunds() == operating, \"operating funds moved\");\n    }\n}","reproduction":"10 qualified seats, operatingFunds=500e18. agent0 proposeOperation(plan transferring 500e18 to 0xBAD, beneficiaries=[owners 6..9]); prepareBallot -> voters=5; agents1..4 vote yes (threshold 4); warp 120h; executeOperation succeeds, 0xBAD gets 500e18. Expected: 6 yes of 9 required, revert 'approval'. Ran specialist proof test/scratch/Proof_e45b17889d26.t.sol: fails with 'four colluding votes out of ten qualified seats executed the plan'.","severity":"high","snippet":"        for(uint256 i;i<beneficiaries.length;++i)recused[id][beneficiaries[i]]=true;","title":"Operation proposer can recuse arbitrary seats via beneficiaries/call targets, shrinking electorate so a 5-seat minority drains operating funds"},{"citation":"resolved","description":"Ledger buckets only grow via _deposit's transferFrom; no reconciliation/sweep. Direct transfers, or work.propose with recipient=address(treasury) (only recipient!=0 checked, QuorumWork.sol:121), make funds dead balance. Merged from economics and flow reports.","line":65,"path":"src/QuorumTreasury.sol","reproduction":"imd.transfer(treasury,1e18): balanceOf rises by 1e18, accountedBalance() unchanged, no entry point can spend it. Or propose work with recipient=treasury, complete and claim: earnedWork drops by budget, balance unchanged.","severity":"low","snippet":"    function accountedAssetBalance(address a) public view returns(uint256) {","title":"Supported-asset tokens reaching QuorumTreasury outside _deposit are permanently unaccounted (incl. work recipient = treasury)"},{"citation":"resolved","description":"_returnAsset sweeps the entire balance and executeOperating credits it all to operatingFunds, so tokens sent to the operating account skip the allowance half.","line":42,"path":"src/QuorumOperatingAccount.sol","reproduction":"Transfer 100e18 IMD to operatingAccount; approve and execute a plan with zero budgets. Actual operatingFunds +=100e18, allowancePool unchanged; expected +50e18/+50e18.","severity":"low","snippet":"        returnedPrimary=_returnAsset(primary);returnedProject=_returnAsset(project);","title":"Operating-account refund sweep books stray balances 100% to operatingFunds, bypassing the 50/50 split"},{"citation":"resolved","description":"rosterLimit=enrollmentCount which never prunes exited/rotated ids; _newBallot requires prior week settled.","line":93,"path":"src/QuorumTreasury.sol","reproduction":"With enrollmentCount=1000 (churned via accept/requestExit/withdraw), each week needs 32 settleWeek txs (~15k gas/id, ~15M gas) before any ballot can be created.","severity":"low","snippet":"        for(uint256 id=w.cursor;id<end;++id){","title":"settleWeek iterates all enrollment ids ever created; cost grows unboundedly and gates proposals"}],"hash":"9edabe41f16302eebba4c12fde1a5716063176c89bcf8354d8c9959a21a0265d","nodeId":"e09fa1d5-0b68-41ce-9447-f307b4b70588","outcome":"completed","summary":"I've written `.imd-findings.json` with 4 findings and a coverage row for all 76 entry points. Only 15 of those rows are actually traced. The other 61 are marked `unreached` because I didn't trace them; that includes the hook callbacks, the two routers, membership and all the prototype contracts.\n\n1. **High: a small group can drain operating funds** (`src/QuorumWork.sol:178`). Whoever proposes an operation can list any seats as \"beneficiaries\", call targets or approval spenders. Every seat on those lists loses its vote, and the approval threshold is two-thirds of whoever is left, with a minimum of 5 voters. So with 10 qualified seats, the proposer can strike out 4 of them and pass a plan sending all operating funds to an outside wallet with only 4 yes votes. Without the false list, 6 yes votes would be needed. I ran the economics specialist's proof test and it fails on the current code for exactly this reason. It's attached to the finding.\n2. **Low: tokens sent straight to the treasury are stuck forever** (`src/QuorumTreasury.sol:65`). The treasury only counts tokens that come in through its deposit function, and there is no way to sweep anything else. This also happens inside the protocol: a work proposal can name the treasury itself as the payment recipient, and the payment then vanishes from the books. Two specialists reported this separately; I merged them into one finding.\n3. **Low: refunds from the operating account skip the 50/50 split** (`src/QuorumOperatingAccount.sol:42`). After an operation runs, everything in the operating account goes back to operating funds, not just the unused budget. Tokens that were sent there from outside therefore never put their half into the members' allowance pool.\n4. **Low: weekly settlement cost grows without limit** (`src/QuorumTreasury.sol:93`). `settleWeek` scans every enrollment ever created, including members who exited or rotated keys, and no proposal can be made until the previous week is settled. At 1,000 enrollments that is about 32 transactions and 15M gas every week. The ~15,000 gas per enrollment is the specialist's measurement; I didn't re-measure it, but the loop in the code matches.\n\nI checked the code paths behind the three low findings but didn't run tests for them. My temporary test copy is deleted, and no repository files were changed.","treeHash":null,"usage":{"cachedInputTokens":219801,"inputTokens":10,"model":"claude-opus-5-5","outputTokens":5824,"runtime":"claude","turns":6,"wallClockMs":75156}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2b9b0095482c54e6","findings":[],"hash":"a4190797fdd1b32d70d7efcb9279066a5fdc19cb28aafc9577a878026e8e99bc","nodeId":"28940fec-d7d7-49ee-8e5d-14a6e9943753","outcome":"completed","summary":"I found no math defects I could reproduce, so `.imd-findings.json` has an empty findings list. It also has 77 coverage rows: every listed entry point plus one row for the size and gas limits. No repository files were changed. The full default test suite passed: 108 tests, 0 skipped.\n\n**What I checked, against the constitution's numbers:**\n- **3% tax:** it is 3% of the actual IMD amount the pool moves, rounded up, on both buys and sells. On a sell the tax can never exceed what the seller receives (for a 1-unit sell, tax is 1 and proceeds are 0), so it can't underflow. The tax splits correctly between the trader and the treasury, and the price bounds are checked against the true total paid and received.\n- **50/50 revenue split:** half goes to next week's allowances and the odd unit goes to operations, checked separately for IMD and the project token. Each deposit must arrive in full before it is counted.\n- **Weekly allowance settlement:** the budget is fixed when settlement starts and each seat gets the budget divided by registrations, rounded down. Every qualified registration also counts as registered, so the total paid can't exceed the budget. The leftover rolls into a week that can't have started settling yet, and suspended members stay in the denominator.\n- **Original-allocation quota:** unlocking matches the rules exactly (nothing at one week, 25% at two, +12.5% per week, full at eight) without overflow. Sales use up purchase quota first, then unlocked allocation, then reward quota.\n- **Voting:** approval needs at least 5 eligible seats and yes votes of at least two-thirds of the electorate, rounded up. The time limits for funding, acceptance, repair and expiry fit together, with no gap or overlap at the edges. A suspension executed in week 10 covers weeks 11–14, and a second one can't be proposed while one is scheduled or active.\n- **Membership:** response hours, the 126-hour requirement, exit ending the current week's qualification, and stake carried over on key rotation all behave as the constitution states. Old and new registrations of the same seat never qualify for the same week, so a seat can't be counted twice.\n- **Size and gas limits:** the largest deployed contract is QuorumWork at 17,027 bytes (limit 24,576). The core's creation code is 39,860 bytes (limit 49,152). The measured launch transaction used 13,614,283 gas, run under the 16,777,216 cap.\n\n**Not covered:** I marked the three prototype contracts (AuthenticatedRouterPrototype, RestrictedPoolPrototype, WorkCyclePrototype) as `unreached`. The launch doesn't deploy them, so I only checked that the prototype router's tax formula matches the real router's.\n\n**Outside my area, for the judge:** I didn't confirm that fee 12500 is in the current launch policy's fee tiers, or the opening-price policy. Plain token transfers sent straight to the treasury, rather than through the hook or the revenue sink, aren't counted and can't be recovered. I didn't report that because the rules don't promise otherwise.","treeHash":null,"usage":{"cachedInputTokens":859892,"inputTokens":26,"model":"claude-opus-5-5","outputTokens":26866,"runtime":"claude","turns":14,"wallClockMs":402724}},{"artifacts":[],"attempt":1,"bundleHash":"387536c7dc91d54bcb36b47e3b1a92b2fedcab274c2cbe1deb74b8e5a61a7076","device":"ef5038c1bdac3372","findings":[],"hash":"bb0b0de80dc17102d04ac8174afb58a3fc2458a066ee4d7998bd67688bd11cb3","nodeId":"61997b22-0287-4969-a86b-4cb50f10ca5c","outcome":"completed","summary":"I added three test suites under `test/compatibility/` and changed nothing else. The default `forge test`, run with the verifier's fuzz seed, passes 83/83 with 0 skips. That includes all 26 mandatory cases from `ACCEPTANCE.json` and the 6 extra launch-floor cases, and the pinned suite hashes are unchanged. I didn't write `.imd-findings.json` because none of the tests turned up a defect in the implementation.\n\n**`PoolTreasuryFailurePaths.t.sol`** (24 tests, using the real factory pool). Each rejected call is checked to leave tax, both 50/50 ledgers, quotas and balances exactly as they were:\n- **Router:** rejects an expired deadline, zero input, a maximum payment one IMD short of input plus 3% tax, an unmet minimum receive, a missing tax approval or balance, and a pool key using a different hook. Direct calls to `unlockCallback` and swaps that skip the router through the PoolManager are refused.\n- **Quota:** selling more than you bought, or with no quota at all, reverts with `InsufficientQuota` and the purchased amount stays intact.\n- **Hook:** strangers can't use its authority calls. An original allocation needs the exact proof and registers only once. `flushRevenue` can be called repeatedly and splits odd amounts once.\n- **Treasury:** rejects zero, unsupported or unfunded deposits. Its money paths are callable only by the work contract. ETH is accepted only as a refund from the operating account. Bad settlement batches and repeats are rejected. With no members, a week's income carries forward in full.\n- **Fuzz:** the 50/50 split in each asset, and a buy then sell charging exactly 3% (rounded up) each way.\n\n**`GovernanceOperationFailurePaths.t.sol`** (7 tests, real member votes). Every failed run leaves the work open and the ledgers, allowance pools, stake and quotas unchanged:\n- An altered plan is rejected, and an approved plan runs exactly once.\n- Nothing runs with fewer than two-thirds of the votes, before the delay, or after the execution window closes.\n- A budget larger than the operating funds can't draw on the members' allowance pool; it succeeds on retry once enough income arrives, and the unused budget is refunded.\n- A trade outside its price bounds rolls back tax and quota.\n- Revenue-held project tokens carry no sell quota, so selling them rolls back.\n- The call guards reject: approvals routed through calls, a wrong committed return value, an approval above the budget, an unsupported asset, and a native budget the treasury doesn't hold.\n\n**`TreasuryPoolInvariant.t.sol`** runs 128 random sequences of 64 calls each: buys, sells, oversells, deposits in both assets, donations, fee claims, and time jumps with week settlement. After every call it checks that:\n- what the treasury holds equals its ledger and an independently tracked total, in both assets;\n- each receipt is split 50/50 exactly once, and the allowance pool equals the sum of its scheduled weeks;\n- each trader's purchased quota equals what they bought minus what they sold;\n- supply stays fixed and the router, hook and operating account are left holding nothing.\n\nLimits:\n- Everything runs offline against local stand-ins, as the existing suites do. Checks against live mainnet are still owed: the real `Hook.core()` bindings, the registry record, and the payer's handover of future fees to the Hook.\n- The invariant handler has no members, so allowance payouts and work payments are only covered by the existing positive suites, not by random sequences.\n- Two behaviours look intentional, so I tested them rather than reporting them: selling into the pool fails with \"empty trade\" until someone has bought, because liquidity is one-sided; and the organisation can't sell project tokens it received as income.\n\nI haven't committed the files.","treeHash":"e836dd02168ffca11b2a6cd0e953bbb8090fd679","usage":{"cachedInputTokens":1666042,"inputTokens":42,"model":"claude-opus-5-5","outputTokens":41252,"runtime":"claude","turns":24,"wallClockMs":514585}}],"verification":[{"checks":[{"durationMs":30797,"exitCode":0,"name":"build","output":"Compiling 62 files with Solc 0.8.28\nSolc 0.8.28 finished in 30.73s\nCompiler run successful!\n","passed":true},{"durationMs":760,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/compatibility/LaunchFloorAndHandoverPositive.t.sol:LaunchFloorAndHandoverPositiveTest\n[PASS] testNormalCompiledCoreMatchesVerifiedPackageAndTokenBinding() (gas: 115220)\n[PASS] testNormalFactoryTransactionFitsMainnetCaps() (gas: 85781)\nLogs:\n  factory_launch_execution_gas: 13452194\n  factory_launch_calldata_gas: 323024\n  factory_launch_estimated_transaction_gas: 13796218\n\n[PASS] testNormalLaunchFloorHookInterfaces() (gas: 98366)\n[PASS] testNormalLaunchTokenSupplySplitAndTransfer() (gas: 179599)\n[PASS] testNormalPayerRequesterHandoverThenPlatformFeeCollection() (gas: 2526934)\n[PASS] testNormalUnauthorizedCallbacksAndSecondInitializationRejected() (gas: 636282)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 40.84ms (2.87ms CPU time)\n\nRan 3 tests for test/compatibility/FixedTokenBindingPositive.t.sol:FixedTokenBindingPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579876)\nLogs:\n  factory_launch_execution_gas: 13337637\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1129183)\n[PASS] testNormalZeroArgumentCandidateBinding() (gas: 39622)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 44.62ms (1.33ms CPU time)\n\nRan 3 tests for test/positive/DeclaredRecusalElectoratePositive.t.sol:DeclaredRecusalElectoratePositiveTest\n[PASS] testNormalDeclaredSeatsCountTowardThresholdButCannotVote() (gas: 151848491)\n[PASS] testNormalDisclosedMemberBeneficiaryPassesWithFullThreshold() (gas: 303960737)\n[PASS] testNormalSeatTargetsAndSpendersAreDeclaredRecusals() (gas: 2509927)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 363.51ms (193.99ms CPU time)\n\nRan 5 tests for test/positive/NormalIntegrated.t.sol:NormalIntegratedTest\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1637661)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87144)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431508664)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431274843)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007571629)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 386.32ms (760.35ms CPU time)\n\nRan 9 tests for test/compatibility/GovernancePoolPositive.t.sol:GovernancePoolPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 580038)\nLogs:\n  factory_launch_execution_gas: 13336809\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164222)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496395409)\n[PASS] testNormalManifestPermissionsMatchConstructor() (gas: 8363)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832799525)\n[PASS] testNormalUnavailableServiceRollsBackTradeAndCanRetry() (gas: 303434794)\n[PASS] testNormalVotedBuyThenSellTaxAndRefunds() (gas: 383685022)\n[PASS] testNormalVotedFeeCollectionSplitsIncomeOnlyOnce() (gas: 383665419)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 443.40ms (1.29s CPU time)\n\nRan 5 tests for test/positive/ImdFactoryPositive.t.sol:ImdFactoryPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579891)\nLogs:\n  factory_launch_execution_gas: 13336809\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164020)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496395267)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575428)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832799325)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 443.39ms (645.66ms CPU time)\n\nRan 14 tests for test/positive/GovernancePositive.t.sol:GovernancePositiveTest\n[PASS] testNormalDelayedResolutionDoesNotExtendRepairClock() (gas: 541159940)\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1638237)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87262)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431755677)\n[PASS] testNormalMissedRepairReturnsBudget() (gas: 607189117)\n[PASS] testNormalOneRepairFreshVoteThenPayment() (gas: 716305290)\n[PASS] testNormalOperatingConversionNameAndLaterUpdate() (gas: 650607255)\n[PASS] testNormalSecondUnapprovedDeliveryReturnsBudget() (gas: 672232490)\n[PASS] testNormalSnapshotTimeoutAndRepairClock() (gas: 996151304)\n[PASS] testNormalSuspendedMemberCanExitAndReceiveOriginalStake() (gas: 717843392)\n[PASS] testNormalSuspensionPreservesOldBallotAndRecoversAfterFourWeeks() (gas: 1348495600)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431521850)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1008149617)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\n[PASS] testNormalUnavailableServiceLeavesBudgetAndAllowsRetry() (gas: 540640293)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 686.49ms (4.98s CPU time)\n\nRan 7 test suites in 691.38ms (2.41s CPU time): 45 tests passed, 0 failed, 0 skipped (45 total tests)\n","passed":true},{"durationMs":47,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AuthenticatedRouterPrototype.swap((address,address,uint24,int24,address),bool,uint128,uint256,uint256,uint160,uint256)\",\"AuthenticatedRouterPrototype.unlockCallback(bytes)\",\"LocalSeats.mint(address,uint256)\",\"LocalSeats.transferFrom(address,address,uint256)\",\"LocalToken.approve(address,uint256)\",\"LocalToken.mint(address,uint256)\",\"LocalToken.transfer(address,uint256)\",\"LocalToken.transferFrom(address,address,uint256)\",\"QProbeToken.approve(address,uint256)\",\"QProbeToken.transfer(address,uint256)\",\"QProbeToken.transferFrom(address,address,uint256)\",\"QuorumCoreCode.create(address,address,uint256,address)\",\"QuorumIssuanceHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"QuorumIssuanceHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"QuorumIssuanceHook.collectPlatformFees(uint64)\",\"QuorumIssuanceHook.countQualifiedWeek(uint256,uint256)\",\"QuorumIssuanceHook.flushRevenue()\",\"QuorumIssuanceHook.registerOriginal(uint64,uint256,bytes32[])\",\"QuorumIssuanceHook.rewardPaid(address,uint256)\",\"QuorumLaunchToken.approve(address,uint256)\",\"QuorumLaunchToken.transfer(address,uint256)\",\"QuorumLaunchToken.transferFrom(address,address,uint256)\",\"QuorumMembership.accept(address,uint256,bytes32)\",\"QuorumMembership.authorize(address,uint256)\",\"QuorumMembership.report(uint256,string)\",\"QuorumMembership.requestExit(uint256)\",\"QuorumMembership.respond(uint256,uint256,bytes32,uint256,string)\",\"QuorumMembership.revoke()\",\"QuorumMembership.withdraw(uint256)\",\"QuorumOperatingAccount.execute((uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumOperatingAccount.receive()\",\"QuorumRevenueSink.flush()\",\"QuorumSwapRouter.swap((address,address,uint24,int24,address),bool,uint128,uint256,uint256,uint160,uint256)\",\"QuorumSwapRouter.unlockCallback(bytes)\",\"QuorumTreasury.claimAllowance(uint256,uint256)\",\"QuorumTreasury.depositAssetRevenue(address,uint256)\",\"QuorumTreasury.depositRevenue(uint256)\",\"QuorumTreasury.executeOperating((uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumTreasury.makePayable(address,uint256)\",\"QuorumTreasury.pay(address,address,uint256)\",\"QuorumTreasury.receive()\",\"QuorumTreasury.release(address,uint256)\",\"QuorumTreasury.reserve(address,uint256)\",\"QuorumTreasury.settleWeek(uint256,uint256)\",\"QuorumWork.accept(uint256)\",\"QuorumWork.appendEntry(uint256)\",\"QuorumWork.claim(uint256)\",\"QuorumWork.defend(uint256,string)\",\"QuorumWork.executeOperation(uint256,(uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumWork.executeSuspension(uint256)\",\"QuorumWork.expire(uint256)\",\"QuorumWork.explain(uint256,string)\",\"QuorumWork.fund(uint256)\",\"QuorumWork.prepareBallot(uint256,uint256)\",\"QuorumWork.propose(uint256,uint256,address,uint256,uint256,string)\",\"QuorumWork.proposeAsset(uint256,uint256,address,address,uint256,uint256,string)\",\"QuorumWork.proposeOperation(uint256,(uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]),address[],string)\",\"QuorumWork.proposeSuspension(uint256,address,string)\",\"QuorumWork.resolveAcceptance(uint256)\",\"QuorumWork.submit(uint256,string)\",\"QuorumWork.vote(uint256,uint256,bool)\",\"QuotaPrototype.consume(address,uint256)\",\"QuotaPrototype.qualify(address,uint256)\",\"QuotaPrototype.recordBuy(address,uint256)\",\"QuotaPrototype.recordEarned(address,uint256)\",\"QuotaPrototype.register(address,bytes32,uint256)\",\"RestrictedPoolPrototype.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"RestrictedPoolPrototype.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkCyclePrototype.acceptWork(uint256)\",\"WorkCyclePrototype.claim(uint256)\",\"WorkCyclePrototype.depositRevenue(uint256)\",\"WorkCyclePrototype.expire(uint256)\",\"WorkCyclePrototype.propose(address,address,uint256,uint256,string)\",\"WorkCyclePrototype.reserveBudget(uint256)\",\"WorkCyclePrototype.submit(uint256,string)\",\"WorkCyclePrototype.vote(uint256,bool,bool)\"],\"files\":{\".gitignore\":7,\"ACCEPTANCE.json\":110,\"ADAPTATION.md\":178,\"PREREQUISITES.json\":55,\"README.md\":60,\"constitution.en.md\":66,\"constitution.packed.hex\":1,\"evidence/acceptance-summary.json\":323,\"evidence/mainnet-prerequisite-verification.json\":23,\"evidence/second-test-local-rehearsal.json\":118,\"fixtures/external-build/out/LaunchFactory.sol/LaunchFactory.json\":1,\"fixtures/external-build/out/LaunchFees.sol/LaunchFees.json\":1,\"fixtures/external-build/out/LaunchRegistry.sol/LaunchRegistry.json\":1,\"fixtures/external-build/out/MerkleDistributor.sol/MerkleDistributor.json\":1,\"fixtures/external-build/out/PoolManager.sol/PoolManager.json\":1,\"fixtures/policy/imd-public-launch-parameters.json\":27,\"fixtures/policy/imd-public-policies.json\":1,\"foundry.toml\":16,\"launch.json\":29,\"requirements-local.txt\":2,\"src/ConstitutionPrototype.sol\":28,\"src/ImdLaunchProof.sol\":36,\"src/LocalFixtures.sol\":24,\"src/QProbeToken.sol\":10,\"src/QuorumBoundCore.sol\":20,\"src/QuorumCodeCatalog.sol\":21,\"src/QuorumCoreCode.sol\":34,\"src/QuorumCreate.sol\":14,\"src/QuorumIssuanceHook.sol\":202,\"src/QuorumLaunchToken.sol\":18,\"src/QuorumLocalSystem.sol\":28,\"src/QuorumMembership.sol\":178,\"src/QuorumOperatingAccount.sol\":45,\"src/QuorumRevenueSink.sol\":22,\"src/QuorumTreasury.sol\":156,\"src/QuorumWork.sol\":517,\"src/QuotaPrototype.sol\":99,\"src/RestrictedPoolPrototype.sol\":143,\"src/WorkCyclePrototype.sol\":201,\"test/compatibility/FixedTokenBindingPositive.t.sol\":150,\"test/compatibility/GovernancePoolPositive.t.sol\":153,\"test/compatibility/LaunchFloorAndHandoverPositive.t.sol\":476,\"test/positive/DeclaredRecusalElectoratePositive.t.sol\":231,\"test/positive/ExternalInterfaces.sol\":70,\"test/positive/GovernancePositive.t.sol\":162,\"test/positive/ImdFactoryPositive.t.sol\":237,\"test/positive/NormalIntegrated.t.sol\":172,\"tools/build_external_fixtures.py\":34,\"tools/constitution_pack.py\":36,\"tools/issuance_lab.py\":247,\"tools/prepare_issuance.py\":111,\"tools/run_acceptance.py\":20,\"tools/seed_parameters.py\":67,\"tools/verify_candidate.py\":54},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":12689,"exitCode":0,"name":"slither","output":"[high/high] arbitrary-send-erc20 at src/QuorumMembership.sol:104: QuorumMembership.accept(address,uint256,bytes32) (src/QuorumMembership.sol#104-127) uses arbitrary from in transferFrom: require(bool,string)(token.transferFrom(a.owner,address(this),stakeAmount),deposit) (src/QuorumMembership.sol#117-120)\n[high/medium] reentrancy-balance at src/QuorumOperatingAccount.sol:18: Reentrancy in QuorumOperatingAccount.execute(OperatingPlan) (src/QuorumOperatingAccount.sol#18-39):\n[high/medium] reentrancy-balance at src/QuorumTreasury.sol:70: Reentrancy in QuorumTreasury._deposit(address,uint256) (src/QuorumTreasury.sol#70-79):\n[high/medium] reentrancy-eth at src/QuorumTreasury.sol:137: Reentrancy in QuorumTreasury.executeOperating(OperatingPlan) (src/QuorumTreasury.sol#137-153):\n[medium/medium] divide-before-multiply at src/QuorumTreasury.sol:102: QuorumTreasury._finish(address,uint256,uint256,uint256,uint256,uint256) (src/QuorumTreasury.sol#102-110) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/QuotaPrototype.sol:70: QuotaPrototype.unlocked(address) (src/QuotaPrototype.sol#70-77) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/QuorumTreasury.sol:70: QuorumTreasury._deposit(address,uint256) (src/QuorumTreasury.sol#70-79) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/QuorumMembership.sol:128: QuorumMembership.respond(uint256,uint256,bytes32,uint256,string) (src/QuorumMembership.sol#128-143) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/QuorumWork.sol:304: Reentrancy in QuorumWork.prepareBallot(uint256,uint256) (src/QuorumWork.sol#304-320):\n[medium/medium] reentrancy-no-eth at src/RestrictedPoolPrototype.sol:96: Reentrancy in AuthenticatedRouterPrototype.swap(PoolKey,bool,uint128,uint256,uint256,uint160,uint256) (src/RestrictedPoolPrototype.sol#96-105):\n[medium/medium] reentrancy-no-eth at src/QuorumTreasury.sol:110: Reentrancy in QuorumTreasury.claimAllowance(uint256,uint256) (src/QuorumTreasury.sol#110-117):\n[medium/medium] reentrancy-no-eth at src/QuorumMembership.sol:104: Reentrancy in QuorumMembership.accept(address,uint256,bytes32) (src/QuorumMembership.sol#104-127):\n[medium/medium] reentrancy-no-eth at src/QuorumIssuanceHook.sol:155: Reentrancy in QuorumSwapRouter.swap(PoolKey,bool,uint128,uint256,uint256,uint160,uint256) (src/QuorumIssuanceHook.sol#155-163):\n[medium/medium] uninitialized-local at src/QuorumWork.sol:482: QuorumWork.expire(uint256).released (src/QuorumWork.sol#482) is a local variable never initialized\n[medium/medium] uninitialized-local at src/RestrictedPoolPrototype.sol:31: RestrictedPoolPrototype.constructor(IPoolManager,address,address,address,address,address).p (src/RestrictedPoolPrototype.sol#31-32) is a local variable never initialized\n[medium/medium] uninitialized-local at src/WorkCyclePrototype.sol:177: WorkCyclePrototype.expire(uint256).released (src/WorkCyclePrototype.sol#177) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ImdLaunchProof.sol:19: ImdLaunchProof.resolve(address,uint64,address,address).foundHook (src/ImdLaunchProof.sol#19) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ImdLaunchProof.sol:18: ImdLaunchProof.resolve(address,uint64,address,address).foundToken (src/ImdLaunchProof.sol#18-19) is a local variable never initialized\n[medium/medium] uninitialized-local at src/QuorumMembership.sol:110: QuorumMembership.accept(address,uint256,bytes32).carried (src/QuorumMembership.sol#110) is a local variable never initialized\n[medium/medium] unused-return at src/RestrictedPoolPrototype.sol:123: AuthenticatedRouterPrototype._settle(Currency,int128,bool,uint256) (src/RestrictedPoolPrototype.sol#123-136) ignores return value by manager.settle() (src/RestrictedPoolPrototype.sol#130)\n[medium/medium] unused-return at src/QuorumIssuanceHook.sol:183: QuorumSwapRouter._settle(Currency,int128,bool,uint256) (src/QuorumIssuanceHook.sol#183-194) ignores return value by manager.settle() (src/QuorumIssuanceHook.sol#188)\n[medium/medium] unused-return at src/QuorumIssuanceHook.sol:78: QuorumIssuanceHook.collectPlatformFees(uint64) (src/QuorumIssuanceHook.sol#78-83) ignores return value by ImdLaunchProof.resolve(seeder,launchNumber,project,address(this)) (src/QuorumIssuanceHook.sol#78-79)\n[medium/medium] unused-return at src/QuorumIssuanceHook.sol:78: QuorumIssuanceHook.collectPlatformFees(uint64) (src/QuorumIssuanceHook.sol#78-83) ignores return value by (None,None,None,recipient) = IFactoryFeeSource(seeder).positionOf(launchNumber) (src/QuorumIssuanceHook.sol#80-81)\n[medium/medium] unused-return at src/QuorumIssuanceHook.sol:78: QuorumIssuanceHook.collectPlatformFees(uint64) (src/QuorumIssuanceHook.sol#78-83) ignores return value by IFactoryFeeSource(seeder).claimFees(launchNumber) (src/QuorumIssuanceHook.sol#81-82)\n[low/medium] missing-zero-check at src/QuorumIssuanceHook.sol:148: QuorumSwapRouter.constructor(IPoolManager,address,address,address,QuorumTreasury).i (src/QuorumIssuanceHook.sol#148-149) lacks a zero-check on :\n[low/medium] missing-zero-check at src/QuorumOperatingAccount.sol:17: QuorumOperatingAccount.constructor(address,address).primary_ (src/QuorumOperatingAccount.sol#17) lacks a zero-check on :\n[low/medium] missing-zero-check at src/RestrictedPoolPrototype.sol:92: AuthenticatedRouterPrototype.constructor(IPoolManager,address,address,address,address).h (src/RestrictedPoolPrototype.sol#92) lacks a zero-check on :\n[low/medium] missing-zero-check at src/QuorumTreasury.sol:49: QuorumTreasury.constructor(IERC20Local,QuorumMembership,address,address).reporter (src/QuorumTreasury.sol#49) lacks a zero-check on :\n[low/medium] missing-zero-check at src/RestrictedPoolPrototype.sol:92: AuthenticatedRouterPrototype.constructor(IPoolManager,address,address,address,address).t (src/RestrictedPoolPrototype.sol#92) lacks a zero-check on :\n[low/medium] missing-zero-check at src/RestrictedPoolPrototype.sol:92: AuthenticatedRouterPrototype.constructor(IPoolManager,address,address,address,address).i (src/RestrictedPoolPrototype.sol#92) lacks a zero-check on :\n[low/medium] missing-zero-check at src/QuorumIssuanceHook.sol:147: QuorumSwapRouter.constructor(IPoolManager,address,address,address,QuorumTreasury).h (src/QuorumIssuanceHook.sol#147) lacks a zero-check on :\n[low/medium] missing-zero-check at src/QuorumIssuanceHook.sol:147: QuorumSwapRouter.constructor(IPoolManager,address,address,address,QuorumTreasury).p (src/QuorumIssuanceHook.sol#147-148) lacks a zero-check on :\n[low/medium] missing-zero-check at src/RestrictedPoolPrototype.sol:92: AuthenticatedRouterPrototype.constructor(IPoolManager,address,address,address,address).p (src/RestrictedPoolPrototype.sol#92) lacks a zero-check on :\n[low/medium] missing-zero-check at src/QuorumOperatingAccount.sol:17: QuorumOperatingAccount.constructor(address,address).project_ (src/QuorumOperatingAccount.sol#17) lacks a zero-check on :\n[low/medium] calls-loop at src/QuorumOperatingAccount.sol:18: QuorumOperatingAccount.execute(OperatingPlan) (src/QuorumOperatingAccount.sol#18-39) has external calls inside a loop: require(bool,string)(a.amount <= IERC20Local(a.asset).balanceOf(address(this)),approval balance) (src/QuorumOperatingAccount.sol#23-24)\n[low/medium] calls-loop at src/QuorumWork.sol:304: QuorumWork.prepareBallot(uint256,uint256) (src/QuorumWork.sol#304-320) has external calls inside a loop: this.appendEntry(id) (src/QuorumWork.sol#311)\n[low/medium] calls-loop at src/QuorumTreasury.sol:84: QuorumTreasury.settleWeek(uint256,uint256) (src/QuorumTreasury.sol#84-102) has external calls inside a loop: membership.qualified(id,week) (src/QuorumTreasury.sol#93-94)\n[low/medium] calls-loop at src/QuorumOperatingAccount.sol:18: QuorumOperatingAccount.execute(OperatingPlan) (src/QuorumOperatingAccount.sol#18-39) has external calls inside a loop: require(bool,string)(IApproveAsset(a_scope_2.asset).approve(a_scope_2.spender,0),clear approval) (src/QuorumOperatingAccount.sol#36)\n[low/medium] calls-loop at src/QuorumOperatingAccount.sol:18: QuorumOperatingAccount.execute(OperatingPlan) (src/QuorumOperatingAccount.sol#18-39) has external calls inside a loop: require(bool,string)(IApproveAsset(a.asset).approve(a.spender,0) && IApproveAsset(a.asset).approve(a.spender,a.amount),approve) (src/QuorumOperatingAccount.sol#24-25)\n[low/medium] calls-loop at src/QuorumOperatingAccount.sol:18: QuorumOperatingAccount.execute(OperatingPlan) (src/QuorumOperatingAccount.sol#18-39) has external calls inside a loop: (ok,result) = c.target.call{value: c.value}(c.data) (src/QuorumOperatingAccount.sol#30-31)\n[low/medium] calls-loop at src/QuorumTreasury.sol:84: QuorumTreasury.settleWeek(uint256,uint256) (src/QuorumTreasury.sol#84-102) has external calls inside a loop: membership.registeredAtStart(id,week) (src/QuorumTreasury.sol#92-93)\n[low/medium] reentrancy-benign at src/QuorumTreasury.sol:137: Reentrancy in QuorumTreasury.executeOperating(OperatingPlan) (src/QuorumTreasury.sol#137-153):\n[low/medium] reentrancy-benign at src/QuorumWork.sol:290: Reentrancy in QuorumWork.executeOperation(uint256,OperatingPlan) (src/QuorumWork.sol#290-301):\n[low/medium] reentrancy-benign at src/QuorumTreasury.sol:137: Reentrancy in QuorumTreasury.executeOperating(OperatingPlan) (src/QuorumTreasury.sol#137-153):\n[low/medium] reentrancy-benign at src/WorkCyclePrototype.sol:73: Reentrancy in WorkCyclePrototype.depositRevenue(uint256) (src/WorkCyclePrototype.sol#73-81):\n[low/medium] reentrancy-benign at src/QuorumWork.sol:416: Reentrancy in QuorumWork.accept(uint256) (src/QuorumWork.sol#416-425):\n[low/medium] reentrancy-benign at src/QuorumMembership.sol:104: Reentrancy in QuorumMembership.accept(address,uint256,bytes32) (src/QuorumMembership.sol#104-127):\n[low/medium] reentrancy-benign at src/QuorumTreasury.sol:70: Reentrancy in QuorumTreasury._deposit(address,uint256) (src/QuorumTreasury.sol#70-79):\n[low/medium] reentrancy-benign at src/QuorumWork.sol:470: Reentrancy in QuorumWork._expire(uint256,uint256) (src/QuorumWork.sol#470-477):\n[low/medium] reentrancy-benign at src/QuorumWork.sol:386: Reentrancy in QuorumWork.fund(uint256) (src/QuorumWork.sol#386-397):\n[low/medium] reentrancy-benign at src/QuorumWork.sol:427: Reentrancy in QuorumWork.claim(uint256) (src/QuorumWork.sol#427-435):\n[low/medium] reentrancy-events at src/QuorumWork.sol:416: Reentrancy in QuorumWork.accept(uint256) (src/QuorumWork.sol#416-425):\n[low/medium] reentrancy-events at src/QuorumWork.sol:427: Reentrancy in QuorumWork.claim(uint256) (src/QuorumWork.sol#427-435):\n[low/medium] reentrancy-events at src/QuorumWork.sol:470: Reentrancy in QuorumWork._expire(uint256,uint256) (src/QuorumWork.sol#470-477):\n[low/medium] reentrancy-events at src/QuorumWork.sol:290: Reentrancy in QuorumWork.executeOperation(uint256,OperatingPlan) (src/QuorumWork.sol#290-301):\n[low/medium] reentrancy-events at src/QuorumTreasury.sol:70: Reentrancy in QuorumTreasury._deposit(address,uint256) (src/QuorumTreasury.sol#70-79):\n[low/medium] reentrancy-events at src/RestrictedPoolPrototype.sol:105: Reentrancy in AuthenticatedRouterPrototype.unlockCallback(bytes) (src/RestrictedPoolPrototype.sol#105-123):\n[low/medium] reentrancy-events at src/QuorumWork.sol:386: Reentrancy in QuorumWork.fund(uint256) (src/QuorumWork.sol#386-397):\n[low/medium] reentrancy-events at src/QuorumWork.sol:304: Reentrancy in QuorumWork.prepareBallot(uint256,uint256) (src/QuorumWork.sol#304-320):\n[low/medium] reentrancy-events at src/QuorumIssuanceHook.sol:163: Reentrancy in QuorumSwapRouter.unlockCallback(bytes) (src/QuorumIssuanceHook.sol#163-183):\n[low/medium] timestamp at src/QuorumWork.sol:290: QuorumWork.executeOperation(uint256,OperatingPlan) (src/QuorumWork.sol#290-301) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkCyclePrototype.sol:140: WorkCyclePrototype.submit(uint256,string) (src/WorkCyclePrototype.sol#140-151) uses timestamp for comparisons\n[low/medium] timestamp at src/QuotaPrototype.sol:58: QuotaPrototype.qualify(address,uint256) (src/QuotaPrototype.sol#58-64) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumWork.sol:304: QuorumWork.prepareBallot(uint256,uint256) (src/QuorumWork.sol#304-320) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:75: QuorumMembership.isSeatAgent(uint256,address) (src/QuorumMembership.sol#75-81) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkCyclePrototype.sol:127: WorkCyclePrototype.reserveBudget(uint256) (src/WorkCyclePrototype.sol#127-140) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumWork.sol:399: QuorumWork.submit(uint256,string) (src/QuorumWork.sol#399-414) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:81: QuorumMembership.requireAgent(uint256,address) (src/QuorumMembership.sol#81-84) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:150: QuorumMembership.registeredAtStart(uint256,uint256) (src/QuorumMembership.sol#150-154) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumWork.sol:427: QuorumWork.claim(uint256) (src/QuorumWork.sol#427-435) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:143: QuorumMembership.report(uint256,string) (src/QuorumMembership.sol#143-149) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumWork.sol:463: QuorumWork.explain(uint256,string) (src/QuorumWork.sol#463-468) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumWork.sol:386: QuorumWork.fund(uint256) (src/QuorumWork.sol#386-397) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkCyclePrototype.sol:163: WorkCyclePrototype.claim(uint256) (src/WorkCyclePrototype.sol#163-172) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkCyclePrototype.sol:190: WorkCyclePrototype._executionWindow(uint256) (src/WorkCyclePrototype.sol#190-197) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:128: QuorumMembership.respond(uint256,uint256,bytes32,uint256,string) (src/QuorumMembership.sol#128-143) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumWork.sol:200: QuorumWork.proposeSuspension(uint256,address,string) (src/QuorumWork.sol#200-227) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:68: QuorumMembership.live(uint256) (src/QuorumMembership.sol#68-75) uses timestamp for comparisons\n[low/medium] timestamp at src/QuotaPrototype.sol:66: QuotaPrototype.currentWeek() (src/QuotaPrototype.sol#66-70) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:84: QuorumMembership._end(uint256) (src/QuorumMembership.sol#84-89) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkCyclePrototype.sol:109: WorkCyclePrototype.vote(uint256,bool,bool) (src/WorkCyclePrototype.sol#109-127) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumWork.sol:479: QuorumWork.expire(uint256) (src/QuorumWork.sol#479-516) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:104: QuorumMembership.accept(address,uint256,bytes32) (src/QuorumMembership.sol#104-127) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:167: QuorumMembership.withdraw(uint256) (src/QuorumMembership.sol#167-174) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:161: QuorumMembership.requestExit(uint256) (src/QuorumMembership.sol#161-167) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkCyclePrototype.sol:82: WorkCyclePrototype.propose(address,address,uint256,uint256,string) (src/WorkCyclePrototype.sol#82-101) uses timestamp for comparisons\n[low/medium] timestamp at src/QuorumMembership.sol:154: QuorumMembership.qualified(uint256,uint256) (src/QuorumMembership.sol#154-161) uses timestamp for","passed":false}],"detail":"static analysis found arbitrary-send-erc20 at src/QuorumMembership.sol:104: QuorumMembership.accept(address,uint256,bytes32) (src/QuorumMembership.sol#104-127) uses arbitrary from in transferFrom: require(bool,string)(token.transferFrom(a.owner,address(this),stakeAmount),deposit) (src/QuorumMembership.sol#117-120)","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"09196c158f3cabca94115b4b7ef7d4059b67be7c396313b77c275f66f3d20a19","verifiedTreeHash":"54c3717ad80c204471943e63f90055817e106ea6","verifierVersion":"0.1.0+6a374fcd"},{"checks":[{"durationMs":51496,"exitCode":0,"name":"build","output":"Compiling 61 files with Solc 0.8.28\nSolc 0.8.28 finished in 51.39s\nCompiler run successful!\n","passed":true},{"durationMs":1479,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/compatibility/FixedTokenBindingPositive.t.sol:FixedTokenBindingPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579876)\nLogs:\n  factory_launch_execution_gas: 13309079\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1129183)\n[PASS] testNormalZeroArgumentCandidateBinding() (gas: 39622)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 46.61ms (1.61ms CPU time)\n\nRan 6 tests for test/compatibility/LaunchFloorAndHandoverPositive.t.sol:LaunchFloorAndHandoverPositiveTest\n[PASS] testNormalCompiledCoreMatchesVerifiedPackageAndTokenBinding() (gas: 107424)\n[PASS] testNormalFactoryTransactionFitsMainnetCaps() (gas: 85781)\nLogs:\n  factory_launch_execution_gas: 13423593\n  factory_launch_calldata_gas: 323024\n  factory_launch_estimated_transaction_gas: 13767617\n\n[PASS] testNormalLaunchFloorHookInterfaces() (gas: 98366)\n[PASS] testNormalLaunchTokenSupplySplitAndTransfer() (gas: 179599)\n[PASS] testNormalPayerRequesterHandoverThenPlatformFeeCollection() (gas: 2526934)\n[PASS] testNormalUnauthorizedCallbacksAndSecondInitializationRejected() (gas: 636282)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 76.71ms (6.87ms CPU time)\n\nRan 5 tests for test/positive/ImdFactoryPositive.t.sol:ImdFactoryPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579891)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164020)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175643)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575428)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832433997)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 965.05ms (1.58s CPU time)\n\nRan 5 tests for test/positive/NormalIntegrated.t.sol:NormalIntegratedTest\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1637661)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87144)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431359900)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431126079)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007248806)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 975.43ms (1.93s CPU time)\n\nRan 9 tests for test/compatibility/GovernancePoolPositive.t.sol:GovernancePoolPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 580038)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164222)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175785)\n[PASS] testNormalManifestPermissionsMatchConstructor() (gas: 8363)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832434197)\n[PASS] testNormalUnavailableServiceRollsBackTradeAndCanRetry() (gas: 303297125)\n[PASS] testNormalVotedBuyThenSellTaxAndRefunds() (gas: 383517987)\n[PASS] testNormalVotedFeeCollectionSplitsIncomeOnlyOnce() (gas: 383497960)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.01s (3.33s CPU time)\n\nRan 14 tests for test/positive/GovernancePositive.t.sol:GovernancePositiveTest\n[PASS] testNormalDelayedResolutionDoesNotExtendRepairClock() (gas: 540984360)\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1638237)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87262)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431606913)\n[PASS] testNormalMissedRepairReturnsBudget() (gas: 606990940)\n[PASS] testNormalOneRepairFreshVoteThenPayment() (gas: 716075340)\n[PASS] testNormalOperatingConversionNameAndLaterUpdate() (gas: 650395267)\n[PASS] testNormalSecondUnapprovedDeliveryReturnsBudget() (gas: 672017544)\n[PASS] testNormalSnapshotTimeoutAndRepairClock() (gas: 995813938)\n[PASS] testNormalSuspendedMemberCanExitAndReceiveOriginalStake() (gas: 717603190)\n[PASS] testNormalSuspensionPreservesOldBallotAndRecoversAfterFourWeeks() (gas: 1348062432)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431373086)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007826794)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\n[PASS] testNormalUnavailableServiceLeavesBudgetAndAllowsRetry() (gas: 540458030)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 1.32s (10.43s CPU time)\n\nRan 6 test suites in 1.33s (4.39s CPU time): 42 tests passed, 0 failed, 0 skipped (42 total tests)\n","passed":true},{"durationMs":126,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AuthenticatedRouterPrototype.swap((address,address,uint24,int24,address),bool,uint128,uint256,uint256,uint160,uint256)\",\"AuthenticatedRouterPrototype.unlockCallback(bytes)\",\"LocalSeats.mint(address,uint256)\",\"LocalSeats.transferFrom(address,address,uint256)\",\"LocalToken.approve(address,uint256)\",\"LocalToken.mint(address,uint256)\",\"LocalToken.transfer(address,uint256)\",\"LocalToken.transferFrom(address,address,uint256)\",\"QProbeToken.approve(address,uint256)\",\"QProbeToken.transfer(address,uint256)\",\"QProbeToken.transferFrom(address,address,uint256)\",\"QuorumCoreCode.create(address,address,uint256,address)\",\"QuorumIssuanceHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"QuorumIssuanceHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"QuorumIssuanceHook.collectPlatformFees(uint64)\",\"QuorumIssuanceHook.countQualifiedWeek(uint256,uint256)\",\"QuorumIssuanceHook.flushRevenue()\",\"QuorumIssuanceHook.registerOriginal(uint64,uint256,bytes32[])\",\"QuorumIssuanceHook.rewardPaid(address,uint256)\",\"QuorumLaunchToken.approve(address,uint256)\",\"QuorumLaunchToken.transfer(address,uint256)\",\"QuorumLaunchToken.transferFrom(address,address,uint256)\",\"QuorumMembership.accept(address,uint256,bytes32)\",\"QuorumMembership.authorize(address,uint256)\",\"QuorumMembership.report(uint256,string)\",\"QuorumMembership.requestExit(uint256)\",\"QuorumMembership.respond(uint256,uint256,bytes32,uint256,string)\",\"QuorumMembership.revoke()\",\"QuorumMembership.withdraw(uint256)\",\"QuorumOperatingAccount.execute((uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumOperatingAccount.receive()\",\"QuorumRevenueSink.flush()\",\"QuorumSwapRouter.swap((address,address,uint24,int24,address),bool,uint128,uint256,uint256,uint160,uint256)\",\"QuorumSwapRouter.unlockCallback(bytes)\",\"QuorumTreasury.claimAllowance(uint256,uint256)\",\"QuorumTreasury.depositAssetRevenue(address,uint256)\",\"QuorumTreasury.depositRevenue(uint256)\",\"QuorumTreasury.executeOperating((uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumTreasury.makePayable(address,uint256)\",\"QuorumTreasury.pay(address,address,uint256)\",\"QuorumTreasury.receive()\",\"QuorumTreasury.release(address,uint256)\",\"QuorumTreasury.reserve(address,uint256)\",\"QuorumTreasury.settleWeek(uint256,uint256)\",\"QuorumWork.accept(uint256)\",\"QuorumWork.appendEntry(uint256)\",\"QuorumWork.claim(uint256)\",\"QuorumWork.defend(uint256,string)\",\"QuorumWork.executeOperation(uint256,(uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumWork.executeSuspension(uint256)\",\"QuorumWork.expire(uint256)\",\"QuorumWork.explain(uint256,string)\",\"QuorumWork.fund(uint256)\",\"QuorumWork.prepareBallot(uint256,uint256)\",\"QuorumWork.propose(uint256,uint256,address,uint256,uint256,string)\",\"QuorumWork.proposeAsset(uint256,uint256,address,address,uint256,uint256,string)\",\"QuorumWork.proposeOperation(uint256,(uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]),address[],string)\",\"QuorumWork.proposeSuspension(uint256,address,string)\",\"QuorumWork.resolveAcceptance(uint256)\",\"QuorumWork.submit(uint256,string)\",\"QuorumWork.vote(uint256,uint256,bool)\",\"QuotaPrototype.consume(address,uint256)\",\"QuotaPrototype.qualify(address,uint256)\",\"QuotaPrototype.recordBuy(address,uint256)\",\"QuotaPrototype.recordEarned(address,uint256)\",\"QuotaPrototype.register(address,bytes32,uint256)\",\"RestrictedPoolPrototype.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"RestrictedPoolPrototype.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkCyclePrototype.acceptWork(uint256)\",\"WorkCyclePrototype.claim(uint256)\",\"WorkCyclePrototype.depositRevenue(uint256)\",\"WorkCyclePrototype.expire(uint256)\",\"WorkCyclePrototype.propose(address,address,uint256,uint256,string)\",\"WorkCyclePrototype.reserveBudget(uint256)\",\"WorkCyclePrototype.submit(uint256,string)\",\"WorkCyclePrototype.vote(uint256,bool,bool)\"],\"files\":{\".gitignore\":7,\"ACCEPTANCE.json\":101,\"ADAPTATION.md\":103,\"PREREQUISITES.json\":39,\"README.md\":48,\"constitution.en.md\":66,\"constitution.packed.hex\":1,\"evidence/acceptance-summary.json\":296,\"evidence/mainnet-prerequisite-verification.json\":23,\"evidence/second-test-local-rehearsal.json\":118,\"fixtures/external-build/out/LaunchFactory.sol/LaunchFactory.json\":1,\"fixtures/external-build/out/LaunchFees.sol/LaunchFees.json\":1,\"fixtures/external-build/out/LaunchRegistry.sol/LaunchRegistry.json\":1,\"fixtures/external-build/out/MerkleDistributor.sol/MerkleDistributor.json\":1,\"fixtures/external-build/out/PoolManager.sol/PoolManager.json\":1,\"fixtures/policy/imd-public-launch-parameters.json\":27,\"fixtures/policy/imd-public-policies.json\":1,\"foundry.toml\":16,\"launch.json\":29,\"requirements-local.txt\":2,\"src/ConstitutionPrototype.sol\":28,\"src/ImdLaunchProof.sol\":36,\"src/LocalFixtures.sol\":24,\"src/QProbeToken.sol\":10,\"src/QuorumBoundCore.sol\":20,\"src/QuorumCodeCatalog.sol\":21,\"src/QuorumCoreCode.sol\":34,\"src/QuorumCreate.sol\":14,\"src/QuorumIssuanceHook.sol\":202,\"src/QuorumLaunchToken.sol\":18,\"src/QuorumLocalSystem.sol\":28,\"src/QuorumMembership.sol\":178,\"src/QuorumOperatingAccount.sol\":45,\"src/QuorumRevenueSink.sol\":22,\"src/QuorumTreasury.sol\":156,\"src/QuorumWork.sol\":316,\"src/QuotaPrototype.sol\":99,\"src/RestrictedPoolPrototype.sol\":143,\"src/WorkCyclePrototype.sol\":201,\"test/compatibility/FixedTokenBindingPositive.t.sol\":150,\"test/compatibility/GovernancePoolPositive.t.sol\":153,\"test/compatibility/LaunchFloorAndHandoverPositive.t.sol\":256,\"test/positive/ExternalInterfaces.sol\":70,\"test/positive/GovernancePositive.t.sol\":162,\"test/positive/ImdFactoryPositive.t.sol\":237,\"test/positive/NormalIntegrated.t.sol\":172,\"tools/build_external_fixtures.py\":34,\"tools/constitution_pack.py\":36,\"tools/issuance_lab.py\":247,\"tools/prepare_issuance.py\":111,\"tools/run_acceptance.py\":20,\"tools/seed_parameters.py\":67,\"tools/verify_candidate.py\":43},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"274a10ad09c8be6dd6a0f6e772305180aacfbb120bbf8b792b590fbffada3590","verifiedTreeHash":"49bcf03778e96ecda22e2f2fd019847d9db96d1b","verifierVersion":"0.1.0+6a374fcd"},{"checks":[{"durationMs":53177,"exitCode":0,"name":"build","output":"Compiling 69 files with Solc 0.8.28\nSolc 0.8.28 finished in 53.11s\nCompiler run successful!\n","passed":true},{"durationMs":2508,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/gas/LegacySurfaceGas.t.sol:LegacySurfaceGasTest\n[PASS] testGas_LocalSeats_mint_ownerOf_transferFrom() (gas: 92610)\n[PASS] testGas_LocalToken_transfer_transferFrom() (gas: 172478)\n[PASS] testGas_WorkCyclePrototype_depositRevenue() (gas: 115114)\n[PASS] testGas_WorkCyclePrototype_expire() (gas: 932473)\n[PASS] testGas_WorkCyclePrototype_propose_vote_reserveBudget_submit_acceptWork_claim() (gas: 1467676)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.30ms (1.33ms CPU time)\n\nRan 1 test for test/gas/RestrictedPrototypeGas.t.sol:RestrictedPrototypeGasTest\n[PASS] testGas_RestrictedPoolPrototype_initialize_addLiquidity_swap_CallbacksAndGetters() (gas: 853272)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.35ms (858.92µs CPU time)\n\nRan 3 tests for test/compatibility/FixedTokenBindingPositive.t.sol:FixedTokenBindingPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579876)\nLogs:\n  factory_launch_execution_gas: 13309079\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1129183)\n[PASS] testNormalZeroArgumentCandidateBinding() (gas: 39622)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 28.22ms (986.16µs CPU time)\n\nRan 2 tests for test/gas/DependencySurfaceGas.t.sol:DependencySurfaceGasTest\n[PASS] testGas_ConstitutionPrototype_textAndGetters() (gas: 55682)\n[PASS] testGas_QuorumCoreCode_createAndGetters() (gas: 7771373)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 36.58ms (655.71µs CPU time)\n\nRan 3 tests for test/gas/OfficialCompositionGas.t.sol:CompositionAssetSurfaceGasTest\n[PASS] testGas_QProbeToken_transferFrom() (gas: 21490472)\n[PASS] testGas_QuorumLaunchToken_metadataAndTransferFrom() (gas: 133820)\n[PASS] testGas_QuorumMembership_revoke() (gas: 21413321)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 43.88ms (17.20ms CPU time)\n\nRan 3 tests for test/gas/OfficialCompositionGas.t.sol:CompositionDependencySurfaceGasTest\n[PASS] testGas_ConstitutionPrototype_textAndGetters() (gas: 21299861)\n[PASS] testGas_QuorumCoreCode_create() (gas: 28990894)\n[PASS] testGas_QuorumRevenueSink_flush() (gas: 21470251)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 56.25ms (25.29ms CPU time)\n\nRan 3 tests for test/gas/OfficialCompositionGas.t.sol:CompositionPoolSurfaceGasTest\n[PASS] testGas_Composition_PublicGetters() (gas: 22295394)\n[PASS] testGas_QuorumIssuanceHook_collectPlatformFees_OfficialPolicy() (gas: 23424897)\n[PASS] testGas_QuorumSwapRouter_swap_OfficialPolicyBuyAndSell() (gas: 22854728)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 62.89ms (29.67ms CPU time)\n\nRan 6 tests for test/compatibility/LaunchFloorAndHandoverPositive.t.sol:LaunchFloorAndHandoverPositiveTest\n[PASS] testNormalCompiledCoreMatchesVerifiedPackageAndTokenBinding() (gas: 107424)\n[PASS] testNormalFactoryTransactionFitsMainnetCaps() (gas: 85781)\nLogs:\n  factory_launch_execution_gas: 13423593\n  factory_launch_calldata_gas: 323024\n  factory_launch_estimated_transaction_gas: 13767617\n\n[PASS] testNormalLaunchFloorHookInterfaces() (gas: 98366)\n[PASS] testNormalLaunchTokenSupplySplitAndTransfer() (gas: 179599)\n[PASS] testNormalPayerRequesterHandoverThenPlatformFeeCollection() (gas: 2526934)\n[PASS] testNormalUnauthorizedCallbacksAndSecondInitializationRejected() (gas: 636282)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 66.40ms (3.60ms CPU time)\n\nRan 1 test for test/gas/OfficialCompositionGas.t.sol:OfficialCompositionGasTest\n[PASS] testGas_LaunchFactory_launch_OfficialPolicyWithCore() (gas: 22335510)\nLogs:\n  complete_factory_execution: 13270043\n  conservative_transaction_gas: 13614283\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 70.06ms (16.09ms CPU time)\n\nRan 5 tests for test/positive/ImdFactoryPositive.t.sol:ImdFactoryPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579891)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164020)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175643)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575428)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832433997)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 551.57ms (905.98ms CPU time)\n\nRan 9 tests for test/compatibility/GovernancePoolPositive.t.sol:GovernancePoolPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 580038)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164222)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175785)\n[PASS] testNormalManifestPermissionsMatchConstructor() (gas: 8363)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832434197)\n[PASS] testNormalUnavailableServiceRollsBackTradeAndCanRetry() (gas: 303297125)\n[PASS] testNormalVotedBuyThenSellTaxAndRefunds() (gas: 383517987)\n[PASS] testNormalVotedFeeCollectionSplitsIncomeOnlyOnce() (gas: 383497960)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 581.90ms (1.55s CPU time)\n\nRan 7 tests for test/gas/GovernanceSurfaceGas.t.sol:GovernanceSurfaceGasTest\n[PASS] testGas_QuorumWork_appendEntryAndDecisionGetters() (gas: 431984883)\n[PASS] testGas_QuorumWork_operatingPlanHashAndRecused() (gas: 431271192)\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1637661)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87188)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431359944)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431126123)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007248828)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 652.10ms (1.39s CPU time)\n\nRan 24 tests for test/compatibility/PoolTreasuryFailurePaths.t.sol:PoolTreasuryFailurePathsTest\n[PASS] testDirectPoolManagerSwapBypassingRouterRejected() (gas: 625841)\n[PASS] testFlushRevenueIsIdempotentAndAccountsDonationsOnce() (gas: 497432)\n[PASS] testFuzzBuyThenSellTaxIsCeilThreePercentEachWay(uint256) (runs: 256, μ: 882533, ~: 882477)\n[PASS] testFuzzDepositSplitsFiftyFiftyPerAsset(uint256,uint256) (runs: 256, μ: 499113, ~: 500289)\n[PASS] testHookAndQuotaAuthoritiesRejectStrangers() (gas: 216562)\n[PASS] testIncomeWithNoRegistrationsCarriesForwardWhole() (gas: 429771)\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579979)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164464)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175836)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832434369)\n[PASS] testOriginalAllocationRequiresExactProofAndRegistersOnce() (gas: 433236)\n[PASS] testRouterBuyChargesTaxOnTopAndRejectsTightMaxPayment() (gas: 923313)\n[PASS] testRouterBuyWithoutTaxAllowanceRollsBack() (gas: 549731)\n[PASS] testRouterBuyWithoutTaxBalanceRollsBack() (gas: 602212)\n[PASS] testRouterRejectsExpiredDeadlineAndZeroInput() (gas: 404552)\n[PASS] testRouterRejectsForeignHookKeyAndDirectCallback() (gas: 430136)\n[PASS] testRouterRejectsUnmetMinimumReceive() (gas: 525257)\n[PASS] testSellBeyondPurchasedQuotaRevertsAndKeepsQuota() (gas: 1194294)\n[PASS] testSellWithNoQuotaReverts() (gas: 988640)\n[PASS] testSettlementRejectsOpenWeekBadBatchAndRepeat() (gas: 318698)\n[PASS] testTreasuryIncomeRejectsZeroUnsupportedAndUnfunded() (gas: 352069)\n[PASS] testTreasuryMoneyPathsAreWorkOnly() (gas: 441056)\n[PASS] testTreasuryRejectsNativeExceptOperatingRefund() (gas: 43097)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 652.08ms (951.83ms CPU time)\n\nRan 5 tests for test/positive/NormalIntegrated.t.sol:NormalIntegratedTest\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1637661)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87144)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431359900)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431126079)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007248806)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 679.55ms (866.71ms CPU time)\n\nRan 16 tests for test/compatibility/GovernanceOperationFailurePaths.t.sol:GovernanceOperationFailurePathsTest\n[PASS] testAlteredPlanRejectedAndApprovedPlanExecutesOnlyOnce() (gas: 303297037)\n[PASS] testBudgetAboveOperatingFundsCannotReachProtectedPoolThenRetries() (gas: 302673506)\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 580060)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164376)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175915)\n[PASS] testNormalManifestPermissionsMatchConstructor() (gas: 8517)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832434435)\n[PASS] testNormalUnavailableServiceRollsBackTradeAndCanRetry() (gas: 303297365)\n[PASS] testNormalVotedBuyThenSellTaxAndRefunds() (gas: 383518109)\n[PASS] testNormalVotedFeeCollectionSplitsIncomeOnlyOnce() (gas: 383498080)\n[PASS] testOperatingCallGuardsRejectUnsafePlans() (gas: 311118916)\n[PASS] testOperatingSaleBeyondPurchasedQuotaRollsBack() (gas: 383651206)\n[PASS] testStrangerCannotProposeOperation() (gas: 222936519)\n[PASS] testTradeOutsidePriceBoundsRollsBackTaxAndQuota() (gas: 302431391)\n[PASS] testWithoutTwoThirdsOrOutsideWindowNothingExecutes() (gas: 414133845)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 679.65ms (3.38s CPU time)\n\nRan 14 tests for test/positive/GovernancePositive.t.sol:GovernancePositiveTest\n[PASS] testNormalDelayedResolutionDoesNotExtendRepairClock() (gas: 540984360)\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1638237)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87262)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431606913)\n[PASS] testNormalMissedRepairReturnsBudget() (gas: 606990940)\n[PASS] testNormalOneRepairFreshVoteThenPayment() (gas: 716075340)\n[PASS] testNormalOperatingConversionNameAndLaterUpdate() (gas: 650395267)\n[PASS] testNormalSecondUnapprovedDeliveryReturnsBudget() (gas: 672017544)\n[PASS] testNormalSnapshotTimeoutAndRepairClock() (gas: 995813938)\n[PASS] testNormalSuspendedMemberCanExitAndReceiveOriginalStake() (gas: 717603190)\n[PASS] testNormalSuspensionPreservesOldBallotAndRecoversAfterFourWeeks() (gas: 1348062432)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431373086)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007826794)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\n[PASS] testNormalUnavailableServiceLeavesBudgetAndAllowsRetry() (gas: 540458030)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 712.71ms (5.50s CPU time)\n\nRan 1 test for test/compatibility/TreasuryPoolInvariant.t.sol:TreasuryPoolInvariantTest\n[PASS]\nTreasuryPoolInvariantTest invariants:\n[PASS] invariant_eachReceiptSplitFiftyFiftyOnce\n[PASS] invariant_noEconomicViolation\n[PASS] invariant_quotasSupplyAndTransitBalances\n[PASS] invariant_treasuryHoldsExactlyItsLiabilities\n TreasuryPoolInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------------+----------------+-------+---------+----------╮\n| Contract            | Selector       | Calls | Reverts | Discards |\n+===================================================================+\n| TreasuryPoolHandler | buy            | 1191  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | collectFees    | 1187  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | deposit        | 1117  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | donateAndFlush | 1158  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | oversell       | 1147  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | sell           | 1163  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | warpAndSettle  | 1229  | 0       | 0        |\n╰---------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.42s (2.34s CPU time)\n\nRan 17 test suites in 2.43s (7.30s CPU time): 108 tests passed, 0 failed, 0 skipped (108 total tests)\n","passed":true},{"durationMs":64,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AuthenticatedRouterPrototype.swap((address,address,uint24,int24,address),bool,uint128,uint256,uint256,uint160,uint256)\",\"AuthenticatedRouterPrototype.unlockCallback(bytes)\",\"LocalSeats.mint(address,uint256)\",\"LocalSeats.transferFrom(address,address,uint256)\",\"LocalToken.approve(address,uint256)\",\"LocalToken.mint(address,uint256)\",\"LocalToken.transfer(address,uint256)\",\"LocalToken.transferFrom(address,address,uint256)\",\"QProbeToken.approve(address,uint256)\",\"QProbeToken.transfer(address,uint256)\",\"QProbeToken.transferFrom(address,address,uint256)\",\"QuorumCoreCode.create(address,address,uint256,address)\",\"QuorumIssuanceHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"QuorumIssuanceHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"QuorumIssuanceHook.collectPlatformFees(uint64)\",\"QuorumIssuanceHook.countQualifiedWeek(uint256,uint256)\",\"QuorumIssuanceHook.flushRevenue()\",\"QuorumIssuanceHook.registerOriginal(uint64,uint256,bytes32[])\",\"QuorumIssuanceHook.rewardPaid(address,uint256)\",\"QuorumLaunchToken.approve(address,uint256)\",\"QuorumLaunchToken.transfer(address,uint256)\",\"QuorumLaunchToken.transferFrom(address,address,uint256)\",\"QuorumMembership.accept(address,uint256,bytes32)\",\"QuorumMembership.authorize(address,uint256)\",\"QuorumMembership.report(uint256,string)\",\"QuorumMembership.requestExit(uint256)\",\"QuorumMembership.respond(uint256,uint256,bytes32,uint256,string)\",\"QuorumMembership.revoke()\",\"QuorumMembership.withdraw(uint256)\",\"QuorumOperatingAccount.execute((uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumOperatingAccount.receive()\",\"QuorumRevenueSink.flush()\",\"QuorumSwapRouter.swap((address,address,uint24,int24,address),bool,uint128,uint256,uint256,uint160,uint256)\",\"QuorumSwapRouter.unlockCallback(bytes)\",\"QuorumTreasury.claimAllowance(uint256,uint256)\",\"QuorumTreasury.depositAssetRevenue(address,uint256)\",\"QuorumTreasury.depositRevenue(uint256)\",\"QuorumTreasury.executeOperating((uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumTreasury.makePayable(address,uint256)\",\"QuorumTreasury.pay(address,address,uint256)\",\"QuorumTreasury.receive()\",\"QuorumTreasury.release(address,uint256)\",\"QuorumTreasury.reserve(address,uint256)\",\"QuorumTreasury.settleWeek(uint256,uint256)\",\"QuorumWork.accept(uint256)\",\"QuorumWork.appendEntry(uint256)\",\"QuorumWork.claim(uint256)\",\"QuorumWork.defend(uint256,string)\",\"QuorumWork.executeOperation(uint256,(uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumWork.executeSuspension(uint256)\",\"QuorumWork.expire(uint256)\",\"QuorumWork.explain(uint256,string)\",\"QuorumWork.fund(uint256)\",\"QuorumWork.prepareBallot(uint256,uint256)\",\"QuorumWork.propose(uint256,uint256,address,uint256,uint256,string)\",\"QuorumWork.proposeAsset(uint256,uint256,address,address,uint256,uint256,string)\",\"QuorumWork.proposeOperation(uint256,(uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]),address[],string)\",\"QuorumWork.proposeSuspension(uint256,address,string)\",\"QuorumWork.resolveAcceptance(uint256)\",\"QuorumWork.submit(uint256,string)\",\"QuorumWork.vote(uint256,uint256,bool)\",\"QuotaPrototype.consume(address,uint256)\",\"QuotaPrototype.qualify(address,uint256)\",\"QuotaPrototype.recordBuy(address,uint256)\",\"QuotaPrototype.recordEarned(address,uint256)\",\"QuotaPrototype.register(address,bytes32,uint256)\",\"RestrictedPoolPrototype.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"RestrictedPoolPrototype.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkCyclePrototype.acceptWork(uint256)\",\"WorkCyclePrototype.claim(uint256)\",\"WorkCyclePrototype.depositRevenue(uint256)\",\"WorkCyclePrototype.expire(uint256)\",\"WorkCyclePrototype.propose(address,address,uint256,uint256,string)\",\"WorkCyclePrototype.reserveBudget(uint256)\",\"WorkCyclePrototype.submit(uint256,string)\",\"WorkCyclePrototype.vote(uint256,bool,bool)\"],\"files\":{\".gas-snapshot\":111,\".gitignore\":7,\"ACCEPTANCE.json\":101,\"ADAPTATION.md\":103,\"PREREQUISITES.json\":39,\"README.md\":48,\"constitution.en.md\":66,\"constitution.packed.hex\":1,\"evidence/acceptance-summary.json\":296,\"evidence/mainnet-prerequisite-verification.json\":23,\"evidence/second-test-local-rehearsal.json\":118,\"fixtures/external-build/out/LaunchFactory.sol/LaunchFactory.json\":1,\"fixtures/external-build/out/LaunchFees.sol/LaunchFees.json\":1,\"fixtures/external-build/out/LaunchRegistry.sol/LaunchRegistry.json\":1,\"fixtures/external-build/out/MerkleDistributor.sol/MerkleDistributor.json\":1,\"fixtures/external-build/out/PoolManager.sol/PoolManager.json\":1,\"fixtures/policy/imd-public-launch-parameters.json\":27,\"fixtures/policy/imd-public-policies.json\":1,\"foundry.toml\":16,\"launch.json\":29,\"reports/acceptance-check.json\":246,\"reports/build-sizes.txt\":70,\"reports/composition-envelope.json\":495,\"reports/composition-fork.json\":430,\"reports/composition-offline.json\":453,\"reports/contract-sizes.json\":650,\"reports/current-policies.json\":1,\"reports/function-gas.json\":2,\"reports/gas.md\":404,\"reports/launch-calltrace.json\":538,\"reports/launch-prestate.json\":156,\"reports/mainnet-verification.json\":57,\"reports/metadata-rejected-128.json\":25,\"reports/official-pool-trace.txt\":279,\"reports/prototype-trace.txt\":159,\"reports/public-function-inventory.json\":2763,\"reports/snapshot-run.txt\":187,\"reports/test-results.json\":1,\"requirements-local.txt\":2,\"src/ConstitutionPrototype.sol\":28,\"src/ImdLaunchProof.sol\":36,\"src/LocalFixtures.sol\":24,\"src/QProbeToken.sol\":10,\"src/QuorumBoundCore.sol\":20,\"src/QuorumCodeCatalog.sol\":21,\"src/QuorumCoreCode.sol\":34,\"src/QuorumCreate.sol\":14,\"src/QuorumIssuanceHook.sol\":202,\"src/QuorumLaunchToken.sol\":18,\"src/QuorumLocalSystem.sol\":28,\"src/QuorumMembership.sol\":178,\"src/QuorumOperatingAccount.sol\":45,\"src/QuorumRevenueSink.sol\":22,\"src/QuorumTreasury.sol\":156,\"src/QuorumWork.sol\":316,\"src/QuotaPrototype.sol\":99,\"src/RestrictedPoolPrototype.sol\":143,\"src/WorkCyclePrototype.sol\":201,\"test/compatibility/FixedTokenBindingPositive.t.sol\":150,\"test/compatibility/GovernanceOperationFailurePaths.t.sol\":252,\"test/compatibility/GovernancePoolPositive.t.sol\":153,\"test/compatibility/LaunchFloorAndHandoverPositive.t.sol\":256,\"test/compatibility/PoolTreasuryFailurePaths.t.sol\":510,\"test/compatibility/TreasuryPoolInvariant.t.sol\":391,\"test/gas/DependencySurfaceGas.t.sol\":58,\"test/gas/GovernanceSurfaceGas.t.sol\":42,\"test/gas/LegacySurfaceGas.t.sol\":100,\"test/gas/OfficialCompositionGas.t.sol\":420,\"test/gas/RestrictedPrototypeGas.t.sol\":128,\"test/gas/check_acceptance.py\":47,\"test/gas/foundry_rpc.py\":92,\"test/gas/measure_launch.py\":324,\"test/gas/render_report.py\":222,\"test/positive/ExternalInterfaces.sol\":70,\"test/positive/GovernancePositive.t.sol\":162,\"test/positive/ImdFactoryPositive.t.sol\":237,\"test/positive/NormalIntegrated.t.sol\":172,\"tools/build_external_fixtures.py\":34,\"tools/constitution_pack.py\":36,\"tools/issuance_lab.py\":247,\"tools/prepare_issuance.py\":111,\"tools/run_acceptance.py\":20,\"tools/seed_parameters.py\":67,\"tools/verify_candidate.py\":43},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9107b6169f4814d6e8e36499e5b4929fbb90f8472b977314a78da082f7999103","verifiedTreeHash":"c85fa88620c0197b7fcc799db942829d0e8ee88d","verifierVersion":"0.1.0+6a374fcd"},{"checks":[{"durationMs":94172,"exitCode":0,"name":"build","output":"Compiling 69 files with Solc 0.8.28\nSolc 0.8.28 finished in 94.05s\nCompiler run successful!\n","passed":true},{"durationMs":4227,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/gas/LegacySurfaceGas.t.sol:LegacySurfaceGasTest\n[PASS] testGas_LocalSeats_mint_ownerOf_transferFrom() (gas: 92610)\n[PASS] testGas_LocalToken_transfer_transferFrom() (gas: 172478)\n[PASS] testGas_WorkCyclePrototype_depositRevenue() (gas: 115114)\n[PASS] testGas_WorkCyclePrototype_expire() (gas: 932473)\n[PASS] testGas_WorkCyclePrototype_propose_vote_reserveBudget_submit_acceptWork_claim() (gas: 1467676)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.47ms (1.46ms CPU time)\n\nRan 1 test for test/gas/RestrictedPrototypeGas.t.sol:RestrictedPrototypeGasTest\n[PASS] testGas_RestrictedPoolPrototype_initialize_addLiquidity_swap_CallbacksAndGetters() (gas: 853272)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.13ms (985.34µs CPU time)\n\nRan 2 tests for test/gas/DependencySurfaceGas.t.sol:DependencySurfaceGasTest\n[PASS] testGas_ConstitutionPrototype_textAndGetters() (gas: 55682)\n[PASS] testGas_QuorumCoreCode_createAndGetters() (gas: 7771373)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 44.79ms (941.47µs CPU time)\n\nRan 3 tests for test/compatibility/FixedTokenBindingPositive.t.sol:FixedTokenBindingPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579876)\nLogs:\n  factory_launch_execution_gas: 13309079\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1129183)\n[PASS] testNormalZeroArgumentCandidateBinding() (gas: 39622)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 46.94ms (1.58ms CPU time)\n\nRan 1 test for test/gas/OfficialCompositionGas.t.sol:OfficialCompositionGasTest\n[PASS] testGas_LaunchFactory_launch_OfficialPolicyWithCore() (gas: 22335510)\nLogs:\n  complete_factory_execution: 13270043\n  conservative_transaction_gas: 13614283\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 74.85ms (20.00ms CPU time)\n\nRan 3 tests for test/gas/OfficialCompositionGas.t.sol:CompositionAssetSurfaceGasTest\n[PASS] testGas_QProbeToken_transferFrom() (gas: 21490472)\n[PASS] testGas_QuorumLaunchToken_metadataAndTransferFrom() (gas: 133820)\n[PASS] testGas_QuorumMembership_revoke() (gas: 21413321)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 91.63ms (37.53ms CPU time)\n\nRan 6 tests for test/compatibility/LaunchFloorAndHandoverPositive.t.sol:LaunchFloorAndHandoverPositiveTest\n[PASS] testNormalCompiledCoreMatchesVerifiedPackageAndTokenBinding() (gas: 107424)\n[PASS] testNormalFactoryTransactionFitsMainnetCaps() (gas: 85781)\nLogs:\n  factory_launch_execution_gas: 13423593\n  factory_launch_calldata_gas: 323024\n  factory_launch_estimated_transaction_gas: 13767617\n\n[PASS] testNormalLaunchFloorHookInterfaces() (gas: 98366)\n[PASS] testNormalLaunchTokenSupplySplitAndTransfer() (gas: 179599)\n[PASS] testNormalPayerRequesterHandoverThenPlatformFeeCollection() (gas: 2526934)\n[PASS] testNormalUnauthorizedCallbacksAndSecondInitializationRejected() (gas: 636282)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 107.04ms (5.66ms CPU time)\n\nRan 3 tests for test/gas/OfficialCompositionGas.t.sol:CompositionDependencySurfaceGasTest\n[PASS] testGas_ConstitutionPrototype_textAndGetters() (gas: 21299861)\n[PASS] testGas_QuorumCoreCode_create() (gas: 28990894)\n[PASS] testGas_QuorumRevenueSink_flush() (gas: 21470251)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 112.49ms (44.89ms CPU time)\n\nRan 5 tests for test/positive/NormalIntegrated.t.sol:NormalIntegratedTest\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1637661)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87144)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431359900)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431126079)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007248806)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.32s (2.33s CPU time)\n\nRan 3 tests for test/gas/OfficialCompositionGas.t.sol:CompositionPoolSurfaceGasTest\n[PASS] testGas_Composition_PublicGetters() (gas: 22295394)\n[PASS] testGas_QuorumIssuanceHook_collectPlatformFees_OfficialPolicy() (gas: 23424897)\n[PASS] testGas_QuorumSwapRouter_swap_OfficialPolicyBuyAndSell() (gas: 22854728)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.48s (65.41ms CPU time)\n\nRan 7 tests for test/gas/GovernanceSurfaceGas.t.sol:GovernanceSurfaceGasTest\n[PASS] testGas_QuorumWork_appendEntryAndDecisionGetters() (gas: 431984883)\n[PASS] testGas_QuorumWork_operatingPlanHashAndRecused() (gas: 431271192)\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1637661)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87188)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431359944)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431126123)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007248828)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.59s (4.41s CPU time)\n\nRan 5 tests for test/positive/ImdFactoryPositive.t.sol:ImdFactoryPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579891)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164020)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175643)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575428)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832433997)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.59s (1.90s CPU time)\n\nRan 16 tests for test/compatibility/GovernanceOperationFailurePaths.t.sol:GovernanceOperationFailurePathsTest\n[PASS] testAlteredPlanRejectedAndApprovedPlanExecutesOnlyOnce() (gas: 303297037)\n[PASS] testBudgetAboveOperatingFundsCannotReachProtectedPoolThenRetries() (gas: 302673506)\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 580060)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164376)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175915)\n[PASS] testNormalManifestPermissionsMatchConstructor() (gas: 8517)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832434435)\n[PASS] testNormalUnavailableServiceRollsBackTradeAndCanRetry() (gas: 303297365)\n[PASS] testNormalVotedBuyThenSellTaxAndRefunds() (gas: 383518109)\n[PASS] testNormalVotedFeeCollectionSplitsIncomeOnlyOnce() (gas: 383498080)\n[PASS] testOperatingCallGuardsRejectUnsafePlans() (gas: 311118916)\n[PASS] testOperatingSaleBeyondPurchasedQuotaRollsBack() (gas: 383651206)\n[PASS] testStrangerCannotProposeOperation() (gas: 222936519)\n[PASS] testTradeOutsidePriceBoundsRollsBackTaxAndQuota() (gas: 302431391)\n[PASS] testWithoutTwoThirdsOrOutsideWindowNothingExecutes() (gas: 414133845)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 1.63s (7.90s CPU time)\n\nRan 24 tests for test/compatibility/PoolTreasuryFailurePaths.t.sol:PoolTreasuryFailurePathsTest\n[PASS] testDirectPoolManagerSwapBypassingRouterRejected() (gas: 625841)\n[PASS] testFlushRevenueIsIdempotentAndAccountsDonationsOnce() (gas: 497432)\n[PASS] testFuzzBuyThenSellTaxIsCeilThreePercentEachWay(uint256) (runs: 256, μ: 882533, ~: 882477)\n[PASS] testFuzzDepositSplitsFiftyFiftyPerAsset(uint256,uint256) (runs: 256, μ: 499113, ~: 500289)\n[PASS] testHookAndQuotaAuthoritiesRejectStrangers() (gas: 216562)\n[PASS] testIncomeWithNoRegistrationsCarriesForwardWhole() (gas: 429771)\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579979)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164464)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175836)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832434369)\n[PASS] testOriginalAllocationRequiresExactProofAndRegistersOnce() (gas: 433236)\n[PASS] testRouterBuyChargesTaxOnTopAndRejectsTightMaxPayment() (gas: 923313)\n[PASS] testRouterBuyWithoutTaxAllowanceRollsBack() (gas: 549731)\n[PASS] testRouterBuyWithoutTaxBalanceRollsBack() (gas: 602212)\n[PASS] testRouterRejectsExpiredDeadlineAndZeroInput() (gas: 404552)\n[PASS] testRouterRejectsForeignHookKeyAndDirectCallback() (gas: 430136)\n[PASS] testRouterRejectsUnmetMinimumReceive() (gas: 525257)\n[PASS] testSellBeyondPurchasedQuotaRevertsAndKeepsQuota() (gas: 1194294)\n[PASS] testSellWithNoQuotaReverts() (gas: 988640)\n[PASS] testSettlementRejectsOpenWeekBadBatchAndRepeat() (gas: 318698)\n[PASS] testTreasuryIncomeRejectsZeroUnsupportedAndUnfunded() (gas: 352069)\n[PASS] testTreasuryMoneyPathsAreWorkOnly() (gas: 441056)\n[PASS] testTreasuryRejectsNativeExceptOperatingRefund() (gas: 43097)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 1.63s (3.95s CPU time)\n\nRan 9 tests for test/compatibility/GovernancePoolPositive.t.sol:GovernancePoolPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 580038)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164222)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175785)\n[PASS] testNormalManifestPermissionsMatchConstructor() (gas: 8363)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832434197)\n[PASS] testNormalUnavailableServiceRollsBackTradeAndCanRetry() (gas: 303297125)\n[PASS] testNormalVotedBuyThenSellTaxAndRefunds() (gas: 383517987)\n[PASS] testNormalVotedFeeCollectionSplitsIncomeOnlyOnce() (gas: 383497960)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.63s (4.16s CPU time)\n\nRan 14 tests for test/positive/GovernancePositive.t.sol:GovernancePositiveTest\n[PASS] testNormalDelayedResolutionDoesNotExtendRepairClock() (gas: 540984360)\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1638237)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87262)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431606913)\n[PASS] testNormalMissedRepairReturnsBudget() (gas: 606990940)\n[PASS] testNormalOneRepairFreshVoteThenPayment() (gas: 716075340)\n[PASS] testNormalOperatingConversionNameAndLaterUpdate() (gas: 650395267)\n[PASS] testNormalSecondUnapprovedDeliveryReturnsBudget() (gas: 672017544)\n[PASS] testNormalSnapshotTimeoutAndRepairClock() (gas: 995813938)\n[PASS] testNormalSuspendedMemberCanExitAndReceiveOriginalStake() (gas: 717603190)\n[PASS] testNormalSuspensionPreservesOldBallotAndRecoversAfterFourWeeks() (gas: 1348062432)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431373086)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007826794)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\n[PASS] testNormalUnavailableServiceLeavesBudgetAndAllowsRetry() (gas: 540458030)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 1.75s (13.59s CPU time)\n\nRan 1 test for test/compatibility/TreasuryPoolInvariant.t.sol:TreasuryPoolInvariantTest\n[PASS]\nTreasuryPoolInvariantTest invariants:\n[PASS] invariant_eachReceiptSplitFiftyFiftyOnce\n[PASS] invariant_noEconomicViolation\n[PASS] invariant_quotasSupplyAndTransitBalances\n[PASS] invariant_treasuryHoldsExactlyItsLiabilities\n TreasuryPoolInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------------+----------------+-------+---------+----------╮\n| Contract            | Selector       | Calls | Reverts | Discards |\n+===================================================================+\n| TreasuryPoolHandler | buy            | 1191  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | collectFees    | 1187  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | deposit        | 1117  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | donateAndFlush | 1158  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | oversell       | 1147  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | sell           | 1163  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | warpAndSettle  | 1229  | 0       | 0        |\n╰---------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.06s (3.92s CPU time)\n\nRan 17 test suites in 4.07s (17.18s CPU time): 108 tests passed, 0 failed, 0 skipped (108 total tests)\n","passed":true},{"durationMs":156,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AuthenticatedRouterPrototype.swap((address,address,uint24,int24,address),bool,uint128,uint256,uint256,uint160,uint256)\",\"AuthenticatedRouterPrototype.unlockCallback(bytes)\",\"LocalSeats.mint(address,uint256)\",\"LocalSeats.transferFrom(address,address,uint256)\",\"LocalToken.approve(address,uint256)\",\"LocalToken.mint(address,uint256)\",\"LocalToken.transfer(address,uint256)\",\"LocalToken.transferFrom(address,address,uint256)\",\"QProbeToken.approve(address,uint256)\",\"QProbeToken.transfer(address,uint256)\",\"QProbeToken.transferFrom(address,address,uint256)\",\"QuorumCoreCode.create(address,address,uint256,address)\",\"QuorumIssuanceHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"QuorumIssuanceHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"QuorumIssuanceHook.collectPlatformFees(uint64)\",\"QuorumIssuanceHook.countQualifiedWeek(uint256,uint256)\",\"QuorumIssuanceHook.flushRevenue()\",\"QuorumIssuanceHook.registerOriginal(uint64,uint256,bytes32[])\",\"QuorumIssuanceHook.rewardPaid(address,uint256)\",\"QuorumLaunchToken.approve(address,uint256)\",\"QuorumLaunchToken.transfer(address,uint256)\",\"QuorumLaunchToken.transferFrom(address,address,uint256)\",\"QuorumMembership.accept(address,uint256,bytes32)\",\"QuorumMembership.authorize(address,uint256)\",\"QuorumMembership.report(uint256,string)\",\"QuorumMembership.requestExit(uint256)\",\"QuorumMembership.respond(uint256,uint256,bytes32,uint256,string)\",\"QuorumMembership.revoke()\",\"QuorumMembership.withdraw(uint256)\",\"QuorumOperatingAccount.execute((uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumOperatingAccount.receive()\",\"QuorumRevenueSink.flush()\",\"QuorumSwapRouter.swap((address,address,uint24,int24,address),bool,uint128,uint256,uint256,uint160,uint256)\",\"QuorumSwapRouter.unlockCallback(bytes)\",\"QuorumTreasury.claimAllowance(uint256,uint256)\",\"QuorumTreasury.depositAssetRevenue(address,uint256)\",\"QuorumTreasury.depositRevenue(uint256)\",\"QuorumTreasury.executeOperating((uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumTreasury.makePayable(address,uint256)\",\"QuorumTreasury.pay(address,address,uint256)\",\"QuorumTreasury.receive()\",\"QuorumTreasury.release(address,uint256)\",\"QuorumTreasury.reserve(address,uint256)\",\"QuorumTreasury.settleWeek(uint256,uint256)\",\"QuorumWork.accept(uint256)\",\"QuorumWork.appendEntry(uint256)\",\"QuorumWork.claim(uint256)\",\"QuorumWork.defend(uint256,string)\",\"QuorumWork.executeOperation(uint256,(uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumWork.executeSuspension(uint256)\",\"QuorumWork.expire(uint256)\",\"QuorumWork.explain(uint256,string)\",\"QuorumWork.fund(uint256)\",\"QuorumWork.prepareBallot(uint256,uint256)\",\"QuorumWork.propose(uint256,uint256,address,uint256,uint256,string)\",\"QuorumWork.proposeAsset(uint256,uint256,address,address,uint256,uint256,string)\",\"QuorumWork.proposeOperation(uint256,(uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]),address[],string)\",\"QuorumWork.proposeSuspension(uint256,address,string)\",\"QuorumWork.resolveAcceptance(uint256)\",\"QuorumWork.submit(uint256,string)\",\"QuorumWork.vote(uint256,uint256,bool)\",\"QuotaPrototype.consume(address,uint256)\",\"QuotaPrototype.qualify(address,uint256)\",\"QuotaPrototype.recordBuy(address,uint256)\",\"QuotaPrototype.recordEarned(address,uint256)\",\"QuotaPrototype.register(address,bytes32,uint256)\",\"RestrictedPoolPrototype.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"RestrictedPoolPrototype.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkCyclePrototype.acceptWork(uint256)\",\"WorkCyclePrototype.claim(uint256)\",\"WorkCyclePrototype.depositRevenue(uint256)\",\"WorkCyclePrototype.expire(uint256)\",\"WorkCyclePrototype.propose(address,address,uint256,uint256,string)\",\"WorkCyclePrototype.reserveBudget(uint256)\",\"WorkCyclePrototype.submit(uint256,string)\",\"WorkCyclePrototype.vote(uint256,bool,bool)\"],\"files\":{\".gas-snapshot\":111,\".gitignore\":7,\"ACCEPTANCE.json\":101,\"ADAPTATION.md\":103,\"PREREQUISITES.json\":39,\"README.md\":48,\"constitution.en.md\":66,\"constitution.packed.hex\":1,\"evidence/acceptance-summary.json\":296,\"evidence/mainnet-prerequisite-verification.json\":23,\"evidence/second-test-local-rehearsal.json\":118,\"fixtures/external-build/out/LaunchFactory.sol/LaunchFactory.json\":1,\"fixtures/external-build/out/LaunchFees.sol/LaunchFees.json\":1,\"fixtures/external-build/out/LaunchRegistry.sol/LaunchRegistry.json\":1,\"fixtures/external-build/out/MerkleDistributor.sol/MerkleDistributor.json\":1,\"fixtures/external-build/out/PoolManager.sol/PoolManager.json\":1,\"fixtures/policy/imd-public-launch-parameters.json\":27,\"fixtures/policy/imd-public-policies.json\":1,\"foundry.toml\":16,\"launch.json\":29,\"reports/acceptance-check.json\":246,\"reports/build-sizes.txt\":70,\"reports/composition-envelope.json\":495,\"reports/composition-fork.json\":430,\"reports/composition-offline.json\":453,\"reports/contract-sizes.json\":650,\"reports/current-policies.json\":1,\"reports/function-gas.json\":2,\"reports/gas.md\":404,\"reports/launch-calltrace.json\":538,\"reports/launch-prestate.json\":156,\"reports/mainnet-verification.json\":57,\"reports/metadata-rejected-128.json\":25,\"reports/official-pool-trace.txt\":279,\"reports/prototype-trace.txt\":159,\"reports/public-function-inventory.json\":2763,\"reports/snapshot-run.txt\":187,\"reports/test-results.json\":1,\"requirements-local.txt\":2,\"src/ConstitutionPrototype.sol\":28,\"src/ImdLaunchProof.sol\":36,\"src/LocalFixtures.sol\":24,\"src/QProbeToken.sol\":10,\"src/QuorumBoundCore.sol\":20,\"src/QuorumCodeCatalog.sol\":21,\"src/QuorumCoreCode.sol\":34,\"src/QuorumCreate.sol\":14,\"src/QuorumIssuanceHook.sol\":202,\"src/QuorumLaunchToken.sol\":18,\"src/QuorumLocalSystem.sol\":28,\"src/QuorumMembership.sol\":178,\"src/QuorumOperatingAccount.sol\":45,\"src/QuorumRevenueSink.sol\":22,\"src/QuorumTreasury.sol\":156,\"src/QuorumWork.sol\":316,\"src/QuotaPrototype.sol\":99,\"src/RestrictedPoolPrototype.sol\":143,\"src/WorkCyclePrototype.sol\":201,\"test/compatibility/FixedTokenBindingPositive.t.sol\":150,\"test/compatibility/GovernanceOperationFailurePaths.t.sol\":252,\"test/compatibility/GovernancePoolPositive.t.sol\":153,\"test/compatibility/LaunchFloorAndHandoverPositive.t.sol\":256,\"test/compatibility/PoolTreasuryFailurePaths.t.sol\":510,\"test/compatibility/TreasuryPoolInvariant.t.sol\":391,\"test/gas/DependencySurfaceGas.t.sol\":58,\"test/gas/GovernanceSurfaceGas.t.sol\":42,\"test/gas/LegacySurfaceGas.t.sol\":100,\"test/gas/OfficialCompositionGas.t.sol\":420,\"test/gas/RestrictedPrototypeGas.t.sol\":128,\"test/gas/check_acceptance.py\":47,\"test/gas/foundry_rpc.py\":92,\"test/gas/measure_launch.py\":324,\"test/gas/render_report.py\":222,\"test/positive/ExternalInterfaces.sol\":70,\"test/positive/GovernancePositive.t.sol\":162,\"test/positive/ImdFactoryPositive.t.sol\":237,\"test/positive/NormalIntegrated.t.sol\":172,\"tools/build_external_fixtures.py\":34,\"tools/constitution_pack.py\":36,\"tools/issuance_lab.py\":247,\"tools/prepare_issuance.py\":111,\"tools/run_acceptance.py\":20,\"tools/seed_parameters.py\":67,\"tools/verify_candidate.py\":43},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"95bd8ba51c0d5eca1ee33a13a227dc1d7b110a0c705d49935fdbb984b9eb04e1","verifiedTreeHash":"2603cd9cef297dfea218966dd796777e9d747642","verifierVersion":"0.1.0+6a374fcd"},{"checks":[{"durationMs":48412,"exitCode":0,"name":"build","output":"Compiling 64 files with Solc 0.8.28\nSolc 0.8.28 finished in 48.34s\nCompiler run successful!\n","passed":true},{"durationMs":2640,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/compatibility/FixedTokenBindingPositive.t.sol:FixedTokenBindingPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579876)\nLogs:\n  factory_launch_execution_gas: 13309079\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1129183)\n[PASS] testNormalZeroArgumentCandidateBinding() (gas: 39622)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 27.75ms (1.13ms CPU time)\n\nRan 6 tests for test/compatibility/LaunchFloorAndHandoverPositive.t.sol:LaunchFloorAndHandoverPositiveTest\n[PASS] testNormalCompiledCoreMatchesVerifiedPackageAndTokenBinding() (gas: 107424)\n[PASS] testNormalFactoryTransactionFitsMainnetCaps() (gas: 85781)\nLogs:\n  factory_launch_execution_gas: 13423593\n  factory_launch_calldata_gas: 323024\n  factory_launch_estimated_transaction_gas: 13767617\n\n[PASS] testNormalLaunchFloorHookInterfaces() (gas: 98366)\n[PASS] testNormalLaunchTokenSupplySplitAndTransfer() (gas: 179599)\n[PASS] testNormalPayerRequesterHandoverThenPlatformFeeCollection() (gas: 2526934)\n[PASS] testNormalUnauthorizedCallbacksAndSecondInitializationRejected() (gas: 636282)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 78.52ms (4.14ms CPU time)\n\nRan 5 tests for test/positive/NormalIntegrated.t.sol:NormalIntegratedTest\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1637661)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87144)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431359900)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431126079)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007248806)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 515.79ms (1.02s CPU time)\n\nRan 24 tests for test/compatibility/PoolTreasuryFailurePaths.t.sol:PoolTreasuryFailurePathsTest\n[PASS] testDirectPoolManagerSwapBypassingRouterRejected() (gas: 625841)\n[PASS] testFlushRevenueIsIdempotentAndAccountsDonationsOnce() (gas: 497432)\n[PASS] testFuzzBuyThenSellTaxIsCeilThreePercentEachWay(uint256) (runs: 256, μ: 882552, ~: 882699)\n[PASS] testFuzzDepositSplitsFiftyFiftyPerAsset(uint256,uint256) (runs: 256, μ: 499137, ~: 500289)\n[PASS] testHookAndQuotaAuthoritiesRejectStrangers() (gas: 216562)\n[PASS] testIncomeWithNoRegistrationsCarriesForwardWhole() (gas: 429771)\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579979)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164464)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175836)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832434369)\n[PASS] testOriginalAllocationRequiresExactProofAndRegistersOnce() (gas: 433236)\n[PASS] testRouterBuyChargesTaxOnTopAndRejectsTightMaxPayment() (gas: 923313)\n[PASS] testRouterBuyWithoutTaxAllowanceRollsBack() (gas: 549731)\n[PASS] testRouterBuyWithoutTaxBalanceRollsBack() (gas: 602212)\n[PASS] testRouterRejectsExpiredDeadlineAndZeroInput() (gas: 404552)\n[PASS] testRouterRejectsForeignHookKeyAndDirectCallback() (gas: 430136)\n[PASS] testRouterRejectsUnmetMinimumReceive() (gas: 525257)\n[PASS] testSellBeyondPurchasedQuotaRevertsAndKeepsQuota() (gas: 1194267)\n[PASS] testSellWithNoQuotaReverts() (gas: 988612)\n[PASS] testSettlementRejectsOpenWeekBadBatchAndRepeat() (gas: 318698)\n[PASS] testTreasuryIncomeRejectsZeroUnsupportedAndUnfunded() (gas: 352069)\n[PASS] testTreasuryMoneyPathsAreWorkOnly() (gas: 441056)\n[PASS] testTreasuryRejectsNativeExceptOperatingRefund() (gas: 43097)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 550.03ms (1.05s CPU time)\n\nRan 5 tests for test/positive/ImdFactoryPositive.t.sol:ImdFactoryPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 579891)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164020)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175643)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575428)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832433997)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 652.77ms (903.83ms CPU time)\n\nRan 9 tests for test/compatibility/GovernancePoolPositive.t.sol:GovernancePoolPositiveTest\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 580038)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164222)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175785)\n[PASS] testNormalManifestPermissionsMatchConstructor() (gas: 8363)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832434197)\n[PASS] testNormalUnavailableServiceRollsBackTradeAndCanRetry() (gas: 303297125)\n[PASS] testNormalVotedBuyThenSellTaxAndRefunds() (gas: 383517987)\n[PASS] testNormalVotedFeeCollectionSplitsIncomeOnlyOnce() (gas: 383497960)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 652.80ms (1.67s CPU time)\n\nRan 16 tests for test/compatibility/GovernanceOperationFailurePaths.t.sol:GovernanceOperationFailurePathsTest\n[PASS] testAlteredPlanRejectedAndApprovedPlanExecutesOnlyOnce() (gas: 303297037)\n[PASS] testBudgetAboveOperatingFundsCannotReachProtectedPoolThenRetries() (gas: 302673506)\n[PASS] testNormalAtomicFactorySeedRecordProofAndClaim() (gas: 580060)\nLogs:\n  factory_launch_execution_gas: 13308250\n  hook_initcode_with_arguments_bytes: 18154\n\n[PASS] testNormalBuySellAndFactoryFeeCollection() (gas: 1164376)\n[PASS] testNormalLaunchTaxFundsQualifiedMembersAndAcceptedWork() (gas: 496175915)\n[PASS] testNormalManifestPermissionsMatchConstructor() (gas: 8517)\n[PASS] testNormalPlatformFeesReachTwoAssetTreasury() (gas: 1575586)\n[PASS] testNormalTwoAssetAllowanceWorkRewardAndSale() (gas: 832434435)\n[PASS] testNormalUnavailableServiceRollsBackTradeAndCanRetry() (gas: 303297365)\n[PASS] testNormalVotedBuyThenSellTaxAndRefunds() (gas: 383518109)\n[PASS] testNormalVotedFeeCollectionSplitsIncomeOnlyOnce() (gas: 383498080)\n[PASS] testOperatingCallGuardsRejectUnsafePlans() (gas: 311118916)\n[PASS] testOperatingSaleBeyondPurchasedQuotaRollsBack() (gas: 383651206)\n[PASS] testStrangerCannotProposeOperation() (gas: 222936519)\n[PASS] testTradeOutsidePriceBoundsRollsBackTaxAndQuota() (gas: 302431391)\n[PASS] testWithoutTwoThirdsOrOutsideWindowNothingExecutes() (gas: 414133845)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 652.96ms (3.19s CPU time)\n\nRan 14 tests for test/positive/GovernancePositive.t.sol:GovernancePositiveTest\n[PASS] testNormalDelayedResolutionDoesNotExtendRepairClock() (gas: 540984360)\n[PASS] testNormalFixedStakeHasNoSnapshotOrSeatCap() (gas: 1638237)\n[PASS] testNormalJoinAuthorizationAndSeparateStake() (gas: 87262)\n[PASS] testNormalKeyRotationCarriesStakeAndPreservesPastEarnings() (gas: 431606913)\n[PASS] testNormalMissedRepairReturnsBudget() (gas: 606990940)\n[PASS] testNormalOneRepairFreshVoteThenPayment() (gas: 716075340)\n[PASS] testNormalOperatingConversionNameAndLaterUpdate() (gas: 650395267)\n[PASS] testNormalSecondUnapprovedDeliveryReturnsBudget() (gas: 672017544)\n[PASS] testNormalSnapshotTimeoutAndRepairClock() (gas: 995813938)\n[PASS] testNormalSuspendedMemberCanExitAndReceiveOriginalStake() (gas: 717603190)\n[PASS] testNormalSuspensionPreservesOldBallotAndRecoversAfterFourWeeks() (gas: 1348062432)\n[PASS] testNormalTwoQualifiedPeriodsAndAllowanceClaim() (gas: 431373086)\n[PASS] testNormalTwoWorkRoundsAndExit() (gas: 1007826794)\nLogs:\n  operating: 870000000000000000000\n  remaining_stake: 4500000000000000000000\n  treasury_accounted: 870000000000000000000\n\n[PASS] testNormalUnavailableServiceLeavesBudgetAndAllowsRetry() (gas: 540458030)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 728.71ms (5.59s CPU time)\n\nRan 1 test for test/compatibility/TreasuryPoolInvariant.t.sol:TreasuryPoolInvariantTest\n[PASS]\nTreasuryPoolInvariantTest invariants:\n[PASS] invariant_eachReceiptSplitFiftyFiftyOnce\n[PASS] invariant_noEconomicViolation\n[PASS] invariant_quotasSupplyAndTransitBalances\n[PASS] invariant_treasuryHoldsExactlyItsLiabilities\n TreasuryPoolInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭---------------------+----------------+-------+---------+----------╮\n| Contract            | Selector       | Calls | Reverts | Discards |\n+===================================================================+\n| TreasuryPoolHandler | buy            | 1191  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | collectFees    | 1187  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | deposit        | 1117  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | donateAndFlush | 1158  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | oversell       | 1147  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | sell           | 1163  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| TreasuryPoolHandler | warpAndSettle  | 1229  | 0       | 0        |\n╰---------------------+----------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.56s (2.50s CPU time)\n\nRan 9 test suites in 2.56s (6.42s CPU time): 83 tests passed, 0 failed, 0 skipped (83 total tests)\n","passed":true},{"durationMs":47,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AuthenticatedRouterPrototype.swap((address,address,uint24,int24,address),bool,uint128,uint256,uint256,uint160,uint256)\",\"AuthenticatedRouterPrototype.unlockCallback(bytes)\",\"LocalSeats.mint(address,uint256)\",\"LocalSeats.transferFrom(address,address,uint256)\",\"LocalToken.approve(address,uint256)\",\"LocalToken.mint(address,uint256)\",\"LocalToken.transfer(address,uint256)\",\"LocalToken.transferFrom(address,address,uint256)\",\"QProbeToken.approve(address,uint256)\",\"QProbeToken.transfer(address,uint256)\",\"QProbeToken.transferFrom(address,address,uint256)\",\"QuorumCoreCode.create(address,address,uint256,address)\",\"QuorumIssuanceHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"QuorumIssuanceHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"QuorumIssuanceHook.collectPlatformFees(uint64)\",\"QuorumIssuanceHook.countQualifiedWeek(uint256,uint256)\",\"QuorumIssuanceHook.flushRevenue()\",\"QuorumIssuanceHook.registerOriginal(uint64,uint256,bytes32[])\",\"QuorumIssuanceHook.rewardPaid(address,uint256)\",\"QuorumLaunchToken.approve(address,uint256)\",\"QuorumLaunchToken.transfer(address,uint256)\",\"QuorumLaunchToken.transferFrom(address,address,uint256)\",\"QuorumMembership.accept(address,uint256,bytes32)\",\"QuorumMembership.authorize(address,uint256)\",\"QuorumMembership.report(uint256,string)\",\"QuorumMembership.requestExit(uint256)\",\"QuorumMembership.respond(uint256,uint256,bytes32,uint256,string)\",\"QuorumMembership.revoke()\",\"QuorumMembership.withdraw(uint256)\",\"QuorumOperatingAccount.execute((uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumOperatingAccount.receive()\",\"QuorumRevenueSink.flush()\",\"QuorumSwapRouter.swap((address,address,uint24,int24,address),bool,uint128,uint256,uint256,uint160,uint256)\",\"QuorumSwapRouter.unlockCallback(bytes)\",\"QuorumTreasury.claimAllowance(uint256,uint256)\",\"QuorumTreasury.depositAssetRevenue(address,uint256)\",\"QuorumTreasury.depositRevenue(uint256)\",\"QuorumTreasury.executeOperating((uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumTreasury.makePayable(address,uint256)\",\"QuorumTreasury.pay(address,address,uint256)\",\"QuorumTreasury.receive()\",\"QuorumTreasury.release(address,uint256)\",\"QuorumTreasury.reserve(address,uint256)\",\"QuorumTreasury.settleWeek(uint256,uint256)\",\"QuorumWork.accept(uint256)\",\"QuorumWork.appendEntry(uint256)\",\"QuorumWork.claim(uint256)\",\"QuorumWork.defend(uint256,string)\",\"QuorumWork.executeOperation(uint256,(uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]))\",\"QuorumWork.executeSuspension(uint256)\",\"QuorumWork.expire(uint256)\",\"QuorumWork.explain(uint256,string)\",\"QuorumWork.fund(uint256)\",\"QuorumWork.prepareBallot(uint256,uint256)\",\"QuorumWork.propose(uint256,uint256,address,uint256,uint256,string)\",\"QuorumWork.proposeAsset(uint256,uint256,address,address,uint256,uint256,string)\",\"QuorumWork.proposeOperation(uint256,(uint256,uint256,uint256,(address,address,uint256)[],(address,uint256,bytes,bytes32)[]),address[],string)\",\"QuorumWork.proposeSuspension(uint256,address,string)\",\"QuorumWork.resolveAcceptance(uint256)\",\"QuorumWork.submit(uint256,string)\",\"QuorumWork.vote(uint256,uint256,bool)\",\"QuotaPrototype.consume(address,uint256)\",\"QuotaPrototype.qualify(address,uint256)\",\"QuotaPrototype.recordBuy(address,uint256)\",\"QuotaPrototype.recordEarned(address,uint256)\",\"QuotaPrototype.register(address,bytes32,uint256)\",\"RestrictedPoolPrototype.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"RestrictedPoolPrototype.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"WorkCyclePrototype.acceptWork(uint256)\",\"WorkCyclePrototype.claim(uint256)\",\"WorkCyclePrototype.depositRevenue(uint256)\",\"WorkCyclePrototype.expire(uint256)\",\"WorkCyclePrototype.propose(address,address,uint256,uint256,string)\",\"WorkCyclePrototype.reserveBudget(uint256)\",\"WorkCyclePrototype.submit(uint256,string)\",\"WorkCyclePrototype.vote(uint256,bool,bool)\"],\"files\":{\".gitignore\":7,\"ACCEPTANCE.json\":101,\"ADAPTATION.md\":103,\"PREREQUISITES.json\":39,\"README.md\":48,\"constitution.en.md\":66,\"constitution.packed.hex\":1,\"evidence/acceptance-summary.json\":296,\"evidence/mainnet-prerequisite-verification.json\":23,\"evidence/second-test-local-rehearsal.json\":118,\"fixtures/external-build/out/LaunchFactory.sol/LaunchFactory.json\":1,\"fixtures/external-build/out/LaunchFees.sol/LaunchFees.json\":1,\"fixtures/external-build/out/LaunchRegistry.sol/LaunchRegistry.json\":1,\"fixtures/external-build/out/MerkleDistributor.sol/MerkleDistributor.json\":1,\"fixtures/external-build/out/PoolManager.sol/PoolManager.json\":1,\"fixtures/policy/imd-public-launch-parameters.json\":27,\"fixtures/policy/imd-public-policies.json\":1,\"foundry.toml\":16,\"launch.json\":29,\"requirements-local.txt\":2,\"src/ConstitutionPrototype.sol\":28,\"src/ImdLaunchProof.sol\":36,\"src/LocalFixtures.sol\":24,\"src/QProbeToken.sol\":10,\"src/QuorumBoundCore.sol\":20,\"src/QuorumCodeCatalog.sol\":21,\"src/QuorumCoreCode.sol\":34,\"src/QuorumCreate.sol\":14,\"src/QuorumIssuanceHook.sol\":202,\"src/QuorumLaunchToken.sol\":18,\"src/QuorumLocalSystem.sol\":28,\"src/QuorumMembership.sol\":178,\"src/QuorumOperatingAccount.sol\":45,\"src/QuorumRevenueSink.sol\":22,\"src/QuorumTreasury.sol\":156,\"src/QuorumWork.sol\":316,\"src/QuotaPrototype.sol\":99,\"src/RestrictedPoolPrototype.sol\":143,\"src/WorkCyclePrototype.sol\":201,\"test/compatibility/FixedTokenBindingPositive.t.sol\":150,\"test/compatibility/GovernanceOperationFailurePaths.t.sol\":252,\"test/compatibility/GovernancePoolPositive.t.sol\":153,\"test/compatibility/LaunchFloorAndHandoverPositive.t.sol\":256,\"test/compatibility/PoolTreasuryFailurePaths.t.sol\":510,\"test/compatibility/TreasuryPoolInvariant.t.sol\":391,\"test/positive/ExternalInterfaces.sol\":70,\"test/positive/GovernancePositive.t.sol\":162,\"test/positive/ImdFactoryPositive.t.sol\":237,\"test/positive/NormalIntegrated.t.sol\":172,\"tools/build_external_fixtures.py\":34,\"tools/constitution_pack.py\":36,\"tools/issuance_lab.py\":247,\"tools/prepare_issuance.py\":111,\"tools/run_acceptance.py\":20,\"tools/seed_parameters.py\":67,\"tools/verify_candidate.py\":43},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"bb0b0de80dc17102d04ac8174afb58a3fc2458a066ee4d7998bd67688bd11cb3","verifiedTreeHash":"e836dd02168ffca11b2a6cd0e953bbb8090fd679","verifierVersion":"0.1.0+6a374fcd"}]}