{"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":"dffc8efb-80a1-4774-9720-440834a61b82","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"60b3d7b7f8d9c9723f46d7999a83046047e5ec6b1a07a8138a4efe1e7d9d2de9","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":"7e72eb9d890661e95f8d15fe79d1e33aee05c6f9d2ff3e2d2dd080de565f9f58","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":"b7288a43de586767b3b21a5965dc000cda7bde93dfb3a191cb783f5197f688e6","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":"6580b46f6f1d523f463a9c65e1f8627f71887ab68c3ab3aa581eaaaf44e8ec8e","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":"fcd43377ce40eb423fb838fb5fab01d0cc827852fd022780b59bd06f5d5fb6bb","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":"6639a0f5013728417ec2463c96e6c3ee7995dcf2aad8bd735b35153182c80aa5","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":"082cd4d0a122e7402fda2cd403136dd97238543ba1ad6398f7c9a116cb9cf76e","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":"ece2c5a2b51df78e9538a89e490168e4c8c4df034536dc4e495aeaee48183f66","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"cdc8a0c1b04c032c8cde66036e735b43a9d3a73e6cd9c1268a8a1b38b571c1c3","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 the three AskSwarm contracts on Robinhood Chain (chainId 4663), unchanged if they pass review. Foundry project at the repo root. These exact contracts were each audited and deployed on Ethereum mainnet through earlier IMD launches (#2099 AskSwarmRegistry, #2190 SwarmMarket, #2189 SwarmWager); their adaptation notes are in contracts/ADAPTATION-2099.md, ADAPTATION-2190.md and ADAPTATION-2189.md. This launch puts the same system on Robinhood Chain.\n\nDeploy in this order, in one launch:\n1. AskSwarmRegistry (src/AskSwarmRegistry.sol), constructor (address intake, address imd, address signer) = (0xa43e6f75ee006411f79ac1c84120606c2330de82, 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, 0x5598aa9146215bc13eb26f2c692ad1461fd32982). Intake v2 and the oracle attester are the same on Robinhood Chain; 0x5f7b… is IMD on Robinhood Chain.\n2. SwarmMarket (src/SwarmMarket.sol), constructor (address registry, address imd, address treasury) = ($contract:AskSwarmRegistry, 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, 0x571e17b13d8f6492bbc372a160520b20bfda320c). The treasury is AskSwarm's operating wallet, which pays for free asks.\n3. SwarmWager (src/SwarmWager.sol), constructor (address registry, address imd) = ($contract:AskSwarmRegistry, 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127).\n\nWhat they do: the registry pays Intake v2 for an oracle.request with itself as callback, verifies the attester's EIP-712 signature under its own domain (chain id 4663, the registry's address), requires agreed >= quorum and a strict majority, and stores answers by questionHash. SwarmMarket runs parimutuel yes/no markets settled only from the registry's verified bool answers, 2% fee on the losing pool split creator/treasury, 1h resolve window, voids on any non-answer. SwarmWager runs 1v1 yes/no bets settled the same way. None has an owner, admin, upgrade path or ETH handling; constructors make no external calls; tests are in test/.\n\nPart of AskSwarm (github.com/ChromiaAgents/askswarm).","parentJobId":null,"planHash":"0e64836d8b0deb1a3e1e1a92612f3b6947aa7bbfda4ab6d2efb6ea260c4d4877","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"dffc8efb-80a1-4774-9720-440834a61b82","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2223-src-askswarmregistry-sol-src-swarmmarket"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51245","feedbackHash":"1301b8689228cfa8e2c192086eb6a8a5fda5fce99e064578cc6b11c0ca409f92","nodeKey":"adapt_contract_project","submissionHash":"b1ac15c9bb9ccebfff0dcee32d8e80cbfad8d7ed64fbdbdd9b9a23c882d3f0d7","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51428","feedbackHash":"74931f95f09e27ffaa3e54e500607f45f970df3e770dd172c894afc9bd1d2531","nodeKey":"adapt_contract_project","submissionHash":"60b3d7b7f8d9c9723f46d7999a83046047e5ec6b1a07a8138a4efe1e7d9d2de9","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51214","feedbackHash":"c7ca0b68e186c76146c980799eb70fcc28ab4f7126120e7145f5d250624575c3","nodeKey":"audit_economics","submissionHash":"7e72eb9d890661e95f8d15fe79d1e33aee05c6f9d2ff3e2d2dd080de565f9f58","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52391","feedbackHash":"e7dbe5c4ab457dd20f7e205327217c662258f367e6ae10b429fe0f48201bab69","nodeKey":"audit_flow","submissionHash":"b7288a43de586767b3b21a5965dc000cda7bde93dfb3a191cb783f5197f688e6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51245","feedbackHash":"74a5f16989d7654ddd987197833c83a5ca49a6ae6daf52af8c3130080317cb06","nodeKey":"audit_imported_code","submissionHash":"6580b46f6f1d523f463a9c65e1f8627f71887ab68c3ab3aa581eaaaf44e8ec8e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53911","feedbackHash":"ecad83ea9875d2d519eabd45a0c5b7907278e251ccf4ad85260be57d45934715","nodeKey":"audit_judge","submissionHash":"cfb6d509871ff23b750031194e76fd687028863378048db789a9f719c22c09e6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52150","feedbackHash":"28e3d961c625b40b47fcc28c940dc81cffdec5103859dc8d96ababf4374243e7","nodeKey":"audit_judge","submissionHash":"fcd43377ce40eb423fb838fb5fab01d0cc827852fd022780b59bd06f5d5fb6bb","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51139","feedbackHash":"7e79d563345f379124e37f3a5d181d4dcd2d4e69e98dfd8b8b695f18f8aaae07","nodeKey":"audit_math","submissionHash":"6639a0f5013728417ec2463c96e6c3ee7995dcf2aad8bd735b35153182c80aa5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52173","feedbackHash":"1f893fc058ff5805ba2b1437b49f5b8e562d4720eca155aba64432500cc665aa","nodeKey":"audit_permissions","submissionHash":"082cd4d0a122e7402fda2cd403136dd97238543ba1ad6398f7c9a116cb9cf76e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51485","feedbackHash":"51600ba03523f3c1de0af88a3d8989a750d80087e489b44d165acdb964968522","nodeKey":"manifest","submissionHash":"ece2c5a2b51df78e9538a89e490168e4c8c4df034536dc4e495aeaee48183f66","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51876","feedbackHash":"2f4bace196e1ba69df3982dab3c6f29ce7ee6d3c8d9450164a25d2605bc3eb89","nodeKey":"manifest","submissionHash":"15349f91e383d9497c5cfcb5ff64b854edb6e1939dd0e075ca24d1fbe889f669","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51016","feedbackHash":"0230ae91f0bc6823f964e7c39d4c12be1be62b72ae9f833030bb436101565774","nodeKey":"write_foundry_tests","submissionHash":"d11717693a623c332140cca24da8f9528d63e4035a75d35e5cec1fede15b277c","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52642","feedbackHash":"1e87e04b1cdad3bedd0907ac3a54978d9677685deea6c0f6312d6a2d42e5434f","nodeKey":"write_foundry_tests","submissionHash":"cdc8a0c1b04c032c8cde66036e735b43a9d3a73e6cd9c1268a8a1b38b571c1c3","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"4bbe8fb4cebcd5b7d4e4e9100efb802b0a0f53d04d18b0da4422ee8a12f1f28a","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c2e167266d13dcf4","findings":[{"citation":"resolved","description":"Pair: SwarmMarket.open (src/SwarmMarket.sol:113, `body.length > MAX_BODY_BYTES` -> BadTerms, added for finding a6554325c3be) vs SwarmWager.create (src/SwarmWager.sol:139), which only refuses an empty body. The live Intake v2 `_request` (verified source at 0xa43e6f75ee006411f79ac1c84120606c2330de82, same code on Robinhood Chain) reverts `BodyTooLong` for any body over 16,384 bytes, so a wager whose stored body is longer can never pass `resolve`: AskSwarmRegistry.askAtMost forwards the stored body and Intake reverts every time, at every price. Once a counterparty has joined, no party can `cancel` (state is Matched), `resolve` always reverts, and `abandon` is refused until `resolveAfter + ANSWER_WINDOW` (3 days). The creator chooses the body and so chooses this outcome; the counterparty, who agreed to a wager that was supposed to be decidable at `resolveAfter`, has their stake frozen for three extra days with no action available. Trust/asymmetry lens: the creator alone writes the input that decides whether the shared escrow can ever be released on time, and the sibling contract already treats that input as invalid at entry. Impact is a bounded lock (no loss, no fee taken, stakes fully refunded by `abandon`), hence low. Fix preserving the design: add `|| body.length > 16_384` (a `MAX_BODY_BYTES` constant mirroring SwarmMarket) to the BadTerms condition in `create`.","line":139,"path":"src/SwarmWager.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 {SwarmMarket} from \"src/SwarmMarket.sol\";\nimport {SwarmWager} from \"src/SwarmWager.sol\";\n\n/// Minimal ERC-20 for the IMD stand-in.\ncontract CapToken {\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        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        uint256 a = allowance[from][msg.sender];\n        require(a >= amount, \"allowance\");\n        if (a != type(uint256).max) allowance[from][msg.sender] = a - amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// Intake v2 as the verified source behaves at `_request`: a body over MAX_BODY_BYTES reverts\n/// `BodyTooLong` (src/Intake.sol on eth.blockscout.com, same address on Robinhood Chain).\ncontract CapIntake {\n    uint256 public constant MAX_BODY_BYTES = 16_384;\n    bytes32 public constant ACTION = bytes32(\"oracle.request@oracle-1\");\n    uint256 public constant PRICE = 0.5 ether;\n    address public immutable imd;\n    uint256 internal nonce;\n\n    error BodyTooLong(uint256 length);\n    error ActionNotSold(bytes32 action, address asset);\n\n    struct Callback {\n        address target;\n        bytes4 selector;\n    }\n\n    constructor(address imd_) {\n        imd = imd_;\n    }\n\n    function priceOf(bytes32 action, address asset) public view returns (uint256) {\n        return action == ACTION && asset == imd ? PRICE : 0;\n    }\n\n    function requestWithFailure(bytes32 action, bytes calldata body, Callback calldata, bytes4, address asset, uint256 amount)\n        external\n        payable\n        returns (bytes32 requestId)\n    {\n        uint256 price = priceOf(action, asset);\n        if (price == 0) revert ActionNotSold(action, asset);\n        require(amount >= price, \"PriceNotMet\");\n        if (body.length > MAX_BODY_BYTES) revert BodyTooLong(body.length);\n        requestId = keccak256(abi.encode(block.chainid, address(this), ++nonce));\n        require(CapToken(asset).transferFrom(msg.sender, address(this), amount), \"pull\");\n    }\n\n    function requests(bytes32) external pure returns (address, address, bytes4, bool) {\n        return (address(0), address(0), bytes4(0), false);\n    }\n}\n\n/// SwarmMarket.open refuses a body Intake can never accept (MAX_BODY_BYTES, finding a6554325c3be);\n/// SwarmWager.create does not, so a creator can match a wager that `resolve` can never buy and the\n/// counterparty's stake is held until `abandon` opens, ANSWER_WINDOW after `resolveAfter`.\ncontract WagerBodyCapTest is Test {\n    uint64 constant START = 1_800_000_000;\n    address alice = makeAddr(\"alice\");\n    address bob = makeAddr(\"bob\");\n    address treasury = makeAddr(\"treasury\");\n\n    CapToken token;\n    CapIntake intake;\n    AskSwarmRegistry registry;\n    SwarmMarket market;\n    SwarmWager wager;\n\n    function setUp() public {\n        vm.warp(START);\n        token = new CapToken();\n        intake = new CapIntake(address(token));\n        registry = new AskSwarmRegistry(address(intake), address(token), makeAddr(\"signer\"));\n        market = new SwarmMarket(address(registry), address(token), treasury);\n        wager = new SwarmWager(address(registry), address(token));\n        token.mint(alice, 100 ether);\n        token.mint(bob, 100 ether);\n        vm.prank(alice);\n        token.approve(address(wager), type(uint256).max);\n        vm.prank(alice);\n        token.approve(address(market), type(uint256).max);\n        vm.prank(bob);\n        token.approve(address(wager), type(uint256).max);\n    }\n\n    /// The market side of the pair: the same body is refused up front, before any stake is taken.\n    function test_marketRefusesBodyIntakeCannotAccept() public {\n        vm.prank(alice);\n        vm.expectRevert(SwarmMarket.BadTerms.selector);\n        market.open(new bytes(16_385), START + 1 hours, START + 2 hours);\n    }\n\n    /// Fails on the current code: `create` accepts the 16,385-byte body, bob's 3 IMD are pulled on\n    /// `join`, every `resolve` reverts `BodyTooLong` at Intake, and the only exit is `abandon`\n    /// 3 days after `resolveAfter`. Passes once `create` refuses the body as `open` does.\n    function test_wagerRefusesBodyIntakeCannotAccept() public {\n        bytes memory body = new bytes(16_385);\n        vm.prank(alice);\n        vm.expectRevert(SwarmWager.BadTerms.selector);\n        wager.create(body, true, 3 ether, START + 1 hours, START + 2 hours);\n    }\n\n    /// Documents the lock the missing check allows (passes on the current code, kept for the record).\n    function test_currentBehaviourLocksCounterpartyUntilAbandon() public {\n        bytes memory body = new bytes(16_385);\n        vm.prank(alice);\n        uint256 id = wager.create(body, true, 3 ether, START + 1 hours, START + 2 hours);\n        vm.prank(bob);\n        wager.join(id);\n        assertEq(token.balanceOf(bob), 97 ether);\n\n        vm.warp(START + 2 hours);\n        vm.expectRevert(abi.encodeWithSelector(CapIntake.BodyTooLong.selector, 16_385));\n        wager.resolve(id);\n\n        // Nothing bob can do for three days: resolve reverts, abandon is too early, no cancel once matched.\n        vm.warp(START + 2 hours + 3 days);\n        vm.expectRevert(SwarmWager.TooEarly.selector);\n        wager.abandon(id);\n        vm.expectRevert(abi.encodeWithSelector(SwarmWager.WrongState.selector, SwarmWager.State.Matched));\n        wager.cancel(id);\n\n        vm.warp(START + 2 hours + 3 days + 1);\n        wager.abandon(id);\n        assertEq(token.balanceOf(bob), 100 ether);\n    }\n}","reproduction":"State: fresh deployment, alice and bob hold IMD and approved SwarmWager. 1) alice: create(new bytes(16385), true, 3e18, T+1h, T+2h) -> succeeds (expected: BadTerms, as SwarmMarket.open gives for the same body). 2) bob: join(id) -> 3 IMD pulled, state Matched. 3) at T+2h anyone: resolve(id) -> reverts BodyTooLong(16385) from Intake, for every call at every time. 4) at T+2h+3d: abandon(id) -> TooEarly; cancel(id) -> WrongState(Matched). 5) at T+2h+3d+1s: abandon(id) succeeds and bob gets 3 IMD back. Expected: step 1 refuses the body so bob's stake is never taken; actual: bob's stake is locked from step 2 until step 5. Proof test test/scratch/WagerBodyCap.t.sol: test_wagerRefusesBodyIntakeCannotAccept fails on the current code (create does not revert); test_currentBehaviourLocksCounterpartyUntilAbandon documents the lock; test_marketRefusesBodyIntakeCannotAccept shows the market side of the pair rejecting the same body.","severity":"low","snippet":"            body.length == 0 || stake == 0 || joinBy <= block.timestamp || resolveAfter < joinBy","title":"SwarmWager.create accepts a body Intake can never take; the matched counterparty's stake is held until abandon (asymmetric with SwarmMarket.open's MAX_BODY_BYTES check)"},{"citation":"resolved","description":"Pair: SwarmMarket.settle voids any answer whose signed `issuedAt` is after `askedAt + ANSWER_WINDOW` (src/SwarmMarket.sol:208, `if (a.issuedAt > deadline) return _void(m, id, 22);`, added for finding c7f7d6ef887a so that a late-issued answer gives the same payout in either transaction order). SwarmWager.settle (src/SwarmWager.sol:246) has no such bound: a verified bool answer pays the pot whenever it is on record, however late it was issued, while a Pending record after the window refunds both. So for the same oracle event (answer issued and delivered after the three-day window) the two sibling contracts behave differently, and in SwarmWager the payout depends on ordering: the party the answer goes against can call `settle` first and take a full refund instead of losing the stake, while if the writer's `complete` lands first the other party takes the whole pot. Anyone may call settle, so the race is between the two parties and the writer. The contract's NatSpec documents this as a race to settlement and launch #2189 accepted it (tests test_lateAnswerBeforeTimeoutSettlementStillPaysWinner and test_timeoutSettlementBeforeLateAnswerRemainsRefunded record both orderings), so this is reported as an asymmetry between the two settled-the-same-way contracts the brief describes, not as a new bypass. Precondition is abnormal (the swarm answering more than three days late), so impact is low. A fix that preserves the design mirrors the market: refund with a distinct reason when `a.issuedAt > askedAt + ANSWER_WINDOW`.","line":246,"path":"src/SwarmWager.sol","reproduction":"State: matched wager, alice Yes, bob No, 3 IMD each, resolve at time R so askedAt = R. Oracle answer Yes is issued and delivered at R + 3 days + 1 (issuedAt = R + 3d + 1). Order A: writer's Intake.complete lands, then anyone calls settle -> alice is paid 6 IMD, bob loses 3 (test_lateAnswerBeforeTimeoutSettlementStillPaysWinner). Order B: bob calls settle at R + 3d + 1 before the completion lands -> both refunded 3 IMD, and the later delivery is irrelevant (test_timeoutSettlementBeforeLateAnswerRemainsRefunded). Same inputs and timestamps, two different payouts, chosen by whoever lands first. In SwarmMarket the same answer (issuedAt > deadline) voids in both orders (reason 22). Expected per the brief ('SwarmWager runs 1v1 yes/no bets settled the same way'): one deterministic outcome; actual: order-dependent.","severity":"low","snippet":"        bool usable = k.status == IAskSwarmRegistry.Status.Answered && a.verified && a.answerType == BOOL","title":"SwarmWager.settle lacks SwarmMarket.settle's signed-issuedAt bound: after ANSWER_WINDOW the same late answer pays the winner or refunds both depending on which transaction lands first"}],"hash":"082cd4d0a122e7402fda2cd403136dd97238543ba1ad6398f7c9a116cb9cf76e","nodeId":"cf8cd35b-ecaa-4a93-b816-f060a001bb8a","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. Only that file and my scratch test under `test/scratch/` were written.\n\n**Outcome: no critical, high or medium defects in the Access Control, Trust Gap or Asymmetry areas.** The three contracts have no owner, admin, upgrade path or ETH handling, every state-changing entry point has the guard its effect needs, and the oracle hooks are restricted to Intake with Pending-only settlement. I verified the launch inputs against the live Robinhood Chain: chain id 4663, Intake v2 has code and prices the oracle action at 0.5 IMD for the brief's IMD address, that IMD token is a LayerZero OFT with plain ERC-20 transfer semantics, and the signer and treasury are plain accounts. The verified Intake source confirms the model the registry relies on: `complete` is writer-only, failure arguments are bound to the request id, and status-0 arguments are forwarded unchecked, which the registry's `AlreadySettled` guard handles.\n\nTwo low findings, both asymmetries between the sibling contracts:\n\n- **SwarmWager.create has no body-size cap** while SwarmMarket.open rejects bodies over Intake's 16,384-byte limit. A creator-chosen oversized body makes every `resolve` revert at Intake, so a joined counterparty's stake is held until `abandon` opens three days after `resolveAfter`. Reproduced with a scratch Foundry test that fails on the current code and documents the lock; attached as proof.\n- **SwarmWager.settle lacks the signed-issuedAt bound** SwarmMarket.settle applies, so a late answer pays the winner or refunds both depending on whether `settle` or the writer's delivery lands first. The contract documents this race and launch #2189 accepted it, so I flagged it as an asymmetry against the market's fixed rule, not as a new bypass.\n\nThe coverage record answers all 20 entry points plus three invariant and trust-assumption rows. The already-documented trust assumptions (writer pairing of answers to asks, single signer key, creator-written questions) were checked for unprivileged paths and none were found. The six relevant existing suites run green at 119 tests.","treeHash":null,"usage":{"cachedInputTokens":2119722,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":41507,"runtime":"claude","turns":40,"wallClockMs":691019}},{"artifacts":[],"attempt":1,"bundleHash":"a62848e10d216c83f6898259aefc8076d256deb9cf98b28f01fd1a526a730ecd","device":"d03fc84904b54d9e","findings":[],"hash":"15349f91e383d9497c5cfcb5ff64b854edb6e1939dd0e075ca24d1fbe889f669","nodeId":"e24017d5-b3a1-42de-b1f2-388f83fd1592","outcome":"completed","summary":"Build and tests pass, and only launch.json changed. The checks I needed were the manifest validation, the build, the test run and the git status, and all four are done.\n\nDone. I wrote `launch.json` for the Robinhood Chain launch and verified it.\n\n**What the manifest contains**\n- **AskSwarmRegistry** with static arguments: Intake v2, the Robinhood Chain IMD token, and the attester signer, matching the brief and the three-address constructor in src/AskSwarmRegistry.sol.\n- **SwarmMarket** with the registry reference, the same IMD token, and the treasury wallet the brief names, written as a static address since the brief states it.\n- **SwarmWager** with the registry reference and the same IMD token.\n- **Notes** describing each contract's purpose, the EIP-712 domain pinned to chain 4663, and the absence of any owner, admin, upgrade path, ETH handling or external calls in constructors.\n\n**Verification**\n- The manifest has exactly the keys kind, contracts and notes, every argument is a string, all contract references point backward to an earlier entry, no argument is zero, and the notes fit the character limit.\n- Constructor argument counts and order match each accepted contract's constructor declaration.\n- The existing test in test/RobinhoodChainLaunch.t.sol already rehearses this exact deployment on an empty chain 4663 through one factory call, and it passes.\n\n```\nforge build: ok\nforge test (FOUNDRY_FUZZ_SEED=0x2f3d…fc99): 220 passed, 0 failed, 1 skipped across 22 suites\ngit status: only launch.json added\n```\n\nNo file other than launch.json was changed.","treeHash":"e6a0843cabaaa6bdbe5c0910db6e8a4f36cf9222","usage":{"cachedInputTokens":241967,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":3687,"runtime":"claude","turns":7,"wallClockMs":362577}},{"artifacts":[],"attempt":1,"bundleHash":"56c390a7f2183559cfd3bd14976e72e60219fb159b2797209a1bbdeb3f51a798","device":"bc1e515ca5c78ac4","findings":[],"hash":"60b3d7b7f8d9c9723f46d7999a83046047e5ec6b1a07a8138a4efe1e7d9d2de9","nodeId":"4cb4f537-a77c-44a0-bca1-8dd1c4d1451c","outcome":"completed","summary":"I fixed both medium findings. A blocked creator, treasury or other party can no longer freeze anyone else's IMD on Robinhood Chain. `forge build` succeeds, and `forge test` with the verifier's fuzz seed gives 236 passed, 0 failed, 1 skipped. The skip is the existing test that only runs on a fork. Both proofs the verifier holds this work to, and the earlier `MAX_TERM` proof, now pass.\n\n**The fix (`src/SwarmMarket.sol`, `src/SwarmWager.sol`)**\n- Each payment to a third party is still sent directly. If the token reverts it, as Robinhood IMD does for a blocked address, the amount is recorded in a new `owed(address)` balance and the call carries on. That address collects it later with a new `withdraw()`.\n- This covers:\n  - **Market:** the creator's leftover escrow, the creator's and treasury's fee halves, and the escrow returned when a market voids.\n  - **Wager:** the creator's leftover fee, and both sides' refunds on timeout and on `abandon`.\n- If the token returns `false` or a malformed reply instead of reverting, the whole call still reverts as before. We can't tell whether the tokens moved, so recording them as owed could pay twice; the project's own fault-test token moves the balance and then returns `false`.\n- Market `claim`, the wager winner's payout and `cancel` still send directly, because each only moves the recipient's own money.\n\n**Two smaller fixes in SwarmWager, both reproduced**\n- `create` now rejects a body over 16,384 bytes, the most Intake accepts, as SwarmMarket already does. Such a wager could be joined but never resolved.\n- `cancel` and `abandon` now set the wager's `fee` field to zero after returning the escrow.\n\n**Tests**\n- New `test/BlockedThirdParty.t.sol` and a mock token with a blocklist (`test/mocks/BlockableIMD.sol`).\n- Some existing tests relied on the old behaviour (a failed payment undoing the whole call, the oversized-body lock, `fee` left set after a refund). I replaced or updated those in `SwarmMarketPayments`, `SwarmWagerAtomicity`, `SwarmWagerBoundaries` and the wager invariant model.\n\n**Left unchanged, answered \"disputed\"**\n- **1-hour market resolve window:** the brief sets it, and changing it changes how markets work.\n- **Wager `resolve` and `abandon` both allowed late:** the documented, tested design from the earlier Ethereum launch.\n- **Wager has no late-answer or minimum-panel check:** also the earlier launch's documented design.\n- **Rounding dust:** under one wei per winner stays in a market contract. That is by design; it is now written into the contract's comments.\n\nThe first three are written up in `ADAPTATION.md` for the requester to decide. The answers to all eight findings are in `.imd-responses.json`, and `ADAPTATION.md` and `README.md` describe every change.\n\nRuntime sizes are now 9,524 bytes for the market and 8,059 for the wager, well under the limit. The registry is unchanged. No `launch.json` was written.","treeHash":"353e2181ae43770ed91301daf1d9861d25b61db9","usage":{"cachedInputTokens":2429511,"inputTokens":52,"model":"claude-opus-5-5","outputTokens":29155,"runtime":"claude","turns":29,"wallClockMs":1124579}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"911c99a95f538613","findings":[{"citation":"resolved","description":"`open` bounds `closeAt` only from below and `resolveAfter` only by `resolveAfter >= closeAt`. A creator can open a market that closes in one hour with `resolveAfter = type(uint64).max` (or any value centuries out). Stakes are accepted until `closeAt`; from then on `stake` reverts `Closed`, `resolve` reverts `TooEarly` (`block.timestamp < m.resolveAfter`, line 155) and `abandon` reverts `TooEarly` (`block.timestamp <= resolveAfter + RESOLVE_WINDOW`, line 175) at every timestamp a chain will ever produce; `settle` and `claim` need a phase the market can never reach. The NatSpec invariant 'A market can always be unwound' (line 23) is false, and every IMD staked plus the creator's fee escrow is held by the contract with no exit. The companion contract already treats this as a defect: SwarmWager rejects `resolveAfter > block.timestamp + MAX_TERM` (365 days) after review finding 35c0411f0762 (contracts/ADAPTATION-2189.md), but SwarmMarket received no equivalent bound in launch #2190. The on-chain terms are visible before staking, so this is a griefing/foot-gun that a UI or a careless staker walks into rather than a theft, hence medium. Minimal fix that preserves the design: add `MAX_TERM` to SwarmMarket and revert `BadTerms` when `uint256(resolveAfter) > block.timestamp + MAX_TERM` before pulling the fee escrow.","line":102,"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/// @dev Minimal ERC-20: returns true, no hooks, no fees.\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        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        allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev Registry stub: a fixed price; `askAtMost` is never reached in this proof.\ncontract ProofRegistry {\n    uint256 public price = 0.5 ether;\n\n    function askAtMost(bytes calldata, uint256) external pure returns (bytes32) {\n        revert(\"not reached\");\n    }\n\n    function get(bytes32) external pure returns (IAskSwarmRegistry.Ask memory k, IAskSwarmRegistry.Answer memory a) {}\n}\n\n/// @title A market whose `resolveAfter` lies beyond any reachable time traps every stake\n/// @notice `SwarmMarket.open` bounds `closeAt` only from below and `resolveAfter` only by `closeAt`.\n/// A creator opens a market closing in one hour with `resolveAfter = type(uint64).max`. Stakers on\n/// both sides deposit. From `closeAt` on, `stake` is closed, `resolve` reverts `TooEarly` and\n/// `abandon` reverts `TooEarly` at every timestamp a chain will ever produce: the market can\n/// neither settle nor void, and the stakes and fee escrow are held forever. SwarmWager rejects the\n/// same terms with `MAX_TERM` (ADAPTATION-2189, finding 35c0411f0762); SwarmMarket does not.\n///\n/// Fails on the current code: `open` accepts the terms and neither exit is reachable.\n/// Passes once `open` rejects a `resolveAfter` beyond a bounded horizon (the call reverts), or once\n/// some other exit lets stakers recover their IMD within that horizon.\ncontract SwarmMarketUnreachableTermTest is Test {\n    ProofToken imd;\n    ProofRegistry registry;\n    SwarmMarket market;\n\n    address creator = makeAddr(\"creator\");\n    address alice = makeAddr(\"alice\");\n    address bob = makeAddr(\"bob\");\n    address treasury = makeAddr(\"treasury\");\n\n    uint256 constant STAKE = 100 ether;\n    /// @dev One thousand years from the test clock: far beyond any plausible market, well short of\n    /// the maximum this proof opens with. A market must be unwindable by then.\n    uint256 constant HORIZON = 1000 * 365 days;\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        imd = new ProofToken();\n        registry = new ProofRegistry();\n        market = new SwarmMarket(address(registry), address(imd), treasury);\n        imd.mint(creator, 10 ether);\n        imd.mint(alice, STAKE);\n        imd.mint(bob, STAKE);\n        vm.prank(creator);\n        imd.approve(address(market), type(uint256).max);\n        vm.prank(alice);\n        imd.approve(address(market), type(uint256).max);\n        vm.prank(bob);\n        imd.approve(address(market), type(uint256).max);\n    }\n\n    function test_marketWithUnreachableResolveAfterTrapsStakes() public {\n        uint64 closeAt = uint64(block.timestamp + 1 hours);\n        uint64 resolveAfter = type(uint64).max;\n\n        vm.prank(creator);\n        (bool opened, bytes memory ret) = address(market).call(\n            abi.encodeCall(SwarmMarket.open, (bytes('{\"v\":1,\"question\":\"Will it?\",\"answerType\":\"bool\"}'), closeAt, resolveAfter))\n        );\n        if (!opened) {\n            // The fixed contract refuses the terms before pulling any token: nothing is at risk.\n            assertEq(imd.balanceOf(creator), 10 ether, \"a refused open must pull nothing\");\n            return;\n        }\n        uint256 id = abi.decode(ret, (uint256));\n\n        vm.prank(alice);\n        market.stake(id, true, uint128(STAKE));\n        vm.prank(bob);\n        market.stake(id, false, uint128(STAKE));\n        assertEq(imd.balanceOf(address(market)), 2 * STAKE + 0.5 ether, \"escrow holds both stakes and the fee\");\n\n        // Staking closes; from here the only exits are resolve, abandon or (after Asked) settle.\n        vm.warp(closeAt);\n        vm.prank(alice);\n        vm.expectRevert(SwarmMarket.Closed.selector);\n        market.stake(id, true, 1);\n\n        // Across the whole horizon neither exit opens.\n        uint256[4] memory probes =\n            [uint256(closeAt), uint256(closeAt) + 365 days, block.timestamp + HORIZON, uint256(type(uint64).max) - 1];\n        for (uint256 i; i < probes.length; ++i) {\n            vm.warp(probes[i]);\n            vm.expectRevert(SwarmMarket.TooEarly.selector);\n            market.resolve(id);\n            vm.expectRevert(SwarmMarket.TooEarly.selector);\n            market.abandon(id);\n            vm.expectRevert(abi.encodeWithSelector(SwarmMarket.WrongPhase.selector, SwarmMarket.Phase.Open));\n            market.settle(id);\n            assertEq(market.claimable(id, alice), 0, \"nothing claimable while Open\");\n            assertEq(market.claimable(id, bob), 0, \"nothing claimable while Open\");\n        }\n\n        // The invariant the contract states (\"a market can always be unwound\") does not hold:\n        // every token is still inside the contract one thousand years on.\n        vm.warp(block.timestamp + HORIZON);\n        assertEq(imd.balanceOf(address(market)), 2 * STAKE + 0.5 ether, \"stakes still escrowed\");\n        assertLt(\n            imd.balanceOf(address(market)),\n            2 * STAKE + 0.5 ether,\n            \"market with resolveAfter beyond any reachable time can neither be resolved nor abandoned; stakes are trapped\"\n        );\n    }\n}","reproduction":"1) creator: open(body, closeAt = now + 1h, resolveAfter = type(uint64).max) -> accepted, 0.5 IMD escrow pulled. 2) alice: stake(id, true, 100e18); bob: stake(id, false, 100e18). 3) warp to closeAt: stake reverts Closed. 4) at closeAt, closeAt + 365 days, now + 1000 years and type(uint64).max - 1: resolve(id) reverts TooEarly, abandon(id) reverts TooEarly, settle(id) reverts WrongPhase(Open), claimable(id, alice) == claimable(id, bob) == 0. Expected: within a bounded horizon some exit returns the 200.5 IMD (as SwarmWager guarantees via MAX_TERM) or open refuses the terms. Actual: the contract still holds 200.5 IMD with no reachable exit. Proof: test/scratch/SwarmMarketUnreachableTerm.t.sol fails on the current source with 'market with resolveAfter beyond any reachable time can neither be resolved nor abandoned; stakes are trapped' and passes once open rejects the terms.","severity":"medium","snippet":"        if (body.length == 0 || body.length > MAX_BODY_BYTES || closeAt <= block.timestamp || resolveAfter < closeAt) {\n            revert BadTerms();\n        }","title":"SwarmMarket.open accepts a resolveAfter beyond any reachable time; both stakes and the fee escrow are then trapped forever (SwarmWager fixed the same defect with MAX_TERM)"},{"citation":"resolved","description":"The tree carries the manifest launch #2099 accepted for Ethereum: only AskSwarmRegistry, with imd = 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 and notes that say 'on Ethereum mainnet'. This launch needs three contracts with imd = 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127 and the treasury 0x571e17b13d8f6492bbc372a160520b20bfda320c. Checked against Robinhood Chain (chainId 0x1237 = 4663, public RPC): 0xd34a… has no code there and Intake.priceOf(bytes32(\"oracle.request@oracle-1\"), 0xd34a…) returns 0, while priceOf(..., 0x5f7b…) returns 500000000000000000. The adapter and the manifest step must not copy this file: a registry constructed with the mainnet IMD address on 4663 has price() == 0, so every ask/askAtMost reverts NotSold, SwarmMarket.open reverts BadTerms and SwarmWager.create reverts BadTerms; the deployment would be inert. Not a defect in the Solidity, and not at the repository root, so it does not fail the manifest check by itself; recorded so the adapter writes the root launch.json from LAUNCH-RH.md, not from this file.","line":8,"path":"contracts/launch.json","reproduction":"Deploy AskSwarmRegistry(0xa43e6f75ee006411f79ac1c84120606c2330de82, 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, 0x5598aa9146215bc13eb26f2c692ad1461fd32982) on chain 4663 (the arguments contracts/launch.json holds). Call price(): returns 0 (verified by eth_call on https://robinhood-rpc.publicnode.com). Call ask(body) from an approved EOA: reverts NotSold. Expected for this launch: imd = 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, price() == 0.5e18, three contracts in dependency order.","severity":"info","snippet":"        \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\",","title":"contracts/launch.json is the Ethereum-mainnet manifest (one contract, mainnet IMD 0xd34a…); reusing it on Robinhood Chain would deploy a registry that can never ask"}],"hash":"6580b46f6f1d523f463a9c65e1f8627f71887ab68c3ab3aa581eaaaf44e8ec8e","nodeId":"a2ae67d4-177c-418d-8027-eaeea3d0be8d","outcome":"completed","summary":"Review complete. The findings file is written and validated, and nothing in the tree was changed beyond `.imd-findings.json` and the scratch proof.\n\n**Contracts read in full:** `src/AskSwarmRegistry.sol`, `src/SwarmMarket.sol`, `src/SwarmWager.sol`, `src/IIntake.sol`, plus the launch brief, the three adaptation notes, the pinned protected tests and the oracle-consumer reference. Nothing in scope was unreachable. The full suite passes (209 tests, 1 fork test skipped offline). I also queried Robinhood Chain over a public RPC to check the deployment inputs rather than take the brief's word for them.\n\n**Findings written to `.imd-findings.json`:**\n\n- **Medium, with proof: SwarmMarket has no term bound.** `open` accepts `resolveAfter = type(uint64).max` (or any value centuries out). After `closeAt`, `stake` is closed and both `resolve` and `abandon` revert `TooEarly` at every reachable timestamp, so every stake and the fee escrow are held forever. SwarmWager already rejects this with `MAX_TERM` after the #2189 review finding; SwarmMarket never got the equivalent, and its tests never probe the horizon. `test/scratch/SwarmMarketUnreachableTerm.t.sol` fails on the current source and passes once `open` refuses the terms. Minimal fix: a `MAX_TERM` check in `open`, mirroring SwarmWager.\n- **Info: `contracts/launch.json` is the mainnet manifest.** It lists only the registry with the Ethereum IMD address. On chain 4663 that address has no code and Intake prices it at zero, so a registry built from it could never ask. The adapter must write the root manifest from the brief, not this file.\n\n**Verified on chain 4663 (supports deploying unchanged otherwise):**\n\n- Intake at 0xa43e… is the same code as mainnet, differing only in the cached EIP-712 chain id and domain separator immutables. `requests()` returns the four words `markLost` decodes.\n- IMD at 0x5f7b… is \"Identity.md\" / IMD, 18 decimals, a LayerZero OFT with a standard OZ ERC-20 surface, no pause and no blocklist selectors. Live price for `oracle.request@oracle-1` is 0.5 IMD.\n- Treasury 0x571e… is an EOA on both chains, so fee transfers cannot strand.\n\n**Trust assumptions, unchanged from earlier audits and not re-reported:** the writer's pairing of answers to requests, the single oracle signer key, creators choosing question bodies (including panel size in SwarmWager, which has no floor), and the caller of `resolve` choosing the ask time for relative-window questions. No reentrancy, access-control, rounding, overflow or conservation defects were found; all three contracts are owner-free with no proxies, initializers or forbidden opcodes, and runtime sizes are well under the EIP-170 limit.","treeHash":null,"usage":{"cachedInputTokens":1011220,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":43228,"runtime":"claude","turns":29,"wallClockMs":1005169}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"8d26cb1a4eaeb75a","findings":[{"citation":"resolved","description":"Seam precision x invariant. Each winner's share of the losing pool is floor(y * winnersShare / yesPool), so the sum paid to winners is at most winnersShare and can be short by up to (number of winners - 1) wei. The contract has no owner and no sweep, so that remainder stays in SwarmMarket's IMD balance permanently. The stated invariant 'paid out never exceeds staked' holds (conservation never breaks the other way), and the amount is bounded by one wei per winning address per market, so this is a documented-by-design property rather than a loss, but it is not stated in the contract's invariants list and the existing suites only bound it (assertLe dust). Reported so the author can either state it or accept it.","line":241,"path":"src/SwarmMarket.sol","reproduction":"Chain 4663, mocks for IMD and Intake. creator opens a market; a1, a2, a3 each stake 1 wei on Yes; n1 stakes 100 wei on No. After resolveAfter, resolve(id), the writer delivers a verified bool true (panel 15, quorum 11, agreed 12), settle(id). Expected: fee = 100*200/10000 = 2 (1 to creator, 1 to treasury), winnersShare = 98. Actual claimable(id, a1) = 1 + 1*98/3 = 33 for each of the three winners, 99 wei paid in total; after all three claim, SwarmMarket still holds 2 wei of IMD with claimable(id, *) == 0 for everyone and no function able to move it. Verified with test/scratch/MathSeams.t.sol test_roundingDustIsLockedForever (balance after claims == 2).","severity":"info","snippet":"        if (m.phase == Phase.Yes) return y == 0 ? 0 : y + y * m.winnersShare / m.yesPool;","title":"Parimutuel claim rounding leaves up to (winners-1) wei per settled market locked forever; no sweep path exists"},{"citation":"resolved","description":"Boundary asymmetry between the two consumers of the same registry. SwarmMarket.open rejects body.length > MAX_BODY_BYTES (16_384) with the comment 'a longer one could never be asked'. SwarmWager.create only rejects an empty body, so a wager whose body can never be sent to Intake is created, can be joined, and then every resolve(id) reverts at the transport (the registry forwards the body to Intake, which refuses it). The counterparty's stake is locked from join until abandon becomes allowed at resolveAfter + ANSWER_WINDOW, up to MAX_TERM + 3 days. Funds are not lost (abandon refunds both stakes and the fee), and a careful joiner can read bodyOf before joining, so impact is a griefing/lockup window only. The existing test test_oversizedBodyRejectedByTransportLeavesFeeAndStakesRefundable documents the lockup rather than preventing it.","line":139,"path":"src/SwarmWager.sol","reproduction":"Chain 4663, mocks. bytes memory big = new bytes(16_385). mkt.open(big, now+1h, now+2h) reverts BadTerms. wager.create(big, true, 1 ether, now+1h, now+2h) succeeds (pulls 1.5 IMD), n1 calls join(id) (pulls 1 IMD): SwarmWager holds 2.5 IMD. From resolveAfter every resolve(id) reverts at Intake's body check (RecordingIntake.BodyTooLong in the repo's own helper), so the only exit is abandon(id) once block.timestamp > resolveAfter + 3 days. Expected: create refuses the body like open does. Verified with test/scratch/MathSeams.t.sol test_wagerAcceptsBodyAboveIntakeCap.","severity":"low","snippet":"            body.length == 0 || stake == 0 || joinBy <= block.timestamp || resolveAfter < joinBy","title":"SwarmWager.create accepts bodies above Intake's 16 KiB cap that SwarmMarket.open refuses, so a matched wager can only end by abandon after resolveAfter + 3 days"}],"hash":"6639a0f5013728417ec2463c96e6c3ee7995dcf2aad8bd735b35153182c80aa5","nodeId":"1a615728-0b15-4e80-a60f-5302ead8a026","outcome":"completed","summary":"The review is complete. The findings file is valid, both snippets match the tree, the working tree holds only the ignored output file and my scratch test, and no source or config file was changed.\n\n**Outcome: the math holds.** I traced every arithmetic, cast, window and boundary in all three contracts against the Math Precision, Boundary and Numerical Gap guides and found no loss-of-funds or wrong-recipient defect. The existing suite of 220 tests passes, including the cold-stipend measurement for the registry callback and the uint128 pool maximum.\n\n**Two findings written to `.imd-findings.json`, neither blocking:**\n\n- **Info, SwarmMarket claim rounding dust.** Floor division in the pro-rata share leaves up to one wei per winning address locked in the contract with no sweep path. Reproduced: three 1-wei Yes stakes against 100 wei No leave 2 wei behind after every claim. Conservation never breaks the other way.\n- **Low, SwarmWager body-size asymmetry.** SwarmMarket.open refuses bodies over 16 KiB because Intake can never take them, but SwarmWager.create accepts one. A matched wager on such a body can only be unwound by abandon after resolveAfter plus three days. Stakes are refunded, so this is a lockup window, not a loss.\n\n**Coverage record** has a row for all 20 listed entry points (18 hold, 2 carry the findings above) plus three invariant rows: balance versus liabilities, the 200k callback stipend at the 4096-byte cap (measured 156k cold), and a note that only block.timestamp is used, so Arbitrum-style L1 block numbering on Robinhood Chain affects nothing.\n\n**Not reached in depth:** the Slither reentrancy leads were checked only far enough to confirm state is written before each external call and that IMD has no transfer hooks. Access control, signature replay and the launch manifest belong to the other specialists.","treeHash":null,"usage":{"cachedInputTokens":2132902,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":33686,"runtime":"claude","turns":33,"wallClockMs":647068}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dd2ee4882a1be950","findings":[{"citation":"resolved","description":"resolve is legal only while block.timestamp is in [resolveAfter, resolveAfter + RESOLVE_WINDOW] with RESOLVE_WINDOW = 1 hours (src/SwarmMarket.sol:52), and abandon (line 188) voids the market as soon as that window has passed. The window was introduced for the Ethereum launch (#2190, finding d2521c529966) on the assumption that 'one hour permits ordinary transaction inclusion'. This launch moves the same code to Robinhood Chain, an Arbitrum chain: L2 blocks and their timestamps are produced only by the single sequencer, and a transaction that the sequencer does not include can only be forced in through the L1 delayed inbox after about 24 hours. Arbitrum-family sequencers have had outages longer than an hour (Arbitrum One, 15 Dec 2023, about 78 minutes). If no block with a timestamp inside a market's one-hour window is ever produced, the first block after the gap already satisfies block.timestamp > resolveAfter + 1h, so resolve reverts TooLate forever and the only exit is abandon: the market voids, every stake is refunded, no fee is paid, and the side that would have lost keeps its stake while winners lose the payout the brief promises ('parimutuel markets settled from the registry's verified answers'). Nobody is privileged in this path: anyone can call abandon the moment the window is missed, and the losing side has the incentive to. Economic Security lens: the dependency that fails here is the chain's block production, and the failure is irrecoverable per market. Flow Gap lens (periphery x first principles): every line executes as written, but the end state contradicts the protocol's purpose because the environment the deadline was tuned for changed with this launch. This is a trade-off that needs the requester's decision rather than a silent code change: the fix that preserves intent is to size RESOLVE_WINDOW to the chain's liveness guarantee (at least the 24h forced-inclusion delay, or make the window a creator-chosen term bounded by MAX_TERM), keeping abandon strictly after it so the resolve/abandon race fixed in #2190 (2c68e2c29ddc) stays closed. The same hour window also means markets whose closeAt == resolveAfter give stakers no quiet period, but that is a creator choice.","line":169,"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\ncontract GapToken {\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        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        allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev Registry stand-in: quotes 0.5 IMD, pulls it on askAtMost, never answers (settle is not needed here).\ncontract GapRegistry {\n    GapToken public immutable imd;\n    uint256 public asked;\n\n    constructor(GapToken imd_) {\n        imd = imd_;\n    }\n\n    function price() external pure returns (uint256) {\n        return 0.5 ether;\n    }\n\n    function askAtMost(bytes calldata, uint256 maxPrice) external returns (bytes32 requestId) {\n        require(maxPrice >= 0.5 ether, \"PriceAboveMax\");\n        require(imd.transferFrom(msg.sender, address(this), 0.5 ether), \"pull\");\n        requestId = keccak256(abi.encode(++asked));\n    }\n\n    function get(bytes32) external pure returns (IAskSwarmRegistry.Ask memory k, IAskSwarmRegistry.Answer memory a) {\n        k.asker = address(1);\n        k.status = IAskSwarmRegistry.Status.Pending;\n    }\n}\n\n/// @notice Robinhood Chain is an Arbitrum chain: L2 blocks exist only when the sequencer produces them,\n/// and a sequencer outage of more than an hour (or any hour without a block that a user could land a\n/// transaction in) means no block carries a timestamp inside [resolveAfter, resolveAfter + 1h].\n/// Forced inclusion through the L1 delayed inbox takes 24 hours, so a user cannot route around it.\n/// A two-sided market whose window falls in such a gap can never be resolved: the first block after\n/// the gap is already past RESOLVE_WINDOW, so `resolve` reverts TooLate and only `abandon` is left,\n/// which voids the market and refunds the side that would have lost.\n/// This test fails on the current code (the resolve at resolveAfter + 2h reverts TooLate) and passes\n/// once the window covers the chain's liveness gap (e.g. 24h+) or resolve stays legal until abandoned.\ncontract MarketResolveWindowGapTest is Test {\n    GapToken imd;\n    GapRegistry registry;\n    SwarmMarket market;\n    address creator = makeAddr(\"creator\");\n    address treasury = makeAddr(\"treasury\");\n    address yesSide = makeAddr(\"yes\");\n    address noSide = makeAddr(\"no\");\n\n    function setUp() public {\n        vm.chainId(4663);\n        vm.warp(1_800_000_000);\n        imd = new GapToken();\n        registry = new GapRegistry(imd);\n        market = new SwarmMarket(address(registry), address(imd), treasury);\n        for (uint256 i; i < 3; ++i) {\n            address who = i == 0 ? creator : i == 1 ? yesSide : noSide;\n            imd.mint(who, 1_000 ether);\n            vm.prank(who);\n            imd.approve(address(market), type(uint256).max);\n        }\n    }\n\n    function test_marketWhoseResolveWindowFallsInABlockGapCanStillBeResolved() public {\n        uint64 closeAt = uint64(block.timestamp + 1 hours);\n        uint64 resolveAfter = uint64(block.timestamp + 2 hours);\n        vm.prank(creator);\n        uint256 id = market.open(bytes('{\"v\":1,\"question\":\"Did X happen?\",\"answerType\":\"bool\"}'), closeAt, resolveAfter);\n        vm.prank(yesSide);\n        market.stake(id, true, 100 ether);\n        vm.prank(noSide);\n        market.stake(id, false, 100 ether);\n\n        // The last block before the window, then the sequencer is down: the next block the chain\n        // produces is an hour and a second past resolveAfter + RESOLVE_WINDOW.\n        vm.warp(resolveAfter - 1);\n        vm.expectRevert(SwarmMarket.TooEarly.selector);\n        market.resolve(id);\n        vm.warp(resolveAfter + 2 hours);\n\n        // Expected: a fully staked market with an available oracle can still be resolved.\n        // Actual on the current code: TooLate; the only exit is abandon, which voids the market.\n        market.resolve(id);\n        (SwarmMarket.Market memory m,) = market.get(id);\n        assertEq(uint8(m.phase), uint8(SwarmMarket.Phase.Asked), \"market was not asked\");\n    }\n}","reproduction":"State: market id 1 opened on chain 4663 with closeAt = T+1h, resolveAfter = T+2h, body a bool question; yes side staked 100 IMD, no side staked 100 IMD; registry price 0.5 IMD, escrow 0.5 IMD. Blocks: the last block before resolveAfter (timestamp resolveAfter - 1), then no block until timestamp resolveAfter + 2h (sequencer gap). Calls: resolve(1) at resolveAfter + 2h. Expected: the fully staked market with an available oracle is asked (phase Asked) and later settled. Actual: resolve reverts TooLate(); abandon(1) succeeds, phase becomes Void, claimable(1, yes) = claimable(1, no) = 100 IMD, the 0.5 IMD escrow returns to the creator, the swarm is never asked. Scratch test test/scratch/MarketResolveWindowGap.t.sol: test_marketWhoseResolveWindowFallsInABlockGapCanStillBeResolved fails with TooLate() on the current code. Any market whose window falls in a gap of 1h+1s or more between consecutive L2 block timestamps behaves this way.","severity":"low","snippet":"        if (block.timestamp > uint256(m.resolveAfter) + RESOLVE_WINDOW) revert TooLate();","title":"SwarmMarket's 1-hour resolve window assumes a block can always be landed inside it; on Robinhood Chain (an Arbitrum chain with one sequencer and 24h forced inclusion) a block gap over the window makes"},{"citation":"resolved","description":"resolve only checks block.timestamp >= resolveAfter (line 205) and never an upper bound; abandon (line 224) opens at resolveAfter + ANSWER_WINDOW + 1 and refunds both stakes. From that second on the two exits overlap on a Matched wager, and the first transaction to land decides whether the swarm settles the bet or it is unwound. The party who believes it lost calls abandon and keeps its stake; the party who believes it won calls resolve. With no mempool visibility on an Arbitrum sequencer this is a pure race, and either party can also have been waiting deliberately: because resolve is unbounded, the resolver chooses when the fixed body is sent to the oracle, which changes the answer for questions with a relative window (the 905d4059dc0f limitation). SwarmMarket closed exactly this pair of issues in launch #2190 with RESOLVE_WINDOW and an abandon that opens strictly after it (ADAPTATION-2190: 2c68e2c29ddc, d2521c529966). The SwarmWager launch #2189 and the #2190 revision left SwarmWager unchanged with the recorded reason that it was already live on Ethereum ('Recorded for a successor'). This launch deploys SwarmWager fresh on Robinhood Chain, so that reason no longer applies and the asymmetry between the two contracts built on the same registry is now a choice the requester should make explicitly. Economic Security lens: the party with the losing position has a free option (abandon) worth its full stake once three days pass without a resolve; the other party must pay gas to resolve within three days to keep the bet alive, and if the price rose above the escrow the loser can also simply refuse to top up and wait. Invariant lens: 'each wager pays out exactly once' holds, but 'a matched wager is settled by the swarm' is only true if the winner acts first. A fix preserving intent mirrors SwarmMarket: a resolve window after resolveAfter (sized for the chain's liveness, see finding 1) with abandon strictly after it.","line":205,"path":"src/SwarmWager.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SwarmWager, IAskSwarmRegistry} from \"src/SwarmWager.sol\";\n\ncontract OverlapToken {\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        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        allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev Registry stand-in: quotes 0.5 IMD, pulls it on askAtMost, leaves every ask Pending.\ncontract OverlapRegistry {\n    OverlapToken public immutable imd;\n    uint256 public asked;\n\n    constructor(OverlapToken imd_) {\n        imd = imd_;\n    }\n\n    function price() external pure returns (uint256) {\n        return 0.5 ether;\n    }\n\n    function askAtMost(bytes calldata, uint256 maxPrice) external returns (bytes32 requestId) {\n        require(maxPrice >= 0.5 ether, \"PriceAboveMax\");\n        require(imd.transferFrom(msg.sender, address(this), 0.5 ether), \"pull\");\n        requestId = keccak256(abi.encode(++asked));\n    }\n\n    function get(bytes32) external pure returns (IAskSwarmRegistry.Ask memory k, IAskSwarmRegistry.Answer memory a) {\n        k.asker = address(1);\n        k.status = IAskSwarmRegistry.Status.Pending;\n    }\n}\n\n/// @notice SwarmWager.resolve has no upper time bound and SwarmWager.abandon opens at\n/// resolveAfter + ANSWER_WINDOW + 1, so from that second on both are legal on the same matched wager.\n/// Whichever lands first decides whether the bet is settled by the swarm or unwound: the party who\n/// expects to lose calls abandon and gets its stake back; the party who expects to win calls resolve.\n/// SwarmMarket already closes this race with RESOLVE_WINDOW (resolve and abandon have disjoint windows).\n/// This test fails on the current code (both calls succeed from the same state at the same timestamp)\n/// and passes once the two exits have disjoint windows, as in SwarmMarket.\ncontract WagerResolveAbandonOverlapTest is Test {\n    OverlapToken imd;\n    OverlapRegistry registry;\n    SwarmWager wager;\n    address alice = makeAddr(\"alice\");\n    address bob = makeAddr(\"bob\");\n\n    function setUp() public {\n        vm.chainId(4663);\n        vm.warp(1_800_000_000);\n        imd = new OverlapToken();\n        registry = new OverlapRegistry(imd);\n        wager = new SwarmWager(address(registry), address(imd));\n        imd.mint(alice, 1_000 ether);\n        imd.mint(bob, 1_000 ether);\n        vm.prank(alice);\n        imd.approve(address(wager), type(uint256).max);\n        vm.prank(bob);\n        imd.approve(address(wager), type(uint256).max);\n    }\n\n    function test_resolveAndAbandonAreNeverBothLegalOnTheSameWager() public {\n        uint64 joinBy = uint64(block.timestamp + 1 days);\n        uint64 resolveAfter = uint64(block.timestamp + 2 days);\n        vm.prank(alice);\n        uint256 id = wager.create(bytes('{\"v\":1,\"question\":\"Did X happen?\",\"answerType\":\"bool\"}'), true, 100 ether, joinBy, resolveAfter);\n        vm.prank(bob);\n        wager.join(id);\n\n        // Nobody resolved during the three days after resolveAfter. One second after that, Bob\n        // (who believes he lost) can unwind the bet while Alice can still have it settled.\n        vm.warp(uint256(resolveAfter) + wager.ANSWER_WINDOW() + 1);\n\n        uint256 snap = vm.snapshotState();\n        vm.prank(bob);\n        wager.abandon(id);\n        (SwarmWager.Wager memory afterAbandon,) = wager.get(id);\n        bool abandonLegal = afterAbandon.state == SwarmWager.State.Refunded;\n        assertEq(imd.balanceOf(bob), 1_000 ether, \"bob escaped the bet with his full stake\");\n        vm.revertToState(snap);\n\n        vm.prank(alice);\n        wager.resolve(id);\n        (SwarmWager.Wager memory afterResolve,) = wager.get(id);\n        bool resolveLegal = afterResolve.state == SwarmWager.State.Asked;\n\n        // Expected: exactly one exit is legal at any timestamp. Actual: both are.\n        assertFalse(abandonLegal && resolveLegal, \"resolve and abandon both legal at the same time\");\n    }\n}","reproduction":"State: wager id 1 created by alice (yes, stake 100 IMD, fee 0.5 IMD, joinBy = T+1d, resolveAfter = T+2d), joined by bob (no, 100 IMD). Nobody calls resolve for three days after resolveAfter. At block.timestamp = resolveAfter + 3 days + 1: (a) bob calls abandon(1): succeeds, state Refunded, bob's balance back to 1000 IMD, the swarm is never asked; or (b) from the same state alice calls resolve(1): succeeds, state Asked, 0.5 IMD paid to the registry. Expected: at any timestamp exactly one of resolve/abandon is legal, as in SwarmMarket. Actual: both are, so whichever lands first decides whether the bet is settled or cancelled. Scratch test test/scratch/WagerResolveAbandonOverlap.t.sol: test_resolveAndAbandonAreNeverBothLegalOnTheSameWager fails on the current code with 'resolve and abandon both legal at the same time'.","severity":"low","snippet":"        if (block.timestamp < w.resolveAfter) revert TooEarly();","title":"SwarmWager.resolve has no upper time bound, so from resolveAfter + ANSWER_WINDOW + 1 both resolve and abandon are legal on the same matched wager and the party expecting to lose can unwind the bet fir"}],"hash":"7e72eb9d890661e95f8d15fe79d1e33aee05c6f9d2ff3e2d2dd080de565f9f58","nodeId":"6844655e-b34d-45cf-b878-5a917fc7dab4","outcome":"completed","summary":"Review complete. The findings file is at `.imd-findings.json` with two substantiated findings and a coverage row for all 20 entry points plus three invariant rows.\n\n**What I checked**\n\n- All three contracts against the Economic Security, Invariant and Flow Gap guides: value flows, fee math and rounding, conservation per market and wager, state couplings, every exit path, and the three-contract flow through the registry to Intake.\n- Live Robinhood Chain dependencies: Intake quotes 0.5 IMD for the Robinhood IMD and has the same writer and bytecode as mainnet apart from chain-id and domain immutables. IMD is an 18-decimal ERC-20 that returns true on transfer, with no pause. The treasury and signer are EOAs on both chains. ArbOS supports the opcodes the 0.8.26 build emits.\n- The repo suite: 220 tests pass, 1 fork-only skip.\n\n**Findings (both low, both with failing scratch proofs)**\n\n1. SwarmMarket's one-hour resolve window is fragile on an Arbitrum chain. If no L2 block lands inside the window (sequencer outage, with 24h forced inclusion), a fully staked market can never be resolved and `abandon` voids it, refunding the side that would have lost. This is a trade-off the requester must decide, not a silent change.\n2. SwarmWager's `resolve` has no upper bound, so after `resolveAfter` plus three days both `resolve` and `abandon` are legal and the would-be loser can unwind the bet first. This was recorded earlier as \"for a successor\" because SwarmWager was already live; this launch is that fresh deployment.\n\n**Not reported** as defects: the writer-pairing trust assumption, the missing panel floor in SwarmWager, and rounding dust, all previously recorded and accepted or dust-level. No critical or high issue was found; the economics hold within the documented trust assumptions.","treeHash":null,"usage":{"cachedInputTokens":1305708,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":44282,"runtime":"claude","turns":26,"wallClockMs":854265}},{"artifacts":[],"attempt":1,"bundleHash":"c45ef6b644f919bd3621d8544e7c9dd32bb352e2c509b3fa04ff0ebf03047a20","device":"911c99a95f538613","findings":[],"hash":"b1ac15c9bb9ccebfff0dcee32d8e80cbfad8d7ed64fbdbdd9b9a23c882d3f0d7","nodeId":"4cb4f537-a77c-44a0-bca1-8dd1c4d1451c","outcome":"completed","summary":"Done. The three AskSwarm contracts are ready for the Robinhood Chain launch, with one behaviour change required by a reproduced audit finding.\n\n**Audit findings**\n\n- **f8ec801b0e44 (medium), reproduced and fixed.** The supplied proof failed on the original SwarmMarket: `open` accepted `resolveAfter = type(uint64).max`, and from `closeAt` on neither `resolve` nor `abandon` was ever allowed, so both stakes and the fee escrow were trapped. `src/SwarmMarket.sol` now has `MAX_TERM = 365 days` (the same bound SwarmWager already had) and `open` reverts `BadTerms` for a `resolveAfter` past it, before any token moves. The proof passes on the fixed contract.\n- **e842ddc10fde (info), reproduced.** The tree carried launch #2099's Ethereum manifest with the mainnet IMD. It is renamed byte for byte to `contracts/launch-2099.json` so it reads as history. No `launch.json` was written; the manifest step writes it.\n\n**Unchanged for the chain move.** AskSwarmRegistry and SwarmWager are as they arrived. The registry derives its EIP-712 domain from `block.chainid` at construction, nothing in `src/` reads `block.number`, and the price is read from Intake at call time, so none of them needed a change for Robinhood Chain.\n\n**Tests added**\n\n- Five `MAX_TERM` regressions in `test/SwarmMarketReview.t.sol`, including a fuzz showing every accepted term pair can be abandoned within the horizon even with the registry retired or reverting, and a fuzz showing every `resolveAfter` past the bound is refused.\n- `test/RobinhoodChainLaunch.t.sol`: a factory probe deploys all three in the launch's order with the exact brief arguments on an empty chain 4663, asserting zero constructor calls to any dependency, predicted addresses, no forbidden opcodes, no owner. It also pins the registry's domain to (4663, registry), runs a full market and wager lifecycle at the real Intake and Robinhood IMD addresses with mocks etched there, shows an Ethereum-domain signature is left Unverified, and shows the mainnet IMD would make the registry inert there.\n\n**Verification.** `forge build` passes with the project's configuration. `forge test` with the verifier's fuzz seed:\n\n| result | count |\n|---|---|\n| passed | 221 |\n| failed | 0 |\n| skipped | 1 (pre-existing fork-only test) |\n\n**Docs.** Root `ADAPTATION.md` lists each change, the finding or rule behind it, and the launch's contracts and arguments. The README gained a Robinhood Chain section with the deployment order, constructor values and the `MAX_TERM` note.\n\nNo build configuration, dependency or protected path was touched, no transaction was signed, and no `.imd-blocked.json` was needed since the brief supplied every value.","treeHash":"8cad781b949e38573e973ae0cc9cad7fe4471616","usage":{"cachedInputTokens":2495562,"inputTokens":642,"model":"claude-fable-5-1","outputTokens":37149,"runtime":"claude","turns":50,"wallClockMs":1186952}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b886845c01761aa1","findings":[{"citation":"resolved","description":"Robinhood Chain's IMD (0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, the launch's `imd` argument) is not the Ethereum token's code. It is an owner-controlled LayerZero OFT (owner 0x047F606fD5b2BaA5f5C6c4aB8958E45CB6B054B7) that exposes `setBlocked(address,bool)` (0x000af2a1) and `blocked(address)` (0xe5962195); on a chain-4663 fork, `transfer` to a blocked address, `transfer` from it and `transferFrom` pulling from it all revert. The Ethereum IMD (0xd34a99bc…) has neither selector, so the mainnet audits of #2190 never saw this token behaviour. SwarmMarket assumes a push to the creator or the treasury always succeeds and places that push on the only paths that release other users' money: `settle` (line 218-219) pushes the creator's fee half and the treasury's half before the phase is usable for `claim`, and `_void` (line 263) pushes the unspent escrow to the creator on every void path, including `abandon`. Because `settle`/`abandon` revert as a whole, the market stays in `Asked`/`Open` and `claim` returns 0 for everyone. A blocked creator therefore freezes all stakes in every market they created; a blocked treasury (the single address 0x571e17b1…) freezes every market in the system whose losing-pool fee is at least 2 wei. No participant can cause the block, only the IMD owner; while it lasts every other participant's funds are locked, and it is permanent if the block is. Minimal fix that preserves the design: do not let a third party's receipt gate the release of stakes. Either credit fees and escrow to a per-address `owed` balance that the creator/treasury pull with their own call, or wrap the creator/treasury pushes in a try that, on failure, credits `owed[to]` instead of reverting. `claim` to the caller themself may stay a push: a blocked claimer only blocks their own money.","line":218,"path":"src/SwarmMarket.sol","reproduction":"State: Robinhood IMD (or any token whose `transfer` reverts for a blocked recipient). Alice opens market 1 (escrow 0.5 IMD) and stakes 10 IMD Yes; Bob stakes 5 IMD No. The IMD owner calls `setBlocked(alice, true)`. (a) Nobody resolves; at `resolveAfter + RESOLVE_WINDOW + 1` anyone calls `abandon(1)`: `_void` -> `_push(alice, 0.5e18)` -> IMD reverts 'blocked' -> `abandon` reverts; `claim(1)` by Bob returns 0 (`NothingToClaim`). Expected: Bob can recover his 5 IMD regardless of the creator's token status. Actual: Bob's 5 IMD are locked for as long as Alice is blocked. (b) Market resolved and answered Yes (7-seat panel, 5 agreed) with Yes pool 11 IMD and No pool 10 IMD: `settle(1)` computes fee = 0.2 IMD and calls `_push(alice, 0.1e18)` -> reverts -> market stays `Asked`; Bob (a winner with 10 IMD staked) cannot claim. Same with `setBlocked(0x571e17b1…treasury, true)`: line 219 reverts in every market's `settle`. Proof: test/scratch/MarketBlockedCreator.t.sol (two tests, both fail on the current code: 'bob's stake is frozen behind the blocked creator: 95e18 != 100e18' and 'winner cannot be paid while the creator is blocked').","severity":"medium","snippet":"        _push(m.creator, toCreator);\n        _push(TREASURY, fee - toCreator);","title":"SwarmMarket pushes the creator's and treasury's fee before anyone can claim; IMD on Robinhood Chain has an owner blocklist, so one blocked creator (or the treasury) freezes every staker's funds in the"},{"citation":"resolved","description":"Same dependency fact as the SwarmMarket finding: Robinhood Chain's IMD has an owner-controlled `setBlocked(address,bool)` and reverts any transfer to or from a blocked address (verified on a chain-4663 fork; the Ethereum IMD has no such function). `_refund` (lines 271-272, reached from `settle` on every non-usable outcome and on the ANSWER_WINDOW timeout) and `abandon` (lines 226-228) each push both stakes, and the creator's fee, in a single transaction. If either party is blocked the whole call reverts and the wager stays `Asked`/`Matched`, so the unblocked party's stake, which nothing else can release, is locked for as long as the block lasts. A blocked loser does not affect `settle`'s winner-only payout, and a blocked winner locks only their own pot, so the damage is specific to the two-sided refund paths. Minimal fix preserving the design: make each party's refund independent, e.g. record `owed[yes] += stake; owed[no] += stake; owed[creator] += fee` and let each address withdraw its own, or push each leg inside a try and credit `owed` on failure, so a blocked address only delays its own money.","line":271,"path":"src/SwarmWager.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} from \"src/IIntake.sol\";\nimport {SwarmWager} from \"src/SwarmWager.sol\";\n\n/// IMD on Robinhood Chain (0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127) is an owner-controlled OFT with\n/// `setBlocked(address,bool)` / `blocked(address)`: a transfer to or from a blocked address reverts\n/// (verified on a chain-4663 fork; the Ethereum IMD has no such switch). This stand-in reproduces that.\ncontract BlockableIMD {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n    mapping(address => bool) public blocked;\n    address public owner = msg.sender;\n\n    function setBlocked(address a, bool b) external {\n        require(msg.sender == owner);\n        blocked[a] = b;\n    }\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        _move(msg.sender, to, amount);\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        uint256 a = allowance[from][msg.sender];\n        require(a >= amount, \"allowance\");\n        if (a != type(uint256).max) allowance[from][msg.sender] = a - amount;\n        _move(from, to, amount);\n        return true;\n    }\n\n    function _move(address from, address to, uint256 amount) internal {\n        require(!blocked[from] && !blocked[to], \"blocked\");\n        require(balanceOf[from] >= amount, \"balance\");\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n    }\n}\n\n/// Minimal Intake v2 stand-in: quotes 0.5 IMD, pulls exactly `amount` and records the request.\ncontract TinyIntake {\n    struct Req {\n        address payer;\n        address target;\n        bytes4 selector;\n        bytes4 onFailure;\n        bool completed;\n    }\n\n    address public immutable writer;\n    address public immutable imd;\n    mapping(bytes32 => Req) internal _reqs;\n    uint256 internal _nonce;\n\n    constructor(address writer_, address imd_) {\n        writer = writer_;\n        imd = imd_;\n    }\n\n    function priceOf(bytes32, address) external pure returns (uint256) {\n        return 0.5 ether;\n    }\n\n    function requestWithFailure(\n        bytes32,\n        bytes calldata,\n        IIntake.Callback calldata cb,\n        bytes4 onFailure,\n        address asset,\n        uint256 amount\n    ) external payable returns (bytes32 id) {\n        require(amount == 0.5 ether, \"price\");\n        require(BlockableIMD(asset).transferFrom(msg.sender, address(this), amount), \"pull\");\n        id = keccak256(abi.encode(address(this), ++_nonce));\n        _reqs[id] = Req(msg.sender, cb.target, cb.selector, onFailure, false);\n    }\n\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) {\n        Req storage r = _reqs[id];\n        return (r.payer, r.target, r.selector, r.completed);\n    }\n}\n\ncontract WagerBlockedPartyFreezesCounterpartyTest is Test {\n    BlockableIMD imd;\n    TinyIntake intake;\n    AskSwarmRegistry registry;\n    SwarmWager wager;\n    address writer = makeAddr(\"writer\");\n    address alice = makeAddr(\"alice\"); // creator, yes side\n    address bob = makeAddr(\"bob\"); // counterparty, no side\n    bytes constant BODY = '{\"v\":1,\"question\":\"q\",\"answerType\":\"bool\",\"panelSize\":7,\"quorum\":4}';\n\n    function setUp() public {\n        vm.chainId(4663);\n        vm.warp(1_792_300_000);\n        imd = new BlockableIMD();\n        intake = new TinyIntake(writer, address(imd));\n        registry = new AskSwarmRegistry(address(intake), address(imd), makeAddr(\"signer\"));\n        wager = new SwarmWager(address(registry), address(imd));\n        imd.mint(alice, 100 ether);\n        imd.mint(bob, 100 ether);\n        vm.prank(alice);\n        imd.approve(address(wager), type(uint256).max);\n        vm.prank(bob);\n        imd.approve(address(wager), type(uint256).max);\n    }\n\n    /// Wager refund pushes to `yes` then `no` in one call: a blocked yes party freezes the no party's stake.\n    function test_wager_blockedPartyFreezesCounterpartyRefund() public {\n        vm.prank(alice);\n        uint256 id = wager.create(BODY, true, 3 ether, uint64(block.timestamp + 1 days), uint64(block.timestamp + 1 days));\n        vm.prank(bob);\n        wager.join(id);\n        vm.warp(block.timestamp + 1 days);\n        wager.resolve(id);\n        uint256 bobBefore = imd.balanceOf(bob);\n\n        imd.setBlocked(alice, true); // the token owner's act, outside any participant's control\n        vm.warp(block.timestamp + 3 days + 1); // still Pending after ANSWER_WINDOW: the refund path\n        try wager.settle(id) {} catch {}\n        assertEq(imd.balanceOf(bob), bobBefore + 3 ether, \"bob's refund is frozen behind the blocked yes party\");\n    }\n\n    /// Same for `abandon` of a matched wager that was never resolved.\n    function test_wager_blockedPartyFreezesCounterpartyOnAbandon() public {\n        vm.prank(alice);\n        uint256 id = wager.create(BODY, true, 3 ether, uint64(block.timestamp + 1 days), uint64(block.timestamp + 1 days));\n        vm.prank(bob);\n        wager.join(id);\n        uint256 bobBefore = imd.balanceOf(bob);\n        imd.setBlocked(alice, true);\n        vm.warp(block.timestamp + 1 days + 3 days + 1); // past resolveAfter + ANSWER_WINDOW\n        try wager.abandon(id) {} catch {}\n        assertEq(imd.balanceOf(bob), bobBefore + 3 ether, \"bob's stake is frozen behind the blocked yes party\");\n    }\n}","reproduction":"Alice creates wager 1 (Yes, 3 IMD stake, 0.5 IMD fee); Bob joins (No, 3 IMD). After `resolveAfter` anyone calls `resolve(1)`; the swarm never answers. The IMD owner calls `setBlocked(alice, true)`. At `askedAt + ANSWER_WINDOW + 1` anyone calls `settle(1)`: `_refund` -> `_push(alice, 3e18)` -> IMD reverts 'blocked' -> `settle` reverts, state stays `Asked`. Expected: Bob gets his 3 IMD back (the refund is owed to him, not to Alice). Actual: Bob's 3 IMD stay in the contract until Alice is unblocked, with no other exit. Same for a matched wager never resolved: `abandon(1)` at `resolveAfter + ANSWER_WINDOW + 1` reverts on line 226. Proof: test/scratch/WagerBlockedParty.t.sol (two tests, both fail on the current code: 'bob's refund is frozen behind the blocked yes party: 97e18 != 100e18').","severity":"medium","snippet":"        _push(w.yes, w.stake);\n        _push(w.no, w.stake);","title":"SwarmWager refunds and abandons push to both parties in one call; with the Robinhood IMD blocklist a blocked counterparty freezes the other party's stake"}],"hash":"b7288a43de586767b3b21a5965dc000cda7bde93dfb3a191cb783f5197f688e6","nodeId":"00ae18ff-61b2-41c2-b81a-145aa5490ec4","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds two substantiated findings, each with a self-contained Foundry proof that fails on the current code, plus a coverage row for all 20 entry points and two extra invariant rows.\n\n**What I found**\n\n- **Medium, SwarmMarket (`settle` line 218, `_void` line 263).** The IMD token at the launch's Robinhood address is not the Ethereum token's code. It is an owner-controlled LayerZero OFT with `setBlocked(address,bool)`, and on a chain-4663 fork any transfer to or from a blocked address reverts. The Ethereum IMD has no such function, so the mainnet audits could not have seen it. The market pushes the creator's and treasury's fee before winners can claim, and pushes escrow to the creator on every void path. A blocked creator freezes every staker in their markets, and a blocked treasury freezes `settle` in every market in the system.\n- **Medium, SwarmWager (`_refund` lines 271-272, `abandon` lines 226-228).** Both parties' refunds go out in one call, so a blocked party freezes the counterparty's stake with no other exit.\n\nBoth are caused only by the IMD owner's action, so I rated them medium rather than high. The minimal fix preserves the design: credit fees, escrow and refunds to a per-address owed balance that each recipient pulls, or try the push and credit on failure.\n\n**What holds**\n\nI traced all six registry entry points, the remaining market and wager entry points, and the periphery helpers against the Execution Trace, Periphery and First Principles guides. Nothing else broke. On a Robinhood Chain fork I confirmed the launch inputs directly: Intake v2 has code and prices the oracle action at 0.5 IMD, the real Intake pulls exactly the price and delivers a completion to the registry under the stipend, the real IMD moves exact amounts with no residual allowances, and the signer and treasury are EOAs on both chains so the same keys control them.\n\n**Not reached**\n\nI did not re-examine the writer-pairing trust assumption or the wager's unbounded resolve timing, both accepted in the earlier launches and outside my area. Scratch files under `test/scratch/` are mine and nothing in the tree was changed.","treeHash":null,"usage":{"cachedInputTokens":2406815,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":62450,"runtime":"claude","turns":44,"wallClockMs":1207566}},{"artifacts":[],"attempt":1,"bundleHash":"ef2c540d35ea9f8da3256a62bec6083b4336198342718bab3a912ac156b6b815","device":"d73af718d55ba788","findings":[{"description":"The brief says SwarmWager is 'settled the same way' as SwarmMarket. SwarmMarket voids an answer from a panel below MIN_PANEL (7) or an answer issued after askedAt + ANSWER_WINDOW. SwarmWager pays on any verified strict-majority bool, whatever the panel size or issue time. The wager's parties choose the body (panelSize/quorum) together, so this may be intended, but it differs from the market.","line":260,"path":"src/SwarmWager.sol","reproduction":"In test/RobinhoodSystemInvariant.t.sol, test_handlerReachesEveryOutcome: deliver mode 2 (panelSize 5, quorum 3, agreed 4, verified). The same delivery voids a market (smallPanelVoids == 1) and pays a wager's pot (wagersPaid == 1). Expected if 'the same way' is literal: the wager refunds both stakes. Actual: it pays 2*stake to the winner.","severity":"info","title":"SwarmWager settles on answers SwarmMarket would void (no MIN_PANEL, no issuedAt deadline)"},{"description":"claimable rounds each winner's share down, so up to one wei per winner stays in the contract after every claim. No function sweeps it. The amount is negligible and the contract documents it.","line":258,"path":"src/SwarmMarket.sol","reproduction":"A Yes market with yes stakes 1 and 2 (two winners) and a no pool of 100. fee = 2, winnersShare = 98. The claims pay 1+32 and 2+65. The market keeps 1 wei for good. Covered by invariant_marketClaimsAreSolventPerMarket (held - owed <= 4).","severity":"info","title":"SwarmMarket rounding dust is never recoverable"},{"description":"SwarmWager.settle on a usable answer pushes the pot with _push, not _pushOrCredit. While the winner is blocked by Robinhood Chain's IMD, settle reverts and the wager stays Asked. SwarmMarket.claim and both withdraw functions behave the same way. Only the blocked party's own funds wait; the loser is owed nothing and no other user is held. Recorded so the behaviour is known, not as a defect.","line":271,"path":"src/SwarmWager.sol","reproduction":"test/BlockedPartyInvariant.t.sol test_handlerReachesCreditsAndWithdrawals: the winner is blocked and settleWager expects TransferFailed (blockedWinnerSettles == 1). After the unblock, settle pays 2*stake.","severity":"info","title":"A blocked winner's own payout waits for the token to unblock it"}],"hash":"cdc8a0c1b04c032c8cde66036e735b43a9d3a73e6cd9c1268a8a1b38b571c1c3","nodeId":"94f8b442-af99-42ae-b301-d7c3bb02e8fd","outcome":"completed","summary":"No findings were listed for this revision, so I checked the current source against my earlier tests. After my last round, the builder changed `SwarmMarket` and `SwarmWager`. Robinhood Chain's IMD token can block an address, and the contracts now handle that: when a payment to someone else (a creator's leftover fee, a fee share, a refund) is refused because the receiver is blocked, it is recorded as `owed` and the receiver collects it later with `withdraw`. No invariant test covered that path, so I added one.\n\nWith the verifier's seed, `forge test` passes: 234 tests, none failing, 1 skipped. The skipped one is a fork test that only runs when an RPC is configured.\n\n**New: `test/BlockedPartyInvariant.t.sol`**\n- **Setup:** it runs the real registry, market and wager on the existing stand-in for the blockable token. Four users and the treasury are blocked and unblocked at random between every kind of call, including oracle answers, refusals and `withdraw`. It does 96 runs of 64 calls.\n- **What each call should do:**\n  - A payment to someone other than the caller arrives if they are free, or is added to their `owed` if they are blocked.\n  - The caller's own payout (a claim, a wager win, a cancel, a withdraw) fails while the caller is blocked and stays open until they are unblocked.\n  - Taking funds from a blocked address fails.\n- **What must hold after every call:**\n  - Each person's `owed` in both contracts equals what the test predicted.\n  - Each contract holds exactly its open stakes and fees plus everything it owes.\n  - No tokens appear or vanish, finished markets and wagers never reopen, and the oracle is paid once per question.\n- **Coverage check:** a fixed-sequence test plus a throwaway probe confirmed the random runs actually reach every blocked case: a payment recorded as owed, a withdraw while blocked, a successful withdraw, a claim while blocked, a blocked wager winner, and a settlement that goes through despite a blocked party.\n\n**Updated:**\n- `test/RobinhoodSystemInvariant.t.sol`: last round I reported that `SwarmWager` left its fee field set after a cancel or abandon. That is now fixed, so the old comment is replaced by an assertion that every finished wager's fee is zero.\n- `test/TESTING.md`: describes the new suite and the fix.\n\n**Findings (`.imd-findings.json`).** All three are info-level; I found nothing more serious:\n1. The brief says wagers settle \"the same way\" as markets, but they don't. A market ignores an answer from a panel smaller than 7 or one issued after its answer deadline, and treats the question as unresolved; a wager pays out on either. An answer from a panel of 5 resolves the wager and leaves the market unresolved.\n2. `SwarmMarket` rounds each winner's share down, so up to 1 wei per winner stays in the contract for good.\n3. A blocked winner's own payout (a wager win or a market claim) waits until the token unblocks them. Nobody else's money is held up.\n\nA fork run against the live oracle and IMD on Robinhood Chain is still owed; there is no network access here.","treeHash":"e624e405b4d902632f7a3d1881a313c59440a260","usage":{"cachedInputTokens":2207128,"inputTokens":48,"model":"claude-opus-5-5","outputTokens":32360,"runtime":"claude","turns":25,"wallClockMs":1284122}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0eca5d6d7ad6ddb4","findings":[{"citation":"resolved","description":"Robinhood Chain's IMD (0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, this launch's `imd` argument) is not the Ethereum token's code. It is an owner-controlled OFT (owner() = 0x047F606fD5b2BaA5f5C6c4aB8958E45CB6B054B7) with `setBlocked(address,bool)` (0x000af2a1) and `blocked(address)` (0xe5962195). Verified by this reviewer on a chain-4663 fork (test/scratch/ForkBlocklist.t.sol): after the owner calls setBlocked(x,true), `transfer` to x, `transfer` from x and `transferFrom` pulling from x all revert; unblocking restores them. The Ethereum IMD (0xd34a99bc…) has no such switch, so the #2190 audit never saw this token behaviour. SwarmMarket places a push to a third party on both paths that move a market out of Open/Asked: `settle` (lines 218-219) pushes the creator's fee half and the treasury's half before the phase becomes Yes/No, and `_void` (line 263, reached from `abandon`, `resolve` on a one-sided market and every non-answer in `settle`) pushes the unspent escrow to the creator. `_call` reverts on a failed transfer, so the whole call reverts, the market stays Open/Asked and `claimable` returns 0 for every staker. A blocked creator freezes all stakes in every market they created; a blocked treasury (the single address 0x571e17b1…) freezes every market in the system whose losing-pool fee is at least 2 wei. The contract's own invariant 'A market can always be unwound' no longer holds on this chain. Only the IMD owner can cause it, so it is a trust assumption on the token, but while it lasts every other participant's money is locked, and it is permanent if the block is. Merged with the SwarmWager finding's root cause (push to a third party gates release of other users' funds); kept separate because the fix is in a different file. Minimal fix preserving the design: credit the creator's fee/escrow and the treasury's fee to a per-address `owed` balance that they pull with their own call (or push inside a try and credit `owed` on failure). `claim` may stay a push: a blocked claimer only blocks their own money.","line":218,"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/// IMD on Robinhood Chain (0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127) is an owner-controlled OFT with\n/// `setBlocked(address,bool)` / `blocked(address)`: a transfer to or from a blocked address reverts\n/// (verified on a chain-4663 fork: owner 0x047F606fD5b2BaA5f5C6c4aB8958E45CB6B054B7). This stand-in reproduces that.\ncontract BlockableIMD {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n    mapping(address => bool) public blocked;\n    address public owner = msg.sender;\n\n    function setBlocked(address a, bool b) external {\n        require(msg.sender == owner);\n        blocked[a] = b;\n    }\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        _move(msg.sender, to, amount);\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        uint256 a = allowance[from][msg.sender];\n        require(a >= amount, \"allowance\");\n        if (a != type(uint256).max) allowance[from][msg.sender] = a - amount;\n        _move(from, to, amount);\n        return true;\n    }\n\n    function _move(address from, address to, uint256 amount) internal {\n        require(!blocked[from] && !blocked[to], \"blocked\");\n        require(balanceOf[from] >= amount, \"balance\");\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n    }\n}\n\n/// Registry stand-in: quotes 0.5 IMD, pulls it on askAtMost, and returns whatever record the test sets.\ncontract StubRegistry {\n    BlockableIMD public immutable imd;\n    uint256 public asked;\n    IAskSwarmRegistry.Ask internal _k;\n    IAskSwarmRegistry.Answer internal _a;\n\n    constructor(BlockableIMD imd_) {\n        imd = imd_;\n    }\n\n    function price() external pure returns (uint256) {\n        return 0.5 ether;\n    }\n\n    function askAtMost(bytes calldata, uint256 maxPrice) external returns (bytes32 requestId) {\n        require(maxPrice >= 0.5 ether, \"PriceAboveMax\");\n        require(imd.transferFrom(msg.sender, address(this), 0.5 ether), \"pull\");\n        requestId = keccak256(abi.encode(++asked));\n        _k = IAskSwarmRegistry.Ask(msg.sender, uint64(block.timestamp), IAskSwarmRegistry.Status.Pending);\n    }\n\n    function answerYes(uint16 panel, uint16 quorum, uint16 agreed) external {\n        _k.status = IAskSwarmRegistry.Status.Answered;\n        _a = IAskSwarmRegistry.Answer({\n            questionHash: bytes32(uint256(1)),\n            answer: abi.encode(true),\n            answerHash: keccak256(abi.encode(true)),\n            answerType: 0,\n            panelSize: panel,\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) external view returns (IAskSwarmRegistry.Ask memory k, IAskSwarmRegistry.Answer memory a) {\n        return (_k, _a);\n    }\n}\n\n/// SwarmMarket pushes the creator's and the treasury's money inside `settle` and `_void`, the only\n/// calls that make stakes claimable. With the Robinhood IMD blocklist, one blocked creator (or the\n/// treasury) makes those calls revert and every staker's funds stay in the contract.\ncontract MarketBlockedThirdPartyTest is Test {\n    BlockableIMD imd;\n    StubRegistry registry;\n    SwarmMarket market;\n    address treasury = makeAddr(\"treasury\");\n    address alice = makeAddr(\"alice\"); // creator, stakes Yes\n    address bob = makeAddr(\"bob\"); // stakes No\n    bytes constant BODY = '{\"v\":1,\"question\":\"q\",\"answerType\":\"bool\",\"panelSize\":7,\"quorum\":4}';\n\n    function setUp() public {\n        vm.chainId(4663);\n        vm.warp(1_792_300_000);\n        imd = new BlockableIMD();\n        registry = new StubRegistry(imd);\n        market = new SwarmMarket(address(registry), address(imd), treasury);\n        imd.mint(alice, 100 ether);\n        imd.mint(bob, 100 ether);\n        vm.prank(alice);\n        imd.approve(address(market), type(uint256).max);\n        vm.prank(bob);\n        imd.approve(address(market), type(uint256).max);\n    }\n\n    function _openAndStake() internal returns (uint256 id) {\n        vm.prank(alice);\n        id = market.open(BODY, uint64(block.timestamp + 1 hours), uint64(block.timestamp + 1 hours));\n        vm.prank(alice);\n        market.stake(id, true, 10 ether);\n        vm.prank(bob);\n        market.stake(id, false, 5 ether);\n    }\n\n    /// Never resolved; after the window `abandon` must void and Bob must get his 5 IMD back, whatever\n    /// the token thinks of the creator. Fails on the current code: `_void` pushes the escrow to the\n    /// blocked creator first and `abandon` reverts, so `claim` has nothing for Bob.\n    function test_blockedCreatorFreezesStakersOnAbandon() public {\n        uint256 id = _openAndStake();\n        uint256 bobBefore = imd.balanceOf(bob);\n        imd.setBlocked(alice, true); // the token owner's act, outside any participant's control\n        vm.warp(block.timestamp + 1 hours + market.RESOLVE_WINDOW() + 1);\n        try market.abandon(id) {} catch {}\n        vm.prank(bob);\n        try market.claim(id) {} catch {}\n        assertEq(imd.balanceOf(bob), bobBefore + 5 ether, \"bob's stake is frozen behind the blocked creator\");\n    }\n\n    /// Answered Yes by a 7-seat panel; Bob holds Yes stake too here so he is a winner. Fails on the\n    /// current code: `settle` pushes the creator's fee half to the blocked creator and reverts.\n    function test_blockedCreatorFreezesWinnersOnSettle() public {\n        vm.prank(alice);\n        uint256 id = market.open(BODY, uint64(block.timestamp + 1 hours), uint64(block.timestamp + 1 hours));\n        vm.prank(alice);\n        market.stake(id, true, 1 ether);\n        vm.prank(bob);\n        market.stake(id, true, 10 ether);\n        vm.prank(bob);\n        market.stake(id, false, 10 ether);\n        uint256 bobBefore = imd.balanceOf(bob);\n        vm.warp(block.timestamp + 1 hours);\n        market.resolve(id);\n        registry.answerYes(7, 4, 5);\n        imd.setBlocked(alice, true);\n        try market.settle(id) {} catch {}\n        vm.prank(bob);\n        try market.claim(id) {} catch {}\n        assertGt(imd.balanceOf(bob), bobBefore, \"winner cannot be paid while the creator is blocked\");\n    }\n\n    /// Same with the single treasury address blocked: every market's `settle` reverts on line 219.\n    function test_blockedTreasuryFreezesWinnersOnSettle() public {\n        uint256 id = _openAndStake();\n        uint256 aliceBefore = imd.balanceOf(alice);\n        vm.warp(block.timestamp + 1 hours);\n        market.resolve(id);\n        registry.answerYes(7, 4, 5);\n        imd.setBlocked(treasury, true);\n        try market.settle(id) {} catch {}\n        vm.prank(alice);\n        try market.claim(id) {} catch {}\n        assertGt(imd.balanceOf(alice), aliceBefore, \"winner cannot be paid while the treasury is blocked\");\n    }\n}","reproduction":"State: IMD with the Robinhood blocklist (BlockableIMD in the proof reproduces the live behaviour). Alice opens market 1 (escrow 0.5 IMD) and stakes 10 IMD Yes; Bob stakes 5 IMD No. The IMD owner calls setBlocked(alice,true). (a) Nobody resolves; at resolveAfter + RESOLVE_WINDOW + 1 anyone calls abandon(1): _void -> _push(alice, 0.5e18) -> IMD reverts 'blocked' -> abandon reverts as a whole, phase stays Open; Bob's claim(1) reverts NothingToClaim. Expected: Bob recovers his 5 IMD regardless of the creator's token status (balance 100e18). Actual: 95e18, locked while Alice is blocked. (b) Market resolved, answered Yes by a 7-seat panel (5 agreed), Yes pool 11 IMD / No pool 10 IMD: settle(1) computes fee = 0.2 IMD, _push(alice, 0.1e18) reverts, phase stays Asked, Bob (10 IMD on Yes) cannot claim. (c) Same market with setBlocked(treasury,true): line 219 reverts in settle, Alice (winner) cannot claim. Proof test/scratch/MarketBlockedThirdParty.t.sol: all three tests fail on the current code ('bob's stake is frozen behind the blocked creator: 95e18 != 100e18', 'winner cannot be paid while the creator is blocked', 'winner cannot be paid while the treasury is blocked').","severity":"medium","snippet":"        _push(m.creator, toCreator);","title":"SwarmMarket pushes the creator's and treasury's IMD inside settle/_void, the only calls that make stakes claimable; Robinhood IMD has an owner blocklist, so one blocked creator (or the treasury) freez"},{"citation":"resolved","description":"Same token fact as the SwarmMarket finding (Robinhood IMD's owner-controlled setBlocked, verified on a chain-4663 fork; the Ethereum IMD has no such function). `_refund` (lines 271-272, reached from `settle` on every non-usable outcome and on the ANSWER_WINDOW timeout) and `abandon` (lines 226-228) push both stakes, and the creator's fee, in a single transaction, and `_call` reverts on the first failed transfer. If either party is blocked the whole call reverts, the wager stays Asked/Matched, and the unblocked party's stake, which no other function can release, is locked for as long as the block lasts. A blocked loser does not affect `settle`'s winner-only payout and a blocked winner locks only their own pot, so the damage is specific to the two-sided refund paths. The specialist's proof fails on the current code for exactly this reason and is attached. Minimal fix preserving the design: make each party's refund independent (record owed[yes] += stake; owed[no] += stake; owed[creator] += fee and let each address withdraw its own, or push each leg inside a try and credit `owed` on failure), so a blocked address only delays its own money.","line":271,"path":"src/SwarmWager.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} from \"src/IIntake.sol\";\nimport {SwarmWager} from \"src/SwarmWager.sol\";\n\n/// IMD on Robinhood Chain (0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127) is an owner-controlled OFT with\n/// `setBlocked(address,bool)` / `blocked(address)`: a transfer to or from a blocked address reverts\n/// (verified on a chain-4663 fork; the Ethereum IMD has no such switch). This stand-in reproduces that.\ncontract BlockableIMD {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n    mapping(address => bool) public blocked;\n    address public owner = msg.sender;\n\n    function setBlocked(address a, bool b) external {\n        require(msg.sender == owner);\n        blocked[a] = b;\n    }\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        _move(msg.sender, to, amount);\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        uint256 a = allowance[from][msg.sender];\n        require(a >= amount, \"allowance\");\n        if (a != type(uint256).max) allowance[from][msg.sender] = a - amount;\n        _move(from, to, amount);\n        return true;\n    }\n\n    function _move(address from, address to, uint256 amount) internal {\n        require(!blocked[from] && !blocked[to], \"blocked\");\n        require(balanceOf[from] >= amount, \"balance\");\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n    }\n}\n\n/// Minimal Intake v2 stand-in: quotes 0.5 IMD, pulls exactly `amount` and records the request.\ncontract TinyIntake {\n    struct Req {\n        address payer;\n        address target;\n        bytes4 selector;\n        bytes4 onFailure;\n        bool completed;\n    }\n\n    address public immutable writer;\n    address public immutable imd;\n    mapping(bytes32 => Req) internal _reqs;\n    uint256 internal _nonce;\n\n    constructor(address writer_, address imd_) {\n        writer = writer_;\n        imd = imd_;\n    }\n\n    function priceOf(bytes32, address) external pure returns (uint256) {\n        return 0.5 ether;\n    }\n\n    function requestWithFailure(\n        bytes32,\n        bytes calldata,\n        IIntake.Callback calldata cb,\n        bytes4 onFailure,\n        address asset,\n        uint256 amount\n    ) external payable returns (bytes32 id) {\n        require(amount == 0.5 ether, \"price\");\n        require(BlockableIMD(asset).transferFrom(msg.sender, address(this), amount), \"pull\");\n        id = keccak256(abi.encode(address(this), ++_nonce));\n        _reqs[id] = Req(msg.sender, cb.target, cb.selector, onFailure, false);\n    }\n\n    function requests(bytes32 id) external view returns (address, address, bytes4, bool) {\n        Req storage r = _reqs[id];\n        return (r.payer, r.target, r.selector, r.completed);\n    }\n}\n\ncontract WagerBlockedPartyFreezesCounterpartyTest is Test {\n    BlockableIMD imd;\n    TinyIntake intake;\n    AskSwarmRegistry registry;\n    SwarmWager wager;\n    address writer = makeAddr(\"writer\");\n    address alice = makeAddr(\"alice\"); // creator, yes side\n    address bob = makeAddr(\"bob\"); // counterparty, no side\n    bytes constant BODY = '{\"v\":1,\"question\":\"q\",\"answerType\":\"bool\",\"panelSize\":7,\"quorum\":4}';\n\n    function setUp() public {\n        vm.chainId(4663);\n        vm.warp(1_792_300_000);\n        imd = new BlockableIMD();\n        intake = new TinyIntake(writer, address(imd));\n        registry = new AskSwarmRegistry(address(intake), address(imd), makeAddr(\"signer\"));\n        wager = new SwarmWager(address(registry), address(imd));\n        imd.mint(alice, 100 ether);\n        imd.mint(bob, 100 ether);\n        vm.prank(alice);\n        imd.approve(address(wager), type(uint256).max);\n        vm.prank(bob);\n        imd.approve(address(wager), type(uint256).max);\n    }\n\n    /// Wager refund pushes to `yes` then `no` in one call: a blocked yes party freezes the no party's stake.\n    function test_wager_blockedPartyFreezesCounterpartyRefund() public {\n        vm.prank(alice);\n        uint256 id = wager.create(BODY, true, 3 ether, uint64(block.timestamp + 1 days), uint64(block.timestamp + 1 days));\n        vm.prank(bob);\n        wager.join(id);\n        vm.warp(block.timestamp + 1 days);\n        wager.resolve(id);\n        uint256 bobBefore = imd.balanceOf(bob);\n\n        imd.setBlocked(alice, true); // the token owner's act, outside any participant's control\n        vm.warp(block.timestamp + 3 days + 1); // still Pending after ANSWER_WINDOW: the refund path\n        try wager.settle(id) {} catch {}\n        assertEq(imd.balanceOf(bob), bobBefore + 3 ether, \"bob's refund is frozen behind the blocked yes party\");\n    }\n\n    /// Same for `abandon` of a matched wager that was never resolved.\n    function test_wager_blockedPartyFreezesCounterpartyOnAbandon() public {\n        vm.prank(alice);\n        uint256 id = wager.create(BODY, true, 3 ether, uint64(block.timestamp + 1 days), uint64(block.timestamp + 1 days));\n        vm.prank(bob);\n        wager.join(id);\n        uint256 bobBefore = imd.balanceOf(bob);\n        imd.setBlocked(alice, true);\n        vm.warp(block.timestamp + 1 days + 3 days + 1); // past resolveAfter + ANSWER_WINDOW\n        try wager.abandon(id) {} catch {}\n        assertEq(imd.balanceOf(bob), bobBefore + 3 ether, \"bob's stake is frozen behind the blocked yes party\");\n    }\n}","reproduction":"Alice creates wager 1 (Yes, 3 IMD stake, 0.5 IMD fee); Bob joins (No, 3 IMD). After resolveAfter anyone calls resolve(1); the swarm never answers. The IMD owner calls setBlocked(alice,true). At askedAt + ANSWER_WINDOW + 1 anyone calls settle(1): _refund -> _push(alice, 3e18) -> IMD reverts 'blocked' -> settle reverts, state stays Asked. Expected: Bob's balance 100e18 (his refund does not depend on Alice). Actual: 97e18 until Alice is unblocked, with no other exit. Same for a matched wager never resolved: abandon(1) at resolveAfter + ANSWER_WINDOW + 1 reverts on line 226. Proof test/scratch/P3.t.sol (the specialist's Proof_c6382392c434): both tests fail on the current code with 'bob's refund is frozen behind the blocked yes party: 97e18 != 100e18' and 'bob's stake is frozen behind the blocked yes party: 97e18 != 100e18'.","severity":"medium","snippet":"        _push(w.yes, w.stake);","title":"SwarmWager refunds (_refund) and abandon push both parties' stakes in one call; with the Robinhood IMD blocklist a blocked party freezes the other party's stake"},{"citation":"resolved","description":"resolve is legal only while block.timestamp is in [resolveAfter, resolveAfter + 1 hours], and abandon (line 188) voids the market as soon as that window has passed. The window was sized for Ethereum in launch #2190 (finding d2521c529966, 'one hour permits ordinary transaction inclusion'). On Robinhood Chain L2 blocks and their timestamps are produced only by the sequencer, and a transaction it does not include can be forced through the L1 delayed inbox only after about 24 hours; Arbitrum-family sequencers have had outages longer than an hour. If no block carries a timestamp inside a market's window, the first block after the gap already satisfies the TooLate check, so resolve reverts forever and the only exit is abandon: the market voids, every stake is refunded, no fee is paid, and the side that would have lost keeps its stake. Nobody is privileged: anyone can call abandon the moment the window is missed, and the losing side has the incentive to. The code does exactly what the brief states ('1h resolve window'), so this is a chain-move risk that needs the requester's decision rather than a silent change: size RESOLVE_WINDOW to the chain's liveness guarantee (at least the forced-inclusion delay, or a creator-chosen term bounded by MAX_TERM), keeping abandon strictly after it so the resolve/abandon race closed in #2190 stays closed. No proof attached (low; the specialist's Proof_cade4e8c0911 fails on the current code with TooLate() and would pass only after the window is resized).","line":169,"path":"src/SwarmMarket.sol","reproduction":"State: market 1 on chain 4663 with closeAt = T+1h, resolveAfter = T+2h, bool body; Yes 100 IMD, No 100 IMD; price 0.5 IMD, escrow 0.5 IMD. Blocks: one at resolveAfter - 1 (resolve reverts TooEarly), then none until resolveAfter + 2h. Call resolve(1) at resolveAfter + 2h. Expected: the fully staked market with an available oracle is asked (phase Asked). Actual: TooLate(); abandon(1) then succeeds, phase Void, claimable(1,yes) = claimable(1,no) = 100 IMD, the escrow returns to the creator, the swarm is never asked. Reproduced with test/scratch/P4.t.sol (fails: TooLate()).","severity":"low","snippet":"        if (block.timestamp > uint256(m.resolveAfter) + RESOLVE_WINDOW) revert TooLate();","title":"SwarmMarket's 1-hour RESOLVE_WINDOW assumes a block can always be landed inside it; on Robinhood Chain (single Arbitrum sequencer, ~24h forced inclusion) a block gap over the window makes a fully stak"},{"citation":"resolved","description":"resolve only checks block.timestamp >= resolveAfter and never an upper bound; abandon (line 224) opens at resolveAfter + ANSWER_WINDOW + 1 and refunds both stakes. From that second on the two exits overlap, and the first transaction to land decides whether the swarm settles the bet or it is unwound: the party who believes it lost calls abandon and keeps its stake; the other calls resolve. Because resolve is unbounded the resolver also chooses when the fixed body is sent, which changes the answer for relative-window questions (the #2189 limitation 905d4059dc0f). SwarmMarket closed exactly this pair in #2190 with RESOLVE_WINDOW and an abandon that opens strictly after it; SwarmWager was left as is because it was already live on Ethereum ('Recorded for a successor'). This launch deploys SwarmWager fresh, so that reason no longer applies. The NatSpec documents the race ('the first of resolve or abandon wins') and the #2189 tests record it, so this is a design asymmetry the requester should decide explicitly, not a bypass. Fix preserving intent: a resolve window after resolveAfter (sized for the chain's liveness, see the RESOLVE_WINDOW finding) with abandon strictly after it.","line":205,"path":"src/SwarmWager.sol","reproduction":"Wager 1 created by alice (Yes, 100 IMD, fee 0.5 IMD, joinBy T+1d, resolveAfter T+2d), joined by bob (No, 100 IMD). Nobody resolves for three days after resolveAfter. At block.timestamp = resolveAfter + 3 days + 1: (a) bob calls abandon(1): succeeds, state Refunded, bob's balance back to 1000 IMD, the swarm is never asked; (b) from the same state alice calls resolve(1): succeeds, state Asked, 0.5 IMD paid to the registry. Expected: exactly one of resolve/abandon legal at any timestamp, as in SwarmMarket. Actual: both. Reproduced with test/scratch/P2.t.sol (the specialist's Proof_5bda6bea2ad7 fails: 'resolve and abandon both legal at the same time').","severity":"low","snippet":"        if (block.timestamp < w.resolveAfter) revert TooEarly();","title":"SwarmWager.resolve has no upper time bound, so from resolveAfter + ANSWER_WINDOW + 1 both resolve and abandon are legal on the same matched wager and the party expecting to lose can unwind the bet fir"},{"citation":"resolved","description":"SwarmMarket.open rejects body.length > MAX_BODY_BYTES (16_384, line 113, added in #2190 for finding a6554325c3be: 'a longer one could never be asked'). SwarmWager.create only rejects an empty body. Intake v2's `_request` reverts BodyTooLong for any body over 16,384 bytes (the repository's own helper test/helpers/RegistryTestSupport.sol:160 models it), so a wager whose stored body is longer can be created and joined, but every resolve reverts at the transport, at every price. Once matched nobody can cancel (state Matched), and abandon is refused until resolveAfter + ANSWER_WINDOW, up to MAX_TERM + 3 days. The creator alone chooses the body and so chooses this outcome; funds are not lost (abandon refunds both stakes and the fee), and a careful joiner can read bodyOf first, so the impact is a bounded lock. Reported by two specialists (audit_permissions 507fe706, audit_math bd5ed207); merged. Fix: add `|| body.length > 16_384` (a MAX_BODY_BYTES constant mirroring SwarmMarket) to the BadTerms condition in create.","line":139,"path":"src/SwarmWager.sol","reproduction":"Fresh deployment, alice and bob hold IMD and approved SwarmWager. 1) alice: create(new bytes(16385), true, 3e18, T+1h, T+2h) succeeds (expected: BadTerms, as SwarmMarket.open gives for the same body). 2) bob: join(id): 3 IMD pulled, state Matched. 3) at T+2h anyone: resolve(id) reverts BodyTooLong(16385) from Intake, every time. 4) at T+2h+3d: abandon(id) reverts TooEarly; cancel(id) reverts WrongState(Matched). 5) at T+2h+3d+1: abandon(id) succeeds and bob gets his 3 IMD back. Reproduced with test/scratch/P1.t.sol (the specialist's Proof_507fe706285f: test_wagerRefusesBodyIntakeCannotAccept fails 'next call did not revert as expected'; test_currentBehaviourLocksCounterpartyUntilAbandon passes and documents the lock; test_marketRefusesBodyIntakeCannotAccept passes).","severity":"low","snippet":"            body.length == 0 || stake == 0 || joinBy <= block.timestamp || resolveAfter < joinBy","title":"SwarmWager.create accepts a body longer than Intake's 16 KiB cap that SwarmMarket.open refuses, so a matched wager can never be resolved and the counterparty's stake is held until abandon opens 3 days"},{"citation":"resolved","description":"The brief says SwarmWager is 'settled the same way' as SwarmMarket. SwarmMarket.settle additionally voids when a.issuedAt > askedAt + ANSWER_WINDOW (line 208, reason 22, added in #2190 for c7f7d6ef887a so a late-issued answer gives the same result in either transaction order) and when a.panelSize < MIN_PANEL (line 207, reason 21). SwarmWager.settle has neither bound: a verified strict-majority bool answer pays the whole pot however late it was issued and from a panel as small as 2, while a Pending record after the window refunds both. So for the same oracle event (answer issued and delivered after the three-day window) the payout in SwarmWager depends on which transaction lands first: the party the answer goes against calls settle at askedAt + 3d + 1 and takes a full refund, while if the writer's completion lands first the other party takes the pot. Anyone may call settle, so the race is between the two parties and the writer. The NatSpec documents this as 'a race to settlement' and #2189 accepted it (tests test_lateAnswerBeforeTimeoutSettlementStillPaysWinner and test_timeoutSettlementBeforeLateAnswerRemainsRefunded record both orderings); the panel floor difference is a documented trust choice since both parties see the body. Reported as an asymmetry between the two contracts the brief says settle the same way, for the requester to decide; precondition (the swarm answering more than three days late) is abnormal, so low. Merged from audit_permissions fec654fc and write_foundry_tests 1251dace. Fix preserving the design: refund with a distinct reason when a.issuedAt > askedAt + ANSWER_WINDOW, and optionally mirror MIN_PANEL.","line":246,"path":"src/SwarmWager.sol","reproduction":"Matched wager: alice Yes, bob No, 3 IMD each, resolved at R (askedAt = R). Oracle answer Yes with issuedAt = R + 3d + 1, delivered at that time. Order A: the registry record lands, then anyone calls settle: alice is paid 6 IMD, bob ends at 97 IMD. Order B: bob calls settle at R + 3d + 1 before the record lands: both refunded, bob at 100 IMD, the later delivery is irrelevant. Same inputs and timestamps, two payouts chosen by whoever lands first. A SwarmMarket with the same late issuedAt voids in both orders (reason 22). Panel floor: a verified Yes from panelSize 5, quorum 3, agreed 4 pays the wager's pot while SwarmMarket.settle voids (reason 21). Reproduced with test/scratch/Repro.t.sol: test_wagerLateAnswerOrderDependent and test_panelFloorAsymmetry (both pass on the current code, documenting the behaviour).","severity":"low","snippet":"        bool usable = k.status == IAskSwarmRegistry.Status.Answered && a.verified && a.answerType == BOOL","title":"SwarmWager.settle pays on answers SwarmMarket.settle would void: no signed-issuedAt bound (payout after ANSWER_WINDOW depends on transaction order) and no MIN_PANEL floor"},{"citation":"resolved","description":"Each winner's share of the losing pool is floor(y * winnersShare / yesPool), so the sum paid to winners can be short of winnersShare by up to (number of winners - 1) wei. The contract has no owner and no sweep, so the remainder stays in SwarmMarket's IMD balance permanently. The stated invariant 'paid out never exceeds staked' holds and the amount is bounded by one wei per winning address per market, so this is a by-design property, but it is not stated in the contract's invariants list. Merged from audit_math 310a7966 and write_foundry_tests 36a1d3d0.","line":241,"path":"src/SwarmMarket.sol","reproduction":"Chain 4663, mocks. creator opens a market; a1, a2, a3 each stake 1 wei on Yes; n1 stakes 100 wei on No. After resolveAfter: resolve(id), a verified bool true (panel 15, quorum 11, agreed 12), settle(id). fee = 100*200/10000 = 2 (1 creator, 1 treasury), winnersShare = 98. claimable(id, a1) = 1 + 1*98/3 = 33 for each of the three winners (99 wei in total). After all three claim, SwarmMarket still holds 2 wei of IMD with claimable == 0 for everyone and no function able to move it. Reproduced with test/scratch/Repro.t.sol test_roundingDustLocked (balance after claims == 2).","severity":"info","snippet":"        if (m.phase == Phase.Yes) return y == 0 ? 0 : y + y * m.winnersShare / m.yesPool;","title":"Parimutuel claim rounding leaves up to (winners - 1) wei per settled market locked forever; no sweep path exists"},{"citation":"resolved","description":"cancel() (line 182) and abandon() (line 228) push the stake plus fee back but never zero w.fee, unlike resolve(), which zeroes it (line 211). The Refunded state blocks every further use so no funds are at risk, but get()/wagers() keep reporting an escrow the contract no longer holds; an indexer that sums fee over wagers overstates holdings. From write_foundry_tests df937ebf.","line":182,"path":"src/SwarmWager.sol","reproduction":"create(body, true, 10 ether, now+1h, now+1h) at price 0.5 IMD, then cancel(1) as the creator: the creator receives 10.5 IMD and the contract balance is 0, but wagers(1).fee still reads 0.5 IMD (expected 0). Same after join + abandon() at resolveAfter + 3d + 1. Reproduced with test/scratch/Repro.t.sol test_wagerFeeFieldNotZeroedOnCancelAndAbandon.","severity":"info","snippet":"        _push(w.creator, uint256(w.stake) + w.fee);","title":"SwarmWager.cancel and abandon return the fee escrow but leave the wager's fee field set, so get()/wagers() overstate the contract's holdings"}],"hash":"cfb6d509871ff23b750031194e76fd687028863378048db789a9f719c22c09e6","nodeId":"286af504-3d39-4667-8727-d61e5c037678","outcome":"completed","summary":"The review is complete. The findings file is written and verified against the tree.\n\n**Outcome:** eight findings in `.imd-findings.json`, two medium, four low, two info, with a 24-row coverage record answering all 20 entry points plus the manifest, deployability, EIP-712 domain and the full test suite. No source file was changed. The existing suite passes with 222 tests.\n\n**What I confirmed on chain before keeping the top findings.** The Robinhood IMD token at the launch's `imd` argument is an owner-controlled OFT with a blocklist. On a chain-4663 fork I had its owner block an address, and transfers to it, from it, and `transferFrom` pulling from it all reverted. The Ethereum IMD has no such switch, so the earlier mainnet audits never saw this.\n\n**Findings, most severe first:**\n1. **Medium, SwarmMarket.** `settle` pushes the creator's and treasury's fee, and `_void` pushes the escrow to the creator, before any staker can claim. A blocked creator freezes every staker in their markets. A blocked treasury freezes every market with a nonzero fee. My proof test fails on the current code in all three cases.\n2. **Medium, SwarmWager.** `_refund` and `abandon` push both parties' stakes in one call. A blocked party freezes the counterparty's stake. The specialist's proof fails for the stated reason and is attached.\n3. **Low.** The 1-hour resolve window can fall entirely inside a sequencer block gap on an Arbitrum chain, after which the market can only void. The code matches the brief, so this is a requester decision.\n4. **Low.** SwarmWager `resolve` has no upper bound, so after three days it overlaps `abandon` and the likely loser can unwind first.\n5. **Low.** SwarmWager `create` accepts bodies over Intake's 16 KiB cap, locking the counterparty until `abandon`. Merged from two specialists.\n6. **Low.** SwarmWager `settle` lacks the market's issued-at bound and panel floor, so a late answer pays or refunds depending on transaction order. Merged from two reports.\n7. **Info.** Rounding dust of up to one wei per winner stays locked. Merged from two reports.\n8. **Info.** `cancel` and `abandon` leave the wager's fee field set after returning it.\n\n**Dropped or reclassified:** nothing was dropped. Every specialist claim reproduced. I also checked leads they did not cover: the live Intake's `requests` getter returns four words as `markLost` expects, the treasury is an EOA on Ethereum so the same key controls it on Robinhood Chain, and the compiled runtimes' `MCOPY` and `PUSH0` opcodes execute on the chain.","treeHash":null,"usage":{"cachedInputTokens":2027087,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":43666,"runtime":"claude","turns":33,"wallClockMs":653199}},{"artifacts":[],"attempt":1,"bundleHash":"39a58444023fc2b92c82b1b43f707d0e5b1af9b39ab120bce72e99e08ea5f9f9","device":"797dadf3f0881394","findings":[{"description":"cancel() and abandon() push stake + fee back but never zero w.fee, unlike resolve(), which zeroes it. The Refunded state blocks every further use, so no funds are at risk, but get()/wagers() keep reporting an escrow the contract no longer holds; an indexer that sums `fee` over wagers overstates the contract's holdings.","line":181,"path":"src/SwarmWager.sol","reproduction":"create(body, true, 10 ether, now+1h, now+1h) at price 0.5 IMD, then cancel(1) as the creator: the creator receives 10.5 IMD and the contract balance is 0, but wagers(1).fee still reads 0.5 IMD (expected 0). Same after abandon(). test/RobinhoodSystemInvariant.t.sol checks the balance equality instead of this field.","severity":"info","title":"SwarmWager.cancel and abandon leave the fee escrow field set after returning it"},{"description":"The brief says SwarmWager settles 'the same way' as SwarmMarket. SwarmMarket also requires panelSize >= MIN_PANEL (7) and issuedAt <= askedAt + ANSWER_WINDOW; SwarmWager requires neither, so a strict-majority answer from a 2- to 6-seat panel, or one issued after the 3-day window, pays the whole pot. Both parties see the body (which names the panel) before staking, so this is a documented trust choice of the audited #2189 design rather than a bug; recorded so the difference is a decision, not an accident.","line":246,"path":"src/SwarmWager.sol","reproduction":"Shared registry on chain 4663: a wager and a market are both answered with a verified yes from panelSize 5, quorum 3, agreed 4. SwarmMarket.settle voids (reason 21); SwarmWager.settle pays 2*stake to the yes side. Driven in test_handlerReachesEveryOutcome (mode 2) in test/RobinhoodSystemInvariant.t.sol.","severity":"info","title":"SwarmWager settles on answers SwarmMarket would void (no MIN_PANEL, no issuedAt deadline)"},{"description":"Each winner's share is floor(stake * winnersShare / winningPool), so up to (winners - 1) wei per decided market stays in the contract after every claim, with no sweep (by design there is no owner). Harmless in amount; the invariant suite bounds it at under one wei per staker and checks claims never exceed what a market holds.","line":241,"path":"src/SwarmMarket.sol","reproduction":"Yes pool 30e18 + 11e18 from two stakers, No pool 70e18: fee 1.4e18, winnersShare 68.6e18; the two claims sum to 68.6e18 + 41e18 minus at most 1 wei, and that wei stays in SwarmMarket.","severity":"info","title":"SwarmMarket rounding dust is locked forever"}],"hash":"d11717693a623c332140cca24da8f9528d63e4035a75d35e5cec1fede15b277c","nodeId":"94f8b442-af99-42ae-b301-d7c3bb02e8fd","outcome":"completed","summary":"I added a system-level test suite that runs all three contracts together on chain 4663, and the full suite passes with the verifier's seed: 222 passed, 0 failed, 1 skipped. The skipped one is an older fork test that only runs when an RPC address is supplied, so it skips here.\n\n**What I added**\n- **`test/RobinhoodSystemInvariant.t.sol`** deploys the registry, SwarmMarket and SwarmWager in one CREATE2 call on chain 4663, in the launch order, with the market and wager pointing at the registry. It then runs 128 random sequences of 80 calls each across all three, from four users:\n  - every market and wager action, including resolving and settling at the wrong time or in the wrong state;\n  - eleven kinds of oracle delivery: yes, no, a panel of 5, an answer issued right at the deadline, a bool that isn't 0 or 1, the wrong answer type, the wrong signing key, no strict majority, refused, no result, and an ask stranded and then marked lost;\n  - price changes, time jumps, and steps that take one market or wager through its whole life, so decided markets show up in random runs.\n\n  Any unexpected revert fails the run, and every expected revert is checked against its specific error.\n- **Checks on each settle**, worked out from what was delivered rather than read back from the contract:\n  - the market's Yes/No/void result;\n  - the 2% fee on the losing pool, split between creator and treasury;\n  - the payout each winner can claim;\n  - that the wager pays the right side.\n- **Invariants:**\n  - each contract holds exactly what it owes: fee money, open stakes, minus fees and claims paid out;\n  - claims never exceed what a market holds, and rounding leaves less than 1 wei per staker;\n  - finished markets and wagers never reopen;\n  - the registry keeps no IMD and no spending approval, and neither the market nor the wager leaves one;\n  - Intake is paid exactly once per resolve;\n  - the token supply stays the same.\n- **`test_handlerReachesEveryOutcome`** proves the invariants aren't vacuous: it walks through Yes, No, a void for a too-small panel, a void for a late answer, a paid wager, a refunded wager, and claims.\n- I added a short section on the suite to `test/TESTING.md`.\n\n**Findings in `.imd-findings.json`** (all low-impact information; nothing high or critical, and no funds at risk):\n1. SwarmWager's `cancel` and `abandon` return the fee but leave the `fee` field set, so `get()` reports money the contract no longer holds.\n2. SwarmWager doesn't apply SwarmMarket's minimum panel of 7 or its answer deadline. A majority answer from a panel of 5 pays a wager, while the same answer voids a market. The brief says the wager is settled \"the same way\", so I recorded this for someone to confirm it's intended. Both sides see the panel size before staking, so it may well be a deliberate design choice.\n3. SwarmMarket's rounding dust (under 1 wei per winner) stays locked forever, since there is no owner to recover it.\n\n**Still owed:** a test run against the real Intake v2 and IMD on Robinhood Chain. This machine has no RPC address for that chain, so it could not be done here.","treeHash":"c94fa5031e5292b6605bb54448a3b92b8464a9a5","usage":{"cachedInputTokens":2198047,"inputTokens":46,"model":"claude-opus-5-5","outputTokens":44191,"runtime":"claude","turns":25,"wallClockMs":1180316}},{"artifacts":[],"attempt":1,"bundleHash":"8fc39ed7ef7ab154fc876d332c5596c6d03c8c8466bef00b85fb6f6fa1f404ad","device":"234a4a00ca903cb9","findings":[],"hash":"ece2c5a2b51df78e9538a89e490168e4c8c4df034536dc4e495aeaee48183f66","nodeId":"e24017d5-b3a1-42de-b1f2-388f83fd1592","outcome":"completed","summary":"I didn't change `launch.json`: the manifest from the previous round is already correct and matches the accepted source.\n\n- **Order and arguments:** the three contracts appear in this order with these constructor arguments, which match both the source and the brief:\n  - `AskSwarmRegistry(intake, imd, signer)` takes the three static addresses from the brief.\n  - `SwarmMarket(registry, imd, treasury)` takes `$contract:AskSwarmRegistry`, IMD `0x5f7b…7127` and the treasury `0x571e…320c`.\n  - `SwarmWager(registry, imd)` takes `$contract:AskSwarmRegistry` and IMD.\n- **No `$owner`:** none of the contracts has an owner or admin argument, so the manifest doesn't use `$owner`.\n- **Schema:** the file has only `kind`, `contracts` and `notes`. The notes are 2,133 characters, under the 4,000 limit, and their description of how the registry pays Intake matches the code.\n- **Build and tests:** `forge build` succeeds. `forge test` with the verifier's fuzz seed ran 23 suites: 230 tests passed, 0 failed and 1 was skipped.\n\nNo other file was modified.","treeHash":"522f1cf4e71607519b555aa53e1f9935422ca0cd","usage":{"cachedInputTokens":181119,"inputTokens":12,"model":"claude-opus-5-5","outputTokens":1415,"runtime":"claude","turns":6,"wallClockMs":382680}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e764f15311426447","findings":[{"citation":"resolved","description":"Round 2 status: unchanged by the author, who answered that the brief fixes the window at 1h and that resizing it is the requester's economic choice; it is recorded in ADAPTATION.md under 'Review findings left for the requester'. The behaviour still reproduces exactly as in round 1 (the attached specialist proof Proof_cade4e8c0911 still fails with TooLate() on this tree). I accept the author's answer as a design decision that belongs to the requester, so this stays advisory and is not a blocker. Substance: resolve is legal only while block.timestamp is in [resolveAfter, resolveAfter + 1 hours] and abandon (line 196) voids the market as soon as that window has passed. On Robinhood Chain (Arbitrum stack, one sequencer, ~24h forced inclusion) a block gap longer than the window means no block carries a timestamp inside it, so resolve reverts TooLate forever, anyone (typically the losing side) calls abandon, every stake is refunded and the swarm is never asked. Funds are not lost. Fix, if the requester wants it: size RESOLVE_WINDOW to the chain's liveness guarantee or make it a creator-chosen term bounded by MAX_TERM, keeping abandon strictly after it.","line":177,"path":"src/SwarmMarket.sol","reproduction":"Chain 4663 mocks. Market 1: closeAt = T+1h, resolveAfter = T+2h, bool body; Yes 100 IMD, No 100 IMD; price 0.5 IMD, escrow 0.5 IMD. Blocks: one at resolveAfter - 1 (resolve reverts TooEarly), then none until resolveAfter + 2h. Call resolve(1) at resolveAfter + 2h. Expected (a fully staked market with an available oracle is asked): phase Asked. Actual: TooLate(); abandon(1) then succeeds, phase Void, claimable(1, yes) = claimable(1, no) = 100 IMD, escrow back to the creator. Re-run this round: .imd/reads/proofs/Proof_cade4e8c0911.t.sol copied to test/scratch/ fails with TooLate() on the revised code, as before.","severity":"low","snippet":"        if (block.timestamp > uint256(m.resolveAfter) + RESOLVE_WINDOW) revert TooLate();","title":"SwarmMarket's 1-hour RESOLVE_WINDOW on a single-sequencer chain: a block gap over the window makes a fully staked market only abandonable (unchanged, author disputes as a requester decision)"},{"citation":"resolved","description":"Round 2 status: unchanged by the author, who answered that this is the documented #2189 design ('the first of resolve or abandon wins' in the NatSpec at line 213, recorded by the #2189 tests) and that adding a resolve window brings in the liveness trade-off of the RESOLVE_WINDOW finding; it is recorded in ADAPTATION.md for the requester. The behaviour still reproduces exactly as in round 1 (the attached specialist proof Proof_5bda6bea2ad7 still fails with 'resolve and abandon both legal at the same time'). I accept that this is a design asymmetry for the requester to decide, not a bypass, so it stays advisory. Substance: resolve only checks block.timestamp >= resolveAfter; abandon (line 236) opens at resolveAfter + ANSWER_WINDOW + 1 and refunds both stakes. From that second on whichever transaction lands first decides whether the swarm settles the bet or it is unwound, and the party expecting to lose has the incentive to abandon. SwarmMarket closed the same pair in #2190 with RESOLVE_WINDOW. Fix, if wanted: a resolve window after resolveAfter with abandon strictly after it.","line":217,"path":"src/SwarmWager.sol","reproduction":"Wager 1 created by alice (Yes, 100 IMD, fee 0.5 IMD, joinBy T+1d, resolveAfter T+2d), joined by bob (No, 100 IMD). Nobody resolves for three days after resolveAfter. At block.timestamp = resolveAfter + 3 days + 1: (a) bob calls abandon(1): succeeds, state Refunded, bob back to 1000 IMD, the swarm never asked; (b) from the same state alice calls resolve(1): succeeds, state Asked, 0.5 IMD paid to the registry. Expected: exactly one of resolve/abandon legal at any timestamp, as in SwarmMarket. Actual: both. Re-run this round: .imd/reads/proofs/Proof_5bda6bea2ad7.t.sol copied to test/scratch/ fails on the revised code with the same message.","severity":"low","snippet":"        if (block.timestamp < w.resolveAfter) revert TooEarly();","title":"SwarmWager.resolve has no upper time bound, so from resolveAfter + ANSWER_WINDOW + 1 both resolve and abandon are legal on the same matched wager (unchanged, author disputes as the documented #2189 de"},{"citation":"resolved","description":"Round 2 status: unchanged by the author, who answered that the 'race to settlement' NatSpec (line 249-250) and the #2189 ordering tests document this, that the panel is chosen in a body both parties see, and that mirroring SwarmMarket's bounds would change which answers pay; recorded in ADAPTATION.md for the requester. Still reproduces as in round 1. Accepted as a requester decision; advisory, not blocking. Substance: SwarmMarket.settle voids when a.issuedAt > askedAt + ANSWER_WINDOW (line 216, reason 22) and when a.panelSize < MIN_PANEL (line 215, reason 21). SwarmWager.settle has neither bound: a verified strict-majority bool answer pays the whole pot however late it was issued and from a panel as small as 2, while a Pending record after the window refunds both (line 256-258). So for an answer issued after the three-day window the payout depends on which transaction lands first (the writer's completion, or a party's settle), although the brief says the two contracts settle the same way. The precondition (an answer more than three days late) is abnormal, hence low.","line":260,"path":"src/SwarmWager.sol","reproduction":"Matched wager: alice Yes, bob No, 3 IMD each, resolved at R (askedAt = R). Oracle answer Yes with issuedAt = R + 3d + 1, delivered then. Order A: the registry record lands, then anyone calls settle: alice is paid 6 IMD, bob ends at 97 IMD. Order B: bob calls settle at R + 3d + 1 before the record lands: both refunded, bob at 100 IMD, the later delivery is irrelevant. Same inputs and timestamps, two payouts chosen by whoever lands first; a SwarmMarket with the same issuedAt voids in both orders (reason 22). Panel floor: a verified Yes from panelSize 5, quorum 3, agreed 4 pays the wager's pot while SwarmMarket.settle voids (reason 21); test/RobinhoodSystemInvariant.t.sol test_handlerReachesEveryOutcome (deliver mode 2) records both outcomes on this tree.","severity":"low","snippet":"        bool usable = k.status == IAskSwarmRegistry.Status.Answered && a.verified && a.answerType == BOOL\n            && a.answer.length == 32 && uint256(a.agreed) * 2 > a.panelSize;","title":"SwarmWager.settle pays on answers SwarmMarket.settle would void: no signed-issuedAt bound and no MIN_PANEL floor (unchanged, author disputes as the accepted #2189 design)"}],"hash":"fcd43377ce40eb423fb838fb5fab01d0cc827852fd022780b59bd06f5d5fb6bb","nodeId":"286af504-3d39-4667-8727-d61e5c037678","outcome":"completed","summary":"Review complete. The findings file is written and validated, and the working tree holds nothing else (test/scratch was removed after the proof runs).\n\n**Settled from round 1**\n\n- **Both mediums are fixed.** The attached proofs for the blocked-creator/treasury freeze in SwarmMarket and the blocked-party freeze in SwarmWager now pass on the revised code. Every push to a third party in resolve, settle, _void, _refund and abandon goes through a new credit-on-revert path, with a per-address withdraw. I checked the new code as fresh code: a false or malformed reply still rolls the whole call back, so nothing can be paid twice, and a caller cannot force the credit path by gas starvation because the 63/64 rule leaves too little gas for the credit's storage write.\n- **Body cap in SwarmWager.create is fixed.** The specialist proof's lock scenario can no longer be set up because create now reverts with BadTerms above 16,384 bytes.\n- **Fee field zeroing in cancel and abandon is fixed** and tested.\n- **Rounding dust** is now stated in the contract's invariants, which is what I asked for. Dropped.\n\n**Kept as low advisory, unchanged by the author's choice**\n\n1. SwarmMarket's 1-hour resolve window on a single-sequencer chain.\n2. SwarmWager's unbounded resolve overlapping abandon.\n3. SwarmWager settling on late-issued or small-panel answers that SwarmMarket would void.\n\nAll three still reproduce (the two attached proofs fail exactly as before). The author's answer that each is a requester-level design choice documented in ADAPTATION.md is reasonable, so none blocks the launch.\n\n**Nothing new.** The full suite passes with the recorded seed (234 passed, 1 fork-only skip). The manifest uses only the schema's keys, the brief's static addresses and a backward contract reference, and the empty-chain CREATE2 rehearsal test passes. The coverage record answers all 22 entry points plus three invariant rows.","treeHash":null,"usage":{"cachedInputTokens":852965,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":17145,"runtime":"claude","turns":18,"wallClockMs":608312}}],"verification":[{"checks":[{"durationMs":87254,"exitCode":0,"name":"build","output":"Compiling 53 files with Solc 0.8.26\nSolc 0.8.26 finished in 87.17s\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":30118,"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 445.82µ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.42ms (853.48µs CPU time)\n\nRan 2 tests for test/SwarmWagerLiveRegistry.t.sol:SwarmWagerLiveRegistryTest\n[PASS] test_launchAddressesAndLiveAskGetAndUnverifiedRefund() (gas: 1147131)\n[PASS] test_liveLostOutcomeRefunds() (gas: 913967)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.61ms (824.52µs CPU time)\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2270377)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.52ms (6.55ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 526475)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 431549)\n[PASS] test_badTerms() (gas: 117795)\n[PASS] test_cancelUnmatched() (gas: 468784)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385876)\n[PASS] test_minorityAnswerRefunds() (gas: 1003852)\n[PASS] test_noWins() (gas: 1031853)\n[PASS] test_nonBoolAnswerRefunds() (gas: 1029900)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 1030322)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786321)\n[PASS] test_refusedRefunds() (gas: 842526)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 730962)\n[PASS] test_settleOnlyOnce() (gas: 1064491)\n[PASS] test_splitPanelRefunds() (gas: 859479)\n[PASS] test_yesWins() (gas: 1095859)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 45.38ms (6.98ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 429495, ~: 425943)\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 66.44ms (74.52ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1220027, ~: 1233303)\n[PASS] test_abandon() (gas: 747140)\n[PASS] test_bothSidesSameUser() (gas: 1183564)\n[PASS] test_guards() (gas: 436805)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2143676)\n[PASS] test_noWins() (gas: 1210671)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520296)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1022980)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112631)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281641)\n[PASS] test_yesWinsProRataWithFee() (gas: 1366981)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 112.28ms (114.90ms CPU time)\n\nRan 26 tests for test/SwarmWagerReview.t.sol:SwarmWagerReviewTest\n[PASS] testFuzz_allAcceptedTermsHaveBoundedExit(uint64,uint64,bool) (runs: 256, μ: 373591, ~: 330491)\n[PASS] testFuzz_onlyCanonicalMajorityBoolPays(uint256,uint16,uint16) (runs: 256, μ: 1005079, ~: 1017307)\n[PASS] testFuzz_topUpFeeConservation(uint96,uint96,bool) (runs: 256, μ: 887243, ~: 1197852)\n[PASS] testFuzz_wrongBoolLengthRefunds(uint8) (runs: 256, μ: 992685, ~: 987288)\n[PASS] test_abandonBeforeLateResolvePreventsAnAsk() (gas: 473416)\n[PASS] test_abandonReturnsAllTopUpsToCreator() (gas: 433654)\n[PASS] test_badSignatureRefundsBothStakes() (gas: 1009930)\n[PASS] test_creatorTopUpRecoversWagerAfterPriceRise() (gas: 1191517)\n[PASS] test_exactJoinAndResolveBoundaryRemainsSupported() (gas: 977893)\n[PASS] test_expiredAtDeliveryRefundsBothStakes() (gas: 979775)\n[PASS] test_lateAnswerBeforeTimeoutSettlementStillPaysWinner() (gas: 1049816)\n[PASS] test_lostCallbackRefundsBothStakes() (gas: 884685)\n[PASS] test_maximumFeeEscrowCanBeFundedAndAbandoned() (gas: 531708)\n[PASS] test_maximumTermCanStillBeMatchedAndUnwound() (gas: 449314)\n[PASS] test_maximumTimestampAndOverlongTermsRejectedBeforePayment() (gas: 102218)\n[PASS] test_priceDecreaseReturnsOnlyRemainderAndApprovesExactPrice() (gas: 808079)\n[PASS] test_priceRiseRevertsWithoutSpendingStakesAndAbandonStillWorks() (gas: 556509)\n[PASS] test_resolutionAfterAbandonDeadlineCanWinTheRace() (gas: 1051298)\n[PASS] test_resolveCallerChoosesAskTimeForRelativeWindows() (gas: 731350)\n[PASS] test_resolveWaitsThroughGapAfterJoinDeadline() (gas: 731606)\n[PASS] test_thirdPartyTopUpIsExplicitAndUnusedFeeGoesToCreator() (gas: 1177687)\n[PASS] test_timeoutIsStrictlyAfterAnswerWindow() (gas: 838828)\n[PASS] test_timeoutSettlementBeforeLateAnswerRemainsRefunded() (gas: 1057759)\n[PASS] test_topUpRefusesUnknownOpenAskedAndTerminalWagers() (gas: 1345614)\n[PASS] test_topUpRefusesZeroOverflowAndRollsBackFailedPayment() (gas: 573580)\n[PASS] test_writerPairingOfAnotherQuestionsAnswerIsTrusted() (gas: 1164208)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 254.08ms (569.82ms CPU time)\n\nRan 4 tests for test/SwarmWagerDeployment.t.sol:SwarmWagerDeploymentTest\n[PASS] test_constructorRejectsZeroDependenciesAndNativeValue() (gas: 3966)\n[PASS] test_factoryDeploysOnlyWagerOnEmptyChainWithStaticArguments() (gas: 3410212)\n[PASS] test_projectScriptRejectsOtherChains() (gas: 2009226)\n[PASS] test_projectScriptUsesExistingMainnetRegistry() (gas: 3539625)\nLogs:\n  SwarmWager 0x34A1D3fff3958843C43aD80F30b94c510645C316 chain 1\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 254.03ms (3.64ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 210500, ~: 221751)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 568981, ~: 574406)\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 258.26ms (455.19ms CPU time)\n\nRan 6 tests for test/RobinhoodChainLaunch.t.sol:RobinhoodChainLaunchTest\n[PASS] test_deploymentSendsNoValueAndRejectsEth() (gas: 6967010)\n[PASS] test_factoryDeploysAllThreeInOrderOnEmptyChain4663() (gas: 13982101)\n[PASS] test_mainnetImdWouldMakeTheRegistryInertOnChain4663() (gas: 1031204)\n[PASS] test_marketAndWagerLifecycleOnChain4663() (gas: 3719214)\n[PASS] test_registryDomainIsChain4663AndItsOwnAddress() (gas: 36978)\n[PASS] test_signatureUnderAnotherChainsDomainIsUnverified() (gas: 2567058)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 258.81ms (16.88ms 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 258.83ms (8.08ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1011576, ~: 974614)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839257, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 500006, ~: 497931)\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 258.93ms (680.19ms CPU time)\n\nRan 10 tests for test/SwarmWagerBoundaries.t.sol:SwarmWagerBoundariesTest\n[PASS] testFuzz_majorityBoundaryAcrossUint16Range(uint16,bool,bool,bool) (runs: 1000, μ: 995519, ~: 989962)\n[PASS] testFuzz_nonBoolTypeCannotPayEvenWithCanonicalBoolBytes(uint8,bool) (runs: 1000, μ: 996400, ~: 1006187)\n[PASS] test_failedCreateAndJoinDoNotLeavePhantomPositionsOrParticipants() (gas: 855348)\n[PASS] test_maximumStakeAndMaximumFeeDoNotNarrowCombinedAmounts() (gas: 1126236)\n[PASS] test_missingRegistryRecordUsesTimeoutInsteadOfPayingEmbeddedAnswer() (gas: 825603)\n[PASS] test_oversizedBodyRejectedByTransportLeavesFeeAndStakesRefundable() (gas: 4252869)\n[PASS] test_retiredActionRollsBackApprovalAndCanBeAbandoned() (gas: 546125)\n[PASS] test_sharedQuestionIndexCannotSubstituteAnotherWagersAnswer() (gas: 1849034)\n[PASS] test_unavailablePriceDoesNotChargeCreateOrTrapMatchedEscrow() (gas: 674356)\n[PASS] test_zeroAndUnrepresentableFeesRejectBeforeFunding() (gas: 233192)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 260.88ms (501.53ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 818884, ~: 692833)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504207, ~: 492611)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 518191, ~: 523543)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 505993, ~: 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 261.04ms (723.80ms CPU time)\n\nRan 35 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_acceptedTermsAlwaysUnwindWithinHorizon(uint64,uint64,uint8) (runs: 256, μ: 737788, ~: 741259)\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2081784, ~: 2075866)\n[PASS] testFuzz_openRejectsEveryResolveAfterPastMaxTerm(uint64,uint64) (runs: 256, μ: 56700, ~: 56595)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 624234, ~: 522968)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 549455)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1160955)\n[PASS] test_answerDeliveredInWindowSettlesAfterDeadline() (gas: 1124495)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1249390)\n[PASS] test_issuedAtBoundsTheAnswerWindow() (gas: 1923420)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1381977)\n[PASS] test_maxTermMarketAbandonsAfterResolveWindow() (gas: 716434)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2707778)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 554684)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1292972)\n[PASS] test_openAcceptsExactMaxTermAndMarketStillUnwinds() (gas: 778967)\n[PASS] test_openRejectsBodyLongerThanIntakeAccepts() (gas: 8125554)\n[PASS] test_openRejectsResolveAfterBeyondMaxTerm() (gas: 151931)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 921740)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1133713)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 841691)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 503485)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 574402)\n[PASS] test_settleNeedsRegistryRecordThenVoidsPendingAfterDeadline() (gas: 919739)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1899953)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2427211)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 481728)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 535468)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1201842)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 561958)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 864537)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 763136)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1200528)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1286815)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1055965)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3614414)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 260.91ms (383.62ms CPU time)\n\nRan 7 tests for test/SwarmMarketPayments.t.sol:SwarmMarketPaymentsTest\n[PASS] testFuzz_failedPullOrApprovalIsAtomicAndRetryable(uint8,uint8) (runs: 1000, μ: 1226540, ~: 1240723)\n[PASS] testFuzz_failedTreasuryTransferRollsBackCreatorFee(uint8) (runs: 1000, μ: 1349421, ~: 1349486)\n[PASS] test_failedAbandonRefundRollsBackVoidAndAllowsRetry() (gas: 704898)\n[PASS] test_failedClaimPreservesEntitlementAndDoesNotBlockAnotherWinner() (gas: 1383571)\n[PASS] test_failedRemainderRefundRollsBackAlreadyPaidOracle() (gas: 1316831)\n[PASS] test_noReturnPullsAndApprovalsReachAnOrdinaryPayout() (gas: 1211423)\n[PASS] test_poolOverflowCannotChargeOrChangeAnUnrelatedMarket() (gas: 944902)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 260.96ms (513.91ms CPU time)\n\nRan 3 tests for test/SwarmWagerAtomicity.t.sol:SwarmWagerAtomicityTest\n[PASS] testFuzz_failedPaymentPreservesConcurrentEscrow(uint8,uint8,uint8,uint96) (runs: 1000, μ: 1386397, ~: 1294278)\n[PASS] test_everyPaymentLegRejectsFalseRevertAndMalformedReturns() (gas: 93507466)\n[PASS] test_noReturnTokenCompletesWinsRefundsCancellationAndAbandonment() (gas: 2560329)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 260.97ms (322.30ms 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        | 1358  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1371  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1326  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1341  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1390  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1436  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1349  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1398  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1319  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.97s (6.97s 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                     | 2191  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2250  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2285  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2198  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2188  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2232  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2287  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2265  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2210  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2222  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2248  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.46s (12.45s CPU time)\n\nRan 2 tests for test/SwarmWagerInvariant.t.sol:SwarmWagerInvariantTest\n[PASS]\nSwarmWagerInvariantTest invariants:\n[PASS] invariant_escrowAndEveryActorBalanceReconcile\n[PASS] invariant_termsRequestsAndTerminalStatesStayConsistent\n SwarmWagerInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| SwarmWagerHandler | abandon        | 2450  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | advanceTime    | 2576  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | cancel         | 2556  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | changePrice    | 2541  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | create         | 2433  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | deliver        | 2488  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | donate         | 2491  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | failingResolve | 2574  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | join           | 2561  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | resolve        | 2599  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | settle         | 2519  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | topUp          | 2474  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | wrongState     | 2506  | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesEveryOutcomeAndAllExitPaths() (gas: 38042355)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 15.88s (15.91s 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     | 2264  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | advance     | 2147  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | changePrice | 2277  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | claim       | 2208  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | deliver     | 2311  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | donate      | 2184  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | openMarket  | 2226  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | resolve     | 2173  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | settle      | 2258  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | stake       | 2261  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | topUp       | 2267  | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesAllPhasesAndUnwinds() (gas: 3122665)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 30.02s (30.02s CPU time)\n\nRan 22 test suites in 30.02s (68.41s CPU time): 220 tests passed, 0 failed, 1 skipped (221 total tests)\n","passed":true},{"durationMs":205,"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)\",\"SwarmWager.topUpFee(uint256,uint96)\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":10,\"ADAPTATION.md\":168,\"README.md\":322,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/keeper.mjs\":1,\"api/markets.mjs\":1,\"api/price.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":601,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION-2189.md\":167,\"contracts/ADAPTATION-2190.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-RH.md\":10,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":25,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":12478,\"docs/askswarm.png\":1536,\"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\":200,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":123,\"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-handson.tsv\":8,\"docs/brand/voiceover.tsv\":8,\"docs/demo/marks.json\":11,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":12,\"docs/vids/askswarm-demo-silent.mp4\":10008,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7271,\"docs/vids/scene6.mp4\":526,\"docs/vids/scene7.mp4\":303,\"docs/vids/scene8.mp4\":234,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":39,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/keeper.ts\":135,\"functions/markets.ts\":65,\"functions/price.ts\":43,\"functions/telegram.ts\":24,\"functions/wagers.ts\":66,\"launch.json\":29,\"lib/announce.ts\":42,\"lib/answers.json\":1,\"lib/bot.ts\":310,\"lib/hfsync.ts\":49,\"lib/logs.ts\":27,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":32,\"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\":94,\"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\":171,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/market.html\":464,\"public/message.svg\":3,\"public/nav.js\":36,\"public/og.png\":1364,\"public/pay.html\":47,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":198,\"script/Deploy.s.sol\":23,\"script/DeployMarket.s.sol\":23,\"script/DeployWager.s.sol\":20,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-market.ts\":30,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/e2e-tg.ts\":23,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/keeper.ts\":4,\"scripts/launch.ts\":65,\"scripts/open-market.ts\":18,\"scripts/record-demo.ts\":101,\"scripts/smoke.ts\":75,\"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\":283,\"src/SwarmWager.sol\":292,\"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/RobinhoodChainLaunch.t.sol\":400,\"test/SWARM_WAGER_TESTING.md\":47,\"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\":722,\"test/SwarmMarketTesting.md\":89,\"test/SwarmWager.t.sol\":282,\"test/SwarmWagerAtomicity.t.sol\":268,\"test/SwarmWagerBoundaries.t.sol\":254,\"test/SwarmWagerDeployment.t.sol\":90,\"test/SwarmWagerInvariant.t.sol\":122,\"test/SwarmWagerLiveRegistry.t.sol\":88,\"test/SwarmWagerReview.t.sol\":450,\"test/TESTING.md\":83,\"test/helpers/RegistryTestSupport.sol\":289,\"test/helpers/SwarmWagerHandler.sol\":523,\"test/mocks/IntakeMocks.sol\":100,\"test/mocks/WagerFaultToken.sol\":88,\"tsconfig.json\":8,\"vercel.json\":15},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":true}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"15349f91e383d9497c5cfcb5ff64b854edb6e1939dd0e075ca24d1fbe889f669","verifiedTreeHash":"e6a0843cabaaa6bdbe5c0910db6e8a4f36cf9222","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":97519,"exitCode":0,"name":"build","output":"Compiling 55 files with Solc 0.8.26\nSolc 0.8.26 finished in 97.42s\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":31525,"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 586.14µ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.79ms (782.26µs CPU time)\n\nRan 2 tests for test/SwarmWagerLiveRegistry.t.sol:SwarmWagerLiveRegistryTest\n[PASS] test_launchAddressesAndLiveAskGetAndUnverifiedRefund() (gas: 1147525)\n[PASS] test_liveLostOutcomeRefunds() (gas: 914229)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.38ms (1.20ms CPU time)\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2397287)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.15ms (7.08ms CPU time)\n\nRan 6 tests for test/RobinhoodChainLaunch.t.sol:RobinhoodChainLaunchTest\n[PASS] test_deploymentSendsNoValueAndRejectsEth() (gas: 7255479)\n[PASS] test_factoryDeploysAllThreeInOrderOnEmptyChain4663() (gas: 14645543)\n[PASS] test_mainnetImdWouldMakeTheRegistryInertOnChain4663() (gas: 1031226)\n[PASS] test_marketAndWagerLifecycleOnChain4663() (gas: 3719710)\n[PASS] test_registryDomainIsChain4663AndItsOwnAddress() (gas: 36978)\n[PASS] test_signatureUnderAnotherChainsDomainIsUnverified() (gas: 2567290)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 25.19ms (23.84ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 429613, ~: 425951)\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 87.51ms (100.02ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1220074, ~: 1233540)\n[PASS] test_abandon() (gas: 747384)\n[PASS] test_bothSidesSameUser() (gas: 1183773)\n[PASS] test_guards() (gas: 436941)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2144194)\n[PASS] test_noWins() (gas: 1210902)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520400)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1023270)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112925)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281872)\n[PASS] test_yesWinsProRataWithFee() (gas: 1367238)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 154.03ms (154.66ms CPU time)\n\nRan 8 tests for test/BlockedThirdParty.t.sol:BlockedThirdPartyTest\n[PASS] test_marketAbandonVoidsWhileCreatorBlocked() (gas: 825027)\n[PASS] test_marketResolvesWhileCreatorBlockedAndCreditsRemainder() (gas: 682633)\n[PASS] test_marketSettlesWhileCreatorBlocked() (gas: 967103)\n[PASS] test_marketSettlesWhileTreasuryBlocked() (gas: 1049767)\n[PASS] test_wagerAbandonRefundsCounterpartyWhileOtherBlocked() (gas: 578172)\n[PASS] test_wagerFeeFieldZeroedOnCancelAndAbandon() (gas: 842704)\n[PASS] test_wagerResolvesWhileCreatorBlockedAndCreditsRemainder() (gas: 647704)\n[PASS] test_wagerTimeoutRefundsCounterpartyWhileOtherBlocked() (gas: 805589)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 279.66ms (3.01ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 529701)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 434756)\n[PASS] test_badTerms() (gas: 118120)\n[PASS] test_cancelUnmatched() (gas: 472035)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385989)\n[PASS] test_minorityAnswerRefunds() (gas: 1004158)\n[PASS] test_noWins() (gas: 1032221)\n[PASS] test_nonBoolAnswerRefunds() (gas: 1030206)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 1030628)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786583)\n[PASS] test_refusedRefunds() (gas: 842788)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 731260)\n[PASS] test_settleOnlyOnce() (gas: 1064903)\n[PASS] test_splitPanelRefunds() (gas: 859741)\n[PASS] test_yesWins() (gas: 1096271)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 282.22ms (4.00ms CPU time)\n\nRan 35 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_acceptedTermsAlwaysUnwindWithinHorizon(uint64,uint64,uint8) (runs: 256, μ: 736149, ~: 741165)\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2081757, ~: 2076424)\n[PASS] testFuzz_openRejectsEveryResolveAfterPastMaxTerm(uint64,uint64) (runs: 256, μ: 56739, ~: 56639)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 623493, ~: 523186)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 549651)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1161204)\n[PASS] test_answerDeliveredInWindowSettlesAfterDeadline() (gas: 1124722)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1249617)\n[PASS] test_issuedAtBoundsTheAnswerWindow() (gas: 1923919)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1382334)\n[PASS] test_maxTermMarketAbandonsAfterResolveWindow() (gas: 716734)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2708550)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 554902)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1293291)\n[PASS] test_openAcceptsExactMaxTermAndMarketStillUnwinds() (gas: 779226)\n[PASS] test_openRejectsBodyLongerThanIntakeAccepts() (gas: 8125791)\n[PASS] test_openRejectsResolveAfterBeyondMaxTerm() (gas: 152085)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 922048)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1133998)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 841928)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 503717)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 574620)\n[PASS] test_settleNeedsRegistryRecordThenVoidsPendingAfterDeadline() (gas: 920047)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1900408)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2427983)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 481942)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 535638)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1202267)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 562202)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 864759)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 763428)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1200844)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1287196)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1056166)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3615440)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 284.38ms (450.46ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 210500, ~: 221751)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 568755, ~: 574358)\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 289.39ms (492.21ms CPU time)\n\nRan 10 tests for test/SwarmWagerBoundaries.t.sol:SwarmWagerBoundariesTest\n[PASS] testFuzz_majorityBoundaryAcrossUint16Range(uint16,bool,bool,bool) (runs: 1000, μ: 995942, ~: 990355)\n[PASS] testFuzz_nonBoolTypeCannotPayEvenWithCanonicalBoolBytes(uint8,bool) (runs: 1000, μ: 996794, ~: 1006580)\n[PASS] test_failedCreateAndJoinDoNotLeavePhantomPositionsOrParticipants() (gas: 855922)\n[PASS] test_maximumStakeAndMaximumFeeDoNotNarrowCombinedAmounts() (gas: 1126647)\n[PASS] test_missingRegistryRecordUsesTimeoutInsteadOfPayingEmbeddedAnswer() (gas: 825996)\n[PASS] test_oversizedBodyRejectedAtCreate() (gas: 1749579)\n[PASS] test_retiredActionRollsBackApprovalAndCanBeAbandoned() (gas: 549445)\n[PASS] test_sharedQuestionIndexCannotSubstituteAnotherWagersAnswer() (gas: 1849974)\n[PASS] test_unavailablePriceDoesNotChargeCreateOrTrapMatchedEscrow() (gas: 677797)\n[PASS] test_zeroAndUnrepresentableFeesRejectBeforeFunding() (gas: 233633)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 289.53ms (396.03ms CPU time)\n\nRan 3 tests for test/SwarmWagerAtomicity.t.sol:SwarmWagerAtomicityTest\n[PASS] testFuzz_failedPaymentPreservesConcurrentEscrow(uint8,uint8,uint8,uint96) (runs: 1000, μ: 1388461, ~: 1298327)\n[PASS] test_everyPaymentLegRejectsFalseRevertAndMalformedReturns() (gas: 92914108)\n[PASS] test_noReturnTokenCompletesWinsRefundsCancellationAndAbandonment() (gas: 2567188)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 290.26ms (327.58ms CPU time)\n\nRan 9 tests for test/SwarmMarketPayments.t.sol:SwarmMarketPaymentsTest\n[PASS] testFuzz_failedPullOrApprovalIsAtomicAndRetryable(uint8,uint8) (runs: 1000, μ: 1226432, ~: 1241270)\n[PASS] testFuzz_treasuryFeeTransferFailure(uint8) (runs: 1000, μ: 1330132, ~: 1346757)\n[PASS] test_failedClaimPreservesEntitlementAndDoesNotBlockAnotherWinner() (gas: 1383849)\n[PASS] test_failedWithdrawKeepsCredit() (gas: 522018)\n[PASS] test_malformedRemainderReplyRollsBackAlreadyPaidOracle() (gas: 905745)\n[PASS] test_noReturnPullsAndApprovalsReachAnOrdinaryPayout() (gas: 1211646)\n[PASS] test_poolOverflowCannotChargeOrChangeAnUnrelatedMarket() (gas: 945339)\n[PASS] test_refusedAbandonRefundIsCreditedAndStakersClaim() (gas: 680817)\n[PASS] test_refusedRemainderRefundIsCreditedAndAskStands() (gas: 924784)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 290.96ms (404.56ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1011576, ~: 974614)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839260, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 499991, ~: 497931)\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 290.96ms (671.04ms CPU time)\n\nRan 26 tests for test/SwarmWagerReview.t.sol:SwarmWagerReviewTest\n[PASS] testFuzz_allAcceptedTermsHaveBoundedExit(uint64,uint64,bool) (runs: 256, μ: 376868, ~: 333786)\n[PASS] testFuzz_onlyCanonicalMajorityBoolPays(uint256,uint16,uint16) (runs: 256, μ: 1004747, ~: 1017639)\n[PASS] testFuzz_topUpFeeConservation(uint96,uint96,bool) (runs: 256, μ: 889030, ~: 1198315)\n[PASS] testFuzz_wrongBoolLengthRefunds(uint8) (runs: 256, μ: 993506, ~: 987638)\n[PASS] test_abandonBeforeLateResolvePreventsAnAsk() (gas: 476711)\n[PASS] test_abandonReturnsAllTopUpsToCreator() (gas: 436887)\n[PASS] test_badSignatureRefundsBothStakes() (gas: 1010324)\n[PASS] test_creatorTopUpRecoversWagerAfterPriceRise() (gas: 1192043)\n[PASS] test_exactJoinAndResolveBoundaryRemainsSupported() (gas: 978305)\n[PASS] test_expiredAtDeliveryRefundsBothStakes() (gas: 980125)\n[PASS] test_lateAnswerBeforeTimeoutSettlementStillPaysWinner() (gas: 1050272)\n[PASS] test_lostCallbackRefundsBothStakes() (gas: 884991)\n[PASS] test_maximumFeeEscrowCanBeFundedAndAbandoned() (gas: 535029)\n[PASS] test_maximumTermCanStillBeMatchedAndUnwound() (gas: 452628)\n[PASS] test_maximumTimestampAndOverlongTermsRejectedBeforePayment() (gas: 102479)\n[PASS] test_priceDecreaseReturnsOnlyRemainderAndApprovesExactPrice() (gas: 808358)\n[PASS] test_priceRiseRevertsWithoutSpendingStakesAndAbandonStillWorks() (gas: 559867)\n[PASS] test_resolutionAfterAbandonDeadlineCanWinTheRace() (gas: 1051817)\n[PASS] test_resolveCallerChoosesAskTimeForRelativeWindows() (gas: 731648)\n[PASS] test_resolveWaitsThroughGapAfterJoinDeadline() (gas: 731967)\n[PASS] test_thirdPartyTopUpIsExplicitAndUnusedFeeGoesToCreator() (gas: 1178150)\n[PASS] test_timeoutIsStrictlyAfterAnswerWindow() (gas: 839178)\n[PASS] test_timeoutSettlementBeforeLateAnswerRemainsRefunded() (gas: 1058197)\n[PASS] test_topUpRefusesUnknownOpenAskedAndTerminalWagers() (gas: 1349409)\n[PASS] test_topUpRefusesZeroOverflowAndRollsBackFailedPayment() (gas: 574035)\n[PASS] test_writerPairingOfAnotherQuestionsAnswerIsTrusted() (gas: 1164576)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 290.76ms (482.68ms 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 291.03ms (14.61ms CPU time)\n\nRan 4 tests for test/SwarmWagerDeployment.t.sol:SwarmWagerDeploymentTest\n[PASS] test_constructorRejectsZeroDependenciesAndNativeValue() (gas: 3966)\n[PASS] test_factoryDeploysOnlyWagerOnEmptyChainWithStaticArguments() (gas: 3694662)\n[PASS] test_projectScriptRejectsOtherChains() (gas: 2154869)\n[PASS] test_projectScriptUsesExistingMainnetRegistry() (gas: 3820063)\nLogs:\n  SwarmWager 0x34A1D3fff3958843C43aD80F30b94c510645C316 chain 1\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 290.98ms (3.79ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 816898, ~: 690533)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504233, ~: 492611)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 518070, ~: 523532)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 506020, ~: 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 291.15ms (1.18s 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        | 1358  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1371  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1326  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1341  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1390  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1436  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1349  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1398  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1319  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.39s (7.39s 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                     | 2191  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2250  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2285  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2198  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2188  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2232  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2287  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2265  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2210  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2222  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2248  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.77s (12.76s CPU time)\n\nRan 2 tests for test/SwarmWagerInvariant.t.sol:SwarmWagerInvariantTest\n[PASS]\nSwarmWagerInvariantTest invariants:\n[PASS] invariant_escrowAndEveryActorBalanceReconcile\n[PASS] invariant_termsRequestsAndTerminalStatesStayConsistent\n SwarmWagerInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| SwarmWagerHandler | abandon        | 2450  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | advanceTime    | 2576  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | cancel         | 2556  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | changePrice    | 2541  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | create         | 2433  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | deliver        | 2488  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | donate         | 2491  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | failingResolve | 2574  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | join           | 2561  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | resolve        | 2599  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | settle         | 2519  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | topUp          | 2474  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | wrongState     | 2506  | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesEveryOutcomeAndAllExitPaths() (gas: 38060620)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 16.79s (16.80s 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     | 2264  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | advance     | 2147  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | changePrice | 2277  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | claim       | 2208  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | deliver     | 2311  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | donate      | 2184  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | openMarket  | 2226  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | resolve     | 2173  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | settle      | 2258  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | stake       | 2261  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | topUp       | 2267  | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesAllPhasesAndUnwinds() (gas: 3124750)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 31.42s (31.42s CPU time)\n\nRan 23 test suites in 31.42s (72.11s CPU time): 230 tests passed, 0 failed, 1 skipped (231 total tests)\n","passed":true},{"durationMs":247,"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)\",\"SwarmMarket.withdraw()\",\"SwarmWager.abandon(uint256)\",\"SwarmWager.cancel(uint256)\",\"SwarmWager.create(bytes,bool,uint96,uint64,uint64)\",\"SwarmWager.join(uint256)\",\"SwarmWager.resolve(uint256)\",\"SwarmWager.settle(uint256)\",\"SwarmWager.topUpFee(uint256,uint96)\",\"SwarmWager.withdraw()\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":10,\"ADAPTATION.md\":247,\"README.md\":333,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/keeper.mjs\":1,\"api/markets.mjs\":1,\"api/price.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":601,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION-2189.md\":167,\"contracts/ADAPTATION-2190.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-RH.md\":10,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":25,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":12478,\"docs/askswarm.png\":1536,\"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\":200,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":123,\"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-handson.tsv\":8,\"docs/brand/voiceover.tsv\":8,\"docs/demo/marks.json\":11,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":12,\"docs/vids/askswarm-demo-silent.mp4\":10008,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7271,\"docs/vids/scene6.mp4\":526,\"docs/vids/scene7.mp4\":303,\"docs/vids/scene8.mp4\":234,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":39,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/keeper.ts\":135,\"functions/markets.ts\":65,\"functions/price.ts\":43,\"functions/telegram.ts\":24,\"functions/wagers.ts\":66,\"lib/announce.ts\":42,\"lib/answers.json\":1,\"lib/bot.ts\":310,\"lib/hfsync.ts\":49,\"lib/logs.ts\":27,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":32,\"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\":94,\"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\":171,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/market.html\":464,\"public/message.svg\":3,\"public/nav.js\":36,\"public/og.png\":1364,\"public/pay.html\":47,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":198,\"script/Deploy.s.sol\":23,\"script/DeployMarket.s.sol\":23,\"script/DeployWager.s.sol\":20,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-market.ts\":30,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/e2e-tg.ts\":23,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/keeper.ts\":4,\"scripts/launch.ts\":65,\"scripts/open-market.ts\":18,\"scripts/record-demo.ts\":101,\"scripts/smoke.ts\":75,\"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\":315,\"src/SwarmWager.sol\":330,\"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/BlockedThirdParty.t.sol\":227,\"test/OracleConsumerConformance.t.sol\":104,\"test/RobinhoodChainLaunch.t.sol\":400,\"test/SWARM_WAGER_TESTING.md\":47,\"test/SwarmMarket.t.sol\":285,\"test/SwarmMarketDeployment.t.sol\":73,\"test/SwarmMarketInvariant.t.sol\":565,\"test/SwarmMarketLiveRegistry.t.sol\":124,\"test/SwarmMarketPayments.t.sol\":313,\"test/SwarmMarketReview.t.sol\":722,\"test/SwarmMarketTesting.md\":89,\"test/SwarmWager.t.sol\":282,\"test/SwarmWagerAtomicity.t.sol\":294,\"test/SwarmWagerBoundaries.t.sol\":259,\"test/SwarmWagerDeployment.t.sol\":90,\"test/SwarmWagerInvariant.t.sol\":122,\"test/SwarmWagerLiveRegistry.t.sol\":88,\"test/SwarmWagerReview.t.sol\":450,\"test/TESTING.md\":83,\"test/helpers/RegistryTestSupport.sol\":289,\"test/helpers/SwarmWagerHandler.sol\":525,\"test/mocks/BlockableIMD.sol\":45,\"test/mocks/IntakeMocks.sol\":100,\"test/mocks/WagerFaultToken.sol\":88,\"tsconfig.json\":8,\"vercel.json\":15},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":true}","passed":true},{"durationMs":2428,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/SwarmMarket.sol:294: SwarmMarket._pushOrCredit(address,uint256) (src/SwarmMarket.sol#294-305) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SwarmWager.sol:309: SwarmWager._pushOrCredit(address,uint256) (src/SwarmWager.sol#309-320) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/SwarmWager.sol:233: Reentrancy in SwarmWager.abandon(uint256) (src/SwarmWager.sol#233-244):\n[medium/medium] reentrancy-no-eth at src/SwarmMarket.sol:173: Reentrancy in SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#173-189):\n[medium/medium] reentrancy-no-eth at src/SwarmMarket.sol:203: Reentrancy in SwarmMarket.settle(uint256) (src/SwarmMarket.sol#203-229):\n[medium/medium] reentrancy-no-eth at src/SwarmWager.sol:214: Reentrancy in SwarmWager.resolve(uint256) (src/SwarmWager.sol#214-229):\n[medium/medium] reentrancy-no-eth at src/SwarmWager.sol:233: Reentrancy in SwarmWager.abandon(uint256) (src/SwarmWager.sol#233-244):\n[medium/medium] reentrancy-no-eth at src/SwarmWager.sol:292: Reentrancy in SwarmWager._refund(SwarmWager.Wager,uint256,uint8) (src/SwarmWager.sol#292-297):\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-benign at src/SwarmMarket.sol:294: Reentrancy in SwarmMarket._pushOrCredit(address,uint256) (src/SwarmMarket.sol#294-305):\n[low/medium] reentrancy-benign at src/SwarmWager.sol:309: Reentrancy in SwarmWager._pushOrCredit(address,uint256) (src/SwarmWager.sol#309-320):\n[low/medium] reentrancy-events at src/SwarmWager.sol:144: Reentrancy in SwarmWager.create(bytes,bool,uint96,uint64,uint64) (src/SwarmWager.sol#144-171):\n[low/medium] reentrancy-events at src/SwarmWager.sol:276: Reentrancy in SwarmWager.withdraw() (src/SwarmWager.sol#276-282):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:119: Reentrancy in SwarmMarket.open(bytes,uint64,uint64) (src/SwarmMarket.sol#119-138):\n[low/medium] reentrancy-events at src/SwarmWager.sol:309: Reentrancy in SwarmWager._pushOrCredit(address,uint256) (src/SwarmWager.sol#309-320):\n[low/medium] reentrancy-events at src/SwarmWager.sol:174: Reentrancy in SwarmWager.join(uint256) (src/SwarmWager.sol#174-184):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:141: Reentrancy in SwarmMarket.stake(uint256,bool,uint128) (src/SwarmMarket.sol#141-155):\n[low/medium] reentrancy-events at src/SwarmWager.sol:214: Reentrancy in SwarmWager.resolve(uint256) (src/SwarmWager.sol#214-229):\n[low/medium] reentrancy-events at src/SwarmWager.sol:233: Reentrancy in SwarmWager.abandon(uint256) (src/SwarmWager.sol#233-244):\n[low/medium] reentrancy-events at src/SwarmWager.sol:201: Reentrancy in SwarmWager.topUpFee(uint256,uint96) (src/SwarmWager.sol#201-208):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:173: Reentrancy in SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#173-189):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:242: Reentrancy in SwarmMarket.withdraw() (src/SwarmMarket.sol#242-248):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:276: Reentrancy in SwarmMarket._void(SwarmMarket.Market,uint256,uint8) (src/SwarmMarket.sol#276-282):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:233: Reentrancy in SwarmMarket.claim(uint256) (src/SwarmMarket.sol#233-239):\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/SwarmMarket.sol:159: Reentrancy in SwarmMarket.topUpFee(uint256,uint96) (src/SwarmMarket.sol#159-167):\n[low/medium] reentrancy-events at src/SwarmWager.sol:292: Reentrancy in SwarmWager._refund(SwarmWager.Wager,uint256,uint8) (src/SwarmWager.sol#292-297):\n[low/medium] reentrancy-events at src/SwarmWager.sol:251: Reentrancy in SwarmWager.settle(uint256) (src/SwarmWager.sol#251-273):\n[low/medium] reentrancy-events at src/SwarmWager.sol:187: Reentrancy in SwarmWager.cancel(uint256) (src/SwarmWager.sol#187-196):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:203: Reentrancy in SwarmMarket.settle(uint256) (src/SwarmMarket.sol#203-229):\n[low/medium] reentrancy-events at src/SwarmWager.sol:233: Reentrancy in SwarmWager.abandon(uint256) (src/SwarmWager.sol#233-244):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:294: Reentrancy in SwarmMarket._pushOrCredit(address,uint256) (src/SwarmMarket.sol#294-305):\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/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/SwarmMarket.sol:193: SwarmMarket.abandon(uint256) (src/SwarmMarket.sol#193-198) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:174: SwarmWager.join(uint256) (src/SwarmWager.sol#174-184) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:173: SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#173-189) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:309: SwarmWager._pushOrCredit(address,uint256) (src/SwarmWager.sol#309-320) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:119: SwarmMarket.open(bytes,uint64,uint64) (src/SwarmMarket.sol#119-138) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:187: SwarmWager.cancel(uint256) (src/SwarmWager.sol#187-196) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:159: SwarmMarket.topUpFee(uint256,uint96) (src/SwarmMarket.sol#159-167) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:294: SwarmMarket._pushOrCredit(address,uint256) (src/SwarmMarket.sol#294-305) 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/SwarmMarket.sol:141: SwarmMarket.stake(uint256,bool,uint128) (src/SwarmMarket.sol#141-155) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:144: SwarmWager.create(bytes,bool,uint96,uint64,uint64) (src/SwarmWager.sol#144-171) 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/SwarmWager.sol:214: SwarmWager.resolve(uint256) (src/SwarmWager.sol#214-229) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:251: SwarmWager.settle(uint256) (src/SwarmWager.sol#251-273) 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:203: SwarmMarket.settle(uint256) (src/SwarmMarket.sol#203-229) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:233: SwarmWager.abandon(uint256) (src/SwarmWager.sol#233-244) uses timestamp for comparisons","passed":true},{"durationMs":343,"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:222: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/AskSwarmRegistry.sol:255: Literal Instead of Constant (17 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":7286,"exitCode":0,"name":"proof ad6653d75214","output":"Compiling 29 files with Solc 0.8.26\nSolc 0.8.26 finished in 6.75s\nCompiler run successful!\n\nRan 3 tests for test/imd-proof-c08490c7/Proof_ad6653d75214.t.sol:MarketBlockedThirdPartyTest\n[PASS] test_blockedCreatorFreezesStakersOnAbandon() (gas: 628488)\n[PASS] test_blockedCreatorFreezesWinnersOnSettle() (gas: 1077555)\n[PASS] test_blockedTreasuryFreezesWinnersOnSettle() (gas: 980107)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.54ms (1.79ms CPU time)\n\nRan 1 test suite in 3.53ms (1.54ms CPU time): 3 tests passed, 0 failed, 0 skipped (3 total tests)\n","passed":true},{"durationMs":3272,"exitCode":0,"name":"proof d4e9fc2df017","output":"2026-10-19T11:36:19.353603Z ERROR foundry_compilers_artifacts_solc::sources: error=\"/tmp/imd-verify-3vew6z/repo/test/imd-proof-c08490c7/Proof_ad6653d75214.t.sol\": No such file or directory (os error 2)\nCompiling 1 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.72s\nCompiler run successful!\n\nRan 2 tests for test/imd-proof-b184b256/Proof_d4e9fc2df017.t.sol:WagerBlockedPartyFreezesCounterpartyTest\n[PASS] test_wager_blockedPartyFreezesCounterpartyOnAbandon() (gas: 537770)\n[PASS] test_wager_blockedPartyFreezesCounterpartyRefund() (gas: 785006)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.32ms (640.66µs CPU time)\n\nRan 1 test suite in 3.38ms (1.32ms CPU time): 2 tests passed, 0 failed, 0 skipped (2 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"60b3d7b7f8d9c9723f46d7999a83046047e5ec6b1a07a8138a4efe1e7d9d2de9","verifiedTreeHash":"353e2181ae43770ed91301daf1d9861d25b61db9","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":102230,"exitCode":0,"name":"build","output":"Compiling 53 files with Solc 0.8.26\nSolc 0.8.26 finished in 102.13s\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":32682,"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 578.62µs (0.00ns CPU time)\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2270377)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.87ms (5.94ms 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.04ms (5.68ms CPU time)\n\nRan 2 tests for test/SwarmWagerLiveRegistry.t.sol:SwarmWagerLiveRegistryTest\n[PASS] test_launchAddressesAndLiveAskGetAndUnverifiedRefund() (gas: 1147131)\n[PASS] test_liveLostOutcomeRefunds() (gas: 913967)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.76ms (5.23ms 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 15.00ms (13.73ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 526475)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 431549)\n[PASS] test_badTerms() (gas: 117795)\n[PASS] test_cancelUnmatched() (gas: 468784)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385876)\n[PASS] test_minorityAnswerRefunds() (gas: 1003852)\n[PASS] test_noWins() (gas: 1031853)\n[PASS] test_nonBoolAnswerRefunds() (gas: 1029900)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 1030322)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786321)\n[PASS] test_refusedRefunds() (gas: 842526)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 730962)\n[PASS] test_settleOnlyOnce() (gas: 1064491)\n[PASS] test_splitPanelRefunds() (gas: 859479)\n[PASS] test_yesWins() (gas: 1095859)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 37.80ms (3.59ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1220027, ~: 1233303)\n[PASS] test_abandon() (gas: 747140)\n[PASS] test_bothSidesSameUser() (gas: 1183564)\n[PASS] test_guards() (gas: 436805)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2143676)\n[PASS] test_noWins() (gas: 1210671)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520296)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1022980)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112631)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281641)\n[PASS] test_yesWinsProRataWithFee() (gas: 1366981)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 203.29ms (207.00ms CPU time)\n\nRan 4 tests for test/SwarmWagerDeployment.t.sol:SwarmWagerDeploymentTest\n[PASS] test_constructorRejectsZeroDependenciesAndNativeValue() (gas: 3966)\n[PASS] test_factoryDeploysOnlyWagerOnEmptyChainWithStaticArguments() (gas: 3410212)\n[PASS] test_projectScriptRejectsOtherChains() (gas: 2009226)\n[PASS] test_projectScriptUsesExistingMainnetRegistry() (gas: 3539625)\nLogs:\n  SwarmWager 0x34A1D3fff3958843C43aD80F30b94c510645C316 chain 1\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 285.61ms (9.16ms CPU time)\n\nRan 3 tests for test/SwarmWagerAtomicity.t.sol:SwarmWagerAtomicityTest\n[PASS] testFuzz_failedPaymentPreservesConcurrentEscrow(uint8,uint8,uint8,uint96) (runs: 1000, μ: 1386397, ~: 1294278)\n[PASS] test_everyPaymentLegRejectsFalseRevertAndMalformedReturns() (gas: 93507466)\n[PASS] test_noReturnTokenCompletesWinsRefundsCancellationAndAbandonment() (gas: 2560329)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 300.76ms (339.50ms CPU time)\n\nRan 6 tests for test/RobinhoodChainLaunch.t.sol:RobinhoodChainLaunchTest\n[PASS] test_deploymentSendsNoValueAndRejectsEth() (gas: 6967010)\n[PASS] test_factoryDeploysAllThreeInOrderOnEmptyChain4663() (gas: 13982101)\n[PASS] test_mainnetImdWouldMakeTheRegistryInertOnChain4663() (gas: 1031204)\n[PASS] test_marketAndWagerLifecycleOnChain4663() (gas: 3719214)\n[PASS] test_registryDomainIsChain4663AndItsOwnAddress() (gas: 36978)\n[PASS] test_signatureUnderAnotherChainsDomainIsUnverified() (gas: 2567058)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 301.18ms (28.80ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1011576, ~: 974614)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839257, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 500006, ~: 497931)\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 301.31ms (721.64ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 429495, ~: 425943)\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 301.50ms (84.48ms CPU time)\n\nRan 35 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_acceptedTermsAlwaysUnwindWithinHorizon(uint64,uint64,uint8) (runs: 256, μ: 737788, ~: 741259)\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2081784, ~: 2075866)\n[PASS] testFuzz_openRejectsEveryResolveAfterPastMaxTerm(uint64,uint64) (runs: 256, μ: 56700, ~: 56595)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 624234, ~: 522968)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 549455)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1160955)\n[PASS] test_answerDeliveredInWindowSettlesAfterDeadline() (gas: 1124495)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1249390)\n[PASS] test_issuedAtBoundsTheAnswerWindow() (gas: 1923420)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1381977)\n[PASS] test_maxTermMarketAbandonsAfterResolveWindow() (gas: 716434)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2707778)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 554684)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1292972)\n[PASS] test_openAcceptsExactMaxTermAndMarketStillUnwinds() (gas: 778967)\n[PASS] test_openRejectsBodyLongerThanIntakeAccepts() (gas: 8125554)\n[PASS] test_openRejectsResolveAfterBeyondMaxTerm() (gas: 151931)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 921740)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1133713)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 841691)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 503485)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 574402)\n[PASS] test_settleNeedsRegistryRecordThenVoidsPendingAfterDeadline() (gas: 919739)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1899953)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2427211)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 481728)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 535468)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1201842)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 561958)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 864537)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 763136)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1200528)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1286815)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1055965)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3614414)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 301.04ms (415.75ms CPU time)\n\nRan 26 tests for test/SwarmWagerReview.t.sol:SwarmWagerReviewTest\n[PASS] testFuzz_allAcceptedTermsHaveBoundedExit(uint64,uint64,bool) (runs: 256, μ: 373591, ~: 330491)\n[PASS] testFuzz_onlyCanonicalMajorityBoolPays(uint256,uint16,uint16) (runs: 256, μ: 1005079, ~: 1017307)\n[PASS] testFuzz_topUpFeeConservation(uint96,uint96,bool) (runs: 256, μ: 887243, ~: 1197852)\n[PASS] testFuzz_wrongBoolLengthRefunds(uint8) (runs: 256, μ: 992685, ~: 987288)\n[PASS] test_abandonBeforeLateResolvePreventsAnAsk() (gas: 473416)\n[PASS] test_abandonReturnsAllTopUpsToCreator() (gas: 433654)\n[PASS] test_badSignatureRefundsBothStakes() (gas: 1009930)\n[PASS] test_creatorTopUpRecoversWagerAfterPriceRise() (gas: 1191517)\n[PASS] test_exactJoinAndResolveBoundaryRemainsSupported() (gas: 977893)\n[PASS] test_expiredAtDeliveryRefundsBothStakes() (gas: 979775)\n[PASS] test_lateAnswerBeforeTimeoutSettlementStillPaysWinner() (gas: 1049816)\n[PASS] test_lostCallbackRefundsBothStakes() (gas: 884685)\n[PASS] test_maximumFeeEscrowCanBeFundedAndAbandoned() (gas: 531708)\n[PASS] test_maximumTermCanStillBeMatchedAndUnwound() (gas: 449314)\n[PASS] test_maximumTimestampAndOverlongTermsRejectedBeforePayment() (gas: 102218)\n[PASS] test_priceDecreaseReturnsOnlyRemainderAndApprovesExactPrice() (gas: 808079)\n[PASS] test_priceRiseRevertsWithoutSpendingStakesAndAbandonStillWorks() (gas: 556509)\n[PASS] test_resolutionAfterAbandonDeadlineCanWinTheRace() (gas: 1051298)\n[PASS] test_resolveCallerChoosesAskTimeForRelativeWindows() (gas: 731350)\n[PASS] test_resolveWaitsThroughGapAfterJoinDeadline() (gas: 731606)\n[PASS] test_thirdPartyTopUpIsExplicitAndUnusedFeeGoesToCreator() (gas: 1177687)\n[PASS] test_timeoutIsStrictlyAfterAnswerWindow() (gas: 838828)\n[PASS] test_timeoutSettlementBeforeLateAnswerRemainsRefunded() (gas: 1057759)\n[PASS] test_topUpRefusesUnknownOpenAskedAndTerminalWagers() (gas: 1345614)\n[PASS] test_topUpRefusesZeroOverflowAndRollsBackFailedPayment() (gas: 573580)\n[PASS] test_writerPairingOfAnotherQuestionsAnswerIsTrusted() (gas: 1164208)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 300.98ms (589.55ms CPU time)\n\nRan 7 tests for test/SwarmMarketPayments.t.sol:SwarmMarketPaymentsTest\n[PASS] testFuzz_failedPullOrApprovalIsAtomicAndRetryable(uint8,uint8) (runs: 1000, μ: 1226540, ~: 1240723)\n[PASS] testFuzz_failedTreasuryTransferRollsBackCreatorFee(uint8) (runs: 1000, μ: 1349421, ~: 1349486)\n[PASS] test_failedAbandonRefundRollsBackVoidAndAllowsRetry() (gas: 704898)\n[PASS] test_failedClaimPreservesEntitlementAndDoesNotBlockAnotherWinner() (gas: 1383571)\n[PASS] test_failedRemainderRefundRollsBackAlreadyPaidOracle() (gas: 1316831)\n[PASS] test_noReturnPullsAndApprovalsReachAnOrdinaryPayout() (gas: 1211423)\n[PASS] test_poolOverflowCannotChargeOrChangeAnUnrelatedMarket() (gas: 944902)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 302.25ms (573.09ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 210500, ~: 221751)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 568981, ~: 574406)\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 307.34ms (615.17ms CPU time)\n\nRan 10 tests for test/SwarmWagerBoundaries.t.sol:SwarmWagerBoundariesTest\n[PASS] testFuzz_majorityBoundaryAcrossUint16Range(uint16,bool,bool,bool) (runs: 1000, μ: 995519, ~: 989962)\n[PASS] testFuzz_nonBoolTypeCannotPayEvenWithCanonicalBoolBytes(uint8,bool) (runs: 1000, μ: 996400, ~: 1006187)\n[PASS] test_failedCreateAndJoinDoNotLeavePhantomPositionsOrParticipants() (gas: 855348)\n[PASS] test_maximumStakeAndMaximumFeeDoNotNarrowCombinedAmounts() (gas: 1126236)\n[PASS] test_missingRegistryRecordUsesTimeoutInsteadOfPayingEmbeddedAnswer() (gas: 825603)\n[PASS] test_oversizedBodyRejectedByTransportLeavesFeeAndStakesRefundable() (gas: 4252869)\n[PASS] test_retiredActionRollsBackApprovalAndCanBeAbandoned() (gas: 546125)\n[PASS] test_sharedQuestionIndexCannotSubstituteAnotherWagersAnswer() (gas: 1849034)\n[PASS] test_unavailablePriceDoesNotChargeCreateOrTrapMatchedEscrow() (gas: 674356)\n[PASS] test_zeroAndUnrepresentableFeesRejectBeforeFunding() (gas: 233192)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 306.89ms (594.96ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 818884, ~: 692833)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504207, ~: 492611)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 518191, ~: 523543)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 505993, ~: 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 307.47ms (847.23ms 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        | 1358  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1371  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1326  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1341  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1390  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1436  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1349  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1398  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1319  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.77s (7.77s 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                     | 2191  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2250  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2285  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2198  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2188  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2232  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2287  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2265  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2210  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2222  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2248  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.54s (13.53s CPU time)\n\nRan 2 tests for test/SwarmWagerInvariant.t.sol:SwarmWagerInvariantTest\n[PASS]\nSwarmWagerInvariantTest invariants:\n[PASS] invariant_escrowAndEveryActorBalanceReconcile\n[PASS] invariant_termsRequestsAndTerminalStatesStayConsistent\n SwarmWagerInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| SwarmWagerHandler | abandon        | 2450  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | advanceTime    | 2576  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | cancel         | 2556  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | changePrice    | 2541  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | create         | 2433  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | deliver        | 2488  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | donate         | 2491  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | failingResolve | 2574  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | join           | 2561  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | resolve        | 2599  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | settle         | 2519  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | topUp          | 2474  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | wrongState     | 2506  | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesEveryOutcomeAndAllExitPaths() (gas: 38042355)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 17.48s (17.49s 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     | 2264  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | advance     | 2147  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | changePrice | 2277  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | claim       | 2208  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | deliver     | 2311  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | donate      | 2184  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | openMarket  | 2226  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | resolve     | 2173  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | settle      | 2258  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | stake       | 2261  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | topUp       | 2267  | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesAllPhasesAndUnwinds() (gas: 3122665)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 32.57s (32.56s CPU time)\n\nRan 22 test suites in 32.58s (74.96s CPU time): 220 tests passed, 0 failed, 1 skipped (221 total tests)\n","passed":true},{"durationMs":256,"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)\",\"SwarmWager.topUpFee(uint256,uint96)\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":10,\"ADAPTATION.md\":168,\"README.md\":322,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/keeper.mjs\":1,\"api/markets.mjs\":1,\"api/price.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":601,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION-2189.md\":167,\"contracts/ADAPTATION-2190.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-RH.md\":10,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":25,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":12478,\"docs/askswarm.png\":1536,\"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\":200,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":123,\"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-handson.tsv\":8,\"docs/brand/voiceover.tsv\":8,\"docs/demo/marks.json\":11,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":12,\"docs/vids/askswarm-demo-silent.mp4\":10008,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7271,\"docs/vids/scene6.mp4\":526,\"docs/vids/scene7.mp4\":303,\"docs/vids/scene8.mp4\":234,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":39,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/keeper.ts\":135,\"functions/markets.ts\":65,\"functions/price.ts\":43,\"functions/telegram.ts\":24,\"functions/wagers.ts\":66,\"lib/announce.ts\":42,\"lib/answers.json\":1,\"lib/bot.ts\":310,\"lib/hfsync.ts\":49,\"lib/logs.ts\":27,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":32,\"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\":94,\"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\":171,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/market.html\":464,\"public/message.svg\":3,\"public/nav.js\":36,\"public/og.png\":1364,\"public/pay.html\":47,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":198,\"script/Deploy.s.sol\":23,\"script/DeployMarket.s.sol\":23,\"script/DeployWager.s.sol\":20,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-market.ts\":30,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/e2e-tg.ts\":23,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/keeper.ts\":4,\"scripts/launch.ts\":65,\"scripts/open-market.ts\":18,\"scripts/record-demo.ts\":101,\"scripts/smoke.ts\":75,\"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\":283,\"src/SwarmWager.sol\":292,\"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/RobinhoodChainLaunch.t.sol\":400,\"test/SWARM_WAGER_TESTING.md\":47,\"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\":722,\"test/SwarmMarketTesting.md\":89,\"test/SwarmWager.t.sol\":282,\"test/SwarmWagerAtomicity.t.sol\":268,\"test/SwarmWagerBoundaries.t.sol\":254,\"test/SwarmWagerDeployment.t.sol\":90,\"test/SwarmWagerInvariant.t.sol\":122,\"test/SwarmWagerLiveRegistry.t.sol\":88,\"test/SwarmWagerReview.t.sol\":450,\"test/TESTING.md\":83,\"test/helpers/RegistryTestSupport.sol\":289,\"test/helpers/SwarmWagerHandler.sol\":523,\"test/mocks/IntakeMocks.sol\":100,\"test/mocks/WagerFaultToken.sol\":88,\"tsconfig.json\":8,\"vercel.json\":15},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":true}","passed":true},{"durationMs":2538,"exitCode":0,"name":"slither","output":"[medium/medium] reentrancy-no-eth at src/SwarmMarket.sol:165: Reentrancy in SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#165-181):\n[medium/medium] reentrancy-no-eth at src/SwarmWager.sol:202: Reentrancy in SwarmWager.resolve(uint256) (src/SwarmWager.sol#202-217):\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:237: Reentrancy in SwarmWager.settle(uint256) (src/SwarmWager.sol#237-259):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:133: Reentrancy in SwarmMarket.stake(uint256,bool,uint128) (src/SwarmMarket.sol#133-147):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:165: Reentrancy in SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#165-181):\n[low/medium] reentrancy-events at src/SwarmWager.sol:164: Reentrancy in SwarmWager.join(uint256) (src/SwarmWager.sol#164-174):\n[low/medium] reentrancy-events at src/SwarmWager.sol:221: Reentrancy in SwarmWager.abandon(uint256) (src/SwarmWager.sol#221-230):\n[low/medium] reentrancy-events at src/SwarmWager.sol:202: Reentrancy in SwarmWager.resolve(uint256) (src/SwarmWager.sol#202-217):\n[low/medium] reentrancy-events at src/SwarmWager.sol:269: Reentrancy in SwarmWager._refund(SwarmWager.Wager,uint256,uint8) (src/SwarmWager.sol#269-274):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:195: Reentrancy in SwarmMarket.settle(uint256) (src/SwarmMarket.sol#195-221):\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/SwarmMarket.sol:111: Reentrancy in SwarmMarket.open(bytes,uint64,uint64) (src/SwarmMarket.sol#111-130):\n[low/medium] reentrancy-events at src/SwarmWager.sol:189: Reentrancy in SwarmWager.topUpFee(uint256,uint96) (src/SwarmWager.sol#189-196):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:259: Reentrancy in SwarmMarket._void(SwarmMarket.Market,uint256,uint8) (src/SwarmMarket.sol#259-265):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:151: Reentrancy in SwarmMarket.topUpFee(uint256,uint96) (src/SwarmMarket.sol#151-159):\n[low/medium] reentrancy-events at src/SwarmWager.sol:134: Reentrancy in SwarmWager.create(bytes,bool,uint96,uint64,uint64) (src/SwarmWager.sol#134-161):\n[low/medium] reentrancy-events at src/SwarmMarket.sol:225: Reentrancy in SwarmMarket.claim(uint256) (src/SwarmMarket.sol#225-231):\n[low/medium] reentrancy-events at src/SwarmWager.sol:177: Reentrancy in SwarmWager.cancel(uint256) (src/SwarmWager.sol#177-184):\n[low/medium] timestamp at src/SwarmMarket.sol:133: SwarmMarket.stake(uint256,bool,uint128) (src/SwarmMarket.sol#133-147) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:134: SwarmWager.create(bytes,bool,uint96,uint64,uint64) (src/SwarmWager.sol#134-161) 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/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:177: SwarmWager.cancel(uint256) (src/SwarmWager.sol#177-184) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:185: SwarmMarket.abandon(uint256) (src/SwarmMarket.sol#185-190) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:202: SwarmWager.resolve(uint256) (src/SwarmWager.sol#202-217) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:164: SwarmWager.join(uint256) (src/SwarmWager.sol#164-174) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:221: SwarmWager.abandon(uint256) (src/SwarmWager.sol#221-230) 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:288: SwarmWager._call(bytes) (src/SwarmWager.sol#288-291) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:165: SwarmMarket.resolve(uint256) (src/SwarmMarket.sol#165-181) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:151: SwarmMarket.topUpFee(uint256,uint96) (src/SwarmMarket.sol#151-159) 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:195: SwarmMarket.settle(uint256) (src/SwarmMarket.sol#195-221) 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:111: SwarmMarket.open(bytes,uint64,uint64) (src/SwarmMarket.sol#111-130) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmMarket.sol:279: SwarmMarket._call(bytes) (src/SwarmMarket.sol#279-282) uses timestamp for comparisons\n[low/medium] timestamp at src/SwarmWager.sol:237: SwarmWager.settle(uint256) (src/SwarmWager.sol#237-259) uses timestamp for comparisons","passed":true},{"durationMs":358,"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:214: 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":"b1ac15c9bb9ccebfff0dcee32d8e80cbfad8d7ed64fbdbdd9b9a23c882d3f0d7","verifiedTreeHash":"8cad781b949e38573e973ae0cc9cad7fe4471616","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":102778,"exitCode":0,"name":"build","output":"Compiling 57 files with Solc 0.8.26\nSolc 0.8.26 finished in 102.69s\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":30209,"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 501.57µs (0.00ns CPU time)\n\nRan 2 tests for test/SwarmWagerLiveRegistry.t.sol:SwarmWagerLiveRegistryTest\n[PASS] test_launchAddressesAndLiveAskGetAndUnverifiedRefund() (gas: 1147525)\n[PASS] test_liveLostOutcomeRefunds() (gas: 914229)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.09ms (889.49µs CPU time)\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2397287)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.95ms (4.07ms 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 3.81ms (1.31ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 529701)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 434756)\n[PASS] test_badTerms() (gas: 118120)\n[PASS] test_cancelUnmatched() (gas: 472035)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385989)\n[PASS] test_minorityAnswerRefunds() (gas: 1004158)\n[PASS] test_noWins() (gas: 1032221)\n[PASS] test_nonBoolAnswerRefunds() (gas: 1030206)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 1030628)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786583)\n[PASS] test_refusedRefunds() (gas: 842788)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 731260)\n[PASS] test_settleOnlyOnce() (gas: 1064903)\n[PASS] test_splitPanelRefunds() (gas: 859741)\n[PASS] test_yesWins() (gas: 1096271)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 5.57ms (3.32ms CPU time)\n\nRan 4 tests for test/SwarmWagerDeployment.t.sol:SwarmWagerDeploymentTest\n[PASS] test_constructorRejectsZeroDependenciesAndNativeValue() (gas: 3966)\n[PASS] test_factoryDeploysOnlyWagerOnEmptyChainWithStaticArguments() (gas: 3694662)\n[PASS] test_projectScriptRejectsOtherChains() (gas: 2154869)\n[PASS] test_projectScriptUsesExistingMainnetRegistry() (gas: 3820063)\nLogs:\n  SwarmWager 0x34A1D3fff3958843C43aD80F30b94c510645C316 chain 1\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 9.06ms (8.73ms CPU time)\n\nRan 8 tests for test/BlockedThirdParty.t.sol:BlockedThirdPartyTest\n[PASS] test_marketAbandonVoidsWhileCreatorBlocked() (gas: 825027)\n[PASS] test_marketResolvesWhileCreatorBlockedAndCreditsRemainder() (gas: 682633)\n[PASS] test_marketSettlesWhileCreatorBlocked() (gas: 967103)\n[PASS] test_marketSettlesWhileTreasuryBlocked() (gas: 1049767)\n[PASS] test_wagerAbandonRefundsCounterpartyWhileOtherBlocked() (gas: 578172)\n[PASS] test_wagerFeeFieldZeroedOnCancelAndAbandon() (gas: 842704)\n[PASS] test_wagerResolvesWhileCreatorBlockedAndCreditsRemainder() (gas: 647704)\n[PASS] test_wagerTimeoutRefundsCounterpartyWhileOtherBlocked() (gas: 805589)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 36.25ms (3.88ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 430023, ~: 425956)\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 76.60ms (75.10ms 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 101.01ms (10.31ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1220074, ~: 1233540)\n[PASS] test_abandon() (gas: 747384)\n[PASS] test_bothSidesSameUser() (gas: 1183773)\n[PASS] test_guards() (gas: 436941)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2144194)\n[PASS] test_noWins() (gas: 1210902)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520400)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1023270)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112925)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281872)\n[PASS] test_yesWinsProRataWithFee() (gas: 1367238)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 148.82ms (151.46ms CPU time)\n\nRan 6 tests for test/RobinhoodChainLaunch.t.sol:RobinhoodChainLaunchTest\n[PASS] test_deploymentSendsNoValueAndRejectsEth() (gas: 7255479)\n[PASS] test_factoryDeploysAllThreeInOrderOnEmptyChain4663() (gas: 14645543)\n[PASS] test_mainnetImdWouldMakeTheRegistryInertOnChain4663() (gas: 1031226)\n[PASS] test_marketAndWagerLifecycleOnChain4663() (gas: 3719710)\n[PASS] test_registryDomainIsChain4663AndItsOwnAddress() (gas: 36978)\n[PASS] test_signatureUnderAnotherChainsDomainIsUnverified() (gas: 2567290)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 268.48ms (24.25ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1011576, ~: 974614)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839274, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 500178, ~: 497946)\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 287.42ms (653.50ms CPU time)\n\nRan 26 tests for test/SwarmWagerReview.t.sol:SwarmWagerReviewTest\n[PASS] testFuzz_allAcceptedTermsHaveBoundedExit(uint64,uint64,bool) (runs: 256, μ: 376896, ~: 333786)\n[PASS] testFuzz_onlyCanonicalMajorityBoolPays(uint256,uint16,uint16) (runs: 256, μ: 1004709, ~: 1004627)\n[PASS] testFuzz_topUpFeeConservation(uint96,uint96,bool) (runs: 256, μ: 889030, ~: 1198315)\n[PASS] testFuzz_wrongBoolLengthRefunds(uint8) (runs: 256, μ: 993981, ~: 987638)\n[PASS] test_abandonBeforeLateResolvePreventsAnAsk() (gas: 476711)\n[PASS] test_abandonReturnsAllTopUpsToCreator() (gas: 436887)\n[PASS] test_badSignatureRefundsBothStakes() (gas: 1010324)\n[PASS] test_creatorTopUpRecoversWagerAfterPriceRise() (gas: 1192043)\n[PASS] test_exactJoinAndResolveBoundaryRemainsSupported() (gas: 978305)\n[PASS] test_expiredAtDeliveryRefundsBothStakes() (gas: 980125)\n[PASS] test_lateAnswerBeforeTimeoutSettlementStillPaysWinner() (gas: 1050272)\n[PASS] test_lostCallbackRefundsBothStakes() (gas: 884991)\n[PASS] test_maximumFeeEscrowCanBeFundedAndAbandoned() (gas: 535029)\n[PASS] test_maximumTermCanStillBeMatchedAndUnwound() (gas: 452628)\n[PASS] test_maximumTimestampAndOverlongTermsRejectedBeforePayment() (gas: 102479)\n[PASS] test_priceDecreaseReturnsOnlyRemainderAndApprovesExactPrice() (gas: 808358)\n[PASS] test_priceRiseRevertsWithoutSpendingStakesAndAbandonStillWorks() (gas: 559867)\n[PASS] test_resolutionAfterAbandonDeadlineCanWinTheRace() (gas: 1051817)\n[PASS] test_resolveCallerChoosesAskTimeForRelativeWindows() (gas: 731648)\n[PASS] test_resolveWaitsThroughGapAfterJoinDeadline() (gas: 731967)\n[PASS] test_thirdPartyTopUpIsExplicitAndUnusedFeeGoesToCreator() (gas: 1178150)\n[PASS] test_timeoutIsStrictlyAfterAnswerWindow() (gas: 839178)\n[PASS] test_timeoutSettlementBeforeLateAnswerRemainsRefunded() (gas: 1058197)\n[PASS] test_topUpRefusesUnknownOpenAskedAndTerminalWagers() (gas: 1349409)\n[PASS] test_topUpRefusesZeroOverflowAndRollsBackFailedPayment() (gas: 574035)\n[PASS] test_writerPairingOfAnotherQuestionsAnswerIsTrusted() (gas: 1164576)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 291.33ms (366.75ms CPU time)\n\nRan 35 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_acceptedTermsAlwaysUnwindWithinHorizon(uint64,uint64,uint8) (runs: 256, μ: 735090, ~: 741165)\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2081485, ~: 2076407)\n[PASS] testFuzz_openRejectsEveryResolveAfterPastMaxTerm(uint64,uint64) (runs: 256, μ: 56740, ~: 56639)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 623498, ~: 523186)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 549651)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1161204)\n[PASS] test_answerDeliveredInWindowSettlesAfterDeadline() (gas: 1124722)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1249617)\n[PASS] test_issuedAtBoundsTheAnswerWindow() (gas: 1923919)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1382334)\n[PASS] test_maxTermMarketAbandonsAfterResolveWindow() (gas: 716734)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2708550)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 554902)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1293291)\n[PASS] test_openAcceptsExactMaxTermAndMarketStillUnwinds() (gas: 779226)\n[PASS] test_openRejectsBodyLongerThanIntakeAccepts() (gas: 8125791)\n[PASS] test_openRejectsResolveAfterBeyondMaxTerm() (gas: 152085)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 922048)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1133998)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 841928)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 503717)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 574620)\n[PASS] test_settleNeedsRegistryRecordThenVoidsPendingAfterDeadline() (gas: 920047)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1900408)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2427983)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 481942)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 535638)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1202267)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 562202)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 864759)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 763428)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1200844)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1287196)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1056166)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3615440)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 293.39ms (330.62ms CPU time)\n\nRan 3 tests for test/SwarmWagerAtomicity.t.sol:SwarmWagerAtomicityTest\n[PASS] testFuzz_failedPaymentPreservesConcurrentEscrow(uint8,uint8,uint8,uint96) (runs: 1000, μ: 1385640, ~: 1298231)\n[PASS] test_everyPaymentLegRejectsFalseRevertAndMalformedReturns() (gas: 92914108)\n[PASS] test_noReturnTokenCompletesWinsRefundsCancellationAndAbandonment() (gas: 2567188)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 293.34ms (329.24ms CPU time)\n\nRan 10 tests for test/SwarmWagerBoundaries.t.sol:SwarmWagerBoundariesTest\n[PASS] testFuzz_majorityBoundaryAcrossUint16Range(uint16,bool,bool,bool) (runs: 1000, μ: 995941, ~: 990355)\n[PASS] testFuzz_nonBoolTypeCannotPayEvenWithCanonicalBoolBytes(uint8,bool) (runs: 1000, μ: 996794, ~: 1006580)\n[PASS] test_failedCreateAndJoinDoNotLeavePhantomPositionsOrParticipants() (gas: 855922)\n[PASS] test_maximumStakeAndMaximumFeeDoNotNarrowCombinedAmounts() (gas: 1126647)\n[PASS] test_missingRegistryRecordUsesTimeoutInsteadOfPayingEmbeddedAnswer() (gas: 825996)\n[PASS] test_oversizedBodyRejectedAtCreate() (gas: 1749579)\n[PASS] test_retiredActionRollsBackApprovalAndCanBeAbandoned() (gas: 549445)\n[PASS] test_sharedQuestionIndexCannotSubstituteAnotherWagersAnswer() (gas: 1849974)\n[PASS] test_unavailablePriceDoesNotChargeCreateOrTrapMatchedEscrow() (gas: 677797)\n[PASS] test_zeroAndUnrepresentableFeesRejectBeforeFunding() (gas: 233633)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 296.33ms (579.73ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 210503, ~: 221751)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 569027, ~: 574430)\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 296.39ms (297.19ms CPU time)\n\nRan 9 tests for test/SwarmMarketPayments.t.sol:SwarmMarketPaymentsTest\n[PASS] testFuzz_failedPullOrApprovalIsAtomicAndRetryable(uint8,uint8) (runs: 1000, μ: 1227042, ~: 1241270)\n[PASS] testFuzz_treasuryFeeTransferFailure(uint8) (runs: 1000, μ: 1329960, ~: 1346757)\n[PASS] test_failedClaimPreservesEntitlementAndDoesNotBlockAnotherWinner() (gas: 1383849)\n[PASS] test_failedWithdrawKeepsCredit() (gas: 522018)\n[PASS] test_malformedRemainderReplyRollsBackAlreadyPaidOracle() (gas: 905745)\n[PASS] test_noReturnPullsAndApprovalsReachAnOrdinaryPayout() (gas: 1211646)\n[PASS] test_poolOverflowCannotChargeOrChangeAnUnrelatedMarket() (gas: 945339)\n[PASS] test_refusedAbandonRefundIsCreditedAndStakersClaim() (gas: 680817)\n[PASS] test_refusedRemainderRefundIsCreditedAndAskStands() (gas: 924784)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 312.74ms (593.39ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 811820, ~: 676798)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504253, ~: 494426)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 517921, ~: 523531)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 506017, ~: 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 312.76ms (988.89ms CPU time)\n\nRan 2 tests for test/BlockedPartyInvariant.t.sol:BlockedPartyInvariantTest\n[PASS]\nBlockedPartyInvariantTest invariants:\n[PASS] invariant_marketBalanceIsBooksPlusOwed\n[PASS] invariant_supplyConservedAndRegistryEmpty\n[PASS] invariant_wagerBalanceIsBooksPlusOwed\n BlockedPartyInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+---------------+-------+---------+----------╮\n| Contract            | Selector      | Calls | Reverts | Discards |\n+==================================================================+\n| BlockedPartyHandler | cancelWager   | 370   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | claim         | 372   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | createWager   | 409   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | deliver       | 395   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | joinWager     | 401   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | openMarket    | 360   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | resolveMarket | 363   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | resolveWager  | 401   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | settleMarket  | 399   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | settleWager   | 389   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | stake         | 736   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | toggleBlock   | 791   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | warp          | 384   | 0       | 0        |\n|---------------------+---------------+-------+---------+----------|\n| BlockedPartyHandler | withdraw      | 374   | 0       | 0        |\n╰---------------------+---------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesCreditsAndWithdrawals() (gas: 5331262)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.63s (1.63s CPU time)\n\nRan 2 tests for test/RobinhoodSystemInvariant.t.sol:RobinhoodSystemInvariantTest\n[PASS]\nRobinhoodSystemInvariantTest invariants:\n[PASS] invariant_marketClaimsAreSolventPerMarket\n[PASS] invariant_marketHoldsExactlyWhatIsOwed\n[PASS] invariant_registryPassesThroughAndSupplyIsConserved\n[PASS] invariant_wagerHoldsExactlyWhatIsOwed\n RobinhoodSystemInvariantTest invariants (runs: 128, calls: 10240, reverts: 0)\n\n╭---------------+-----------------+-------+---------+----------╮\n| Contract      | Selector        | Calls | Reverts | Discards |\n+==============================================================+\n| SystemHandler | abandonMarket   | 499   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | abandonWager    | 486   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | cancelWager     | 499   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | changePrice     | 492   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | claim           | 497   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | createWager     | 484   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | deliver         | 487   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | joinWager       | 471   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | marketLifecycle | 473   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | openMarket      | 502   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | resolveMarket   | 496   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | resolveWager    | 479   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | settleMarket    | 960   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | settleWager     | 470   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | stake           | 1014  | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | topUpMarket     | 470   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | topUpWager      | 469   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | wagerLifecycle  | 498   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | warp            | 494   | 0       | 0        |\n╰---------------+-----------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 9279210)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.23s (4.23s 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        | 1358  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1371  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1326  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1341  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1390  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1436  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1349  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1398  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1319  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.47s (7.46s 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                     | 2191  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2250  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2285  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2198  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2188  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2232  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2287  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2265  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2210  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2222  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2248  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.06s (13.05s CPU time)\n\nRan 2 tests for test/SwarmWagerInvariant.t.sol:SwarmWagerInvariantTest\n[PASS]\nSwarmWagerInvariantTest invariants:\n[PASS] invariant_escrowAndEveryActorBalanceReconcile\n[PASS] invariant_termsRequestsAndTerminalStatesStayConsistent\n SwarmWagerInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| SwarmWagerHandler | abandon        | 2450  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | advanceTime    | 2576  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | cancel         | 2556  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | changePrice    | 2541  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | create         | 2433  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | deliver        | 2488  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | donate         | 2491  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | failingResolve | 2574  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | join           | 2561  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | resolve        | 2599  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | settle         | 2519  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | topUp          | 2474  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | wrongState     | 2506  | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesEveryOutcomeAndAllExitPaths() (gas: 38060620)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 16.56s (16.57s 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     | 2264  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | advance     | 2147  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | changePrice | 2277  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | claim       | 2208  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | deliver     | 2311  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | donate      | 2184  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | openMarket  | 2226  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | resolve     | 2173  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | settle      | 2258  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | stake       | 2261  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | topUp       | 2267  | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesAllPhasesAndUnwinds() (gas: 3124750)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 30.10s (30.10s CPU time)\n\nRan 25 test suites in 30.10s (76.08s CPU time): 234 tests passed, 0 failed, 1 skipped (235 total tests)\n","passed":true},{"durationMs":218,"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)\",\"SwarmMarket.withdraw()\",\"SwarmWager.abandon(uint256)\",\"SwarmWager.cancel(uint256)\",\"SwarmWager.create(bytes,bool,uint96,uint64,uint64)\",\"SwarmWager.join(uint256)\",\"SwarmWager.resolve(uint256)\",\"SwarmWager.settle(uint256)\",\"SwarmWager.topUpFee(uint256,uint96)\",\"SwarmWager.withdraw()\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":10,\"ADAPTATION.md\":247,\"README.md\":333,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/keeper.mjs\":1,\"api/markets.mjs\":1,\"api/price.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":601,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION-2189.md\":167,\"contracts/ADAPTATION-2190.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-RH.md\":10,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":25,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":12478,\"docs/askswarm.png\":1536,\"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\":200,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":123,\"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-handson.tsv\":8,\"docs/brand/voiceover.tsv\":8,\"docs/demo/marks.json\":11,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":12,\"docs/vids/askswarm-demo-silent.mp4\":10008,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7271,\"docs/vids/scene6.mp4\":526,\"docs/vids/scene7.mp4\":303,\"docs/vids/scene8.mp4\":234,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":39,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/keeper.ts\":135,\"functions/markets.ts\":65,\"functions/price.ts\":43,\"functions/telegram.ts\":24,\"functions/wagers.ts\":66,\"lib/announce.ts\":42,\"lib/answers.json\":1,\"lib/bot.ts\":310,\"lib/hfsync.ts\":49,\"lib/logs.ts\":27,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":32,\"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\":94,\"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\":171,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/market.html\":464,\"public/message.svg\":3,\"public/nav.js\":36,\"public/og.png\":1364,\"public/pay.html\":47,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":198,\"script/Deploy.s.sol\":23,\"script/DeployMarket.s.sol\":23,\"script/DeployWager.s.sol\":20,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-market.ts\":30,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/e2e-tg.ts\":23,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/keeper.ts\":4,\"scripts/launch.ts\":65,\"scripts/open-market.ts\":18,\"scripts/record-demo.ts\":101,\"scripts/smoke.ts\":75,\"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\":315,\"src/SwarmWager.sol\":330,\"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/BlockedPartyInvariant.t.sol\":683,\"test/BlockedThirdParty.t.sol\":227,\"test/OracleConsumerConformance.t.sol\":104,\"test/RobinhoodChainLaunch.t.sol\":400,\"test/RobinhoodSystemInvariant.t.sol\":856,\"test/SWARM_WAGER_TESTING.md\":47,\"test/SwarmMarket.t.sol\":285,\"test/SwarmMarketDeployment.t.sol\":73,\"test/SwarmMarketInvariant.t.sol\":565,\"test/SwarmMarketLiveRegistry.t.sol\":124,\"test/SwarmMarketPayments.t.sol\":313,\"test/SwarmMarketReview.t.sol\":722,\"test/SwarmMarketTesting.md\":89,\"test/SwarmWager.t.sol\":282,\"test/SwarmWagerAtomicity.t.sol\":294,\"test/SwarmWagerBoundaries.t.sol\":259,\"test/SwarmWagerDeployment.t.sol\":90,\"test/SwarmWagerInvariant.t.sol\":122,\"test/SwarmWagerLiveRegistry.t.sol\":88,\"test/SwarmWagerReview.t.sol\":450,\"test/TESTING.md\":98,\"test/helpers/RegistryTestSupport.sol\":289,\"test/helpers/SwarmWagerHandler.sol\":525,\"test/mocks/BlockableIMD.sol\":45,\"test/mocks/IntakeMocks.sol\":100,\"test/mocks/WagerFaultToken.sol\":88,\"tsconfig.json\":8,\"vercel.json\":15},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":true}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"cdc8a0c1b04c032c8cde66036e735b43a9d3a73e6cd9c1268a8a1b38b571c1c3","verifiedTreeHash":"e624e405b4d902632f7a3d1881a313c59440a260","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":100164,"exitCode":0,"name":"build","output":"Compiling 54 files with Solc 0.8.26\nSolc 0.8.26 finished in 100.07s\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":30880,"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 467.32µs (0.00ns CPU time)\n\nRan 2 tests for test/SwarmWagerLiveRegistry.t.sol:SwarmWagerLiveRegistryTest\n[PASS] test_launchAddressesAndLiveAskGetAndUnverifiedRefund() (gas: 1147131)\n[PASS] test_liveLostOutcomeRefunds() (gas: 913967)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.69ms (751.74µs 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 4.03ms (1.28ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 526475)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 431549)\n[PASS] test_badTerms() (gas: 117795)\n[PASS] test_cancelUnmatched() (gas: 468784)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385876)\n[PASS] test_minorityAnswerRefunds() (gas: 1003852)\n[PASS] test_noWins() (gas: 1031853)\n[PASS] test_nonBoolAnswerRefunds() (gas: 1029900)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 1030322)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786321)\n[PASS] test_refusedRefunds() (gas: 842526)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 730962)\n[PASS] test_settleOnlyOnce() (gas: 1064491)\n[PASS] test_splitPanelRefunds() (gas: 859479)\n[PASS] test_yesWins() (gas: 1095859)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 4.03ms (4.08ms CPU time)\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2270377)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 15.77ms (15.76ms CPU time)\n\nRan 6 tests for test/RobinhoodChainLaunch.t.sol:RobinhoodChainLaunchTest\n[PASS] test_deploymentSendsNoValueAndRejectsEth() (gas: 6967010)\n[PASS] test_factoryDeploysAllThreeInOrderOnEmptyChain4663() (gas: 13982101)\n[PASS] test_mainnetImdWouldMakeTheRegistryInertOnChain4663() (gas: 1031204)\n[PASS] test_marketAndWagerLifecycleOnChain4663() (gas: 3719214)\n[PASS] test_registryDomainIsChain4663AndItsOwnAddress() (gas: 36978)\n[PASS] test_signatureUnderAnotherChainsDomainIsUnverified() (gas: 2567058)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 26.59ms (28.74ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 430011, ~: 425945)\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 101.40ms (109.37ms CPU time)\n\nRan 4 tests for test/SwarmWagerDeployment.t.sol:SwarmWagerDeploymentTest\n[PASS] test_constructorRejectsZeroDependenciesAndNativeValue() (gas: 3966)\n[PASS] test_factoryDeploysOnlyWagerOnEmptyChainWithStaticArguments() (gas: 3410212)\n[PASS] test_projectScriptRejectsOtherChains() (gas: 2009226)\n[PASS] test_projectScriptUsesExistingMainnetRegistry() (gas: 3539625)\nLogs:\n  SwarmWager 0x34A1D3fff3958843C43aD80F30b94c510645C316 chain 1\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 264.31ms (7.85ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1220027, ~: 1233303)\n[PASS] test_abandon() (gas: 747140)\n[PASS] test_bothSidesSameUser() (gas: 1183564)\n[PASS] test_guards() (gas: 436805)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2143676)\n[PASS] test_noWins() (gas: 1210671)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520296)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1022980)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112631)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281641)\n[PASS] test_yesWinsProRataWithFee() (gas: 1366981)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 281.08ms (171.13ms CPU time)\n\nRan 7 tests for test/SwarmMarketPayments.t.sol:SwarmMarketPaymentsTest\n[PASS] testFuzz_failedPullOrApprovalIsAtomicAndRetryable(uint8,uint8) (runs: 1000, μ: 1227150, ~: 1240723)\n[PASS] testFuzz_failedTreasuryTransferRollsBackCreatorFee(uint8) (runs: 1000, μ: 1349427, ~: 1349486)\n[PASS] test_failedAbandonRefundRollsBackVoidAndAllowsRetry() (gas: 704898)\n[PASS] test_failedClaimPreservesEntitlementAndDoesNotBlockAnotherWinner() (gas: 1383571)\n[PASS] test_failedRemainderRefundRollsBackAlreadyPaidOracle() (gas: 1316831)\n[PASS] test_noReturnPullsAndApprovalsReachAnOrdinaryPayout() (gas: 1211423)\n[PASS] test_poolOverflowCannotChargeOrChangeAnUnrelatedMarket() (gas: 944902)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 281.25ms (539.49ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1011576, ~: 974614)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839265, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 500072, ~: 497946)\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 281.34ms (681.40ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 814187, ~: 680169)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504253, ~: 494357)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 517760, ~: 523448)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 506232, ~: 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 281.41ms (867.04ms 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 281.32ms (8.89ms CPU time)\n\nRan 3 tests for test/SwarmWagerAtomicity.t.sol:SwarmWagerAtomicityTest\n[PASS] testFuzz_failedPaymentPreservesConcurrentEscrow(uint8,uint8,uint8,uint96) (runs: 1000, μ: 1383463, ~: 1294241)\n[PASS] test_everyPaymentLegRejectsFalseRevertAndMalformedReturns() (gas: 93507466)\n[PASS] test_noReturnTokenCompletesWinsRefundsCancellationAndAbandonment() (gas: 2560329)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 281.32ms (327.57ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 210503, ~: 221751)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 568884, ~: 574418)\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 281.41ms (554.48ms CPU time)\n\nRan 35 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_acceptedTermsAlwaysUnwindWithinHorizon(uint64,uint64,uint8) (runs: 256, μ: 736726, ~: 741259)\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2082460, ~: 2075824)\n[PASS] testFuzz_openRejectsEveryResolveAfterPastMaxTerm(uint64,uint64) (runs: 256, μ: 56699, ~: 56595)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 629067, ~: 522968)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 549455)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1160955)\n[PASS] test_answerDeliveredInWindowSettlesAfterDeadline() (gas: 1124495)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1249390)\n[PASS] test_issuedAtBoundsTheAnswerWindow() (gas: 1923420)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1381977)\n[PASS] test_maxTermMarketAbandonsAfterResolveWindow() (gas: 716434)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2707778)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 554684)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1292972)\n[PASS] test_openAcceptsExactMaxTermAndMarketStillUnwinds() (gas: 778967)\n[PASS] test_openRejectsBodyLongerThanIntakeAccepts() (gas: 8125554)\n[PASS] test_openRejectsResolveAfterBeyondMaxTerm() (gas: 151931)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 921740)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1133713)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 841691)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 503485)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 574402)\n[PASS] test_settleNeedsRegistryRecordThenVoidsPendingAfterDeadline() (gas: 919739)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1899953)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2427211)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 481728)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 535468)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1201842)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 561958)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 864537)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 763136)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1200528)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1286815)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1055965)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3614414)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 281.36ms (310.41ms CPU time)\n\nRan 10 tests for test/SwarmWagerBoundaries.t.sol:SwarmWagerBoundariesTest\n[PASS] testFuzz_majorityBoundaryAcrossUint16Range(uint16,bool,bool,bool) (runs: 1000, μ: 995518, ~: 989962)\n[PASS] testFuzz_nonBoolTypeCannotPayEvenWithCanonicalBoolBytes(uint8,bool) (runs: 1000, μ: 996400, ~: 1006187)\n[PASS] test_failedCreateAndJoinDoNotLeavePhantomPositionsOrParticipants() (gas: 855348)\n[PASS] test_maximumStakeAndMaximumFeeDoNotNarrowCombinedAmounts() (gas: 1126236)\n[PASS] test_missingRegistryRecordUsesTimeoutInsteadOfPayingEmbeddedAnswer() (gas: 825603)\n[PASS] test_oversizedBodyRejectedByTransportLeavesFeeAndStakesRefundable() (gas: 4252869)\n[PASS] test_retiredActionRollsBackApprovalAndCanBeAbandoned() (gas: 546125)\n[PASS] test_sharedQuestionIndexCannotSubstituteAnotherWagersAnswer() (gas: 1849034)\n[PASS] test_unavailablePriceDoesNotChargeCreateOrTrapMatchedEscrow() (gas: 674356)\n[PASS] test_zeroAndUnrepresentableFeesRejectBeforeFunding() (gas: 233192)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 281.37ms (562.77ms CPU time)\n\nRan 26 tests for test/SwarmWagerReview.t.sol:SwarmWagerReviewTest\n[PASS] testFuzz_allAcceptedTermsHaveBoundedExit(uint64,uint64,bool) (runs: 256, μ: 373619, ~: 330491)\n[PASS] testFuzz_onlyCanonicalMajorityBoolPays(uint256,uint16,uint16) (runs: 256, μ: 1004469, ~: 1017289)\n[PASS] testFuzz_topUpFeeConservation(uint96,uint96,bool) (runs: 256, μ: 887243, ~: 1197852)\n[PASS] testFuzz_wrongBoolLengthRefunds(uint8) (runs: 256, μ: 993160, ~: 987288)\n[PASS] test_abandonBeforeLateResolvePreventsAnAsk() (gas: 473416)\n[PASS] test_abandonReturnsAllTopUpsToCreator() (gas: 433654)\n[PASS] test_badSignatureRefundsBothStakes() (gas: 1009930)\n[PASS] test_creatorTopUpRecoversWagerAfterPriceRise() (gas: 1191517)\n[PASS] test_exactJoinAndResolveBoundaryRemainsSupported() (gas: 977893)\n[PASS] test_expiredAtDeliveryRefundsBothStakes() (gas: 979775)\n[PASS] test_lateAnswerBeforeTimeoutSettlementStillPaysWinner() (gas: 1049816)\n[PASS] test_lostCallbackRefundsBothStakes() (gas: 884685)\n[PASS] test_maximumFeeEscrowCanBeFundedAndAbandoned() (gas: 531708)\n[PASS] test_maximumTermCanStillBeMatchedAndUnwound() (gas: 449314)\n[PASS] test_maximumTimestampAndOverlongTermsRejectedBeforePayment() (gas: 102218)\n[PASS] test_priceDecreaseReturnsOnlyRemainderAndApprovesExactPrice() (gas: 808079)\n[PASS] test_priceRiseRevertsWithoutSpendingStakesAndAbandonStillWorks() (gas: 556509)\n[PASS] test_resolutionAfterAbandonDeadlineCanWinTheRace() (gas: 1051298)\n[PASS] test_resolveCallerChoosesAskTimeForRelativeWindows() (gas: 731350)\n[PASS] test_resolveWaitsThroughGapAfterJoinDeadline() (gas: 731606)\n[PASS] test_thirdPartyTopUpIsExplicitAndUnusedFeeGoesToCreator() (gas: 1177687)\n[PASS] test_timeoutIsStrictlyAfterAnswerWindow() (gas: 838828)\n[PASS] test_timeoutSettlementBeforeLateAnswerRemainsRefunded() (gas: 1057759)\n[PASS] test_topUpRefusesUnknownOpenAskedAndTerminalWagers() (gas: 1345614)\n[PASS] test_topUpRefusesZeroOverflowAndRollsBackFailedPayment() (gas: 573580)\n[PASS] test_writerPairingOfAnotherQuestionsAnswerIsTrusted() (gas: 1164208)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 281.35ms (398.04ms CPU time)\n\nRan 2 tests for test/RobinhoodSystemInvariant.t.sol:RobinhoodSystemInvariantTest\n[PASS]\nRobinhoodSystemInvariantTest invariants:\n[PASS] invariant_marketClaimsAreSolventPerMarket\n[PASS] invariant_marketHoldsExactlyWhatIsOwed\n[PASS] invariant_registryPassesThroughAndSupplyIsConserved\n[PASS] invariant_wagerHoldsExactlyWhatIsOwed\n RobinhoodSystemInvariantTest invariants (runs: 128, calls: 10240, reverts: 0)\n\n╭---------------+-----------------+-------+---------+----------╮\n| Contract      | Selector        | Calls | Reverts | Discards |\n+==============================================================+\n| SystemHandler | abandonMarket   | 499   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | abandonWager    | 486   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | cancelWager     | 499   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | changePrice     | 492   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | claim           | 497   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | createWager     | 484   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | deliver         | 487   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | joinWager       | 471   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | marketLifecycle | 473   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | openMarket      | 502   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | resolveMarket   | 496   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | resolveWager    | 479   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | settleMarket    | 960   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | settleWager     | 470   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | stake           | 1014  | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | topUpMarket     | 470   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | topUpWager      | 469   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | wagerLifecycle  | 498   | 0       | 0        |\n|---------------+-----------------+-------+---------+----------|\n| SystemHandler | warp            | 494   | 0       | 0        |\n╰---------------+-----------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesEveryOutcome() (gas: 9275849)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.17s (4.17s 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        | 1358  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1371  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1326  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1341  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1390  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1436  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1349  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1398  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1319  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.29s (7.29s 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                     | 2191  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2250  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2285  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2198  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2188  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2232  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2287  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2265  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2210  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2222  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2248  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 12.62s (12.61s CPU time)\n\nRan 2 tests for test/SwarmWagerInvariant.t.sol:SwarmWagerInvariantTest\n[PASS]\nSwarmWagerInvariantTest invariants:\n[PASS] invariant_escrowAndEveryActorBalanceReconcile\n[PASS] invariant_termsRequestsAndTerminalStatesStayConsistent\n SwarmWagerInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| SwarmWagerHandler | abandon        | 2450  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | advanceTime    | 2576  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | cancel         | 2556  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | changePrice    | 2541  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | create         | 2433  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | deliver        | 2488  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | donate         | 2491  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | failingResolve | 2574  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | join           | 2561  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | resolve        | 2599  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | settle         | 2519  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | topUp          | 2474  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | wrongState     | 2506  | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesEveryOutcomeAndAllExitPaths() (gas: 38042355)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 16.76s (16.77s 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     | 2264  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | advance     | 2147  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | changePrice | 2277  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | claim       | 2208  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | deliver     | 2311  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | donate      | 2184  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | openMarket  | 2226  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | resolve     | 2173  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | settle      | 2258  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | stake       | 2261  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | topUp       | 2267  | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesAllPhasesAndUnwinds() (gas: 3122665)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 30.76s (30.76s CPU time)\n\nRan 23 test suites in 30.76s (74.83s CPU time): 222 tests passed, 0 failed, 1 skipped (223 total tests)\n","passed":true},{"durationMs":265,"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)\",\"SwarmWager.topUpFee(uint256,uint96)\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":10,\"ADAPTATION.md\":168,\"README.md\":322,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/keeper.mjs\":1,\"api/markets.mjs\":1,\"api/price.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":601,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION-2189.md\":167,\"contracts/ADAPTATION-2190.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-RH.md\":10,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":25,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":12478,\"docs/askswarm.png\":1536,\"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\":200,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":123,\"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-handson.tsv\":8,\"docs/brand/voiceover.tsv\":8,\"docs/demo/marks.json\":11,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":12,\"docs/vids/askswarm-demo-silent.mp4\":10008,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7271,\"docs/vids/scene6.mp4\":526,\"docs/vids/scene7.mp4\":303,\"docs/vids/scene8.mp4\":234,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":39,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/keeper.ts\":135,\"functions/markets.ts\":65,\"functions/price.ts\":43,\"functions/telegram.ts\":24,\"functions/wagers.ts\":66,\"lib/announce.ts\":42,\"lib/answers.json\":1,\"lib/bot.ts\":310,\"lib/hfsync.ts\":49,\"lib/logs.ts\":27,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":32,\"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\":94,\"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\":171,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/market.html\":464,\"public/message.svg\":3,\"public/nav.js\":36,\"public/og.png\":1364,\"public/pay.html\":47,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":198,\"script/Deploy.s.sol\":23,\"script/DeployMarket.s.sol\":23,\"script/DeployWager.s.sol\":20,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-market.ts\":30,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/e2e-tg.ts\":23,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/keeper.ts\":4,\"scripts/launch.ts\":65,\"scripts/open-market.ts\":18,\"scripts/record-demo.ts\":101,\"scripts/smoke.ts\":75,\"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\":283,\"src/SwarmWager.sol\":292,\"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/RobinhoodChainLaunch.t.sol\":400,\"test/RobinhoodSystemInvariant.t.sol\":856,\"test/SWARM_WAGER_TESTING.md\":47,\"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\":722,\"test/SwarmMarketTesting.md\":89,\"test/SwarmWager.t.sol\":282,\"test/SwarmWagerAtomicity.t.sol\":268,\"test/SwarmWagerBoundaries.t.sol\":254,\"test/SwarmWagerDeployment.t.sol\":90,\"test/SwarmWagerInvariant.t.sol\":122,\"test/SwarmWagerLiveRegistry.t.sol\":88,\"test/SwarmWagerReview.t.sol\":450,\"test/TESTING.md\":91,\"test/helpers/RegistryTestSupport.sol\":289,\"test/helpers/SwarmWagerHandler.sol\":523,\"test/mocks/IntakeMocks.sol\":100,\"test/mocks/WagerFaultToken.sol\":88,\"tsconfig.json\":8,\"vercel.json\":15},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":true}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d11717693a623c332140cca24da8f9528d63e4035a75d35e5cec1fede15b277c","verifiedTreeHash":"c94fa5031e5292b6605bb54448a3b92b8464a9a5","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":105225,"exitCode":0,"name":"build","output":"Compiling 55 files with Solc 0.8.26\nSolc 0.8.26 finished in 105.11s\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":31498,"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 562.29µ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.77ms (1.05ms CPU time)\n\nRan 2 tests for test/SwarmWagerLiveRegistry.t.sol:SwarmWagerLiveRegistryTest\n[PASS] test_launchAddressesAndLiveAskGetAndUnverifiedRefund() (gas: 1147525)\n[PASS] test_liveLostOutcomeRefunds() (gas: 914229)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.60ms (1.09ms CPU time)\n\nRan 2 tests for test/SwarmMarketDeployment.t.sol:SwarmMarketDeploymentTest\n[PASS] test_factoryDeploysOnlyMarketWithStaticArgsOnEmptyChain() (gas: 2397287)\n[PASS] test_zeroDependenciesAndEthAreRejected() (gas: 4054)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.39ms (7.34ms CPU time)\n\nRan 8 tests for test/BlockedThirdParty.t.sol:BlockedThirdPartyTest\n[PASS] test_marketAbandonVoidsWhileCreatorBlocked() (gas: 825027)\n[PASS] test_marketResolvesWhileCreatorBlockedAndCreditsRemainder() (gas: 682633)\n[PASS] test_marketSettlesWhileCreatorBlocked() (gas: 967103)\n[PASS] test_marketSettlesWhileTreasuryBlocked() (gas: 1049767)\n[PASS] test_wagerAbandonRefundsCounterpartyWhileOtherBlocked() (gas: 578172)\n[PASS] test_wagerFeeFieldZeroedOnCancelAndAbandon() (gas: 842704)\n[PASS] test_wagerResolvesWhileCreatorBlockedAndCreditsRemainder() (gas: 647704)\n[PASS] test_wagerTimeoutRefundsCounterpartyWhileOtherBlocked() (gas: 805589)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 7.78ms (7.22ms CPU time)\n\nRan 4 tests for test/SwarmWagerDeployment.t.sol:SwarmWagerDeploymentTest\n[PASS] test_constructorRejectsZeroDependenciesAndNativeValue() (gas: 3966)\n[PASS] test_factoryDeploysOnlyWagerOnEmptyChainWithStaticArguments() (gas: 3694662)\n[PASS] test_projectScriptRejectsOtherChains() (gas: 2154869)\n[PASS] test_projectScriptUsesExistingMainnetRegistry() (gas: 3820063)\nLogs:\n  SwarmWager 0x34A1D3fff3958843C43aD80F30b94c510645C316 chain 1\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 8.78ms (7.47ms CPU time)\n\nRan 15 tests for test/SwarmWager.t.sol:SwarmWagerTest\n[PASS] test_abandonWhenNeverResolved() (gas: 529701)\n[PASS] test_anyoneCancelsAfterJoinBy() (gas: 434756)\n[PASS] test_badTerms() (gas: 118120)\n[PASS] test_cancelUnmatched() (gas: 472035)\n[PASS] test_creatorCannotTakeBothSides() (gas: 385989)\n[PASS] test_minorityAnswerRefunds() (gas: 1004158)\n[PASS] test_noWins() (gas: 1032221)\n[PASS] test_nonBoolAnswerRefunds() (gas: 1030206)\n[PASS] test_nonCanonicalBoolRefunds() (gas: 1030628)\n[PASS] test_pendingThenTimeoutRefunds() (gas: 786583)\n[PASS] test_refusedRefunds() (gas: 842788)\n[PASS] test_resolveWaitsAndOnlyOnce() (gas: 731260)\n[PASS] test_settleOnlyOnce() (gas: 1064903)\n[PASS] test_splitPanelRefunds() (gas: 859741)\n[PASS] test_yesWins() (gas: 1096271)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 9.16ms (7.29ms 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 41.96ms (9.94ms CPU time)\n\nRan 6 tests for test/RobinhoodChainLaunch.t.sol:RobinhoodChainLaunchTest\n[PASS] test_deploymentSendsNoValueAndRejectsEth() (gas: 7255479)\n[PASS] test_factoryDeploysAllThreeInOrderOnEmptyChain4663() (gas: 14645543)\n[PASS] test_mainnetImdWouldMakeTheRegistryInertOnChain4663() (gas: 1031226)\n[PASS] test_marketAndWagerLifecycleOnChain4663() (gas: 3719710)\n[PASS] test_registryDomainIsChain4663AndItsOwnAddress() (gas: 36978)\n[PASS] test_signatureUnderAnotherChainsDomainIsUnverified() (gas: 2567290)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 86.20ms (25.24ms CPU time)\n\nRan 11 tests for test/SwarmMarket.t.sol:SwarmMarketTest\n[PASS] testFuzz_solvent(uint96,uint96,uint96,bool) (runs: 256, μ: 1220074, ~: 1233540)\n[PASS] test_abandon() (gas: 747384)\n[PASS] test_bothSidesSameUser() (gas: 1183773)\n[PASS] test_guards() (gas: 436941)\n[PASS] test_minorityAndNonBoolVoid() (gas: 2144194)\n[PASS] test_noWins() (gas: 1210902)\n[PASS] test_oneSidedMarketVoidsWithoutSpendingFee() (gas: 520400)\n[PASS] test_pendingThenTimeoutVoids() (gas: 1023270)\n[PASS] test_splitPanelVoidsAndRefundsEveryone() (gas: 1112925)\n[PASS] test_stakingClosesAndClaimsOnce() (gas: 1281872)\n[PASS] test_yesWinsProRataWithFee() (gas: 1367238)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 97.51ms (100.67ms CPU time)\n\nRan 35 tests for test/SwarmMarketReview.t.sol:SwarmMarketReviewTest\n[PASS] testFuzz_acceptedTermsAlwaysUnwindWithinHorizon(uint64,uint64,uint8) (runs: 256, μ: 736149, ~: 741165)\n[PASS] testFuzz_multiMarketConservation(uint128,uint128,uint96,uint8,bool) (runs: 256, μ: 2081757, ~: 2076424)\n[PASS] testFuzz_openRejectsEveryResolveAfterPastMaxTerm(uint64,uint64) (runs: 256, μ: 56739, ~: 56639)\n[PASS] testFuzz_resolveAndAbandonWindowsNeverOverlap(uint32) (runs: 256, μ: 623493, ~: 523186)\n[PASS] test_abandonAfterWindowIgnoresOracleOutageAndRefundsEscrow() (gas: 549651)\n[PASS] test_answerCanSettleAtExactDeadlineAndClaimsHaveNoDeadline() (gas: 1161204)\n[PASS] test_answerDeliveredInWindowSettlesAfterDeadline() (gas: 1124722)\n[PASS] test_claimArithmeticAtMaximumUint128Pools() (gas: 1249617)\n[PASS] test_issuedAtBoundsTheAnswerWindow() (gas: 1923919)\n[PASS] test_lateCompletionBeforeOrAfterSettleAlwaysVoids() (gas: 1382334)\n[PASS] test_maxTermMarketAbandonsAfterResolveWindow() (gas: 716734)\n[PASS] test_minimumPanelStillNeedsStrictMajorityAndQuorum() (gas: 2708550)\n[PASS] test_oneSidedMarketReturnsTopUpWithoutAsking() (gas: 554902)\n[PASS] test_oneWeiPriceRiseCanBeFundedByAnyoneAfterStakingCloses() (gas: 1293291)\n[PASS] test_openAcceptsExactMaxTermAndMarketStillUnwinds() (gas: 779226)\n[PASS] test_openRejectsBodyLongerThanIntakeAccepts() (gas: 8125791)\n[PASS] test_openRejectsResolveAfterBeyondMaxTerm() (gas: 152085)\n[PASS] test_pendingAtExactDeadlineThenVoidOneSecondLater() (gas: 922048)\n[PASS] test_registryRejectionRollsBackResolutionAndCanRetry() (gas: 1133998)\n[PASS] test_resolveAtLastSecondPreservesBodyAndChargesExactlyOnce() (gas: 841928)\n[PASS] test_resolveRejectsEarlyAndAfterOneHour() (gas: 503717)\n[PASS] test_retiredActionCanBeAbandonedWithoutSpendingStakes() (gas: 574620)\n[PASS] test_settleNeedsRegistryRecordThenVoidsPendingAfterDeadline() (gas: 920047)\n[PASS] test_sixSeatUnanimousPanelVoidsButSevenWithFourAgreedSettles() (gas: 1900408)\n[PASS] test_terminalFailureStatusesRefundStakesWithoutProtocolFee() (gas: 2427983)\n[PASS] test_topUpAcceptsLastSecondButNotAfter() (gas: 481942)\n[PASS] test_topUpFailedTransferRollsBackEscrowBalancesAndAllowance() (gas: 535638)\n[PASS] test_topUpGuardsZeroOverflowUnknownExpiredAndAskedMarkets() (gas: 1202267)\n[PASS] test_topUpOnAbandonReturnsDonationToCreator() (gas: 562202)\n[PASS] test_topUpSurplusAndPriceDecreaseReturnOnlyRemainderToCreator() (gas: 864759)\n[PASS] test_topUpWithoutApprovalCannotUseAnotherMarketsFunds() (gas: 763428)\n[PASS] test_twoSeatPanelVoidsWithDistinctReasonAndNoFee() (gas: 1200844)\n[PASS] test_unknownIdsAndTerminalMarketsRejectLifecycleCalls() (gas: 1287196)\n[PASS] test_writerQuestionPairingIsExplicitTrustAssumption() (gas: 1056166)\n[PASS] test_wrongTypeShortLongAndNonBooleanWordsVoid() (gas: 3615440)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 196.50ms (296.73ms CPU time)\n\nRan 23 tests for test/AskSwarmRegistry.t.sol:AskSwarmRegistryTest\n[PASS] testFuzz_indexedAnswersAreMajorities(uint16,uint16,uint16,uint32,uint32,uint32) (runs: 256, μ: 429613, ~: 425951)\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 294.01ms (304.17ms CPU time)\n\nRan 10 tests for test/SwarmWagerBoundaries.t.sol:SwarmWagerBoundariesTest\n[PASS] testFuzz_majorityBoundaryAcrossUint16Range(uint16,bool,bool,bool) (runs: 1000, μ: 995942, ~: 990355)\n[PASS] testFuzz_nonBoolTypeCannotPayEvenWithCanonicalBoolBytes(uint8,bool) (runs: 1000, μ: 996794, ~: 1006580)\n[PASS] test_failedCreateAndJoinDoNotLeavePhantomPositionsOrParticipants() (gas: 855922)\n[PASS] test_maximumStakeAndMaximumFeeDoNotNarrowCombinedAmounts() (gas: 1126647)\n[PASS] test_missingRegistryRecordUsesTimeoutInsteadOfPayingEmbeddedAnswer() (gas: 825996)\n[PASS] test_oversizedBodyRejectedAtCreate() (gas: 1749579)\n[PASS] test_retiredActionRollsBackApprovalAndCanBeAbandoned() (gas: 549445)\n[PASS] test_sharedQuestionIndexCannotSubstituteAnotherWagersAnswer() (gas: 1849974)\n[PASS] test_unavailablePriceDoesNotChargeCreateOrTrapMatchedEscrow() (gas: 677797)\n[PASS] test_zeroAndUnrepresentableFeesRejectBeforeFunding() (gas: 233633)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 296.33ms (538.08ms CPU time)\n\nRan 19 tests for test/AskSwarmRegistryPayments.t.sol:AskSwarmRegistryPaymentsTest\n[PASS] testFuzz_badTokenReturnRollsBackBothPaymentLegs(uint8,bool) (runs: 1000, μ: 210500, ~: 221751)\n[PASS] testFuzz_exactPriceIsForwardedAndBodyIsUnchanged(uint128,bytes) (runs: 1000, μ: 568755, ~: 574358)\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 314.60ms (435.73ms CPU time)\n\nRan 26 tests for test/AskSwarmRegistryCallbacks.t.sol:AskSwarmRegistryCallbacksTest\n[PASS] testFuzz_longAnswerHashAndEventPreserveEveryByte(uint16,bytes32) (runs: 1000, μ: 816898, ~: 690533)\n[PASS] testFuzz_non65ByteSignaturesNeverVerify(uint16,bytes32) (runs: 1000, μ: 504233, ~: 492611)\n[PASS] testFuzz_shortAnswerRoundTripsIncludingZeros(bytes32,uint8) (runs: 1000, μ: 518070, ~: 523532)\n[PASS] testFuzz_verifiedRequiresIssuedAtWithinTolerance(uint32,uint32) (runs: 1000, μ: 506020, ~: 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 314.69ms (647.32ms CPU time)\n\nRan 26 tests for test/SwarmWagerReview.t.sol:SwarmWagerReviewTest\n[PASS] testFuzz_allAcceptedTermsHaveBoundedExit(uint64,uint64,bool) (runs: 256, μ: 376868, ~: 333786)\n[PASS] testFuzz_onlyCanonicalMajorityBoolPays(uint256,uint16,uint16) (runs: 256, μ: 1004747, ~: 1017639)\n[PASS] testFuzz_topUpFeeConservation(uint96,uint96,bool) (runs: 256, μ: 889030, ~: 1198315)\n[PASS] testFuzz_wrongBoolLengthRefunds(uint8) (runs: 256, μ: 993506, ~: 987638)\n[PASS] test_abandonBeforeLateResolvePreventsAnAsk() (gas: 476711)\n[PASS] test_abandonReturnsAllTopUpsToCreator() (gas: 436887)\n[PASS] test_badSignatureRefundsBothStakes() (gas: 1010324)\n[PASS] test_creatorTopUpRecoversWagerAfterPriceRise() (gas: 1192043)\n[PASS] test_exactJoinAndResolveBoundaryRemainsSupported() (gas: 978305)\n[PASS] test_expiredAtDeliveryRefundsBothStakes() (gas: 980125)\n[PASS] test_lateAnswerBeforeTimeoutSettlementStillPaysWinner() (gas: 1050272)\n[PASS] test_lostCallbackRefundsBothStakes() (gas: 884991)\n[PASS] test_maximumFeeEscrowCanBeFundedAndAbandoned() (gas: 535029)\n[PASS] test_maximumTermCanStillBeMatchedAndUnwound() (gas: 452628)\n[PASS] test_maximumTimestampAndOverlongTermsRejectedBeforePayment() (gas: 102479)\n[PASS] test_priceDecreaseReturnsOnlyRemainderAndApprovesExactPrice() (gas: 808358)\n[PASS] test_priceRiseRevertsWithoutSpendingStakesAndAbandonStillWorks() (gas: 559867)\n[PASS] test_resolutionAfterAbandonDeadlineCanWinTheRace() (gas: 1051817)\n[PASS] test_resolveCallerChoosesAskTimeForRelativeWindows() (gas: 731648)\n[PASS] test_resolveWaitsThroughGapAfterJoinDeadline() (gas: 731967)\n[PASS] test_thirdPartyTopUpIsExplicitAndUnusedFeeGoesToCreator() (gas: 1178150)\n[PASS] test_timeoutIsStrictlyAfterAnswerWindow() (gas: 839178)\n[PASS] test_timeoutSettlementBeforeLateAnswerRemainsRefunded() (gas: 1058197)\n[PASS] test_topUpRefusesUnknownOpenAskedAndTerminalWagers() (gas: 1349409)\n[PASS] test_topUpRefusesZeroOverflowAndRollsBackFailedPayment() (gas: 574035)\n[PASS] test_writerPairingOfAnotherQuestionsAnswerIsTrusted() (gas: 1164576)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 314.89ms (422.64ms CPU time)\n\nRan 9 tests for test/SwarmMarketPayments.t.sol:SwarmMarketPaymentsTest\n[PASS] testFuzz_failedPullOrApprovalIsAtomicAndRetryable(uint8,uint8) (runs: 1000, μ: 1226432, ~: 1241270)\n[PASS] testFuzz_treasuryFeeTransferFailure(uint8) (runs: 1000, μ: 1330132, ~: 1346757)\n[PASS] test_failedClaimPreservesEntitlementAndDoesNotBlockAnotherWinner() (gas: 1383849)\n[PASS] test_failedWithdrawKeepsCredit() (gas: 522018)\n[PASS] test_malformedRemainderReplyRollsBackAlreadyPaidOracle() (gas: 905745)\n[PASS] test_noReturnPullsAndApprovalsReachAnOrdinaryPayout() (gas: 1211646)\n[PASS] test_poolOverflowCannotChargeOrChangeAnUnrelatedMarket() (gas: 945339)\n[PASS] test_refusedAbandonRefundIsCreditedAndStakersClaim() (gas: 680817)\n[PASS] test_refusedRemainderRefundIsCreditedAndAskStands() (gas: 924784)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 314.97ms (577.82ms CPU time)\n\nRan 9 tests for test/AskSwarmRegistryAdversarial.t.sol:AskSwarmRegistryAdversarialTest\n[PASS] testFuzz_oversizedAnswersOfAnySizeSettleInsideStipend(uint24) (runs: 300, μ: 1011576, ~: 974614)\n[PASS] testFuzz_readsOfUntouchedKeysAreEmpty(bytes32,uint16,uint16) (runs: 256, μ: 47590, ~: 47590)\n[PASS] testFuzz_unexpectedFailureStatusesSettleAsNoResult(uint8,bytes32,uint16) (runs: 512, μ: 839260, ~: 839429)\n[PASS] testFuzz_verifiedExactlyWhenEveryConditionHolds(uint16,uint16,uint16,uint32,uint32,uint8) (runs: 1000, μ: 499991, ~: 497931)\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 315.06ms (1.00s CPU time)\n\nRan 3 tests for test/SwarmWagerAtomicity.t.sol:SwarmWagerAtomicityTest\n[PASS] testFuzz_failedPaymentPreservesConcurrentEscrow(uint8,uint8,uint8,uint96) (runs: 1000, μ: 1388461, ~: 1298327)\n[PASS] test_everyPaymentLegRejectsFalseRevertAndMalformedReturns() (gas: 92914108)\n[PASS] test_noReturnTokenCompletesWinsRefundsCancellationAndAbandonment() (gas: 2567188)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 315.07ms (358.43ms 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        | 1358  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | deliver    | 1371  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | directHook | 1326  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | fail       | 1341  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | markLost   | 1390  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | reindex    | 1436  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | replay     | 1349  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | strand     | 1398  | 0       | 0        |\n|------------------------+------------+-------+---------+----------|\n| IndexTransitionHandler | warp       | 1319  | 0       | 0        |\n╰------------------------+------------+-------+---------+----------╯\n\n[PASS] test_handlersReachLostAndReindexMoves() (gas: 1787105)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.83s (7.83s 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                     | 2191  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | answer                          | 2250  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | ask                             | 2285  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | donate                          | 2198  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | failingAsk                      | 2188  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | markLost                        | 2232  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | refuse                          | 2287  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | reindex                         | 2265  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | replaySettledThroughOpenRequest | 2210  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | retryCompletedRequest           | 2222  | 0       | 0        |\n|-------------------------+---------------------------------+-------+---------+----------|\n| RegistrySequenceHandler | unauthorizedCallback            | 2248  | 0       | 0        |\n╰-------------------------+---------------------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.30s (13.29s CPU time)\n\nRan 2 tests for test/SwarmWagerInvariant.t.sol:SwarmWagerInvariantTest\n[PASS]\nSwarmWagerInvariantTest invariants:\n[PASS] invariant_escrowAndEveryActorBalanceReconcile\n[PASS] invariant_termsRequestsAndTerminalStatesStayConsistent\n SwarmWagerInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| SwarmWagerHandler | abandon        | 2450  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | advanceTime    | 2576  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | cancel         | 2556  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | changePrice    | 2541  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | create         | 2433  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | deliver        | 2488  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | donate         | 2491  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | failingResolve | 2574  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | join           | 2561  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | resolve        | 2599  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | settle         | 2519  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | topUp          | 2474  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SwarmWagerHandler | wrongState     | 2506  | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesEveryOutcomeAndAllExitPaths() (gas: 38060620)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 16.84s (16.88s 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     | 2264  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | advance     | 2147  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | changePrice | 2277  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | claim       | 2208  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | deliver     | 2311  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | donate      | 2184  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | openMarket  | 2226  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | resolve     | 2173  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | settle      | 2258  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | stake       | 2261  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| SwarmMarketHandler | topUp       | 2267  | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\n[PASS] test_handlerReachesAllPhasesAndUnwinds() (gas: 3124750)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 31.38s (31.37s CPU time)\n\nRan 23 test suites in 31.38s (72.29s CPU time): 230 tests passed, 0 failed, 1 skipped (231 total tests)\n","passed":true},{"durationMs":245,"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)\",\"SwarmMarket.withdraw()\",\"SwarmWager.abandon(uint256)\",\"SwarmWager.cancel(uint256)\",\"SwarmWager.create(bytes,bool,uint96,uint64,uint64)\",\"SwarmWager.join(uint256)\",\"SwarmWager.resolve(uint256)\",\"SwarmWager.settle(uint256)\",\"SwarmWager.topUpFee(uint256,uint96)\",\"SwarmWager.withdraw()\"],\"files\":{\".DS_Store\":4,\".env.example\":12,\".gitignore\":10,\"ADAPTATION.md\":247,\"README.md\":333,\"api/answers.mjs\":1,\"api/cpay-webhook.mjs\":1,\"api/hf-sync.mjs\":1,\"api/imd.mjs\":1,\"api/keeper.mjs\":1,\"api/markets.mjs\":1,\"api/price.mjs\":1,\"api/telegram.mjs\":1,\"api/wagers.mjs\":1,\"bun.lock\":601,\"contracts/ADAPTATION-2099.md\":211,\"contracts/ADAPTATION-2189.md\":167,\"contracts/ADAPTATION-2190.md\":211,\"contracts/ADAPTATION.md\":98,\"contracts/LAUNCH-MARKET.md\":7,\"contracts/LAUNCH-RH.md\":10,\"contracts/LAUNCH-WAGER.md\":7,\"contracts/LAUNCH.md\":7,\"contracts/launch-2099.json\":14,\"docs/.DS_Store\":4,\"docs/EVIDENCE.md\":25,\"docs/SUBMISSION.md\":50,\"docs/askswarm-demo.mp4\":12478,\"docs/askswarm.png\":1536,\"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\":200,\"docs/brand/hand.svg\":3,\"docs/brand/infographic.html\":123,\"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-handson.tsv\":8,\"docs/brand/voiceover.tsv\":8,\"docs/demo/marks.json\":11,\"docs/logo-1024.png\":292,\"docs/logo-512.png\":122,\"docs/logo.svg\":7,\"docs/miniapp-640x360.png\":161,\"docs/vids/SCRIPT.md\":12,\"docs/vids/askswarm-demo-silent.mp4\":10008,\"docs/vids/scene1.mp4\":186,\"docs/vids/scene2.mp4\":382,\"docs/vids/scene3.mp4\":791,\"docs/vids/scene4.mp4\":446,\"docs/vids/scene5.mp4\":7271,\"docs/vids/scene6.mp4\":526,\"docs/vids/scene7.mp4\":303,\"docs/vids/scene8.mp4\":234,\"foundry.toml\":16,\"functions/answers.ts\":81,\"functions/cpay-webhook.ts\":39,\"functions/hf-sync.ts\":15,\"functions/imd.ts\":58,\"functions/keeper.ts\":135,\"functions/markets.ts\":65,\"functions/price.ts\":43,\"functions/telegram.ts\":24,\"functions/wagers.ts\":66,\"launch.json\":29,\"lib/announce.ts\":42,\"lib/answers.json\":1,\"lib/bot.ts\":310,\"lib/hfsync.ts\":49,\"lib/logs.ts\":27,\"lib/quick.ts\":21,\"lib/recall.ts\":21,\"lib/risk-model.json\":1,\"lib/risk.ts\":56,\"package.json\":32,\"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\":94,\"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\":171,\"public/llms.txt\":9,\"public/lock.svg\":3,\"public/logo-wordmark-dark.svg\":12,\"public/logo.svg\":7,\"public/market.html\":464,\"public/message.svg\":3,\"public/nav.js\":36,\"public/og.png\":1364,\"public/pay.html\":47,\"public/skill.md\":51,\"public/star5.svg\":3,\"public/wager.html\":198,\"script/Deploy.s.sol\":23,\"script/DeployMarket.s.sol\":23,\"script/DeployWager.s.sol\":20,\"scripts/approve-permit2.ts\":25,\"scripts/balance.ts\":6,\"scripts/build-answers.ts\":24,\"scripts/demo-market.ts\":30,\"scripts/demo-wager.ts\":44,\"scripts/dry-run.ts\":13,\"scripts/e2e-tg.ts\":23,\"scripts/evidence.ts\":45,\"scripts/hf-sync.ts\":4,\"scripts/keeper.ts\":4,\"scripts/launch.ts\":65,\"scripts/open-market.ts\":18,\"scripts/record-demo.ts\":101,\"scripts/smoke.ts\":75,\"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\":315,\"src/SwarmWager.sol\":330,\"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/BlockedThirdParty.t.sol\":227,\"test/OracleConsumerConformance.t.sol\":104,\"test/RobinhoodChainLaunch.t.sol\":400,\"test/SWARM_WAGER_TESTING.md\":47,\"test/SwarmMarket.t.sol\":285,\"test/SwarmMarketDeployment.t.sol\":73,\"test/SwarmMarketInvariant.t.sol\":565,\"test/SwarmMarketLiveRegistry.t.sol\":124,\"test/SwarmMarketPayments.t.sol\":313,\"test/SwarmMarketReview.t.sol\":722,\"test/SwarmMarketTesting.md\":89,\"test/SwarmWager.t.sol\":282,\"test/SwarmWagerAtomicity.t.sol\":294,\"test/SwarmWagerBoundaries.t.sol\":259,\"test/SwarmWagerDeployment.t.sol\":90,\"test/SwarmWagerInvariant.t.sol\":122,\"test/SwarmWagerLiveRegistry.t.sol\":88,\"test/SwarmWagerReview.t.sol\":450,\"test/TESTING.md\":83,\"test/helpers/RegistryTestSupport.sol\":289,\"test/helpers/SwarmWagerHandler.sol\":525,\"test/mocks/BlockableIMD.sol\":45,\"test/mocks/IntakeMocks.sol\":100,\"test/mocks/WagerFaultToken.sol\":88,\"tsconfig.json\":8,\"vercel.json\":15},\"excluded\":[\"contracts/lib/\",\"node_modules/\"],\"truncated\":true}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ece2c5a2b51df78e9538a89e490168e4c8c4df034536dc4e495aeaee48183f66","verifiedTreeHash":"522f1cf4e71607519b555aa53e1f9935422ca0cd","verifierVersion":"0.1.0+a6ee6548"}]}