{"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":"4f96aab0-b721-49cd-81cd-2e1e8442d3cd","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"2547edebd0577cfbeb366398418287816c916ebefb2d2a8fe7b44106427d8520","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"5ee8a2b0a4cb96f2cce5ab2984c91f747c8855e3c3ed8ac7d49d4a538c9b8fd4","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"d6b13aa0da2f49724419f9a6432d26bc6c0a2685ff39e81c8fb0fef0ee5dc9d4","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"0ed01641fe3dba08999c4ee72421d3d206efa99f54aad4ee1b79f6d8a610ea3c","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":"73fe88ad02c248e55f1df5a3b7747a1ee816a7f59ccff33bc2e4188bee00fe8d","dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"f249b5146c5206886cc84623a68d3998627da345405a83215a7122fd8b4aa373","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"42eb5b28ac49f9647186f05d77590eb0a93d715aac8e466fe10571ddd3999a56","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"d459f2e7724de754140b340804dc0a8859ec70d585f15d8963898a15e3a3e533","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"816675e0be0823c87962c997fc2d05c1910083aa664b7c85c20874171489781d","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":"accepted"}],"objective":"Audit and deploy SwarmMarket (src/SwarmMarket.sol, Foundry project at the repo root) on Ethereum mainnet, unchanged if it passes review. Deploy only SwarmMarket; AskSwarmRegistry is already live and must not be redeployed.\n\nWhat it is: yes/no prediction markets settled by the IMD swarm through AskSwarmRegistry (live at 0x53e1e2f33f05086086adf618ca92c3cb0ab111cd, IMD launch #2099). Anyone calls open(body, closeAt, resolveAfter) with an oracle.request JSON body for a bool question and escrows the registry's current price. Anyone calls stake(id, yes, amount) in IMD until closeAt, on either side, repeatedly. After resolveAfter anyone calls resolve(id): if a side is empty the market goes void without spending the fee; otherwise it approves exactly the registry's current price, calls askAtMost(body, price), returns any fee remainder to the creator and records the requestId. Anyone then calls settle(id), which reads registry.get(requestId): a verified bool answer of 32 bytes, value 0 or 1, agreed by a strict majority of its panel decides the market; it takes FEE_BPS (2%) of the losing pool, half to the market creator and half to TREASURY. Every other outcome (refused, split, unverified, lost, wrong type, nothing within ANSWER_WINDOW of 3 days) voids the market with no fee. claim(id) pays winners stake + stake * winnersShare / winningPool, or every stake back on a void market, once per address. abandon voids an open market that could never be resolved.\n\nConstructor: (address registry, address imd, address treasury) = (0x53e1e2f33f05086086adf618ca92c3cb0ab111cd, 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, 0x571e17b13d8f6492bbc372a160520b20bfda320c). The treasury is AskSwarm's operating wallet, which pays for free asks. No owner, admin, upgrade path, ETH handling or loops; claims are pulled; the constructor makes no external call. Fork tests in test/SwarmMarket.t.sol (11, including a solvency fuzz) cover pro-rata payouts with the fee, both outcomes, split panel, one-sided markets, minority and non-bool answers, pending timeout, close time, claim once, staking both sides, guards and abandon.\n\nPart of AskSwarm (github.com/ChromiaAgents/askswarm): the registry is the oracle memory, SwarmMarket is the first market built on it.","parentJobId":null,"planHash":"b513dc11987aa3c47139da1bb6b97a7a87233dcecf3699cc246ff20ec1eae78a","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"4f96aab0-b721-49cd-81cd-2e1e8442d3cd","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2190-src-swarmmarket-sol"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52585","feedbackHash":"f79d688589ac17613edb23e33a9fec5f3fe6ad2014f88c9f03e6fecafc746ec7","nodeKey":"adapt_contract_project","submissionHash":"2547edebd0577cfbeb366398418287816c916ebefb2d2a8fe7b44106427d8520","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51475","feedbackHash":"190feec141e7ea19d637dba9733e19de6fa49923d855be6e976557fc8a99e3e5","nodeKey":"adapt_contract_project","submissionHash":"c9b6dc81986e8c380641cca92c179cb66ab7ed11ef4bdf56510cde7bd1d2bc09","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51040","feedbackHash":"bfb7671ad66a3c2998d2b5d373c67ebb248ee155fc7b224ef54c4e8cdfd4156b","nodeKey":"audit_economics","submissionHash":"5ee8a2b0a4cb96f2cce5ab2984c91f747c8855e3c3ed8ac7d49d4a538c9b8fd4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52667","feedbackHash":"4f36d1c77d84d99a690822e36d4fb5944b30b3e4cc17a7f3533136998ca884e9","nodeKey":"audit_flow","submissionHash":"d6b13aa0da2f49724419f9a6432d26bc6c0a2685ff39e81c8fb0fef0ee5dc9d4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52666","feedbackHash":"9a95be4492e5fa5128ff3d25ebc33af12d969be2d3974875eadeb7d092d880a9","nodeKey":"audit_imported_code","submissionHash":"0ed01641fe3dba08999c4ee72421d3d206efa99f54aad4ee1b79f6d8a610ea3c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51168","feedbackHash":"cd4abbf29aa7408aa0c6713d1934c62b597d830afce1380e4f9e935cc14fb6ea","nodeKey":"audit_judge","submissionHash":"f87022b98c7204c675d850b9932e2bd2a770759cad9c0b87159175cd2b696e5e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51473","feedbackHash":"f947b8d9257b0f5dfd612c96dd216e522fd93fb2507e037432ac32aaaa3a2cfd","nodeKey":"audit_judge","submissionHash":"73fe88ad02c248e55f1df5a3b7747a1ee816a7f59ccff33bc2e4188bee00fe8d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51020","feedbackHash":"6ebd41b3bffa01b95c71321409c1abfa8b03597f1da261f13e85313a789dcadc","nodeKey":"audit_math","submissionHash":"f249b5146c5206886cc84623a68d3998627da345405a83215a7122fd8b4aa373","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52151","feedbackHash":"7d6f472bca6fb37484e4241ef08ef7225243370b44c4709952232dbed424267f","nodeKey":"audit_permissions","submissionHash":"42eb5b28ac49f9647186f05d77590eb0a93d715aac8e466fe10571ddd3999a56","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51242","feedbackHash":"61f8a1354644964534e3f8cccd392399a810c13364e1ce753ab2beb3c14bc523","nodeKey":"manifest","submissionHash":"ef34e569da23cc2435ffe6ed4c23320728bc9638492855c4f53df5f649382925","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50985","feedbackHash":"11d5c74dd914bed3c52adf00943d85ac2e49e27bc44114176c26c55837387acd","nodeKey":"manifest","submissionHash":"d459f2e7724de754140b340804dc0a8859ec70d585f15d8963898a15e3a3e533","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51606","feedbackHash":"79c8bbd9c5041f87977122f9c1fa8536bc83eb5705c9e985768450fa273d6348","nodeKey":"write_foundry_tests","submissionHash":"420c7b666331d2f0ba3cf8f61b36049e04df0facdebf68bb3b34ff31d339eb47","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52255","feedbackHash":"921fbfe88ad93a51dfa539ec80a957b893df82a4be63482076c11758113db572","nodeKey":"write_foundry_tests","submissionHash":"816675e0be0823c87962c997fc2d05c1910083aa664b7c85c20874171489781d","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"b9017490f9509f028d76d7cb894544150a0c975d896f091e3515f1a71fa18f1f","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"30bcdea6dcb9ee40","findings":[{"citation":"resolved","description":"resolve() may be called by anyone at any time at or after resolveAfter, with no upper bound (abandon only competes after resolveAfter + 3 days, and resolve still works then). The oracle body is fixed at open(), and for every body whose window is relative ({\"hours\":N}) or whose question is about the state of the world 'now', the answer depends on the moment the ask is made. That moment is chosen by the resolve caller, who is typically a staker with money on one side. A Yes staker can wait days for the fact to flip in their favour and only then resolve; a No staker can resolve the instant resolveAfter passes. The brief's promise that the swarm 'decides the market' is only true for questions whose answer cannot change after resolveAfter. Stakers cannot tell from the contract which kind of market they are in; nothing on chain bounds the window the resolver gets to choose. Minimal fix that keeps the design: bound the time in which resolve may be called (e.g. revert TooLate after resolveAfter + RESOLVE_WINDOW such as 1 hour, after which only abandon applies), and tell creators in the docs to use an absolute {\"fromBlock\",\"toBlock\"} window that ends before resolveAfter for any question whose answer can move. Setting askedAt deterministically is impossible on chain; a short window at least makes the exploit a mempool race rather than a multi-day free option.","line":128,"path":"src/SwarmMarket.sol","reproduction":"State: open(body, closeAt=T, resolveAfter=T) with body {\"v\":1,\"question\":\"Did ETH trade above 5000 USD on Binance during the window?\",\"chainId\":1,\"window\":{\"hours\":24},\"answerType\":\"bool\",\"evidence\":\"panel\",\"panelSize\":15,\"quorum\":11,\"validForSeconds\":86400}. y1 stakes 100 IMD Yes, n1 stakes 100 IMD No. At T ETH has not traded above 5000 in the last 24h. n1 can call resolve(id) at T and the panel answers No. If nobody resolves and ETH crosses 5000 at T + 40 hours, y1 calls resolve(id) at T + 41h: the ask's 24h window now contains the cross and the panel answers Yes. Same market, same stakes, opposite winner, chosen by whichever staker acts at the time that suits them; resolve(id) succeeds at every timestamp >= T, including after T + 3 days. Expected: the facts the market settles on are fixed by the market's terms, not by the resolver. Actual: the resolver chooses the evidence window.","severity":"medium","snippet":"        if (block.timestamp < m.resolveAfter) revert TooEarly();","title":"Whoever calls resolve() picks when the swarm looks, so a relative-window question can be timed by an interested staker"},{"citation":"resolved","description":"abandon() only checks the phase and the time. It does not check that the market is actually unresolvable (empty side, price zero, or price above the escrow). Once resolveAfter + ANSWER_WINDOW has passed both resolve() and abandon() are callable on the same Open market; the first transaction to land decides whether the swarm is asked or everyone is refunded. A staker who expects to lose watches for resolve() and front-runs it with abandon(), turning a loss into a refund. The contract comment and the brief describe abandon as for 'an open market that could never be resolved'. The same shape exists in settle(): after askedAt + ANSWER_WINDOW the first caller voids the market even if the writer's completion is in the same mempool, and a loser front-runs it. Minimal fix: in abandon(), require the market to be unresolvable: m.yesPool == 0 || m.noPool == 0 || REGISTRY.price() == 0 || REGISTRY.price() > m.feeEscrow; otherwise revert and let the caller use resolve(). (Making the choice deterministic the other way, resolve reverting after the deadline, is worse: it voids markets that could be decided.)","line":146,"path":"src/SwarmMarket.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SwarmMarket} from \"src/SwarmMarket.sol\";\nimport {IAskSwarmRegistry} from \"src/SwarmWager.sol\";\n\n/// Minimal ERC-20 standing in for IMD (OpenZeppelin-style: no hooks, no fee).\ncontract TokenMock {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 a) external {\n        balanceOf[to] += a;\n    }\n\n    function approve(address s, uint256 a) external returns (bool) {\n        allowance[msg.sender][s] = a;\n        return true;\n    }\n\n    function transfer(address to, uint256 a) external returns (bool) {\n        balanceOf[msg.sender] -= a;\n        balanceOf[to] += a;\n        return true;\n    }\n\n    function transferFrom(address f, address to, uint256 a) external returns (bool) {\n        allowance[f][msg.sender] -= a;\n        balanceOf[f] -= a;\n        balanceOf[to] += a;\n        return true;\n    }\n}\n\n/// Registry stand-in: fixed price, pulls it on askAtMost, answers nothing (never consulted here).\ncontract RegistryMock is IAskSwarmRegistry {\n    TokenMock immutable imd;\n    uint256 public price = 0.5 ether;\n    uint256 n;\n\n    constructor(TokenMock t) {\n        imd = t;\n    }\n\n    function askAtMost(bytes calldata, uint256 maxPrice) external returns (bytes32 requestId) {\n        require(price <= maxPrice, \"PriceAboveMax\");\n        imd.transferFrom(msg.sender, address(this), price);\n        requestId = bytes32(++n);\n    }\n\n    function get(bytes32 requestId) external pure returns (Ask memory k, Answer memory a) {\n        k.asker = address(1);\n        k.status = Status.Pending;\n        requestId;\n        return (k, a);\n    }\n}\n\n/// Finding: `abandon` voids a market that can still be resolved. Once `resolveAfter + ANSWER_WINDOW`\n/// has passed, `resolve` and `abandon` are both callable on the same Open market, so a staker on the\n/// side that is about to lose front-runs a `resolve` with `abandon` and gets their stake back instead.\n/// `abandon` is documented as \"an open market that could never be resolved\"; this one can be.\ncontract AbandonRaceTest is Test {\n    TokenMock imd;\n    RegistryMock reg;\n    SwarmMarket mkt;\n    address creator = makeAddr(\"creator\");\n    address yes = makeAddr(\"yes\");\n    address no = makeAddr(\"no\");\n\n    function setUp() public {\n        imd = new TokenMock();\n        reg = new RegistryMock(imd);\n        mkt = new SwarmMarket(address(reg), address(imd), makeAddr(\"treasury\"));\n        address[3] memory us = [creator, yes, no];\n        for (uint256 i; i < 3; i++) {\n            imd.mint(us[i], 1000 ether);\n            vm.prank(us[i]);\n            imd.approve(address(mkt), type(uint256).max);\n        }\n    }\n\n    function test_abandonCannotVoidAResolvableMarket() public {\n        vm.prank(creator);\n        uint256 id = mkt.open(\"{}\", uint64(block.timestamp + 1 hours), uint64(block.timestamp + 1 hours));\n        vm.prank(yes);\n        mkt.stake(id, true, 100 ether);\n        vm.prank(no);\n        mkt.stake(id, false, 100 ether);\n\n        // Nobody resolved for ANSWER_WINDOW after resolveAfter. Both sides are staked, the registry\n        // still sells at the escrowed price: `resolve` would succeed right now.\n        vm.warp(block.timestamp + 1 hours + 3 days + 1);\n        assertLe(reg.price(), 0.5 ether, \"price affordable: market is resolvable\");\n\n        // The No staker sees a `resolve` coming and calls `abandon` first.\n        vm.prank(no);\n        vm.expectRevert(); // expected: a resolvable market cannot be abandoned\n        mkt.abandon(id);\n\n        // Still Open, so the swarm can be asked.\n        (SwarmMarket.Market memory m,) = mkt.get(id);\n        assertEq(uint8(m.phase), uint8(SwarmMarket.Phase.Open), \"market must stay open for resolve\");\n        mkt.resolve(id);\n        (m,) = mkt.get(id);\n        assertEq(uint8(m.phase), uint8(SwarmMarket.Phase.Asked));\n    }\n}","reproduction":"open(body, closeAt=T, resolveAfter=T); y1 stakes 100 IMD Yes; n1 stakes 100 IMD No; nobody calls resolve. At T + 3 days + 1 second registry.price() is still 0.5 IMD (equal to the escrow), so resolve(id) would succeed. n1 calls abandon(id): phase becomes Void, the 0.5 IMD escrow returns to the creator, y1 and n1 each claim 100 IMD back. Expected: abandon reverts because the market is resolvable, and resolve(id) asks the swarm. Actual: abandon succeeds. Proof: test/scratch/AbandonRace.t.sol (no fork), fails on this code with 'next call did not revert as expected'.","severity":"low","snippet":"        if (block.timestamp <= uint256(m.resolveAfter) + ANSWER_WINDOW) revert TooEarly();","title":"abandon() voids a market that can still be resolved, so after resolveAfter + 3 days a losing staker can front-run resolve() with abandon()"},{"citation":"resolved","description":"The creator writes panelSize and quorum into the oracle body at open(); the contract never parses them and settle() only requires agreed * 2 > panelSize, which a 2-of-2 panel satisfies. The oracle reference the registry is built on says a consumer must require 'a panel and agreement at least as large as the value at stake warrants' because 'a small panel is cheap to fill with seats one holder controls'. The registry's own index applies the same majority test, but the registry carries no value; the market pays out the losing pool on this answer. There is no owner to set a minimum later, so it has to be a constant. Minimal fix: add a floor (e.g. uint16 constant MIN_PANEL = 7, and optionally a minimum agreed) and treat a.panelSize < MIN_PANEL as an unusable answer in settle(), voiding the market with a distinct reason code, so a body that asks for a tiny panel cannot move funds.","line":160,"path":"src/SwarmMarket.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SwarmMarket} from \"src/SwarmMarket.sol\";\nimport {IAskSwarmRegistry} from \"src/SwarmWager.sol\";\n\n/// Minimal ERC-20 standing in for IMD (OpenZeppelin-style: no hooks, no fee).\ncontract TokenMock {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 a) external {\n        balanceOf[to] += a;\n    }\n\n    function approve(address s, uint256 a) external returns (bool) {\n        allowance[msg.sender][s] = a;\n        return true;\n    }\n\n    function transfer(address to, uint256 a) external returns (bool) {\n        balanceOf[msg.sender] -= a;\n        balanceOf[to] += a;\n        return true;\n    }\n\n    function transferFrom(address f, address to, uint256 a) external returns (bool) {\n        allowance[f][msg.sender] -= a;\n        balanceOf[f] -= a;\n        balanceOf[to] += a;\n        return true;\n    }\n}\n\n/// Registry stand-in that records the ask and returns whatever verified record the test sets,\n/// exactly as AskSwarmRegistry.get returns an Answered, verified attestation.\ncontract RegistryMock is IAskSwarmRegistry {\n    TokenMock immutable imd;\n    uint256 public price = 0.5 ether;\n    uint256 n;\n    mapping(bytes32 => Ask) public asks;\n    mapping(bytes32 => Answer) answers;\n\n    constructor(TokenMock t) {\n        imd = t;\n    }\n\n    function askAtMost(bytes calldata, uint256 maxPrice) external returns (bytes32 requestId) {\n        require(price <= maxPrice, \"PriceAboveMax\");\n        imd.transferFrom(msg.sender, address(this), price);\n        requestId = bytes32(++n);\n        asks[requestId] = Ask({asker: msg.sender, askedAt: uint64(block.timestamp), status: Status.Pending});\n    }\n\n    function answer(bytes32 requestId, bytes memory ans, uint16 panelSize, uint16 quorum, uint16 agreed) external {\n        asks[requestId].status = Status.Answered;\n        answers[requestId] = Answer({\n            questionHash: keccak256(\"q\"),\n            answer: ans,\n            answerHash: keccak256(ans),\n            answerType: 0,\n            panelSize: panelSize,\n            quorum: quorum,\n            agreed: agreed,\n            issuedAt: uint64(block.timestamp),\n            expiresAt: uint64(block.timestamp + 1 days),\n            verified: true\n        });\n    }\n\n    function get(bytes32 requestId) external view returns (Ask memory k, Answer memory a) {\n        return (asks[requestId], answers[requestId]);\n    }\n}\n\n/// Finding: the market creator writes `panelSize` and `quorum` into the body, and `settle` accepts any\n/// strict majority of any panel. A body with `\"panelSize\":2,\"quorum\":2` (the smallest the door\n/// accepts) lets two seats decide a market of any size. The contract should refuse to settle on a\n/// panel below a floor and void instead, as it does for every other weak answer.\ncontract PanelFloorTest is Test {\n    TokenMock imd;\n    RegistryMock reg;\n    SwarmMarket mkt;\n    address creator = makeAddr(\"creator\");\n    address yes = makeAddr(\"yes\");\n    address no = makeAddr(\"no\");\n\n    function setUp() public {\n        imd = new TokenMock();\n        reg = new RegistryMock(imd);\n        mkt = new SwarmMarket(address(reg), address(imd), makeAddr(\"treasury\"));\n        address[3] memory us = [creator, yes, no];\n        for (uint256 i; i < 3; i++) {\n            imd.mint(us[i], 10_000 ether);\n            vm.prank(us[i]);\n            imd.approve(address(mkt), type(uint256).max);\n        }\n    }\n\n    function test_twoSeatPanelDoesNotDecideTheMarket() public {\n        bytes memory body =\n            '{\"v\":1,\"question\":\"Will the creator be right?\",\"chainId\":1,\"window\":{\"hours\":1},\"answerType\":\"bool\",\"evidence\":\"panel\",\"panelSize\":2,\"quorum\":2,\"validForSeconds\":3600}';\n        vm.prank(creator);\n        uint256 id = mkt.open(body, uint64(block.timestamp + 1 hours), uint64(block.timestamp + 1 hours));\n        vm.prank(yes);\n        mkt.stake(id, true, 10 ether);\n        vm.prank(no);\n        mkt.stake(id, false, 10_000 ether);\n        vm.warp(block.timestamp + 1 hours);\n        mkt.resolve(id);\n        (SwarmMarket.Market memory m,) = mkt.get(id);\n\n        // Two seats, both say Yes: verified, agreed >= quorum, strict majority of a panel of two.\n        reg.answer(m.requestId, abi.encode(true), 2, 2, 2);\n        mkt.settle(id);\n        (m,) = mkt.get(id);\n\n        // Expected: a two-seat panel is below any reasonable floor; the market voids and the\n        // 10,000 IMD No pool is refunded. Actual on this code: Phase.Yes, 9,800 IMD go to the Yes side.\n        assertEq(uint8(m.phase), uint8(SwarmMarket.Phase.Void), \"two seats decided a 10,010 IMD market\");\n    }\n}","reproduction":"open(body, closeAt=T, resolveAfter=T) with body {\"v\":1,\"question\":\"Will the creator be right?\",\"chainId\":1,\"window\":{\"hours\":1},\"answerType\":\"bool\",\"evidence\":\"panel\",\"panelSize\":2,\"quorum\":2,\"validForSeconds\":3600}; creator stakes 10 IMD Yes, n1 stakes 10,000 IMD No; resolve(id) at T; the registry records a verified bool answer 1 with panelSize 2, quorum 2, agreed 2. settle(id): phase = Yes, winnersShare = 9,800 IMD, fee 200 IMD (100 to the creator, 100 to the treasury); creator claims 10 + 9,800 IMD. Expected: an answer from a panel below the floor voids the market like every other weak answer. Actual: two seats decide 10,010 IMD. Proof: test/scratch/PanelFloor.t.sol (no fork, mock registry returning an Answered verified record), fails on this code with phase 3 (Yes) instead of 5 (Void).","severity":"low","snippet":"            && a.answer.length == 32 && uint256(a.agreed) * 2 > a.panelSize;","title":"settle() accepts a strict majority of any panel size; a creator-written body with panelSize 2 lets two seats decide a market of any size"},{"citation":"resolved","description":"open() escrows exactly the price quoted at open time (0.5 IMD today). resolve() reverts when the registry's price at resolve time is higher by even 1 wei, and nobody can top the escrow up: the only exit is abandon() after resolveAfter + 3 days, which voids the market. The same happens when IMD retires the action (price 0): the registry's _ask reverts NotSold, so resolve reverts. Intake's price is set by IMD, outside this protocol; a change applies to every open market simultaneously, including ones whose answer is already known, and converts them all into 3-day refunds. The brief accepts this ('abandon later') so this is reported as a documented liveness dependency rather than a loss. Minimal fix that keeps the design: let resolve() take the shortfall from msg.sender (approve-and-pull p - feeEscrow from the caller when p > feeEscrow), or let anyone top up feeEscrow for an Open market, so a staker who wants the market decided can pay the difference.","line":131,"path":"src/SwarmMarket.sol","reproduction":"State: market open with 100 IMD on each side, feeEscrow = 0.5 IMD. Intake's owner calls setPrice so registry.price() returns 0.500000000000000001 IMD. resolve(id) reverts BadTerms at every timestamp; stake() reverts Closed after closeAt; the only successful call is abandon(id) at resolveAfter + 3 days + 1, which voids. Expected per the brief: documented; a resolver should be able to pay the shortfall so the market can still settle. Actual: 200 IMD locked for at least 3 days, then refunded with no settlement, for every open market at once.","severity":"low","snippet":"        if (p > m.feeEscrow) revert BadTerms(); // price rose above the escrow: `abandon` later","title":"Any rise in the Intake price above the escrow makes every open market unresolvable at once; stakes are locked until resolveAfter + 3 days and then void"},{"citation":"resolved","description":"Once askedAt + ANSWER_WINDOW has passed, settle() on a still-Pending ask voids the market with reason 3. The registry's onOracleResult is delivered by Intake's writer in its own transaction; if that transaction is pending at the same time, a losing staker front-runs it with settle(id) and the market refunds instead of paying the winners. The answer still lands in the registry afterwards (the registry does not know about the market), so the loss is purely the market's. The oracle normally answers within minutes and 3 days is generous, so this needs a slow or stalled panel; it is reported because it is a value decision made by a mempool race. Minimal fix: give the timeout path a grace period in which only the market creator (who earns the same fee either way and has no side) may void on timeout, opening it to everyone after a further window; or lengthen ANSWER_WINDOW. Either keeps the void-on-no-answer guarantee while removing the loser's ability to race a completion that is already in flight.","line":156,"path":"src/SwarmMarket.sol","reproduction":"State: resolve(id) at time A; the panel has not answered by A + 3 days (e.g. a 100-seat body with quorum 100). At A + 3 days + 1 the writer's complete(requestId, 0, ...) with a verified Yes answer is in the mempool. n1 (No staker, 100 IMD) sends settle(id) with a higher tip; it is mined first: phase = Void, reason 3, n1 claims 100 IMD back. The writer's transaction then stores the answer in the registry; settle(id) now reverts WrongPhase(Void). Expected: the verified answer that exists for this ask decides the market. Actual: the loser is refunded.","severity":"low","snippet":"            if (block.timestamp <= uint256(m.askedAt) + ANSWER_WINDOW) revert StillPending();","title":"settle() voids a pending market the first second after askedAt + 3 days, so a late oracle completion loses a mempool race to a losing staker"},{"citation":"resolved","description":"This file is the manifest of IMD launch #2099 (the registry). The brief for this task forbids redeploying the registry and asks for SwarmMarket only, constructor (registry, imd, treasury) = (0x53e1e2f33f05086086adf618ca92c3cb0ab111cd, 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, 0x571e17b13d8f6492bbc372a160520b20bfda320c). The manifest step must not reuse or extend this file: the registry entry would redeploy a second registry, and $contract:AskSwarmRegistry would point SwarmMarket at that new, empty registry instead of the live one. Also, script/Deploy.s.sol deploys only AskSwarmRegistry, so it is not a deployment path for this launch. The SwarmMarket constructor makes no external call, has no owner and holds no ETH, so a manifest with the three static addresses is sufficient; all three addresses were checked live on mainnet (registry VERSION askswarm-registry/1 intake-v2 oracle-1, price 0.5 IMD, INTAKE and SIGNER as in the brief; IMD is an OpenZeppelin OFT ERC-20 with no transfer hooks, fees or blacklist; the treasury is an externally owned account).","line":5,"path":"contracts/launch.json","reproduction":"Reading contracts/launch.json: contracts[0].contract == \"AskSwarmRegistry\" with the Intake, IMD and signer arguments. Expected for this launch: exactly one entry, contract \"SwarmMarket\", constructorArgs [\"0x53e1e2f33f05086086adf618ca92c3cb0ab111cd\", \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\", \"0x571e17b13d8f6492bbc372a160520b20bfda320c\"]. Actual: the existing file would redeploy the registry, which the brief forbids.","severity":"info","snippet":"      \"contract\": \"AskSwarmRegistry\",","title":"The repository's contracts/launch.json describes the AskSwarmRegistry launch; a SwarmMarket manifest must list SwarmMarket only, with the three static constructor addresses"},{"citation":"resolved","description":"settle() reads whatever the registry holds for m.requestId. The registry records any attestation Intake's writer delivers for a Pending ask as long as the signature, quorum and window check out; neither the registry nor the market compares a.questionHash with the body that was asked, and the market cannot, because the body's window is relative and the hash is computed off chain. The oracle reference states this plainly: 'the pairing of an answer with the ask that bought it is the writer's'. This is the protocol's design and not a defect in SwarmMarket, but it means the market's payouts rest on the plane's writer and the oracle signer key in addition to the panel. Not fixable in this contract without absolute windows and an on-chain OracleQuestion hash; recorded so the adapter and the launch review treat the writer and signer as trusted parties for all market value.","line":154,"path":"src/SwarmMarket.sol","reproduction":"State: market asked with requestId R for question Q. The writer completes R with a valid attestation for a different question Q' (questionHash != hash of Q) signed by the oracle signer for the registry's domain. Registry: asks[R].status = Answered, verified. settle(id) decides the market on Q' answer. Expected: the market only settles on an answer to Q. Actual: any verified bool answer delivered under R settles it. Not reproducible without the signer key; recorded as a trust assumption, not a defect.","severity":"info","snippet":"        (IAskSwarmRegistry.Ask memory k, IAskSwarmRegistry.Answer memory a) = REGISTRY.get(m.requestId);","title":"Trust assumption: the market cannot tell an answer to its own question from any other answer the writer delivers under its requestId"}],"hash":"0ed01641fe3dba08999c4ee72421d3d206efa99f54aad4ee1b79f6d8a610ea3c","nodeId":"128cb656-c6cf-4340-96a2-26c76735c96c","outcome":"completed","summary":"Review complete. The findings file is written and valid, and nothing else in the tree was changed.\n\n**Verdict:** SwarmMarket has no loss-of-funds, reentrancy, access-control or accounting defect I could reproduce. The project's 11 fork tests pass against mainnet. The IMD token is a plain OpenZeppelin OFT with no hooks or fees, the live registry matches the source's version string and price, the treasury is an EOA, and the contract contains no owner, proxy, delegatecall, selfdestruct or post-deployment configuration. The constructor makes no external call, so it will survive the empty-chain rehearsal.\n\n**Contracts read:** src/SwarmMarket.sol in full, src/AskSwarmRegistry.sol in full, the IAskSwarmRegistry interface in src/SwarmWager.sol, src/IIntake.sol, test/SwarmMarket.t.sol, script/Deploy.s.sol and contracts/launch.json. Live state was checked for the registry, IMD and treasury on mainnet. Not reached: the Intake v2 implementation itself and the rest of SwarmWager, which this launch does not deploy.\n\n**Findings in .imd-findings.json** (7 entries, 2 with no-fork proofs under test/scratch/):\n\n- **Medium, resolve timing.** Anyone can call resolve at any time after resolveAfter with no upper bound. For a relative-window body the resolver chooses the evidence window, so a staker can wait days for the facts to turn and then ask. Concrete body and timeline given.\n- **Low, abandon race (proof).** abandon voids a market that can still be resolved, so after resolveAfter plus three days a losing staker front-runs resolve with abandon. Proof fails on this code and passes with a resolvability check.\n- **Low, panel floor (proof).** settle accepts a strict majority of any panel, so a creator-written body with panelSize 2 lets two seats decide a market of any size. Proof fails now and passes with a minimum panel constant.\n- **Low, price rise.** A one-wei Intake price increase makes every open market unresolvable at once until it voids three days after resolveAfter. Documented by the brief, reported with a top-up fix.\n- **Low, settle timeout race.** After askedAt plus three days a loser can void a pending market ahead of a late oracle completion in the same mempool.\n- **Info, manifest.** contracts/launch.json describes the registry launch; a SwarmMarket manifest must list only SwarmMarket with the three static addresses and must not reference or redeploy the registry.\n- **Info, trust.** Neither the registry nor the market binds an answer to its question hash, so payouts rest on the writer and signer in addition to the panel.\n\n**Test gaps noted for the adapter:** the suite never exercises a tiny panel, the abandon-versus-resolve overlap after the window, a price change between open and resolve, or a user who staked on both sides of a void market.","treeHash":null,"usage":{"cachedInputTokens":923838,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":33134,"runtime":"claude","turns":24,"wallClockMs":503960}},{"artifacts":[],"attempt":1,"bundleHash":"9b64a23238e8dffee3f961e9dd750b2f6211dae48a32c2b4d4929c68f8aed6fe","device":"3c1226d190150ef0","findings":[],"hash":"2547edebd0577cfbeb366398418287816c916ebefb2d2a8fe7b44106427d8520","nodeId":"da69c21a-fdde-41d3-9b82-3776e4c85ab6","outcome":"completed","summary":"I fixed the medium finding: an answer that reaches the registry within the 3-day window now decides the market, however late someone calls `settle`. The reviewer's proof failed on the starting code with `answered-in-window market voided: 5 != 3` and now passes. The project's full suite passes (153 tests, 0 failed) with the required fuzz seed, and `forge build` succeeds.\n\n**c7f7d6ef887a, settle deadline (medium): reproduced and fixed** in `src/SwarmMarket.sol`\n- `settle` now reads the registry first, the same order SwarmWager uses:\n  - While the request is still pending, `settle` reverts `StillPending` until `askedAt + ANSWER_WINDOW`. After that it voids the market (reason 3).\n  - Any recorded answer is judged the same way whenever `settle` is called, so a loser gains nothing by staying silent.\n- An answer must also be signed (`issuedAt`) no later than the deadline, or the market voids with a new reason 22. This keeps last round's fix for late answers: one issued after the deadline voids whichever transaction lands first.\n- One trade-off: `settle` now needs the registry's read call to work. Before, it could void without it after the deadline. That call is a plain storage read on an immutable contract, so I replaced the old \"registry outage\" test with one showing `settle` waits for the registry, then voids.\n- New tests in `test/SwarmMarketReview.t.sol`:\n  - the proof's scenario settled 30 days late, with the full fee split;\n  - an answer issued exactly at the deadline but delivered later still decides, and one issued a second later voids;\n  - the registry-outage replacement above.\n\n  The old test that asserted the void is gone.\n\n**a6554325c3be, oversized body (low): fixed.** `open` now rejects bodies over 16,384 bytes, the size the oracle's request contract accepts (`MAX_BODY_BYTES`). Tested at 16,385 (rejected) and 16,384 (opens and resolves).\n\n**Answered as disputed, code unchanged:**\n- **023382f9e5fb:** the timing overlap in SwarmWager is real, but SwarmWager is already live and this launch doesn't deploy it. It's recorded in ADAPTATION.md for a future version.\n- **ae4125095cb5:** a 1-wei bet on the empty side does spend the creator's escrow for no fee, but that follows the brief's \"if a side is empty\" rule. A minimum stake would be your call.\n- **e9768981c96a:** the minimum panel of 7 was the accepted fix for an earlier audit finding, and that finding's proof still passes. It isn't in your brief, though, so you may want the brief or the docs to state it.\n\nThe older abandon proof (2c68e2c29ddc) still fails, as it did last round. The deliberate change to resolve/abandon timing replaced it, and it isn't one of the proofs this round's result is checked against.\n\nREADME.md and ADAPTATION.md are updated: a new section per change, the old deadline section marked as replaced, and new bytecode sizes and test counts. The finding answers are in `.imd-responses.json`.","treeHash":"8913357e415a93b1cee7d5f41d3fce3e6b96a1b8","usage":{"cachedInputTokens":1237329,"inputTokens":34,"model":"claude-opus-5-5","outputTokens":15227,"runtime":"claude","turns":19,"wallClockMs":363807}},{"artifacts":[],"attempt":1,"bundleHash":"02d6f6c4ee4b30998b3d64315590f1a348cddd206c3a31f1f4950912fd1cccc0","device":"a12c1a6f9430f757","findings":[],"hash":"420c7b666331d2f0ba3cf8f61b36049e04df0facdebf68bb3b34ff31d339eb47","nodeId":"816ec526-3ce7-4e97-be92-7c67701c2ce6","outcome":"completed","summary":"Added stateful invariants, payment-failure tests, and optional live-registry fork tests. Only `test/` changed.\n\n- `forge build` passed.\n- Full suite: **160 passed, 0 failed**; live-fork suite skipped offline.\n- New invariant campaign: **24,576 calls**, no unexpected reverts.\n- No new defects confirmed. No mainnet deployment performed.\n\n[Coverage and verification notes](/home/imd-worker/.identitymd/work/4f96aab0-b721-49cd-81cd-2e1e8442d3cd/816ec526-3ce7-4e97-be92-7c67701c2ce6/test/SwarmMarketTesting.md)","treeHash":"3239d932a027df08e89458bb2c1b6a85878c6c53","usage":{"cachedInputTokens":5927168,"inputTokens":144312,"model":"gpt-6-astra","outputTokens":36706,"runtime":"codex","turns":14,"wallClockMs":1178321}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"cdeffb0cd839cbf7","findings":[{"citation":"resolved","description":"Asymmetry between the two settle outcomes and between the two contracts built on the registry. The launch brief states that the market voids when 'nothing within ANSWER_WINDOW of 3 days' arrives. The code voids any still-Asked market after the window without reading the registry, even when a verified strict-majority bool answer has been on record for days. SwarmWager.settle (src/SwarmWager.sol:213-216) only refunds on timeout while the registry still reports Pending/None and otherwise pays the recorded answer at any time. In SwarmMarket the losing side therefore profits from inaction: it never calls settle, and if no winner (or anyone else) does so inside the three days, a single loser call at second 3d+1 converts a lost position into a full refund while every winner forfeits the 98% of the losing pool they were owed and the creator and treasury forfeit the fee. Nobody is privileged, but the economic outcome depends on which side acts, which the brief's wording does not allow. README.md:286-290 and ADAPTATION.md document this as a deliberate settlement deadline because the live registry has no delivery timestamp; the registry does however expose Status, so a 'void only while still Pending/None after the window, otherwise decide on the record' rule (SwarmWager's) is implementable without a delivery timestamp. If the requester accepts the deadline, the brief's phrase should be corrected instead; either way one of the two must change.","line":180,"path":"src/SwarmMarket.sol","reproduction":"Offline (mocks etched at the real IMD/Intake addresses, as test/SwarmMarket.t.sol does): creator open(body, t+1h, t+1h); y1 stake(id, true, 100e18); n1 stake(id, false, 100e18); warp t+1h; resolve(id) -> Asked, askedAt=T. Writer delivers a verified bool answer abi.encode(true), panel 15, agreed 12 through Intake to the registry at T+1h (registry.get(requestId).status == Answered, verified). Nobody calls settle. At T + 3 days + 1 second n1 calls settle(id). Expected per brief: Phase.Yes, y1 claimable 100e18 + 98e18, creator 1e18, treasury 1e18. Actual: Phase.Void with reason 3, claimable(id, y1) == 100e18 and claimable(id, n1) == 100e18, no fee paid. Confirmed by test/scratch/Review.t.sol::test_answerPresentButLateSettleVoids and by the repo's own test_answerDeliveredEarlyStillRequiresSettlementWithinWindow.","severity":"low","snippet":"        if (block.timestamp > uint256(m.askedAt) + ANSWER_WINDOW) return _void(m, id, 3);","title":"settle voids a market whose verified answer is already in the registry once askedAt + 3 days passes; the brief says only 'nothing within ANSWER_WINDOW' voids"},{"citation":"resolved","description":"Outside the SwarmMarket deployment scope but the same defect class the earlier review fixed in SwarmMarket (ADAPTATION.md, finding 2c68e2c29ddc: disjoint resolve/abandon windows). SwarmWager.resolve (src/SwarmWager.sol:175-190) has no upper time bound and SwarmWager.abandon opens strictly after resolveAfter + ANSWER_WINDOW, so from that second on a Matched wager can be either asked or refunded by whoever lands first. abandon's NatSpec says it is for a wager that 'could never be resolved' (price above escrow) but the function does not check that condition: it refunds any Matched wager after the window. The participant who expects the swarm to rule against them has a free option to call abandon instead of letting the counterparty resolve; a public-mempool race decides who gets the pot or a refund. Bounded because the counterparty had three days to resolve first, and because an abandon returns both stakes rather than misdirecting funds. SwarmWager is already launched (contracts/LAUNCH-WAGER.md), so this is a note for a successor rather than a blocker for the SwarmMarket launch.","line":197,"path":"src/SwarmWager.sol","reproduction":"creator create(body, true, 10e18, t+1h, t+1h); n1 join(id) -> Matched. warp to resolveAfter + 3 days + 1. Snapshot A: anyone calls resolve(id) -> succeeds, state Asked, registry asked. Snapshot B (same block): n1 calls abandon(id) -> succeeds, state Refunded, both stakes returned, creator's 0.5 IMD fee returned. Expected per abandon's documentation: abandon reverts (or is impossible) while resolve is still legal and the escrow still covers the registry price. Confirmed by test/scratch/Review.t.sol::test_wagerAbandonWhileResolvable.","severity":"low","snippet":"        if (block.timestamp <= uint256(w.resolveAfter) + ANSWER_WINDOW) revert TooEarly();","title":"SwarmWager: abandon and resolve are both legal after resolveAfter + 3 days, so the party expecting to lose can refund a resolvable wager"},{"citation":"resolved","description":"Economics x asymmetry note, not a bypass. The only path that returns the escrowed 0.5 IMD to the creator is a one-sided market. Any address can stake 1 wei on the empty side one block before closeAt (stake has no minimum, src/SwarmMarket.sol:119 only rejects 0), which makes the market two-sided so resolve spends the creator's escrow on an oracle ask whose outcome is economically irrelevant (fee on 1 wei of losing pool rounds to 0; the winners split 1 wei). Cost to the griefer: 1 wei plus gas; loss to the creator: the whole escrow (0.5 IMD at today's price). Mitigation would be a minimum stake or a creator-set floor; both are design changes, so this is recorded for the author's judgment rather than as a defect.","line":152,"path":"src/SwarmMarket.sol","reproduction":"creator open(body, t+1h, t+1h) escrows 0.5e18; y1 stake(id, true, 100e18); griefer stake(id, false, 1) before closeAt; warp t+1h; resolve(id). Expected if the market were one-sided: Void reason 1, creator balance +0.5e18 back. Actual: Phase.Asked, creator balance unchanged (escrow spent), registry asked; after a Yes answer and settle, y1 claims 100e18 + 1 and no fee is paid. Confirmed by test/scratch/Review.t.sol::test_dustStakeForcesOracleSpend.","severity":"info","snippet":"        if (m.yesPool == 0 || m.noPool == 0) return _void(m, id, 1);","title":"A 1 wei counter-stake converts a one-sided market's fee refund into an oracle spend; creator cannot opt out"}],"hash":"42eb5b28ac49f9647186f05d77590eb0a93d715aac8e466fe10571ddd3999a56","nodeId":"3e4b93e8-b95b-4da8-80f1-9d74aae4f38e","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with three findings and coverage rows for all 18 entry points plus three invariants.\n\n**Result: no access-control defect in SwarmMarket.** The contract has no roles, setters, upgrade path or admin, and every state-changing function is gated only by phase and time. I traced each one for inconsistent guards, confused-deputy paths through the registry and Intake, approval residue, and fee-destination asymmetry, and they hold. The live dependencies also check out:\n\n- Registry at the pinned address has runtime bytecode identical to this source apart from immutables, matching VERSION, IMD, Intake, signer and a 0.5 IMD price.\n- IMD is an OpenZeppelin ERC20 LayerZero OFT with no pause, blocklist, fee or transfer hooks, so no receiver can block `settle` or `claim`. The 11 fork tests pass against the real token and Intake.\n- Treasury is an EOA.\n\n**Findings reported** (all reproduced with a scratch test under `test/scratch/`):\n\n1. **Low, SwarmMarket.settle:** after three days it voids without reading the registry, even when a verified answer has been on record. The losing side profits from inaction, and the launch brief says only \"nothing within ANSWER_WINDOW\" voids. The README documents this as a deliberate deadline, so the judge must pick between fixing the code or the brief.\n2. **Low, SwarmWager.abandon:** it overlaps `resolve` after resolveAfter plus three days, the same race the earlier review removed from SwarmMarket. SwarmWager is already live and outside this deployment.\n3. **Info, SwarmMarket.stake:** a one-wei counter-stake turns a one-sided market's fee refund into an oracle spend. Inherent to a parimutuel with no minimum stake.\n\nNot re-reported, since they are documented trust assumptions with tests: the resolver's choice of ask time within the one-hour window for relative-window questions, and the writer's pairing of answers to request ids.\n\nThe findings file validated as JSON, and all three snippets match their cited lines exactly. No repository file was changed outside `.imd-findings.json` and the scratch test.","treeHash":null,"usage":{"cachedInputTokens":1326285,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":33697,"runtime":"claude","turns":30,"wallClockMs":631895}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"df74f6c887684f20","findings":[{"citation":"resolved","description":"Economic Security guide, 'Legitimate features turned against the protocol' and 'cheapest griefing vector'. The brief promises that a one-sided market voids without spending the fee, and the creator's only income is FEE_BPS of the losing pool. The emptiness test is a strict zero check, so the smallest possible opposing stake (1 wei of IMD) flips the market from the free void path into the paid ask path. The creator's 0.5 IMD escrow then buys a swarm answer whose losing pool is 1 wei, so fee = 1 * 200 / 10_000 = 0 and the creator and treasury receive nothing. The cost to the actor is 1 wei plus gas; the cost to the creator is the whole escrow (0.5 IMD at today's registry price). The same move lets anyone obtain a public, verified registry answer to any open market's question at the creator's expense, since the answer lands in AskSwarmRegistry for all readers. Fee revenue only covers the escrow once the losing pool reaches 50 IMD, and nothing in the contract ties the decision to ask to the size of either side. No funds are stolen and winners are paid correctly, hence low. A minimal fix that preserves the design is to treat a side as empty for the purpose of asking when it cannot pay a fee that covers the escrow, for example `if (m.yesPool == 0 || m.noPool == 0 || _min(m.yesPool, m.noPool) * FEE_BPS / 10_000 < m.feeEscrow / 2) return _void(m, id, 1);`, or to let `open` take a creator-chosen minimum stake per side; either is a scope decision for the author and both keep the 2% split unchanged.","line":152,"path":"src/SwarmMarket.sol","reproduction":"State: registry price 0.5 IMD. 1) creator calls open(body, now+1h, now+2h); creator balance drops 0.5 IMD into feeEscrow. 2) y1 calls stake(id, true, 100e18). 3) attacker calls stake(id, false, 1) (one wei) before closeAt. 4) at resolveAfter anyone calls resolve(id). Expected per the brief for a market with effectively one side: Void with reason 1 and the 0.5 IMD returned to the creator. Actual: both pools are non-zero so resolve approves 0.5 IMD and calls askAtMost; the escrow is spent to the swarm and the market is Asked. 5) the swarm answers Yes (verified bool, panel >= 7, strict majority); settle(id) computes losers = 1 wei, fee = 0, winnersShare = 1; creator receives 0 and TREASURY receives 0. Net: creator -0.5 IMD, attacker -1 wei, y1 claims 100e18 + 1 wei. Repeating across every open market costs the actor 1 wei plus gas per market and burns 0.5 IMD of each creator's escrow, and publishes each market's question answer in the registry.","severity":"low","snippet":"        if (m.yesPool == 0 || m.noPool == 0) return _void(m, id, 1);","title":"A 1 wei counter-stake forces the creator's full oracle escrow to be spent for zero fee revenue"}],"hash":"5ee8a2b0a4cb96f2cce5ab2984c91f747c8855e3c3ed8ac7d49d4a538c9b8fd4","nodeId":"89511bb8-e045-4f75-ac9d-08f50c30aedd","outcome":"completed","summary":"The review is complete. The findings file is valid JSON, the quoted snippet matches line 152 exactly, the scratch directory is removed, and the only change in the tree is `.imd-findings.json`.\n\n**Result: SwarmMarket's economics hold.** I found one low-severity defect and no loss-of-funds path. The contract is safe to deploy unchanged if the author accepts the low as a design trade-off.\n\n**What I checked, against the Economic Security, Invariant and Flow Gap guides:**\n\n- **Conservation.** Contract IMD balance always equals unclaimed pools plus escrows plus rounding dust. Fee plus winners' share equals the losing pool exactly. Confirmed by the existing fuzzes and by a scratch fuzz of 2,000 runs with up to 24 stakers on both sides.\n- **Dependency failures.** Price rise, price zero, Intake revert, registry revert, signer rotation, split or refused panel, lost delivery and late delivery all end in a void or abandon with full refunds and no fee. No path strands funds.\n- **Token behaviour.** The live IMD at the brief's address is a stock LayerZero OFT over OpenZeppelin ERC-20 with owner-settable name and symbol only. No fee, hooks, pause or blacklist, so the Slither reentrancy leads on resolve and settle are not reachable.\n- **Live registry.** It returns the expected price and version and contains the `askAtMost` selector, so the constructor arguments in the brief are consistent with what is deployed.\n- **Prior round.** Resolver timing, the abandon race, two-seat panels, price rises and the late-completion race were already fixed and regression-tested. I did not reopen them.\n\n**The one finding (low).** The one-sided void check is a strict zero test. A 1 wei stake on the empty side flips a market from the free void path into the paid ask path, spending the creator's full 0.5 IMD escrow for a fee of zero. Anyone can do this across every open market for 1 wei plus gas each, and it also yields a public registry answer at the creator's expense. Winners are still paid correctly, so no funds are stolen. I suggested treating a side as empty when it cannot pay a meaningful fee, or a creator-chosen minimum stake, as scope decisions for the author.\n\n**Coverage.** All 19 listed entry points have rows, plus three invariants and two dependency checks. The six SwarmWager rows note it is already live and outside this launch. Its resolve has no one-hour window, unlike the market, which the author cannot change here.","treeHash":null,"usage":{"cachedInputTokens":893242,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":35474,"runtime":"claude","turns":30,"wallClockMs":647509}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc34db8e17664ebd","findings":[{"citation":"resolved","description":"launch.json was written by the manifest step (commit 7bef3c3) before the fix round (commits 8c98b9c and 97b3566) changed settle(). Its notes say 'Settlement must occur within 3 days of asking, inclusive', 'settlement after the deadline void[s] the market' and 'The 3-day limit is a settlement deadline because the registry exposes no delivery timestamp'. The accepted code no longer behaves that way: src/SwarmMarket.sol lines 186-195 read registry.get first, void only a still Pending/None ask after askedAt + ANSWER_WINDOW (reason 3), and decide the market from a verified answer whose signed issuedAt is at most askedAt + ANSWER_WINDOW however late settle is called (reason 22 only for a later issuedAt). README.md lines 286-290 and ADAPTATION.md (section c7f7d6ef887a) were updated; the manifest notes were not. The constructor arguments in launch.json are correct (registry 0x53e1e2f33f05086086adf618ca92c3cb0ab111cd, IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, treasury 0x571e17b13d8f6492bbc372a160520b20bfda320c, in declaration order), the kind, name and schema are valid, and notes are explanatory text with no deployment authority, so this is a documentation inconsistency, not a code or deployment defect. It is recorded so the manifest step refreshes the notes against the accepted tree before it submits, since a published description that tells winners they must settle within three days would reinstate, socially, the behaviour the fix removed.","line":13,"path":"launch.json","reproduction":"Read launch.json line 13 and compare with src/SwarmMarket.sol:186-195. Then run forge test --match-test test_answerDeliveredInWindowSettlesAfterDeadline (test/SwarmMarketReview.t.sol:395): a market with alice 30 IMD Yes and bob 60 IMD No is resolved, a verified 12-of-15 Yes answer is delivered one hour later, and settle(id) is first called at askedAt + 3 days + 30 days. Expected per the manifest notes: Void ('settlement after the deadline void the market'). Actual: Phase.Yes, Settled(id, Yes, 30e18, 60e18, 1.2e18, 0), claimable(id, alice) = 88.8e18, treasury +0.6e18. The test passes on the current tree (162/162 of the suite pass), so the code, README and ADAPTATION agree with each other and the manifest notes are the odd text out.","severity":"info","snippet":"Settlement must occur within 3 days of asking, inclusive, and requires a verified 32-byte bool word of 0 or 1 with a strict majority of a panel of at least 7. Other terminal outcomes or settlement after the deadline void the market.","title":"launch.json notes still describe the settlement deadline the c7f7d6ef887a fix removed; the manifest text contradicts the accepted code"},{"citation":"resolved","description":"Carried from the previous round (id 023382f9e5fb). The author disputed it on scope only: SwarmWager is live and not in this launch's manifest, so its source stays unchanged. That is correct and I accept it; the defect itself is unchanged in the tree. SwarmWager.resolve (lines 175-190) requires only block.timestamp >= resolveAfter, and abandon (line 197) opens strictly after resolveAfter + ANSWER_WINDOW, so from that second both are legal on the same Matched wager although abandon's NatSpec reserves it for a wager that is 'never resolvable'. The party expecting to lose holds a free option to refund instead of letting the counterparty resolve. Bounded: the counterparty had three days to resolve first and abandon returns both stakes rather than misdirecting them. Not a blocker for deploying SwarmMarket, which already has disjoint resolve/abandon windows (lines 156 and 175). Recorded for a successor SwarmWager.","line":197,"path":"src/SwarmWager.sol","reproduction":"Offline with the repository fixtures: creator create(body, true, 10e18, T0+1h, T0+1h); bob join(id) -> Matched. warp to T0+1h + 3 days + 1. Snapshot A: resolve(id) succeeds, state Asked, the registry records a Pending ask. Snapshot B at the same timestamp: bob abandon(id) succeeds, state Refunded, bob's balance back to 100e18, creator's stake and fee returned. Expected per abandon's documentation: abandon impossible while resolve is legal and the escrow covers the price. Actual: both legal; a mempool race decides pot versus refund. Previously reproduced as test/scratch/Repro.t.sol::test_wagerAbandonAndResolveBothLegalAfterWindow; src/SwarmWager.sol is byte-identical to the previous round.","severity":"low","snippet":"        if (block.timestamp <= uint256(w.resolveAfter) + ANSWER_WINDOW) revert TooEarly();","title":"SwarmWager: resolve has no upper time bound, so after resolveAfter + 3 days a Matched wager can be either asked or abandoned by whoever lands first (already-live contract, not deployed by this launch;"},{"citation":"resolved","description":"Carried from the previous round (id ae4125095cb5), unchanged. The emptiness test is a strict zero check and stake rejects only amount 0 (line 124), so any address can stake 1 wei on the empty side before closeAt; resolve then spends the creator's whole escrow on an ask whose losing pool is at most 1 wei, so fee = 1 * 200 / 10_000 = 0. The author answered that this matches the brief's rule ('if a side is empty the market goes void without spending the fee') and that a dust bettor cannot be told apart from a real one; a minimum stake is a scope decision for the requester. I agree: the code implements the brief exactly, so this is not a defect and does not block. Recorded so the requester knows the trade-off (a minimum stake per side, or treating a side as empty when its possible fee cannot cover the escrow, would close it and both change the agreed rules).","line":157,"path":"src/SwarmMarket.sol","reproduction":"creator open(body, T0+1h, T0+1h) escrows 0.5e18; alice stake(id,true,100e18); bob stake(id,false,1); warp T0+1h; resolve(id). If the market were treated as one-sided: Phase.Void reason 1 and creator balance back to 100e18. Actual: Phase.Asked, creator balance 99.5e18, Intake recipient +0.5e18. After a verified Yes answer and settle: losers = 1, fee = 0, alice claims 100e18 + 1, creator and treasury receive 0. Previously reproduced as test/scratch/Repro.t.sol::test_dustCounterStakeSpendsEscrowForZeroFee; lines 124 and 157 are unchanged.","severity":"info","snippet":"        if (m.yesPool == 0 || m.noPool == 0) return _void(m, id, 1);","title":"A 1 wei counter-stake turns a one-sided market's fee-free void into a 0.5 IMD oracle spend that earns no fee; the creator cannot opt out (design note, author's answer accepted)"},{"citation":"resolved","description":"Carried from the previous round (id e9768981c96a), unchanged. The brief says a verified bool answer 'agreed by a strict majority of its panel decides the market' and lists the void causes exhaustively; the code also requires panelSize >= 7. Intake accepts panelSize from 2 and open() cannot parse the body, so a creator who writes panelSize 2..6 opens a market that can never settle: resolve spends the 0.5 IMD escrow, the swarm answers, settle voids with reason 21 and the fee is not returned. The author kept the floor as the accepted fix for imported finding 57ea9cc16237 (a two-seat panel deciding a market of any size), whose proof still passes, and documents it in NatSpec, README and ADAPTATION.md. I accept that: the floor is deliberate and protective, and the only remaining gap is that the requester's brief does not mention it. Not a code defect and not a blocker; the brief, launch notes (which do state 'a panel of at least 7') and any client should carry the minimum so a creator learns it before paying.","line":194,"path":"src/SwarmMarket.sol","reproduction":"test/SwarmMarketReview.t.sol::test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles (repository test, passes). creator open(body with panelSize 6, T0+1h, T0+2h); alice stake(id,true,30e18); bob stake(id,false,60e18); resolve(id) spends 0.5 IMD; writer delivers a verified answer true with panelSize 6, quorum 6, agreed 6; settle(id). Expected per the brief's wording: Phase.Yes with a 1.2e18 fee split. Actual: Phase.Void reason 21, creator balance FUNDS - 0.5e18, treasury 0, bob claims 60e18 back. Line 194 is unchanged from the previous round.","severity":"info","snippet":"        if (a.panelSize < MIN_PANEL) return _void(m, id, 21);","title":"MIN_PANEL = 7 is a settlement floor the brief does not state: a body with panelSize 2..6 opens a market that spends the fee and always voids at settle (design note, author's answer accepted)"}],"hash":"73fe88ad02c248e55f1df5a3b7747a1ee816a7f59ccff33bc2e4188bee00fe8d","nodeId":"2e90003b-91b1-4b91-99fc-8e2c985297e8","outcome":"completed","summary":"Both reproducible findings from the previous round are fixed, and nothing blocks the SwarmMarket launch.\n\n**Settled from last round**\n\n- **Medium, settle() voided answered markets (c7f7d6ef887a): fixed.** The prior proof, run against the revised code, now passes. settle() in `src/SwarmMarket.sol` reads the registry before applying the deadline. A still-pending ask reverts until askedAt plus three days and voids after. A verified strict-majority answer with a signed issuedAt inside the window decides the market whenever settle is called. The author's three new tests cover the exact deadline, one second past it, and a registry outage, all driving the real registry with signed answers.\n- **Low, oversized body (a6554325c3be): fixed.** open() now rejects a body over 16,384 bytes. The new test checks both sides of the bound.\n- **Low, SwarmWager resolve/abandon overlap: kept as advisory.** The author's scope dispute is right. SwarmWager is live and not in the manifest, so it stays recorded for a successor and does not block.\n- **Info, 1 wei counter-stake and MIN_PANEL floor: kept as design notes.** Both match the author's answers. No code change is required.\n\n**One new informational item**\n\nThe manifest notes in `launch.json` were written before the fix and still say settlement must occur within three days and that a late settle voids the market. The code, README and ADAPTATION.md now say the opposite. Constructor arguments, kind and schema are correct, so this only needs the notes refreshed when the manifest step runs again.\n\n**Verification**\n\nThe full suite excluding scratch passes with 162 tests passed and 1 fork-only test skipped, including the solvency fuzz and both invariant suites. Coverage in `.imd-findings.json` answers all 19 entry points, with two SwarmWager rows pointing at the advisory finding and the rest holding. The scratch directory was removed and no repository file was changed.","treeHash":null,"usage":{"cachedInputTokens":684894,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":16648,"runtime":"claude","turns":16,"wallClockMs":545625}},{"artifacts":[],"attempt":1,"bundleHash":"323cec775909991f6979e16bcf792a7c6c94063ee2fe31f2e5d85fd91fd9ebfd","device":"e06554fd2816f9d7","findings":[],"hash":"816675e0be0823c87962c997fc2d05c1910083aa664b7c85c20874171489781d","nodeId":"816ec526-3ce7-4e97-be92-7c67701c2ce6","outcome":"completed","summary":"My invariant test was failing after the other contributor changed `src/SwarmMarket.sol`. I've updated the test to match the new rule, and the full suite passes again: `forge test` with the verifier's seed shows 162 passed, 0 failed and 1 skipped.\n\n**Why it broke.** The latest change to `settle` moved the 3-day answer deadline. It used to cover settling: any market not settled within 3 days of the ask voided, even if an answer had arrived. Now it covers the answer's signed issue time (`issuedAt`). An answer issued within 3 days decides the market however late `settle` is called. An answer issued after that voids the market (reason 22), and so does a request still pending after 3 days. My test still expected the old rule, so with the verifier's seed it failed with `void must refund both stakes: 127 != 31`.\n\n**What I changed in `test/SwarmMarketInvariant.t.sol`:**\n- **Random delivery times.** Delivered answers now carry one of three signed times: the delivery time, the deadline itself (for an answer delivered late), or one second after the deadline. The last is possible because the registry accepts an issue time up to 5 minutes ahead of the chain clock.\n- **The test's model of `settle`** now follows the new rule: a pending request past the deadline voids, a Yes/No issued in time decides, and one issued late voids.\n- **Two fixed cases in `test_handlerReachesAllPhasesAndUnwinds`:**\n  - A Yes delivered at the deadline but signed one second after it voids the market.\n  - A Yes issued in time and settled 10 days after the deadline still pays Yes.\n\nThe campaign ran 256 sequences of 96 calls each with no unexpected reverts. I also updated the notes in `test/SwarmMarketTesting.md`. Only those two files changed, and nothing is committed yet.\n\n**No new defect found, so no `.imd-findings.json`.** The new rule matches the brief's \"nothing within ANSWER_WINDOW\". One behaviour is a design trade-off rather than a bug: if an answer is issued in time but reaches the registry after the deadline, anyone who calls `settle` in that gap voids the market. A losing side has a reason to do that. That fits the brief's wording, so I didn't report it as a defect, but it's worth knowing before launch.\n\n**Still owed:** the live-registry test (`test/SwarmMarketLiveRegistry.t.sol`) needs a mainnet fork, so it skipped here and hasn't been run against the live contracts.","treeHash":"9895a224b11fe4d78347297916a9a424d523d398","usage":{"cachedInputTokens":726175,"inputTokens":24,"model":"claude-opus-5-5","outputTokens":8611,"runtime":"claude","turns":13,"wallClockMs":301324}},{"artifacts":[],"attempt":1,"bundleHash":"f15793178771e43644889ded1441a5c655512af8d29c3759884cdd3b81088a0b","device":"4d218e2d11a36af4","findings":[],"hash":"c9b6dc81986e8c380641cca92c179cb66ab7ed11ef4bdf56510cde7bd1d2bc09","nodeId":"da69c21a-fdde-41d3-9b82-3776e4c85ab6","outcome":"completed","summary":"Implemented the launch adaptation and documented all seven findings in [ADAPTATION.md](/home/ubuntu/.identitymd/work/4f96aab0-b721-49cd-81cd-2e1e8442d3cd/da69c21a-fdde-41d3-9b82-3776e4c85ab6/ADAPTATION.md).\n\nAdded a one-hour resolution window, seven-seat panel minimum, fee top-ups, and deterministic timeout handling. **Markets must now be settled within three days, even if an answer is already recorded.**\n\n`forge build` passed. All **151 tests passed** with the required fuzz seed, including deployment checks.\n\nRegistry source and protected configuration remain unchanged. No transaction was broadcast; deployment remains with IMD’s launch pipeline.","treeHash":"493e3d0ea579b8015a083140196f1fb8c8af27d8","usage":{"cachedInputTokens":2541696,"inputTokens":129592,"model":"gpt-6-astra","outputTokens":25620,"runtime":"codex","turns":8,"wallClockMs":600966}},{"artifacts":[],"attempt":1,"bundleHash":"58b722110370184ec88916bb3b0be1172d781619cbf562a19afbbd2f860bc399","device":"410247426ec5a6df","findings":[],"hash":"d459f2e7724de754140b340804dc0a8859ec70d585f15d8963898a15e3a3e533","nodeId":"c19fd809-86a1-48ca-8bef-18525b465b79","outcome":"completed","summary":"The existing launch.json is correct and needs no revision. No findings were attached to this round, and every check I ran agrees with the accepted source.\n\n**What I verified**\n\n- The manifest has exactly the three schema keys: kind \"evm_contracts\", one contract entry, and notes. It names only SwarmMarket, which is the sole contract to deploy.\n- The three constructor arguments match the constructor signature in `src/SwarmMarket.sol:91` in declaration order: registry, IMD token, treasury. They are the static addresses the brief states, so no $owner substitution applies. The treasury address also equals the launch owner, so there is no beneficiary conflict.\n- The constructor only stores immutables and rejects zero addresses. It makes no external call, so it survives the protected empty-chain deployment rehearsal.\n- The notes are well under the limit and accurately describe the implementation, including the details that go beyond the brief's summary: the one-hour resolve window, the seven-seat minimum panel, fee top-ups, and the odd fee unit going to treasury.\n- The fuzz suites pass with the verifier's seed.\n\n| Check | Result |\n|---|---|\n| forge build | ok |\n| SwarmMarket, Deployment and Review suites | 43 passed, 0 failed |\n| notes length | 1471 of 4000 |\n\nNo file was changed. The working tree still has launch.json as the only deliverable, and no blocked file was written.","treeHash":"72c06f018523015304902f64daa1c45ff103594d","usage":{"cachedInputTokens":185184,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":3583,"runtime":"claude","turns":10,"wallClockMs":188955}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b38bea3c04869138","findings":[{"citation":"resolved","description":"Periphery/execution-trace seam. `open` bounds the body from below only. The body is only handed to the periphery at `resolve` (line 160, `REGISTRY.askAtMost(bodyOf[id], p)`), and the live Intake v2 at 0xa43e6f75ee006411f79ac1c84120606c2330de82 (verified source, `_request`) reverts `BodyTooLong(length)` for any body over `MAX_BODY_BYTES = 16_384`. So a market whose body is 16,385 bytes or more is fully functional for `stake` and `topUpFee`, but every `resolve` within the one-hour window reverts, and the only exit is `abandon` after `resolveAfter + RESOLVE_WINDOW`. The creator's fee escrow is returned in full by `_void`, so the trap costs the creator only gas (the 16,385-byte `open` measured at about 1.57M gas), while every staker's IMD is locked from their stake until `resolveAfter + 1 hour` and the market is advertised as open and priced by `oddsYesBps`. No funds are lost; the defect is a guaranteed-dead market the contract could reject at creation for one comparison. Minimal fix: `if (body.length == 0 || body.length > 16_384 || ...) revert BadTerms();` (a constant mirroring Intake's `MAX_BODY_BYTES`). The repository's own offline Intake model (`RecordingIntake.requestWithFailure`, `BodyTooLong` at 16_384) reproduces the live behaviour.","line":99,"path":"src/SwarmMarket.sol","reproduction":"State: fresh SwarmMarket on the registry/Intake fixtures (test/helpers/RegistryTestSupport.sol). 1) creator calls open(body = new bytes(16385), closeAt = now+1h, resolveAfter = now+1h): succeeds, escrows 0.5 IMD. 2) alice stake(id, true, 10e18); bob stake(id, false, 10e18): both succeed. 3) warp to resolveAfter; anyone calls resolve(id): expected per the brief 'approves the price and calls askAtMost'; actual: reverts with Intake's BodyTooLong(16385) (RecordingIntake.BodyTooLong in the offline model, Intake._request line `if (body.length > MAX_BODY_BYTES) revert BodyTooLong(body.length);` on mainnet). Same at resolveAfter + 1h. 4) abandon(id) reverts TooEarly until resolveAfter + 1h + 1s, then voids; creator balance back to 100e18 (full escrow returned), alice claim = 10e18. Scratch test run: test/scratch/BodyTooLong.t.sol, test_oversizedBodyMarketCanNeverResolve passes on the current code, showing the sequence above.","severity":"low","snippet":"        if (body.length == 0 || closeAt <= block.timestamp || resolveAfter < closeAt) revert BadTerms();","title":"open() accepts a body longer than Intake's MAX_BODY_BYTES, creating a market that can take stakes but can never be resolved"},{"citation":"resolved","description":"Execution x first-principles. The brief says the market voids when there is 'nothing within ANSWER_WINDOW of 3 days'; the code voids any still-Asked market after the deadline even when the registry already holds a verified strict-majority bool answer delivered well inside the window. Because `settle` is permissionless and the loser is the party that gains from a void, the deadline hands the losing side a free option whenever the winning side fails to send one transaction within three days of `resolve`: the loser simply calls `settle` at `askedAt + 3 days + 1` and takes their stake back, and the creator and treasury lose the 2% fee. README/ADAPTATION document this as a deliberate settlement deadline chosen to make late-completion transaction order irrelevant, so this is a reported trade-off rather than an unknown defect; it is recorded here because the stated protocol purpose (a verified answer decides the market) is contradicted by a reachable end state with an identifiable loser. If the author wants to keep determinism for late completions while honouring timely ones, one option is to read the registry first and void after the deadline only when the record is not `Answered`+verified with `a.issuedAt <= askedAt + ANSWER_WINDOW`; the writer is already trusted for pairing, so trusting its `issuedAt` adds no new party.","line":180,"path":"src/SwarmMarket.sol","reproduction":"State: market with alice 30 IMD on Yes and bob 60 IMD on No; resolve(id) at resolveAfter -> Asked, askedAt = T. 1) The writer delivers a verified bool 'true' answer (panel 15, agreed 12) to the registry at T + 1 hour; registry.get(rid) shows status Answered, verified, answer 0x..01. 2) Nobody calls settle before T + 3 days (the winner is offline). 3) At T + 3 days + 1 second bob calls settle(id). Expected per the brief: an answer that arrived within the window decides the market, alice claims 30 + 58.8 IMD, creator and treasury get 0.6 IMD each. Actual: line 180 returns _void(m, id, 3) without reading the registry; phase = Void, alice can claim only 30 IMD, bob claims his 60 IMD back, no fee is paid. The repository's own test test_answerDeliveredEarlyStillRequiresSettlementWithinWindow (test/SwarmMarketReview.t.sol) asserts exactly this void.","severity":"low","snippet":"        if (block.timestamp > uint256(m.askedAt) + ANSWER_WINDOW) return _void(m, id, 3);","title":"settle() after askedAt + ANSWER_WINDOW voids a market whose verified answer is already on record, so a loser who waits three days recovers their stake"}],"hash":"d6b13aa0da2f49724419f9a6432d26bc6c0a2685ff39e81c8fb0fef0ee5dc9d4","nodeId":"43c57fc1-3c98-4ed9-afcb-c7f0c78e85b6","outcome":"completed","summary":"The review is complete. `.imd-findings.json` holds two low findings and a 21-row coverage record. No source, test or configuration file was changed. The only other file written is a scratch test under `test/scratch/`, which is not kept.\n\n**What I verified**\n\n- **Live periphery matches the code.** The registry at the brief's address has runtime bytecode byte-identical to the compiled `src/AskSwarmRegistry.sol` outside immutables, so the `price`, `askAtMost` and `get` ABIs the market relies on are exactly what is deployed. Its immutables are the Intake, IMD and signer the brief names.\n- **IMD is a plain token.** The verified source is an OpenZeppelin OFT ERC-20 with no transfer hooks, tax, pause or blocklist. The market's accounting assumptions hold against it.\n- **Bool answers are 32-byte words.** Two live attestations encode the answer as a full word, matching the length check in `settle`.\n- **Tests pass.** The 41 offline tests pass, and the 11 fork tests pass against the real mainnet Intake and IMD.\n- **Control flow.** `open`, `stake`, `topUpFee`, `resolve`, `abandon`, `settle` and `claim` were traced for ordering, guards, reentrancy, rounding and per-market conservation. Winners' floored shares plus the fee never exceed the pools, and the Asked phase guarantees both pools are nonzero before any division.\n\n**Findings**\n\n1. **Low. Oversized bodies open dead markets.** `open` only rejects an empty body. A body over 16,384 bytes is accepted, takes stakes on both sides, and then every `resolve` reverts with Intake's `BodyTooLong`. Stakes stay locked until `abandon`, and the creator's escrow comes back in full, so the trap costs the creator only gas. A scratch test confirms the sequence. The fix is one length check in `open`.\n2. **Low. The settlement deadline voids timely answers.** After `askedAt` plus three days, `settle` voids the market without reading the registry, even if a verified answer landed hours after the ask. The loser gains from the void and can trigger it, so an inattentive winner loses their winnings. README documents this as a deliberate trade-off. I recorded it because the brief's stated rule covers only the case where nothing arrives within the window.\n\n**Not reached or out of area**\n\nThe six SwarmWager entry points are already live and outside this launch. I read the code but did not re-audit them, and the coverage rows say so. No `launch.json` exists yet, so the manifest row records the constructor inputs checked against the chain rather than a file.","treeHash":null,"usage":{"cachedInputTokens":2169694,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":42456,"runtime":"claude","turns":46,"wallClockMs":753122}},{"artifacts":[],"attempt":1,"bundleHash":"3316c9b5e7be1b0807d70f7c1ad8c34e308543a4aa7455b6207f33d0177a0b31","device":"3f02755d8661ddf1","findings":[],"hash":"ef34e569da23cc2435ffe6ed4c23320728bc9638492855c4f53df5f649382925","nodeId":"c19fd809-86a1-48ca-8bef-18525b465b79","outcome":"completed","summary":"Created [launch.json](/home/identitymd3/.identitymd/work/4f96aab0-b721-49cd-81cd-2e1e8442d3cd/c19fd809-86a1-48ca-8bef-18525b465b79/launch.json) listing only SwarmMarket with the three approved constructor addresses.\n\nManifest structure and constructor ABI checks passed. `forge build` succeeded; `forge test --offline` passed all 151 tests with the specified fuzz seed.\n\nOnly `launch.json` is changed for submission.","treeHash":"0afe9e9b9171eabc798cf5f3f18ab1db42b91049","usage":{"cachedInputTokens":794496,"inputTokens":60279,"model":"gpt-6-astra","outputTokens":5421,"runtime":"codex","turns":5,"wallClockMs":247996}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a31e321b410aaa02","findings":[{"citation":"resolved","description":"Boundary (threshold) check. The brief says a verified bool answer 'agreed by a strict majority of its panel decides the market' and lists the void causes exhaustively (refused, split, unverified, lost, wrong type, nothing within ANSWER_WINDOW). The code adds a second threshold, panelSize >= 7, that neither the brief nor open() enforces. Intake accepts panelSize from 2 and open() cannot parse the JSON body, so a creator who writes panelSize 2..6 opens a market that can never settle: resolve() spends the 0.5 IMD fee at Intake, the swarm answers, and settle() voids with reason 21. The creator's fee is lost deterministically (no fee-free void path exists once resolve ran), every staker is refunded, and the treasury earns nothing. This is documented in the NatSpec (MIN_PANEL) but not in the brief, and the first time a creator learns of it is after paying. Decide whether the brief or the code is authoritative; if the code, the brief and any UI must state the minimum, and ideally the launch notes should say so, since the body cannot be validated on chain.","line":188,"path":"src/SwarmMarket.sol","reproduction":"Body: {\"v\":1,\"question\":\"q?\",\"chainId\":1,\"window\":{\"hours\":24},\"answerType\":\"bool\",\"evidence\":\"panel\",\"panelSize\":6,\"quorum\":4,\"validForSeconds\":86400}. creator: open(body, now+1h, now+1h) escrows 0.5 IMD. y1: stake(id,true,30e18); n1: stake(id,false,60e18). At resolveAfter anyone: resolve(id) -> Intake balance +0.5 IMD, creator balance unchanged. Writer delivers a verified answer with panelSize=6, quorum=4, agreed=6 (unanimous, registry status Answered, verified=true). settle(id): expected per brief = Phase.Yes with fee 1.2 IMD split; actual = Phase.Void, reason 21, creator's 0.5 IMD not returned, treasury 0, n1.claim()=60e18. Reproduced in test/scratch/MathProbe.t.sol::test_panelSixUnanimousVoidsAfterSpendingFee and already asserted as intended in test/SwarmMarketReview.t.sol::test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles.","severity":"low","snippet":"        if (a.panelSize < MIN_PANEL) return _void(m, id, 21);","title":"MIN_PANEL = 7 is a settlement threshold the brief does not state: a valid body with panelSize 2..6 always spends the fee and voids"},{"citation":"resolved","description":"Boundary x invariant seam. The brief's void condition is 'nothing within ANSWER_WINDOW of 3 days', i.e. no answer arrived. The deadline check runs before the registry is read, so the criterion actually enforced is 'settle() was not called within 3 days of askedAt'. A verified strict-majority answer that reached the registry minutes after resolve is ignored if the first settle() transaction lands at askedAt + 3 days + 1 s: the market voids, losers get their stakes back, winners receive no winnings, creator and treasury receive no fee. settle is permissionless so winners can protect themselves, but nothing reminds them, the losing side has every incentive to stay silent, and the registry does expose the ask's status and the attestation's issuedAt that could bound this (e.g. void only if status is still Pending/None after the window, or require a.issuedAt <= askedAt + ANSWER_WINDOW). The NatSpec states this trade-off and test_answerDeliveredEarlyStillRequiresSettlementWithinWindow asserts it, so this is a documented design choice that contradicts the brief's wording; reporting it so the author decides which text wins before launch.","line":180,"path":"src/SwarmMarket.sol","reproduction":"creator: open(BODY, now+1h, now+1h); y1: stake(id,true,30e18); n1: stake(id,false,60e18); at resolveAfter: resolve(id) (askedAt = T). Writer delivers a verified answer true, panelSize 15, quorum 11, agreed 12 at T (registry.get(rid).status == Answered). Nobody calls settle until T + 3 days + 1. settle(id): expected per brief = Phase.Yes, y1 claims 30e18 + 58.8e18; actual = Phase.Void reason 3, n1.claim()=60e18, y1.claim()=30e18, treasury 0. Reproduced in test/scratch/MathProbe.t.sol::test_answeredInTimeButSettledLateVoids.","severity":"low","snippet":"        if (block.timestamp > uint256(m.askedAt) + ANSWER_WINDOW) return _void(m, id, 3);","title":"settle() voids on wall-clock alone: an answer the registry recorded inside ANSWER_WINDOW is discarded if settle is first called after it"},{"citation":"resolved","description":"Math precision note for completeness. The fee truncates toward the winners (losing pool below 50 wei pays no fee; a 1 wei fee goes entirely to TREASURY because toCreator = fee / 2 = 0). Each winner's share y * winnersShare / winningPool rounds down independently, so up to (number of winners) wei per market remains in the contract forever; there is no sweep by design (no owner). Neither can be farmed: opening a market costs 0.5 IMD and the leak is bounded by whole wei. The solvency direction is correct: payouts never exceed the pool. No change required; recorded so the rounding direction is an explicit, accepted choice.","line":194,"path":"src/SwarmMarket.sol","reproduction":"Market A: y1 stakes 1 wei yes, n1 stakes 49 wei no, yes wins: fee = 49*200/10000 = 0, treasury +0, creator +0, y1 claims 1 + 1*49/1 = 50. Market B: y1 1 wei yes, n1 50 wei no: fee = 1, creator +0, treasury +1, y1 claims 1 + 49 = 50. Market C: y1 3, y2 4 (yesPool 7), n1 10: fee 0, winnersShare 10, y1 gets 3 + 30/7 = 7, y2 gets 4 + 40/7 = 9, 16 of the 17 wei pool paid, 1 wei locked. Max pools (2^128-1 each side) settle and claim without overflow: claim = 2*(2^128-1) - fee. All in test/scratch/MathProbe.t.sol (test_feeTruncation, test_dustLocked, test_maxPools).","severity":"info","snippet":"        uint256 fee = losers * FEE_BPS / 10_000;","title":"Fee rounds down and pro-rata floors leave dust locked with no sweep (sub-wei scale, not exploitable)"}],"hash":"f249b5146c5206886cc84623a68d3998627da345405a83215a7122fd8b4aa373","nodeId":"77f03cea-0b50-40d8-8877-f3d7875637fc","outcome":"completed","summary":"The findings file is written and validated. Git status is clean apart from the findings file and my scratch test, which is mine to leave.\n\n**Outcome: the arithmetic in SwarmMarket holds. No critical, high or medium defect in the math, boundary or numerical-gap area.** The findings file at `.imd-findings.json` carries two low findings and one informational note, plus a coverage row for all 19 entry points and one invariant.\n\n**What I verified**\n\n- Every multiplication, division and downcast in `open`, `stake`, `topUpFee`, `resolve`, `settle` and `claimable` was traced with concrete values. Pools and shares are bounded by uint128 so products stay under 2^256, the fee cannot exceed the losing pool, and the pro-rata floors never pay out more than the pool.\n- Both time windows are widened to uint256 before adding the constants, and the resolve, abandon and topUpFee boundaries are mutually exclusive at the exact second.\n- The live IMD token is a plain OpenZeppelin ERC-20 behind a LayerZero OFT with verified source. It has no fee on transfer, no hooks and no pause, and its supply is about 4.17 million tokens, so the uint128 pools and uint96 escrow cannot overflow in practice.\n- The project's 11 fork tests pass against the live Intake v2 and IMD on mainnet, and all 41 offline tests pass. My scratch probe under `test/scratch/MathProbe.t.sol` pins the exact numbers quoted in the findings.\n\n**Findings**\n\n1. **Low.** The code requires a panel of at least 7 to settle. The brief does not say so and `open` cannot read the body, so a creator who writes a valid body with panelSize 2 to 6 always loses the 0.5 IMD fee to a guaranteed void. The author should decide whether the brief or the constant is authoritative before launch.\n2. **Low.** `settle` voids on wall clock alone. A verified majority answer already on the registry is discarded if the first settle call lands after the three-day window, which contradicts the brief's wording that only a missing answer voids. It is documented in the code and tested as intended, so it is flagged as a text conflict for the author to resolve.\n3. **Info.** The fee rounds toward winners and per-winner floors leave at most a few wei locked per market. Not exploitable and no change needed.\n\n**Not covered.** Nothing in my area was left unreached. The SwarmWager and registry entry points are outside the launch and received rows noting that no math-area path touches them.","treeHash":null,"usage":{"cachedInputTokens":1452322,"inputTokens":356,"model":"claude-fable-5-1","outputTokens":32817,"runtime":"claude","turns":30,"wallClockMs":611746}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6208734cdf5317a1","findings":[{"citation":"resolved","description":"Merged from audit_math (f23e0305), audit_permissions (4238ad5c) and audit_flow (8d7f7644): same root cause, one finding. The brief voids a market only when 'nothing within ANSWER_WINDOW of 3 days' arrives and says 'a verified bool answer ... agreed by a strict majority of its panel decides the market'. settle() tests the wall clock before it reads the registry, so what is enforced is 'settle was called within 3 days of askedAt', not 'an answer arrived within 3 days'. A verified strict-majority answer stored in the registry an hour after the ask is discarded if the first settle transaction is mined at askedAt + 3 days + 1. settle is permissionless, so the losing side profits from silence: it never settles, and if no winner (or keeper) does so within three days a single loser call voids the market, every loser gets their stake back, winners forfeit 98% of the losing pool they were owed, and creator and treasury forfeit the 2% fee. SwarmWager.settle (src/SwarmWager.sol:213-216) already implements the brief's rule: it refunds on timeout only while the registry still reports Pending/None and otherwise pays the recorded answer. The registry exposes Status, so no delivery timestamp is needed; the author's earlier concern (ADAPTATION.md f59677ea2f6c) about a late completion landing before or after settle in the same block past the deadline is a one-block boundary race that every deadline has, including resolve's own window, and is far smaller than voiding a market that was answered in time. README.md:286-290, the NatSpec and the launch notes document the deadline, but the requester's brief is the specification and the code contradicts it with an identifiable party who gains. Medium: loss of winners' and creator/treasury proceeds under a specific condition (no settle call for 3 days after an in-window answer). Minimal fix preserving the design: read the registry first; after the deadline void only when k.status is Pending or None (SwarmWager's order), optionally also requiring a.issuedAt <= askedAt + ANSWER_WINDOW for a usable answer; or amend the brief if the requester accepts the settlement deadline.","line":180,"path":"src/SwarmMarket.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {AskSwarmRegistry} from \"src/AskSwarmRegistry.sol\";\nimport {IIntake, OracleAttestation} from \"src/IIntake.sol\";\nimport {SwarmMarket} from \"src/SwarmMarket.sol\";\n\n/// Minimal ERC-20 for the proof.\ncontract ProofToken {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n    }\n\n    function approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        return true;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        require(balanceOf[msg.sender] >= amount, \"bal\");\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        require(allowance[from][msg.sender] >= amount, \"allow\");\n        require(balanceOf[from] >= amount, \"bal\");\n        allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// Minimal Intake v2 model: sells oracle.request at 0.5 IMD, pulls the payment, and lets the\n/// writer complete a request once by calling the registered callback under 200k gas.\ncontract ProofIntake {\n    struct Req {\n        address payer;\n        IIntake.Callback callback;\n        bytes4 failure;\n        bool completed;\n    }\n\n    address public immutable asset;\n    address public immutable writer;\n    uint256 public nonce;\n    mapping(bytes32 => Req) internal reqs;\n\n    constructor(address token, address writer_) {\n        asset = token;\n        writer = writer_;\n    }\n\n    function priceOf(bytes32 action, address token) external view returns (uint256) {\n        return action == bytes32(\"oracle.request@oracle-1\") && token == asset ? 0.5 ether : 0;\n    }\n\n    function requestWithFailure(\n        bytes32,\n        bytes calldata,\n        IIntake.Callback calldata callback,\n        bytes4 onFailure,\n        address token,\n        uint256 amount\n    ) external payable returns (bytes32 id) {\n        require(token == asset && amount == 0.5 ether, \"price\");\n        id = keccak256(abi.encode(address(this), ++nonce));\n        reqs[id] = Req(msg.sender, callback, onFailure, false);\n        require(ProofToken(token).transferFrom(msg.sender, address(this), amount), \"pull\");\n    }\n\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) {\n        Req storage r = reqs[id];\n        return (r.payer, r.callback.target, r.callback.selector, r.completed);\n    }\n\n    function complete(bytes32 id, bytes calldata args) external returns (bool ok) {\n        require(msg.sender == writer, \"writer\");\n        Req storage r = reqs[id];\n        require(!r.completed, \"done\");\n        r.completed = true;\n        (ok,) = r.callback.target.call{gas: 200_000}(abi.encodePacked(r.callback.selector, args));\n    }\n}\n\n/// Finding: SwarmMarket.settle voids a market whose verified strict-majority answer reached the\n/// registry inside ANSWER_WINDOW, if the first settle call lands after askedAt + ANSWER_WINDOW.\n/// The brief voids only when \"nothing within ANSWER_WINDOW of 3 days\" arrived.\ncontract SettleDeadlineProof is Test {\n    uint256 internal constant KEY = 0xA11CE;\n    ProofToken internal token;\n    ProofIntake internal intake;\n    AskSwarmRegistry internal registry;\n    SwarmMarket internal market;\n    address internal writer = makeAddr(\"writer\");\n    address internal creator = makeAddr(\"creator\");\n    address internal treasury = makeAddr(\"treasury\");\n    address internal alice = makeAddr(\"alice\");\n    address internal bob = makeAddr(\"bob\");\n\n    function setUp() public {\n        vm.chainId(1);\n        vm.warp(1_800_000_000);\n        token = new ProofToken();\n        intake = new ProofIntake(address(token), writer);\n        registry = new AskSwarmRegistry(address(intake), address(token), vm.addr(KEY));\n        market = new SwarmMarket(address(registry), address(token), treasury);\n        _fund(creator);\n        _fund(alice);\n        _fund(bob);\n    }\n\n    function _fund(address who) internal {\n        token.mint(who, 1000 ether);\n        vm.prank(who);\n        token.approve(address(market), type(uint256).max);\n    }\n\n    function _deliverYes(bytes32 rid) internal {\n        uint64 ts = uint64(vm.getBlockTimestamp());\n        OracleAttestation memory a = OracleAttestation({\n            requestId: keccak256(abi.encode(\"uuid\", rid)),\n            chainId: 1,\n            questionHash: keccak256(\"q\"),\n            answerType: 0,\n            answer: abi.encode(true),\n            figure: 0,\n            fromBlock: 100,\n            toBlock: 200,\n            blockHash: keccak256(\"b\"),\n            panelJobId: keccak256(\"job\"),\n            panelSize: 15,\n            quorum: 11,\n            agreed: 12,\n            issuedAt: ts,\n            expiresAt: ts + 30 days\n        });\n        (uint8 v, bytes32 r, bytes32 s) = vm.sign(KEY, registry.digest(a));\n        bytes memory sig = abi.encodePacked(r, s, v);\n        vm.prank(writer);\n        assertTrue(intake.complete(rid, abi.encode(rid, a, sig)), \"delivery failed\");\n    }\n\n    function test_answerDeliveredInsideWindowDecidesMarketWhenSettledAfterDeadline() public {\n        uint64 now_ = uint64(vm.getBlockTimestamp());\n        vm.prank(creator);\n        uint256 id = market.open(\"opaque body\", now_ + 1 hours, now_ + 1 hours);\n        vm.prank(alice);\n        market.stake(id, true, 30 ether);\n        vm.prank(bob);\n        market.stake(id, false, 60 ether);\n\n        vm.warp(now_ + 1 hours);\n        market.resolve(id);\n        (SwarmMarket.Market memory m,) = market.get(id);\n        uint256 askedAt = m.askedAt;\n\n        // The swarm answers Yes one hour after the ask: well inside ANSWER_WINDOW.\n        vm.warp(askedAt + 1 hours);\n        _deliverYes(m.requestId);\n        (AskSwarmRegistry.Ask memory k, AskSwarmRegistry.Answer memory a) = registry.get(m.requestId);\n        assertEq(uint8(k.status), uint8(AskSwarmRegistry.Status.Answered));\n        assertTrue(a.verified);\n\n        // Nobody settles for three days. The loser then calls settle one second past the deadline.\n        vm.warp(askedAt + market.ANSWER_WINDOW() + 1);\n        vm.prank(bob);\n        market.settle(id);\n\n        // Expected per the brief: the verified answer that arrived within the window decides the market.\n        (m,) = market.get(id);\n        assertEq(uint8(m.phase), uint8(SwarmMarket.Phase.Yes), \"answered-in-window market voided\");\n        assertEq(market.claimable(id, alice), 30 ether + 58.8 ether);\n        assertEq(market.claimable(id, bob), 0);\n        assertEq(token.balanceOf(treasury), 0.6 ether);\n    }\n}","reproduction":"Offline, real AskSwarmRegistry with a mock Intake and a fixture signer (test/scratch/SettleDeadlineProof.t.sol). creator open(body, T0+1h, T0+1h) escrows 0.5 IMD; alice stake(id,true,30e18); bob stake(id,false,60e18); warp T0+1h; resolve(id) -> Phase.Asked, askedAt = T. Writer completes the request at T+1h with a signed bool answer true, panelSize 15, quorum 11, agreed 12: registry.get(requestId) reports status Answered, verified true. Nobody calls settle. At T + 3 days + 1 bob calls settle(id). Expected per the brief: Phase.Yes, claimable(id, alice) = 30e18 + 58.8e18 = 88.8e18, claimable(id, bob) = 0, treasury +0.6e18, creator +0.6e18. Actual: line 180 returns _void(m, id, 3) without reading the registry: Phase.Void (5), claimable(id, alice) = 30e18, claimable(id, bob) = 60e18, no fee paid. forge test --match-path test/scratch/SettleDeadlineProof.t.sol fails with 'answered-in-window market voided: 5 != 3'. The repository's own test_answerDeliveredEarlyStillRequiresSettlementWithinWindow (test/SwarmMarketReview.t.sol:393) asserts the same void.","severity":"medium","snippet":"        if (block.timestamp > uint256(m.askedAt) + ANSWER_WINDOW) return _void(m, id, 3);","title":"settle() voids a market whose verified answer reached the registry inside ANSWER_WINDOW if the first settle call lands after askedAt + 3 days; the loser can convert a lost position into a refund"},{"citation":"resolved","description":"From audit_flow (0f1a9adb), reproduced. open() bounds the body from below only. The body is first handed to Intake at resolve (line 160, REGISTRY.askAtMost(bodyOf[id], p)), and Intake v2 refuses any body over MAX_BODY_BYTES = 16_384 (the oracle-consumer reference: 'At most 16 KiB of body'; the repository's RecordingIntake models the same revert). A market opened with a 16,385-byte body therefore accepts stake and topUpFee normally, is advertised through Opened and oddsYesBps, and every resolve inside the one-hour window reverts; the only exit is abandon after resolveAfter + RESOLVE_WINDOW, which voids and returns the escrow. No funds are lost: the creator loses only gas and every staker gets their stake back, but stakers' IMD is locked from their stake until resolveAfter + 1 hour + 1 second in a market that could never pay out, which the contract could reject at creation with one comparison. Minimal fix: a MAX_BODY_BYTES = 16_384 constant checked in open().","line":99,"path":"src/SwarmMarket.sol","reproduction":"test/scratch/Repro.t.sol::test_oversizedBodyMarketCannotResolveUntilAbandon (passes on the current code, confirming the behaviour). creator open(new bytes(16385), T0+1h, T0+1h) succeeds and escrows 0.5 IMD; alice stake(id,true,10e18) and bob stake(id,false,10e18) succeed. At T0+1h and at T0+2h resolve(id) reverts BodyTooLong() from the Intake model (the live Intake's _request reverts BodyTooLong(length)). Expected per the brief: resolve 'approves exactly the registry's current price, calls askAtMost'. Actual: revert on every attempt; abandon(id) reverts TooEarly until T0+2h+1, then voids, creator balance back to 100e18, claimable(id, alice) = 10e18.","severity":"low","snippet":"        if (body.length == 0 || closeAt <= block.timestamp || resolveAfter < closeAt) revert BadTerms();","title":"open() accepts a body longer than Intake's 16 KiB cap, creating a market that takes stakes but can never be resolved; stakes stay locked until abandon"},{"citation":"resolved","description":"From audit_permissions (ceb79898), reproduced. SwarmWager.resolve (lines 175-190) only requires block.timestamp >= resolveAfter; abandon opens strictly after resolveAfter + ANSWER_WINDOW. From that second on both are legal on the same Matched wager: abandon's NatSpec says it is for a wager that is 'never resolvable (e.g. the swarm's price rose above the escrow)' but the function does not check that condition. The party expecting to lose holds a free option to abandon instead of letting the counterparty resolve, and a mempool race decides pot versus refund. This is the same defect class the earlier round fixed in SwarmMarket (ADAPTATION.md 2c68e2c29ddc, disjoint resolve/abandon windows). Bounded: the counterparty had three days to resolve first and abandon returns both stakes rather than misdirecting them. SwarmWager is already deployed and is not part of this launch's manifest, so this is recorded for a successor, not as a blocker for deploying SwarmMarket.","line":197,"path":"src/SwarmWager.sol","reproduction":"test/scratch/Repro.t.sol::test_wagerAbandonAndResolveBothLegalAfterWindow (passes on the current code, confirming the behaviour). creator create(body, true, 10e18, T0+1h, T0+1h); bob join(id) -> Matched. warp T0+1h+3 days+1. Snapshot A: resolve(id) succeeds, state Asked, the registry is asked. Snapshot B at the same timestamp: bob abandon(id) succeeds, state Refunded, bob's balance back to 100e18, creator's stake and fee returned. Expected per abandon's documentation: abandon impossible while resolve is legal and the escrow covers the price.","severity":"low","snippet":"        if (block.timestamp <= uint256(w.resolveAfter) + ANSWER_WINDOW) revert TooEarly();","title":"SwarmWager: resolve has no upper time bound, so after resolveAfter + 3 days a Matched wager can be either asked or abandoned by whoever lands first (already-live contract, not deployed by this launch)"},{"citation":"resolved","description":"Merged from audit_permissions (8deea1e9) and audit_economics (407cebfb): same mechanism, one note. The emptiness test is a strict zero check and stake has no minimum (line 119 rejects only 0), so any address can stake 1 wei on the empty side before closeAt. resolve then approves and spends the creator's whole escrow (0.5 IMD at today's price) on an ask whose losing pool is at most 1 wei, so fee = 1 * 200 / 10_000 = 0 and neither creator nor treasury earns anything; the swarm's answer also lands in the public registry at the creator's expense. The code matches the brief exactly ('if a side is empty the market goes void without spending the fee'), the creator accepted spending the escrow on any two-sided market, and a 1 wei bettor is indistinguishable from a real one, so this is a design note rather than a defect. Options if the author wants to close it: a minimum stake per side, or treating a side as empty when the fee it could pay cannot cover the escrow. Both are scope decisions.","line":152,"path":"src/SwarmMarket.sol","reproduction":"test/scratch/Repro.t.sol::test_dustCounterStakeSpendsEscrowForZeroFee (passes on the current code). creator open(body, T0+1h, T0+1h) escrows 0.5e18; alice stake(id,true,100e18); bob stake(id,false,1); warp T0+1h; resolve(id). If the market were treated as one-sided: Phase.Void reason 1 and creator balance back to 100e18. Actual: Phase.Asked, creator balance 99.5e18, Intake recipient +0.5e18. After a Yes answer and settle: losers = 1, fee = 0, alice claims 100e18 + 1, creator and treasury receive 0.","severity":"info","snippet":"        if (m.yesPool == 0 || m.noPool == 0) return _void(m, id, 1);","title":"A 1 wei counter-stake turns a one-sided market's fee-free void into a 0.5 IMD oracle spend that earns no fee; the creator cannot opt out"},{"citation":"resolved","description":"From audit_math (76adb248), reproduced. The brief says a verified bool answer 'agreed by a strict majority of its panel decides the market' and lists the void causes exhaustively; the code adds panelSize >= 7, introduced by the earlier review round (ADAPTATION.md 57ea9cc16237, two-seat panel). Intake accepts panelSize from 2 and open() cannot parse the body, so a creator who writes panelSize 2..6 opens a market that can never settle: resolve spends the 0.5 IMD escrow, the swarm answers, settle voids with reason 21, the fee is not returned. The floor is deliberate and documented in NatSpec, README and the launch notes, and the repository asserts it in test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles; the only gap is between the requester's brief and the code. Either the brief and any client should state the minimum panel, or the floor should be removed if the requester did not want it. Not a code defect; recorded so the two texts are reconciled before launch.","line":188,"path":"src/SwarmMarket.sol","reproduction":"test/SwarmMarketReview.t.sol::test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles (repository test, passes). creator open(body with panelSize 6, T0+1h, T0+2h); alice stake(id,true,30e18); bob stake(id,false,60e18); resolve(id) spends 0.5 IMD; writer delivers a verified answer true with panelSize 6, quorum 6, agreed 6; settle(id). Expected per the brief: Phase.Yes with a 1.2e18 fee split. Actual: Phase.Void reason 21, creator balance FUNDS - 0.5e18, treasury 0, bob claims 60e18 back.","severity":"info","snippet":"        if (a.panelSize < MIN_PANEL) return _void(m, id, 21);","title":"MIN_PANEL = 7 is a settlement floor the brief does not state: a body with panelSize 2..6 opens a market that spends the fee and always voids at settle"}],"hash":"f87022b98c7204c675d850b9932e2bd2a770759cad9c0b87159175cd2b696e5e","nodeId":"2e90003b-91b1-4b91-99fc-8e2c985297e8","outcome":"completed","summary":"Review complete. The findings file is written and every cited snippet matches the tree.\n\n**Outcome:** `.imd-findings.json` holds 5 findings and 21 coverage rows covering all 19 entry points plus two invariants. The full project suite passes (160 tests, one fork suite skipped offline).\n\n**Findings kept, after reproduction and merging:**\n\n1. **Medium, settle deadline voids an answered market** (`src/SwarmMarket.sol:180`). Three specialists reported this; merged into one. The clock is tested before the registry is read, so a verified in-window answer is discarded if the first settle call lands after 3 days, and a loser can call settle to recover their stake while winners, creator and treasury lose their proceeds. The brief voids only when nothing arrives within the window. I raised it to medium as a broken guarantee with an identifiable beneficiary, and attached a self-contained proof in `test/scratch/SettleDeadlineProof.t.sol` that fails on the current code (phase Void instead of Yes).\n2. **Low, open() has no body upper bound** (`src/SwarmMarket.sol:99`). A body over 16 KiB opens a market that takes stakes but whose resolve always reverts at Intake, locking stakes until abandon. Reproduced in a scratch test.\n3. **Low, SwarmWager resolve/abandon overlap** (`src/SwarmWager.sol:197`). Both are legal after resolveAfter + 3 days. Reproduced with snapshots. Noted as an already-live contract outside this launch.\n4. **Info, 1 wei counter-stake forces the oracle spend** (`src/SwarmMarket.sol:152`). Two specialists merged. The code matches the brief exactly, so recorded as a design note.\n5. **Info, MIN_PANEL = 7 is not in the brief** (`src/SwarmMarket.sol:188`). A deliberate floor from the earlier round. The brief and code need reconciling, not a code defect.\n\n**Dropped:** the rounding dust note, which is sub-wei, not farmable and not a defect. It is recorded in the claim coverage row instead.\n\n**My own pass** found nothing further: access paths, effects-before-interactions, exact allowance consumption, uint128/uint96 arithmetic, disjoint stake/resolve/abandon windows, claim-once, the manifest (schema keys, three static addresses in order, notes under 4,000 characters) and the constructor all hold.","treeHash":null,"usage":{"cachedInputTokens":1062360,"inputTokens":294,"model":"claude-fable-5-1","outputTokens":25418,"runtime":"claude","turns":20,"wallClockMs":507497}}],"verification":[{"checks":[{"durationMs":118578,"exitCode":0,"name":"build","output":"Compiling 39 files with Solc 0.8.26\nSolc 0.8.26 finished in 118.39s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n   --> test/AskSwarmRegistry.t.sol:613:5:\n    |\n613 |     function _delivered() internal returns (bool d) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":24444,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2252362)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.12ms (6.25ms CPU time)\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 416566)\n[PASS] test_acceptsTheProtocolSignatureAsDelivered() (gas: 429075)\n[PASS] test_callbackSelectorIsCanonical() (gas: 691)\n[PASS] test_digestMatchesTheProtocol() (gas: 10377)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 12.80ms (1.24ms CPU time)\n\nRan 11 tests for test/AskSwarmRegistryReview.t.sol:AskSwarmRegistryReviewTest\n[PASS] test_askAtMostRefusesAPriceAboveTheCeiling() (gas: 764549)\n[PASS] test_askWithoutCeilingStillPaysTheLivePrice() (gas: 363602)\n[PASS] test_deliveryEmitsIndexedOnlyWhenTheIndexMoves() (gas: 831136)\n[PASS] test_markLostAfterAFailureCompletionWithEmptyArguments() (gas: 413455)\n[PASS] test_markLostSettlesAnAskIntakeCompletedWithoutDelivering() (gas: 1024141)\n[PASS] test_reindexFallsBackToAValidAnswerAfterTheHeldOneExpires() (gas: 1047052)\n[PASS] test_reindexRefusesEveryIneligibleRecord() (gas: 2185211)\n[PASS] test_reindexReplacesAFallbackOnlyByStrictDominance() (gas: 1703927)\n[PASS] test_shortLivedEqualAnswerCannotCutHeldValidityShort() (gas: 1618364)\n[PASS] test_staleOrShorterLivedEqualAnswerDoesNotDisplaceOnDelivery() (gas: 3309315)\n[PASS] test_statusCodesAreAppendedNotRenumbered() (gas: 580)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 176.53ms (26.77ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 427706, ~: 425782)\n[PASS] test_answerDeliveredWithinStipendAndVerified() (gas: 480527)\n[PASS] test_askAtMostAgainstTheQuotedPrice() (gas: 307456)\n[PASS] test_askPullsPriceAndRegisters() (gas: 289885)\n[PASS] test_badSignatureStoredUnverifiedAndNotIndexed() (gas: 433697)\n[PASS] test_callbackGasMargin() (gas: 730555)\nLogs:\n  onOracleResult gas, bytes32 answer: 148282\n  onOracleResult gas, 352-byte answer: 135951\n\n[PASS] test_constructorMakesNoCallsAndAskLeavesNoAllowance() (gas: 2566003)\n[PASS] test_digestMatchesPlaneSignature() (gas: 15161)\n[PASS] test_domainIsTheCallbackContract() (gas: 398151)\n[PASS] test_expiredAtDeliveryAndAnswerBoundaries() (gas: 2957963)\n[PASS] test_expiryBoundaryAtDelivery() (gas: 449389)\n[PASS] test_failureHookStatusesAndUnknownIds() (gas: 384242)\n[PASS] test_failureRecorded() (gas: 316821)\n[PASS] test_indexRespectsValidityWindowAndReindexRecovers() (gas: 1493990)\n[PASS] test_largeAnswerStillWithinStipend() (gas: 516572)\n[PASS] test_markLostReadsIntakeCompletionRecord() (gas: 801557)\n[PASS] test_minorityAnswerNotIndexedEvenWhenNothingHeld() (gas: 779775)\n[PASS] test_minorityOfLargePanelCannotDisplaceSupermajority() (gas: 1155889)\n[PASS] test_onlyIntakeCanDeliver() (gas: 301915)\n[PASS] test_quorumAndExpiryGateVerified() (gas: 393137)\n[PASS] test_settledAskRefusesRedeliveryThroughAnotherOpenAsk() (gas: 789628)\n[PASS] test_signatureEdges() (gas: 1310064)\n[PASS] test_weakPanelCannotOverwriteStrongAnswer() (gas: 1129046)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 252.05ms (279.14ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1218928, ~: 1172752)\n[PASS] test_abandon() (gas: 747027)\n[PASS] test_bothSidesSameUser() (gas: 1183495)\n[PASS] test_guards() (gas: 436676)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2143538)\n[PASS] test_noWins() (gas: 1210602)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520227)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1022911)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112562)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281572)\n[PASS] test_yesWinsProRataWithFee() (gas: 1366912)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 277.87ms (284.90ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 526290)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 431452)\n[PASS] test_badTerms() (gas: 117627)\n[PASS] test_cancelUnmatched() (gas: 468687)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385779)\n[PASS] test_minorityAnswerRefunds() (gas: 946126)\n[PASS] test_noWins() (gas: 974111)\n[PASS] test_nonBoolAnswerRefunds() (gas: 972179)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 972566)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786180)\n[PASS] test_refusedRefunds() (gas: 842355)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 730865)\n[PASS] test_settleOnlyOnce() (gas: 1004190)\n[PASS] test_splitPanelRefunds() (gas: 859308)\n[PASS] test_yesWins() (gas: 1037928)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 351.94ms (10.10ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 209703, ~: 198903)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 567965, ~: 574322)\n[PASS] test_askDoesNotSpendPreexistingDonation() (gas: 399320)\n[PASS] test_constructorRejectsEveryZeroDependency() (gas: 7544)\n[PASS] test_donationCannotSubsidizeAnUnfundedAsk() (gas: 154696)\n[PASS] test_fullCallerBalanceAndMaximumBody() (gas: 2954509)\n[PASS] test_insufficientBalanceRollsBackConsumedAllowance() (gas: 192998)\n[PASS] test_intakeBodyBoundsRollBackThePayment() (gas: 434697)\n[PASS] test_noApprovalAndOneWeiShortApprovalBothRevert() (gas: 323043)\n[PASS] test_noReturnTokenIsSupportedOnTransferAndApproval() (gas: 394401)\n[PASS] test_notSoldDoesNotChargeOrRegister() (gas: 143386)\n[PASS] test_oneWeiPrice() (gas: 384542)\n[PASS] test_plainEthAndPayableAskAreRejectedWithoutTakingFunds() (gas: 145470)\n[PASS] test_priceChangesAreReadOnEveryAsk() (gas: 561725)\n[PASS] test_priceIncreaseBeyondApprovalCannotChargeOldQuote() (gas: 187170)\n[PASS] test_priceLookupFailureDoesNotChargeOrRegister() (gas: 163271)\n[PASS] test_rejectionAfterIntakePullRollsBackRecipientPayment() (gas: 343199)\n[PASS] test_rejectionBeforeIntakePullRollsBackCallerPayment() (gas: 227757)\n[PASS] test_tokenRejectsOnlyIntakePullAndEntireAskRollsBack() (gas: 317064)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 351.92ms (685.72ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 836789, ~: 692578)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504958, ~: 493687)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 517539, ~: 523377)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 505638, ~: 517466)\n[PASS] test_bothFailureStatusesPreserveFeeAndEmitReasonAndCounts() (gas: 1041103)\n[PASS] test_bothHooksRefuseEverySettledStatus() (gas: 2315241)\n[PASS] test_bothPanelSizeAndAgreementMustBeAtLeastAsStrong() (gas: 1886869)\n[PASS] test_eachOfTheFifteenFieldsIsBoundByTheSignature() (gas: 5586715)\n[PASS] test_falseIsAVerifiedAnswerAndNotAFailure() (gas: 504554)\n[PASS] test_firstByteOverCapIsUnverifiedAndDoesNotDisplaceHeldAnswer() (gas: 800971)\n[PASS] test_intakeAndOracleRequestIdsMayDiffer() (gas: 524108)\n[PASS] test_invalidVAndZeroRecoveryAreRejected() (gas: 2238504)\n[PASS] test_issuedAtToleranceBoundary() (gas: 1279965)\n[PASS] test_maximumAcceptedAnswerFitsColdCallbackStipend() (gas: 1152530)\n[PASS] test_nonzeroAbiPaddingCannotLeakIntoShortAnswer() (gas: 509578)\n[PASS] test_recordsWithoutAStoredAnswerReportZeroAnswerHash() (gas: 1858663)\n[PASS] test_registeredCallbackWithForeignRequestIdCannotCreateAnAsk() (gas: 93390)\n[PASS] test_settledAskIsNotRewrittenByAnotherRequestsCompletion() (gas: 1119030)\n[PASS] test_signatureForAnotherConsumerIsNotReusable() (gas: 500205)\n[PASS] test_thirdPartyCannotCompleteOrCallEitherHook() (gas: 448513)\n[PASS] test_timeAndMinimumFiltersDoNotDeleteHistoricalRecord() (gas: 604618)\n[PASS] test_transportWillNotRetrySuccessOrFailure() (gas: 867496)\n[PASS] test_unknownReadsDoNotLookAnswered() (gas: 48342)\n[PASS] test_weakerMajorityCanReplaceOnlyAfterHeldAnswerExpires() (gas: 1216157)\n[PASS] test_wrongDomainChainNameAndVersionAreRejected() (gas: 1164726)\n[PASS] test_wrongSignerCannotReplaceHeldAnswer() (gas: 852582)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 352.54ms (1.03s CPU time)\n\nRan 30 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2079764, ~: 2073850)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 620610, ~: 522213)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 548700)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1159810)\n[PASS] test_answerDeliveredInWindowSettlesAfterDeadline() (gas: 1123344)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1248417)\n[PASS] test_issuedAtBoundsTheAnswerWindow() (gas: 1920980)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1380268)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2704831)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 553935)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1291661)\n[PASS] test_openRejectsBodyLongerThanIntakeAccepts() (gas: 8124689)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 920755)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1132778)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 840904)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 502762)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 573599)\n[PASS] test_settleNeedsRegistryRecordThenVoidsPendingAfterDeadline() (gas: 918696)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1898027)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2424792)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 481039)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 534901)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1200576)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 561179)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 863872)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 762214)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1199376)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1285686)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1055026)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3610470)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 352.60ms (513.46ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1000089, ~: 942947)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839239, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 500044, ~: 497893)\n[PASS] test_callbackGasAtTheStipendBoundary() (gas: 1848958)\nLogs:\n  onOracleResult gas, one-word answer, cold: 118568\n  onOracleResult gas, 4096-byte answer, cold: 156201\n\n[PASS] test_contractAskerIsRecordedNotTxOrigin() (gas: 639024)\n[PASS] test_highSTwinIsUnverifiedWhileZeroOneVAreNormalised() (gas: 857211)\n[PASS] test_identicalBodiesAreDistinctPaidAsks() (gas: 524043)\n[PASS] test_maximumAnswerDisplacingAHeldAnswerFitsColdStipend() (gas: 1592155)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 352.99ms (1.04s CPU time)\n\nRan 2 tests for test/AskSwarmRegistryIndexInvariant.t.sol:AskSwarmRegistryIndexInvariantTest\n[PASS]\nAskSwarmRegistryIndexInvariantTest invariants:\n[PASS] invariant_everyAskIsPendingOrSettledOnce\n[PASS] invariant_indexOnlyHoldsVerifiedMajoritiesOfTheirOwnQuestion\n[PASS] invariant_registryHoldsNothingAndForwardsEveryFee\n AskSwarmRegistryIndexInvariantTest invariants (runs: 192, calls: 12288, reverts: 0)\n\n╭------------------------+------------+-------+---------+----------╮\n| Contract               | Selector   | Calls | Reverts | Discards |\n+==================================================================+\n| IndexTransitionHandler | ask        | 1440  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1295  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1393  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1343  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1394  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1281  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1427  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1315  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1400  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 14.14s (14.16s CPU time)\n\nRan 1 test for test/AskSwarmRegistryInvariant.t.sol:AskSwarmRegistryInvariantTest\n[PASS]\nAskSwarmRegistryInvariantTest invariants:\n[PASS] invariant_paymentsAreConservedAndNoFeeIsRetained\n[PASS] invariant_requestsAndCanonicalAnswersStayConsistent\n AskSwarmRegistryInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------------------+-------+---------+----------╮\n| Contract                | Selector                        | Calls | Reverts | Discards |\n+========================================================================================+\n| RegistrySequenceHandler | advanceTime                     | 2174  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2291  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2239  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2253  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2313  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2208  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2230  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2307  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2237  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 24.23s (24.21s CPU time)\n\nRan 12 test suites in 24.23s (40.85s CPU time): 153 tests passed, 0 failed, 0 skipped (153 total tests)\n","passed":true},{"durationMs":400,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AskSwarmRegistry.ask(bytes)\",\"AskSwarmRegistry.askAtMost(bytes,uint256)\",\"AskSwarmRegistry.markLost(bytes32)\",\"AskSwarmRegistry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"AskSwarmRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"AskSwarmRegistry.reindex(bytes32)\",\"SwarmMarket.abandon(uint256)\",\"SwarmMarket.claim(uint256)\",\"SwarmMarket.open(bytes,uint64,uint64)\",\"SwarmMarket.resolve(uint256)\",\"SwarmMarket.settle(uint256)\",\"SwarmMarket.stake(uint256,bool,uint128)\",\"SwarmMarket.topUpFee(uint256,uint96)\",\"SwarmWager.abandon(uint256)\",\"SwarmWager.cancel(uint256)\",\"SwarmWager.create(bytes,bool,uint96,uint64,uint64)\",\"SwarmWager.join(uint256)\",\"SwarmWager.resolve(uint256)\",\"SwarmWager.settle(uint256)\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":9,\"ADAPTATION.md\":211,\"README.md\":326,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":458,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":15,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":11630,\"docs/askswarm.png\":1383,\"docs/brand/.gitignore\":1,\"docs/brand/Battlefin-Black.otf\":864,\"docs/brand/NB_International_Bold_Webfont.ttf\":2797,\"docs/brand/NB_International_Mono_Webfont.ttf\":2749,\"docs/brand/NB_International_Regular_Webfont.ttf\":2728,\"docs/brand/ai.svg\":6,\"docs/brand/data.svg\":5,\"docs/brand/demo.html\":161,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":121,\"docs/brand/lock.svg\":3,\"docs/brand/logo-symbol-light.svg\":4,\"docs/brand/logo-symbol.svg\":4,\"docs/brand/logo-wordmark-dark.svg\":12,\"docs/brand/logo-wordmark-light.svg\":12,\"docs/brand/message.svg\":3,\"docs/brand/miniapp.html\":22,\"docs/brand/star5.svg\":3,\"docs/brand/voiceover.tsv\":7,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":11,\"docs/vids/askswarm-demo-silent.mp4\":9487,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7161,\"docs/vids/scene6.mp4\":331,\"docs/vids/scene7.mp4\":178,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":28,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/telegram.ts\":24,\"functions/wagers.ts\":60,\"lib/answers.json\":1,\"lib/bot.ts\":281,\"lib/hfsync.ts\":49,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":31,\"packages/cpay/src/index.ts\":481,\"packages/imd/src/index.ts\":235,\"packages/imd/src/intake.ts\":133,\"public/ai.svg\":6,\"public/answers.html\":83,\"public/apple-touch-icon.png\":53,\"public/data.svg\":5,\"public/favicon-32.png\":8,\"public/favicon.svg\":7,\"public/fonts/Battlefin-Black.otf\":864,\"public/fonts/NB_International_Bold_Webfont.ttf\":2797,\"public/fonts/NB_International_Mono_Webfont.ttf\":2749,\"public/fonts/NB_International_Regular_Webfont.ttf\":2728,\"public/imd.html\":107,\"public/index.html\":172,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/message.svg\":3,\"public/og.png\":1364,\"public/pay.html\":40,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":175,\"script/Deploy.s.sol\":23,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/launch.ts\":65,\"scripts/spike-sepolia.ts\":50,\"scripts/spike.ts\":58,\"scripts/train-risk.ts\":41,\"scripts/vercel-env.sh\":13,\"src/AskSwarmRegistry.sol\":493,\"src/IIntake.sol\":55,\"src/SwarmMarket.sol\":270,\"src/SwarmWager.sol\":263,\"test/AskSwarmRegistry.t.sol\":643,\"test/AskSwarmRegistryAdversarial.t.sol\":269,\"test/AskSwarmRegistryCallbacks.t.sol\":610,\"test/AskSwarmRegistryIndexInvariant.t.sol\":396,\"test/AskSwarmRegistryInvariant.t.sol\":488,\"test/AskSwarmRegistryPayments.t.sol\":261,\"test/AskSwarmRegistryReview.t.sol\":319,\"test/OracleConsumerConformance.t.sol\":104,\"test/SwarmMarket.t.sol\":285,\"test/SwarmMarketDeployment.t.sol\":73,\"test/SwarmMarketReview.t.sol\":612,\"test/SwarmWager.t.sol\":267,\"test/TESTING.md\":83,\"test/helpers/RegistryTestSupport.sol\":289,\"test/mocks/IntakeMocks.sol\":100,\"tsconfig.json\":8,\"vercel.json\":11},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":5736,"exitCode":0,"name":"slither","output":"[medium/medium] reentrancy-no-eth at src/SwarmMarket.sol:152: Reentrancy in SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#152-168):\n[medium/medium] reentrancy-no-eth at src/SwarmWager.sol:175: Reentrancy in SwarmWager.resolve(uint256) (src/SwarmWager.sol#175-190):\n[medium/medium] unused-return at src/AskSwarmRegistry.sol:322: AskSwarmRegistry.markLost(bytes32) (src/AskSwarmRegistry.sol#322-330) ignores return value by (None,None,None,completed) = INTAKE.requests(requestId) (src/AskSwarmRegistry.sol#326)\n[low/medium] reentrancy-benign at src/AskSwarmRegistry.sol:203: Reentrancy in AskSwarmRegistry._ask(bytes,uint256) (src/AskSwarmRegistry.sol#203-216):\n[low/medium] reentrancy-events at src/SwarmWager.sol:208: Reentrancy in SwarmWager.settle(uint256) (src/SwarmWager.sol#208-230):\n[low/medium] reentrancy-events at src/SwarmWager.sol:194: Reentrancy in SwarmWager.abandon(uint256) (src/SwarmWager.sol#194-203):\n[low/medium] reentrancy-events at src/SwarmWager.sol:163: Reentrancy in SwarmWager.cancel(uint256) (src/SwarmWager.sol#163-170):\n[low/medium] reentrancy-events at src/SwarmWager.sol:240: Reentrancy in SwarmWager._refund(SwarmWager.Wager,uint256,uint8) (src/SwarmWager.sol#240-245):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:182: Reentrancy in SwarmMarket.settle(uint256) (src/SwarmMarket.sol#182-208):\n[low/medium] reentrancy-events at src/SwarmWager.sol:175: Reentrancy in SwarmWager.resolve(uint256) (src/SwarmWager.sol#175-190):\n[low/medium] reentrancy-events at src/AskSwarmRegistry.sol:203: Reentrancy in AskSwarmRegistry._ask(bytes,uint256) (src/AskSwarmRegistry.sol#203-216):\n[low/medium] reentrancy-events at src/SwarmWager.sol:123: Reentrancy in SwarmWager.create(bytes,bool,uint96,uint64,uint64) (src/SwarmWager.sol#123-147):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:246: Reentrancy in SwarmMarket._void(SwarmMarket.Market,uint256,uint8) (src/SwarmMarket.sol#246-252):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:152: Reentrancy in SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#152-168):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:101: Reentrancy in SwarmMarket.open(bytes,uint64,uint64) (src/SwarmMarket.sol#101-117):\n[low/medium] reentrancy-events at src/SwarmWager.sol:150: Reentrancy in SwarmWager.join(uint256) (src/SwarmWager.sol#150-160):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:212: Reentrancy in SwarmMarket.claim(uint256) (src/SwarmMarket.sol#212-218):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:120: Reentrancy in SwarmMarket.stake(uint256,bool,uint128) (src/SwarmMarket.sol#120-134):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:138: Reentrancy in SwarmMarket.topUpFee(uint256,uint96) (src/SwarmMarket.sol#138-146):\n[low/medium] timestamp at src/AskSwarmRegistry.sol:226: AskSwarmRegistry.onOracleResult(bytes32,OracleAttestation,bytes) (src/AskSwarmRegistry.sol#226-295) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:175: SwarmWager.resolve(uint256) (src/SwarmWager.sol#175-190) uses timestamp for comparisons\n[low/medium] timestamp at src/AskSwarmRegistry.sol:354: AskSwarmRegistry._mayDisplace(AskSwarmRegistry.Stored,uint16,uint16,uint64,uint64,bool) (src/AskSwarmRegistry.sol#354-368) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:194: SwarmWager.abandon(uint256) (src/SwarmWager.sol#194-203) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:123: SwarmWager.create(bytes,bool,uint96,uint64,uint64) (src/SwarmWager.sol#123-147) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:182: SwarmMarket.settle(uint256) (src/SwarmMarket.sol#182-208) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:172: SwarmMarket.abandon(uint256) (src/SwarmMarket.sol#172-177) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:208: SwarmWager.settle(uint256) (src/SwarmWager.sol#208-230) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:259: SwarmWager._call(bytes) (src/SwarmWager.sol#259-262) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:152: SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#152-168) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:101: SwarmMarket.open(bytes,uint64,uint64) (src/SwarmMarket.sol#101-117) uses timestamp for comparisons\n[low/medium] timestamp at src/AskSwarmRegistry.sol:339: AskSwarmRegistry.reindex(bytes32) (src/AskSwarmRegistry.sol#339-348) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:150: SwarmWager.join(uint256) (src/SwarmWager.sol#150-160) uses timestamp for comparisons\n[low/medium] timestamp at src/AskSwarmRegistry.sol:392: AskSwarmRegistry.isCurrent(bytes32) (src/AskSwarmRegistry.sol#392-395) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:266: SwarmMarket._call(bytes) (src/SwarmMarket.sol#266-269) uses timestamp for comparisons\n[low/medium] timestamp at src/AskSwarmRegistry.sol:380: AskSwarmRegistry.answerOf(bytes32,uint16,uint16) (src/AskSwarmRegistry.sol#380-389) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:163: SwarmWager.cancel(uint256) (src/SwarmWager.sol#163-170) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:138: SwarmMarket.topUpFee(uint256,uint96) (src/SwarmMarket.sol#138-146) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:120: SwarmMarket.stake(uint256,bool,uint128) (src/SwarmMarket.sol#120-134) uses timestamp for comparisons","passed":true},{"durationMs":556,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/AskSwarmRegistry.sol:326: Reentrancy: State change after external call (8 places)\n[low] ecrecover at src/AskSwarmRegistry.sol:477: `ecrecover` Signature Malleability\n[low] large-numeric-literal at src/SwarmMarket.sol:201: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/AskSwarmRegistry.sol:255: Literal Instead of Constant (9 places)\n[low] missing-inheritance at src/AskSwarmRegistry.sol:46: Missing Inheritance\n[low] push-zero-opcode at src/AskSwarmRegistry.sol:2: PUSH0 Opcode (4 places)\n[low] unspecific-solidity-pragma at src/AskSwarmRegistry.sol:2: Unspecific Solidity Pragma (4 places)","passed":true},{"durationMs":10618,"exitCode":0,"name":"proof c7f7d6ef887a","output":"Compiling 26 files with Solc 0.8.26\nSolc 0.8.26 finished in 9.52s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-76abd686/Proof_c7f7d6ef887a.t.sol:SettleDeadlineProof\n[PASS] test_answerDeliveredInsideWindowDecidesMarketWhenSettledAfterDeadline() (gas: 996849)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.52ms (1.52ms CPU time)\n\nRan 1 test suite in 7.53ms (3.52ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2547edebd0577cfbeb366398418287816c916ebefb2d2a8fe7b44106427d8520","verifiedTreeHash":"8913357e415a93b1cee7d5f41d3fce3e6b96a1b8","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":76321,"exitCode":0,"name":"build","output":"Compiling 42 files with Solc 0.8.26\nSolc 0.8.26 finished in 76.22s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n   --> test/AskSwarmRegistry.t.sol:613:5:\n    |\n613 |     function _delivered() internal returns (bool d) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":34491,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/SwarmMarketLiveRegistry.t.sol:SwarmMarketLiveRegistryTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 499.91µs (0.00ns CPU time)\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 416566)\n[PASS] test_acceptsTheProtocolSignatureAsDelivered() (gas: 429075)\n[PASS] test_callbackSelectorIsCanonical() (gas: 691)\n[PASS] test_digestMatchesTheProtocol() (gas: 10377)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.95ms (1.40ms CPU time)\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2193944)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.69ms (5.66ms CPU time)\n\nRan 11 tests for test/AskSwarmRegistryReview.t.sol:AskSwarmRegistryReviewTest\n[PASS] test_askAtMostRefusesAPriceAboveTheCeiling() (gas: 764549)\n[PASS] test_askWithoutCeilingStillPaysTheLivePrice() (gas: 363602)\n[PASS] test_deliveryEmitsIndexedOnlyWhenTheIndexMoves() (gas: 831136)\n[PASS] test_markLostAfterAFailureCompletionWithEmptyArguments() (gas: 413455)\n[PASS] test_markLostSettlesAnAskIntakeCompletedWithoutDelivering() (gas: 1024141)\n[PASS] test_reindexFallsBackToAValidAnswerAfterTheHeldOneExpires() (gas: 1047052)\n[PASS] test_reindexRefusesEveryIneligibleRecord() (gas: 2185211)\n[PASS] test_reindexReplacesAFallbackOnlyByStrictDominance() (gas: 1703927)\n[PASS] test_shortLivedEqualAnswerCannotCutHeldValidityShort() (gas: 1618364)\n[PASS] test_staleOrShorterLivedEqualAnswerDoesNotDisplaceOnDelivery() (gas: 3309315)\n[PASS] test_statusCodesAreAppendedNotRenumbered() (gas: 580)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 47.65ms (11.81ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1218662, ~: 1172580)\n[PASS] test_abandon() (gas: 746874)\n[PASS] test_bothSidesSameUser() (gas: 1183323)\n[PASS] test_guards() (gas: 436417)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2143218)\n[PASS] test_noWins() (gas: 1210408)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520118)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1007126)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112378)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281356)\n[PASS] test_yesWinsProRataWithFee() (gas: 1366674)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 190.60ms (193.18ms CPU time)\n\nRan 28 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2078973, ~: 2073154)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 619280, ~: 521833)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 548372)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1159340)\n[PASS] test_answerDeliveredEarlyStillRequiresSettlementWithinWindow() (gas: 1046258)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1248053)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1345467)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2703542)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 553626)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1291070)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 904691)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1132280)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 840554)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 502368)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 573249)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1897161)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2423503)\n[PASS] test_timeoutDoesNotDependOnRegistryAvailability() (gas: 868894)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 480689)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 534647)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1199840)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 560829)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 863544)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 761662)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1198855)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1285185)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1054583)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3608721)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 209.85ms (326.20ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1000089, ~: 942947)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839238, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 499947, ~: 497893)\n[PASS] test_callbackGasAtTheStipendBoundary() (gas: 1848958)\nLogs:\n  onOracleResult gas, one-word answer, cold: 118568\n  onOracleResult gas, 4096-byte answer, cold: 156201\n\n[PASS] test_contractAskerIsRecordedNotTxOrigin() (gas: 639024)\n[PASS] test_highSTwinIsUnverifiedWhileZeroOneVAreNormalised() (gas: 857211)\n[PASS] test_identicalBodiesAreDistinctPaidAsks() (gas: 524043)\n[PASS] test_maximumAnswerDisplacingAHeldAnswerFitsColdStipend() (gas: 1592155)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 211.73ms (540.77ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 428640, ~: 425811)\n[PASS] test_answerDeliveredWithinStipendAndVerified() (gas: 480527)\n[PASS] test_askAtMostAgainstTheQuotedPrice() (gas: 307456)\n[PASS] test_askPullsPriceAndRegisters() (gas: 289885)\n[PASS] test_badSignatureStoredUnverifiedAndNotIndexed() (gas: 433697)\n[PASS] test_callbackGasMargin() (gas: 730555)\nLogs:\n  onOracleResult gas, bytes32 answer: 148282\n  onOracleResult gas, 352-byte answer: 135951\n\n[PASS] test_constructorMakesNoCallsAndAskLeavesNoAllowance() (gas: 2566003)\n[PASS] test_digestMatchesPlaneSignature() (gas: 15161)\n[PASS] test_domainIsTheCallbackContract() (gas: 398151)\n[PASS] test_expiredAtDeliveryAndAnswerBoundaries() (gas: 2957963)\n[PASS] test_expiryBoundaryAtDelivery() (gas: 449389)\n[PASS] test_failureHookStatusesAndUnknownIds() (gas: 384242)\n[PASS] test_failureRecorded() (gas: 316821)\n[PASS] test_indexRespectsValidityWindowAndReindexRecovers() (gas: 1493990)\n[PASS] test_largeAnswerStillWithinStipend() (gas: 516572)\n[PASS] test_markLostReadsIntakeCompletionRecord() (gas: 801557)\n[PASS] test_minorityAnswerNotIndexedEvenWhenNothingHeld() (gas: 779775)\n[PASS] test_minorityOfLargePanelCannotDisplaceSupermajority() (gas: 1155889)\n[PASS] test_onlyIntakeCanDeliver() (gas: 301915)\n[PASS] test_quorumAndExpiryGateVerified() (gas: 393137)\n[PASS] test_settledAskRefusesRedeliveryThroughAnotherOpenAsk() (gas: 789628)\n[PASS] test_signatureEdges() (gas: 1310064)\n[PASS] test_weakPanelCannotOverwriteStrongAnswer() (gas: 1129046)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 217.33ms (167.60ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 526290)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 431452)\n[PASS] test_badTerms() (gas: 117627)\n[PASS] test_cancelUnmatched() (gas: 468687)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385779)\n[PASS] test_minorityAnswerRefunds() (gas: 946126)\n[PASS] test_noWins() (gas: 974111)\n[PASS] test_nonBoolAnswerRefunds() (gas: 972179)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 972566)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786180)\n[PASS] test_refusedRefunds() (gas: 842355)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 730865)\n[PASS] test_settleOnlyOnce() (gas: 1004190)\n[PASS] test_splitPanelRefunds() (gas: 859308)\n[PASS] test_yesWins() (gas: 1037928)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 217.28ms (5.93ms CPU time)\n\nRan 7 tests for test/SwarmMarketPayments.t.sol:SwarmMarketPaymentsTest\n[PASS] testFuzz_failedPullOrApprovalIsAtomicAndRetryable(uint8,uint8) (runs: 1000, μ: 1222646, ~: 1239945)\n[PASS] testFuzz_failedTreasuryTransferRollsBackCreatorFee(uint8) (runs: 1000, μ: 1348984, ~: 1349050)\n[PASS] test_failedAbandonRefundRollsBackVoidAndAllowsRetry() (gas: 704478)\n[PASS] test_failedClaimPreservesEntitlementAndDoesNotBlockAnotherWinner() (gas: 1383220)\n[PASS] test_failedRemainderRefundRollsBackAlreadyPaidOracle() (gas: 1316543)\n[PASS] test_noReturnPullsAndApprovalsReachAnOrdinaryPayout() (gas: 1211138)\n[PASS] test_poolOverflowCannotChargeOrChangeAnUnrelatedMarket() (gas: 944392)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 217.38ms (330.53ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 209700, ~: 198903)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 567722, ~: 574322)\n[PASS] test_askDoesNotSpendPreexistingDonation() (gas: 399320)\n[PASS] test_constructorRejectsEveryZeroDependency() (gas: 7544)\n[PASS] test_donationCannotSubsidizeAnUnfundedAsk() (gas: 154696)\n[PASS] test_fullCallerBalanceAndMaximumBody() (gas: 2954509)\n[PASS] test_insufficientBalanceRollsBackConsumedAllowance() (gas: 192998)\n[PASS] test_intakeBodyBoundsRollBackThePayment() (gas: 434697)\n[PASS] test_noApprovalAndOneWeiShortApprovalBothRevert() (gas: 323043)\n[PASS] test_noReturnTokenIsSupportedOnTransferAndApproval() (gas: 394401)\n[PASS] test_notSoldDoesNotChargeOrRegister() (gas: 143386)\n[PASS] test_oneWeiPrice() (gas: 384542)\n[PASS] test_plainEthAndPayableAskAreRejectedWithoutTakingFunds() (gas: 145470)\n[PASS] test_priceChangesAreReadOnEveryAsk() (gas: 561725)\n[PASS] test_priceIncreaseBeyondApprovalCannotChargeOldQuote() (gas: 187170)\n[PASS] test_priceLookupFailureDoesNotChargeOrRegister() (gas: 163271)\n[PASS] test_rejectionAfterIntakePullRollsBackRecipientPayment() (gas: 343199)\n[PASS] test_rejectionBeforeIntakePullRollsBackCallerPayment() (gas: 227757)\n[PASS] test_tokenRejectsOnlyIntakePullAndEntireAskRollsBack() (gas: 317064)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 217.46ms (425.81ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 834157, ~: 690514)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504394, ~: 492701)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 517476, ~: 523377)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 505345, ~: 517466)\n[PASS] test_bothFailureStatusesPreserveFeeAndEmitReasonAndCounts() (gas: 1041103)\n[PASS] test_bothHooksRefuseEverySettledStatus() (gas: 2315241)\n[PASS] test_bothPanelSizeAndAgreementMustBeAtLeastAsStrong() (gas: 1886869)\n[PASS] test_eachOfTheFifteenFieldsIsBoundByTheSignature() (gas: 5586715)\n[PASS] test_falseIsAVerifiedAnswerAndNotAFailure() (gas: 504554)\n[PASS] test_firstByteOverCapIsUnverifiedAndDoesNotDisplaceHeldAnswer() (gas: 800971)\n[PASS] test_intakeAndOracleRequestIdsMayDiffer() (gas: 524108)\n[PASS] test_invalidVAndZeroRecoveryAreRejected() (gas: 2238504)\n[PASS] test_issuedAtToleranceBoundary() (gas: 1279965)\n[PASS] test_maximumAcceptedAnswerFitsColdCallbackStipend() (gas: 1152530)\n[PASS] test_nonzeroAbiPaddingCannotLeakIntoShortAnswer() (gas: 509578)\n[PASS] test_recordsWithoutAStoredAnswerReportZeroAnswerHash() (gas: 1858663)\n[PASS] test_registeredCallbackWithForeignRequestIdCannotCreateAnAsk() (gas: 93390)\n[PASS] test_settledAskIsNotRewrittenByAnotherRequestsCompletion() (gas: 1119030)\n[PASS] test_signatureForAnotherConsumerIsNotReusable() (gas: 500205)\n[PASS] test_thirdPartyCannotCompleteOrCallEitherHook() (gas: 448513)\n[PASS] test_timeAndMinimumFiltersDoNotDeleteHistoricalRecord() (gas: 604618)\n[PASS] test_transportWillNotRetrySuccessOrFailure() (gas: 867496)\n[PASS] test_unknownReadsDoNotLookAnswered() (gas: 48342)\n[PASS] test_weakerMajorityCanReplaceOnlyAfterHeldAnswerExpires() (gas: 1216157)\n[PASS] test_wrongDomainChainNameAndVersionAreRejected() (gas: 1164726)\n[PASS] test_wrongSignerCannotReplaceHeldAnswer() (gas: 852582)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 217.75ms (882.81ms CPU time)\n\nRan 2 tests for test/AskSwarmRegistryIndexInvariant.t.sol:AskSwarmRegistryIndexInvariantTest\n[PASS]\nAskSwarmRegistryIndexInvariantTest invariants:\n[PASS] invariant_everyAskIsPendingOrSettledOnce\n[PASS] invariant_indexOnlyHoldsVerifiedMajoritiesOfTheirOwnQuestion\n[PASS] invariant_registryHoldsNothingAndForwardsEveryFee\n AskSwarmRegistryIndexInvariantTest invariants (runs: 192, calls: 12288, reverts: 0)\n\n╭------------------------+------------+-------+---------+----------╮\n| Contract               | Selector   | Calls | Reverts | Discards |\n+==================================================================+\n| IndexTransitionHandler | ask        | 1440  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1295  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1393  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1343  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1394  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1281  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1427  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1315  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1400  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 8.21s (8.20s CPU time)\n\nRan 1 test for test/AskSwarmRegistryInvariant.t.sol:AskSwarmRegistryInvariantTest\n[PASS]\nAskSwarmRegistryInvariantTest invariants:\n[PASS] invariant_paymentsAreConservedAndNoFeeIsRetained\n[PASS] invariant_requestsAndCanonicalAnswersStayConsistent\n AskSwarmRegistryInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------------------+-------+---------+----------╮\n| Contract                | Selector                        | Calls | Reverts | Discards |\n+========================================================================================+\n| RegistrySequenceHandler | advanceTime                     | 2174  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2291  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2239  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2253  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2313  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2208  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2230  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2307  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2237  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 14.39s (14.39s CPU time)\n\nRan 2 tests for test/SwarmMarketInvariant.t.sol:SwarmMarketInvariantTest\n[PASS] invariant_cashLiabilitiesFeesAndTerminalStates() (runs: 256, calls: 24576, reverts: 0)\n\n╭--------------------+-------------+-------+---------+----------╮\n| Contract           | Selector    | Calls | Reverts | Discards |\n+===============================================================+\n| SwarmMarketHandler | abandon     | 2179  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | advance     | 2377  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | changePrice | 2223  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | claim       | 2205  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | deliver     | 2198  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | donate      | 2220  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | openMarket  | 2143  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | resolve     | 2304  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | settle      | 2262  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | stake       | 2185  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | topUp       | 2280  | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesAllPhasesAndUnwinds() (gas: 2577909)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 34.39s (34.39s CPU time)\n\nRan 15 test suites in 34.39s (58.75s CPU time): 160 tests passed, 0 failed, 1 skipped (161 total tests)\n","passed":true},{"durationMs":236,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AskSwarmRegistry.ask(bytes)\",\"AskSwarmRegistry.askAtMost(bytes,uint256)\",\"AskSwarmRegistry.markLost(bytes32)\",\"AskSwarmRegistry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"AskSwarmRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"AskSwarmRegistry.reindex(bytes32)\",\"SwarmMarket.abandon(uint256)\",\"SwarmMarket.claim(uint256)\",\"SwarmMarket.open(bytes,uint64,uint64)\",\"SwarmMarket.resolve(uint256)\",\"SwarmMarket.settle(uint256)\",\"SwarmMarket.stake(uint256,bool,uint128)\",\"SwarmMarket.topUpFee(uint256,uint96)\",\"SwarmWager.abandon(uint256)\",\"SwarmWager.cancel(uint256)\",\"SwarmWager.create(bytes,bool,uint96,uint64,uint64)\",\"SwarmWager.join(uint256)\",\"SwarmWager.resolve(uint256)\",\"SwarmWager.settle(uint256)\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":9,\"ADAPTATION.md\":170,\"README.md\":324,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":458,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":15,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":11630,\"docs/askswarm.png\":1383,\"docs/brand/.gitignore\":1,\"docs/brand/Battlefin-Black.otf\":864,\"docs/brand/NB_International_Bold_Webfont.ttf\":2797,\"docs/brand/NB_International_Mono_Webfont.ttf\":2749,\"docs/brand/NB_International_Regular_Webfont.ttf\":2728,\"docs/brand/ai.svg\":6,\"docs/brand/data.svg\":5,\"docs/brand/demo.html\":161,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":121,\"docs/brand/lock.svg\":3,\"docs/brand/logo-symbol-light.svg\":4,\"docs/brand/logo-symbol.svg\":4,\"docs/brand/logo-wordmark-dark.svg\":12,\"docs/brand/logo-wordmark-light.svg\":12,\"docs/brand/message.svg\":3,\"docs/brand/miniapp.html\":22,\"docs/brand/star5.svg\":3,\"docs/brand/voiceover.tsv\":7,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":11,\"docs/vids/askswarm-demo-silent.mp4\":9487,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7161,\"docs/vids/scene6.mp4\":331,\"docs/vids/scene7.mp4\":178,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":28,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/telegram.ts\":24,\"functions/wagers.ts\":60,\"lib/answers.json\":1,\"lib/bot.ts\":281,\"lib/hfsync.ts\":49,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":31,\"packages/cpay/src/index.ts\":481,\"packages/imd/src/index.ts\":235,\"packages/imd/src/intake.ts\":133,\"public/ai.svg\":6,\"public/answers.html\":83,\"public/apple-touch-icon.png\":53,\"public/data.svg\":5,\"public/favicon-32.png\":8,\"public/favicon.svg\":7,\"public/fonts/Battlefin-Black.otf\":864,\"public/fonts/NB_International_Bold_Webfont.ttf\":2797,\"public/fonts/NB_International_Mono_Webfont.ttf\":2749,\"public/fonts/NB_International_Regular_Webfont.ttf\":2728,\"public/imd.html\":107,\"public/index.html\":172,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/message.svg\":3,\"public/og.png\":1364,\"public/pay.html\":40,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":175,\"script/Deploy.s.sol\":23,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/launch.ts\":65,\"scripts/spike-sepolia.ts\":50,\"scripts/spike.ts\":58,\"scripts/train-risk.ts\":41,\"scripts/vercel-env.sh\":13,\"src/AskSwarmRegistry.sol\":493,\"src/IIntake.sol\":55,\"src/SwarmMarket.sol\":263,\"src/SwarmWager.sol\":263,\"test/AskSwarmRegistry.t.sol\":643,\"test/AskSwarmRegistryAdversarial.t.sol\":269,\"test/AskSwarmRegistryCallbacks.t.sol\":610,\"test/AskSwarmRegistryIndexInvariant.t.sol\":396,\"test/AskSwarmRegistryInvariant.t.sol\":488,\"test/AskSwarmRegistryPayments.t.sol\":261,\"test/AskSwarmRegistryReview.t.sol\":319,\"test/OracleConsumerConformance.t.sol\":104,\"test/SwarmMarket.t.sol\":285,\"test/SwarmMarketDeployment.t.sol\":73,\"test/SwarmMarketInvariant.t.sol\":533,\"test/SwarmMarketLiveRegistry.t.sol\":124,\"test/SwarmMarketPayments.t.sol\":267,\"test/SwarmMarketReview.t.sol\":549,\"test/SwarmMarketTesting.md\":81,\"test/SwarmWager.t.sol\":267,\"test/TESTING.md\":83,\"test/helpers/RegistryTestSupport.sol\":289,\"test/mocks/IntakeMocks.sol\":100,\"tsconfig.json\":8,\"vercel.json\":11},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"420c7b666331d2f0ba3cf8f61b36049e04df0facdebf68bb3b34ff31d339eb47","verifiedTreeHash":"3239d932a027df08e89458bb2c1b6a85878c6c53","verifierVersion":"0.1.0+fddeb651"},{"checks":[{"durationMs":66672,"exitCode":0,"name":"build","output":"Compiling 42 files with Solc 0.8.26\nSolc 0.8.26 finished in 66.59s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n   --> test/AskSwarmRegistry.t.sol:613:5:\n    |\n613 |     function _delivered() internal returns (bool d) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":31448,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/SwarmMarketLiveRegistry.t.sol:SwarmMarketLiveRegistryTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 520.11µs (0.00ns CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 526290)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 431452)\n[PASS] test_badTerms() (gas: 117627)\n[PASS] test_cancelUnmatched() (gas: 468687)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385779)\n[PASS] test_minorityAnswerRefunds() (gas: 946126)\n[PASS] test_noWins() (gas: 974111)\n[PASS] test_nonBoolAnswerRefunds() (gas: 972179)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 972566)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786180)\n[PASS] test_refusedRefunds() (gas: 842355)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 730865)\n[PASS] test_settleOnlyOnce() (gas: 1004190)\n[PASS] test_splitPanelRefunds() (gas: 859308)\n[PASS] test_yesWins() (gas: 1037928)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 6.19ms (4.71ms CPU time)\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2252362)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.20ms (7.20ms CPU time)\n\nRan 30 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2079400, ~: 2073850)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 617707, ~: 522213)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 548700)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1159810)\n[PASS] test_answerDeliveredInWindowSettlesAfterDeadline() (gas: 1123344)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1248417)\n[PASS] test_issuedAtBoundsTheAnswerWindow() (gas: 1920980)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1380268)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2704831)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 553935)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1291661)\n[PASS] test_openRejectsBodyLongerThanIntakeAccepts() (gas: 8124689)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 920755)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1132778)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 840904)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 502762)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 573599)\n[PASS] test_settleNeedsRegistryRecordThenVoidsPendingAfterDeadline() (gas: 918696)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1898027)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2424792)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 481039)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 534901)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1200576)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 561179)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 863872)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 762214)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1199376)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1285686)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1055026)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3610470)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 212.78ms (295.92ms CPU time)\n\nRan 11 tests for test/AskSwarmRegistryReview.t.sol:AskSwarmRegistryReviewTest\n[PASS] test_askAtMostRefusesAPriceAboveTheCeiling() (gas: 764549)\n[PASS] test_askWithoutCeilingStillPaysTheLivePrice() (gas: 363602)\n[PASS] test_deliveryEmitsIndexedOnlyWhenTheIndexMoves() (gas: 831136)\n[PASS] test_markLostAfterAFailureCompletionWithEmptyArguments() (gas: 413455)\n[PASS] test_markLostSettlesAnAskIntakeCompletedWithoutDelivering() (gas: 1024141)\n[PASS] test_reindexFallsBackToAValidAnswerAfterTheHeldOneExpires() (gas: 1047052)\n[PASS] test_reindexRefusesEveryIneligibleRecord() (gas: 2185211)\n[PASS] test_reindexReplacesAFallbackOnlyByStrictDominance() (gas: 1703927)\n[PASS] test_shortLivedEqualAnswerCannotCutHeldValidityShort() (gas: 1618364)\n[PASS] test_staleOrShorterLivedEqualAnswerDoesNotDisplaceOnDelivery() (gas: 3309315)\n[PASS] test_statusCodesAreAppendedNotRenumbered() (gas: 580)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 216.17ms (14.85ms CPU time)\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 416566)\n[PASS] test_acceptsTheProtocolSignatureAsDelivered() (gas: 429075)\n[PASS] test_callbackSelectorIsCanonical() (gas: 691)\n[PASS] test_digestMatchesTheProtocol() (gas: 10377)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 218.66ms (1.37ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 428344, ~: 425821)\n[PASS] test_answerDeliveredWithinStipendAndVerified() (gas: 480527)\n[PASS] test_askAtMostAgainstTheQuotedPrice() (gas: 307456)\n[PASS] test_askPullsPriceAndRegisters() (gas: 289885)\n[PASS] test_badSignatureStoredUnverifiedAndNotIndexed() (gas: 433697)\n[PASS] test_callbackGasMargin() (gas: 730555)\nLogs:\n  onOracleResult gas, bytes32 answer: 148282\n  onOracleResult gas, 352-byte answer: 135951\n\n[PASS] test_constructorMakesNoCallsAndAskLeavesNoAllowance() (gas: 2566003)\n[PASS] test_digestMatchesPlaneSignature() (gas: 15161)\n[PASS] test_domainIsTheCallbackContract() (gas: 398151)\n[PASS] test_expiredAtDeliveryAndAnswerBoundaries() (gas: 2957963)\n[PASS] test_expiryBoundaryAtDelivery() (gas: 449389)\n[PASS] test_failureHookStatusesAndUnknownIds() (gas: 384242)\n[PASS] test_failureRecorded() (gas: 316821)\n[PASS] test_indexRespectsValidityWindowAndReindexRecovers() (gas: 1493990)\n[PASS] test_largeAnswerStillWithinStipend() (gas: 516572)\n[PASS] test_markLostReadsIntakeCompletionRecord() (gas: 801557)\n[PASS] test_minorityAnswerNotIndexedEvenWhenNothingHeld() (gas: 779775)\n[PASS] test_minorityOfLargePanelCannotDisplaceSupermajority() (gas: 1155889)\n[PASS] test_onlyIntakeCanDeliver() (gas: 301915)\n[PASS] test_quorumAndExpiryGateVerified() (gas: 393137)\n[PASS] test_settledAskRefusesRedeliveryThroughAnotherOpenAsk() (gas: 789628)\n[PASS] test_signatureEdges() (gas: 1310064)\n[PASS] test_weakPanelCannotOverwriteStrongAnswer() (gas: 1129046)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 218.73ms (228.81ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1000089, ~: 942947)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839243, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 499998, ~: 497893)\n[PASS] test_callbackGasAtTheStipendBoundary() (gas: 1848958)\nLogs:\n  onOracleResult gas, one-word answer, cold: 118568\n  onOracleResult gas, 4096-byte answer, cold: 156201\n\n[PASS] test_contractAskerIsRecordedNotTxOrigin() (gas: 639024)\n[PASS] test_highSTwinIsUnverifiedWhileZeroOneVAreNormalised() (gas: 857211)\n[PASS] test_identicalBodiesAreDistinctPaidAsks() (gas: 524043)\n[PASS] test_maximumAnswerDisplacingAHeldAnswerFitsColdStipend() (gas: 1592155)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 218.65ms (470.94ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 209703, ~: 198903)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 567721, ~: 574322)\n[PASS] test_askDoesNotSpendPreexistingDonation() (gas: 399320)\n[PASS] test_constructorRejectsEveryZeroDependency() (gas: 7544)\n[PASS] test_donationCannotSubsidizeAnUnfundedAsk() (gas: 154696)\n[PASS] test_fullCallerBalanceAndMaximumBody() (gas: 2954509)\n[PASS] test_insufficientBalanceRollsBackConsumedAllowance() (gas: 192998)\n[PASS] test_intakeBodyBoundsRollBackThePayment() (gas: 434697)\n[PASS] test_noApprovalAndOneWeiShortApprovalBothRevert() (gas: 323043)\n[PASS] test_noReturnTokenIsSupportedOnTransferAndApproval() (gas: 394401)\n[PASS] test_notSoldDoesNotChargeOrRegister() (gas: 143386)\n[PASS] test_oneWeiPrice() (gas: 384542)\n[PASS] test_plainEthAndPayableAskAreRejectedWithoutTakingFunds() (gas: 145470)\n[PASS] test_priceChangesAreReadOnEveryAsk() (gas: 561725)\n[PASS] test_priceIncreaseBeyondApprovalCannotChargeOldQuote() (gas: 187170)\n[PASS] test_priceLookupFailureDoesNotChargeOrRegister() (gas: 163271)\n[PASS] test_rejectionAfterIntakePullRollsBackRecipientPayment() (gas: 343199)\n[PASS] test_rejectionBeforeIntakePullRollsBackCallerPayment() (gas: 227757)\n[PASS] test_tokenRejectsOnlyIntakePullAndEntireAskRollsBack() (gas: 317064)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 218.71ms (436.85ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1218848, ~: 1172752)\n[PASS] test_abandon() (gas: 747027)\n[PASS] test_bothSidesSameUser() (gas: 1183495)\n[PASS] test_guards() (gas: 436676)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2143538)\n[PASS] test_noWins() (gas: 1210602)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520227)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1022911)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112562)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281572)\n[PASS] test_yesWinsProRataWithFee() (gas: 1366912)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 218.63ms (122.26ms CPU time)\n\nRan 7 tests for test/SwarmMarketPayments.t.sol:SwarmMarketPaymentsTest\n[PASS] testFuzz_failedPullOrApprovalIsAtomicAndRetryable(uint8,uint8) (runs: 1000, μ: 1224334, ~: 1240447)\n[PASS] testFuzz_failedTreasuryTransferRollsBackCreatorFee(uint8) (runs: 1000, μ: 1349325, ~: 1349395)\n[PASS] test_failedAbandonRefundRollsBackVoidAndAllowsRetry() (gas: 704763)\n[PASS] test_failedClaimPreservesEntitlementAndDoesNotBlockAnotherWinner() (gas: 1383480)\n[PASS] test_failedRemainderRefundRollsBackAlreadyPaidOracle() (gas: 1316762)\n[PASS] test_noReturnPullsAndApprovalsReachAnOrdinaryPayout() (gas: 1211354)\n[PASS] test_poolOverflowCannotChargeOrChangeAnUnrelatedMarket() (gas: 944764)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 218.68ms (386.35ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 826712, ~: 675946)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504500, ~: 493068)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 517590, ~: 523377)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 505243, ~: 517466)\n[PASS] test_bothFailureStatusesPreserveFeeAndEmitReasonAndCounts() (gas: 1041103)\n[PASS] test_bothHooksRefuseEverySettledStatus() (gas: 2315241)\n[PASS] test_bothPanelSizeAndAgreementMustBeAtLeastAsStrong() (gas: 1886869)\n[PASS] test_eachOfTheFifteenFieldsIsBoundByTheSignature() (gas: 5586715)\n[PASS] test_falseIsAVerifiedAnswerAndNotAFailure() (gas: 504554)\n[PASS] test_firstByteOverCapIsUnverifiedAndDoesNotDisplaceHeldAnswer() (gas: 800971)\n[PASS] test_intakeAndOracleRequestIdsMayDiffer() (gas: 524108)\n[PASS] test_invalidVAndZeroRecoveryAreRejected() (gas: 2238504)\n[PASS] test_issuedAtToleranceBoundary() (gas: 1279965)\n[PASS] test_maximumAcceptedAnswerFitsColdCallbackStipend() (gas: 1152530)\n[PASS] test_nonzeroAbiPaddingCannotLeakIntoShortAnswer() (gas: 509578)\n[PASS] test_recordsWithoutAStoredAnswerReportZeroAnswerHash() (gas: 1858663)\n[PASS] test_registeredCallbackWithForeignRequestIdCannotCreateAnAsk() (gas: 93390)\n[PASS] test_settledAskIsNotRewrittenByAnotherRequestsCompletion() (gas: 1119030)\n[PASS] test_signatureForAnotherConsumerIsNotReusable() (gas: 500205)\n[PASS] test_thirdPartyCannotCompleteOrCallEitherHook() (gas: 448513)\n[PASS] test_timeAndMinimumFiltersDoNotDeleteHistoricalRecord() (gas: 604618)\n[PASS] test_transportWillNotRetrySuccessOrFailure() (gas: 867496)\n[PASS] test_unknownReadsDoNotLookAnswered() (gas: 48342)\n[PASS] test_weakerMajorityCanReplaceOnlyAfterHeldAnswerExpires() (gas: 1216157)\n[PASS] test_wrongDomainChainNameAndVersionAreRejected() (gas: 1164726)\n[PASS] test_wrongSignerCannotReplaceHeldAnswer() (gas: 852582)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 218.96ms (891.55ms CPU time)\n\nRan 2 tests for test/AskSwarmRegistryIndexInvariant.t.sol:AskSwarmRegistryIndexInvariantTest\n[PASS]\nAskSwarmRegistryIndexInvariantTest invariants:\n[PASS] invariant_everyAskIsPendingOrSettledOnce\n[PASS] invariant_indexOnlyHoldsVerifiedMajoritiesOfTheirOwnQuestion\n[PASS] invariant_registryHoldsNothingAndForwardsEveryFee\n AskSwarmRegistryIndexInvariantTest invariants (runs: 192, calls: 12288, reverts: 0)\n\n╭------------------------+------------+-------+---------+----------╮\n| Contract               | Selector   | Calls | Reverts | Discards |\n+==================================================================+\n| IndexTransitionHandler | ask        | 1440  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1295  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1393  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1343  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1394  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1281  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1427  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1315  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1400  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.79s (7.79s CPU time)\n\nRan 1 test for test/AskSwarmRegistryInvariant.t.sol:AskSwarmRegistryInvariantTest\n[PASS]\nAskSwarmRegistryInvariantTest invariants:\n[PASS] invariant_paymentsAreConservedAndNoFeeIsRetained\n[PASS] invariant_requestsAndCanonicalAnswersStayConsistent\n AskSwarmRegistryInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------------------+-------+---------+----------╮\n| Contract                | Selector                        | Calls | Reverts | Discards |\n+========================================================================================+\n| RegistrySequenceHandler | advanceTime                     | 2174  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2291  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2239  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2253  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2313  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2208  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2230  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2307  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2237  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.10s (13.10s CPU time)\n\nRan 2 tests for test/SwarmMarketInvariant.t.sol:SwarmMarketInvariantTest\n[PASS] invariant_cashLiabilitiesFeesAndTerminalStates() (runs: 256, calls: 24576, reverts: 0)\n\n╭--------------------+-------------+-------+---------+----------╮\n| Contract           | Selector    | Calls | Reverts | Discards |\n+===============================================================+\n| SwarmMarketHandler | abandon     | 2179  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | advance     | 2377  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | changePrice | 2223  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | claim       | 2205  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | deliver     | 2198  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | donate      | 2220  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | openMarket  | 2143  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | resolve     | 2304  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | settle      | 2262  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | stake       | 2185  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | topUp       | 2280  | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesAllPhasesAndUnwinds() (gas: 3121037)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 31.34s (31.34s CPU time)\n\nRan 15 test suites in 31.34s (54.20s CPU time): 162 tests passed, 0 failed, 1 skipped (163 total tests)\n","passed":true},{"durationMs":209,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AskSwarmRegistry.ask(bytes)\",\"AskSwarmRegistry.askAtMost(bytes,uint256)\",\"AskSwarmRegistry.markLost(bytes32)\",\"AskSwarmRegistry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"AskSwarmRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"AskSwarmRegistry.reindex(bytes32)\",\"SwarmMarket.abandon(uint256)\",\"SwarmMarket.claim(uint256)\",\"SwarmMarket.open(bytes,uint64,uint64)\",\"SwarmMarket.resolve(uint256)\",\"SwarmMarket.settle(uint256)\",\"SwarmMarket.stake(uint256,bool,uint128)\",\"SwarmMarket.topUpFee(uint256,uint96)\",\"SwarmWager.abandon(uint256)\",\"SwarmWager.cancel(uint256)\",\"SwarmWager.create(bytes,bool,uint96,uint64,uint64)\",\"SwarmWager.join(uint256)\",\"SwarmWager.resolve(uint256)\",\"SwarmWager.settle(uint256)\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":9,\"ADAPTATION.md\":211,\"README.md\":326,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":458,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":15,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":11630,\"docs/askswarm.png\":1383,\"docs/brand/.gitignore\":1,\"docs/brand/Battlefin-Black.otf\":864,\"docs/brand/NB_International_Bold_Webfont.ttf\":2797,\"docs/brand/NB_International_Mono_Webfont.ttf\":2749,\"docs/brand/NB_International_Regular_Webfont.ttf\":2728,\"docs/brand/ai.svg\":6,\"docs/brand/data.svg\":5,\"docs/brand/demo.html\":161,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":121,\"docs/brand/lock.svg\":3,\"docs/brand/logo-symbol-light.svg\":4,\"docs/brand/logo-symbol.svg\":4,\"docs/brand/logo-wordmark-dark.svg\":12,\"docs/brand/logo-wordmark-light.svg\":12,\"docs/brand/message.svg\":3,\"docs/brand/miniapp.html\":22,\"docs/brand/star5.svg\":3,\"docs/brand/voiceover.tsv\":7,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":11,\"docs/vids/askswarm-demo-silent.mp4\":9487,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7161,\"docs/vids/scene6.mp4\":331,\"docs/vids/scene7.mp4\":178,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":28,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/telegram.ts\":24,\"functions/wagers.ts\":60,\"lib/answers.json\":1,\"lib/bot.ts\":281,\"lib/hfsync.ts\":49,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":31,\"packages/cpay/src/index.ts\":481,\"packages/imd/src/index.ts\":235,\"packages/imd/src/intake.ts\":133,\"public/ai.svg\":6,\"public/answers.html\":83,\"public/apple-touch-icon.png\":53,\"public/data.svg\":5,\"public/favicon-32.png\":8,\"public/favicon.svg\":7,\"public/fonts/Battlefin-Black.otf\":864,\"public/fonts/NB_International_Bold_Webfont.ttf\":2797,\"public/fonts/NB_International_Mono_Webfont.ttf\":2749,\"public/fonts/NB_International_Regular_Webfont.ttf\":2728,\"public/imd.html\":107,\"public/index.html\":172,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/message.svg\":3,\"public/og.png\":1364,\"public/pay.html\":40,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":175,\"script/Deploy.s.sol\":23,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/launch.ts\":65,\"scripts/spike-sepolia.ts\":50,\"scripts/spike.ts\":58,\"scripts/train-risk.ts\":41,\"scripts/vercel-env.sh\":13,\"src/AskSwarmRegistry.sol\":493,\"src/IIntake.sol\":55,\"src/SwarmMarket.sol\":270,\"src/SwarmWager.sol\":263,\"test/AskSwarmRegistry.t.sol\":643,\"test/AskSwarmRegistryAdversarial.t.sol\":269,\"test/AskSwarmRegistryCallbacks.t.sol\":610,\"test/AskSwarmRegistryIndexInvariant.t.sol\":396,\"test/AskSwarmRegistryInvariant.t.sol\":488,\"test/AskSwarmRegistryPayments.t.sol\":261,\"test/AskSwarmRegistryReview.t.sol\":319,\"test/OracleConsumerConformance.t.sol\":104,\"test/SwarmMarket.t.sol\":285,\"test/SwarmMarketDeployment.t.sol\":73,\"test/SwarmMarketInvariant.t.sol\":565,\"test/SwarmMarketLiveRegistry.t.sol\":124,\"test/SwarmMarketPayments.t.sol\":267,\"test/SwarmMarketReview.t.sol\":612,\"test/SwarmMarketTesting.md\":89,\"test/SwarmWager.t.sol\":267,\"test/TESTING.md\":83,\"test/helpers/RegistryTestSupport.sol\":289,\"test/mocks/IntakeMocks.sol\":100,\"tsconfig.json\":8,\"vercel.json\":11},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"816675e0be0823c87962c997fc2d05c1910083aa664b7c85c20874171489781d","verifiedTreeHash":"9895a224b11fe4d78347297916a9a424d523d398","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":49939,"exitCode":0,"name":"build","output":"Compiling 39 files with Solc 0.8.26\nSolc 0.8.26 finished in 49.84s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n   --> test/AskSwarmRegistry.t.sol:613:5:\n    |\n613 |     function _delivered() internal returns (bool d) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":12540,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2193944)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.61ms (6.59ms CPU time)\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 416566)\n[PASS] test_acceptsTheProtocolSignatureAsDelivered() (gas: 429075)\n[PASS] test_callbackSelectorIsCanonical() (gas: 691)\n[PASS] test_digestMatchesTheProtocol() (gas: 10377)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 6.54ms (6.00ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1218761, ~: 1172580)\n[PASS] test_abandon() (gas: 746874)\n[PASS] test_bothSidesSameUser() (gas: 1183323)\n[PASS] test_guards() (gas: 436417)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2143218)\n[PASS] test_noWins() (gas: 1210408)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520118)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1007126)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112378)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281356)\n[PASS] test_yesWinsProRataWithFee() (gas: 1366674)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 121.04ms (111.80ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 526290)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 431452)\n[PASS] test_badTerms() (gas: 117627)\n[PASS] test_cancelUnmatched() (gas: 468687)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385779)\n[PASS] test_minorityAnswerRefunds() (gas: 946126)\n[PASS] test_noWins() (gas: 974111)\n[PASS] test_nonBoolAnswerRefunds() (gas: 972179)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 972566)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786180)\n[PASS] test_refusedRefunds() (gas: 842355)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 730865)\n[PASS] test_settleOnlyOnce() (gas: 1004190)\n[PASS] test_splitPanelRefunds() (gas: 859308)\n[PASS] test_yesWins() (gas: 1037928)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 155.63ms (4.09ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 428025, ~: 425794)\n[PASS] test_answerDeliveredWithinStipendAndVerified() (gas: 480527)\n[PASS] test_askAtMostAgainstTheQuotedPrice() (gas: 307456)\n[PASS] test_askPullsPriceAndRegisters() (gas: 289885)\n[PASS] test_badSignatureStoredUnverifiedAndNotIndexed() (gas: 433697)\n[PASS] test_callbackGasMargin() (gas: 730555)\nLogs:\n  onOracleResult gas, bytes32 answer: 148282\n  onOracleResult gas, 352-byte answer: 135951\n\n[PASS] test_constructorMakesNoCallsAndAskLeavesNoAllowance() (gas: 2566003)\n[PASS] test_digestMatchesPlaneSignature() (gas: 15161)\n[PASS] test_domainIsTheCallbackContract() (gas: 398151)\n[PASS] test_expiredAtDeliveryAndAnswerBoundaries() (gas: 2957963)\n[PASS] test_expiryBoundaryAtDelivery() (gas: 449389)\n[PASS] test_failureHookStatusesAndUnknownIds() (gas: 384242)\n[PASS] test_failureRecorded() (gas: 316821)\n[PASS] test_indexRespectsValidityWindowAndReindexRecovers() (gas: 1493990)\n[PASS] test_largeAnswerStillWithinStipend() (gas: 516572)\n[PASS] test_markLostReadsIntakeCompletionRecord() (gas: 801557)\n[PASS] test_minorityAnswerNotIndexedEvenWhenNothingHeld() (gas: 779775)\n[PASS] test_minorityOfLargePanelCannotDisplaceSupermajority() (gas: 1155889)\n[PASS] test_onlyIntakeCanDeliver() (gas: 301915)\n[PASS] test_quorumAndExpiryGateVerified() (gas: 393137)\n[PASS] test_settledAskRefusesRedeliveryThroughAnotherOpenAsk() (gas: 789628)\n[PASS] test_signatureEdges() (gas: 1310064)\n[PASS] test_weakPanelCannotOverwriteStrongAnswer() (gas: 1129046)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 155.77ms (76.99ms CPU time)\n\nRan 28 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2078734, ~: 2073130)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 614450, ~: 521833)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 548372)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1159340)\n[PASS] test_answerDeliveredEarlyStillRequiresSettlementWithinWindow() (gas: 1046258)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1248053)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1345467)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2703542)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 553626)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1291070)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 904691)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1132280)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 840554)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 502368)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 573249)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1897161)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2423503)\n[PASS] test_timeoutDoesNotDependOnRegistryAvailability() (gas: 868894)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 480689)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 534647)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1199840)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 560829)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 863544)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 761662)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1198855)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1285185)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1054583)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3608721)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 155.76ms (183.67ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 209705, ~: 198903)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 567967, ~: 574346)\n[PASS] test_askDoesNotSpendPreexistingDonation() (gas: 399320)\n[PASS] test_constructorRejectsEveryZeroDependency() (gas: 7544)\n[PASS] test_donationCannotSubsidizeAnUnfundedAsk() (gas: 154696)\n[PASS] test_fullCallerBalanceAndMaximumBody() (gas: 2954509)\n[PASS] test_insufficientBalanceRollsBackConsumedAllowance() (gas: 192998)\n[PASS] test_intakeBodyBoundsRollBackThePayment() (gas: 434697)\n[PASS] test_noApprovalAndOneWeiShortApprovalBothRevert() (gas: 323043)\n[PASS] test_noReturnTokenIsSupportedOnTransferAndApproval() (gas: 394401)\n[PASS] test_notSoldDoesNotChargeOrRegister() (gas: 143386)\n[PASS] test_oneWeiPrice() (gas: 384542)\n[PASS] test_plainEthAndPayableAskAreRejectedWithoutTakingFunds() (gas: 145470)\n[PASS] test_priceChangesAreReadOnEveryAsk() (gas: 561725)\n[PASS] test_priceIncreaseBeyondApprovalCannotChargeOldQuote() (gas: 187170)\n[PASS] test_priceLookupFailureDoesNotChargeOrRegister() (gas: 163271)\n[PASS] test_rejectionAfterIntakePullRollsBackRecipientPayment() (gas: 343199)\n[PASS] test_rejectionBeforeIntakePullRollsBackCallerPayment() (gas: 227757)\n[PASS] test_tokenRejectsOnlyIntakePullAndEntireAskRollsBack() (gas: 317064)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 155.75ms (251.40ms CPU time)\n\nRan 11 tests for test/AskSwarmRegistryReview.t.sol:AskSwarmRegistryReviewTest\n[PASS] test_askAtMostRefusesAPriceAboveTheCeiling() (gas: 764549)\n[PASS] test_askWithoutCeilingStillPaysTheLivePrice() (gas: 363602)\n[PASS] test_deliveryEmitsIndexedOnlyWhenTheIndexMoves() (gas: 831136)\n[PASS] test_markLostAfterAFailureCompletionWithEmptyArguments() (gas: 413455)\n[PASS] test_markLostSettlesAnAskIntakeCompletedWithoutDelivering() (gas: 1024141)\n[PASS] test_reindexFallsBackToAValidAnswerAfterTheHeldOneExpires() (gas: 1047052)\n[PASS] test_reindexRefusesEveryIneligibleRecord() (gas: 2185211)\n[PASS] test_reindexReplacesAFallbackOnlyByStrictDominance() (gas: 1703927)\n[PASS] test_shortLivedEqualAnswerCannotCutHeldValidityShort() (gas: 1618364)\n[PASS] test_staleOrShorterLivedEqualAnswerDoesNotDisplaceOnDelivery() (gas: 3309315)\n[PASS] test_statusCodesAreAppendedNotRenumbered() (gas: 580)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 155.88ms (15.23ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1000089, ~: 942947)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839240, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 499938, ~: 497893)\n[PASS] test_callbackGasAtTheStipendBoundary() (gas: 1848958)\nLogs:\n  onOracleResult gas, one-word answer, cold: 118568\n  onOracleResult gas, 4096-byte answer, cold: 156201\n\n[PASS] test_contractAskerIsRecordedNotTxOrigin() (gas: 639024)\n[PASS] test_highSTwinIsUnverifiedWhileZeroOneVAreNormalised() (gas: 857211)\n[PASS] test_identicalBodiesAreDistinctPaidAsks() (gas: 524043)\n[PASS] test_maximumAnswerDisplacingAHeldAnswerFitsColdStipend() (gas: 1592155)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 155.92ms (464.21ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 831653, ~: 690789)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504552, ~: 493119)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 517416, ~: 523377)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 505720, ~: 517466)\n[PASS] test_bothFailureStatusesPreserveFeeAndEmitReasonAndCounts() (gas: 1041103)\n[PASS] test_bothHooksRefuseEverySettledStatus() (gas: 2315241)\n[PASS] test_bothPanelSizeAndAgreementMustBeAtLeastAsStrong() (gas: 1886869)\n[PASS] test_eachOfTheFifteenFieldsIsBoundByTheSignature() (gas: 5586715)\n[PASS] test_falseIsAVerifiedAnswerAndNotAFailure() (gas: 504554)\n[PASS] test_firstByteOverCapIsUnverifiedAndDoesNotDisplaceHeldAnswer() (gas: 800971)\n[PASS] test_intakeAndOracleRequestIdsMayDiffer() (gas: 524108)\n[PASS] test_invalidVAndZeroRecoveryAreRejected() (gas: 2238504)\n[PASS] test_issuedAtToleranceBoundary() (gas: 1279965)\n[PASS] test_maximumAcceptedAnswerFitsColdCallbackStipend() (gas: 1152530)\n[PASS] test_nonzeroAbiPaddingCannotLeakIntoShortAnswer() (gas: 509578)\n[PASS] test_recordsWithoutAStoredAnswerReportZeroAnswerHash() (gas: 1858663)\n[PASS] test_registeredCallbackWithForeignRequestIdCannotCreateAnAsk() (gas: 93390)\n[PASS] test_settledAskIsNotRewrittenByAnotherRequestsCompletion() (gas: 1119030)\n[PASS] test_signatureForAnotherConsumerIsNotReusable() (gas: 500205)\n[PASS] test_thirdPartyCannotCompleteOrCallEitherHook() (gas: 448513)\n[PASS] test_timeAndMinimumFiltersDoNotDeleteHistoricalRecord() (gas: 604618)\n[PASS] test_transportWillNotRetrySuccessOrFailure() (gas: 867496)\n[PASS] test_unknownReadsDoNotLookAnswered() (gas: 48342)\n[PASS] test_weakerMajorityCanReplaceOnlyAfterHeldAnswerExpires() (gas: 1216157)\n[PASS] test_wrongDomainChainNameAndVersionAreRejected() (gas: 1164726)\n[PASS] test_wrongSignerCannotReplaceHeldAnswer() (gas: 852582)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 155.91ms (652.36ms CPU time)\n\nRan 2 tests for test/AskSwarmRegistryIndexInvariant.t.sol:AskSwarmRegistryIndexInvariantTest\n[PASS]\nAskSwarmRegistryIndexInvariantTest invariants:\n[PASS] invariant_everyAskIsPendingOrSettledOnce\n[PASS] invariant_indexOnlyHoldsVerifiedMajoritiesOfTheirOwnQuestion\n[PASS] invariant_registryHoldsNothingAndForwardsEveryFee\n AskSwarmRegistryIndexInvariantTest invariants (runs: 192, calls: 12288, reverts: 0)\n\n╭------------------------+------------+-------+---------+----------╮\n| Contract               | Selector   | Calls | Reverts | Discards |\n+==================================================================+\n| IndexTransitionHandler | ask        | 1440  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1295  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1393  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1343  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1394  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1281  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1427  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1315  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1400  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.12s (7.12s CPU time)\n\nRan 1 test for test/AskSwarmRegistryInvariant.t.sol:AskSwarmRegistryInvariantTest\n[PASS]\nAskSwarmRegistryInvariantTest invariants:\n[PASS] invariant_paymentsAreConservedAndNoFeeIsRetained\n[PASS] invariant_requestsAndCanonicalAnswersStayConsistent\n AskSwarmRegistryInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------------------+-------+---------+----------╮\n| Contract                | Selector                        | Calls | Reverts | Discards |\n+========================================================================================+\n| RegistrySequenceHandler | advanceTime                     | 2174  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2291  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2239  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2253  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2313  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2208  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2230  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2307  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2237  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.44s (12.44s CPU time)\n\nRan 12 test suites in 12.44s (20.79s CPU time): 151 tests passed, 0 failed, 0 skipped (151 total tests)\n","passed":true},{"durationMs":220,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AskSwarmRegistry.ask(bytes)\",\"AskSwarmRegistry.askAtMost(bytes,uint256)\",\"AskSwarmRegistry.markLost(bytes32)\",\"AskSwarmRegistry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"AskSwarmRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"AskSwarmRegistry.reindex(bytes32)\",\"SwarmMarket.abandon(uint256)\",\"SwarmMarket.claim(uint256)\",\"SwarmMarket.open(bytes,uint64,uint64)\",\"SwarmMarket.resolve(uint256)\",\"SwarmMarket.settle(uint256)\",\"SwarmMarket.stake(uint256,bool,uint128)\",\"SwarmMarket.topUpFee(uint256,uint96)\",\"SwarmWager.abandon(uint256)\",\"SwarmWager.cancel(uint256)\",\"SwarmWager.create(bytes,bool,uint96,uint64,uint64)\",\"SwarmWager.join(uint256)\",\"SwarmWager.resolve(uint256)\",\"SwarmWager.settle(uint256)\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":9,\"ADAPTATION.md\":170,\"README.md\":324,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":458,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":15,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":11630,\"docs/askswarm.png\":1383,\"docs/brand/.gitignore\":1,\"docs/brand/Battlefin-Black.otf\":864,\"docs/brand/NB_International_Bold_Webfont.ttf\":2797,\"docs/brand/NB_International_Mono_Webfont.ttf\":2749,\"docs/brand/NB_International_Regular_Webfont.ttf\":2728,\"docs/brand/ai.svg\":6,\"docs/brand/data.svg\":5,\"docs/brand/demo.html\":161,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":121,\"docs/brand/lock.svg\":3,\"docs/brand/logo-symbol-light.svg\":4,\"docs/brand/logo-symbol.svg\":4,\"docs/brand/logo-wordmark-dark.svg\":12,\"docs/brand/logo-wordmark-light.svg\":12,\"docs/brand/message.svg\":3,\"docs/brand/miniapp.html\":22,\"docs/brand/star5.svg\":3,\"docs/brand/voiceover.tsv\":7,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":11,\"docs/vids/askswarm-demo-silent.mp4\":9487,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7161,\"docs/vids/scene6.mp4\":331,\"docs/vids/scene7.mp4\":178,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":28,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/telegram.ts\":24,\"functions/wagers.ts\":60,\"lib/answers.json\":1,\"lib/bot.ts\":281,\"lib/hfsync.ts\":49,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":31,\"packages/cpay/src/index.ts\":481,\"packages/imd/src/index.ts\":235,\"packages/imd/src/intake.ts\":133,\"public/ai.svg\":6,\"public/answers.html\":83,\"public/apple-touch-icon.png\":53,\"public/data.svg\":5,\"public/favicon-32.png\":8,\"public/favicon.svg\":7,\"public/fonts/Battlefin-Black.otf\":864,\"public/fonts/NB_International_Bold_Webfont.ttf\":2797,\"public/fonts/NB_International_Mono_Webfont.ttf\":2749,\"public/fonts/NB_International_Regular_Webfont.ttf\":2728,\"public/imd.html\":107,\"public/index.html\":172,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/message.svg\":3,\"public/og.png\":1364,\"public/pay.html\":40,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":175,\"script/Deploy.s.sol\":23,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/launch.ts\":65,\"scripts/spike-sepolia.ts\":50,\"scripts/spike.ts\":58,\"scripts/train-risk.ts\":41,\"scripts/vercel-env.sh\":13,\"src/AskSwarmRegistry.sol\":493,\"src/IIntake.sol\":55,\"src/SwarmMarket.sol\":263,\"src/SwarmWager.sol\":263,\"test/AskSwarmRegistry.t.sol\":643,\"test/AskSwarmRegistryAdversarial.t.sol\":269,\"test/AskSwarmRegistryCallbacks.t.sol\":610,\"test/AskSwarmRegistryIndexInvariant.t.sol\":396,\"test/AskSwarmRegistryInvariant.t.sol\":488,\"test/AskSwarmRegistryPayments.t.sol\":261,\"test/AskSwarmRegistryReview.t.sol\":319,\"test/OracleConsumerConformance.t.sol\":104,\"test/SwarmMarket.t.sol\":285,\"test/SwarmMarketDeployment.t.sol\":73,\"test/SwarmMarketReview.t.sol\":549,\"test/SwarmWager.t.sol\":267,\"test/TESTING.md\":83,\"test/helpers/RegistryTestSupport.sol\":289,\"test/mocks/IntakeMocks.sol\":100,\"tsconfig.json\":8,\"vercel.json\":11},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2163,"exitCode":0,"name":"slither","output":"[medium/medium] reentrancy-no-eth at src/SwarmMarket.sol:147: Reentrancy in SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#147-163):\n[medium/medium] reentrancy-no-eth at src/SwarmWager.sol:175: Reentrancy in SwarmWager.resolve(uint256) (src/SwarmWager.sol#175-190):\n[medium/medium] unused-return at src/AskSwarmRegistry.sol:322: AskSwarmRegistry.markLost(bytes32) (src/AskSwarmRegistry.sol#322-330) ignores return value by (None,None,None,completed) = INTAKE.requests(requestId) (src/AskSwarmRegistry.sol#326)\n[low/medium] reentrancy-benign at src/AskSwarmRegistry.sol:203: Reentrancy in AskSwarmRegistry._ask(bytes,uint256) (src/AskSwarmRegistry.sol#203-216):\n[low/medium] reentrancy-events at src/SwarmWager.sol:208: Reentrancy in SwarmWager.settle(uint256) (src/SwarmWager.sol#208-230):\n[low/medium] reentrancy-events at src/SwarmWager.sol:194: Reentrancy in SwarmWager.abandon(uint256) (src/SwarmWager.sol#194-203):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:115: Reentrancy in SwarmMarket.stake(uint256,bool,uint128) (src/SwarmMarket.sol#115-129):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:177: Reentrancy in SwarmMarket.settle(uint256) (src/SwarmMarket.sol#177-201):\n[low/medium] reentrancy-events at src/SwarmWager.sol:163: Reentrancy in SwarmWager.cancel(uint256) (src/SwarmWager.sol#163-170):\n[low/medium] reentrancy-events at src/SwarmWager.sol:240: Reentrancy in SwarmWager._refund(SwarmWager.Wager,uint256,uint8) (src/SwarmWager.sol#240-245):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:98: Reentrancy in SwarmMarket.open(bytes,uint64,uint64) (src/SwarmMarket.sol#98-112):\n[low/medium] reentrancy-events at src/SwarmWager.sol:175: Reentrancy in SwarmWager.resolve(uint256) (src/SwarmWager.sol#175-190):\n[low/medium] reentrancy-events at src/AskSwarmRegistry.sol:203: Reentrancy in AskSwarmRegistry._ask(bytes,uint256) (src/AskSwarmRegistry.sol#203-216):\n[low/medium] reentrancy-events at src/SwarmWager.sol:123: Reentrancy in SwarmWager.create(bytes,bool,uint96,uint64,uint64) (src/SwarmWager.sol#123-147):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:133: Reentrancy in SwarmMarket.topUpFee(uint256,uint96) (src/SwarmMarket.sol#133-141):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:239: Reentrancy in SwarmMarket._void(SwarmMarket.Market,uint256,uint8) (src/SwarmMarket.sol#239-245):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:147: Reentrancy in SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#147-163):\n[low/medium] reentrancy-events at src/SwarmWager.sol:150: Reentrancy in SwarmWager.join(uint256) (src/SwarmWager.sol#150-160):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:205: Reentrancy in SwarmMarket.claim(uint256) (src/SwarmMarket.sol#205-211):\n[low/medium] timestamp at src/SwarmMarket.sol:259: SwarmMarket._call(bytes) (src/SwarmMarket.sol#259-262) uses timestamp for comparisons\n[low/medium] timestamp at src/AskSwarmRegistry.sol:226: AskSwarmRegistry.onOracleResult(bytes32,OracleAttestation,bytes) (src/AskSwarmRegistry.sol#226-295) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:175: SwarmWager.resolve(uint256) (src/SwarmWager.sol#175-190) uses timestamp for comparisons\n[low/medium] timestamp at src/AskSwarmRegistry.sol:354: AskSwarmRegistry._mayDisplace(AskSwarmRegistry.Stored,uint16,uint16,uint64,uint64,bool) (src/AskSwarmRegistry.sol#354-368) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:194: SwarmWager.abandon(uint256) (src/SwarmWager.sol#194-203) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:123: SwarmWager.create(bytes,bool,uint96,uint64,uint64) (src/SwarmWager.sol#123-147) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:177: SwarmMarket.settle(uint256) (src/SwarmMarket.sol#177-201) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:115: SwarmMarket.stake(uint256,bool,uint128) (src/SwarmMarket.sol#115-129) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:208: SwarmWager.settle(uint256) (src/SwarmWager.sol#208-230) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:133: SwarmMarket.topUpFee(uint256,uint96) (src/SwarmMarket.sol#133-141) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:147: SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#147-163) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:259: SwarmWager._call(bytes) (src/SwarmWager.sol#259-262) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:167: SwarmMarket.abandon(uint256) (src/SwarmMarket.sol#167-172) uses timestamp for comparisons\n[low/medium] timestamp at src/AskSwarmRegistry.sol:339: AskSwarmRegistry.reindex(bytes32) (src/AskSwarmRegistry.sol#339-348) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:150: SwarmWager.join(uint256) (src/SwarmWager.sol#150-160) uses timestamp for comparisons\n[low/medium] timestamp at src/AskSwarmRegistry.sol:392: AskSwarmRegistry.isCurrent(bytes32) (src/AskSwarmRegistry.sol#392-395) uses timestamp for comparisons\n[low/medium] timestamp at src/AskSwarmRegistry.sol:380: AskSwarmRegistry.answerOf(bytes32,uint16,uint16) (src/AskSwarmRegistry.sol#380-389) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:98: SwarmMarket.open(bytes,uint64,uint64) (src/SwarmMarket.sol#98-112) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:163: SwarmWager.cancel(uint256) (src/SwarmWager.sol#163-170) uses timestamp for comparisons","passed":true},{"durationMs":296,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/AskSwarmRegistry.sol:326: Reentrancy: State change after external call (8 places)\n[low] ecrecover at src/AskSwarmRegistry.sol:477: `ecrecover` Signature Malleability\n[low] large-numeric-literal at src/SwarmMarket.sol:194: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/AskSwarmRegistry.sol:255: Literal Instead of Constant (9 places)\n[low] missing-inheritance at src/AskSwarmRegistry.sol:46: Missing Inheritance\n[low] push-zero-opcode at src/AskSwarmRegistry.sol:2: PUSH0 Opcode (4 places)\n[low] unspecific-solidity-pragma at src/AskSwarmRegistry.sol:2: Unspecific Solidity Pragma (4 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c9b6dc81986e8c380641cca92c179cb66ab7ed11ef4bdf56510cde7bd1d2bc09","verifiedTreeHash":"493e3d0ea579b8015a083140196f1fb8c8af27d8","verifierVersion":"0.1.0+fddeb651"},{"checks":[{"durationMs":53901,"exitCode":0,"name":"build","output":"Compiling 39 files with Solc 0.8.26\nSolc 0.8.26 finished in 53.81s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n   --> test/AskSwarmRegistry.t.sol:613:5:\n    |\n613 |     function _delivered() internal returns (bool d) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":12740,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 416566)\n[PASS] test_acceptsTheProtocolSignatureAsDelivered() (gas: 429075)\n[PASS] test_callbackSelectorIsCanonical() (gas: 691)\n[PASS] test_digestMatchesTheProtocol() (gas: 10377)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.18ms (1.18ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 526290)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 431452)\n[PASS] test_badTerms() (gas: 117627)\n[PASS] test_cancelUnmatched() (gas: 468687)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385779)\n[PASS] test_minorityAnswerRefunds() (gas: 946126)\n[PASS] test_noWins() (gas: 974111)\n[PASS] test_nonBoolAnswerRefunds() (gas: 972179)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 972566)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786180)\n[PASS] test_refusedRefunds() (gas: 842355)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 730865)\n[PASS] test_settleOnlyOnce() (gas: 1004190)\n[PASS] test_splitPanelRefunds() (gas: 859308)\n[PASS] test_yesWins() (gas: 1037928)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 5.91ms (4.42ms CPU time)\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2252362)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 8.58ms (8.57ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 427706, ~: 425782)\n[PASS] test_answerDeliveredWithinStipendAndVerified() (gas: 480527)\n[PASS] test_askAtMostAgainstTheQuotedPrice() (gas: 307456)\n[PASS] test_askPullsPriceAndRegisters() (gas: 289885)\n[PASS] test_badSignatureStoredUnverifiedAndNotIndexed() (gas: 433697)\n[PASS] test_callbackGasMargin() (gas: 730555)\nLogs:\n  onOracleResult gas, bytes32 answer: 148282\n  onOracleResult gas, 352-byte answer: 135951\n\n[PASS] test_constructorMakesNoCallsAndAskLeavesNoAllowance() (gas: 2566003)\n[PASS] test_digestMatchesPlaneSignature() (gas: 15161)\n[PASS] test_domainIsTheCallbackContract() (gas: 398151)\n[PASS] test_expiredAtDeliveryAndAnswerBoundaries() (gas: 2957963)\n[PASS] test_expiryBoundaryAtDelivery() (gas: 449389)\n[PASS] test_failureHookStatusesAndUnknownIds() (gas: 384242)\n[PASS] test_failureRecorded() (gas: 316821)\n[PASS] test_indexRespectsValidityWindowAndReindexRecovers() (gas: 1493990)\n[PASS] test_largeAnswerStillWithinStipend() (gas: 516572)\n[PASS] test_markLostReadsIntakeCompletionRecord() (gas: 801557)\n[PASS] test_minorityAnswerNotIndexedEvenWhenNothingHeld() (gas: 779775)\n[PASS] test_minorityOfLargePanelCannotDisplaceSupermajority() (gas: 1155889)\n[PASS] test_onlyIntakeCanDeliver() (gas: 301915)\n[PASS] test_quorumAndExpiryGateVerified() (gas: 393137)\n[PASS] test_settledAskRefusesRedeliveryThroughAnotherOpenAsk() (gas: 789628)\n[PASS] test_signatureEdges() (gas: 1310064)\n[PASS] test_weakPanelCannotOverwriteStrongAnswer() (gas: 1129046)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 82.76ms (94.92ms CPU time)\n\nRan 11 tests for test/AskSwarmRegistryReview.t.sol:AskSwarmRegistryReviewTest\n[PASS] test_askAtMostRefusesAPriceAboveTheCeiling() (gas: 764549)\n[PASS] test_askWithoutCeilingStillPaysTheLivePrice() (gas: 363602)\n[PASS] test_deliveryEmitsIndexedOnlyWhenTheIndexMoves() (gas: 831136)\n[PASS] test_markLostAfterAFailureCompletionWithEmptyArguments() (gas: 413455)\n[PASS] test_markLostSettlesAnAskIntakeCompletedWithoutDelivering() (gas: 1024141)\n[PASS] test_reindexFallsBackToAValidAnswerAfterTheHeldOneExpires() (gas: 1047052)\n[PASS] test_reindexRefusesEveryIneligibleRecord() (gas: 2185211)\n[PASS] test_reindexReplacesAFallbackOnlyByStrictDominance() (gas: 1703927)\n[PASS] test_shortLivedEqualAnswerCannotCutHeldValidityShort() (gas: 1618364)\n[PASS] test_staleOrShorterLivedEqualAnswerDoesNotDisplaceOnDelivery() (gas: 3309315)\n[PASS] test_statusCodesAreAppendedNotRenumbered() (gas: 580)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 135.43ms (10.65ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1218928, ~: 1172752)\n[PASS] test_abandon() (gas: 747027)\n[PASS] test_bothSidesSameUser() (gas: 1183495)\n[PASS] test_guards() (gas: 436676)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2143538)\n[PASS] test_noWins() (gas: 1210602)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520227)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1022911)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112562)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281572)\n[PASS] test_yesWinsProRataWithFee() (gas: 1366912)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 135.37ms (136.43ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1000089, ~: 942947)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839239, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 500044, ~: 497893)\n[PASS] test_callbackGasAtTheStipendBoundary() (gas: 1848958)\nLogs:\n  onOracleResult gas, one-word answer, cold: 118568\n  onOracleResult gas, 4096-byte answer, cold: 156201\n\n[PASS] test_contractAskerIsRecordedNotTxOrigin() (gas: 639024)\n[PASS] test_highSTwinIsUnverifiedWhileZeroOneVAreNormalised() (gas: 857211)\n[PASS] test_identicalBodiesAreDistinctPaidAsks() (gas: 524043)\n[PASS] test_maximumAnswerDisplacingAHeldAnswerFitsColdStipend() (gas: 1592155)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 136.61ms (387.70ms CPU time)\n\nRan 30 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2079764, ~: 2073850)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 620610, ~: 522213)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 548700)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1159810)\n[PASS] test_answerDeliveredInWindowSettlesAfterDeadline() (gas: 1123344)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1248417)\n[PASS] test_issuedAtBoundsTheAnswerWindow() (gas: 1920980)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1380268)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2704831)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 553935)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1291661)\n[PASS] test_openRejectsBodyLongerThanIntakeAccepts() (gas: 8124689)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 920755)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1132778)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 840904)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 502762)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 573599)\n[PASS] test_settleNeedsRegistryRecordThenVoidsPendingAfterDeadline() (gas: 918696)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1898027)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2424792)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 481039)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 534901)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1200576)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 561179)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 863872)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 762214)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1199376)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1285686)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1055026)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3610470)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 145.25ms (213.14ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 209703, ~: 198903)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 567965, ~: 574322)\n[PASS] test_askDoesNotSpendPreexistingDonation() (gas: 399320)\n[PASS] test_constructorRejectsEveryZeroDependency() (gas: 7544)\n[PASS] test_donationCannotSubsidizeAnUnfundedAsk() (gas: 154696)\n[PASS] test_fullCallerBalanceAndMaximumBody() (gas: 2954509)\n[PASS] test_insufficientBalanceRollsBackConsumedAllowance() (gas: 192998)\n[PASS] test_intakeBodyBoundsRollBackThePayment() (gas: 434697)\n[PASS] test_noApprovalAndOneWeiShortApprovalBothRevert() (gas: 323043)\n[PASS] test_noReturnTokenIsSupportedOnTransferAndApproval() (gas: 394401)\n[PASS] test_notSoldDoesNotChargeOrRegister() (gas: 143386)\n[PASS] test_oneWeiPrice() (gas: 384542)\n[PASS] test_plainEthAndPayableAskAreRejectedWithoutTakingFunds() (gas: 145470)\n[PASS] test_priceChangesAreReadOnEveryAsk() (gas: 561725)\n[PASS] test_priceIncreaseBeyondApprovalCannotChargeOldQuote() (gas: 187170)\n[PASS] test_priceLookupFailureDoesNotChargeOrRegister() (gas: 163271)\n[PASS] test_rejectionAfterIntakePullRollsBackRecipientPayment() (gas: 343199)\n[PASS] test_rejectionBeforeIntakePullRollsBackCallerPayment() (gas: 227757)\n[PASS] test_tokenRejectsOnlyIntakePullAndEntireAskRollsBack() (gas: 317064)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 147.76ms (294.06ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 836789, ~: 692578)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504958, ~: 493687)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 517539, ~: 523377)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 505638, ~: 517466)\n[PASS] test_bothFailureStatusesPreserveFeeAndEmitReasonAndCounts() (gas: 1041103)\n[PASS] test_bothHooksRefuseEverySettledStatus() (gas: 2315241)\n[PASS] test_bothPanelSizeAndAgreementMustBeAtLeastAsStrong() (gas: 1886869)\n[PASS] test_eachOfTheFifteenFieldsIsBoundByTheSignature() (gas: 5586715)\n[PASS] test_falseIsAVerifiedAnswerAndNotAFailure() (gas: 504554)\n[PASS] test_firstByteOverCapIsUnverifiedAndDoesNotDisplaceHeldAnswer() (gas: 800971)\n[PASS] test_intakeAndOracleRequestIdsMayDiffer() (gas: 524108)\n[PASS] test_invalidVAndZeroRecoveryAreRejected() (gas: 2238504)\n[PASS] test_issuedAtToleranceBoundary() (gas: 1279965)\n[PASS] test_maximumAcceptedAnswerFitsColdCallbackStipend() (gas: 1152530)\n[PASS] test_nonzeroAbiPaddingCannotLeakIntoShortAnswer() (gas: 509578)\n[PASS] test_recordsWithoutAStoredAnswerReportZeroAnswerHash() (gas: 1858663)\n[PASS] test_registeredCallbackWithForeignRequestIdCannotCreateAnAsk() (gas: 93390)\n[PASS] test_settledAskIsNotRewrittenByAnotherRequestsCompletion() (gas: 1119030)\n[PASS] test_signatureForAnotherConsumerIsNotReusable() (gas: 500205)\n[PASS] test_thirdPartyCannotCompleteOrCallEitherHook() (gas: 448513)\n[PASS] test_timeAndMinimumFiltersDoNotDeleteHistoricalRecord() (gas: 604618)\n[PASS] test_transportWillNotRetrySuccessOrFailure() (gas: 867496)\n[PASS] test_unknownReadsDoNotLookAnswered() (gas: 48342)\n[PASS] test_weakerMajorityCanReplaceOnlyAfterHeldAnswerExpires() (gas: 1216157)\n[PASS] test_wrongDomainChainNameAndVersionAreRejected() (gas: 1164726)\n[PASS] test_wrongSignerCannotReplaceHeldAnswer() (gas: 852582)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 164.36ms (631.42ms CPU time)\n\nRan 2 tests for test/AskSwarmRegistryIndexInvariant.t.sol:AskSwarmRegistryIndexInvariantTest\n[PASS]\nAskSwarmRegistryIndexInvariantTest invariants:\n[PASS] invariant_everyAskIsPendingOrSettledOnce\n[PASS] invariant_indexOnlyHoldsVerifiedMajoritiesOfTheirOwnQuestion\n[PASS] invariant_registryHoldsNothingAndForwardsEveryFee\n AskSwarmRegistryIndexInvariantTest invariants (runs: 192, calls: 12288, reverts: 0)\n\n╭------------------------+------------+-------+---------+----------╮\n| Contract               | Selector   | Calls | Reverts | Discards |\n+==================================================================+\n| IndexTransitionHandler | ask        | 1440  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1295  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1393  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1343  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1394  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1281  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1427  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1315  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1400  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.48s (7.47s CPU time)\n\nRan 1 test for test/AskSwarmRegistryInvariant.t.sol:AskSwarmRegistryInvariantTest\n[PASS]\nAskSwarmRegistryInvariantTest invariants:\n[PASS] invariant_paymentsAreConservedAndNoFeeIsRetained\n[PASS] invariant_requestsAndCanonicalAnswersStayConsistent\n AskSwarmRegistryInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------------------+-------+---------+----------╮\n| Contract                | Selector                        | Calls | Reverts | Discards |\n+========================================================================================+\n| RegistrySequenceHandler | advanceTime                     | 2174  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2291  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2239  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2253  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2313  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2208  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2230  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2307  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2237  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.65s (12.64s CPU time)\n\nRan 12 test suites in 12.65s (21.09s CPU time): 153 tests passed, 0 failed, 0 skipped (153 total tests)\n","passed":true},{"durationMs":219,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AskSwarmRegistry.ask(bytes)\",\"AskSwarmRegistry.askAtMost(bytes,uint256)\",\"AskSwarmRegistry.markLost(bytes32)\",\"AskSwarmRegistry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"AskSwarmRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"AskSwarmRegistry.reindex(bytes32)\",\"SwarmMarket.abandon(uint256)\",\"SwarmMarket.claim(uint256)\",\"SwarmMarket.open(bytes,uint64,uint64)\",\"SwarmMarket.resolve(uint256)\",\"SwarmMarket.settle(uint256)\",\"SwarmMarket.stake(uint256,bool,uint128)\",\"SwarmMarket.topUpFee(uint256,uint96)\",\"SwarmWager.abandon(uint256)\",\"SwarmWager.cancel(uint256)\",\"SwarmWager.create(bytes,bool,uint96,uint64,uint64)\",\"SwarmWager.join(uint256)\",\"SwarmWager.resolve(uint256)\",\"SwarmWager.settle(uint256)\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":9,\"ADAPTATION.md\":211,\"README.md\":326,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":458,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":15,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":11630,\"docs/askswarm.png\":1383,\"docs/brand/.gitignore\":1,\"docs/brand/Battlefin-Black.otf\":864,\"docs/brand/NB_International_Bold_Webfont.ttf\":2797,\"docs/brand/NB_International_Mono_Webfont.ttf\":2749,\"docs/brand/NB_International_Regular_Webfont.ttf\":2728,\"docs/brand/ai.svg\":6,\"docs/brand/data.svg\":5,\"docs/brand/demo.html\":161,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":121,\"docs/brand/lock.svg\":3,\"docs/brand/logo-symbol-light.svg\":4,\"docs/brand/logo-symbol.svg\":4,\"docs/brand/logo-wordmark-dark.svg\":12,\"docs/brand/logo-wordmark-light.svg\":12,\"docs/brand/message.svg\":3,\"docs/brand/miniapp.html\":22,\"docs/brand/star5.svg\":3,\"docs/brand/voiceover.tsv\":7,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":11,\"docs/vids/askswarm-demo-silent.mp4\":9487,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7161,\"docs/vids/scene6.mp4\":331,\"docs/vids/scene7.mp4\":178,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":28,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/telegram.ts\":24,\"functions/wagers.ts\":60,\"launch.json\":14,\"lib/answers.json\":1,\"lib/bot.ts\":281,\"lib/hfsync.ts\":49,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":31,\"packages/cpay/src/index.ts\":481,\"packages/imd/src/index.ts\":235,\"packages/imd/src/intake.ts\":133,\"public/ai.svg\":6,\"public/answers.html\":83,\"public/apple-touch-icon.png\":53,\"public/data.svg\":5,\"public/favicon-32.png\":8,\"public/favicon.svg\":7,\"public/fonts/Battlefin-Black.otf\":864,\"public/fonts/NB_International_Bold_Webfont.ttf\":2797,\"public/fonts/NB_International_Mono_Webfont.ttf\":2749,\"public/fonts/NB_International_Regular_Webfont.ttf\":2728,\"public/imd.html\":107,\"public/index.html\":172,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/message.svg\":3,\"public/og.png\":1364,\"public/pay.html\":40,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":175,\"script/Deploy.s.sol\":23,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/launch.ts\":65,\"scripts/spike-sepolia.ts\":50,\"scripts/spike.ts\":58,\"scripts/train-risk.ts\":41,\"scripts/vercel-env.sh\":13,\"src/AskSwarmRegistry.sol\":493,\"src/IIntake.sol\":55,\"src/SwarmMarket.sol\":270,\"src/SwarmWager.sol\":263,\"test/AskSwarmRegistry.t.sol\":643,\"test/AskSwarmRegistryAdversarial.t.sol\":269,\"test/AskSwarmRegistryCallbacks.t.sol\":610,\"test/AskSwarmRegistryIndexInvariant.t.sol\":396,\"test/AskSwarmRegistryInvariant.t.sol\":488,\"test/AskSwarmRegistryPayments.t.sol\":261,\"test/AskSwarmRegistryReview.t.sol\":319,\"test/OracleConsumerConformance.t.sol\":104,\"test/SwarmMarket.t.sol\":285,\"test/SwarmMarketDeployment.t.sol\":73,\"test/SwarmMarketReview.t.sol\":612,\"test/SwarmWager.t.sol\":267,\"test/TESTING.md\":83,\"test/helpers/RegistryTestSupport.sol\":289,\"test/mocks/IntakeMocks.sol\":100,\"tsconfig.json\":8,\"vercel.json\":11},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d459f2e7724de754140b340804dc0a8859ec70d585f15d8963898a15e3a3e533","verifiedTreeHash":"72c06f018523015304902f64daa1c45ff103594d","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":87360,"exitCode":0,"name":"build","output":"Compiling 39 files with Solc 0.8.26\nSolc 0.8.26 finished in 87.20s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to view\n   --> test/AskSwarmRegistry.t.sol:613:5:\n    |\n613 |     function _delivered() internal returns (bool d) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":19052,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2193944)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 12.08ms (12.13ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 526290)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 431452)\n[PASS] test_badTerms() (gas: 117627)\n[PASS] test_cancelUnmatched() (gas: 468687)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385779)\n[PASS] test_minorityAnswerRefunds() (gas: 946126)\n[PASS] test_noWins() (gas: 974111)\n[PASS] test_nonBoolAnswerRefunds() (gas: 972179)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 972566)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786180)\n[PASS] test_refusedRefunds() (gas: 842355)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 730865)\n[PASS] test_settleOnlyOnce() (gas: 1004190)\n[PASS] test_splitPanelRefunds() (gas: 859308)\n[PASS] test_yesWins() (gas: 1037928)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 15.32ms (13.43ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 428025, ~: 425794)\n[PASS] test_answerDeliveredWithinStipendAndVerified() (gas: 480527)\n[PASS] test_askAtMostAgainstTheQuotedPrice() (gas: 307456)\n[PASS] test_askPullsPriceAndRegisters() (gas: 289885)\n[PASS] test_badSignatureStoredUnverifiedAndNotIndexed() (gas: 433697)\n[PASS] test_callbackGasMargin() (gas: 730555)\nLogs:\n  onOracleResult gas, bytes32 answer: 148282\n  onOracleResult gas, 352-byte answer: 135951\n\n[PASS] test_constructorMakesNoCallsAndAskLeavesNoAllowance() (gas: 2566003)\n[PASS] test_digestMatchesPlaneSignature() (gas: 15161)\n[PASS] test_domainIsTheCallbackContract() (gas: 398151)\n[PASS] test_expiredAtDeliveryAndAnswerBoundaries() (gas: 2957963)\n[PASS] test_expiryBoundaryAtDelivery() (gas: 449389)\n[PASS] test_failureHookStatusesAndUnknownIds() (gas: 384242)\n[PASS] test_failureRecorded() (gas: 316821)\n[PASS] test_indexRespectsValidityWindowAndReindexRecovers() (gas: 1493990)\n[PASS] test_largeAnswerStillWithinStipend() (gas: 516572)\n[PASS] test_markLostReadsIntakeCompletionRecord() (gas: 801557)\n[PASS] test_minorityAnswerNotIndexedEvenWhenNothingHeld() (gas: 779775)\n[PASS] test_minorityOfLargePanelCannotDisplaceSupermajority() (gas: 1155889)\n[PASS] test_onlyIntakeCanDeliver() (gas: 301915)\n[PASS] test_quorumAndExpiryGateVerified() (gas: 393137)\n[PASS] test_settledAskRefusesRedeliveryThroughAnotherOpenAsk() (gas: 789628)\n[PASS] test_signatureEdges() (gas: 1310064)\n[PASS] test_weakPanelCannotOverwriteStrongAnswer() (gas: 1129046)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 286.17ms (310.59ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1218761, ~: 1172580)\n[PASS] test_abandon() (gas: 746874)\n[PASS] test_bothSidesSameUser() (gas: 1183323)\n[PASS] test_guards() (gas: 436417)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2143218)\n[PASS] test_noWins() (gas: 1210408)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520118)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1007126)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112378)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281356)\n[PASS] test_yesWinsProRataWithFee() (gas: 1366674)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 286.05ms (289.30ms CPU time)\n\nRan 4 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_acceptsAFreshSignatureFromTheVectorKey() (gas: 416566)\n[PASS] test_acceptsTheProtocolSignatureAsDelivered() (gas: 429075)\n[PASS] test_callbackSelectorIsCanonical() (gas: 691)\n[PASS] test_digestMatchesTheProtocol() (gas: 10377)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 288.23ms (1.87ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1000089, ~: 942947)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839240, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 499938, ~: 497893)\n[PASS] test_callbackGasAtTheStipendBoundary() (gas: 1848958)\nLogs:\n  onOracleResult gas, one-word answer, cold: 118568\n  onOracleResult gas, 4096-byte answer, cold: 156201\n\n[PASS] test_contractAskerIsRecordedNotTxOrigin() (gas: 639024)\n[PASS] test_highSTwinIsUnverifiedWhileZeroOneVAreNormalised() (gas: 857211)\n[PASS] test_identicalBodiesAreDistinctPaidAsks() (gas: 524043)\n[PASS] test_maximumAnswerDisplacingAHeldAnswerFitsColdStipend() (gas: 1592155)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 288.30ms (1.08s CPU time)\n\nRan 11 tests for test/AskSwarmRegistryReview.t.sol:AskSwarmRegistryReviewTest\n[PASS] test_askAtMostRefusesAPriceAboveTheCeiling() (gas: 764549)\n[PASS] test_askWithoutCeilingStillPaysTheLivePrice() (gas: 363602)\n[PASS] test_deliveryEmitsIndexedOnlyWhenTheIndexMoves() (gas: 831136)\n[PASS] test_markLostAfterAFailureCompletionWithEmptyArguments() (gas: 413455)\n[PASS] test_markLostSettlesAnAskIntakeCompletedWithoutDelivering() (gas: 1024141)\n[PASS] test_reindexFallsBackToAValidAnswerAfterTheHeldOneExpires() (gas: 1047052)\n[PASS] test_reindexRefusesEveryIneligibleRecord() (gas: 2185211)\n[PASS] test_reindexReplacesAFallbackOnlyByStrictDominance() (gas: 1703927)\n[PASS] test_shortLivedEqualAnswerCannotCutHeldValidityShort() (gas: 1618364)\n[PASS] test_staleOrShorterLivedEqualAnswerDoesNotDisplaceOnDelivery() (gas: 3309315)\n[PASS] test_statusCodesAreAppendedNotRenumbered() (gas: 580)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 306.71ms (18.86ms CPU time)\n\nRan 28 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2078734, ~: 2073130)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 614450, ~: 521833)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 548372)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1159340)\n[PASS] test_answerDeliveredEarlyStillRequiresSettlementWithinWindow() (gas: 1046258)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1248053)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1345467)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2703542)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 553626)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1291070)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 904691)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1132280)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 840554)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 502368)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 573249)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1897161)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2423503)\n[PASS] test_timeoutDoesNotDependOnRegistryAvailability() (gas: 868894)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 480689)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 534647)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1199840)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 560829)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 863544)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 761662)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1198855)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1285185)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1054583)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3608721)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 306.80ms (589.66ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 831653, ~: 690789)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504552, ~: 493119)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 517416, ~: 523377)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 505720, ~: 517466)\n[PASS] test_bothFailureStatusesPreserveFeeAndEmitReasonAndCounts() (gas: 1041103)\n[PASS] test_bothHooksRefuseEverySettledStatus() (gas: 2315241)\n[PASS] test_bothPanelSizeAndAgreementMustBeAtLeastAsStrong() (gas: 1886869)\n[PASS] test_eachOfTheFifteenFieldsIsBoundByTheSignature() (gas: 5586715)\n[PASS] test_falseIsAVerifiedAnswerAndNotAFailure() (gas: 504554)\n[PASS] test_firstByteOverCapIsUnverifiedAndDoesNotDisplaceHeldAnswer() (gas: 800971)\n[PASS] test_intakeAndOracleRequestIdsMayDiffer() (gas: 524108)\n[PASS] test_invalidVAndZeroRecoveryAreRejected() (gas: 2238504)\n[PASS] test_issuedAtToleranceBoundary() (gas: 1279965)\n[PASS] test_maximumAcceptedAnswerFitsColdCallbackStipend() (gas: 1152530)\n[PASS] test_nonzeroAbiPaddingCannotLeakIntoShortAnswer() (gas: 509578)\n[PASS] test_recordsWithoutAStoredAnswerReportZeroAnswerHash() (gas: 1858663)\n[PASS] test_registeredCallbackWithForeignRequestIdCannotCreateAnAsk() (gas: 93390)\n[PASS] test_settledAskIsNotRewrittenByAnotherRequestsCompletion() (gas: 1119030)\n[PASS] test_signatureForAnotherConsumerIsNotReusable() (gas: 500205)\n[PASS] test_thirdPartyCannotCompleteOrCallEitherHook() (gas: 448513)\n[PASS] test_timeAndMinimumFiltersDoNotDeleteHistoricalRecord() (gas: 604618)\n[PASS] test_transportWillNotRetrySuccessOrFailure() (gas: 867496)\n[PASS] test_unknownReadsDoNotLookAnswered() (gas: 48342)\n[PASS] test_weakerMajorityCanReplaceOnlyAfterHeldAnswerExpires() (gas: 1216157)\n[PASS] test_wrongDomainChainNameAndVersionAreRejected() (gas: 1164726)\n[PASS] test_wrongSignerCannotReplaceHeldAnswer() (gas: 852582)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 306.71ms (1.18s CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 209705, ~: 198903)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 567967, ~: 574346)\n[PASS] test_askDoesNotSpendPreexistingDonation() (gas: 399320)\n[PASS] test_constructorRejectsEveryZeroDependency() (gas: 7544)\n[PASS] test_donationCannotSubsidizeAnUnfundedAsk() (gas: 154696)\n[PASS] test_fullCallerBalanceAndMaximumBody() (gas: 2954509)\n[PASS] test_insufficientBalanceRollsBackConsumedAllowance() (gas: 192998)\n[PASS] test_intakeBodyBoundsRollBackThePayment() (gas: 434697)\n[PASS] test_noApprovalAndOneWeiShortApprovalBothRevert() (gas: 323043)\n[PASS] test_noReturnTokenIsSupportedOnTransferAndApproval() (gas: 394401)\n[PASS] test_notSoldDoesNotChargeOrRegister() (gas: 143386)\n[PASS] test_oneWeiPrice() (gas: 384542)\n[PASS] test_plainEthAndPayableAskAreRejectedWithoutTakingFunds() (gas: 145470)\n[PASS] test_priceChangesAreReadOnEveryAsk() (gas: 561725)\n[PASS] test_priceIncreaseBeyondApprovalCannotChargeOldQuote() (gas: 187170)\n[PASS] test_priceLookupFailureDoesNotChargeOrRegister() (gas: 163271)\n[PASS] test_rejectionAfterIntakePullRollsBackRecipientPayment() (gas: 343199)\n[PASS] test_rejectionBeforeIntakePullRollsBackCallerPayment() (gas: 227757)\n[PASS] test_tokenRejectsOnlyIntakePullAndEntireAskRollsBack() (gas: 317064)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 306.74ms (579.51ms CPU time)\n\nRan 2 tests for test/AskSwarmRegistryIndexInvariant.t.sol:AskSwarmRegistryIndexInvariantTest\n[PASS]\nAskSwarmRegistryIndexInvariantTest invariants:\n[PASS] invariant_everyAskIsPendingOrSettledOnce\n[PASS] invariant_indexOnlyHoldsVerifiedMajoritiesOfTheirOwnQuestion\n[PASS] invariant_registryHoldsNothingAndForwardsEveryFee\n AskSwarmRegistryIndexInvariantTest invariants (runs: 192, calls: 12288, reverts: 0)\n\n╭------------------------+------------+-------+---------+----------╮\n| Contract               | Selector   | Calls | Reverts | Discards |\n+==================================================================+\n| IndexTransitionHandler | ask        | 1440  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1295  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1393  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1343  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1394  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1281  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1427  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1315  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1400  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.49s (10.48s CPU time)\n\nRan 1 test for test/AskSwarmRegistryInvariant.t.sol:AskSwarmRegistryInvariantTest\n[PASS]\nAskSwarmRegistryInvariantTest invariants:\n[PASS] invariant_paymentsAreConservedAndNoFeeIsRetained\n[PASS] invariant_requestsAndCanonicalAnswersStayConsistent\n AskSwarmRegistryInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------------+---------------------------------+-------+---------+----------╮\n| Contract                | Selector                        | Calls | Reverts | Discards |\n+========================================================================================+\n| RegistrySequenceHandler | advanceTime                     | 2174  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2291  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2239  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2253  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2162  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2313  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2208  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2230  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2307  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2237  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 18.90s (18.90s CPU time)\n\nRan 12 test suites in 18.91s (31.79s CPU time): 151 tests passed, 0 failed, 0 skipped (151 total tests)\n","passed":true},{"durationMs":351,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AskSwarmRegistry.ask(bytes)\",\"AskSwarmRegistry.askAtMost(bytes,uint256)\",\"AskSwarmRegistry.markLost(bytes32)\",\"AskSwarmRegistry.onFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"AskSwarmRegistry.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"AskSwarmRegistry.reindex(bytes32)\",\"SwarmMarket.abandon(uint256)\",\"SwarmMarket.claim(uint256)\",\"SwarmMarket.open(bytes,uint64,uint64)\",\"SwarmMarket.resolve(uint256)\",\"SwarmMarket.settle(uint256)\",\"SwarmMarket.stake(uint256,bool,uint128)\",\"SwarmMarket.topUpFee(uint256,uint96)\",\"SwarmWager.abandon(uint256)\",\"SwarmWager.cancel(uint256)\",\"SwarmWager.create(bytes,bool,uint96,uint64,uint64)\",\"SwarmWager.join(uint256)\",\"SwarmWager.resolve(uint256)\",\"SwarmWager.settle(uint256)\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":9,\"ADAPTATION.md\":170,\"README.md\":324,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":458,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":15,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":11630,\"docs/askswarm.png\":1383,\"docs/brand/.gitignore\":1,\"docs/brand/Battlefin-Black.otf\":864,\"docs/brand/NB_International_Bold_Webfont.ttf\":2797,\"docs/brand/NB_International_Mono_Webfont.ttf\":2749,\"docs/brand/NB_International_Regular_Webfont.ttf\":2728,\"docs/brand/ai.svg\":6,\"docs/brand/data.svg\":5,\"docs/brand/demo.html\":161,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":121,\"docs/brand/lock.svg\":3,\"docs/brand/logo-symbol-light.svg\":4,\"docs/brand/logo-symbol.svg\":4,\"docs/brand/logo-wordmark-dark.svg\":12,\"docs/brand/logo-wordmark-light.svg\":12,\"docs/brand/message.svg\":3,\"docs/brand/miniapp.html\":22,\"docs/brand/star5.svg\":3,\"docs/brand/voiceover.tsv\":7,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":11,\"docs/vids/askswarm-demo-silent.mp4\":9487,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7161,\"docs/vids/scene6.mp4\":331,\"docs/vids/scene7.mp4\":178,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":28,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/telegram.ts\":24,\"functions/wagers.ts\":60,\"launch.json\":14,\"lib/answers.json\":1,\"lib/bot.ts\":281,\"lib/hfsync.ts\":49,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":31,\"packages/cpay/src/index.ts\":481,\"packages/imd/src/index.ts\":235,\"packages/imd/src/intake.ts\":133,\"public/ai.svg\":6,\"public/answers.html\":83,\"public/apple-touch-icon.png\":53,\"public/data.svg\":5,\"public/favicon-32.png\":8,\"public/favicon.svg\":7,\"public/fonts/Battlefin-Black.otf\":864,\"public/fonts/NB_International_Bold_Webfont.ttf\":2797,\"public/fonts/NB_International_Mono_Webfont.ttf\":2749,\"public/fonts/NB_International_Regular_Webfont.ttf\":2728,\"public/imd.html\":107,\"public/index.html\":172,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/message.svg\":3,\"public/og.png\":1364,\"public/pay.html\":40,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":175,\"script/Deploy.s.sol\":23,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/launch.ts\":65,\"scripts/spike-sepolia.ts\":50,\"scripts/spike.ts\":58,\"scripts/train-risk.ts\":41,\"scripts/vercel-env.sh\":13,\"src/AskSwarmRegistry.sol\":493,\"src/IIntake.sol\":55,\"src/SwarmMarket.sol\":263,\"src/SwarmWager.sol\":263,\"test/AskSwarmRegistry.t.sol\":643,\"test/AskSwarmRegistryAdversarial.t.sol\":269,\"test/AskSwarmRegistryCallbacks.t.sol\":610,\"test/AskSwarmRegistryIndexInvariant.t.sol\":396,\"test/AskSwarmRegistryInvariant.t.sol\":488,\"test/AskSwarmRegistryPayments.t.sol\":261,\"test/AskSwarmRegistryReview.t.sol\":319,\"test/OracleConsumerConformance.t.sol\":104,\"test/SwarmMarket.t.sol\":285,\"test/SwarmMarketDeployment.t.sol\":73,\"test/SwarmMarketReview.t.sol\":549,\"test/SwarmWager.t.sol\":267,\"test/TESTING.md\":83,\"test/helpers/RegistryTestSupport.sol\":289,\"test/mocks/IntakeMocks.sol\":100,\"tsconfig.json\":8,\"vercel.json\":11},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ef34e569da23cc2435ffe6ed4c23320728bc9638492855c4f53df5f649382925","verifiedTreeHash":"0afe9e9b9171eabc798cf5f3f18ab1db42b91049","verifierVersion":"0.1.0+fddeb651"}]}