{"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":"84793148-4816-47e0-a05e-660220def3a9","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"21d8d3378e33fe09545fb2932a8fd145ad7164dfc4f44e71422e136329d8d074","dependsOn":["build_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":"65b78aad46b36f24c7217df7ffb4e626084d14318f319e96b7fa0d566960597d","dependsOn":["build_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":"72fee652a6b59e865bae068d3bab09be56a909e3087adb2ca0c3a9a04b08e5a1","dependsOn":["build_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":"ec6b47555cffcaf0e711bce859dc92fe90e40b6921674a70b4d39b7d0ae1866b","dependsOn":["build_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":"7bb0694a617cb49eb1383691a7c2bcb554e1d3bbe2ce3731959516d8fddf6247","dependsOn":["build_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":"f611e9665bdc0edcb344399b7507a26881d12049c50978203253c24f362ef1d9","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"a3c57fd754980ff8bd3910ee57d8efc085037bfc13c692e84fe2515077b094d7","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"b2594604372413b3d2e7f09098aa585bbd84cb19f21f0182ab459df139d9f5a9","dependsOn":["build_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":"Do NOT write a new hook. Use the existing, audited hook source:\nrepo https://github.com/identity-md-launches/launch-1544-blackout-swarmdesk-bootstrap-robinhood\ncommit 86e71d47b12094dc6a37c6a05cd4f84f2f970b78\nClone it at that commit, keep src/, lib/, vendor/ and foundry.toml unchanged (via_ir = false, bytecode_hash = none). The hook contract is V4Market (src/V4Market.sol).\n\nThe ONLY allowed source changes, applied exactly as written, nothing else in any existing contract:\n(a) in src/V4Market.sol, directly after the line `import \"./lib/Errors.sol\";`, add:\nstruct HookPermissions { bool beforeInitialize; bool afterInitialize; bool beforeAddLiquidity; bool afterAddLiquidity; bool beforeRemoveLiquidity; bool afterRemoveLiquidity; bool beforeSwap; bool afterSwap; bool beforeDonate; bool afterDonate; bool beforeSwapReturnDelta; bool afterSwapReturnDelta; bool afterAddLiquidityReturnDelta; bool afterRemoveLiquidityReturnDelta; }\n(b) directly after the receive() function of V4Market, add:\nfunction getHookPermissions() public pure returns (HookPermissions memory p) { p.afterInitialize = true; p.beforeSwap = true; p.afterSwap = true; p.beforeSwapReturnDelta = true; p.afterSwapReturnDelta = true; }\nIt matches HOOK_FLAGS 0x10cc exactly (same ABI as v4-core Hooks.Permissions). With it the V4Market creation code hash must equal 0xedb2d58fb4632f2ef5a81b58ea05dcff0f5510e5448c6766539f89379109af10 (runtime 21,982 bytes).\n(c) add a new file src/LaunchToken.sol: the platform launch token the univ4_hook manifest names in token.contract, written as the IMD univ4_hook template's standard launch token: name BLACKOUT, symbol BLACKOUT, 18 decimals, fixed supply 1,000,000,000e18 minted once at construction as the template requires, plain ERC-20 transfers, no owner, no mint after construction, no burn hooks, no fees, no pause, no blacklist. The repo has no other production token; test/mocks/MockToken.sol is a test fixture and must not be used.\nEvery other existing contract stays byte-identical. Tests may be added.\n\nLaunch: univ4_hook on Robinhood Chain 4663, pairWith eth, token.contract LaunchToken (BLACKOUT/BLACKOUT), economics poolBps 7000, remainder (20%) to the paying wallet (form default); the project wallet will transfer 200,000,000 BLACKOUT to the EndowmentEscrow 0x11947494c0ba91508eb7409648193818c36521fb (L1 launch 1628) after launch. Pool fee 12500, tick spacing 60 (platform policy). Omit owner.\nHook constructor words, in order:\n[\"$poolManager\",\"$token\",\"12500\",\"60\",\"$factory\",\"0x5cb0686a4475d1f8a6c6e5240579080a4a05b609\",\"0x11ed7438974e96ecc962201e9c46422c7bf239d725876863fa25a56c734b20d3\"]\n(word 5 = deployed SwarmDesk from L1 launch 1628, word 6 = gameConfigHash).\n\nWhat the hook does (already implemented, do not change): stepped launch tax on buys for the first 30 minutes (90% / 50% / 25% / 1%), 1% rewards share on every swap, sell surcharge, all held until SwarmDesk binds and bindFeeRouter routes it to rewards. Exact-input swaps only. Buys must use the extreme sqrtPriceLimitX96 4295128740 (PriceLimitedBuy otherwise) and afterSwap reverts PartialFill unless the pool consumed exactly the taxed input. Every callback refuses callers other than the PoolManager (Unauthorized).\n\nAccepted, not blocking:\n- Exact-input only; PriceLimitedBuy and PartialFill reverts are intended.\n- a3749636 low: beforeSwap takes the buy tax from the PoolManager float before settlement.\n- 420b1475 low: launch tax and 1% share held by the unbound hook are unrecoverable if the Desk never binds; the binder 0x6d51cBE774aeAe4dd40bCA2560E9bc2695A0d007 binds right after L3.\n- Info: bindFeeRouter is post-deployment wiring; launch-window sells recorded gross; first swap after an idle gap costs more gas; pool fee must equal the LaunchFees value (12500).\n\nReturn the token, hook, pool key and launch number.\nProject: https://playblackout.xyz\n\nToken name: BLACKOUT\nToken symbol: BLACKOUT","parentJobId":null,"planHash":"8e58e89bb7d58e21ca9d15c66556307a6accc10f2cbf84b8859f0d082db4bc32","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"84793148-4816-47e0-a05e-660220def3a9","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1710-blackout"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51143","feedbackHash":"5e84e1703d42515782817dfd78ccee9999b2af3ede9e0d2a629e3b47794e4a31","nodeKey":"audit_economics","submissionHash":"21d8d3378e33fe09545fb2932a8fd145ad7164dfc4f44e71422e136329d8d074","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51101","feedbackHash":"514b2895c2a076b3a6daf2fc19e15ca6479055e4ebdbdabf4a90d781632b9e26","nodeKey":"audit_flow","submissionHash":"65b78aad46b36f24c7217df7ffb4e626084d14318f319e96b7fa0d566960597d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51083","feedbackHash":"e835a86cb85340a622d75dd5ab8ffd0856172202ddcc1a1e32da3019c7b9a172","nodeKey":"audit_judge","submissionHash":"72fee652a6b59e865bae068d3bab09be56a909e3087adb2ca0c3a9a04b08e5a1","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51291","feedbackHash":"b2048f7a9a269676245975d2abecec1d2a3c8d8b97aa99f839b5d11fd6da4360","nodeKey":"audit_math","submissionHash":"ec6b47555cffcaf0e711bce859dc92fe90e40b6921674a70b4d39b7d0ae1866b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51473","feedbackHash":"872333b7d76d4209c48e2363bb805c5babbf25b601faf118d78231eda3587f91","nodeKey":"audit_permissions","submissionHash":"7bb0694a617cb49eb1383691a7c2bcb554e1d3bbe2ce3731959516d8fddf6247","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51620","feedbackHash":"56f0e758ad145eef3428c4b26e5c7ecab7e26ac2503b1a1ae98e11be8ca94947","nodeKey":"build_contract_project","submissionHash":"f611e9665bdc0edcb344399b7507a26881d12049c50978203253c24f362ef1d9","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52148","feedbackHash":"cd02c943dd73e258985fa50bc3b8781c458b148fdc8575b47c0d863dc3866158","nodeKey":"manifest","submissionHash":"a3c57fd754980ff8bd3910ee57d8efc085037bfc13c692e84fe2515077b094d7","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51756","feedbackHash":"6f89d49f63f781f819566df03ffc0ffd12a1606510837ab0abb6e343381152c1","nodeKey":"write_foundry_tests","submissionHash":"b2594604372413b3d2e7f09098aa585bbd84cb19f21f0182ab459df139d9f5a9","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"5a95bd7db2241b5a1b2850e3d077b0675d5f3f0bb9dc7cfc1e5a8e06970dfa19","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a4c81f495eb81dd0","findings":[{"citation":"resolved","description":"The hook charges the 1% rewards share plus the progressive surcharge (up to 15%) only inside afterSwap on token->ETH swaps (_chargeSell, lines 486-494). Liquidity changes are not hooked (no before/afterAddLiquidity or before/afterRemoveLiquidity), so any token holder can convert tokens to ETH without paying the hook anything: mint a token-only position just below the current tick (for currency0 = ETH, currency1 = BLACKOUT, a range entirely below spot holds only BLACKOUT), wait for ordinary buys to walk the price through that range, then remove the position and take the ETH. The holder also earns the 1.25% LP fee on that flow. Buyers still pay their own charge, but the sell-side stream (rewards 1%, team/heartbeat/pot shares of the surcharge, and the anti-dump pressure the surcharge is meant to exert) is lost on every unit exited this way. The rational exit for any large holder (the paying wallet's 200M, the Endowment, early buyers) during a sell-pressure period is therefore an LP range, not a swap. This is a guarantee gap rather than a theft: the funds that go missing are the hook's own fee streams. The economic guides' invariant 'sell charge on every token->ETH conversion' does not hold. A fix that keeps the launch factory's zero-liquidity-change fee collect working would gate add-liquidity to the factory (beforeAddLiquidity: sender == launcher, with before/afterRemoveLiquidity returning no delta and never reverting), which is a hook address/permission change (new flags) and so a scope decision for the author.","line":252,"path":"src/V4Market.sol","reproduction":"Real v4-core PoolManager, LaunchToken, production V4Market mined at 0x10cc flags, launcher = test contract. initialize at sqrtPriceX96 = 2^96, launcher adds 1000e18 full-range liquidity, warp to initializedAt + 31 minutes. (A) Holder sells 10e18 BLACKOUT via PoolManager.swap(zeroForOne=false, amountSpecified=-10e18, limit=MAX_SQRT_PRICE-1): swapper's amount0 = +8.796682757767050378 ETH, hook heldBase+heldSellTax rises by 0.981755167718777075 ETH (about 10.0% of the 9.78 ETH gross). (B) Same holder instead mints liquidityDelta = 3400e18 in ticks [-120,-60] (deposits 10.153701535636197649 BLACKOUT, 0 ETH); a third party buys with 60 ETH at BUY_PRICE_LIMIT (that buyer pays 0.6 ETH to the hook); the holder removes the position: receives 10.375182481680217247 ETH, 0 tokens back, and heldBase+heldSellTax is unchanged (0 charge). Expected per the brief: every token->ETH conversion carries the 1% share plus surcharge; actual: 0 on the LP path and roughly 1.18 ETH more for the holder than the swap path on the same 10 tokens.","severity":"low","snippet":"    function getHookPermissions() public pure returns (HookPermissions memory p) {\n        p.afterInitialize = true;\n        p.beforeSwap = true;\n        p.afterSwap = true;\n        p.beforeSwapReturnDelta = true;\n        p.afterSwapReturnDelta = true;\n    }","title":"Sell surcharge and 1% rewards share are bypassed by exiting through a liquidity position (no liquidity callbacks)"},{"citation":"resolved","description":"storedFeeWad is a ratchet: every sell sets it to max(target, decayed) and it decays only 100 bps per 10 minutes, so a single sell that reaches the 1500 bps cap keeps every later seller near the cap for about 140 minutes even after buys have restored the price and the hour/day imbalance. The imbalance denominators (s+b+0.5 ether, s+b+2 ether in imbalances(), lines 363 and 373) are absolute ETH amounts, so on a deep pool a sell that is a negligible fraction of liquidity still produces a near-maximal imbalance term. Designed as a progressive anti-dump surcharge and consistent with the docs, so recorded as information for the author: the griefing cost is the attacker's own surcharge on the triggering sell, and the victims are honest small sellers in the following two hours. Not a defect to block on.","line":428,"path":"src/V4Market.sol","reproduction":"Same harness as finding 1 (1000e18 full-range liquidity, warp +31 min). Buy 1 ETH, then sell 300e18 BLACKOUT: storedFeeWad = 1487e18. Warp +10 minutes, buy 2 ETH (price recovers above its pre-dump level), then an unrelated seller sells 1e18 BLACKOUT: gross 0.591125151345982002 ETH, hook takes 1471 bps of it. Expected by a seller who did not move the price: about 100 bps plus the current imbalance; actual: 1471 bps.","severity":"info","snippet":"        uint256 fall = feeTimestamp == 0 ? 0 : (block.timestamp - feeTimestamp) * 100 ether / 10 minutes;\n        uint256 decayed = storedFeeWad > fall ? storedFeeWad - fall : PROJECT_BPS * 1 ether;\n        storedFeeWad = Math.max(target, decayed);","title":"Surcharge ratchet makes unrelated sellers pay near the 15% cap for up to 140 minutes after one dump, independent of pool depth"}],"hash":"21d8d3378e33fe09545fb2932a8fd145ad7164dfc4f44e71422e136329d8d074","nodeId":"752cfd00-1807-415e-929e-f41f94cbed59","outcome":"completed","summary":"The findings file is in place at the repository root, valid JSON, excluded from git by the harness's own exclude rule. The scratch directory is removed and the tree has no stray files. Nothing further is needed from the environment, so here is the review.\n\n## Economics review of V4Market (BLACKOUT launch hook)\n\n**Outcome.** The hook's swap economics hold. I found one low-severity guarantee gap with a concrete reproduction and one informational behaviour, both recorded in `.imd-findings.json` with a coverage row for every one of the 160 listed entry points.\n\n**What I traced and confirmed (Economic Security, Invariant, Flow Gap guides):**\n- Buy path: the launch tax or 1% share equals input times bps over ten thousand, is taken from the manager float and repaid by the returned specified delta, so the swapper pays exactly the input and the hook's delta nets to zero. The afterSwap exact-fill check matches beforeSwap's arithmetic and v4's swap delta construction.\n- Sell path: the charge is computed on actual ETH output, the returned unspecified delta equals the amount taken, and the fee cannot fall below 1% or exceed 15% under any Params value within bounds.\n- Held-ETH conservation: the three held counters always equal the hook's balance. Flush zeroes and pays all three, and the router's routing cannot underflow.\n- The 30-minute harmonic TWAP ring always has the minute-30 observation or extrapolates correctly, so neither sells nor system buys can be bricked by a missing slot.\n- View and execution math agree: quote, quoteSell and maxSellBatch match the buy and sell callbacks. Router slippage bounds hold system buys and sells within 1.5% of TWAP.\n\n**Finding 1, low.** Liquidity changes are not hooked, so a holder exits tokens to ETH with no sell charge by minting a token-only range just below spot and removing it after buyers walk through it. Measured on a real PoolManager: a direct sale of 10 BLACKOUT netted 8.80 ETH with 0.98 ETH taken by the hook, while the same tokens exited through a position returned 10.38 ETH and paid the hook nothing. Fixing it would require new hook flags, which is a scope decision for the author.\n\n**Finding 2, info.** The surcharge ratchet decays only 100 bps per 10 minutes. After one capped dump, an unrelated small seller 10 minutes later still paid 1471 bps even though price and imbalance had recovered. This matches the documented progressive design, so it is a note, not a block.\n\n**Coverage.** All V4Market, StandardMarket, LaunchToken, FeeRouter, MarketFactory, StandardAdapter and Params entry points are marked holds or finding with reasons. The 121 game-module and SwarmDesk entry points are honestly marked unreached as they are outside the assigned economics area and were not traced within budget.","treeHash":null,"usage":{"cachedInputTokens":2595072,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":78571,"runtime":"claude","turns":39,"wallClockMs":1399869}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"b1d937213bbfd9cf","findings":[{"citation":"resolved","description":"afterSwap calls spot() (line 467) before any other check. When an exact-input sell (oneForZero) asks for more ETH than the active liquidity holds, v4 drains the range and then walks the price through empty ticks to the swapper's sqrtPriceLimitX96; with the limit every standard router sends (MAX_SQRT_PRICE-1 = 1461446703485210103287273052203988822378723970341) the post-swap sqrtPrice is ~1.46e48, so spot() computes ~3.4e56 > 1e40 and reverts InvalidValue. v4 wraps it as WrappedError(hook, afterSwap.selector, InvalidValue(), HookCallFailed()). Plain v4 (and the buy side's documented PartialFill contract) would partially fill; here the whole transaction fails and the seller gets no diagnostic that relates to size. The same sell with a limit just above the range (e.g. tick 120) fills partially and succeeds, so the pool is not bricked: no swap can leave the price out of bounds because afterSwap reverts it. Impact is a liveness/UX gap for large sells through the Universal Router, not loss of funds. Mirrors the accepted PartialFill decision on buys, but for sells the revert comes from the price bound rather than an explicit error.","line":272,"path":"src/V4Market.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\nimport {V4Market} from \"src/V4Market.sol\";\nimport {IV4PoolManager, PoolKey, SwapParams} from \"src/interfaces/IV4.sol\";\n\nstruct LiquidityParams {\n    int24 tickLower;\n    int24 tickUpper;\n    int256 liquidityDelta;\n    bytes32 salt;\n}\n\ninterface RealManager is IV4PoolManager {\n    function initialize(PoolKey memory, uint160) external returns (int24);\n    function modifyLiquidity(PoolKey memory, LiquidityParams memory, bytes calldata) external returns (int256, int256);\n}\n\n/// @dev A sell whose size exceeds the ETH the pool holds, sent with the extreme price limit every\n/// standard router uses, should partially fill as v4 does. On this tree it reverts in afterSwap:\n/// spot() sees sqrtPrice at MAX_SQRT_PRICE-1 (~3.4e56 > 1e40) and raises InvalidValue, which v4\n/// wraps in WrappedError(hook, afterSwap.selector, InvalidValue(), HookCallFailed()).\ncontract SellExceedsEthTest is Test {\n    RealManager manager;\n    LaunchToken token;\n    V4Market hook;\n    uint160 constant MAX_LIMIT = 1461446703485210103287273052203988822378723970341;\n\n    function setUp() public {\n        vm.deal(address(this), 1000 ether);\n        manager = RealManager(address(new PoolManager(address(this))));\n        token = new LaunchToken();\n        bytes memory code = abi.encodePacked(\n            type(V4Market).creationCode,\n            abi.encode(address(manager), address(token), uint24(12500), int24(60), address(this), address(0xDE5C), bytes32(uint256(1)))\n        );\n        bytes32 hash = keccak256(code);\n        bytes32 salt;\n        for (uint256 i;; ++i) {\n            salt = bytes32(i);\n            if (uint160(vm.computeCreate2Address(salt, hash, address(this))) & 0x3fff == 0x10cc) break;\n        }\n        hook = new V4Market{salt: salt}(address(manager), address(token), 12500, 60, address(this), address(0xDE5C), bytes32(uint256(1)));\n        manager.initialize(hook.key(), uint160(1 << 96));\n        // Bounded range [-60, 60] around tick 0 so the ETH side can be exhausted by a sell.\n        manager.unlock(abi.encode(uint8(0), uint256(1000 ether), int24(-60), int24(60), uint160(0)));\n        vm.warp(block.timestamp + 60 minutes);\n    }\n\n    receive() external payable {}\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n        (uint8 action, uint256 amount, int24 lo, int24 hi, uint160 limit) =\n            abi.decode(data, (uint8, uint256, int24, int24, uint160));\n        int256 delta;\n        if (action == 0) {\n            (delta,) = manager.modifyLiquidity(hook.key(), LiquidityParams(lo, hi, int256(amount), bytes32(0)), \"\");\n        } else {\n            delta = manager.swap(hook.key(), SwapParams(false, -int256(amount), limit), \"\");\n        }\n        int128 a = int128(delta >> 128);\n        int128 b = int128(delta);\n        if (a < 0) manager.settle{value: uint256(-int256(a))}();\n        else if (a > 0) manager.take(address(0), address(this), uint256(uint128(a)));\n        if (b < 0) {\n            manager.sync(address(token));\n            token.transfer(address(manager), uint256(-int256(b)));\n            manager.settle();\n        } else if (b > 0) {\n            manager.take(address(token), address(this), uint256(uint128(b)));\n        }\n        return abi.encode(delta);\n    }\n\n    /// @dev Fails on this tree: the unlock reverts with WrappedError(hook, afterSwap, InvalidValue(), ...).\n    function test_sellLargerThanPoolEthPartiallyFillsWithExtremeLimit() public {\n        uint256 before = address(this).balance;\n        assertGt(address(manager).balance, 0, \"pool holds ETH to pay out\");\n        // Sell far more tokens than the ~3 ETH in range can absorb, with the router-default limit.\n        manager.unlock(abi.encode(uint8(1), uint256(100 ether), int24(0), int24(0), MAX_LIMIT));\n        assertGt(address(this).balance, before, \"partial fill should pay the pool's ETH out\");\n    }\n\n    /// @dev Passes on this tree: the same sell with a limit just above the range fills partially.\n    function test_sameSellWithTightLimitPartiallyFills() public {\n        uint256 before = address(this).balance;\n        uint160 limit = uint160(uint256(79228162514264337593543950336) * 1006 / 1000); // ~tick 120\n        manager.unlock(abi.encode(uint8(1), uint256(100 ether), int24(0), int24(0), limit));\n        assertGt(address(this).balance, before, \"partial fill paid ETH out\");\n    }\n}","reproduction":"Real PoolManager; V4Market(token, fee 12500, spacing 60) initialized at sqrtPrice 2^96 from the launcher; liquidity 1000e18 added in [-60, 60] (pool holds ~3 ETH and ~3 tokens). Warp 60 minutes. Call manager.swap(key, SwapParams(zeroForOne=false, amountSpecified=-100e18, sqrtPriceLimitX96=1461446703485210103287273052203988822378723970341)). Expected (v4 default, and the explicit PartialFill contract the buy side documents): the pool pays out its ETH and the swap partially fills. Actual: revert WrappedError(hook, 0xb47b2fb1 afterSwap, 0xaa7feadc InvalidValue(), 0xa9e35b2f HookCallFailed) raised at V4Market.afterSwap -> spot() because the post-swap sqrtPrice is MAX_SQRT_PRICE-1; manager balance unchanged. The same call with sqrtPriceLimitX96 = 2^96*1006/1000 (about tick 120) succeeds and pays ETH out. test/scratch/SellExceedsEth.t.sol: test_sellLargerThanPoolEthPartiallyFillsWithExtremeLimit fails on this tree with that WrappedError; test_sameSellWithTightLimitPartiallyFills passes.","severity":"low","snippet":"        if (price == 0 || price > 1e40) revert InvalidValue();","title":"A sell larger than the pool's ETH reverts in afterSwap (spot() upper bound) instead of partially filling"}],"hash":"65b78aad46b36f24c7217df7ffb4e626084d14318f319e96b7fa0d566960597d","nodeId":"effa15ad-d7a7-49f1-97d1-4ab743f28124","outcome":"completed","summary":"Review complete. The findings file is written and valid, and the proof test fails on the current tree for the stated reason.\n\n**Outcome.** The assigned area (Execution Trace, Periphery, First Principles) traces clean on the hook's core paths, with one low-severity finding. The creation-code hash and runtime size match the assignment exactly (0xedb2d58f…, 21,982 bytes), the `HookPermissions` additions agree with flags 0x10cc, and `LaunchToken` is a plain fixed-supply OZ ERC-20 with no admin surface.\n\n**Finding 1 (low), `src/V4Market.sol:272`.** A sell larger than the pool's ETH, sent with the extreme price limit that standard routers use, reverts in `afterSwap` instead of partially filling. After the range is drained, v4 walks the price to the limit, so `spot()` computes a value above its 1e40 bound and raises `InvalidValue`, which v4 wraps as `WrappedError`. The same sell with a limit just above the range fills partially. No funds are at risk and nothing is bricked, since the revert also prevents any swap from leaving the price out of bounds. The proof under `test/scratch/SellExceedsEth.t.sol` fails here and would pass once the hook handles that terminal state.\n\n**What I verified in depth and found to hold:**\n- Buy accounting: the specified-delta fee equals the amount taken, the hook's delta nets to zero, and the PartialFill check equals `ethIn - fee` on both sides.\n- Sell accounting: the charge is bounded at 15% of output and returned as the unspecified delta after the take.\n- The TWAP ring always holds the 30-minute window once the 31-minute gate opens, so `twap()` cannot revert `NotConfigured` for `buy`, `sell`, `quote` or the sell surcharge.\n- The hook's ETH balance always equals the three held totals, so `flushFees` leaks nothing.\n- Bind proofs: the embedded registry creation code uses identical launch and repo toolchain pins.\n- System buy and sell callbacks settle exactly the swap delta, with callbacks correctly suppressed on self-swaps per the vendored v4-core.\n\n**Coverage record.** All 160 entry points have a row. The hook, StandardMarket, StandardAdapter, LaunchToken, MarketFactory, GameRegistry.register, SwarmDesk.bind and the FeeRouter paths touching the hook are `holds` or `finding`. The 121 game-module entry points outside the hook control flow are marked `unreached`, honestly, since my budget went to the assigned area.\n\n**Not re-reported.** The accepted float-before-settlement take and unbound-hook retention items were confirmed in the trace but left out as duplicates.","treeHash":null,"usage":{"cachedInputTokens":1899423,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":61455,"runtime":"claude","turns":41,"wallClockMs":851468}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc7103e773ea194a","findings":[{"citation":"resolved","description":"afterSwap (line 467) calls spot() before any other check. An exact-input sell (oneForZero) sent with the limit every standard router uses (MAX_SQRT_PRICE-1 = 1461446703485210103287273052203988822378723970341) that asks for more ETH than the active liquidity holds drains the range and walks the price to the limit; spot() then computes ~3.4e56 > 1e40 and reverts InvalidValue, which v4 wraps as WrappedError(hook, afterSwap.selector, InvalidValue(), HookCallFailed()). Plain v4 would partially fill; here the whole transaction fails with a reason unrelated to size. The same sell with a limit just above the range fills partially and succeeds, so the pool is not bricked (no swap can leave the price out of bounds because afterSwap reverts it; liquidity changes do not move the price). On buys the symmetric case (price walks to MIN, spot() == 0) also reverts InvalidValue rather than the documented PartialFill, which is the accepted exact-input decision. Impact: liveness/UX for large sells through a router, no loss of funds. Reproduced: the specialist's proof fails on this tree with exactly that WrappedError (test_sellLargerThanPoolEthPartiallyFillsWithExtremeLimit) and the tight-limit control passes.","line":272,"path":"src/V4Market.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\nimport {V4Market} from \"src/V4Market.sol\";\nimport {IV4PoolManager, PoolKey, SwapParams} from \"src/interfaces/IV4.sol\";\n\nstruct LiquidityParams {\n    int24 tickLower;\n    int24 tickUpper;\n    int256 liquidityDelta;\n    bytes32 salt;\n}\n\ninterface RealManager is IV4PoolManager {\n    function initialize(PoolKey memory, uint160) external returns (int24);\n    function modifyLiquidity(PoolKey memory, LiquidityParams memory, bytes calldata) external returns (int256, int256);\n}\n\n/// @dev A sell whose size exceeds the ETH the pool holds, sent with the extreme price limit every\n/// standard router uses, should partially fill as v4 does. On this tree it reverts in afterSwap:\n/// spot() sees sqrtPrice at MAX_SQRT_PRICE-1 (~3.4e56 > 1e40) and raises InvalidValue, which v4\n/// wraps in WrappedError(hook, afterSwap.selector, InvalidValue(), HookCallFailed()).\ncontract SellExceedsEthTest is Test {\n    RealManager manager;\n    LaunchToken token;\n    V4Market hook;\n    uint160 constant MAX_LIMIT = 1461446703485210103287273052203988822378723970341;\n\n    function setUp() public {\n        vm.deal(address(this), 1000 ether);\n        manager = RealManager(address(new PoolManager(address(this))));\n        token = new LaunchToken();\n        bytes memory code = abi.encodePacked(\n            type(V4Market).creationCode,\n            abi.encode(address(manager), address(token), uint24(12500), int24(60), address(this), address(0xDE5C), bytes32(uint256(1)))\n        );\n        bytes32 hash = keccak256(code);\n        bytes32 salt;\n        for (uint256 i;; ++i) {\n            salt = bytes32(i);\n            if (uint160(vm.computeCreate2Address(salt, hash, address(this))) & 0x3fff == 0x10cc) break;\n        }\n        hook = new V4Market{salt: salt}(address(manager), address(token), 12500, 60, address(this), address(0xDE5C), bytes32(uint256(1)));\n        manager.initialize(hook.key(), uint160(1 << 96));\n        // Bounded range [-60, 60] around tick 0 so the ETH side can be exhausted by a sell.\n        manager.unlock(abi.encode(uint8(0), uint256(1000 ether), int24(-60), int24(60), uint160(0)));\n        vm.warp(block.timestamp + 60 minutes);\n    }\n\n    receive() external payable {}\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n        (uint8 action, uint256 amount, int24 lo, int24 hi, uint160 limit) =\n            abi.decode(data, (uint8, uint256, int24, int24, uint160));\n        int256 delta;\n        if (action == 0) {\n            (delta,) = manager.modifyLiquidity(hook.key(), LiquidityParams(lo, hi, int256(amount), bytes32(0)), \"\");\n        } else {\n            delta = manager.swap(hook.key(), SwapParams(false, -int256(amount), limit), \"\");\n        }\n        int128 a = int128(delta >> 128);\n        int128 b = int128(delta);\n        if (a < 0) manager.settle{value: uint256(-int256(a))}();\n        else if (a > 0) manager.take(address(0), address(this), uint256(uint128(a)));\n        if (b < 0) {\n            manager.sync(address(token));\n            token.transfer(address(manager), uint256(-int256(b)));\n            manager.settle();\n        } else if (b > 0) {\n            manager.take(address(token), address(this), uint256(uint128(b)));\n        }\n        return abi.encode(delta);\n    }\n\n    /// @dev Fails on this tree: the unlock reverts with WrappedError(hook, afterSwap, InvalidValue(), ...).\n    function test_sellLargerThanPoolEthPartiallyFillsWithExtremeLimit() public {\n        uint256 before = address(this).balance;\n        assertGt(address(manager).balance, 0, \"pool holds ETH to pay out\");\n        // Sell far more tokens than the ~3 ETH in range can absorb, with the router-default limit.\n        manager.unlock(abi.encode(uint8(1), uint256(100 ether), int24(0), int24(0), MAX_LIMIT));\n        assertGt(address(this).balance, before, \"partial fill should pay the pool's ETH out\");\n    }\n\n    /// @dev Passes on this tree: the same sell with a limit just above the range fills partially.\n    function test_sameSellWithTightLimitPartiallyFills() public {\n        uint256 before = address(this).balance;\n        uint160 limit = uint160(uint256(79228162514264337593543950336) * 1006 / 1000); // ~tick 120\n        manager.unlock(abi.encode(uint8(1), uint256(100 ether), int24(0), int24(0), limit));\n        assertGt(address(this).balance, before, \"partial fill paid ETH out\");\n    }\n}","reproduction":"Real v4-core PoolManager; LaunchToken; V4Market(manager, token, 12500, 60, launcher=test, desk=0xDE5C, hash=1) mined at 0x10cc; initialize at sqrtPriceX96 = 2^96 from the launcher; add liquidity 1000e18 in [-60, 60] (about 3 ETH and 3 BLACKOUT in range); warp +60 minutes. Call manager.swap(key, SwapParams(zeroForOne=false, amountSpecified=-100e18, sqrtPriceLimitX96=1461446703485210103287273052203988822378723970341)) inside unlock. Expected (v4 default): partial fill, the pool's ~3 ETH paid out. Actual: revert WrappedError(0xEc29...10cC, 0xb47b2fb1, 0xaa7feadc, 0xa9e35b2f), i.e. V4Market.afterSwap -> spot() -> InvalidValue(); no balance changes. Control: the same call with sqrtPriceLimitX96 = 2^96 * 1006 / 1000 (about tick 120) succeeds and pays ETH out. Ran: forge test --match-path test/scratch/Proof_0aa77dc0a693.t.sol -> 1 failed (the extreme-limit test, WrappedError above), 1 passed.","severity":"low","snippet":"        if (price == 0 || price > 1e40) revert InvalidValue();","title":"Sell larger than the pool's ETH reverts in afterSwap (spot() upper bound) instead of partially filling (merged audit_flow 0aa77dc0)"},{"citation":"resolved","description":"The hook charges the 1% share plus the progressive surcharge (up to TOTAL_CAP_BPS = 1500) only in afterSwap on token->ETH swaps (_chargeSell, lines 487-494). HOOK_FLAGS 0x10cc enables no add/remove-liquidity callback, so any holder can convert BLACKOUT to ETH without the hook seeing it: mint a position entirely below the current tick (ETH is currency0, so such a range holds only BLACKOUT), wait for ordinary buys to walk the price through it, then remove the position and take ETH. The exiting holder pays nothing to the hook and additionally earns the 1.25% LP fee on the flow; buyers still pay their own charge. The sell-side stream (rewards 1%, team/heartbeat/pot shares of the surcharge, and the anti-dump pressure) is lost on every unit exited this way, which is the rational exit for any large holder during a sell-pressure window. Guarantee gap in the hook's own fee streams rather than theft. Any fix (gating beforeAddLiquidity to the factory, with before/afterRemoveLiquidity letting the factory's zero-liquidity fee collect through and returning no delta) changes HOOK_FLAGS and the mined address, so it is a scope decision for the author; the brief's accepted list does not cover it.","line":252,"path":"src/V4Market.sol","reproduction":"Real v4-core PoolManager, LaunchToken, V4Market mined at 0x10cc, launcher = test contract; initialize at 2^96; launcher adds 1000e18 full-range liquidity; warp to initializedAt + 31 minutes. (A) Swap path: holder sells 10e18 BLACKOUT via manager.swap(zeroForOne=false, amountSpecified=-10e18, limit=MAX_SQRT_PRICE-1): holder receives 8796682757767050378 wei ETH and hook heldBase+heldSellTax rises by 981755167718777075 wei (about 10.0% of the 9.78 ETH gross). (B) LP path from the same state: holder calls modifyLiquidity(tickLower=-120, tickUpper=-60, liquidityDelta=+3400e18): deposits 10153701535636197649 BLACKOUT and 0 ETH; a third party buys with 60 ETH at BUY_PRICE_LIMIT (that buyer pays its own 0.6 ETH share); holder removes the position (liquidityDelta=-3400e18): receives 10375182481680217247 wei ETH, 0 BLACKOUT back, and heldBase+heldSellTax is unchanged (charge on the exit = 0). Expected per the brief: every token->ETH conversion carries the 1% share plus surcharge; actual: 0 on the LP path and about 1.58 ETH more for the holder than the swap path on the same 10 tokens. Ran: test/scratch/JudgeRepro.t.sol test_swapSellPaysHook and test_lpExitBypassesSellCharge (logs above).","severity":"low","snippet":"    function getHookPermissions() public pure returns (HookPermissions memory p) {\n        p.afterInitialize = true;\n        p.beforeSwap = true;\n        p.afterSwap = true;\n        p.beforeSwapReturnDelta = true;\n        p.afterSwapReturnDelta = true;\n    }","title":"Sell surcharge and 1% rewards share are bypassed by exiting through a token-only liquidity position (no liquidity callbacks) (merged audit_economics f27b8cb9)"},{"citation":"resolved","description":"buy() gates on LAUNCH_TAX_DECAY (30 minutes, line 507) and then unconditionally calls twap() (line 508), but twap() (line 317) requires block.timestamp >= initializedAt + 31 minutes, because the first observation minute after initialization is only readable from minute initializedAt/60 + 1. quote() (line 327), quoteSell() (line 515) and maxSellBatch() (line 526) call twap() the same way, so sell() (lines 533-534) is gated identically. For the 60 seconds after the launch tax reaches its final 1% step, every system path through the hook (FeeRouter.executeBuys, executePotBuys, zapBuy, executeSells) reverts NotConfigured although currentBuyTaxBps() == 100 and launchTaxTimeLeft() == 0 already report the window as over. No funds move and direct pool swaps are unaffected: a cadence gap with a misleading revert reason. Minimal fix: gate buy()/sell() on initializedAt + 31 minutes, or make the twap warm-up and LAUNCH_TAX_DECAY the same constant.","line":507,"path":"src/V4Market.sol","reproduction":"Pool initialized at T0 (afterInitialize from the launcher). Warp to T0 + 30 minutes: hook.currentBuyTaxBps() == 100 and hook.launchTaxTimeLeft() == 0, yet hook.twap() and hook.quote(1 ether) revert NotConfigured; a bound FeeRouter calling hook.buy{value: 0.1 ether}(minOut, recipient) passes the TooEarly check and reverts NotConfigured inside twap(). Warp to T0 + 31 minutes - 1 second: still NotConfigured. Warp to T0 + 31 minutes: twap() returns a value and buy() proceeds. Ran: test/scratch/JudgeRepro.t.sol test_deadMinuteAfterLaunchTax (expectRevert(NotConfigured) at +30m and +30m59s, twap() > 0 at +31m) on the real PoolManager.","severity":"low","snippet":"        if (initializedAt == 0 || sinceLaunch() < LAUNCH_TAX_DECAY) revert TooEarly();\n        twap();","title":"buy(), sell(), quote() and quoteSell() revert NotConfigured for the first minute after the launch-tax window ends (30- vs 31-minute guards) (merged audit_math 041e0da7)"},{"citation":"resolved","description":"storedFeeWad is a ratchet: every sell sets it to max(target, decayed) and decayed falls only 100 bps per 10 minutes (line 428: fall = elapsed * 100 ether / 10 minutes), so one sell that reaches TOTAL_CAP_BPS keeps every later seller near the cap for (1500-100)/100 * 10 = 140 minutes even after buys restore the price and the hour/day imbalance. The imbalance denominators (s+b+0.5 ether at line 363, s+b+2 ether at line 373) are absolute ETH amounts, so on a deep pool a sell that is a negligible fraction of liquidity still produces a near-maximal imbalance term. This is the documented progressive anti-dump design (docs and launch notes), so it is recorded as information for the author, not a defect: the griefing cost is the attacker's own surcharge on the triggering sell, and the victims are honest small sellers in the following two hours.","line":430,"path":"src/V4Market.sol","reproduction":"Same harness (1000e18 full-range liquidity, warp +31 min). Buy 1 ETH, then sell 300e18 BLACKOUT: hour imbalance near 10000 bps so target = min(1500, 100 + 500 + 400 + dev) bps, storedFeeWad about 1487e18. Warp +10 minutes, buy 2 ETH (price above its pre-dump level), then an unrelated seller sells 1e18 BLACKOUT: decayed = 1487e18 - 100e18 = 1387e18, so fee = ceil(1387) = 1387..1471 bps depending on the new imbalance (specialist measured 1471 bps on 0.591125151345982002 ETH gross). Expected by a seller who did not move the price: about 100 bps plus the current imbalance; actual: near the cap. Traced from lines 418-433.","severity":"info","snippet":"        storedFeeWad = Math.max(target, decayed);","title":"Surcharge ratchet keeps unrelated sellers near the 15% cap for about 140 minutes after one capped sell, independent of pool depth (merged audit_economics 38b7b412)"},{"citation":"resolved","description":"The hook has no owner, but two external actors hold bounded powers after launch. (1) Params.swarmWallet (the SwarmDesk 0x5cb0686a4475d1f8a6c6e5240579080a4a05b609, constructor word 5) can move the three surcharge coefficients read at keys 24/25/26 through Params.set (src/Params.sol:165-180): within fixed bounds, at most 10% per key per day, and the total sell charge is clipped to TOTAL_CAP_BPS = 1500 regardless (line 427). (2) The Desk's binder 0x6d51cBE774aeAe4dd40bCA2560E9bc2695A0d007 (also FeeRouter.team) chooses which proven registry the Desk binds to, which fixes the only FeeRouter bindFeeRouter can ever accept (lines 164-192: factory CREATE2 proof, config-hash proof, Desk canonical check, module(6) == router); until it binds, launch tax and the 1% share accumulate in the hook (accepted 420b1475). Neither power can redirect funds to an unproven contract, change the buy tax, or block the factory's zero-liquidity fee collect (no liquidity callbacks). Recorded as trust assumptions, not a defect.","line":236,"path":"src/V4Market.sol","reproduction":"State: hook bound to FeeRouter/Params. Params.set(24 (SellHourBps), 550, \"letter\") from the Desk after one day succeeds (bounds 200-600, delta 50 <= 500/10); the next sell with hour imbalance 10000 bps targets 100 + 550 + ... bps and is still clipped to 1500 by Math.min(TOTAL_CAP_BPS, target) at line 427. Params.set from any other sender reverts Unauthorized; a 20% jump or a second change within a day reverts InvalidValue/TooEarly. Expected and actual agree; no loss path.","severity":"info","snippet":"        return address(params) == address(0) ? default_ : params.get(key_);","title":"Trust map: the sell-surcharge coefficients are set by the Desk and the fee destination is fixed by whoever the Desk binds (bounded powers, no owner) (merged audit_permissions 527d797f)"}],"hash":"72fee652a6b59e865bae068d3bab09be56a909e3087adb2ca0c3a9a04b08e5a1","nodeId":"d04a7ebd-d5d7-46d5-8ef5-56ac877c5670","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root. No tracked file was changed; only the findings file and my scratch tests under `test/scratch/` exist.\n\n**Verdict on the launch.** The hook deploys and launches as specified. The V4Market creation code hash matches the required value exactly, the runtime is 21,982 bytes, the manifest's constructor words are in declaration order with lowercase addresses, the permissions list matches getHookPermissions and address flags 0x10cc, and the launch token is a plain OpenZeppelin 5.0.2 ERC-20 minting the full supply once to its deployer. Nothing blocks admission.\n\n**Findings kept, all reproduced against the real v4 PoolManager:**\n\n- **Low.** A sell larger than the pool's ETH, sent with the router-default extreme price limit, reverts in afterSwap because spot() exceeds its 1e40 bound. The specialist's proof fails on this tree with the exact WrappedError and the tight-limit control passes. The pool cannot be bricked by it.\n- **Low.** The sell charge is bypassed by exiting through a token-only liquidity range, since the hook has no liquidity callbacks. My test shows 10 tokens pay 0.98 ETH to the hook on the swap path and 0 on the LP path, with the holder receiving more ETH. Fixing it changes the hook flags, so it is the author's scope call.\n- **Low.** For the minute between 30 and 31 minutes after initialization, buy, sell, quote and quoteSell revert NotConfigured because the launch-tax guard and the TWAP warm-up disagree. Confirmed at +30m and +30m59s, working at +31m.\n- **Info.** The surcharge ratchet keeps unrelated sellers near the 15% cap for about 140 minutes after one capped sell. Documented design.\n- **Info.** Trust map: the Desk moves the surcharge coefficients within bounds, and the Desk's binder fixes the fee destination. No loss path.\n\nThe five specialist findings merged cleanly with no duplicates across areas. My own pass over the hook, covering delta accounting, the TWAP ring, the bind proofs, the float take and the factory's zero-liquidity fee collect, found nothing beyond them. The Slither and Aderyn lines on the hook are false positives: the ETH sends go only to the proven FeeRouter, and the modulo uses are ring-buffer indices.\n\n**Coverage.** All 160 entry points have a row. Hook, token, FeeRouter, StandardAdapter, StandardMarket, MarketFactory, EndowmentEscrow, Params, GameRegistry and RewardPool entry points carry real verdicts. The remaining game modules from the already-deployed L1 launch are marked unreached, honestly, since no specialist verified them and they are not contracts this launch deploys.","treeHash":null,"usage":{"cachedInputTokens":1342284,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":41438,"runtime":"claude","turns":25,"wallClockMs":610512}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc34db8e17664ebd","findings":[{"citation":"resolved","description":"The hook has no owner, but two external actors hold bounded powers over it after launch. (1) Params.swarmWallet (the SwarmDesk 0x5cb0686a4475d1f8a6c6e5240579080a4a05b609, driven by the oracle-attested regulator) can move the three sell-surcharge coefficients the hook reads at keys 24/25/26 (SellHourBps 200-600, SellDayBps 100-500, SellDeviationBps 2000-5000), at most 10% per key per day (src/Params.sol:165-180). The total sell charge is capped at TOTAL_CAP_BPS = 1500 regardless. (2) The Desk's binder 0x6d51cBE774aeAe4dd40bCA2560E9bc2695A0d007 (also FeeRouter.team, a constant) picks which proven registry the Desk binds to, which fixes the only FeeRouter the hook can ever flush to; until it binds, launch tax and the 1% share accumulate in the hook (accepted 420b1475). Neither power can redirect funds to an unproven contract, change the buy tax, or block the factory's fee collect. Reported for the judge's trust map, not as a defect.","line":235,"path":"src/V4Market.sol","reproduction":"State: hook bound to FeeRouter/Params. Call Params.set(SellHourBps(24), 550, \"letter\") from the Desk after 1 day -> next sells with hour imbalance 10000 bps pay 100 + 550 + ... bps, still clipped to 1500 bps by Math.min(TOTAL_CAP_BPS, target) in _sellFee. Expected and actual agree; no loss path.","severity":"info","snippet":"    function _coefficient(uint8 key_, uint256 default_) private view returns (uint256) {\n        return address(params) == address(0) ? default_ : params.get(key_);\n    }","title":"Privileged-actor map for the hook: sell-surcharge coefficients are set by the Desk and the fee destination is chosen by the binder (trust assumptions, bounded)"}],"hash":"7bb0694a617cb49eb1383691a7c2bcb554e1d3bbe2ce3731959516d8fddf6247","nodeId":"bfce9cd6-8235-4904-b3dc-bedc26aaf042","outcome":"completed","summary":"Review complete. The findings file is at `.imd-findings.json` in the repository root and no source file was changed.\n\n**Outcome: no defect found in the assigned area.** I checked the V4Market hook and LaunchToken against the Access Control, Trust Gap and Asymmetry guides and found no reproducible failure. The file carries one info-level entry and a full coverage record.\n\nWhat I verified on the hook, with concrete tracing:\n\n- **Callback access.** Every callback requires the PoolManager as caller and the immutable pool id as key. afterInitialize additionally requires the sender to be the launch factory and is one-shot. The existing suite and the pinned creation hash test pass on this tree.\n- **Delta symmetry.** Buy tax is returned as a specified-currency delta and taken from the manager, so the swapper pays the full input and afterSwap refuses partial fills. Sell charges are returned as an unspecified-currency delta and taken in the same amount. The hook's ETH balance always equals its three held counters because receive accepts only the manager.\n- **Bind trust chain.** The permissionless bind can only land on module 6 of the registry the pinned Desk bound to. The registry is proven by factory CREATE2 over this build's GameRegistry initcode, and the two toolchain pins in ModuleCode are identical, so the hook cannot be left unbindable by a toolchain mismatch. FeeRouter's team is a constant, so a permissionless deployer cannot capture the 10% team share.\n- **Privileged actors.** The Desk can move the three sell coefficients the hook reads at keys 24 to 26, which I confirmed map to the Sell keys in the Params enum. Changes are bounded, limited to 10% per day, and clipped by the 15% cap. This is the info entry, with the exact call.\n- **System buy and sell paths.** Only the bound router may call them, the hook's own swaps skip callbacks under v4's self-call guard, and the accounting mirrors the pool path's 1%.\n- **Token.** Plain OpenZeppelin ERC-20, one mint of 1e9e18 to the deployer, no owner or extra paths.\n\nCoverage record:\n\n| Verdict | Rows |\n| --- | --- |\n| holds | 63 |\n| unreached | 101 |\n\nThe holds rows cover every V4Market, StandardMarket, StandardAdapter, MarketFactory, LaunchToken, Params, RewardPool and FeeRouter entry point plus the bind, register and escrow paths. The unreached rows are the game modules outside the hook area (FarmCore, FarmRewards epochs, Season, PackSale, GridOperator, Enhancement, Billboards, Economy, StarterClaim and most of SwarmDesk), where I read guards but did not trace effects within the budget. The slither leads in the hook (arbitrary-send-eth, weak-prng) are false positives: recipients are forced to the proven router and the modulo is ring-buffer indexing. The Civic warTop lead is a mapping and needs no initialization.","treeHash":null,"usage":{"cachedInputTokens":1603160,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":38388,"runtime":"claude","turns":37,"wallClockMs":665297}},{"artifacts":[],"attempt":1,"bundleHash":"c4eb3382ce51cff6301a6f142183909f11bffe85dc7ccb8afc2ea8997cb3aaf5","device":"94220c4a6ab72976","findings":[],"hash":"a3c57fd754980ff8bd3910ee57d8efc085037bfc13c692e84fe2515077b094d7","nodeId":"a30917b6-9725-4f4f-93ff-ce8ce14c28c7","outcome":"completed","summary":"Created [launch.json](/root/.identitymd/work/84793148-4816-47e0-a05e-660220def3a9/a30917b6-9725-4f4f-93ff-ce8ce14c28c7/launch.json). No existing files changed.\n\n- Token: `LaunchToken` — BLACKOUT/BLACKOUT.\n- Hook: `V4Market`, permissions `0x10cc`.\n- Pool key: `(native ETH, $token, 12500, 60, deployed V4Market)` on chain 4663.\n- Deployment addresses and launch number: unavailable in this manifest-only task.\n\nOffline build passed. Tests with the prescribed seed: **355 passed, 0 failed, 6 fork tests skipped**. The pinned creation-code hash and runtime size match.","treeHash":"19a5203890ccc7d900d19cbe9e14ca2e2077e609","usage":{"cachedInputTokens":1527808,"inputTokens":81684,"model":"gpt-6-astra","outputTokens":9826,"runtime":"codex","turns":7,"wallClockMs":477170}},{"artifacts":[],"attempt":1,"bundleHash":"5ac3b1a781497bd6873f87e1b93ffb34a5561bb9b7056f6041b14ddf268783f9","device":"83b36551000748bb","findings":[],"hash":"b2594604372413b3d2e7f09098aa585bbd84cb19f21f0182ab459df139d9f5a9","nodeId":"8700bba3-b914-4b18-89d6-f876b294ee1a","outcome":"completed","summary":"Added [tests and documentation](test/blackout/README.md), with production files unchanged.\n\nValidation: **382 passed, 0 failed, 6 fork tests skipped**. Both invariant campaigns passed 49,152 random calls. `forge build` passed.\n\nToken: `LaunchToken`. Hook: `V4Market`. Pool key: `(ETH, LaunchToken, 12500, 60, V4Market)`.\n\nNo deployment occurred, so deployed addresses and a launch number were not generated.","treeHash":"0eade6026a17d91012b1f5c5d8c192f3b2c005b2","usage":{"cachedInputTokens":8226560,"inputTokens":196787,"model":"gpt-6-astra","outputTokens":42461,"runtime":"codex","turns":14,"wallClockMs":1559754}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bd7adba3a8045853","findings":[{"citation":"resolved","description":"Boundary x invariant seam. buy() gates on LAUNCH_TAX_DECAY (30 minutes, line 507) and then unconditionally calls twap() (line 508), but twap() (line 317) requires block.timestamp >= initializedAt + 31 minutes because the first observation minute after initialisation is only readable from minute initializedAt/60 + 1. quote() (line 324-327), quoteSell() (line 515) and maxSellBatch() (line 526) call twap() the same way, so sell() (line 533-534) is gated identically. For 60 seconds after the launch tax reaches its final 1% step, every system path through the hook (FeeRouter.executeBuys, executePotBuys, zapBuy, executeSells) reverts with NotConfigured instead of TooEarly, and currentBuyTaxBps()/launchTaxTimeLeft() already report the window as over. No funds move and external pool swaps are unaffected; the lost minute is a cadence/UX gap and a misleading revert reason. Minimal fix: gate buy()/sell() on initializedAt + 31 minutes (or make LAUNCH_TAX_DECAY and the twap warm-up the same constant) so the two guards agree.","line":507,"path":"src/V4Market.sol","reproduction":"State: pool initialised at T0 (afterInitialize). Warp to T0 + 30 minutes: hook.currentBuyTaxBps() == 100 and hook.launchTaxTimeLeft() == 0, yet hook.twap() and hook.quote(1 ether) revert NotConfigured, and a bound FeeRouter calling hook.buy{value: 0.1 ether}(minOut, recipient) reverts NotConfigured (passes the TooEarly check, fails inside twap()). Warp to T0 + 31 minutes - 1: still NotConfigured. Warp to T0 + 31 minutes: twap() returns a value and buy() proceeds. Verified with a scratch Foundry test (testTwapDeadWindowAfterLaunchTax) on the MockV4Manager harness: expectRevert(NotConfigured) at +30m and +30m59s, success at +31m.","severity":"low","snippet":"        if (initializedAt == 0 || sinceLaunch() < LAUNCH_TAX_DECAY) revert TooEarly();\n        twap();","title":"buy(), sell() and quote() revert NotConfigured for the first minute after the launch-tax window ends (30-31 min boundary mismatch)"}],"hash":"ec6b47555cffcaf0e711bce859dc92fe90e40b6921674a70b4d39b7d0ae1866b","nodeId":"9a407d2a-d399-4604-aa4b-a9a07123cc86","outcome":"completed","summary":"The review is complete and the findings file is written. Nothing else is needed: the tree is unchanged apart from `.imd-findings.json`, and the scratch test directory has been removed.\n\n**Result:** the hook's math holds. One low-severity boundary defect was confirmed and recorded.\n\n**What I checked, against the Math Precision, Boundary and Numerical Gap guides**\n\n- **Buy tax packing and rounding.** The beforeSwap fee and the afterSwap expected consumption both use the same floored formula, so the PartialFill check can never misfire on rounding. Fuzzed across all four tax steps and odd inputs.\n- **TWAP ring buffer.** The 32-slot ring, the clip to the last 31 minutes and the 31-minute warm-up are consistent. A fuzz of random swap cadences and random read times never hit a stale slot. Cumulative arithmetic cannot overflow at any price inside the accepted spot bounds.\n- **Sell surcharge decay.** The stored fee never falls below the 1% floor or exceeds the 15% cap. The excess subtraction cannot underflow.\n- **Spot price bounds.** The production opening price of 1e8 tokens per ETH yields 1e26, far inside the accepted range. The upper bound is reached only at a sqrt price of 1e11 times 2^96.\n- **Delta packing and settlement.** The int256 shift preserves sign, the hook's ETH balance always equals the three held sums, and every take or settle path balances within the unlock.\n- **Hook flags.** The 0x10cc mask matches the five enabled permissions bit for bit.\n- **FeeRouter paths that feed the hook** and the Params bounds for the surcharge coefficients were traced and hold.\n\n**The finding (low):** buy, sell and quote gate on the 30-minute launch window but then call twap, which needs 31 minutes. For exactly one minute after the tax reaches its final step, every system path reverts with NotConfigured instead of TooEarly, while the status views already say the window is over. No funds are at risk. A scratch Foundry test confirmed the revert at 30m and 30m59s and success at 31m.\n\n**Coverage:** all 165 entry points have rows, plus five invariant rows. The hook, StandardMarket, LaunchToken, the relevant FeeRouter functions, Params.set and RewardPool are answered. The remaining game modules are marked unreached because they lie outside the hook math area and the budget was spent on the launch contracts.","treeHash":null,"usage":{"cachedInputTokens":2043683,"inputTokens":610,"model":"claude-fable-5-1","outputTokens":42520,"runtime":"claude","turns":20,"wallClockMs":612141}},{"artifacts":[],"attempt":1,"bundleHash":"5675027e1d1f47410f01654dd4e6917573d961ff880e1473342b92bea40afe21","device":"7df8c87bdf5d7822","findings":[],"hash":"f611e9665bdc0edcb344399b7507a26881d12049c50978203253c24f362ef1d9","nodeId":"974548f1-416c-4f4c-911a-7d6910ad9275","outcome":"completed","summary":"Implemented the pinned source with only the permitted hook additions and new token.\n\n- Token: `LaunchToken` — BLACKOUT/BLACKOUT, fixed 1 billion supply.\n- Hook: `V4Market` — required hash and 21,982-byte runtime verified.\n- Pool key: `(native ETH, $token, 12500, 60, $hook)`.\n- Deployed addresses and new launch number: pending IMD deployment; 1628 is the existing bootstrap.\n\n`forge build` and formatting pass. Tests: **355 passed, 0 failed, 6 fork checks skipped**, using the required seed.\n\n[Launch parameters and operational handoff](/root/.identitymd/work/84793148-4816-47e0-a05e-660220def3a9/974548f1-416c-4f4c-911a-7d6910ad9275/docs/blackout-hook-launch.md).","treeHash":"130b2ddb70d4969fc9771da61f1296fbb7ddfc86","usage":{"cachedInputTokens":4616064,"inputTokens":152557,"model":"gpt-6-astra","outputTokens":29422,"runtime":"codex","turns":12,"wallClockMs":946861}}],"verification":[{"checks":[{"durationMs":28487,"exitCode":0,"name":"build","output":"Compiling 200 files with Solc 0.8.26\nSolc 0.8.26 finished in 28.32s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n  --> src/lib/EconomyMath.sol:17:48:\n   |\n17 |         returns (uint256 chance, uint256 burn, uint256 bonus, uint256 daysWad)\n   |                                                ^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/lib/EconomyMath.sol:44:5:\n   |\n44 |     function bonus(uint256 level) internal pure returns (uint256 b) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/V4Market.sol:330:22:\n    |\n330 |     function _record(bool sell, uint256 amount) private {\n    |                      ^^^^^^^^^\nNote: The other declaration is here:\n   --> src/V4Market.sol:529:5:\n    |\n529 |     function sell(uint256 amount, uint256 minOut, address recipient) external nonReentrant returns (uint256 received) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n  --> test/mocks/MockSwarmIntake.sol:26:9:\n   |\n26 |         bytes4 failure,\n   |         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n  --> test/mocks/MockSwarmIntake.sol:44:5:\n   |\n44 |     function failure(bytes32 id, uint8 status, bytes32 reason) external returns (bool) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2072): Unused local variable.\n  --> test/EndowmentEscrowV38.t.sol:28:9:\n   |\n28 |         LocalApplicationFactory f = LocalApplicationFactory(address(d.registry.factory()));\n   |         ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/EndowmentEscrowV38.t.sol:121:82:\n    |\n121 |     function _registryArgs(address gameToken, address params, uint256 endowment, address factory)\n    |                                                                                  ^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/Events.t.sol:213:9:\n    |\n213 |         uint256 price = d.packs.quote(112);\n    |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n --> test/Gas.t.sol:9:9:\n  |\n9 |         uint256 price = d.packs.price();\n  |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Gas.t.sol:75:9:\n   |\n75 |         uint256 q = d.packs.quote(112);\n   |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Invariants.t.sol:56:9:\n   |\n56 |         uint256 price = d.packs.price();\n   |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Items.t.sol:76:9:\n   |\n76 |         uint256 cost = d.packs.quote(112);\n   |         ^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/Items.t.sol:106:9:\n    |\n106 |         uint256 q = d.packs.quote(16);\n    |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/LazyAccounting.t.sol:186:13:\n    |\n186 |             uint256 quote = d.packs.quote(112);\n    |             ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/LazyAccounting.t.sol:421:9:\n    |\n421 |         uint256 quote = d.packs.quote(112);\n    |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Packs.t.sol:37:9:\n   |\n37 |         uint256 quote = d.packs.quote(200);\n   |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Packs.t.sol:64:9:\n   |\n64 |         uint256 q = d.packs.quote(6);\n   |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Pause.t.sol:35:9:\n   |\n35 |         uint256 q = d.packs.quote(1);\n   |         ^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Registry.t.sol:49:21:\n   |\n49 |     function _fresh(LocalApplicationFactory f) private returns (GameRegistry) {\n   |                     ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Regression.t.sol:73:9:\n   |\n73 |         uint256 previous = d.items.data(id).durability;\n   |         ^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/SwarmDeskV37.t.sol:485:65:\n    |\n485 |     function _registryArgs(address params, bytes32 starterRoot, address factory) private view returns (bytes memory) {\n    |                                                                 ^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/V33.t.sol:254:13:\n    |\n254 |             uint256 q = d.packs.quote(16);\n    |             ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/V33.t.sol:431:9:\n    |\n431 |         uint256 price = d.packs.price();\n    |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/V34.t.sol:78:9:\n   |\n78 |         uint256 q = d.packs.price();\n   |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/V39.t.sol:186:9:\n    |\n186 |         LocalApplicationFactory f = LocalApplicationFactory(address(d.registry.factory()));\n    |         ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/FarmRewards.sol:149:5:\n    |\n149 |     function ready() public view returns (bool) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n   --> test/Base.t.sol:106:5:\n    |\n106 |     function oracleFixture() internal returns (SwarmDesk.OracleConfig memory o) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n   --> test/AuditV315.t.sol:187:5:\n    |\n187 |     function testFixtureDeskBoundAgainstItsTokenLaunchRecord() public {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/fork/RehearsalV311.t.sol:224:5:\n    |\n224 |     function _oracle() internal view returns (SwarmDesk.OracleConfig memory o) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/fork/RehearsalV311.t.sol:283:5:\n    |\n283 |     function _mineHookSalt(bytes memory initCode) internal view returns (bytes32 salt, address hook) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":38187,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/RobinhoodFork.t.sol:RobinhoodForkTest\n[SKIP] testForkArbSysAndHistoricalHash() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 218.18µs (90.45µs CPU time)\n\nRan 2 tests for test/Clock.t.sol:ClockTest\n[PASS] testLocalEvmFutureBlockAnd256BlockBoundary() (gas: 225376)\n[PASS] testRobinhoodUsesArbSysNotL1EstimateAndHandlesExpiry() (gas: 238560)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 322.80µs (196.67µs CPU time)\n\nRan 2 tests for test/V310.t.sol:ToolchainPinsV310Test\n[PASS] testEveryModuleOfThisBuildMatchesOneToolchainPin() (gas: 168471)\n[PASS] testPinsAreOneToolchainAndRejectUnknownCode() (gas: 164239)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.87ms (1.37ms CPU time)\n\nRan 4 tests for test/OracleConformanceV37.t.sol:OracleConformanceV37Test\n[PASS] testAcceptsOriginalProtocolSignature() (gas: 17934)\n[PASS] testDigestMatchesUnmodifiedProtocolVector() (gas: 13636)\n[PASS] testFreshVectorSignerSignature() (gas: 30385)\n[PASS] testSelectorsExactlyMatchLiveProtocol() (gas: 3520)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 10.29ms (6.08ms CPU time)\n\nRan 3 tests for test/AuditV318.t.sol:AuditV318PartialFillTest\n[PASS] testAfterSwapAcceptsExactFillAtEveryStep() (gas: 2199153)\n[PASS] testAfterSwapRefusesAPartialFill() (gas: 415676)\n[PASS] testMockBeforeSwapRefusesNonExtremeLimitAndKeepsExactOutputRefusal() (gas: 197144)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 10.92ms (2.40ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testConstructorRejectsMissingInputsAndDoesNotCallExternalContracts() (gas: 3994)\n[PASS] testForeignCallerDoesNotGetAnyAuthority() (gas: 43053059)\n[PASS] testImmutableGraphAndEip170Sizes() (gas: 187323)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 13.47ms (4.70ms CPU time)\n\nRan 6 tests for test/ForeignTokenTwin.t.sol:ForeignTokenTwinTest\n[PASS] testBinderBindsTheGenuineRegistryThenAlreadyDone() (gas: 2793336)\n[PASS] testBinderCannotBypassAnyProof() (gas: 7228587)\n[PASS] testForeignTwinCannotBindFromTheAttacker() (gas: 1433024)\n[PASS] testForeignTwinIsSelfConsistentAndPassesEveryProofExceptTheBinder() (gas: 137039)\n[PASS] testNoNonBinderCanBindEitherRegistry() (gas: 2005687)\n[PASS] testZeroBinderRevertsAtConstruction() (gas: 673051)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 19.91ms (8.92ms CPU time)\n\nRan 1 test for test/PredictionV34.t.sol:PredictionV34Test\n[PASS] testFullGraphPredictsPoolBeforeRegistryDeployment() (gas: 4162727)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 14.03ms (910.81µs CPU time)\n\nRan 2 tests for test/Factory.t.sol:FactoryTest\n[PASS] testFactoryInvalidSearchRange() (gas: 4937)\n[PASS] testHookFactoryFlagsImmutableConfigAndIdempotence() (gas: 5999719)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 21.14ms (12.37ms CPU time)\n\nRan 1 test for test/DeployGateV314.t.sol:DeployGateV314Test\n[PASS] testAllLaunchConstructorsWorkWithNoProtocolCode() (gas: 49350901)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 23.35ms (23.28ms CPU time)\n\nRan 2 tests for test/GridV35.t.sol:GridV35Test\n[PASS] testGreenAndCheapBothFavorTheStableDistrict() (gas: 4110886)\n[PASS] testReservedEventsHaveZeroLaunchWeightAndPlanOnlyWhenEnabled() (gas: 723024)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 26.47ms (12.25ms CPU time)\n\nRan 5 tests for test/fork/RehearsalV311.t.sol:RehearsalV311Test\n[SKIP] testRehearsalAttestedAnswerChangesPlanWithinBand() (gas: 0)\n[SKIP] testRehearsalGasPerLaunchUnderPlatformCeiling() (gas: 0)\n[SKIP] testRehearsalKeeperPassAdvancesEpochsRevealsEntropyAndClaimFeesPaysTeam() (gas: 0)\n[SKIP] testRehearsalLaunchTaxThenOnePercentAndSurcharge() (gas: 0)\n[SKIP] testRehearsalPacksOpenOneHourAfterLaunch() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 453.96µs (58.82µs CPU time)\n\nRan 5 tests for test/AuditV315.t.sol:AuditV315Test\n[PASS] testAttackerLaunchRecordNamesAnotherTokenAndIsRefused() (gas: 10743754)\n[PASS] testFakeMarketEchoingDeskTokenAndHashCannotBind() (gas: 6952035)\n[PASS] testFixtureDeskBoundAgainstItsTokenLaunchRecord() (gas: 58275)\n[PASS] testRealHookRecordedByTheLaunchFactoryBinds() (gas: 12208225)\n[PASS] testRecordWithOtherHookOrOtherPairCurrencyIsRefused() (gas: 6245556)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 30.29ms (14.21ms CPU time)\n\nRan 3 tests for test/PotV35.t.sol:PotV35Test\n[PASS] testPotDepositRequiresActualTokensAndAuthority() (gas: 256924)\n[PASS] testPotSplitAndLotteryCommitSurvivesFullInventory() (gas: 11851210)\n[PASS] testPotUnclaimedRolloverOnlyAfterFourWeeksNoDoubleClaim() (gas: 6429769)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 31.71ms (18.09ms CPU time)\n\nRan 2 tests for test/AutoRepairReviewV35.t.sol:IndependentAutoRepairReview\n[PASS] testAutomaticRepairRecordsHistoricalWeekBeforeCompletion() (gas: 5411876)\n[PASS] testLateAutomaticRepairCannotReopenSeasonEligibility() (gas: 4275820)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 32.05ms (18.54ms CPU time)\n\nRan 3 tests for test/HookBinding.t.sol:HookBindingTest\n[PASS] testHoldBeforeGameExistsThenBindOnceAndFlushExactStreams() (gas: 43434476)\n[PASS] testLookAlikeCannotBindEvenWhenTeamCalls() (gas: 1908025)\n[PASS] testWrongRouterAndMissingCodeRejectedBeforePermanentBind() (gas: 41150130)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 27.76ms (15.32ms CPU time)\n\nRan 7 tests for test/V33.t.sol:LaunchProtectionTest\n[PASS] testBuyTaxHasImmutableSteps() (gas: 97570)\n[PASS] testLaunchTaxChargedAndRoutedEntirelyToPool() (gas: 228018)\n[PASS] testNoBuySizeLimitAtAnyLaunchStep() (gas: 1691629)\n[PASS] testNormalBuyAfterDecayHasNoLaunchTax() (gas: 1479517)\n[PASS] testSellsPayNormalFeeDuringLaunch() (gas: 339501)\n[PASS] testSnipersSplittingBuysStillPayTheCurve() (gas: 657266)\n[PASS] testViewsBeforeInitialization() (gas: 4883854)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 33.09ms (6.09ms CPU time)\n\nRan 1 test for test/WarReviewV35.t.sol:IndependentWarReview\n[PASS] testWarWinnerCannotChangeAfterDeadline() (gas: 5734360)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.15ms (1.01ms CPU time)\n\nRan 5 tests for test/Registry.t.sol:RegistryTest\n[PASS] testAllModulePinsMatchExactPinnedCompilerArtifacts() (gas: 1068880)\n[PASS] testAuthenticatedEnrollmentRejectsUncreatedWrongCodeAndWrongRegistry() (gas: 2930598)\n[PASS] testConstructorAcceptsEmptyGraphWithoutExternalCalls() (gas: 13657)\n[PASS] testCounterfeitRuntimeAtAnotherFactoryCannotEnroll() (gas: 1542191)\n[PASS] testCounterfeitRuntimeWithPoisonedCreditCannotEnroll() (gas: 5876476)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 19.36ms (7.06ms CPU time)\n\nRan 1 test for test/YieldFloorReviewV35.t.sol:IndependentYieldFloorReview\n[PASS] testFirstEpochItemQuotesKeepNonzeroFloorAtCorrectScale() (gas: 673277)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 724.50µs (651.52µs CPU time)\n\nRan 6 tests for test/CivicV35.t.sol:CivicV35Test\n[PASS] testBillboardsBidRefundTextRulesAndPoolOnly() (gas: 945608)\n[PASS] testBlackMarketDescendingLimitedAndPause() (gas: 3828638)\n[PASS] testCollapseSuccessAndSingleOutageFailure() (gas: 810762)\n[PASS] testDormantDisabledAndNoticeOnce() (gas: 303076)\n[PASS] testOnceSeasonBoostBoundsAndSnapshot() (gas: 1722528)\n[PASS] testWarFreezeScoresConservationAndPayoutOnlyOnce() (gas: 1365382)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 38.82ms (25.42ms CPU time)\n\nRan 5 tests for test/KeeperProfit.t.sol:KeeperProfitTest\n[PASS] testPaidPackEntropyKeeperProfit() (gas: 1182284)\nLogs:\n  paid pack entropy execution gas: 139616\n  paid pack entropy bounty wei: 3380475000000\n  paid pack entropy execution plus 21000 gas cost wei: 3212320000000\n\n[PASS] testPlanEntropyKeeperProfit() (gas: 1665588)\nLogs:\n  plan entropy execution gas: 163211\n  plan entropy bounty wei: 4474800000000\n  plan entropy execution plus 21000 gas cost wei: 3684220000000\n\n[PASS] testSeasonFinalizeThreeWinnersAndPrizeKeeperProfit() (gas: 3451194)\nLogs:\n  season finalize three winners and prize execution gas: 644073\n  season finalize three winners and prize bounty wei: 15825700000000\n  season finalize three winners and prize execution plus 21000 gas cost wei: 13301460000000\n\n[PASS] testSeasonPrepareIsConstantUnpaidWork() (gas: 1342777)\n[PASS] testStarterEntropyKeeperProfit() (gas: 324487)\nLogs:\n  starter entropy execution gas: 142744\n  starter entropy bounty wei: 3380150000000\n  starter entropy execution plus 21000 gas cost wei: 3274880000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 16.62ms (7.92ms CPU time)\n\nRan 5 tests for test/ReviewV34.t.sol:ReviewV34Test\n[PASS] testCanonicalCompetingRegistryCannotTakeOverBinding() (gas: 9599655)\n[PASS] testDustBuyCannotConsumeGlobalBuyInterval() (gas: 336156)\n[PASS] testLateGreenEntrySettlesWithinReservedEnvelope() (gas: 4441470)\n[PASS] testMeaningfulSmallBuyCanUseLessThanMaximumBatch() (gas: 263646)\n[PASS] testSameConfigurationAtUncommittedCoordinatesCannotBind() (gas: 9686210)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 22.06ms (11.71ms CPU time)\n\nRan 13 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testCannotSpendAnotherHoldersBalanceWithoutAllowance() (gas: 57645)\n[PASS] testFactoryReceivesEntireSupplyInsteadOfOriginOrCaller() (gas: 211614)\n[PASS] testFuzzTransferFromSpendsOnlyApprovedAmount(uint256,uint256) (runs: 256, μ: 166584, ~: 167724)\nLogs:\n  Bound result 1508857331349\n  Bound result 1338239256118\n\n[PASS] testFuzzTransfersConserveSupplyWithoutFees(uint256) (runs: 256, μ: 151137, ~: 151056)\nLogs:\n  Bound result 507\n\n[PASS] testInfiniteAllowanceRetainedAndCanBeRevoked() (gas: 188186)\n[PASS] testLaunchAllocationsAndSubsequentEndowmentTransferArePlainTransfers() (gas: 286616)\n[PASS] testMetadataAndFixedSupply() (gas: 52708)\n[PASS] testNoMintBurnOwnerPauseBlacklistOrUpgradeEntryPoints() (gas: 510976)\n[PASS] testRuntimeHasNoUpgradeOrDestructionOpcodes() (gas: 778334)\n[PASS] testTransferAboveBalanceRevertsWithoutChangingSupply() (gas: 54899)\n[PASS] testTransferFromFailureRestoresAllowance() (gas: 109283)\n[PASS] testZeroAndSelfTransfers() (gas: 95974)\n[PASS] testZeroRecipientAndSpenderRejected() (gas: 61397)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 50.61ms (51.45ms CPU time)\n\nRan 8 tests for test/FeesParams.t.sol:FeesParamsTest\n[PASS] testAllDefaultParamsWithinHardBounds() (gas: 1255771)\n[PASS] testBuyBackPoolOnlySlippageFailureRollbackAndDustGriefBlocked() (gas: 774066)\n[PASS] testExactEthSplitsHeartbeatCapAndPullPayments() (gas: 512724)\n[PASS] testFuzzNoStepAboveTenPercent(uint96) (runs: 256, μ: 44973, ~: 45115)\nLogs:\n  Bound result 3629\n\n[PASS] testFuzzSplitsConserveEveryWei(uint96) (runs: 256, μ: 206504, ~: 210856)\nLogs:\n  Bound result 3629\n\n[PASS] testHeartbeatCapFixedAtOneEth() (gas: 207904)\n[PASS] testParamsStepCooldownBoundsAuthorityAndLetter() (gas: 195823)\n[PASS] testPoolNoPublicReserveRecycleOrPayment() (gas: 135304)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 76.73ms (64.96ms CPU time)\n\nRan 3 tests for test/Pause.t.sol:PauseTest\n[PASS] testOnlySwarmBoundedDurationAndCannotExtendPause() (gas: 242972)\n[PASS] testSalePausedWhileEntropyClaimsWithdrawalsAndEpochsContinue() (gas: 15148717)\n[PASS] testUnpauseCannotResetNextPauseCooldown() (gas: 194647)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 89.84ms (69.14ms CPU time)\n\nRan 6 tests for test/EndowmentEscrowV38.t.sol:EndowmentEscrowV38Test\n[PASS] testConstructorRejectsMissingInputs() (gas: 3911)\n[PASS] testForwardRejectsBadProofs() (gas: 2647974)\n[PASS] testForwardRequiresBalance() (gas: 748474)\n[PASS] testForwardSendsWholeBalanceOnceToAuthenticatedPoolAndFundsEndowment() (gas: 1702540)\n[PASS] testForwardWithRealEndowmentActivatesDrip() (gas: 12904786)\n[PASS] testTwinWithForeignTokenCannotDrainEscrow() (gas: 12918283)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 17.58ms (9.21ms CPU time)\n\nRan 8 tests for test/V39.t.sol:V39Test\n[PASS] testBaseDepositsAreEntirelyRewardEth() (gas: 190166)\n[PASS] testGridAcceptsSeverityFromThreeThousandAndRejectsBelow() (gas: 2948508)\n[PASS] testHookAddsExactlyOnePercentOnBuysAndSellsAfterLaunchWindow() (gas: 2180818)\n[PASS] testHookHasNoNetworkShareRecipientOrWithdrawal() (gas: 107646)\n[PASS] testMarketFactoryConfigHasNoNetworkRecipient() (gas: 14199018)\n[PASS] testRegistryAcceptsEitherToolchainPinAndNothingElse() (gas: 590544)\n[PASS] testSellSurchargeStillProgressiveAndCappedAtFifteenPercent() (gas: 1832446)\n[PASS] testStepLaunchTaxUnchangedAndFullyToRewards() (gas: 1292115)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 124.12ms (110.44ms CPU time)\n\nRan 14 tests for test/V34.t.sol:V34Test\n[PASS] testBestFarmCapsAbsoluteSpendAndBreaksTiesByAddress() (gas: 4665724)\n[PASS] testBestFarmNeedsTwentyEpochsAndUsesCappedAbsoluteSpend() (gas: 4144232)\n[PASS] testBuybackSlippage150BpsMaxAndIntervalCannotBeBypassed() (gas: 756212)\n[PASS] testDonationsAndOrdinaryInflowsCannotPretendToBeEndowment() (gas: 1520675)\n[PASS] testEntropyAt256BoundaryAndAt257RearmsWithoutPayOrMint() (gas: 3283396)\n[PASS] testFirstRewardStartsCurrentEpochAtHalfTimeAndSnapshotCannotBeReplaced() (gas: 4843822)\n[PASS] testFreeFarmDoesNotDiluteDistrictOrClaimPaidPrize() (gas: 4739687)\n[PASS] testGameReadinessBothChecksRollbackEthAndTokenPurchase() (gas: 3618362)\n[PASS] testHookUninitializedCannotOpenOrStartEpochAndCallerCannotStartClock() (gas: 6045893)\n[PASS] testLaunchTaxExactBoundaries() (gas: 5929129)\n[PASS] testMythicGateEvaluatedAtRevealNotAtPayment() (gas: 1624053)\n[PASS] testPackOpeningFollowsHookAndNotLegacyDeployTimestamp() (gas: 101151)\n[PASS] testRemainderTransferredToPredictedPoolBeforeDeploymentAndNoApprovalNeeded() (gas: 2463041)\n[PASS] testStarterEntropyRearmsAfterClaimWindowAndNoDoubleMint() (gas: 772310)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 70.23ms (61.30ms CPU time)\n\nRan 3 tests for test/StandardAdapter.t.sol:StandardAdapterTest\n[PASS] testExistingHookKeyPreservedAndNoExtraFee() (gas: 330662)\n[PASS] testRequiresThirtyMinutesFreshOracleAndAuthorizedCallback() (gas: 198351)\n[PASS] testSettlementSlippageFailurePreservesCredits() (gas: 240594)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 14.07ms (1.44ms CPU time)\n\nRan 15 tests for test/LaunchHook.t.sol:LaunchHookTest\n[PASS] testAcceptedManagerFloatConstraintOnTokenOnlyPool() (gas: 438507)\n[PASS] testAllCallbacksRejectNonManagerEvenWithCorrectPool() (gas: 159896)\n[PASS] testAnotherSenderCannotInitializeFactoryPool() (gas: 234464)\n[PASS] testExactOutputAndZeroInputRefusedInBothDirections() (gas: 383766)\n[PASS] testFactoryInitializesOnceThroughRealPoolManager() (gas: 204494)\n[PASS] testFeesHeldAndFlushRefusedUntilDeskAndRouterBind() (gas: 782750)\n[PASS] testFuzzBuyStepsConserveEthAndTokens(uint96,uint16) (runs: 256, μ: 1337023, ~: 1062330)\nLogs:\n  Bound result 9999999999999016022\n  Bound result 10\n\n[PASS] testHookHasNoOwnerOrUpgradeEntryPoint() (gas: 9058924)\n[PASS] testManagerCannotDriveCallbacksForAnotherPool() (gas: 99574)\n[PASS] testPartialFillRefusedWithExactError() (gas: 195454)\n[PASS] testPermissionsMatchV4CoreABIAndMinedAddress() (gas: 26115)\n[PASS] testPinnedCreationHashAndRuntimeSize() (gas: 115688)\n[PASS] testPriceLimitedBuyRefusedBeforeFundsMove() (gas: 543405)\n[PASS] testSellFeesAccrueOnActualOutputAndFactoryCanCollect() (gas: 2611271)\n[PASS] testWrongPoolTermsCannotInitialize() (gas: 282717)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 116.53ms (122.95ms CPU time)\n\nRan 6 tests for test/Endowment.t.sol:EndowmentTest\n[PASS] testDirectTransferCannotBypassOrBackdateDrip() (gas: 368166)\n[PASS] testExactFundingFullLinearDripAndConservation() (gas: 832168)\n[PASS] testFuzzCumulativePaymentsCannotExceedVestedPrincipal(uint32,uint128) (runs: 256, μ: 523191, ~: 524727)\nLogs:\n  Bound result 21\n  Bound result 7760567710688070922\n\n[PASS] testNoTeamDonorOrSwarmWithdrawalOrReserveAuthority() (gas: 614309)\n[PASS] testParamsSnapshotCannotAccelerateOrRelockExistingEndowment() (gas: 303686)\n[PASS] testUnderfundingCannotActivateAndDonationsStayConserved() (gas: 453428)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 161.05ms (148.92ms CPU time)\n\nRan 1 test for test/EndowmentGame.t.sol:EndowmentGameTest\n[PASS] testRealMiningCannotSpendFutureEndowment() (gas: 130998353)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 175.90ms (164.60ms CPU time)\n\nRan 10 tests for test/Bounties.t.sol:BountiesTest\n[PASS] testBuyBountyProportionalCapNoDustCreditAndFailureRollback() (gas: 680020)\n[PASS] testEmptyRosterAndInvalidBatchReceiveNothing() (gas: 1419248)\n[PASS] testEveryWorkKindBoundedByHeartbeatAndAuthorizedProducer() (gas: 64315585)\n[PASS] testLazySettlementUnpaidAndCannotReplay() (gas: 6970276)\n[PASS] testOnlyFinalizePaidOnceAndEmptyWeekUnpaid() (gas: 2292196)\n[PASS] testPackEntropyCapturedOnceWithFullInventoryAndThroughPause() (gas: 3713527)\n[PASS] testPlanResolutionPaidOnceIncludingAdvanceForwarding() (gas: 2934177)\n[PASS] testRemovedWorkBountiesRejectedEvenFromOldProducer() (gas: 179981)\n[PASS] testStarterEntropySurvivesFullInventoryExpiryAndPauseWithoutReplayPayment() (gas: 5324477)\n[PASS] testWorkCreditRespectsZeroGasPricePriceCeilingAndUnitCap() (gas: 333726)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 161.28ms (177.29ms CPU time)\n\nRan 5 tests for test/AuditV314.t.sol:AuditV314Test\n[PASS] testDustAmountCannotReduceExecutedBatchAndEmptyQueueReverts() (gas: 1383695)\n[PASS] testLaterSameEpochCreditKeepsEarlierTaxVintage() (gas: 608585)\n[PASS] testLockInsertionWalkIsBoundedAndFailureIsAtomic() (gas: 30159768)\n[PASS] testOnlyFarmerCanRetireEvenAnEmptyFarm() (gas: 4306920)\n[PASS] testStaleSellAmountUsesCurrentDepthAndEnforcesCurrentMinimum() (gas: 1624852)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 208.43ms (127.61ms CPU time)\n\nRan 8 tests for test/TwinCaptureV312.t.sol:TwinCaptureV312Test\n[PASS] testBinderChoosingTwinOrphansHonestGame() (gas: 12068523)\n[PASS] testBinderChosenTwinCannotPayAttacker() (gas: 12034732)\n[PASS] testEOAMarketCannotBind() (gas: 5759282)\n[PASS] testHonestBindThenForwardReachesHonestPool() (gas: 6532903)\n[PASS] testHookWithForeignConfigurationCannotBind() (gas: 5801492)\n[PASS] testTwinCannotWinTheBindRace() (gas: 13565631)\n[PASS] testTwinWithForeignMarketCannotBind() (gas: 12270581)\n[PASS] testTwinWithForeignTokenCannotBind() (gas: 12441654)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 27.81ms (19.38ms CPU time)\n\nRan 1 test for test/StandardV4Integration.t.sol:StandardV4IntegrationTest\n[PASS] testStandardAdapterRealPoolPaysExistingHookExactlyOnce() (gas: 1949103)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 21.19ms (941.23µs CPU time)\n\nRan 2 tests for test/StandardMarket.t.sol:StandardMarketTest\n[PASS] testFuzzStandardSellNeverAddsProgressiveSurcharge(uint96) (runs: 256, μ: 1803175, ~: 1813765)\nLogs:\n  Bound result 840\n\n[PASS] testStandardBuyOnePercentAllToRewards() (gas: 1673334)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 306.45ms (274.72ms CPU time)\n\nRan 9 tests for test/AuditV318.t.sol:AuditV318Test\n[PASS] testAuditPriceLimitedBuyRevertsInsteadOfPayingTaxOnUnconsumedEth() (gas: 132817)\n[PASS] testBeforeSwapNamesThePriceLimitedBuyError() (gas: 63455)\n[PASS] testFullFillBuysPayEachStepExactly() (gas: 2526768)\n[PASS] testFullFillTenEthBuyPaysExactlyNinetyPercentInTheFirstStep() (gas: 413224)\n[PASS] testFuzzOnlyTheExtremeBoundBuysAndPaysTheFlooredTax(uint96,uint160,uint8) (runs: 256, μ: 1563485, ~: 1367437)\nLogs:\n  Bound result 42264174625779438556\n  Bound result 136034044430987246\n  Bound result 0\n\n[PASS] testPriceLimitedBuyRefusedAfterLaunchWindowToo() (gas: 4642321)\n[PASS] testPriceLimitedSellStillFillsPartiallyAndIsChargedOnActualOutput() (gas: 2237178)\n[PASS] testPublicInterfaceUnchanged() (gas: 108831)\n[PASS] testSystemRewardBuyStillFills() (gas: 1992056)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 384.35ms (297.09ms CPU time)\n\nRan 11 tests for test/Items.t.sol:ItemsTest\n[PASS] testComputeHashSupportHashAndBonusesReplaceDuo() (gas: 4715342)\n[PASS] testDurabilityWearRepairAndEnhancementMetadataPreserved() (gas: 8393341)\n[PASS] testEquipRarityGatesAndMythicGate() (gas: 4162922)\n[PASS] testFullStackRarityCapAndRoomFlags() (gas: 7665589)\n[PASS] testInventoryMintCannotExceedCapacityAndExpansionRises() (gas: 3356807)\n[PASS] testLockedItemCannotBeScrappedUntilEpochRolls() (gas: 5989066)\n[PASS] testOffgridSavings() (gas: 2711135)\n[PASS] testPaidXpCannotBypassRoomTwoAgeGate() (gas: 3746447)\n[PASS] testRoomGatesAndLevelProgression() (gas: 78475814)\n[PASS] testScrapPaysPoolYieldAndCannotRepeat() (gas: 7561671)\n[PASS] testSoulboundOnlyOwnFarmAndNoDuplicateTypes() (gas: 2265957)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 326.68ms (334.77ms CPU time)\n\nRan 8 tests for test/PhasedReleaseV36.t.sol:PhasedReleaseV36Test\n[PASS] testBillboardsDisabledThenEnabled() (gas: 414524)\n[PASS] testEnableIsNoticedOnceNeverOffAndSwarmOnly() (gas: 355991)\n[PASS] testEnhancementDisabledThenEnabledOnce() (gas: 1098908)\n[PASS] testEverythingDeploysDisabledAndCoreStillWorks() (gas: 8179262)\n[PASS] testFuzzUnannouncedFeatureCannotBeEnabled(uint256) (runs: 256, μ: 30151, ~: 29968)\n[PASS] testLocksStakeAndLobbyDisabledThenEnabled() (gas: 2861203)\n[PASS] testPotDisabledFollowsV34RoutingThenEnabled() (gas: 455827)\n[PASS] testReservedEventsDisabledThenEnabled() (gas: 557745)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 352.58ms (42.09ms CPU time)\n\nRan 21 tests for test/SwarmDeskV37.t.sol:SwarmDeskV37Test\n[PASS] testBackupFailureUnknownFailureDeadlineAndPriceCap() (gas: 751317)\n[PASS] testBackupPullsExactPriceRecordsRequestAndRestrictsBodyAndCadence() (gas: 1207764)\n[PASS] testDeskSetHeartbeatBpsMovesFeeRouterShare() (gas: 945834)\n[PASS] testEmptyChainConstructorAndAuthenticatedBindingRejectSpoofs() (gas: 12683178)\n[PASS] testEventClampingAndFallbackWithoutAnswer() (gas: 1117363)\n[PASS] testExpiredOldSlotOldEpochAndUnexecutedAnswersNeverAct() (gas: 852773)\n[PASS] testFlatConstructorRejectsUnusedPackedBits() (gas: 7335783)\n[PASS] testForgedTamperedWrongSignerWrongDomainAndCallerRejected() (gas: 359833)\n[PASS] testFutureIssueWrongTypeMalformedLengthAndPriceNeverConsume() (gas: 327553)\n[PASS] testFuzzEveryParamHardBoundsAndTenPercentStep(uint8,uint248) (runs: 256, μ: 475716, ~: 477797)\nLogs:\n  Bound result 1\n\n[PASS] testNextSlotAcceptsSameQuestionAndChangedExecutionBytesReject() (gas: 1146136)\n[PASS] testNoAdminPathsAndEntireGraphUsesDesk() (gas: 428356)\n[PASS] testNoopRegulatorAcceptedAndParamsCooldownPreserved() (gas: 452656)\n[PASS] testRegulatorClampsParamsAnnouncesPhasesAndThirtyDayCaps() (gas: 1146623)\n[PASS] testRegulatorSkipsOutOfRangeKeysInsteadOfClampingToFortyFive() (gas: 501093)\n[PASS] testReplayDifferentSourceAndSecondAnswerSameSlotIgnored() (gas: 1068212)\n[PASS] testRobinhoodNativeClockCallbackWithin200k() (gas: 352907)\n[PASS] testScheduleDeliveryStoresUnder200kThenExecutesTwoPlans() (gas: 984580)\n[PASS] testSubmitRelayAcceptsAttestedAnswerFromAnyoneOnce() (gas: 1092075)\n[PASS] testSubmitRelayRejectsForgedWrongQuestionStaleAndMalformed() (gas: 1843104)\n[PASS] testWrongQuestionUnknownRequestWeakPanelAndWindowRejected() (gas: 364850)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 176.04ms (187.71ms CPU time)\n\nRan 9 tests for test/Packs.t.sol:PacksTest\n[PASS] testExactPaymentAndFutureBlockRequired() (gas: 1671228)\n[PASS] testExactRarityThresholdsAndMythicGate() (gas: 282935)\n[PASS] testExpiryRearmsWithoutMintingAndInventoryOpeningLimit() (gas: 3797222)\n[PASS] testFuzzVrgdaAlwaysBounded(uint32,uint32) (runs: 256, μ: 61264, ~: 63085)\nLogs:\n  Bound result 52490\n\n[PASS] testItemTypeDistributionExact() (gas: 626492)\n[PASS] testNoWalletGlobalOrTokenPackDailyLimit() (gas: 4392810)\n[PASS] testStarterWindowProofTokenIdOnceAndInventoryFailureRetry() (gas: 881490)\n[PASS] testTokenPackSameQuoteAndSplitWhenUsingWalletOrCredits() (gas: 76592671)\n[PASS] testVrgdaInitialStepDecayFloorCeilingAndBulkPricing() (gas: 1299987)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 393.24ms (382.80ms CPU time)\n\nRan 7 tests for test/HeartbeatBpsV313.t.sol:HeartbeatBpsV313Test\n[PASS] testFuzzAnyShareConservesEveryWeiAndNeverMovesTeamOrPot(uint16,uint96) (runs: 256, μ: 1331920, ~: 1528705)\nLogs:\n  Bound result 201\n  Bound result 21127798574346\n\n[PASS] testLaunchDefaultIsTwoPercentAndSplitUnchanged() (gas: 230935)\n[PASS] testLoweredShareBackToFloorAndFloorIsHard() (gas: 401104)\n[PASS] testMaximumShareWithPotEnabledIsClippedToWhatIsLeft() (gas: 1867739)\n[PASS] testOnlyTheSwarmWithinBoundsStepAndCooldownCanMoveTheShare() (gas: 341795)\n[PASS] testRaisedShareStillStopsAtTheOneEthCap() (gas: 480520)\n[PASS] testSwarmSet220CreditsTwoPointTwoPercentOfSurchargeAndTokens() (gas: 543701)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 429.71ms (415.16ms CPU time)\n\nRan 20 tests for test/V33.t.sol:V33Test\n[PASS] testActionBeforeExpiryMovesBucketWithoutDoubleCount() (gas: 25983504)\n[PASS] testAdvanceIsConstantInExpiringFarms() (gas: 38430108)\n[PASS] testAgeCapsAtBoundaries() (gas: 204552)\n[PASS] testClaimDoesNotRecommitWhileBehind() (gas: 37239808)\n[PASS] testClaimRecommitsAndPackRecommits() (gas: 60787577)\n[PASS] testDistrictScoreAveragePerFarmAndTenPercentWalletCap() (gas: 4607489)\n[PASS] testHeartbeatCapExcessGoesToPoolAndBaseFeeIsAllRewards() (gas: 270973)\n[PASS] testIdleFarmLeavesDenominatorAfterTwelveEpochs() (gas: 23504929)\n[PASS] testLaunchTaxDepositIsAllPoolAndMarketOnly() (gas: 137567)\n[PASS] testMergeRemoved() (gas: 512630)\n[PASS] testPackLobbySellSplit88Team10Heartbeat2() (gas: 407960)\n[PASS] testPackSaleOpensSixtyMinutesAfterLaunch() (gas: 1264387)\n[PASS] testPaidXpCannotBypassAgeGates() (gas: 59083319)\n[PASS] testPaidXpCappedPerDayActivityUncapped() (gas: 13264967)\n[PASS] testPartialRoomIsClippedNotReverted() (gas: 2156541)\n[PASS] testRewardsEarnedBeforeExpiryAreNeverLost() (gas: 47725769)\n[PASS] testSingleWhaleDistrictCannotWinAlone() (gas: 4534340)\n[PASS] testSyncRecommitsFromNextEpoch() (gas: 33379218)\n[PASS] testTokenPacksAlsoWaitForOpening() (gas: 59864)\n[PASS] testTopSpenderTrackingIsExact() (gas: 5411751)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 407.25ms (900.15ms CPU time)\n\nRan 3 tests for test/Gas.t.sol:GasTest\n[PASS] testGasCommonActions() (gas: 10873117)\nLogs:\n  buy token pack: 925868\n  open one pack: 514873\n  equip: 966814\n  repair wallet: 614735\n  enhancement commit: 568464\n  expand: 390489\n  token pack wallet: 655187\n  withdraw: 255483\n  unequip: 407017\n\n[PASS] testGasFullFarmLongIdleBoundedChunks() (gas: 119295605)\nLogs:\n  settle full 24-item farm eight epochs after 40 idle: 12496054\n\n[PASS] testGasTypicalFarmSettlementHasNoBounty() (gas: 8944774)\nLogs:\n  settle typical three-item farm one epoch: 923830\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 539.09ms (573.28ms CPU time)\n\nRan 8 tests for test/V4Integration.t.sol:V4IntegrationTest\n[PASS] testRealV4BuyAndSingleSwapSellTaxConserveSettlement() (gas: 2269489)\n[PASS] testRealV4ManipulatedSpotCannotInstantlySetBuybackQuote() (gas: 1909783)\n[PASS] testRealV4SmallBuyPaysPositiveKeeperMargin() (gas: 2072643)\nLogs:\n  real V4 0.2ETH buy gas: 1933484\n  real V4 buy bounty wei: 48650275000000\n\n[PASS] testRealV4SystemBuyUsesTwapAndOnlySystemFunds() (gas: 2078432)\n[PASS] testRealV4SystemSalesUseDepthTwapNormalFeesAndConserveTokens() (gas: 2247131)\n[PASS] testSystemBuybackOffsetsRecordedSellImbalance() (gas: 2509436)\n[PASS] testTenEthPoolRewardBuyAtSpotTwapIncludesLpFee() (gas: 2151602)\n[PASS] testTenEthPoolSystemSellAtSpotTwapIncludesLpFee() (gas: 4120127)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 411.50ms (16.61ms CPU time)\n\nRan 6 tests for test/Market.t.sol:MarketTest\n[PASS] testBuyChargesExactlyOnePercentAllToRewards() (gas: 1729963)\n[PASS] testFuzzTotalFeeHardCap(uint96) (runs: 256, μ: 1804541, ~: 1809036)\nLogs:\n  Bound result 1732\n\n[PASS] testOnlyManagerCorrectPoolExactInputAndHookAddress() (gas: 111130)\n[PASS] testSingleDumpIncludesItselfAndFeeDecaysWithoutGriefReset() (gas: 17155329)\n[PASS] testTwapAveragesEthPriceAcrossUnequalPrices() (gas: 2330601)\n[PASS] testTwapWarmupAndFlashManipulationResistance() (gas: 1883191)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 506.74ms (528.44ms CPU time)\n\nRan 5 tests for test/FarmDailyBasisV317.t.sol:FarmDailyBasisV317Test\n[PASS] testBasisRisesAtOnceToAHigherSettledYield() (gas: 15550655)\n[PASS] testDecayConstantIsExposed() (gas: 8403)\n[PASS] testProRataEntryEpochIsScaledToItsFullEpochEquivalent() (gas: 8748921)\n[PASS] testStarvingForManyEpochsDecaysGeometricallyNotToTheFloor() (gas: 28087075)\n[PASS] testZeroNetEpochOnlyDecaysTheBasisByOneStep() (gas: 14591209)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 546.72ms (249.43ms CPU time)\n\nRan 6 tests for test/Regression.t.sol:RegressionTest\n[PASS] testCableRepairRestoresOnlyRemainingHalfEpoch() (gas: 11818095)\n[PASS] testEmptyEpochPreservesLastSettledRateButResetsScrapAllowance() (gas: 11008366)\n[PASS] testFuzzCableRepairBlendHandlesNonMonotonicRarityBonuses(uint16) (runs: 256, μ: 1374187, ~: 1374014)\nLogs:\n  Bound result 2\n\n[PASS] testRegisterOnlyAccountsDoNotAddSettlementWorkAndEmptyFarmCanRetire() (gas: 2037709)\n[PASS] testRepairAndPaidPackCannotRetroactivelyBoostEpoch() (gas: 9562743)\n[PASS] testUnlimitedFreshPacksCannotDrainPoolByScrapping() (gas: 9668475)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 576.65ms (633.90ms CPU time)\n\nRan 12 tests for test/AuditV317.t.sol:AuditV317Test\n[PASS] testAdvanceEpochDefersUntilTheRearmedEventResolves() (gas: 1433172)\n[PASS] testDestroyedItemResyncWaitsUntilTheFarmIsCaughtUp() (gas: 12580622)\n[PASS] testDestroyedItemWeightStale() (gas: 10356036)\n[PASS] testEnhancementInsideWindowStillCapturesAndResolvesNormally() (gas: 1164136)\n[PASS] testEnhancementLapseEmitsResolvedAsFailureAndKeepsSoulboundChecks() (gas: 2005877)\n[PASS] testEnhancementRearmGrind() (gas: 53784157)\n[PASS] testOwnerActionClearsThePendingResync() (gas: 8345887)\n[PASS] testSubmittedPlanDiscardedAfterHashWindow() (gas: 1740590)\n[PASS] testUnlockBlockedWhileEpochStale() (gas: 895813)\n[PASS] testUnlockLiveAndCaughtUpStillResyncsWeight() (gas: 58436968)\n[PASS] testUnlockWhileBehindReturnsPrincipalAndSkipsResync() (gas: 56212427)\n[PASS] testUnplannedLapsedWindowAlsoRearmsAndNeverUsesAPrecomputableSeed() (gas: 230726)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 796.36ms (514.15ms CPU time)\n\nRan 2 tests for test/ReservedEventsV35.t.sol:ReservedEventsV35Test\n[PASS] testFuzzReservedFestivalCannotExceedFifteenPercent(uint16) (runs: 256, μ: 4927536, ~: 4927534)\n[PASS] testReservedHeatwaveExtraCoolingWearAndBothProtections() (gas: 10178642)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 929.98ms (938.62ms CPU time)\n\nRan 9 tests for test/Epochs.t.sol:EpochsTest\n[PASS] testCannotAdvanceEarlyAndBountyOnce() (gas: 2513731)\n[PASS] testClaimsEveryEpochAndRedistributionIsNextEpoch() (gas: 12010062)\n[PASS] testGasAdvanceIndependentOfRoster() (gas: 895978527)\nLogs:\n  advance empty roster: 1284212\n  advance 1000 farms: 1473392\n\n[PASS] testNoCatchupEmissionDuringGap() (gas: 6270392)\n[PASS] testNoRetroactiveEquipmentAndBoundedBatches() (gas: 5790681)\n[PASS] testNoWhaleCapHashShares() (gas: 10182869)\n[PASS] testReferralOneLevelSetOnceNoSelf() (gas: 7531610)\n[PASS] testTaxCurveExactAndFloor() (gas: 34112)\n[PASS] testWithdrawFailureRollsBackAndReentrancyCannotClaimTwice() (gas: 7446317)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.76s (4.84s CPU time)\n\nRan 13 tests for test/Events.t.sol:EventsTest\n[PASS] testCheapTariffAppliesCitywide() (gas: 6431880)\n[PASS] testColdPowerFireImmuneAndCleanPowerSurgeImmune() (gas: 7916395)\n[PASS] testFallbackAndExpiredSeedIndependentOfSwarmNumber() (gas: 1788804)\n[PASS] testFireNoCoolingZeroYieldColdPowerImmune() (gas: 6156432)\n[PASS] testGreenWaveRaisesDistrictMiningTenPercent() (gas: 6433957)\n[PASS] testLobbyOwnDistrictSplitDecayAndMinimumWeight() (gas: 1083530)\n[PASS] testOutageAndOffgridRoomMitigation() (gas: 7068792)\n[PASS] testPlansOnlyNextTwoOnceAndBoundedSeverity() (gas: 344926)\n[PASS] testRollingCapsAndInitialPositiveQuotaWithHostilePlans() (gas: 102269963)\n[PASS] testSurgeCanDestroyCommonButNeverLegendary() (gas: 6422908)\n[PASS] testSurgeDamagesExactlyOneItemAndCleanPowerImmune() (gas: 6305934)\n[PASS] testSurgeNeverDestroysLegendaryOrMythic() (gas: 9523164)\n[PASS] testTheftRouterDisabledAndRepairRestores() (gas: 6862770)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 10.79s (458.19ms CPU time)\n\nRan 6 tests for test/SeasonAudit.t.sol:SeasonAuditTest\n[PASS] testAuditThresholdStrictAndNoWhaleSoftCap() (gas: 40508248)\n[PASS] testLotteryEntitlementSurvivesFullInventory() (gas: 131721528)\n[PASS] testPackSupplyDropOnlyActiveFarmsAtDoublePace() (gas: 11743280)\n[PASS] testParameterChangesCannotChangeClosedEpochBetweenBatches() (gas: 12523805)\n[PASS] testSeasonCannotFinalizeEarlyAndExpiredLotteryMustRearm() (gas: 124179117)\n[PASS] testWeeklyThreeDistinctTicketWinnersFuturePackAndBestPrize() (gas: 124934770)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 10.92s (1.34s CPU time)\n\nRan 18 tests for test/EconomyV35.t.sol:EconomyV35Test\n[PASS] testAllEnhancementTableEndpointsAndGlobalBonusCap() (gas: 1477864)\n[PASS] testDurabilityBoundariesAndIdleNoWear() (gas: 38169181)\n[PASS] testEnhanceBurnFailureAndLevelGate() (gas: 1218579)\n[PASS] testEnhanceCapsNoticeUpwardOnlyAndThirtyDays() (gas: 355848)\n[PASS] testEnhanceCommitCannotPlaceScrapOrRetryAndLapsesAsWorstOutcome() (gas: 2423527)\n[PASS] testFeeSalesDepthSlippageCadenceAndNormalFeePot() (gas: 1737855)\n[PASS] testFreeAllowlistOnceWindowStarterScrapAndMetadata() (gas: 3102778)\n[PASS] testFreeRootRemainsFrozenAfterSevenDays() (gas: 43976)\n[PASS] testFreeRootWindowAndIndexLimit() (gas: 55991)\n[PASS] testFuzzPriceCurveDaysBounds(uint32,uint32) (runs: 256, μ: 88577, ~: 90188)\nLogs:\n  Bound result 52490\n\n[PASS] testLockBonusRedistributesWithinReservedEmission() (gas: 11683136)\n[PASS] testLockEscrowNoEarlyExitAndWalletCap() (gas: 5394589)\n[PASS] testQuoteScalesLastSettlementAndHasFloor() (gas: 4285279)\n[PASS] testRepairYieldQuoteAndAutoRepairCreditsOnly() (gas: 10812876)\n[PASS] testRoomsChargeYieldDaysAndRetainAgeGates() (gas: 2618884)\n[PASS] testSystemSellDustCannotOccupyCadenceAndCappedHeartbeatReturnsTokens() (gas: 1562949)\n[PASS] testTokenOnlyGiftSplitsNoEthPeg() (gas: 1738156)\n[PASS] testZapAtomicMinOutPauseAndRefund() (gas: 1441448)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 10.91s (317.76ms CPU time)\n\nRan 9 tests for test/LazyAccounting.t.sol:LazyAccountingTest\n[PASS] testAuditChargesTenPercentEvenAtHalfSeverityAndThresholdIsFrozen() (gas: 6161890)\n[PASS] testClaimCatchesUpWhilePacksPausedAndDoesNotEraseRemainingHistory() (gas: 25641763)\n[PASS] testExhaustedFarmCannotCollectRedistributionByRemainingIdle() (gas: 15191242)\n[PASS] testFuzzLazyEqualsIndependentEagerForRandomFarmsAndAllEvents(uint256) (runs: 256, μ: 45582670, ~: 45594086)\n[PASS] testGlobalAccumulatorAndWeightsAreSnapshottedBeforeMutations() (gas: 9311279)\n[PASS] testLateSeasonSettlementPaysMiningWithoutChangingFrozenWinners() (gas: 59490917)\n[PASS] testOneWeiMiningGreenCannotLockSettlementThroughEnvelopeRounding() (gas: 11069658)\n[PASS] testSparseMatureVintageConsumedBeforeRecentSlotAfterWrap() (gas: 43222421)\n[PASS] testStaleActionsRequireChunksAndNeverBlockGlobalAdvance() (gas: 40505475)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 10.92s (11.28s CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantsTest\n[PASS]\nInvariantsTest invariants:\n[PASS] invariantAllowlistRootAndWalletLimit\n[PASS] invariantInventoryAndEthLiabilities\n[PASS] invariantLocksAndPotAlwaysBacked\n[PASS] invariantPriceAndParamsBounds\n[PASS] invariantReceiptsNeverForfeitOrFixMissingEntropy\n[PASS] invariantReservesBackedAndPendingCovered\n[PASS] invariantTokenConservationNoBurns\n InvariantsTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------+-----------+-------+---------+----------╮\n| Contract    | Selector  | Calls | Reverts | Discards |\n+======================================================+\n| GameHandler | advance   | 605   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | buy       | 592   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | claim     | 554   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | equip     | 596   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | expand    | 605   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | freeClaim | 576   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | fundPot   | 586   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | lock      | 601   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | resolve   | 614   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | rollover  | 552   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | settle    | 579   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | tokenPack | 562   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unlock    | 620   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unplace   | 550   | 0       | 0        |\n╰-------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 19800000000000000\n  Bound result 4900\n  Bound result 65536\n  Bound result 44\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 38.04s (38.01s CPU time)\n\nRan 58 test suites in 38.04s (95.14s CPU time): 355 tests passed, 0 failed, 6 skipped (361 total tests)\n","passed":true},{"durationMs":181,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Billboards.bidBillboard(uint256,uint256,string,string)\",\"Billboards.settleBillboard(uint256,uint256)\",\"Billboards.withdrawRefund()\",\"Civic.announce(uint256,string)\",\"Civic.buyLot(uint256)\",\"Civic.claimWar(uint256)\",\"Civic.consumeCityEvent()\",\"Civic.enable(uint256)\",\"Civic.finishCollapse()\",\"Civic.finishWar()\",\"Civic.fundCollapse(uint256)\",\"Civic.fundWar(uint256)\",\"Civic.grantDistrictBoost(uint256,uint16,string)\",\"Civic.listLot(uint8,uint8,uint8)\",\"Civic.startCollapse(uint256)\",\"Civic.startWar(uint8,uint8)\",\"Economy.autoRepair(address,uint256,uint256[24])\",\"Economy.lock(uint256,uint256)\",\"Economy.unlock()\",\"EndowmentEscrow.forward(address,uint64,uint256,bytes,uint64,uint256,bytes)\",\"Enhancement.activateCap()\",\"Enhancement.announceCap(uint8,string)\",\"Enhancement.capture(uint256)\",\"Enhancement.commit(uint256,uint256,bool)\",\"Enhancement.resolve(uint256)\",\"FarmCore.activity(address,uint256,uint256,uint256)\",\"FarmCore.autoRepair(address,uint256)\",\"FarmCore.buyRoom(uint256,bool)\",\"FarmCore.buyTokenPack(bool)\",\"FarmCore.civicPurchase(address,uint256)\",\"FarmCore.claimDrop()\",\"FarmCore.expand(bool)\",\"FarmCore.grantDrop(address,bytes32)\",\"FarmCore.lobby(uint256,bool)\",\"FarmCore.paidPackBought(address,uint256,uint256)\",\"FarmCore.place(uint256,uint256,uint256)\",\"FarmCore.prepareEnhancement(address,uint256,uint256,bool)\",\"FarmCore.process(address,uint256)\",\"FarmCore.register(address)\",\"FarmCore.repair(uint256,bool)\",\"FarmCore.repairCable(bool)\",\"FarmCore.retire(address)\",\"FarmCore.scrap(uint256,uint256)\",\"FarmCore.setAutoRepair(bool,uint16)\",\"FarmCore.setReferrer(address)\",\"FarmCore.sync()\",\"FarmCore.syncFor(address)\",\"FarmCore.unplace(uint256,uint256)\",\"FarmEngine.process(address,uint256,(uint256[24],uint8[24],uint16[24],bool,uint64,uint16))\",\"FarmItems.destroy(uint256)\",\"FarmItems.equip(address,uint256)\",\"FarmItems.expand(address)\",\"FarmItems.maintain(uint256,uint16,uint8)\",\"FarmItems.mint(address,uint8,uint8,bool)\",\"FarmItems.mintDrop(address,bytes32)\",\"FarmItems.safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\",\"FarmItems.safeTransferFrom(address,address,uint256,uint256,bytes)\",\"FarmItems.unequip(address,uint256)\",\"FarmRewards.advanceEpoch()\",\"FarmRewards.award(address,uint256)\",\"FarmRewards.beginMining(address,uint256)\",\"FarmRewards.claim(uint256)\",\"FarmRewards.flagResync(address)\",\"FarmRewards.initialize(address)\",\"FarmRewards.recordSales(uint256)\",\"FarmRewards.releasePrize(uint256)\",\"FarmRewards.scrap(address,uint256,uint256)\",\"FarmRewards.setReferrer(address,address)\",\"FarmRewards.setWeight(address,uint256)\",\"FarmRewards.settle(address,uint256)\",\"FarmRewards.spend(address,uint256)\",\"FarmRewards.spendTo(address,uint256,address)\",\"FeeRouter.depositBaseFee()\",\"FeeRouter.depositLaunchTax()\",\"FeeRouter.depositLobby()\",\"FeeRouter.depositPack()\",\"FeeRouter.depositSellTax()\",\"FeeRouter.executeBuys(uint256,uint256)\",\"FeeRouter.executePotBuys(uint256,uint256)\",\"FeeRouter.executeSells(uint256,uint256)\",\"FeeRouter.payBounty(address)\",\"FeeRouter.payWork(address,uint8,uint256,uint256)\",\"FeeRouter.receive()\",\"FeeRouter.routeTokens(uint256)\",\"FeeRouter.withdraw()\",\"FeeRouter.zapBuy(uint256,address)\",\"GameRegistry.register(uint256,uint64,uint256,bytes)\",\"GridOperator.lobbyETH()\",\"GridOperator.resolve(uint256)\",\"GridOperator.resolveFor(uint256,address)\",\"GridOperator.shift(uint256)\",\"GridOperator.submitPlan(uint256,uint8,uint16,bytes32,string)\",\"GridOperator.tokenLobby(address,uint256)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\",\"MarketFactory.deploy((address,address,int24,address,address,bytes32),bytes32)\",\"PackSale.buyPackFor(address)\",\"PackSale.buyPacksFor(address,uint256,uint256)\",\"PackSale.buyWithETH(address,uint256,uint256,uint256)\",\"PackSale.captureEntropy(uint256)\",\"PackSale.openPack(uint256)\",\"PackSale.pause(uint256)\",\"PackSale.rearm(uint256)\",\"PackSale.resolve(uint256,uint256)\",\"PackSale.rewardPack(address)\",\"PackSale.tokenPack(address)\",\"PackSale.unpause()\",\"Params.set(uint8,uint256,string)\",\"RewardPool.donate(uint256)\",\"RewardPool.fundEndowment()\",\"RewardPool.pay(address,uint256)\",\"RewardPool.recordInflow(uint256)\",\"RewardPool.recycle(uint256)\",\"RewardPool.reserve(uint256)\",\"Season.addPrize(uint256,uint256)\",\"Season.claimBest(uint256)\",\"Season.claimDistrict(uint256)\",\"Season.claimLottery(uint256)\",\"Season.complete(address,uint256)\",\"Season.depositPot(uint256)\",\"Season.finalize(uint256)\",\"Season.prepare(uint256,uint256)\",\"Season.rearm(uint256)\",\"Season.recordActivity(address,uint256,uint256,uint256)\",\"Season.recordRepair(address,uint256,uint256)\",\"Season.recordSpend(address,uint256,bool)\",\"Season.rollover(uint256)\",\"StandardAdapter.buy(uint256,address)\",\"StandardAdapter.unlockCallback(bytes)\",\"StandardMarket.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"StandardMarket.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"StandardMarket.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"StandardMarket.bindFeeRouter(address,uint64,uint256)\",\"StandardMarket.buy(uint256,address)\",\"StandardMarket.flushFees()\",\"StandardMarket.receive()\",\"StandardMarket.sell(uint256,uint256,address)\",\"StandardMarket.unlockCallback(bytes)\",\"StarterClaim.captureEntropy(uint256)\",\"StarterClaim.claim(uint256,bytes32[])\",\"StarterClaim.claimFree(uint256,bytes32[])\",\"StarterClaim.rearm(uint256)\",\"StarterClaim.resolve(uint256)\",\"SwarmDesk.askBackup(uint8,bytes)\",\"SwarmDesk.bind(address,bytes,bytes,uint64,uint8,uint64,uint8,uint64)\",\"SwarmDesk.clearExpired(bytes32)\",\"SwarmDesk.execute(uint8,bytes)\",\"SwarmDesk.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"SwarmDesk.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"SwarmDesk.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"V4Market.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"V4Market.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"V4Market.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"V4Market.bindFeeRouter(address,uint64,uint256)\",\"V4Market.buy(uint256,address)\",\"V4Market.flushFees()\",\"V4Market.receive()\",\"V4Market.sell(uint256,uint256,address)\",\"V4Market.unlockCallback(bytes)\"],\"files\":{\".gitignore\":8,\"README.md\":93,\"artifacts/build-lint-v3.txt\":2369,\"artifacts/build-v3.txt\":3,\"artifacts/economic-targets-v3.json\":9,\"artifacts/fmt-v3.txt\":0,\"artifacts/foundry-v3.txt\":845,\"artifacts/funded-sensitivity/simulation-v3.json\":13928,\"artifacts/funded-sensitivity/simulation-v3.md\":51,\"artifacts/funding-sensitivity-v3.json\":342,\"artifacts/gas-actions-v3.txt\":15,\"artifacts/policy-sensitivity-v3.json\":554,\"artifacts/python-tests-v3.txt\":18,\"artifacts/regulator-example.json\":59,\"artifacts/robinhood-fork-v3.txt\":7,\"artifacts/runtime-sizes-v3.json\":23,\"artifacts/simulation-v3.json\":13928,\"artifacts/simulation-v3.md\":51,\"artifacts/tuned-funded/simulation-v3.json\":13928,\"artifacts/tuned-funded/simulation-v3.md\":51,\"artifacts/v2/README.md\":3,\"artifacts/v2/foundry-tests.txt\":178,\"artifacts/v2/offline-tests.txt\":187,\"artifacts/v2/offline-verification.json\":21,\"artifacts/v2/previous-README.md\":108,\"artifacts/v2/previous-design.md\":120,\"artifacts/v2/previous-report.md\":75,\"artifacts/v2/previous-security-review.md\":29,\"artifacts/v2/previous-simulation-assumptions.md\":52,\"artifacts/v2/robinhood-fork.txt\":7,\"artifacts/v2/rpc-probe.json\":16,\"artifacts/v2/runtime-sizes.json\":21,\"artifacts/v2/simulation.md\":95,\"artifacts/v2/verification.json\":110,\"artifacts/v31/allocation-summary.md\":6,\"artifacts/v31/baseline-budget.md\":14,\"artifacts/v31/boundary-checks.json\":10880,\"artifacts/v31/candidate-stress/simulation.json\":32636,\"artifacts/v31/evidence/factory-prediction.json\":14,\"artifacts/v31/evidence/launch-and-cost-facts.json\":130,\"artifacts/v31/evidence/standalone-hook-build.json\":38,\"artifacts/v31/final/comparison.md\":50,\"artifacts/v31/funded/comparison.md\":52,\"artifacts/v31/funded/replay.json\":290,\"artifacts/v31/funding-comparison.md\":8,\"artifacts/v31/regulator-example.json\":73,\"artifacts/v31/stress-comparison.md\":20,\"artifacts/v31/summary.json\":13,\"artifacts/v31/validation.json\":250,\"artifacts/v310/forge-test-launch.txt\":496,\"artifacts/v310/forge-test-repo-changed-suites.txt\":115,\"artifacts/v310/forge-test-repo-full-before-new-tests.txt\":437,\"artifacts/v310/pins-check.txt\":2,\"artifacts/v311/rehearsal.log\":377,\"artifacts/v312/forge-fmt.txt\":1,\"artifacts/v312/forge-test-launch.txt\":381,\"artifacts/v312/forge-test-repo.txt\":384,\"artifacts/v312/launch-creation-hashes.txt\":5,\"artifacts/v312/node-tests.txt\":10,\"artifacts/v312/pins-check.txt\":2,\"artifacts/v312/python-tests.txt\":3,\"artifacts/v312/rehearsal.log\":368,\"artifacts/v313/forge-fmt.txt\":0,\"artifacts/v313/forge-test.txt\":468,\"artifacts/v313/launch-creation-hashes.txt\":6,\"artifacts/v313/module-pins.txt\":15,\"artifacts/v313/pins-check.txt\":2,\"artifacts/v314/authority-check.txt\":1,\"artifacts/v314/consistency-check.txt\":1,\"artifacts/v314/creation-hashes.json\":21,\"artifacts/v314/deploy-gate.txt\":1,\"artifacts/v314/flatten-build.txt\":871,\"artifacts/v314/flatten-check.txt\":2,\"artifacts/v314/forge-build.txt\":4752,\"artifacts/v314/forge-fmt.txt\":0,\"artifacts/v314/forge-test.txt\":487,\"artifacts/v314/launch-creation-hashes.txt\":20,\"artifacts/v314/module-pins-check.txt\":1,\"artifacts/v314/node-tests.txt\":22,\"artifacts/v314/python-tests.txt\":39,\"artifacts/v314/rehearsal-build.log\":4895,\"artifacts/v314/rehearsal.log\":352,\"artifacts/v314/runtime-sizes.json\":21,\"artifacts/v314/swarm-pins-check.txt\":1,\"artifacts/v315/creation-hashes.json\":21,\"artifacts/v315/deploy-gate.txt\":1,\"artifacts/v315/forge-build.txt\":1062,\"artifacts/v315/forge-fmt.txt\":0,\"artifacts/v315/forge-test.txt\":412,\"artifacts/v315/launch-creation-hashes.txt\":20,\"artifacts/v315/module-pins-check.txt\":1,\"artifacts/v315/node-tests.txt\":22,\"artifacts/v315/python-tests.txt\":39,\"artifacts/v315/rehearsal-build.log\":4921,\"artifacts/v315/rehearsal.log\":387,\"artifacts/v315/runtime-sizes.json\":21,\"artifacts/v315/swarm-pins-check.txt\":1,\"artifacts/v316/creation-hashes.json\":21,\"artifacts/v316/deploy-gate.txt\":1,\"artifacts/v316/forge-build.txt\":4736,\"artifacts/v316/forge-fmt.txt\":0,\"artifacts/v316/forge-test.txt\":505,\"artifacts/v316/launch-creation-hashes.txt\":20,\"artifacts/v316/module-pins-check.txt\":1,\"artifacts/v316/node-tests.txt\":7,\"artifacts/v316/python-tests.txt\":3,\"artifacts/v316/rehearsal-build.log\":4921,\"artifacts/v316/rehearsal.log\":392,\"artifacts/v316/runtime-sizes.json\":21,\"artifacts/v316/swarm-pins-check.txt\":1,\"artifacts/v317/creation-hashes.json\":21,\"artifacts/v317/deploy-gate.txt\":1,\"artifacts/v317/forge-fmt.txt\":0,\"artifacts/v317/forge-test.txt\":442,\"artifacts/v317/launch-creation-hashes.txt\":20,\"artifacts/v317/module-pins-check.txt\":1,\"artifacts/v317/node-tests.txt\":14,\"artifacts/v317/python-tests.txt\":5,\"artifacts/v317/rehearsal-build.log\":4959,\"artifacts/v317/rehearsal.log\":392,\"artifacts/v317/runtime-sizes.json\":21,\"artifacts/v317/swarm-pins-check.txt\":1,\"artifacts/v318/creation-hashes.json\":21,\"artifacts/v318/deploy-gate.txt\":1,\"artifacts/v318/forge-fmt.txt\":0,\"artifacts/v318/forge-test.txt\":487,\"artifacts/v318/launch-creation-hashes.txt\":20,\"artifacts/v318/module-pins-check.txt\":1,\"artifacts/v318/node-tests.txt\":24,\"artifacts/v318/rehearsal-build.log\":4973,\"artifacts/v318/rehearsal.log\":392,\"artifacts/v318/runtime-sizes.json\":21,\"artifacts/v318/swarm-pins-check.txt\":1,\"artifacts/v32/contract-sizes.json\":54,\"artifacts/v32/forge-build.log\":2734,\"artifacts/v32/forge-fmt.log\":0,\"artifacts/v32/forge-test.log\":310,\"artifacts/v32/model-checks.log\":5,\"artifacts/v32/module-pins.log\":1,\"artifacts/v32/python-tests.log\":25,\"artifacts/v32/regulator-example.json\":73,\"artifacts/v32/simulation-checks.json\":11,\"artifacts/v32/simulation-checks.log\":11,\"artifacts/v32/validation.json\":61,\"artifacts/v32/verified-baseline/comparison.md\":8,\"artifacts/v32/verified-baseline/simulation.json\":22622,\"artifacts/v32/verified-sensitivities/comparison.md\":68,\"artifacts/v33/simulation.json\":116,\"artifacts/v34/build.txt\":2931,\"artifacts/v34/format.txt\":0,\"artifacts/v34/pins.txt\":1,\"artifacts/v34/python-tests.txt\":5,\"artifacts/v34/reveal-test.txt\":1,\"artifacts/v34/simulation.json\":91766,\"artifacts/v34/simulation.md\":43,\"artifacts/v34/tests.txt\":306,\"artifacts/v35/simulation.json\":22605,\"artifacts/v35/simulation.md\":104,\"artifacts/v35/verification.json\":132,\"artifacts/v36/simulation-phases.json\":179,\"artifacts/v36/simulation-phases.md\":13,\"artifacts/v37/byte-sizes.json\":131,\"artifacts/v37/verification.json\":28,\"artifacts/v39/forge-build-repo.txt\":3,\"artifacts/v39/forge-fmt.txt\":1,\"artifacts/v39/forge-test-launch.txt\":8,\"artifacts/v39/forge-test-repo.txt\":390,\"artifacts/v39/pins-check.txt\":2,\"artifacts/v39/pins.json\":68,\"artifacts/v39/runtime-sizes.json\":197,\"artifacts/v39/simulation.json\":381,\"artifacts/v39/simulation.md\":29,\"artifacts/verification-v3.json\":67,\"docs/accepted-v314.md\":10,\"docs/accepted-v315.md\":22,\"docs/accepted-v316.md\":24,\"docs/accepted-v317.md\":46,\"docs/accepted-v318.md\":56,\"docs/api-v35.md\":41,\"docs/blackout-hook-launch.md\":219,\"docs/dependency-provenance.md\":9,\"docs/design.md\":69,\"docs/entropy-v34.md\":31,\"docs/launch-upstream-sha256.json\":518,\"docs/launch-v31.md\":121,\"docs/launch-v314-plan.json\":196,\"docs/launch-v34.md\":44,\"docs/launch-v35.md\":40,\"docs/lazy-accounting-v32.md\":48,\"docs/m2-trust-assumption.md\":121,\"docs/oracle-v37/event.json\":1,\"docs/oracle-v37/oracle-config.json\":21,\"docs/oracle-v37/regulator.json\":1,\"docs/params-keys-v313.md\":113,\"docs/report-v3.md\":143,\"docs/report-v31.md\":128,\"docs/report-v32.md\":138,\"docs/report-v33.md\":107,\"docs/report-v34.md\":58,\"docs/report-v36.md\":89,\"docs/report-v38.md\":83,\"docs/research/b94e6839-platform-report.md\":238,\"docs/review-v31.md\":77,\"docs/review-v32.md\":32,\"docs/review-v33.md\":19,\"docs/review-v34.md\":30,\"docs/review-v35-independent.md\":69,\"docs/review-v37-independent.md\":44,\"docs/review-v39-independent.md\":105,\"docs/security-review.md\":29,\"docs/simulation-assumptions.md\":43,\"docs/simulation-v3-historical.md\":44,\"docs/simulation-v34.md\":34,\"foundry.toml\":21,\"keeper/README.md\":120,\"keeper/blackout-keeper.service\":23,\"keeper/keeper.env.example\":18,\"keeper/keeper.mjs\":578,\"keeper/lib/abi.mjs\":95,\"keeper/lib/eth.mjs\":186,\"keeper/lib/oracle.mjs\":57,\"keeper/wiring.example.json\":17,\"launch-v31.md\":3,\"launch-v36.md\":34,\"launch-v37.md\":144,\"launch-v38.md\":57,\"launch-v39.md\":255,\"launch.json\":35,\"launch/V4Market.sol\":1894,\"operations/dormant-v35.md\":17,\"regulator.md\":60,\"report.md\":537,\"script/Deploy.s.sol\":252,\"script/DeployMarket.s.sol\":15,\"script/PredictGame.s.sol\":49,\"script/SwarmArgs.sol\":38,\"sim/blackout_sim_v2.py\":509,\"sim/blackout_sim_v3.py\":338,\"sim/blackout_sim_v31.py\":24,\"sim/blackout_sim_v32.py\":380,\"sim/blackout_sim_v33.py\":395,\"sim/blackout_sim_v34.py\":444,\"sim/candidate_stress_v31.py\":21,\"sim/heartbeat_boundaries_v31.py\":25,\"sim/heartbeat_sweep_v31.py\":46,\"sim/policy_sensitivity_v3.py\":19,\"sim/run_v32.py\":34,\"sim/run_v33.py\":58,\"sim/run_v34.py\":54,\"sim/run_v35.py\":273,\"sim/run_v36.py\":83,\"sim/run_v39.py\":153,\"sim/tune_v3.py\":16,\"src/Billboards.sol\":135,\"src/Civic.sol\":302,\"src/Economy.sol\":222,\"src/EndowmentEscrow.sol\":111,\"src/Enhancement.sol\":164,\"src/FarmCore.sol\":611,\"src/FarmEngine.sol\":299,\"src/FarmItems.sol\":165,\"src/FarmRewards.sol\":607,\"src/FeeRouter.sol\":313,\"src/GameRegistry.sol\":101,\"src/GridOperator.sol\":276,\"src/LaunchToken.sol\":11,\"src/MarketFactory.sol\":61,\"src/PackSale.sol\":293,\"src/Params.sol\":181,\"src/RewardPool.sol\":113,\"src/Season.sol\":368,\"src/StandardAdapter.sol\":77,\"src/StandardMarket.sol\":22,\"src/StarterClaim.sol\":149,\"src/SwarmDesk.sol\":548,\"src/V4Market.sol\":590,\"src/interfaces/IGame.sol\":53,\"src/interfaces/IGameRegistry.sol\":15,\"src/interfaces/ILaunchHook.sol\":7,\"src/interfaces/IV4.sol\":26,\"src/interfaces/Interfaces.sol\":20,\"src/lib/ChainClock.sol\":22,\"src/lib/EconomyMath.sol\":48,\"src/lib/Errors.sol\":13,\"src/lib/GameModule.sol\":17,\"src/lib/ItemMath.sol\":31,\"src/lib/ItemMetadata.sol\":79,\"src/lib/ModuleCode.sol\":49,\"src/lib/Robinhood.sol\":15,\"src/lib/SwarmCode.sol\":18,\"src/oracle/OracleAttestation.sol\":221,\"src/oracle/SignatureCheckerCompat.sol\":14,\"test/AuditV314.t.sol\":116,\"test/AuditV315.t.sol\":199,\"test/AuditV317.t.sol\":359,\"test/AuditV318.t.sol\":319,\"test/AutoRepairReviewV35.t.sol\":39,\"test/Base.t.sol\":310,\"test/Bounties.t.sol\":290,\"test/CivicV35.t.sol\":224,\"test/Clock.t.sol\":54,\"test/DeployGateV314.t.sol\":94,\"test/Deployment.t.sol\":94,\"test/EconomyV35.t.sol\":398,\"test/Endowment.t.sol\":123,\"test/EndowmentEscrowV38.t.sol\":200,\"test/EndowmentGame.t.sol\":51,\"test/Epochs.t.sol\":177,\"test/Events.t.sol\":252,\"test/Factory.t.sol\":31,\"test/FarmDailyBasisV317.t.sol\":146,\"test/FeesParams.t.sol\":135,\"test/ForeignTokenTwin.t.sol\":288,\"test/Gas.t.sol\":110,\"test/GridV35.t.sol\":66,\"test/HeartbeatBpsV313.t.sol\":149,\"test/HookBinding.t.sol\":113,\"test/Invariants.t.sol\":211,\"test/Items.t.sol\":246,\"test/KeeperProfit.t.sol\":95,\"test/LaunchHook.t.sol\":339,\"test/LaunchToken.t.sol\":188,\"test/LazyAccounting.t.sol\":447,\"test/Market.t.sol\":121,\"test/OracleConformanceV37.t.sol\":105,\"test/Packs.t.sol\":167,\"test/Pause.t.sol\":76,\"test/PhasedReleaseV36.t.sol\":165,\"test/PotV35.t.sol\":106,\"test/PredictionV34.t.sol\":46,\"test/Registry.t.sol\":140,\"test/Regression.t.sol\":156,\"test/ReservedEventsV35.t.sol\":41,\"test/ReviewV34.t.sol\":145,\"test/SeasonAudit.t.sol\":204,\"test/StandardAdapter.t.sol\":81,\"test/StandardMarket.t.sol\":63,\"test/StandardV4Integration.t.sol\":128,\"test/SwarmDeskV37.t.sol\":705,\"test/TwinCaptureV312.t.sol\":255,\"test/V310.t.sol\":79,\"test/V33.t.sol\":561,\"test/V34.t.sol\":315,\"test/V39.t.sol\":213,\"test/V4Integration.t.sol\":229,\"test/WarReviewV35.t.sol\":69,\"test/YieldFloorReviewV35.t.sol\":31,\"test/deploy-gate-v314.test.mjs\":42,\"test/fixtures/keeper-v39-vectors.json\":56,\"test/fixtures/oracle-hash-vectors.json\":102,\"test/fork/RehearsalV311.t.sol\":812,\"test/fork/RobinhoodFork.t.sol\":39,\"test/keeper-v39.test.mjs\":34,\"test/mocks/MockGameRegistry.sol\":52,\"test/mocks/MockMarket.sol\":74,\"test/mocks/MockOracleSigner.sol\":17,\"test/mocks/MockSwarmIntake.sol\":67,\"test/mocks/MockToken.sol\":38,\"test/mocks/MockV4Manager.sol\":118,\"test/oracle-v310.test.mjs\":22,\"test/oracle-v37.test.mjs\":42,\"test/python/test_entropy_bot.py\":31,\"test/python/test_merkle.py\":19,\"test/python/test_regulator.py\":30,\"test/python/test_v31.py\":38,\"test/python/test_v32.py\":58,\"test/python/test_v34.py\":33,\"test/python/test_v35.py\":71,\"test/reveal.test.mjs\":24,\"test/ui-v35.test.mjs\":27,\"tools/check_deploy_gate.mjs\":48,\"tools/check_launch_source.py\":89,\"tools/check_v32_results.py\":52,\"tools/check_v37_authority.py\":20,\"tools/entropy_bot.py\":106,\"tools/freepack_merkle.py\":20,\"tools/make_oracle_bodies.mjs\":45,\"tools/oracle_question_hash.mjs\":80,\"tools/pin_module_code.py\":95,\"tools/pin_swarm_code.py\":48,\"tools/regulator.py\":81,\"tools/rehearse_v311.sh\":28,\"tools/report_v31.py\":55,\"tools/schedule_bodies.mjs\":16,\"tools/starter_merkle.py\":72,\"tools/swarm_constructor_args.mjs\":57,\"ui/app.js\":178,\"ui/index.html\":22,\"ui/reveal.js\":34,\"ui/style.css\":3},\"excluded\":[\"vendor/\",\"node_modules/\"],\"truncated\":true}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a3c57fd754980ff8bd3910ee57d8efc085037bfc13c692e84fe2515077b094d7","verifiedTreeHash":"19a5203890ccc7d900d19cbe9e14ca2e2077e609","verifierVersion":"0.1.0+67c588fa"},{"checks":[{"durationMs":30109,"exitCode":0,"name":"build","output":"Compiling 205 files with Solc 0.8.26\nSolc 0.8.26 finished in 29.94s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n  --> src/lib/EconomyMath.sol:17:48:\n   |\n17 |         returns (uint256 chance, uint256 burn, uint256 bonus, uint256 daysWad)\n   |                                                ^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/lib/EconomyMath.sol:44:5:\n   |\n44 |     function bonus(uint256 level) internal pure returns (uint256 b) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/V4Market.sol:330:22:\n    |\n330 |     function _record(bool sell, uint256 amount) private {\n    |                      ^^^^^^^^^\nNote: The other declaration is here:\n   --> src/V4Market.sol:529:5:\n    |\n529 |     function sell(uint256 amount, uint256 minOut, address recipient) external nonReentrant returns (uint256 received) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n  --> test/mocks/MockSwarmIntake.sol:26:9:\n   |\n26 |         bytes4 failure,\n   |         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n  --> test/mocks/MockSwarmIntake.sol:44:5:\n   |\n44 |     function failure(bytes32 id, uint8 status, bytes32 reason) external returns (bool) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (5159): \"selfdestruct\" has been deprecated. Note that, starting from the Cancun hard fork, the underlying opcode no longer deletes the code and data associated with an account and only transfers its Ether to the beneficiary, unless executed in the same transaction in which the contract was created (see EIP-6780). Any use in newly deployed contracts is strongly discouraged even if the new behavior is taken into account. Future changes to the EVM might further reduce the functionality of the opcode.\n  --> test/blackout/BlackoutInvariant.t.sol:15:9:\n   |\n15 |         selfdestruct(recipient);\n   |         ^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/EndowmentEscrowV38.t.sol:28:9:\n   |\n28 |         LocalApplicationFactory f = LocalApplicationFactory(address(d.registry.factory()));\n   |         ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/EndowmentEscrowV38.t.sol:121:82:\n    |\n121 |     function _registryArgs(address gameToken, address params, uint256 endowment, address factory)\n    |                                                                                  ^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/Events.t.sol:213:9:\n    |\n213 |         uint256 price = d.packs.quote(112);\n    |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n --> test/Gas.t.sol:9:9:\n  |\n9 |         uint256 price = d.packs.price();\n  |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Gas.t.sol:75:9:\n   |\n75 |         uint256 q = d.packs.quote(112);\n   |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Invariants.t.sol:56:9:\n   |\n56 |         uint256 price = d.packs.price();\n   |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Items.t.sol:76:9:\n   |\n76 |         uint256 cost = d.packs.quote(112);\n   |         ^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/Items.t.sol:106:9:\n    |\n106 |         uint256 q = d.packs.quote(16);\n    |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/LazyAccounting.t.sol:186:13:\n    |\n186 |             uint256 quote = d.packs.quote(112);\n    |             ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/LazyAccounting.t.sol:421:9:\n    |\n421 |         uint256 quote = d.packs.quote(112);\n    |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Packs.t.sol:37:9:\n   |\n37 |         uint256 quote = d.packs.quote(200);\n   |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Packs.t.sol:64:9:\n   |\n64 |         uint256 q = d.packs.quote(6);\n   |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Pause.t.sol:35:9:\n   |\n35 |         uint256 q = d.packs.quote(1);\n   |         ^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Registry.t.sol:49:21:\n   |\n49 |     function _fresh(LocalApplicationFactory f) private returns (GameRegistry) {\n   |                     ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Regression.t.sol:73:9:\n   |\n73 |         uint256 previous = d.items.data(id).durability;\n   |         ^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/SwarmDeskV37.t.sol:485:65:\n    |\n485 |     function _registryArgs(address params, bytes32 starterRoot, address factory) private view returns (bytes memory) {\n    |                                                                 ^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/V33.t.sol:254:13:\n    |\n254 |             uint256 q = d.packs.quote(16);\n    |             ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/V33.t.sol:431:9:\n    |\n431 |         uint256 price = d.packs.price();\n    |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/V34.t.sol:78:9:\n   |\n78 |         uint256 q = d.packs.price();\n   |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/V39.t.sol:186:9:\n    |\n186 |         LocalApplicationFactory f = LocalApplicationFactory(address(d.registry.factory()));\n    |         ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/FarmRewards.sol:149:5:\n    |\n149 |     function ready() public view returns (bool) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n   --> test/Base.t.sol:106:5:\n    |\n106 |     function oracleFixture() internal returns (SwarmDesk.OracleConfig memory o) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n   --> test/AuditV315.t.sol:187:5:\n    |\n187 |     function testFixtureDeskBoundAgainstItsTokenLaunchRecord() public {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/fork/RehearsalV311.t.sol:224:5:\n    |\n224 |     function _oracle() internal view returns (SwarmDesk.OracleConfig memory o) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/fork/RehearsalV311.t.sol:283:5:\n    |\n283 |     function _mineHookSalt(bytes memory initCode) internal view returns (bytes32 salt, address hook) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":35914,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/Clock.t.sol:ClockTest\n[PASS] testLocalEvmFutureBlockAnd256BlockBoundary() (gas: 225376)\n[PASS] testRobinhoodUsesArbSysNotL1EstimateAndHandlesExpiry() (gas: 238560)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 193.72µs (110.90µs CPU time)\n\nRan 3 tests for test/AuditV318.t.sol:AuditV318PartialFillTest\n[PASS] testAfterSwapAcceptsExactFillAtEveryStep() (gas: 2199153)\n[PASS] testAfterSwapRefusesAPartialFill() (gas: 415676)\n[PASS] testMockBeforeSwapRefusesNonExtremeLimitAndKeepsExactOutputRefusal() (gas: 197144)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 11.01ms (2.27ms CPU time)\n\nRan 2 tests for test/GridV35.t.sol:GridV35Test\n[PASS] testGreenAndCheapBothFavorTheStableDistrict() (gas: 4110886)\n[PASS] testReservedEventsHaveZeroLaunchWeightAndPlanOnlyWhenEnabled() (gas: 723024)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 17.35ms (8.22ms CPU time)\n\nRan 5 tests for test/AuditV315.t.sol:AuditV315Test\n[PASS] testAttackerLaunchRecordNamesAnotherTokenAndIsRefused() (gas: 10743754)\n[PASS] testFakeMarketEchoingDeskTokenAndHashCannotBind() (gas: 6952035)\n[PASS] testFixtureDeskBoundAgainstItsTokenLaunchRecord() (gas: 58275)\n[PASS] testRealHookRecordedByTheLaunchFactoryBinds() (gas: 12208225)\n[PASS] testRecordWithOtherHookOrOtherPairCurrencyIsRefused() (gas: 6245556)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 17.58ms (8.77ms CPU time)\n\nRan 1 test for test/DeployGateV314.t.sol:DeployGateV314Test\n[PASS] testAllLaunchConstructorsWorkWithNoProtocolCode() (gas: 49350901)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 17.66ms (17.55ms CPU time)\n\nRan 2 tests for test/V310.t.sol:ToolchainPinsV310Test\n[PASS] testEveryModuleOfThisBuildMatchesOneToolchainPin() (gas: 168471)\n[PASS] testPinsAreOneToolchainAndRejectUnknownCode() (gas: 164239)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.88ms (780.13µs CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testConstructorRejectsMissingInputsAndDoesNotCallExternalContracts() (gas: 3994)\n[PASS] testForeignCallerDoesNotGetAnyAuthority() (gas: 43053059)\n[PASS] testImmutableGraphAndEip170Sizes() (gas: 187323)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 21.52ms (5.30ms CPU time)\n\nRan 6 tests for test/ForeignTokenTwin.t.sol:ForeignTokenTwinTest\n[PASS] testBinderBindsTheGenuineRegistryThenAlreadyDone() (gas: 2793336)\n[PASS] testBinderCannotBypassAnyProof() (gas: 7228587)\n[PASS] testForeignTwinCannotBindFromTheAttacker() (gas: 1433024)\n[PASS] testForeignTwinIsSelfConsistentAndPassesEveryProofExceptTheBinder() (gas: 137039)\n[PASS] testNoNonBinderCanBindEitherRegistry() (gas: 2005687)\n[PASS] testZeroBinderRevertsAtConstruction() (gas: 673051)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 22.38ms (9.92ms CPU time)\n\nRan 2 tests for test/Factory.t.sol:FactoryTest\n[PASS] testFactoryInvalidSearchRange() (gas: 4937)\n[PASS] testHookFactoryFlagsImmutableConfigAndIdempotence() (gas: 5999719)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 23.13ms (13.99ms CPU time)\n\nRan 3 tests for test/HookBinding.t.sol:HookBindingTest\n[PASS] testHoldBeforeGameExistsThenBindOnceAndFlushExactStreams() (gas: 43434476)\n[PASS] testLookAlikeCannotBindEvenWhenTeamCalls() (gas: 1908025)\n[PASS] testWrongRouterAndMissingCodeRejectedBeforePermanentBind() (gas: 41150130)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 26.72ms (16.18ms CPU time)\n\nRan 6 tests for test/CivicV35.t.sol:CivicV35Test\n[PASS] testBillboardsBidRefundTextRulesAndPoolOnly() (gas: 945608)\n[PASS] testBlackMarketDescendingLimitedAndPause() (gas: 3828638)\n[PASS] testCollapseSuccessAndSingleOutageFailure() (gas: 810762)\n[PASS] testDormantDisabledAndNoticeOnce() (gas: 303076)\n[PASS] testOnceSeasonBoostBoundsAndSnapshot() (gas: 1722528)\n[PASS] testWarFreezeScoresConservationAndPayoutOnlyOnce() (gas: 1365382)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 28.86ms (11.93ms CPU time)\n\nRan 11 tests for test/blackout/BlackoutFailures.t.sol:BlackoutBindingTest\n[PASS] test_AllStreamsFlushOnceToRealRouterAndAnyoneCanTrigger() (gas: 2801560)\n[PASS] test_BindingRejectsZeroLaunchAndOutOfRangeIndex() (gas: 239321)\n[PASS] test_ChangedFrozenConfigurationCannotBind() (gas: 63200)\n[PASS] test_DeskMustBeBoundAndRegistryMustBeCanonical() (gas: 357886)\n[PASS] test_EachFailedFeeDepositRollsBackAllStreamsAndCanRetry() (gas: 3199473)\n[PASS] test_RealFeeRouterRewardBuyPreservesItsLiabilities() (gas: 2366347)\n[PASS] test_RegistryCoordinatesAndRouterEnrollmentCannotBeForged() (gas: 276159)\n[PASS] test_SystemBuyWarmupBadParametersSlippageAndSuccessfulRetry() (gas: 3733967)\n[PASS] test_SystemSellBoundsAndFailedSlippageRestoreTokensAndAllowance() (gas: 3885624)\n[PASS] test_UnrelatedParamsCannotBindEvenWithTheRightDeskRegistryView() (gas: 105826)\n[PASS] test_WrongRegistryTokenOrMarketCannotBind() (gas: 105362)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 31.06ms (5.23ms CPU time)\n\nRan 5 tests for test/KeeperProfit.t.sol:KeeperProfitTest\n[PASS] testPaidPackEntropyKeeperProfit() (gas: 1182284)\nLogs:\n  paid pack entropy execution gas: 139616\n  paid pack entropy bounty wei: 3380475000000\n  paid pack entropy execution plus 21000 gas cost wei: 3212320000000\n\n[PASS] testPlanEntropyKeeperProfit() (gas: 1665588)\nLogs:\n  plan entropy execution gas: 163211\n  plan entropy bounty wei: 4474800000000\n  plan entropy execution plus 21000 gas cost wei: 3684220000000\n\n[PASS] testSeasonFinalizeThreeWinnersAndPrizeKeeperProfit() (gas: 3451194)\nLogs:\n  season finalize three winners and prize execution gas: 644073\n  season finalize three winners and prize bounty wei: 15825700000000\n  season finalize three winners and prize execution plus 21000 gas cost wei: 13301460000000\n\n[PASS] testSeasonPrepareIsConstantUnpaidWork() (gas: 1342777)\n[PASS] testStarterEntropyKeeperProfit() (gas: 324487)\nLogs:\n  starter entropy execution gas: 142744\n  starter entropy bounty wei: 3380150000000\n  starter entropy execution plus 21000 gas cost wei: 3274880000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 31.80ms (15.85ms CPU time)\n\nRan 6 tests for test/EndowmentEscrowV38.t.sol:EndowmentEscrowV38Test\n[PASS] testConstructorRejectsMissingInputs() (gas: 3911)\n[PASS] testForwardRejectsBadProofs() (gas: 2647974)\n[PASS] testForwardRequiresBalance() (gas: 748474)\n[PASS] testForwardSendsWholeBalanceOnceToAuthenticatedPoolAndFundsEndowment() (gas: 1702540)\n[PASS] testForwardWithRealEndowmentActivatesDrip() (gas: 12904786)\n[PASS] testTwinWithForeignTokenCannotDrainEscrow() (gas: 12918283)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 32.22ms (14.85ms CPU time)\n\nRan 5 tests for test/ReviewV34.t.sol:ReviewV34Test\n[PASS] testCanonicalCompetingRegistryCannotTakeOverBinding() (gas: 9599655)\n[PASS] testDustBuyCannotConsumeGlobalBuyInterval() (gas: 336156)\n[PASS] testLateGreenEntrySettlesWithinReservedEnvelope() (gas: 4441470)\n[PASS] testMeaningfulSmallBuyCanUseLessThanMaximumBatch() (gas: 263646)\n[PASS] testSameConfigurationAtUncommittedCoordinatesCannotBind() (gas: 9686210)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 28.81ms (14.04ms CPU time)\n\nRan 1 test for test/fork/RobinhoodFork.t.sol:RobinhoodForkTest\n[SKIP] testForkArbSysAndHistoricalHash() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 74.69µs (14.41µs CPU time)\n\nRan 7 tests for test/V33.t.sol:LaunchProtectionTest\n[PASS] testBuyTaxHasImmutableSteps() (gas: 97570)\n[PASS] testLaunchTaxChargedAndRoutedEntirelyToPool() (gas: 228018)\n[PASS] testNoBuySizeLimitAtAnyLaunchStep() (gas: 1691629)\n[PASS] testNormalBuyAfterDecayHasNoLaunchTax() (gas: 1479517)\n[PASS] testSellsPayNormalFeeDuringLaunch() (gas: 339501)\n[PASS] testSnipersSplittingBuysStillPayTheCurve() (gas: 657266)\n[PASS] testViewsBeforeInitialization() (gas: 4883854)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 16.97ms (4.12ms CPU time)\n\nRan 3 tests for test/StandardAdapter.t.sol:StandardAdapterTest\n[PASS] testExistingHookKeyPreservedAndNoExtraFee() (gas: 330662)\n[PASS] testRequiresThirtyMinutesFreshOracleAndAuthorizedCallback() (gas: 198351)\n[PASS] testSettlementSlippageFailurePreservesCredits() (gas: 240594)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 13.82ms (1.46ms CPU time)\n\nRan 8 tests for test/FeesParams.t.sol:FeesParamsTest\n[PASS] testAllDefaultParamsWithinHardBounds() (gas: 1255771)\n[PASS] testBuyBackPoolOnlySlippageFailureRollbackAndDustGriefBlocked() (gas: 774066)\n[PASS] testExactEthSplitsHeartbeatCapAndPullPayments() (gas: 512724)\n[PASS] testFuzzNoStepAboveTenPercent(uint96) (runs: 256, μ: 44973, ~: 45115)\nLogs:\n  Bound result 3629\n\n[PASS] testFuzzSplitsConserveEveryWei(uint96) (runs: 256, μ: 206504, ~: 210856)\nLogs:\n  Bound result 3629\n\n[PASS] testHeartbeatCapFixedAtOneEth() (gas: 207904)\n[PASS] testParamsStepCooldownBoundsAuthorityAndLetter() (gas: 195823)\n[PASS] testPoolNoPublicReserveRecycleOrPayment() (gas: 135304)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 67.58ms (59.47ms CPU time)\n\nRan 5 tests for test/AuditV314.t.sol:AuditV314Test\n[PASS] testDustAmountCannotReduceExecutedBatchAndEmptyQueueReverts() (gas: 1383695)\n[PASS] testLaterSameEpochCreditKeepsEarlierTaxVintage() (gas: 608585)\n[PASS] testLockInsertionWalkIsBoundedAndFailureIsAtomic() (gas: 30159768)\n[PASS] testOnlyFarmerCanRetireEvenAnEmptyFarm() (gas: 4306920)\n[PASS] testStaleSellAmountUsesCurrentDepthAndEnforcesCurrentMinimum() (gas: 1624852)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 86.71ms (94.79ms CPU time)\n\nRan 10 tests for test/Bounties.t.sol:BountiesTest\n[PASS] testBuyBountyProportionalCapNoDustCreditAndFailureRollback() (gas: 680020)\n[PASS] testEmptyRosterAndInvalidBatchReceiveNothing() (gas: 1419248)\n[PASS] testEveryWorkKindBoundedByHeartbeatAndAuthorizedProducer() (gas: 64315585)\n[PASS] testLazySettlementUnpaidAndCannotReplay() (gas: 6970276)\n[PASS] testOnlyFinalizePaidOnceAndEmptyWeekUnpaid() (gas: 2292196)\n[PASS] testPackEntropyCapturedOnceWithFullInventoryAndThroughPause() (gas: 3713527)\n[PASS] testPlanResolutionPaidOnceIncludingAdvanceForwarding() (gas: 2934177)\n[PASS] testRemovedWorkBountiesRejectedEvenFromOldProducer() (gas: 179981)\n[PASS] testStarterEntropySurvivesFullInventoryExpiryAndPauseWithoutReplayPayment() (gas: 5324477)\n[PASS] testWorkCreditRespectsZeroGasPricePriceCeilingAndUnitCap() (gas: 333726)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 89.69ms (90.92ms CPU time)\n\nRan 8 tests for test/TwinCaptureV312.t.sol:TwinCaptureV312Test\n[PASS] testBinderChoosingTwinOrphansHonestGame() (gas: 12068523)\n[PASS] testBinderChosenTwinCannotPayAttacker() (gas: 12034732)\n[PASS] testEOAMarketCannotBind() (gas: 5759282)\n[PASS] testHonestBindThenForwardReachesHonestPool() (gas: 6532903)\n[PASS] testHookWithForeignConfigurationCannotBind() (gas: 5801492)\n[PASS] testTwinCannotWinTheBindRace() (gas: 13565631)\n[PASS] testTwinWithForeignMarketCannotBind() (gas: 12270581)\n[PASS] testTwinWithForeignTokenCannotBind() (gas: 12441654)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 27.73ms (19.62ms CPU time)\n\nRan 1 test for test/WarReviewV35.t.sol:IndependentWarReview\n[PASS] testWarWinnerCannotChangeAfterDeadline() (gas: 5734360)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.29ms (1.14ms CPU time)\n\nRan 1 test for test/YieldFloorReviewV35.t.sol:IndependentYieldFloorReview\n[PASS] testFirstEpochItemQuotesKeepNonzeroFloorAtCorrectScale() (gas: 673277)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 876.56µs (783.82µs CPU time)\n\nRan 4 tests for test/OracleConformanceV37.t.sol:OracleConformanceV37Test\n[PASS] testAcceptsOriginalProtocolSignature() (gas: 17934)\n[PASS] testDigestMatchesUnmodifiedProtocolVector() (gas: 13636)\n[PASS] testFreshVectorSignerSignature() (gas: 30385)\n[PASS] testSelectorsExactlyMatchLiveProtocol() (gas: 3520)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.42ms (756.08µs CPU time)\n\nRan 1 test for test/EndowmentGame.t.sol:EndowmentGameTest\n[PASS] testRealMiningCannotSpendFutureEndowment() (gas: 130998353)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 182.50ms (172.91ms CPU time)\n\nRan 8 tests for test/V39.t.sol:V39Test\n[PASS] testBaseDepositsAreEntirelyRewardEth() (gas: 190166)\n[PASS] testGridAcceptsSeverityFromThreeThousandAndRejectsBelow() (gas: 2948508)\n[PASS] testHookAddsExactlyOnePercentOnBuysAndSellsAfterLaunchWindow() (gas: 2180818)\n[PASS] testHookHasNoNetworkShareRecipientOrWithdrawal() (gas: 107646)\n[PASS] testMarketFactoryConfigHasNoNetworkRecipient() (gas: 14199018)\n[PASS] testRegistryAcceptsEitherToolchainPinAndNothingElse() (gas: 590544)\n[PASS] testSellSurchargeStillProgressiveAndCappedAtFifteenPercent() (gas: 1832446)\n[PASS] testStepLaunchTaxUnchangedAndFullyToRewards() (gas: 1292115)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 115.72ms (101.39ms CPU time)\n\nRan 15 tests for test/LaunchHook.t.sol:LaunchHookTest\n[PASS] testAcceptedManagerFloatConstraintOnTokenOnlyPool() (gas: 438507)\n[PASS] testAllCallbacksRejectNonManagerEvenWithCorrectPool() (gas: 159896)\n[PASS] testAnotherSenderCannotInitializeFactoryPool() (gas: 234464)\n[PASS] testExactOutputAndZeroInputRefusedInBothDirections() (gas: 383766)\n[PASS] testFactoryInitializesOnceThroughRealPoolManager() (gas: 204494)\n[PASS] testFeesHeldAndFlushRefusedUntilDeskAndRouterBind() (gas: 782750)\n[PASS] testFuzzBuyStepsConserveEthAndTokens(uint96,uint16) (runs: 256, μ: 1332053, ~: 1062293)\nLogs:\n  Bound result 9999999999999016022\n  Bound result 10\n\n[PASS] testHookHasNoOwnerOrUpgradeEntryPoint() (gas: 9058924)\n[PASS] testManagerCannotDriveCallbacksForAnotherPool() (gas: 99574)\n[PASS] testPartialFillRefusedWithExactError() (gas: 195454)\n[PASS] testPermissionsMatchV4CoreABIAndMinedAddress() (gas: 26115)\n[PASS] testPinnedCreationHashAndRuntimeSize() (gas: 115688)\n[PASS] testPriceLimitedBuyRefusedBeforeFundsMove() (gas: 543405)\n[PASS] testSellFeesAccrueOnActualOutputAndFactoryCanCollect() (gas: 2611271)\n[PASS] testWrongPoolTermsCannotInitialize() (gas: 282717)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 159.35ms (141.68ms CPU time)\n\nRan 3 tests for test/Pause.t.sol:PauseTest\n[PASS] testOnlySwarmBoundedDurationAndCannotExtendPause() (gas: 242972)\n[PASS] testSalePausedWhileEntropyClaimsWithdrawalsAndEpochsContinue() (gas: 15148717)\n[PASS] testUnpauseCannotResetNextPauseCooldown() (gas: 194647)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 57.76ms (49.32ms CPU time)\n\nRan 2 tests for test/StandardMarket.t.sol:StandardMarketTest\n[PASS] testFuzzStandardSellNeverAddsProgressiveSurcharge(uint96) (runs: 256, μ: 1803175, ~: 1813765)\nLogs:\n  Bound result 840\n\n[PASS] testStandardBuyOnePercentAllToRewards() (gas: 1673334)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 175.25ms (162.82ms CPU time)\n\nRan 21 tests for test/SwarmDeskV37.t.sol:SwarmDeskV37Test\n[PASS] testBackupFailureUnknownFailureDeadlineAndPriceCap() (gas: 751317)\n[PASS] testBackupPullsExactPriceRecordsRequestAndRestrictsBodyAndCadence() (gas: 1207764)\n[PASS] testDeskSetHeartbeatBpsMovesFeeRouterShare() (gas: 945834)\n[PASS] testEmptyChainConstructorAndAuthenticatedBindingRejectSpoofs() (gas: 12683178)\n[PASS] testEventClampingAndFallbackWithoutAnswer() (gas: 1117363)\n[PASS] testExpiredOldSlotOldEpochAndUnexecutedAnswersNeverAct() (gas: 852773)\n[PASS] testFlatConstructorRejectsUnusedPackedBits() (gas: 7335783)\n[PASS] testForgedTamperedWrongSignerWrongDomainAndCallerRejected() (gas: 359833)\n[PASS] testFutureIssueWrongTypeMalformedLengthAndPriceNeverConsume() (gas: 327553)\n[PASS] testFuzzEveryParamHardBoundsAndTenPercentStep(uint8,uint248) (runs: 256, μ: 476013, ~: 477836)\nLogs:\n  Bound result 3\n\n[PASS] testNextSlotAcceptsSameQuestionAndChangedExecutionBytesReject() (gas: 1146136)\n[PASS] testNoAdminPathsAndEntireGraphUsesDesk() (gas: 428356)\n[PASS] testNoopRegulatorAcceptedAndParamsCooldownPreserved() (gas: 452656)\n[PASS] testRegulatorClampsParamsAnnouncesPhasesAndThirtyDayCaps() (gas: 1146623)\n[PASS] testRegulatorSkipsOutOfRangeKeysInsteadOfClampingToFortyFive() (gas: 501093)\n[PASS] testReplayDifferentSourceAndSecondAnswerSameSlotIgnored() (gas: 1068212)\n[PASS] testRobinhoodNativeClockCallbackWithin200k() (gas: 352907)\n[PASS] testScheduleDeliveryStoresUnder200kThenExecutesTwoPlans() (gas: 984580)\n[PASS] testSubmitRelayAcceptsAttestedAnswerFromAnyoneOnce() (gas: 1092075)\n[PASS] testSubmitRelayRejectsForgedWrongQuestionStaleAndMalformed() (gas: 1843104)\n[PASS] testWrongQuestionUnknownRequestWeakPanelAndWindowRejected() (gas: 364850)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 159.14ms (167.37ms CPU time)\n\nRan 5 tests for test/Registry.t.sol:RegistryTest\n[PASS] testAllModulePinsMatchExactPinnedCompilerArtifacts() (gas: 1068880)\n[PASS] testAuthenticatedEnrollmentRejectsUncreatedWrongCodeAndWrongRegistry() (gas: 2930598)\n[PASS] testConstructorAcceptsEmptyGraphWithoutExternalCalls() (gas: 13657)\n[PASS] testCounterfeitRuntimeAtAnotherFactoryCannotEnroll() (gas: 1542191)\n[PASS] testCounterfeitRuntimeWithPoisonedCreditCannotEnroll() (gas: 5876476)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 11.33ms (3.84ms CPU time)\n\nRan 3 tests for test/PotV35.t.sol:PotV35Test\n[PASS] testPotDepositRequiresActualTokensAndAuthority() (gas: 256924)\n[PASS] testPotSplitAndLotteryCommitSurvivesFullInventory() (gas: 11851210)\n[PASS] testPotUnclaimedRolloverOnlyAfterFourWeeksNoDoubleClaim() (gas: 6429769)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 25.50ms (17.90ms CPU time)\n\nRan 5 tests for test/fork/RehearsalV311.t.sol:RehearsalV311Test\n[SKIP] testRehearsalAttestedAnswerChangesPlanWithinBand() (gas: 0)\n[SKIP] testRehearsalGasPerLaunchUnderPlatformCeiling() (gas: 0)\n[SKIP] testRehearsalKeeperPassAdvancesEpochsRevealsEntropyAndClaimFeesPaysTeam() (gas: 0)\n[SKIP] testRehearsalLaunchTaxThenOnePercentAndSurcharge() (gas: 0)\n[SKIP] testRehearsalPacksOpenOneHourAfterLaunch() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 429.18µs (60.23µs CPU time)\n\nRan 13 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testCannotSpendAnotherHoldersBalanceWithoutAllowance() (gas: 57645)\n[PASS] testFactoryReceivesEntireSupplyInsteadOfOriginOrCaller() (gas: 211614)\n[PASS] testFuzzTransferFromSpendsOnlyApprovedAmount(uint256,uint256) (runs: 256, μ: 166624, ~: 167724)\nLogs:\n  Bound result 1508857331349\n  Bound result 1338239256118\n\n[PASS] testFuzzTransfersConserveSupplyWithoutFees(uint256) (runs: 256, μ: 151143, ~: 151044)\nLogs:\n  Bound result 507\n\n[PASS] testInfiniteAllowanceRetainedAndCanBeRevoked() (gas: 188186)\n[PASS] testLaunchAllocationsAndSubsequentEndowmentTransferArePlainTransfers() (gas: 286616)\n[PASS] testMetadataAndFixedSupply() (gas: 52708)\n[PASS] testNoMintBurnOwnerPauseBlacklistOrUpgradeEntryPoints() (gas: 510976)\n[PASS] testRuntimeHasNoUpgradeOrDestructionOpcodes() (gas: 778334)\n[PASS] testTransferAboveBalanceRevertsWithoutChangingSupply() (gas: 54899)\n[PASS] testTransferFromFailureRestoresAllowance() (gas: 109283)\n[PASS] testZeroAndSelfTransfers() (gas: 95974)\n[PASS] testZeroRecipientAndSpenderRejected() (gas: 61397)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 39.49ms (39.02ms CPU time)\n\nRan 1 test for test/PredictionV34.t.sol:PredictionV34Test\n[PASS] testFullGraphPredictsPoolBeforeRegistryDeployment() (gas: 4162727)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.68ms (743.33µs CPU time)\n\nRan 1 test for test/StandardV4Integration.t.sol:StandardV4IntegrationTest\n[PASS] testStandardAdapterRealPoolPaysExistingHookExactlyOnce() (gas: 1949103)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 53.02ms (1.61ms CPU time)\n\nRan 8 tests for test/V4Integration.t.sol:V4IntegrationTest\n[PASS] testRealV4BuyAndSingleSwapSellTaxConserveSettlement() (gas: 2269489)\n[PASS] testRealV4ManipulatedSpotCannotInstantlySetBuybackQuote() (gas: 1909783)\n[PASS] testRealV4SmallBuyPaysPositiveKeeperMargin() (gas: 2072643)\nLogs:\n  real V4 0.2ETH buy gas: 1933484\n  real V4 buy bounty wei: 48650275000000\n\n[PASS] testRealV4SystemBuyUsesTwapAndOnlySystemFunds() (gas: 2078432)\n[PASS] testRealV4SystemSalesUseDepthTwapNormalFeesAndConserveTokens() (gas: 2247131)\n[PASS] testSystemBuybackOffsetsRecordedSellImbalance() (gas: 2509436)\n[PASS] testTenEthPoolRewardBuyAtSpotTwapIncludesLpFee() (gas: 2151602)\n[PASS] testTenEthPoolSystemSellAtSpotTwapIncludesLpFee() (gas: 4120127)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 67.20ms (11.98ms CPU time)\n\nRan 5 tests for test/FarmDailyBasisV317.t.sol:FarmDailyBasisV317Test\n[PASS] testBasisRisesAtOnceToAHigherSettledYield() (gas: 15550655)\n[PASS] testDecayConstantIsExposed() (gas: 8403)\n[PASS] testProRataEntryEpochIsScaledToItsFullEpochEquivalent() (gas: 8748921)\n[PASS] testStarvingForManyEpochsDecaysGeometricallyNotToTheFloor() (gas: 28087075)\n[PASS] testZeroNetEpochOnlyDecaysTheBasisByOneStep() (gas: 14591209)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 253.37ms (209.69ms CPU time)\n\nRan 12 tests for test/AuditV317.t.sol:AuditV317Test\n[PASS] testAdvanceEpochDefersUntilTheRearmedEventResolves() (gas: 1433172)\n[PASS] testDestroyedItemResyncWaitsUntilTheFarmIsCaughtUp() (gas: 12580622)\n[PASS] testDestroyedItemWeightStale() (gas: 10356036)\n[PASS] testEnhancementInsideWindowStillCapturesAndResolvesNormally() (gas: 1164136)\n[PASS] testEnhancementLapseEmitsResolvedAsFailureAndKeepsSoulboundChecks() (gas: 2005877)\n[PASS] testEnhancementRearmGrind() (gas: 53784157)\n[PASS] testOwnerActionClearsThePendingResync() (gas: 8345887)\n[PASS] testSubmittedPlanDiscardedAfterHashWindow() (gas: 1740590)\n[PASS] testUnlockBlockedWhileEpochStale() (gas: 895813)\n[PASS] testUnlockLiveAndCaughtUpStillResyncsWeight() (gas: 58436968)\n[PASS] testUnlockWhileBehindReturnsPrincipalAndSkipsResync() (gas: 56212427)\n[PASS] testUnplannedLapsedWindowAlsoRearmsAndNeverUsesAPrecomputableSeed() (gas: 230726)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 266.27ms (416.50ms CPU time)\n\nRan 13 tests for test/Events.t.sol:EventsTest\n[PASS] testCheapTariffAppliesCitywide() (gas: 6431880)\n[PASS] testColdPowerFireImmuneAndCleanPowerSurgeImmune() (gas: 7916395)\n[PASS] testFallbackAndExpiredSeedIndependentOfSwarmNumber() (gas: 1788804)\n[PASS] testFireNoCoolingZeroYieldColdPowerImmune() (gas: 6156432)\n[PASS] testGreenWaveRaisesDistrictMiningTenPercent() (gas: 6433957)\n[PASS] testLobbyOwnDistrictSplitDecayAndMinimumWeight() (gas: 1083530)\n[PASS] testOutageAndOffgridRoomMitigation() (gas: 7068792)\n[PASS] testPlansOnlyNextTwoOnceAndBoundedSeverity() (gas: 344926)\n[PASS] testRollingCapsAndInitialPositiveQuotaWithHostilePlans() (gas: 102269963)\n[PASS] testSurgeCanDestroyCommonButNeverLegendary() (gas: 6422908)\n[PASS] testSurgeDamagesExactlyOneItemAndCleanPowerImmune() (gas: 6305934)\n[PASS] testSurgeNeverDestroysLegendaryOrMythic() (gas: 9523164)\n[PASS] testTheftRouterDisabledAndRepairRestores() (gas: 6862770)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 268.78ms (335.16ms CPU time)\n\nRan 14 tests for test/V34.t.sol:V34Test\n[PASS] testBestFarmCapsAbsoluteSpendAndBreaksTiesByAddress() (gas: 4665724)\n[PASS] testBestFarmNeedsTwentyEpochsAndUsesCappedAbsoluteSpend() (gas: 4144232)\n[PASS] testBuybackSlippage150BpsMaxAndIntervalCannotBeBypassed() (gas: 756212)\n[PASS] testDonationsAndOrdinaryInflowsCannotPretendToBeEndowment() (gas: 1520675)\n[PASS] testEntropyAt256BoundaryAndAt257RearmsWithoutPayOrMint() (gas: 3283396)\n[PASS] testFirstRewardStartsCurrentEpochAtHalfTimeAndSnapshotCannotBeReplaced() (gas: 4843822)\n[PASS] testFreeFarmDoesNotDiluteDistrictOrClaimPaidPrize() (gas: 4739687)\n[PASS] testGameReadinessBothChecksRollbackEthAndTokenPurchase() (gas: 3618362)\n[PASS] testHookUninitializedCannotOpenOrStartEpochAndCallerCannotStartClock() (gas: 6045893)\n[PASS] testLaunchTaxExactBoundaries() (gas: 5929129)\n[PASS] testMythicGateEvaluatedAtRevealNotAtPayment() (gas: 1624053)\n[PASS] testPackOpeningFollowsHookAndNotLegacyDeployTimestamp() (gas: 101151)\n[PASS] testRemainderTransferredToPredictedPoolBeforeDeploymentAndNoApprovalNeeded() (gas: 2463041)\n[PASS] testStarterEntropyRearmsAfterClaimWindowAndNoDoubleMint() (gas: 772310)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 229.20ms (63.30ms CPU time)\n\nRan 2 tests for test/AutoRepairReviewV35.t.sol:IndependentAutoRepairReview\n[PASS] testAutomaticRepairRecordsHistoricalWeekBeforeCompletion() (gas: 5411876)\n[PASS] testLateAutomaticRepairCannotReopenSeasonEligibility() (gas: 4275820)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 356.04ms (17.42ms CPU time)\n\nRan 7 tests for test/HeartbeatBpsV313.t.sol:HeartbeatBpsV313Test\n[PASS] testFuzzAnyShareConservesEveryWeiAndNeverMovesTeamOrPot(uint16,uint96) (runs: 256, μ: 1341454, ~: 1557616)\nLogs:\n  Bound result 201\n  Bound result 21127798574346\n\n[PASS] testLaunchDefaultIsTwoPercentAndSplitUnchanged() (gas: 230935)\n[PASS] testLoweredShareBackToFloorAndFloorIsHard() (gas: 401104)\n[PASS] testMaximumShareWithPotEnabledIsClippedToWhatIsLeft() (gas: 1867739)\n[PASS] testOnlyTheSwarmWithinBoundsStepAndCooldownCanMoveTheShare() (gas: 341795)\n[PASS] testRaisedShareStillStopsAtTheOneEthCap() (gas: 480520)\n[PASS] testSwarmSet220CreditsTwoPointTwoPercentOfSurchargeAndTokens() (gas: 543701)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 412.68ms (409.38ms CPU time)\n\nRan 3 tests for test/Gas.t.sol:GasTest\n[PASS] testGasCommonActions() (gas: 10873117)\nLogs:\n  buy token pack: 925868\n  open one pack: 514873\n  equip: 966814\n  repair wallet: 614735\n  enhancement commit: 568464\n  expand: 390489\n  token pack wallet: 655187\n  withdraw: 255483\n  unequip: 407017\n\n[PASS] testGasFullFarmLongIdleBoundedChunks() (gas: 119295605)\nLogs:\n  settle full 24-item farm eight epochs after 40 idle: 12496054\n\n[PASS] testGasTypicalFarmSettlementHasNoBounty() (gas: 8944774)\nLogs:\n  settle typical three-item farm one epoch: 923830\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 513.93ms (524.13ms CPU time)\n\nRan 11 tests for test/Items.t.sol:ItemsTest\n[PASS] testComputeHashSupportHashAndBonusesReplaceDuo() (gas: 4715342)\n[PASS] testDurabilityWearRepairAndEnhancementMetadataPreserved() (gas: 8393341)\n[PASS] testEquipRarityGatesAndMythicGate() (gas: 4162922)\n[PASS] testFullStackRarityCapAndRoomFlags() (gas: 7665589)\n[PASS] testInventoryMintCannotExceedCapacityAndExpansionRises() (gas: 3356807)\n[PASS] testLockedItemCannotBeScrappedUntilEpochRolls() (gas: 5989066)\n[PASS] testOffgridSavings() (gas: 2711135)\n[PASS] testPaidXpCannotBypassRoomTwoAgeGate() (gas: 3746447)\n[PASS] testRoomGatesAndLevelProgression() (gas: 78475814)\n[PASS] testScrapPaysPoolYieldAndCannotRepeat() (gas: 7561671)\n[PASS] testSoulboundOnlyOwnFarmAndNoDuplicateTypes() (gas: 2265957)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 564.67ms (345.67ms CPU time)\n\nRan 9 tests for test/Packs.t.sol:PacksTest\n[PASS] testExactPaymentAndFutureBlockRequired() (gas: 1671228)\n[PASS] testExactRarityThresholdsAndMythicGate() (gas: 282935)\n[PASS] testExpiryRearmsWithoutMintingAndInventoryOpeningLimit() (gas: 3797222)\n[PASS] testFuzzVrgdaAlwaysBounded(uint32,uint32) (runs: 256, μ: 61362, ~: 63085)\nLogs:\n  Bound result 52490\n\n[PASS] testItemTypeDistributionExact() (gas: 626492)\n[PASS] testNoWalletGlobalOrTokenPackDailyLimit() (gas: 4392810)\n[PASS] testStarterWindowProofTokenIdOnceAndInventoryFailureRetry() (gas: 881490)\n[PASS] testTokenPackSameQuoteAndSplitWhenUsingWalletOrCredits() (gas: 76592671)\n[PASS] testVrgdaInitialStepDecayFloorCeilingAndBulkPricing() (gas: 1299987)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 414.00ms (279.38ms CPU time)\n\nRan 18 tests for test/EconomyV35.t.sol:EconomyV35Test\n[PASS] testAllEnhancementTableEndpointsAndGlobalBonusCap() (gas: 1477864)\n[PASS] testDurabilityBoundariesAndIdleNoWear() (gas: 38169181)\n[PASS] testEnhanceBurnFailureAndLevelGate() (gas: 1218579)\n[PASS] testEnhanceCapsNoticeUpwardOnlyAndThirtyDays() (gas: 355848)\n[PASS] testEnhanceCommitCannotPlaceScrapOrRetryAndLapsesAsWorstOutcome() (gas: 2423527)\n[PASS] testFeeSalesDepthSlippageCadenceAndNormalFeePot() (gas: 1737855)\n[PASS] testFreeAllowlistOnceWindowStarterScrapAndMetadata() (gas: 3102778)\n[PASS] testFreeRootRemainsFrozenAfterSevenDays() (gas: 43976)\n[PASS] testFreeRootWindowAndIndexLimit() (gas: 55991)\n[PASS] testFuzzPriceCurveDaysBounds(uint32,uint32) (runs: 256, μ: 88602, ~: 90188)\nLogs:\n  Bound result 52490\n\n[PASS] testLockBonusRedistributesWithinReservedEmission() (gas: 11683136)\n[PASS] testLockEscrowNoEarlyExitAndWalletCap() (gas: 5394589)\n[PASS] testQuoteScalesLastSettlementAndHasFloor() (gas: 4285279)\n[PASS] testRepairYieldQuoteAndAutoRepairCreditsOnly() (gas: 10812876)\n[PASS] testRoomsChargeYieldDaysAndRetainAgeGates() (gas: 2618884)\n[PASS] testSystemSellDustCannotOccupyCadenceAndCappedHeartbeatReturnsTokens() (gas: 1562949)\n[PASS] testTokenOnlyGiftSplitsNoEthPeg() (gas: 1738156)\n[PASS] testZapAtomicMinOutPauseAndRefund() (gas: 1441448)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 564.88ms (273.03ms CPU time)\n\nRan 20 tests for test/V33.t.sol:V33Test\n[PASS] testActionBeforeExpiryMovesBucketWithoutDoubleCount() (gas: 25983504)\n[PASS] testAdvanceIsConstantInExpiringFarms() (gas: 38430108)\n[PASS] testAgeCapsAtBoundaries() (gas: 204552)\n[PASS] testClaimDoesNotRecommitWhileBehind() (gas: 37239808)\n[PASS] testClaimRecommitsAndPackRecommits() (gas: 60787577)\n[PASS] testDistrictScoreAveragePerFarmAndTenPercentWalletCap() (gas: 4607489)\n[PASS] testHeartbeatCapExcessGoesToPoolAndBaseFeeIsAllRewards() (gas: 270973)\n[PASS] testIdleFarmLeavesDenominatorAfterTwelveEpochs() (gas: 23504929)\n[PASS] testLaunchTaxDepositIsAllPoolAndMarketOnly() (gas: 137567)\n[PASS] testMergeRemoved() (gas: 512630)\n[PASS] testPackLobbySellSplit88Team10Heartbeat2() (gas: 407960)\n[PASS] testPackSaleOpensSixtyMinutesAfterLaunch() (gas: 1264387)\n[PASS] testPaidXpCannotBypassAgeGates() (gas: 59083319)\n[PASS] testPaidXpCappedPerDayActivityUncapped() (gas: 13264967)\n[PASS] testPartialRoomIsClippedNotReverted() (gas: 2156541)\n[PASS] testRewardsEarnedBeforeExpiryAreNeverLost() (gas: 47725769)\n[PASS] testSingleWhaleDistrictCannotWinAlone() (gas: 4534340)\n[PASS] testSyncRecommitsFromNextEpoch() (gas: 33379218)\n[PASS] testTokenPacksAlsoWaitForOpening() (gas: 59864)\n[PASS] testTopSpenderTrackingIsExact() (gas: 5411751)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 528.27ms (854.28ms CPU time)\n\nRan 2 tests for test/ReservedEventsV35.t.sol:ReservedEventsV35Test\n[PASS] testFuzzReservedFestivalCannotExceedFifteenPercent(uint16) (runs: 256, μ: 4927536, ~: 4927534)\n[PASS] testReservedHeatwaveExtraCoolingWearAndBothProtections() (gas: 10178642)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 672.88ms (693.59ms CPU time)\n\nRan 8 tests for test/PhasedReleaseV36.t.sol:PhasedReleaseV36Test\n[PASS] testBillboardsDisabledThenEnabled() (gas: 414524)\n[PASS] testEnableIsNoticedOnceNeverOffAndSwarmOnly() (gas: 355991)\n[PASS] testEnhancementDisabledThenEnabledOnce() (gas: 1098908)\n[PASS] testEverythingDeploysDisabledAndCoreStillWorks() (gas: 8179262)\n[PASS] testFuzzUnannouncedFeatureCannotBeEnabled(uint256) (runs: 256, μ: 30151, ~: 29962)\n[PASS] testLocksStakeAndLobbyDisabledThenEnabled() (gas: 2861203)\n[PASS] testPotDisabledFollowsV34RoutingThenEnabled() (gas: 455827)\n[PASS] testReservedEventsDisabledThenEnabled() (gas: 557745)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 708.29ms (34.09ms CPU time)\n\nRan 12 tests for test/blackout/BlackoutFailures.t.sol:BlackoutFailureTest\n[PASS] testFuzz_BuySellRoundTripCannotCreateValue(uint96,uint32) (runs: 1000, μ: 1701521, ~: 2178580)\nLogs:\n  Bound result 790856284251\n  Bound result 78\n\n[PASS] testFuzz_PartialSellRefundsUnusedTokensAndTaxesOnlyOutput(uint96,uint16) (runs: 1000, μ: 1950916, ~: 1950963)\nLogs:\n  Bound result 100000000000000000002\n  Bound result 54\n\n[PASS] test_BuyTaxTransitionsAtExactSecondBoundaries() (gas: 4804595)\n[PASS] test_ConstructorRejectsEachMissingIdentityAndWrongPoolPolicy() (gas: 1562325)\n[PASS] test_EveryPoolKeyWordIsAuthenticated() (gas: 541421)\n[PASS] test_OneWeiAndTaxRoundingEdgesNeverOvercharge() (gas: 8821515)\n[PASS] test_SwapSlippageFailureRollsBackPoolFeesAndOracle() (gas: 3552283)\n[PASS] test_TwapWarmupAndLongIdleRecovery() (gas: 2593753)\n[PASS] test_UnlockCallbackRequiresActiveSystemOperationEvenFromManager() (gas: 112778)\n[PASS] test_ValidConstructorArgumentsStillRequirePermissionAddress() (gas: 373738)\n[PASS] test_VolumeWindowsExpireAtTheirBucketBoundaries() (gas: 2637118)\n[PASS] test_WrongPriceLimitBubblesExactHookErrorAndRollsBack() (gas: 145641)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 902.71ms (1.56s CPU time)\n\nRan 9 tests for test/Epochs.t.sol:EpochsTest\n[PASS] testCannotAdvanceEarlyAndBountyOnce() (gas: 2513731)\n[PASS] testClaimsEveryEpochAndRedistributionIsNextEpoch() (gas: 12010062)\n[PASS] testGasAdvanceIndependentOfRoster() (gas: 895978527)\nLogs:\n  advance empty roster: 1284212\n  advance 1000 farms: 1473392\n\n[PASS] testNoCatchupEmissionDuringGap() (gas: 6270392)\n[PASS] testNoRetroactiveEquipmentAndBoundedBatches() (gas: 5790681)\n[PASS] testNoWhaleCapHashShares() (gas: 10182869)\n[PASS] testReferralOneLevelSetOnceNoSelf() (gas: 7531610)\n[PASS] testTaxCurveExactAndFloor() (gas: 34112)\n[PASS] testWithdrawFailureRollsBackAndReentrancyCannotClaimTwice() (gas: 7446317)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 5.01s (5.07s CPU time)\n\nRan 2 tests for test/blackout/BlackoutTokenInvariant.t.sol:BlackoutTokenInvariantTest\n[PASS]\nBlackoutTokenInvariantTest invariants:\n[PASS] invariant_BalancesAndAllowancesMatchAuthorizedHistory\n[PASS] invariant_FixedSupplyEqualsEveryHolderBalance\n BlackoutTokenInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭----------------------+----------------------+-------+---------+----------╮\n| Contract             | Selector             | Calls | Reverts | Discards |\n+==========================================================================+\n| BlackoutTokenHandler | approve              | 3078  | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| BlackoutTokenHandler | fullBalanceRoundTrip | 3083  | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| BlackoutTokenHandler | rejectMintAndBurn    | 3088  | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| BlackoutTokenHandler | rejectOverspend      | 3035  | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| BlackoutTokenHandler | rejectZeroReceiver   | 2994  | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| BlackoutTokenHandler | revokeAndRejectSpend | 3087  | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| BlackoutTokenHandler | spend                | 3116  | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| BlackoutTokenHandler | transfer             | 3095  | 0       | 0        |\n╰----------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4595\n  Bound result 999999999999999999999995405\n  Bound result 999999999999999999999995405\n  Bound result 8447\n  Bound result 0\n  Bound result 0\n  Bound result 139644302\n  Bound result 0\n  Bound result 0\n  Bound result 4595\n  Bound result 4595\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 999999999999999999999995405\n  Bound result 999999999999999999999995405\n  Bound result 0\n  Bound result 8736\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 3846\n  Bound result 976\n  Bound result 200000\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 777005\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 987921097565491182813877026\n  Bound result 3785\n  Bound result 270\n  Bound result 1801\n  Bound result 999999999999999999999996381\n  Bound result 999999999999999999999996381\n  Bound result 999999999999999999999996381\n  Bound result 999999999999999999999996381\n  Bound result 0\n  Bound result 1633\n  Bound result 31000000000000000\n  Bound result 40\n  Bound result 8358\n  Bound result 999999999999999999999988063\n  Bound result 999999999999999999999988063\n  Bound result 8131\n  Bound result 0\n  Bound result 46630\n  Bound result 1903\n  Bound result 1903\n  Bound result 0\n  Bound result 0\n  Bound result 1295\n  Bound result 999999999999999999999996194\n  Bound result 999999999999999999999996194\n  Bound result 0\n  Bound result 0\n  Bound result 999999999999999999999996194\n  Bound result 999999999999999999999996194\n  Bound result 1584000000000000000\n  Bound result 1880\n  Bound result 23\n  Bound result 23\n  Bound result 1584000000000000227\n  Bound result 1584000000000000227\n  Bound result 0\n  Bound result 45\n  Bound result 1316\n  Bound result 0\n  Bound result 3556\n  Bound result 3556\n\n[PASS] test_HandlerCoversFullSupplyInfiniteAllowanceSelfTransferAndRevocation() (gas: 1313692)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 0\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.29s (5.29s CPU time)\n\nRan 2 tests for test/blackout/BlackoutInvariant.t.sol:BlackoutInvariantTest\n[PASS]\nBlackoutInvariantTest invariants:\n[PASS] invariant_AllETHAndTokenSupplyConserved\n[PASS] invariant_FlushedFundsBackRouterLiabilities\n[PASS] invariant_HookLiabilitiesMatchIndependentReceipts\n[PASS] invariant_InitializationBindingAndFeeBounds\n BlackoutInvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-----------------+----------------+-------+---------+----------╮\n| Contract        | Selector       | Calls | Reverts | Discards |\n+===============================================================+\n| BlackoutHandler | advance        | 2426  | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| BlackoutHandler | bind           | 2494  | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| BlackoutHandler | buy            | 2501  | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| BlackoutHandler | donateETH      | 2399  | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| BlackoutHandler | flush          | 2505  | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| BlackoutHandler | rejectedBuy    | 2502  | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| BlackoutHandler | rewardBuy      | 2444  | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| BlackoutHandler | sell           | 2451  | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| BlackoutHandler | transferTokens | 2411  | 0       | 0        |\n|-----------------+----------------+-------+---------+----------|\n| BlackoutHandler | withdrawTeam   | 2443  | 0       | 0        |\n╰-----------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 58681847247153988\n  Bound result 819174802791245536\n  Bound result 4378688767337169116\n  Bound result 1516592700402529781\n  Bound result 1742607747\n  Bound result 4999999999900000074\n  Bound result 4999999999900017372\n  Bound result 399999999999999961\n  Bound result 999999999999999011\n  Bound result 3255\n  Bound result 8329\n  Bound result 4999999999900000081\n  Bound result 8\n  Bound result 247556822139072985\n  Bound result 411212270629190861\n  Bound result 3592375728405098629\n  Bound result 4999999999900777006\n  Bound result 5416\n  Bound result 1453044612\n  Bound result 895648805747446\n  Bound result 753268723403274407\n  Bound result 2999\n  Bound result 496353801700523551\n  Bound result 295\n  Bound result 9\n  Bound result 4999999999900004599\n  Bound result 99999999999999999\n  Bound result 10000000000000000\n  Bound result 5000000000000000000\n  Bound result 3714247998\n  Bound result 18908\n  Bound result 1500\n  Bound result 999999999750000001\n  Bound result 613243075345923015\n  Bound result 150\n  Bound result 3926515321732222372\n  Bound result 1069868345978964026\n  Bound result 15342\n  Bound result 3803210173090766202\n  Bound result 26122900\n  Bound result 6921\n  Bound result 17239\n  Bound result 500000000000000\n  Bound result 85835199901925347\n  Bound result 45478127874697490\n  Bound result 5689\n  Bound result 136\n  Bound result 59014\n  Bound result 72000000000000001\n  Bound result 5826\n  Bound result 39185\n  Bound result 66\n  Bound result 17771\n  Bound result 40\n  Bound result 500000000000000000\n  Bound result 2715591182\n  Bound result 50000000000009996\n  Bound result 50000000000000000\n  Bound result 1603605297\n  Bound result 76223\n  Bound result 4999999999900007045\n  Bound result 9108\n  Bound result 99999999999997802\n\n[PASS] test_HandlerExercisesUnboundAndBoundFlows() (gas: 4309738)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 1860\n  Bound result 1000000000000000000\n  Bound result 17\n  Bound result 100000000000000000\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.22s (7.19s CPU time)\n\nRan 6 tests for test/Market.t.sol:MarketTest\n[PASS] testBuyChargesExactlyOnePercentAllToRewards() (gas: 1729963)\n[PASS] testFuzzTotalFeeHardCap(uint96) (runs: 256, μ: 1804541, ~: 1809036)\nLogs:\n  Bound result 1732\n\n[PASS] testOnlyManagerCorrectPoolExactInputAndHookAddress() (gas: 111130)\n[PASS] testSingleDumpIncludesItselfAndFeeDecaysWithoutGriefReset() (gas: 17155329)\n[PASS] testTwapAveragesEthPriceAcrossUnequalPrices() (gas: 2330601)\n[PASS] testTwapWarmupAndFlashManipulationResistance() (gas: 1883191)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 10.35s (10.36s CPU time)\n\nRan 6 tests for test/SeasonAudit.t.sol:SeasonAuditTest\n[PASS] testAuditThresholdStrictAndNoWhaleSoftCap() (gas: 40508248)\n[PASS] testLotteryEntitlementSurvivesFullInventory() (gas: 131721528)\n[PASS] testPackSupplyDropOnlyActiveFarmsAtDoublePace() (gas: 11743280)\n[PASS] testParameterChangesCannotChangeClosedEpochBetweenBatches() (gas: 12523805)\n[PASS] testSeasonCannotFinalizeEarlyAndExpiredLotteryMustRearm() (gas: 124179117)\n[PASS] testWeeklyThreeDistinctTicketWinnersFuturePackAndBestPrize() (gas: 124934770)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 10.47s (1.12s CPU time)\n\nRan 9 tests for test/AuditV318.t.sol:AuditV318Test\n[PASS] testAuditPriceLimitedBuyRevertsInsteadOfPayingTaxOnUnconsumedEth() (gas: 132817)\n[PASS] testBeforeSwapNamesThePriceLimitedBuyError() (gas: 63455)\n[PASS] testFullFillBuysPayEachStepExactly() (gas: 2526768)\n[PASS] testFullFillTenEthBuyPaysExactlyNinetyPercentInTheFirstStep() (gas: 413224)\n[PASS] testFuzzOnlyTheExtremeBoundBuysAndPaysTheFlooredTax(uint96,uint160,uint8) (runs: 256, μ: 1531099, ~: 1367437)\nLogs:\n  Bound result 42264174625779438556\n  Bound result 136034044430987246\n  Bound result 0\n\n[PASS] testPriceLimitedBuyRefusedAfterLaunchWindowToo() (gas: 4642321)\n[PASS] testPriceLimitedSellStillFillsPartiallyAndIsChargedOnActualOutput() (gas: 2237178)\n[PASS] testPublicInterfaceUnchanged() (gas: 108831)\n[PASS] testSystemRewardBuyStillFills() (gas: 1992056)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 10.51s (10.46s CPU time)\n\nRan 6 tests for test/Regression.t.sol:RegressionTest\n[PASS] testCableRepairRestoresOnlyRemainingHalfEpoch() (gas: 11818095)\n[PASS] testEmptyEpochPreservesLastSettledRateButResetsScrapAllowance() (gas: 11008366)\n[PASS] testFuzzCableRepairBlendHandlesNonMonotonicRarityBonuses(uint16) (runs: 256, μ: 1374183, ~: 1374014)\nLogs:\n  Bound result 4020\n\n[PASS] testRegisterOnlyAccountsDoNotAddSettlementWorkAndEmptyFarmCanRetire() (gas: 2037709)\n[PASS] testRepairAndPaidPackCannotRetroactivelyBoostEpoch() (gas: 9562743)\n[PASS] testUnlimitedFreshPacksCannotDrainPoolByScrapping() (gas: 9668475)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 10.49s (395.34ms CPU time)\n\nRan 6 tests for test/Endowment.t.sol:EndowmentTest\n[PASS] testDirectTransferCannotBypassOrBackdateDrip() (gas: 368166)\n[PASS] testExactFundingFullLinearDripAndConservation() (gas: 832168)\n[PASS] testFuzzCumulativePaymentsCannotExceedVestedPrincipal(uint32,uint128) (runs: 256, μ: 523194, ~: 524727)\nLogs:\n  Bound result 21\n  Bound result 7760567710688070922\n\n[PASS] testNoTeamDonorOrSwarmWithdrawalOrReserveAuthority() (gas: 614309)\n[PASS] testParamsSnapshotCannotAccelerateOrRelockExistingEndowment() (gas: 303686)\n[PASS] testUnderfundingCannotActivateAndDonationsStayConserved() (gas: 453428)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 10.70s (10.69s CPU time)\n\nRan 9 tests for test/LazyAccounting.t.sol:LazyAccountingTest\n[PASS] testAuditChargesTenPercentEvenAtHalfSeverityAndThresholdIsFrozen() (gas: 6161890)\n[PASS] testClaimCatchesUpWhilePacksPausedAndDoesNotEraseRemainingHistory() (gas: 25641763)\n[PASS] testExhaustedFarmCannotCollectRedistributionByRemainingIdle() (gas: 15191242)\n[PASS] testFuzzLazyEqualsIndependentEagerForRandomFarmsAndAllEvents(uint256) (runs: 256, μ: 45572196, ~: 45576906)\n[PASS] testGlobalAccumulatorAndWeightsAreSnapshottedBeforeMutations() (gas: 9311279)\n[PASS] testLateSeasonSettlementPaysMiningWithoutChangingFrozenWinners() (gas: 59490917)\n[PASS] testOneWeiMiningGreenCannotLockSettlementThroughEnvelopeRounding() (gas: 11069658)\n[PASS] testSparseMatureVintageConsumedBeforeRecentSlotAfterWrap() (gas: 43222421)\n[PASS] testStaleActionsRequireChunksAndNeverBlockGlobalAdvance() (gas: 40505475)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 10.55s (10.91s CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantsTest\n[PASS]\nInvariantsTest invariants:\n[PASS] invariantAllowlistRootAndWalletLimit\n[PASS] invariantInventoryAndEthLiabilities\n[PASS] invariantLocksAndPotAlwaysBacked\n[PASS] invariantPriceAndParamsBounds\n[PASS] invariantReceiptsNeverForfeitOrFixMissingEntropy\n[PASS] invariantReservesBackedAndPendingCovered\n[PASS] invariantTokenConservationNoBurns\n InvariantsTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------+-----------+-------+---------+----------╮\n| Contract    | Selector  | Calls | Reverts | Discards |\n+======================================================+\n| GameHandler | advance   | 605   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | buy       | 592   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | claim     | 554   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | equip     | 596   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | expand    | 605   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | freeClaim | 576   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | fundPot   | 586   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | lock      | 601   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | resolve   | 614   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | rollover  | 552   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | settle    | 579   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | tokenPack | 562   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unlock    | 620   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unplace   | 550   | 0       | 0        |\n╰-------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 19800000000000000\n  Bound result 10100000000000000000\n  Bound result 201\n  Bound result 48\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 35.74s (35.72s CPU time)\n\nRan 62 test suites in 35.74s (124.66s CPU time): 382 tests passed, 0 failed, 6 skipped (388 total tests)\n","passed":true},{"durationMs":317,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Billboards.bidBillboard(uint256,uint256,string,string)\",\"Billboards.settleBillboard(uint256,uint256)\",\"Billboards.withdrawRefund()\",\"Civic.announce(uint256,string)\",\"Civic.buyLot(uint256)\",\"Civic.claimWar(uint256)\",\"Civic.consumeCityEvent()\",\"Civic.enable(uint256)\",\"Civic.finishCollapse()\",\"Civic.finishWar()\",\"Civic.fundCollapse(uint256)\",\"Civic.fundWar(uint256)\",\"Civic.grantDistrictBoost(uint256,uint16,string)\",\"Civic.listLot(uint8,uint8,uint8)\",\"Civic.startCollapse(uint256)\",\"Civic.startWar(uint8,uint8)\",\"Economy.autoRepair(address,uint256,uint256[24])\",\"Economy.lock(uint256,uint256)\",\"Economy.unlock()\",\"EndowmentEscrow.forward(address,uint64,uint256,bytes,uint64,uint256,bytes)\",\"Enhancement.activateCap()\",\"Enhancement.announceCap(uint8,string)\",\"Enhancement.capture(uint256)\",\"Enhancement.commit(uint256,uint256,bool)\",\"Enhancement.resolve(uint256)\",\"FarmCore.activity(address,uint256,uint256,uint256)\",\"FarmCore.autoRepair(address,uint256)\",\"FarmCore.buyRoom(uint256,bool)\",\"FarmCore.buyTokenPack(bool)\",\"FarmCore.civicPurchase(address,uint256)\",\"FarmCore.claimDrop()\",\"FarmCore.expand(bool)\",\"FarmCore.grantDrop(address,bytes32)\",\"FarmCore.lobby(uint256,bool)\",\"FarmCore.paidPackBought(address,uint256,uint256)\",\"FarmCore.place(uint256,uint256,uint256)\",\"FarmCore.prepareEnhancement(address,uint256,uint256,bool)\",\"FarmCore.process(address,uint256)\",\"FarmCore.register(address)\",\"FarmCore.repair(uint256,bool)\",\"FarmCore.repairCable(bool)\",\"FarmCore.retire(address)\",\"FarmCore.scrap(uint256,uint256)\",\"FarmCore.setAutoRepair(bool,uint16)\",\"FarmCore.setReferrer(address)\",\"FarmCore.sync()\",\"FarmCore.syncFor(address)\",\"FarmCore.unplace(uint256,uint256)\",\"FarmEngine.process(address,uint256,(uint256[24],uint8[24],uint16[24],bool,uint64,uint16))\",\"FarmItems.destroy(uint256)\",\"FarmItems.equip(address,uint256)\",\"FarmItems.expand(address)\",\"FarmItems.maintain(uint256,uint16,uint8)\",\"FarmItems.mint(address,uint8,uint8,bool)\",\"FarmItems.mintDrop(address,bytes32)\",\"FarmItems.safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\",\"FarmItems.safeTransferFrom(address,address,uint256,uint256,bytes)\",\"FarmItems.unequip(address,uint256)\",\"FarmRewards.advanceEpoch()\",\"FarmRewards.award(address,uint256)\",\"FarmRewards.beginMining(address,uint256)\",\"FarmRewards.claim(uint256)\",\"FarmRewards.flagResync(address)\",\"FarmRewards.initialize(address)\",\"FarmRewards.recordSales(uint256)\",\"FarmRewards.releasePrize(uint256)\",\"FarmRewards.scrap(address,uint256,uint256)\",\"FarmRewards.setReferrer(address,address)\",\"FarmRewards.setWeight(address,uint256)\",\"FarmRewards.settle(address,uint256)\",\"FarmRewards.spend(address,uint256)\",\"FarmRewards.spendTo(address,uint256,address)\",\"FeeRouter.depositBaseFee()\",\"FeeRouter.depositLaunchTax()\",\"FeeRouter.depositLobby()\",\"FeeRouter.depositPack()\",\"FeeRouter.depositSellTax()\",\"FeeRouter.executeBuys(uint256,uint256)\",\"FeeRouter.executePotBuys(uint256,uint256)\",\"FeeRouter.executeSells(uint256,uint256)\",\"FeeRouter.payBounty(address)\",\"FeeRouter.payWork(address,uint8,uint256,uint256)\",\"FeeRouter.receive()\",\"FeeRouter.routeTokens(uint256)\",\"FeeRouter.withdraw()\",\"FeeRouter.zapBuy(uint256,address)\",\"GameRegistry.register(uint256,uint64,uint256,bytes)\",\"GridOperator.lobbyETH()\",\"GridOperator.resolve(uint256)\",\"GridOperator.resolveFor(uint256,address)\",\"GridOperator.shift(uint256)\",\"GridOperator.submitPlan(uint256,uint8,uint16,bytes32,string)\",\"GridOperator.tokenLobby(address,uint256)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\",\"MarketFactory.deploy((address,address,int24,address,address,bytes32),bytes32)\",\"PackSale.buyPackFor(address)\",\"PackSale.buyPacksFor(address,uint256,uint256)\",\"PackSale.buyWithETH(address,uint256,uint256,uint256)\",\"PackSale.captureEntropy(uint256)\",\"PackSale.openPack(uint256)\",\"PackSale.pause(uint256)\",\"PackSale.rearm(uint256)\",\"PackSale.resolve(uint256,uint256)\",\"PackSale.rewardPack(address)\",\"PackSale.tokenPack(address)\",\"PackSale.unpause()\",\"Params.set(uint8,uint256,string)\",\"RewardPool.donate(uint256)\",\"RewardPool.fundEndowment()\",\"RewardPool.pay(address,uint256)\",\"RewardPool.recordInflow(uint256)\",\"RewardPool.recycle(uint256)\",\"RewardPool.reserve(uint256)\",\"Season.addPrize(uint256,uint256)\",\"Season.claimBest(uint256)\",\"Season.claimDistrict(uint256)\",\"Season.claimLottery(uint256)\",\"Season.complete(address,uint256)\",\"Season.depositPot(uint256)\",\"Season.finalize(uint256)\",\"Season.prepare(uint256,uint256)\",\"Season.rearm(uint256)\",\"Season.recordActivity(address,uint256,uint256,uint256)\",\"Season.recordRepair(address,uint256,uint256)\",\"Season.recordSpend(address,uint256,bool)\",\"Season.rollover(uint256)\",\"StandardAdapter.buy(uint256,address)\",\"StandardAdapter.unlockCallback(bytes)\",\"StandardMarket.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"StandardMarket.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"StandardMarket.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"StandardMarket.bindFeeRouter(address,uint64,uint256)\",\"StandardMarket.buy(uint256,address)\",\"StandardMarket.flushFees()\",\"StandardMarket.receive()\",\"StandardMarket.sell(uint256,uint256,address)\",\"StandardMarket.unlockCallback(bytes)\",\"StarterClaim.captureEntropy(uint256)\",\"StarterClaim.claim(uint256,bytes32[])\",\"StarterClaim.claimFree(uint256,bytes32[])\",\"StarterClaim.rearm(uint256)\",\"StarterClaim.resolve(uint256)\",\"SwarmDesk.askBackup(uint8,bytes)\",\"SwarmDesk.bind(address,bytes,bytes,uint64,uint8,uint64,uint8,uint64)\",\"SwarmDesk.clearExpired(bytes32)\",\"SwarmDesk.execute(uint8,bytes)\",\"SwarmDesk.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"SwarmDesk.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"SwarmDesk.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"V4Market.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"V4Market.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"V4Market.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"V4Market.bindFeeRouter(address,uint64,uint256)\",\"V4Market.buy(uint256,address)\",\"V4Market.flushFees()\",\"V4Market.receive()\",\"V4Market.sell(uint256,uint256,address)\",\"V4Market.unlockCallback(bytes)\"],\"files\":{\".gitignore\":8,\"README.md\":93,\"artifacts/build-lint-v3.txt\":2369,\"artifacts/build-v3.txt\":3,\"artifacts/economic-targets-v3.json\":9,\"artifacts/fmt-v3.txt\":0,\"artifacts/foundry-v3.txt\":845,\"artifacts/funded-sensitivity/simulation-v3.json\":13928,\"artifacts/funded-sensitivity/simulation-v3.md\":51,\"artifacts/funding-sensitivity-v3.json\":342,\"artifacts/gas-actions-v3.txt\":15,\"artifacts/policy-sensitivity-v3.json\":554,\"artifacts/python-tests-v3.txt\":18,\"artifacts/regulator-example.json\":59,\"artifacts/robinhood-fork-v3.txt\":7,\"artifacts/runtime-sizes-v3.json\":23,\"artifacts/simulation-v3.json\":13928,\"artifacts/simulation-v3.md\":51,\"artifacts/tuned-funded/simulation-v3.json\":13928,\"artifacts/tuned-funded/simulation-v3.md\":51,\"artifacts/v2/README.md\":3,\"artifacts/v2/foundry-tests.txt\":178,\"artifacts/v2/offline-tests.txt\":187,\"artifacts/v2/offline-verification.json\":21,\"artifacts/v2/previous-README.md\":108,\"artifacts/v2/previous-design.md\":120,\"artifacts/v2/previous-report.md\":75,\"artifacts/v2/previous-security-review.md\":29,\"artifacts/v2/previous-simulation-assumptions.md\":52,\"artifacts/v2/robinhood-fork.txt\":7,\"artifacts/v2/rpc-probe.json\":16,\"artifacts/v2/runtime-sizes.json\":21,\"artifacts/v2/simulation.md\":95,\"artifacts/v2/verification.json\":110,\"artifacts/v31/allocation-summary.md\":6,\"artifacts/v31/baseline-budget.md\":14,\"artifacts/v31/boundary-checks.json\":10880,\"artifacts/v31/candidate-stress/simulation.json\":32636,\"artifacts/v31/evidence/factory-prediction.json\":14,\"artifacts/v31/evidence/launch-and-cost-facts.json\":130,\"artifacts/v31/evidence/standalone-hook-build.json\":38,\"artifacts/v31/final/comparison.md\":50,\"artifacts/v31/funded/comparison.md\":52,\"artifacts/v31/funded/replay.json\":290,\"artifacts/v31/funding-comparison.md\":8,\"artifacts/v31/regulator-example.json\":73,\"artifacts/v31/stress-comparison.md\":20,\"artifacts/v31/summary.json\":13,\"artifacts/v31/validation.json\":250,\"artifacts/v310/forge-test-launch.txt\":496,\"artifacts/v310/forge-test-repo-changed-suites.txt\":115,\"artifacts/v310/forge-test-repo-full-before-new-tests.txt\":437,\"artifacts/v310/pins-check.txt\":2,\"artifacts/v311/rehearsal.log\":377,\"artifacts/v312/forge-fmt.txt\":1,\"artifacts/v312/forge-test-launch.txt\":381,\"artifacts/v312/forge-test-repo.txt\":384,\"artifacts/v312/launch-creation-hashes.txt\":5,\"artifacts/v312/node-tests.txt\":10,\"artifacts/v312/pins-check.txt\":2,\"artifacts/v312/python-tests.txt\":3,\"artifacts/v312/rehearsal.log\":368,\"artifacts/v313/forge-fmt.txt\":0,\"artifacts/v313/forge-test.txt\":468,\"artifacts/v313/launch-creation-hashes.txt\":6,\"artifacts/v313/module-pins.txt\":15,\"artifacts/v313/pins-check.txt\":2,\"artifacts/v314/authority-check.txt\":1,\"artifacts/v314/consistency-check.txt\":1,\"artifacts/v314/creation-hashes.json\":21,\"artifacts/v314/deploy-gate.txt\":1,\"artifacts/v314/flatten-build.txt\":871,\"artifacts/v314/flatten-check.txt\":2,\"artifacts/v314/forge-build.txt\":4752,\"artifacts/v314/forge-fmt.txt\":0,\"artifacts/v314/forge-test.txt\":487,\"artifacts/v314/launch-creation-hashes.txt\":20,\"artifacts/v314/module-pins-check.txt\":1,\"artifacts/v314/node-tests.txt\":22,\"artifacts/v314/python-tests.txt\":39,\"artifacts/v314/rehearsal-build.log\":4895,\"artifacts/v314/rehearsal.log\":352,\"artifacts/v314/runtime-sizes.json\":21,\"artifacts/v314/swarm-pins-check.txt\":1,\"artifacts/v315/creation-hashes.json\":21,\"artifacts/v315/deploy-gate.txt\":1,\"artifacts/v315/forge-build.txt\":1062,\"artifacts/v315/forge-fmt.txt\":0,\"artifacts/v315/forge-test.txt\":412,\"artifacts/v315/launch-creation-hashes.txt\":20,\"artifacts/v315/module-pins-check.txt\":1,\"artifacts/v315/node-tests.txt\":22,\"artifacts/v315/python-tests.txt\":39,\"artifacts/v315/rehearsal-build.log\":4921,\"artifacts/v315/rehearsal.log\":387,\"artifacts/v315/runtime-sizes.json\":21,\"artifacts/v315/swarm-pins-check.txt\":1,\"artifacts/v316/creation-hashes.json\":21,\"artifacts/v316/deploy-gate.txt\":1,\"artifacts/v316/forge-build.txt\":4736,\"artifacts/v316/forge-fmt.txt\":0,\"artifacts/v316/forge-test.txt\":505,\"artifacts/v316/launch-creation-hashes.txt\":20,\"artifacts/v316/module-pins-check.txt\":1,\"artifacts/v316/node-tests.txt\":7,\"artifacts/v316/python-tests.txt\":3,\"artifacts/v316/rehearsal-build.log\":4921,\"artifacts/v316/rehearsal.log\":392,\"artifacts/v316/runtime-sizes.json\":21,\"artifacts/v316/swarm-pins-check.txt\":1,\"artifacts/v317/creation-hashes.json\":21,\"artifacts/v317/deploy-gate.txt\":1,\"artifacts/v317/forge-fmt.txt\":0,\"artifacts/v317/forge-test.txt\":442,\"artifacts/v317/launch-creation-hashes.txt\":20,\"artifacts/v317/module-pins-check.txt\":1,\"artifacts/v317/node-tests.txt\":14,\"artifacts/v317/python-tests.txt\":5,\"artifacts/v317/rehearsal-build.log\":4959,\"artifacts/v317/rehearsal.log\":392,\"artifacts/v317/runtime-sizes.json\":21,\"artifacts/v317/swarm-pins-check.txt\":1,\"artifacts/v318/creation-hashes.json\":21,\"artifacts/v318/deploy-gate.txt\":1,\"artifacts/v318/forge-fmt.txt\":0,\"artifacts/v318/forge-test.txt\":487,\"artifacts/v318/launch-creation-hashes.txt\":20,\"artifacts/v318/module-pins-check.txt\":1,\"artifacts/v318/node-tests.txt\":24,\"artifacts/v318/rehearsal-build.log\":4973,\"artifacts/v318/rehearsal.log\":392,\"artifacts/v318/runtime-sizes.json\":21,\"artifacts/v318/swarm-pins-check.txt\":1,\"artifacts/v32/contract-sizes.json\":54,\"artifacts/v32/forge-build.log\":2734,\"artifacts/v32/forge-fmt.log\":0,\"artifacts/v32/forge-test.log\":310,\"artifacts/v32/model-checks.log\":5,\"artifacts/v32/module-pins.log\":1,\"artifacts/v32/python-tests.log\":25,\"artifacts/v32/regulator-example.json\":73,\"artifacts/v32/simulation-checks.json\":11,\"artifacts/v32/simulation-checks.log\":11,\"artifacts/v32/validation.json\":61,\"artifacts/v32/verified-baseline/comparison.md\":8,\"artifacts/v32/verified-baseline/simulation.json\":22622,\"artifacts/v32/verified-sensitivities/comparison.md\":68,\"artifacts/v33/simulation.json\":116,\"artifacts/v34/build.txt\":2931,\"artifacts/v34/format.txt\":0,\"artifacts/v34/pins.txt\":1,\"artifacts/v34/python-tests.txt\":5,\"artifacts/v34/reveal-test.txt\":1,\"artifacts/v34/simulation.json\":91766,\"artifacts/v34/simulation.md\":43,\"artifacts/v34/tests.txt\":306,\"artifacts/v35/simulation.json\":22605,\"artifacts/v35/simulation.md\":104,\"artifacts/v35/verification.json\":132,\"artifacts/v36/simulation-phases.json\":179,\"artifacts/v36/simulation-phases.md\":13,\"artifacts/v37/byte-sizes.json\":131,\"artifacts/v37/verification.json\":28,\"artifacts/v39/forge-build-repo.txt\":3,\"artifacts/v39/forge-fmt.txt\":1,\"artifacts/v39/forge-test-launch.txt\":8,\"artifacts/v39/forge-test-repo.txt\":390,\"artifacts/v39/pins-check.txt\":2,\"artifacts/v39/pins.json\":68,\"artifacts/v39/runtime-sizes.json\":197,\"artifacts/v39/simulation.json\":381,\"artifacts/v39/simulation.md\":29,\"artifacts/verification-v3.json\":67,\"docs/accepted-v314.md\":10,\"docs/accepted-v315.md\":22,\"docs/accepted-v316.md\":24,\"docs/accepted-v317.md\":46,\"docs/accepted-v318.md\":56,\"docs/api-v35.md\":41,\"docs/blackout-hook-launch.md\":219,\"docs/dependency-provenance.md\":9,\"docs/design.md\":69,\"docs/entropy-v34.md\":31,\"docs/launch-upstream-sha256.json\":518,\"docs/launch-v31.md\":121,\"docs/launch-v314-plan.json\":196,\"docs/launch-v34.md\":44,\"docs/launch-v35.md\":40,\"docs/lazy-accounting-v32.md\":48,\"docs/m2-trust-assumption.md\":121,\"docs/oracle-v37/event.json\":1,\"docs/oracle-v37/oracle-config.json\":21,\"docs/oracle-v37/regulator.json\":1,\"docs/params-keys-v313.md\":113,\"docs/report-v3.md\":143,\"docs/report-v31.md\":128,\"docs/report-v32.md\":138,\"docs/report-v33.md\":107,\"docs/report-v34.md\":58,\"docs/report-v36.md\":89,\"docs/report-v38.md\":83,\"docs/research/b94e6839-platform-report.md\":238,\"docs/review-v31.md\":77,\"docs/review-v32.md\":32,\"docs/review-v33.md\":19,\"docs/review-v34.md\":30,\"docs/review-v35-independent.md\":69,\"docs/review-v37-independent.md\":44,\"docs/review-v39-independent.md\":105,\"docs/security-review.md\":29,\"docs/simulation-assumptions.md\":43,\"docs/simulation-v3-historical.md\":44,\"docs/simulation-v34.md\":34,\"foundry.toml\":21,\"keeper/README.md\":120,\"keeper/blackout-keeper.service\":23,\"keeper/keeper.env.example\":18,\"keeper/keeper.mjs\":578,\"keeper/lib/abi.mjs\":95,\"keeper/lib/eth.mjs\":186,\"keeper/lib/oracle.mjs\":57,\"keeper/wiring.example.json\":17,\"launch-v31.md\":3,\"launch-v36.md\":34,\"launch-v37.md\":144,\"launch-v38.md\":57,\"launch-v39.md\":255,\"launch/V4Market.sol\":1894,\"operations/dormant-v35.md\":17,\"regulator.md\":60,\"report.md\":537,\"script/Deploy.s.sol\":252,\"script/DeployMarket.s.sol\":15,\"script/PredictGame.s.sol\":49,\"script/SwarmArgs.sol\":38,\"sim/blackout_sim_v2.py\":509,\"sim/blackout_sim_v3.py\":338,\"sim/blackout_sim_v31.py\":24,\"sim/blackout_sim_v32.py\":380,\"sim/blackout_sim_v33.py\":395,\"sim/blackout_sim_v34.py\":444,\"sim/candidate_stress_v31.py\":21,\"sim/heartbeat_boundaries_v31.py\":25,\"sim/heartbeat_sweep_v31.py\":46,\"sim/policy_sensitivity_v3.py\":19,\"sim/run_v32.py\":34,\"sim/run_v33.py\":58,\"sim/run_v34.py\":54,\"sim/run_v35.py\":273,\"sim/run_v36.py\":83,\"sim/run_v39.py\":153,\"sim/tune_v3.py\":16,\"src/Billboards.sol\":135,\"src/Civic.sol\":302,\"src/Economy.sol\":222,\"src/EndowmentEscrow.sol\":111,\"src/Enhancement.sol\":164,\"src/FarmCore.sol\":611,\"src/FarmEngine.sol\":299,\"src/FarmItems.sol\":165,\"src/FarmRewards.sol\":607,\"src/FeeRouter.sol\":313,\"src/GameRegistry.sol\":101,\"src/GridOperator.sol\":276,\"src/LaunchToken.sol\":11,\"src/MarketFactory.sol\":61,\"src/PackSale.sol\":293,\"src/Params.sol\":181,\"src/RewardPool.sol\":113,\"src/Season.sol\":368,\"src/StandardAdapter.sol\":77,\"src/StandardMarket.sol\":22,\"src/StarterClaim.sol\":149,\"src/SwarmDesk.sol\":548,\"src/V4Market.sol\":590,\"src/interfaces/IGame.sol\":53,\"src/interfaces/IGameRegistry.sol\":15,\"src/interfaces/ILaunchHook.sol\":7,\"src/interfaces/IV4.sol\":26,\"src/interfaces/Interfaces.sol\":20,\"src/lib/ChainClock.sol\":22,\"src/lib/EconomyMath.sol\":48,\"src/lib/Errors.sol\":13,\"src/lib/GameModule.sol\":17,\"src/lib/ItemMath.sol\":31,\"src/lib/ItemMetadata.sol\":79,\"src/lib/ModuleCode.sol\":49,\"src/lib/Robinhood.sol\":15,\"src/lib/SwarmCode.sol\":18,\"src/oracle/OracleAttestation.sol\":221,\"src/oracle/SignatureCheckerCompat.sol\":14,\"test/AuditV314.t.sol\":116,\"test/AuditV315.t.sol\":199,\"test/AuditV317.t.sol\":359,\"test/AuditV318.t.sol\":319,\"test/AutoRepairReviewV35.t.sol\":39,\"test/Base.t.sol\":310,\"test/Bounties.t.sol\":290,\"test/CivicV35.t.sol\":224,\"test/Clock.t.sol\":54,\"test/DeployGateV314.t.sol\":94,\"test/Deployment.t.sol\":94,\"test/EconomyV35.t.sol\":398,\"test/Endowment.t.sol\":123,\"test/EndowmentEscrowV38.t.sol\":200,\"test/EndowmentGame.t.sol\":51,\"test/Epochs.t.sol\":177,\"test/Events.t.sol\":252,\"test/Factory.t.sol\":31,\"test/FarmDailyBasisV317.t.sol\":146,\"test/FeesParams.t.sol\":135,\"test/ForeignTokenTwin.t.sol\":288,\"test/Gas.t.sol\":110,\"test/GridV35.t.sol\":66,\"test/HeartbeatBpsV313.t.sol\":149,\"test/HookBinding.t.sol\":113,\"test/Invariants.t.sol\":211,\"test/Items.t.sol\":246,\"test/KeeperProfit.t.sol\":95,\"test/LaunchHook.t.sol\":339,\"test/LaunchToken.t.sol\":188,\"test/LazyAccounting.t.sol\":447,\"test/Market.t.sol\":121,\"test/OracleConformanceV37.t.sol\":105,\"test/Packs.t.sol\":167,\"test/Pause.t.sol\":76,\"test/PhasedReleaseV36.t.sol\":165,\"test/PotV35.t.sol\":106,\"test/PredictionV34.t.sol\":46,\"test/Registry.t.sol\":140,\"test/Regression.t.sol\":156,\"test/ReservedEventsV35.t.sol\":41,\"test/ReviewV34.t.sol\":145,\"test/SeasonAudit.t.sol\":204,\"test/StandardAdapter.t.sol\":81,\"test/StandardMarket.t.sol\":63,\"test/StandardV4Integration.t.sol\":128,\"test/SwarmDeskV37.t.sol\":705,\"test/TwinCaptureV312.t.sol\":255,\"test/V310.t.sol\":79,\"test/V33.t.sol\":561,\"test/V34.t.sol\":315,\"test/V39.t.sol\":213,\"test/V4Integration.t.sol\":229,\"test/WarReviewV35.t.sol\":69,\"test/YieldFloorReviewV35.t.sol\":31,\"test/blackout/BlackoutFailures.t.sol\":517,\"test/blackout/BlackoutFixture.sol\":262,\"test/blackout/BlackoutInvariant.t.sol\":327,\"test/blackout/BlackoutTokenInvariant.t.sol\":181,\"test/blackout/README.md\":88,\"test/deploy-gate-v314.test.mjs\":42,\"test/fixtures/keeper-v39-vectors.json\":56,\"test/fixtures/oracle-hash-vectors.json\":102,\"test/fork/RehearsalV311.t.sol\":812,\"test/fork/RobinhoodFork.t.sol\":39,\"test/keeper-v39.test.mjs\":34,\"test/mocks/MockGameRegistry.sol\":52,\"test/mocks/MockMarket.sol\":74,\"test/mocks/MockOracleSigner.sol\":17,\"test/mocks/MockSwarmIntake.sol\":67,\"test/mocks/MockToken.sol\":38,\"test/mocks/MockV4Manager.sol\":118,\"test/oracle-v310.test.mjs\":22,\"test/oracle-v37.test.mjs\":42,\"test/python/test_entropy_bot.py\":31,\"test/python/test_merkle.py\":19,\"test/python/test_regulator.py\":30,\"test/python/test_v31.py\":38,\"test/python/test_v32.py\":58,\"test/python/test_v34.py\":33,\"test/python/test_v35.py\":71,\"test/reveal.test.mjs\":24,\"test/ui-v35.test.mjs\":27,\"tools/check_deploy_gate.mjs\":48,\"tools/check_launch_source.py\":89,\"tools/check_v32_results.py\":52,\"tools/check_v37_authority.py\":20,\"tools/entropy_bot.py\":106,\"tools/freepack_merkle.py\":20,\"tools/make_oracle_bodies.mjs\":45,\"tools/oracle_question_hash.mjs\":80,\"tools/pin_module_code.py\":95,\"tools/pin_swarm_code.py\":48,\"tools/regulator.py\":81,\"tools/rehearse_v311.sh\":28,\"tools/report_v31.py\":55,\"tools/schedule_bodies.mjs\":16,\"tools/starter_merkle.py\":72,\"tools/swarm_constructor_args.mjs\":57,\"ui/app.js\":178,\"ui/index.html\":22,\"ui/reveal.js\":34,\"ui/style.css\":3},\"excluded\":[\"vendor/\",\"node_modules/\"],\"truncated\":true}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b2594604372413b3d2e7f09098aa585bbd84cb19f21f0182ab459df139d9f5a9","verifiedTreeHash":"0eade6026a17d91012b1f5c5d8c192f3b2c005b2","verifierVersion":"0.1.0+67c588fa"},{"checks":[{"durationMs":51149,"exitCode":0,"name":"build","output":"Compiling 200 files with Solc 0.8.26\nSolc 0.8.26 finished in 50.89s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n  --> src/lib/EconomyMath.sol:17:48:\n   |\n17 |         returns (uint256 chance, uint256 burn, uint256 bonus, uint256 daysWad)\n   |                                                ^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n  --> src/lib/EconomyMath.sol:44:5:\n   |\n44 |     function bonus(uint256 level) internal pure returns (uint256 b) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/V4Market.sol:330:22:\n    |\n330 |     function _record(bool sell, uint256 amount) private {\n    |                      ^^^^^^^^^\nNote: The other declaration is here:\n   --> src/V4Market.sol:529:5:\n    |\n529 |     function sell(uint256 amount, uint256 minOut, address recipient) external nonReentrant returns (uint256 received) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n  --> test/mocks/MockSwarmIntake.sol:26:9:\n   |\n26 |         bytes4 failure,\n   |         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n  --> test/mocks/MockSwarmIntake.sol:44:5:\n   |\n44 |     function failure(bytes32 id, uint8 status, bytes32 reason) external returns (bool) {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2072): Unused local variable.\n  --> test/EndowmentEscrowV38.t.sol:28:9:\n   |\n28 |         LocalApplicationFactory f = LocalApplicationFactory(address(d.registry.factory()));\n   |         ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/EndowmentEscrowV38.t.sol:121:82:\n    |\n121 |     function _registryArgs(address gameToken, address params, uint256 endowment, address factory)\n    |                                                                                  ^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/Events.t.sol:213:9:\n    |\n213 |         uint256 price = d.packs.quote(112);\n    |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n --> test/Gas.t.sol:9:9:\n  |\n9 |         uint256 price = d.packs.price();\n  |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Gas.t.sol:75:9:\n   |\n75 |         uint256 q = d.packs.quote(112);\n   |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Invariants.t.sol:56:9:\n   |\n56 |         uint256 price = d.packs.price();\n   |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Items.t.sol:76:9:\n   |\n76 |         uint256 cost = d.packs.quote(112);\n   |         ^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/Items.t.sol:106:9:\n    |\n106 |         uint256 q = d.packs.quote(16);\n    |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/LazyAccounting.t.sol:186:13:\n    |\n186 |             uint256 quote = d.packs.quote(112);\n    |             ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/LazyAccounting.t.sol:421:9:\n    |\n421 |         uint256 quote = d.packs.quote(112);\n    |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Packs.t.sol:37:9:\n   |\n37 |         uint256 quote = d.packs.quote(200);\n   |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Packs.t.sol:64:9:\n   |\n64 |         uint256 q = d.packs.quote(6);\n   |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Pause.t.sol:35:9:\n   |\n35 |         uint256 q = d.packs.quote(1);\n   |         ^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Registry.t.sol:49:21:\n   |\n49 |     function _fresh(LocalApplicationFactory f) private returns (GameRegistry) {\n   |                     ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Regression.t.sol:73:9:\n   |\n73 |         uint256 previous = d.items.data(id).durability;\n   |         ^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/SwarmDeskV37.t.sol:485:65:\n    |\n485 |     function _registryArgs(address params, bytes32 starterRoot, address factory) private view returns (bytes memory) {\n    |                                                                 ^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/V33.t.sol:254:13:\n    |\n254 |             uint256 q = d.packs.quote(16);\n    |             ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/V33.t.sol:431:9:\n    |\n431 |         uint256 price = d.packs.price();\n    |         ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/V34.t.sol:78:9:\n   |\n78 |         uint256 q = d.packs.price();\n   |         ^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/V39.t.sol:186:9:\n    |\n186 |         LocalApplicationFactory f = LocalApplicationFactory(address(d.registry.factory()));\n    |         ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/FarmRewards.sol:149:5:\n    |\n149 |     function ready() public view returns (bool) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n   --> test/Base.t.sol:106:5:\n    |\n106 |     function oracleFixture() internal returns (SwarmDesk.OracleConfig memory o) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n   --> test/AuditV315.t.sol:187:5:\n    |\n187 |     function testFixtureDeskBoundAgainstItsTokenLaunchRecord() public {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/fork/RehearsalV311.t.sol:224:5:\n    |\n224 |     function _oracle() internal view returns (SwarmDesk.OracleConfig memory o) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to pure\n   --> test/fork/RehearsalV311.t.sol:283:5:\n    |\n283 |     function _mineHookSalt(bytes memory initCode) internal view returns (bytes32 salt, address hook) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":60622,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/RobinhoodFork.t.sol:RobinhoodForkTest\n[SKIP] testForkArbSysAndHistoricalHash() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 1.04ms (85.40µs CPU time)\n\nRan 4 tests for test/OracleConformanceV37.t.sol:OracleConformanceV37Test\n[PASS] testAcceptsOriginalProtocolSignature() (gas: 17934)\n[PASS] testDigestMatchesUnmodifiedProtocolVector() (gas: 13636)\n[PASS] testFreshVectorSignerSignature() (gas: 30385)\n[PASS] testSelectorsExactlyMatchLiveProtocol() (gas: 3520)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 15.43ms (12.93ms CPU time)\n\nRan 3 tests for test/AuditV318.t.sol:AuditV318PartialFillTest\n[PASS] testAfterSwapAcceptsExactFillAtEveryStep() (gas: 2199153)\n[PASS] testAfterSwapRefusesAPartialFill() (gas: 415676)\n[PASS] testMockBeforeSwapRefusesNonExtremeLimitAndKeepsExactOutputRefusal() (gas: 197144)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 23.98ms (5.45ms CPU time)\n\nRan 1 test for test/PredictionV34.t.sol:PredictionV34Test\n[PASS] testFullGraphPredictsPoolBeforeRegistryDeployment() (gas: 4162727)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 25.38ms (1.41ms CPU time)\n\nRan 5 tests for test/Registry.t.sol:RegistryTest\n[PASS] testAllModulePinsMatchExactPinnedCompilerArtifacts() (gas: 1068880)\n[PASS] testAuthenticatedEnrollmentRejectsUncreatedWrongCodeAndWrongRegistry() (gas: 2930598)\n[PASS] testConstructorAcceptsEmptyGraphWithoutExternalCalls() (gas: 13657)\n[PASS] testCounterfeitRuntimeAtAnotherFactoryCannotEnroll() (gas: 1542191)\n[PASS] testCounterfeitRuntimeWithPoisonedCreditCannotEnroll() (gas: 5876476)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 32.98ms (9.39ms CPU time)\n\nRan 5 tests for test/KeeperProfit.t.sol:KeeperProfitTest\n[PASS] testPaidPackEntropyKeeperProfit() (gas: 1182284)\nLogs:\n  paid pack entropy execution gas: 139616\n  paid pack entropy bounty wei: 3380475000000\n  paid pack entropy execution plus 21000 gas cost wei: 3212320000000\n\n[PASS] testPlanEntropyKeeperProfit() (gas: 1665588)\nLogs:\n  plan entropy execution gas: 163211\n  plan entropy bounty wei: 4474800000000\n  plan entropy execution plus 21000 gas cost wei: 3684220000000\n\n[PASS] testSeasonFinalizeThreeWinnersAndPrizeKeeperProfit() (gas: 3451194)\nLogs:\n  season finalize three winners and prize execution gas: 644073\n  season finalize three winners and prize bounty wei: 15825700000000\n  season finalize three winners and prize execution plus 21000 gas cost wei: 13301460000000\n\n[PASS] testSeasonPrepareIsConstantUnpaidWork() (gas: 1342777)\n[PASS] testStarterEntropyKeeperProfit() (gas: 324487)\nLogs:\n  starter entropy execution gas: 142744\n  starter entropy bounty wei: 3380150000000\n  starter entropy execution plus 21000 gas cost wei: 3274880000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 42.86ms (18.49ms CPU time)\n\nRan 2 tests for test/GridV35.t.sol:GridV35Test\n[PASS] testGreenAndCheapBothFavorTheStableDistrict() (gas: 4110886)\n[PASS] testReservedEventsHaveZeroLaunchWeightAndPlanOnlyWhenEnabled() (gas: 723024)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 44.92ms (18.09ms CPU time)\n\nRan 5 tests for test/AuditV315.t.sol:AuditV315Test\n[PASS] testAttackerLaunchRecordNamesAnotherTokenAndIsRefused() (gas: 10743754)\n[PASS] testFakeMarketEchoingDeskTokenAndHashCannotBind() (gas: 6952035)\n[PASS] testFixtureDeskBoundAgainstItsTokenLaunchRecord() (gas: 58275)\n[PASS] testRealHookRecordedByTheLaunchFactoryBinds() (gas: 12208225)\n[PASS] testRecordWithOtherHookOrOtherPairCurrencyIsRefused() (gas: 6245556)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 52.68ms (19.43ms CPU time)\n\nRan 6 tests for test/CivicV35.t.sol:CivicV35Test\n[PASS] testBillboardsBidRefundTextRulesAndPoolOnly() (gas: 945608)\n[PASS] testBlackMarketDescendingLimitedAndPause() (gas: 3828638)\n[PASS] testCollapseSuccessAndSingleOutageFailure() (gas: 810762)\n[PASS] testDormantDisabledAndNoticeOnce() (gas: 303076)\n[PASS] testOnceSeasonBoostBoundsAndSnapshot() (gas: 1722528)\n[PASS] testWarFreezeScoresConservationAndPayoutOnlyOnce() (gas: 1365382)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 52.63ms (28.11ms CPU time)\n\nRan 5 tests for test/ReviewV34.t.sol:ReviewV34Test\n[PASS] testCanonicalCompetingRegistryCannotTakeOverBinding() (gas: 9599655)\n[PASS] testDustBuyCannotConsumeGlobalBuyInterval() (gas: 336156)\n[PASS] testLateGreenEntrySettlesWithinReservedEnvelope() (gas: 4441470)\n[PASS] testMeaningfulSmallBuyCanUseLessThanMaximumBatch() (gas: 263646)\n[PASS] testSameConfigurationAtUncommittedCoordinatesCannotBind() (gas: 9686210)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 52.81ms (24.57ms CPU time)\n\nRan 2 tests for test/Clock.t.sol:ClockTest\n[PASS] testLocalEvmFutureBlockAnd256BlockBoundary() (gas: 225376)\n[PASS] testRobinhoodUsesArbSysNotL1EstimateAndHandlesExpiry() (gas: 238560)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 280.24µs (161.35µs CPU time)\n\nRan 2 tests for test/Factory.t.sol:FactoryTest\n[PASS] testFactoryInvalidSearchRange() (gas: 4937)\n[PASS] testHookFactoryFlagsImmutableConfigAndIdempotence() (gas: 5999719)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 57.92ms (30.61ms CPU time)\n\nRan 2 tests for test/AutoRepairReviewV35.t.sol:IndependentAutoRepairReview\n[PASS] testAutomaticRepairRecordsHistoricalWeekBeforeCompletion() (gas: 5411876)\n[PASS] testLateAutomaticRepairCannotReopenSeasonEligibility() (gas: 4275820)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 72.84ms (39.86ms CPU time)\n\nRan 13 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testCannotSpendAnotherHoldersBalanceWithoutAllowance() (gas: 57645)\n[PASS] testFactoryReceivesEntireSupplyInsteadOfOriginOrCaller() (gas: 211614)\n[PASS] testFuzzTransferFromSpendsOnlyApprovedAmount(uint256,uint256) (runs: 256, μ: 166584, ~: 167724)\nLogs:\n  Bound result 1508857331349\n  Bound result 1338239256118\n\n[PASS] testFuzzTransfersConserveSupplyWithoutFees(uint256) (runs: 256, μ: 151137, ~: 151056)\nLogs:\n  Bound result 507\n\n[PASS] testInfiniteAllowanceRetainedAndCanBeRevoked() (gas: 188186)\n[PASS] testLaunchAllocationsAndSubsequentEndowmentTransferArePlainTransfers() (gas: 286616)\n[PASS] testMetadataAndFixedSupply() (gas: 52708)\n[PASS] testNoMintBurnOwnerPauseBlacklistOrUpgradeEntryPoints() (gas: 510976)\n[PASS] testRuntimeHasNoUpgradeOrDestructionOpcodes() (gas: 778334)\n[PASS] testTransferAboveBalanceRevertsWithoutChangingSupply() (gas: 54899)\n[PASS] testTransferFromFailureRestoresAllowance() (gas: 109283)\n[PASS] testZeroAndSelfTransfers() (gas: 95974)\n[PASS] testZeroRecipientAndSpenderRejected() (gas: 61397)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 76.06ms (73.85ms CPU time)\n\nRan 1 test for test/DeployGateV314.t.sol:DeployGateV314Test\n[PASS] testAllLaunchConstructorsWorkWithNoProtocolCode() (gas: 49350901)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 37.30ms (37.16ms CPU time)\n\nRan 3 tests for test/PotV35.t.sol:PotV35Test\n[PASS] testPotDepositRequiresActualTokensAndAuthority() (gas: 256924)\n[PASS] testPotSplitAndLotteryCommitSurvivesFullInventory() (gas: 11851210)\n[PASS] testPotUnclaimedRolloverOnlyAfterFourWeeksNoDoubleClaim() (gas: 6429769)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 109.23ms (66.94ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testConstructorRejectsMissingInputsAndDoesNotCallExternalContracts() (gas: 3994)\n[PASS] testForeignCallerDoesNotGetAnyAuthority() (gas: 43053059)\n[PASS] testImmutableGraphAndEip170Sizes() (gas: 187323)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 29.26ms (11.60ms CPU time)\n\nRan 3 tests for test/Pause.t.sol:PauseTest\n[PASS] testOnlySwarmBoundedDurationAndCannotExtendPause() (gas: 242972)\n[PASS] testSalePausedWhileEntropyClaimsWithdrawalsAndEpochsContinue() (gas: 15148717)\n[PASS] testUnpauseCannotResetNextPauseCooldown() (gas: 194647)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 85.60ms (68.07ms CPU time)\n\nRan 2 tests for test/V310.t.sol:ToolchainPinsV310Test\n[PASS] testEveryModuleOfThisBuildMatchesOneToolchainPin() (gas: 168471)\n[PASS] testPinsAreOneToolchainAndRejectUnknownCode() (gas: 164239)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 4.09ms (2.01ms CPU time)\n\nRan 6 tests for test/ForeignTokenTwin.t.sol:ForeignTokenTwinTest\n[PASS] testBinderBindsTheGenuineRegistryThenAlreadyDone() (gas: 2793336)\n[PASS] testBinderCannotBypassAnyProof() (gas: 7228587)\n[PASS] testForeignTwinCannotBindFromTheAttacker() (gas: 1433024)\n[PASS] testForeignTwinIsSelfConsistentAndPassesEveryProofExceptTheBinder() (gas: 137039)\n[PASS] testNoNonBinderCanBindEitherRegistry() (gas: 2005687)\n[PASS] testZeroBinderRevertsAtConstruction() (gas: 673051)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 47.75ms (21.25ms CPU time)\n\nRan 8 tests for test/FeesParams.t.sol:FeesParamsTest\n[PASS] testAllDefaultParamsWithinHardBounds() (gas: 1255771)\n[PASS] testBuyBackPoolOnlySlippageFailureRollbackAndDustGriefBlocked() (gas: 774066)\n[PASS] testExactEthSplitsHeartbeatCapAndPullPayments() (gas: 512724)\n[PASS] testFuzzNoStepAboveTenPercent(uint96) (runs: 256, μ: 44973, ~: 45115)\nLogs:\n  Bound result 3629\n\n[PASS] testFuzzSplitsConserveEveryWei(uint96) (runs: 256, μ: 206504, ~: 210856)\nLogs:\n  Bound result 3629\n\n[PASS] testHeartbeatCapFixedAtOneEth() (gas: 207904)\n[PASS] testParamsStepCooldownBoundsAuthorityAndLetter() (gas: 195823)\n[PASS] testPoolNoPublicReserveRecycleOrPayment() (gas: 135304)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 189.04ms (144.58ms CPU time)\n\nRan 7 tests for test/V33.t.sol:LaunchProtectionTest\n[PASS] testBuyTaxHasImmutableSteps() (gas: 97570)\n[PASS] testLaunchTaxChargedAndRoutedEntirelyToPool() (gas: 228018)\n[PASS] testNoBuySizeLimitAtAnyLaunchStep() (gas: 1691629)\n[PASS] testNormalBuyAfterDecayHasNoLaunchTax() (gas: 1479517)\n[PASS] testSellsPayNormalFeeDuringLaunch() (gas: 339501)\n[PASS] testSnipersSplittingBuysStillPayTheCurve() (gas: 657266)\n[PASS] testViewsBeforeInitialization() (gas: 4883854)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 36.77ms (7.96ms CPU time)\n\nRan 5 tests for test/AuditV314.t.sol:AuditV314Test\n[PASS] testDustAmountCannotReduceExecutedBatchAndEmptyQueueReverts() (gas: 1383695)\n[PASS] testLaterSameEpochCreditKeepsEarlierTaxVintage() (gas: 608585)\n[PASS] testLockInsertionWalkIsBoundedAndFailureIsAtomic() (gas: 30159768)\n[PASS] testOnlyFarmerCanRetireEvenAnEmptyFarm() (gas: 4306920)\n[PASS] testStaleSellAmountUsesCurrentDepthAndEnforcesCurrentMinimum() (gas: 1624852)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 191.86ms (196.05ms CPU time)\n\nRan 8 tests for test/PhasedReleaseV36.t.sol:PhasedReleaseV36Test\n[PASS] testBillboardsDisabledThenEnabled() (gas: 414524)\n[PASS] testEnableIsNoticedOnceNeverOffAndSwarmOnly() (gas: 355991)\n[PASS] testEnhancementDisabledThenEnabledOnce() (gas: 1098908)\n[PASS] testEverythingDeploysDisabledAndCoreStillWorks() (gas: 8179262)\n[PASS] testFuzzUnannouncedFeatureCannotBeEnabled(uint256) (runs: 256, μ: 30151, ~: 29968)\n[PASS] testLocksStakeAndLobbyDisabledThenEnabled() (gas: 2861203)\n[PASS] testPotDisabledFollowsV34RoutingThenEnabled() (gas: 455827)\n[PASS] testReservedEventsDisabledThenEnabled() (gas: 557745)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 93.11ms (75.96ms CPU time)\n\nRan 10 tests for test/Bounties.t.sol:BountiesTest\n[PASS] testBuyBountyProportionalCapNoDustCreditAndFailureRollback() (gas: 680020)\n[PASS] testEmptyRosterAndInvalidBatchReceiveNothing() (gas: 1419248)\n[PASS] testEveryWorkKindBoundedByHeartbeatAndAuthorizedProducer() (gas: 64315585)\n[PASS] testLazySettlementUnpaidAndCannotReplay() (gas: 6970276)\n[PASS] testOnlyFinalizePaidOnceAndEmptyWeekUnpaid() (gas: 2292196)\n[PASS] testPackEntropyCapturedOnceWithFullInventoryAndThroughPause() (gas: 3713527)\n[PASS] testPlanResolutionPaidOnceIncludingAdvanceForwarding() (gas: 2934177)\n[PASS] testRemovedWorkBountiesRejectedEvenFromOldProducer() (gas: 179981)\n[PASS] testStarterEntropySurvivesFullInventoryExpiryAndPauseWithoutReplayPayment() (gas: 5324477)\n[PASS] testWorkCreditRespectsZeroGasPricePriceCeilingAndUnitCap() (gas: 333726)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 231.15ms (198.34ms CPU time)\n\nRan 6 tests for test/EndowmentEscrowV38.t.sol:EndowmentEscrowV38Test\n[PASS] testConstructorRejectsMissingInputs() (gas: 3911)\n[PASS] testForwardRejectsBadProofs() (gas: 2647974)\n[PASS] testForwardRequiresBalance() (gas: 748474)\n[PASS] testForwardSendsWholeBalanceOnceToAuthenticatedPoolAndFundsEndowment() (gas: 1702540)\n[PASS] testForwardWithRealEndowmentActivatesDrip() (gas: 12904786)\n[PASS] testTwinWithForeignTokenCannotDrainEscrow() (gas: 12918283)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 47.48ms (29.47ms CPU time)\n\nRan 3 tests for test/StandardAdapter.t.sol:StandardAdapterTest\n[PASS] testExistingHookKeyPreservedAndNoExtraFee() (gas: 330662)\n[PASS] testRequiresThirtyMinutesFreshOracleAndAuthorizedCallback() (gas: 198351)\n[PASS] testSettlementSlippageFailurePreservesCredits() (gas: 240594)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 21.18ms (2.09ms CPU time)\n\nRan 1 test for test/EndowmentGame.t.sol:EndowmentGameTest\n[PASS] testRealMiningCannotSpendFutureEndowment() (gas: 130998353)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 376.03ms (340.01ms CPU time)\n\nRan 18 tests for test/EconomyV35.t.sol:EconomyV35Test\n[PASS] testAllEnhancementTableEndpointsAndGlobalBonusCap() (gas: 1477864)\n[PASS] testDurabilityBoundariesAndIdleNoWear() (gas: 38169181)\n[PASS] testEnhanceBurnFailureAndLevelGate() (gas: 1218579)\n[PASS] testEnhanceCapsNoticeUpwardOnlyAndThirtyDays() (gas: 355848)\n[PASS] testEnhanceCommitCannotPlaceScrapOrRetryAndLapsesAsWorstOutcome() (gas: 2423527)\n[PASS] testFeeSalesDepthSlippageCadenceAndNormalFeePot() (gas: 1737855)\n[PASS] testFreeAllowlistOnceWindowStarterScrapAndMetadata() (gas: 3102778)\n[PASS] testFreeRootRemainsFrozenAfterSevenDays() (gas: 43976)\n[PASS] testFreeRootWindowAndIndexLimit() (gas: 55991)\n[PASS] testFuzzPriceCurveDaysBounds(uint32,uint32) (runs: 256, μ: 88577, ~: 90188)\nLogs:\n  Bound result 52490\n\n[PASS] testLockBonusRedistributesWithinReservedEmission() (gas: 11683136)\n[PASS] testLockEscrowNoEarlyExitAndWalletCap() (gas: 5394589)\n[PASS] testQuoteScalesLastSettlementAndHasFloor() (gas: 4285279)\n[PASS] testRepairYieldQuoteAndAutoRepairCreditsOnly() (gas: 10812876)\n[PASS] testRoomsChargeYieldDaysAndRetainAgeGates() (gas: 2618884)\n[PASS] testSystemSellDustCannotOccupyCadenceAndCappedHeartbeatReturnsTokens() (gas: 1562949)\n[PASS] testTokenOnlyGiftSplitsNoEthPeg() (gas: 1738156)\n[PASS] testZapAtomicMinOutPauseAndRefund() (gas: 1441448)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 329.29ms (572.20ms CPU time)\n\nRan 1 test for test/StandardV4Integration.t.sol:StandardV4IntegrationTest\n[PASS] testStandardAdapterRealPoolPaysExistingHookExactlyOnce() (gas: 1949103)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 48.65ms (2.34ms CPU time)\n\nRan 1 test for test/WarReviewV35.t.sol:IndependentWarReview\n[PASS] testWarWinnerCannotChangeAfterDeadline() (gas: 5734360)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.02ms (1.81ms CPU time)\n\nRan 1 test for test/YieldFloorReviewV35.t.sol:IndependentYieldFloorReview\n[PASS] testFirstEpochItemQuotesKeepNonzeroFloorAtCorrectScale() (gas: 673277)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.21ms (1.08ms CPU time)\n\nRan 6 tests for test/Market.t.sol:MarketTest\n[PASS] testBuyChargesExactlyOnePercentAllToRewards() (gas: 1729963)\n[PASS] testFuzzTotalFeeHardCap(uint96) (runs: 256, μ: 1804541, ~: 1809036)\nLogs:\n  Bound result 1732\n\n[PASS] testOnlyManagerCorrectPoolExactInputAndHookAddress() (gas: 111130)\n[PASS] testSingleDumpIncludesItselfAndFeeDecaysWithoutGriefReset() (gas: 17155329)\n[PASS] testTwapAveragesEthPriceAcrossUnequalPrices() (gas: 2330601)\n[PASS] testTwapWarmupAndFlashManipulationResistance() (gas: 1883191)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 512.35ms (518.58ms CPU time)\n\nRan 8 tests for test/TwinCaptureV312.t.sol:TwinCaptureV312Test\n[PASS] testBinderChoosingTwinOrphansHonestGame() (gas: 12068523)\n[PASS] testBinderChosenTwinCannotPayAttacker() (gas: 12034732)\n[PASS] testEOAMarketCannotBind() (gas: 5759282)\n[PASS] testHonestBindThenForwardReachesHonestPool() (gas: 6532903)\n[PASS] testHookWithForeignConfigurationCannotBind() (gas: 5801492)\n[PASS] testTwinCannotWinTheBindRace() (gas: 13565631)\n[PASS] testTwinWithForeignMarketCannotBind() (gas: 12270581)\n[PASS] testTwinWithForeignTokenCannotBind() (gas: 12441654)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 73.51ms (52.50ms CPU time)\n\nRan 5 tests for test/fork/RehearsalV311.t.sol:RehearsalV311Test\n[SKIP] testRehearsalAttestedAnswerChangesPlanWithinBand() (gas: 0)\n[SKIP] testRehearsalGasPerLaunchUnderPlatformCeiling() (gas: 0)\n[SKIP] testRehearsalKeeperPassAdvancesEpochsRevealsEntropyAndClaimFeesPaysTeam() (gas: 0)\n[SKIP] testRehearsalLaunchTaxThenOnePercentAndSurcharge() (gas: 0)\n[SKIP] testRehearsalPacksOpenOneHourAfterLaunch() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 5 skipped; finished in 747.06µs (64.27µs CPU time)\n\nRan 8 tests for test/V39.t.sol:V39Test\n[PASS] testBaseDepositsAreEntirelyRewardEth() (gas: 190166)\n[PASS] testGridAcceptsSeverityFromThreeThousandAndRejectsBelow() (gas: 2948508)\n[PASS] testHookAddsExactlyOnePercentOnBuysAndSellsAfterLaunchWindow() (gas: 2180818)\n[PASS] testHookHasNoNetworkShareRecipientOrWithdrawal() (gas: 107646)\n[PASS] testMarketFactoryConfigHasNoNetworkRecipient() (gas: 14199018)\n[PASS] testRegistryAcceptsEitherToolchainPinAndNothingElse() (gas: 590544)\n[PASS] testSellSurchargeStillProgressiveAndCappedAtFifteenPercent() (gas: 1832446)\n[PASS] testStepLaunchTaxUnchangedAndFullyToRewards() (gas: 1292115)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 291.97ms (266.45ms CPU time)\n\nRan 8 tests for test/V4Integration.t.sol:V4IntegrationTest\n[PASS] testRealV4BuyAndSingleSwapSellTaxConserveSettlement() (gas: 2269489)\n[PASS] testRealV4ManipulatedSpotCannotInstantlySetBuybackQuote() (gas: 1909783)\n[PASS] testRealV4SmallBuyPaysPositiveKeeperMargin() (gas: 2072643)\nLogs:\n  real V4 0.2ETH buy gas: 1933484\n  real V4 buy bounty wei: 48650275000000\n\n[PASS] testRealV4SystemBuyUsesTwapAndOnlySystemFunds() (gas: 2078432)\n[PASS] testRealV4SystemSalesUseDepthTwapNormalFeesAndConserveTokens() (gas: 2247131)\n[PASS] testSystemBuybackOffsetsRecordedSellImbalance() (gas: 2509436)\n[PASS] testTenEthPoolRewardBuyAtSpotTwapIncludesLpFee() (gas: 2151602)\n[PASS] testTenEthPoolSystemSellAtSpotTwapIncludesLpFee() (gas: 4120127)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 148.94ms (30.20ms CPU time)\n\nRan 9 tests for test/AuditV318.t.sol:AuditV318Test\n[PASS] testAuditPriceLimitedBuyRevertsInsteadOfPayingTaxOnUnconsumedEth() (gas: 132817)\n[PASS] testBeforeSwapNamesThePriceLimitedBuyError() (gas: 63455)\n[PASS] testFullFillBuysPayEachStepExactly() (gas: 2526768)\n[PASS] testFullFillTenEthBuyPaysExactlyNinetyPercentInTheFirstStep() (gas: 413224)\n[PASS] testFuzzOnlyTheExtremeBoundBuysAndPaysTheFlooredTax(uint96,uint160,uint8) (runs: 256, μ: 1563485, ~: 1367437)\nLogs:\n  Bound result 42264174625779438556\n  Bound result 136034044430987246\n  Bound result 0\n\n[PASS] testPriceLimitedBuyRefusedAfterLaunchWindowToo() (gas: 4642321)\n[PASS] testPriceLimitedSellStillFillsPartiallyAndIsChargedOnActualOutput() (gas: 2237178)\n[PASS] testPublicInterfaceUnchanged() (gas: 108831)\n[PASS] testSystemRewardBuyStillFills() (gas: 1992056)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 679.17ms (558.14ms CPU time)\n\nRan 11 tests for test/Items.t.sol:ItemsTest\n[PASS] testComputeHashSupportHashAndBonusesReplaceDuo() (gas: 4715342)\n[PASS] testDurabilityWearRepairAndEnhancementMetadataPreserved() (gas: 8393341)\n[PASS] testEquipRarityGatesAndMythicGate() (gas: 4162922)\n[PASS] testFullStackRarityCapAndRoomFlags() (gas: 7665589)\n[PASS] testInventoryMintCannotExceedCapacityAndExpansionRises() (gas: 3356807)\n[PASS] testLockedItemCannotBeScrappedUntilEpochRolls() (gas: 5989066)\n[PASS] testOffgridSavings() (gas: 2711135)\n[PASS] testPaidXpCannotBypassRoomTwoAgeGate() (gas: 3746447)\n[PASS] testRoomGatesAndLevelProgression() (gas: 78475814)\n[PASS] testScrapPaysPoolYieldAndCannotRepeat() (gas: 7561671)\n[PASS] testSoulboundOnlyOwnFarmAndNoDuplicateTypes() (gas: 2265957)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 705.04ms (735.64ms CPU time)\n\nRan 2 tests for test/StandardMarket.t.sol:StandardMarketTest\n[PASS] testFuzzStandardSellNeverAddsProgressiveSurcharge(uint96) (runs: 256, μ: 1803175, ~: 1813765)\nLogs:\n  Bound result 840\n\n[PASS] testStandardBuyOnePercentAllToRewards() (gas: 1673334)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 617.53ms (589.90ms CPU time)\n\nRan 21 tests for test/SwarmDeskV37.t.sol:SwarmDeskV37Test\n[PASS] testBackupFailureUnknownFailureDeadlineAndPriceCap() (gas: 751317)\n[PASS] testBackupPullsExactPriceRecordsRequestAndRestrictsBodyAndCadence() (gas: 1207764)\n[PASS] testDeskSetHeartbeatBpsMovesFeeRouterShare() (gas: 945834)\n[PASS] testEmptyChainConstructorAndAuthenticatedBindingRejectSpoofs() (gas: 12683178)\n[PASS] testEventClampingAndFallbackWithoutAnswer() (gas: 1117363)\n[PASS] testExpiredOldSlotOldEpochAndUnexecutedAnswersNeverAct() (gas: 852773)\n[PASS] testFlatConstructorRejectsUnusedPackedBits() (gas: 7335783)\n[PASS] testForgedTamperedWrongSignerWrongDomainAndCallerRejected() (gas: 359833)\n[PASS] testFutureIssueWrongTypeMalformedLengthAndPriceNeverConsume() (gas: 327553)\n[PASS] testFuzzEveryParamHardBoundsAndTenPercentStep(uint8,uint248) (runs: 256, μ: 475716, ~: 477797)\nLogs:\n  Bound result 1\n\n[PASS] testNextSlotAcceptsSameQuestionAndChangedExecutionBytesReject() (gas: 1146136)\n[PASS] testNoAdminPathsAndEntireGraphUsesDesk() (gas: 428356)\n[PASS] testNoopRegulatorAcceptedAndParamsCooldownPreserved() (gas: 452656)\n[PASS] testRegulatorClampsParamsAnnouncesPhasesAndThirtyDayCaps() (gas: 1146623)\n[PASS] testRegulatorSkipsOutOfRangeKeysInsteadOfClampingToFortyFive() (gas: 501093)\n[PASS] testReplayDifferentSourceAndSecondAnswerSameSlotIgnored() (gas: 1068212)\n[PASS] testRobinhoodNativeClockCallbackWithin200k() (gas: 352907)\n[PASS] testScheduleDeliveryStoresUnder200kThenExecutesTwoPlans() (gas: 984580)\n[PASS] testSubmitRelayAcceptsAttestedAnswerFromAnyoneOnce() (gas: 1092075)\n[PASS] testSubmitRelayRejectsForgedWrongQuestionStaleAndMalformed() (gas: 1843104)\n[PASS] testWrongQuestionUnknownRequestWeakPanelAndWindowRejected() (gas: 364850)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 609.92ms (632.72ms CPU time)\n\nRan 7 tests for test/HeartbeatBpsV313.t.sol:HeartbeatBpsV313Test\n[PASS] testFuzzAnyShareConservesEveryWeiAndNeverMovesTeamOrPot(uint16,uint96) (runs: 256, μ: 1331920, ~: 1528705)\nLogs:\n  Bound result 201\n  Bound result 21127798574346\n\n[PASS] testLaunchDefaultIsTwoPercentAndSplitUnchanged() (gas: 230935)\n[PASS] testLoweredShareBackToFloorAndFloorIsHard() (gas: 401104)\n[PASS] testMaximumShareWithPotEnabledIsClippedToWhatIsLeft() (gas: 1867739)\n[PASS] testOnlyTheSwarmWithinBoundsStepAndCooldownCanMoveTheShare() (gas: 341795)\n[PASS] testRaisedShareStillStopsAtTheOneEthCap() (gas: 480520)\n[PASS] testSwarmSet220CreditsTwoPointTwoPercentOfSurchargeAndTokens() (gas: 543701)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 881.68ms (867.55ms CPU time)\n\nRan 20 tests for test/V33.t.sol:V33Test\n[PASS] testActionBeforeExpiryMovesBucketWithoutDoubleCount() (gas: 25983504)\n[PASS] testAdvanceIsConstantInExpiringFarms() (gas: 38430108)\n[PASS] testAgeCapsAtBoundaries() (gas: 204552)\n[PASS] testClaimDoesNotRecommitWhileBehind() (gas: 37239808)\n[PASS] testClaimRecommitsAndPackRecommits() (gas: 60787577)\n[PASS] testDistrictScoreAveragePerFarmAndTenPercentWalletCap() (gas: 4607489)\n[PASS] testHeartbeatCapExcessGoesToPoolAndBaseFeeIsAllRewards() (gas: 270973)\n[PASS] testIdleFarmLeavesDenominatorAfterTwelveEpochs() (gas: 23504929)\n[PASS] testLaunchTaxDepositIsAllPoolAndMarketOnly() (gas: 137567)\n[PASS] testMergeRemoved() (gas: 512630)\n[PASS] testPackLobbySellSplit88Team10Heartbeat2() (gas: 407960)\n[PASS] testPackSaleOpensSixtyMinutesAfterLaunch() (gas: 1264387)\n[PASS] testPaidXpCannotBypassAgeGates() (gas: 59083319)\n[PASS] testPaidXpCappedPerDayActivityUncapped() (gas: 13264967)\n[PASS] testPartialRoomIsClippedNotReverted() (gas: 2156541)\n[PASS] testRewardsEarnedBeforeExpiryAreNeverLost() (gas: 47725769)\n[PASS] testSingleWhaleDistrictCannotWinAlone() (gas: 4534340)\n[PASS] testSyncRecommitsFromNextEpoch() (gas: 33379218)\n[PASS] testTokenPacksAlsoWaitForOpening() (gas: 59864)\n[PASS] testTopSpenderTrackingIsExact() (gas: 5411751)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 832.86ms (1.88s CPU time)\n\nRan 3 tests for test/Gas.t.sol:GasTest\n[PASS] testGasCommonActions() (gas: 10873117)\nLogs:\n  buy token pack: 925868\n  open one pack: 514873\n  equip: 966814\n  repair wallet: 614735\n  enhancement commit: 568464\n  expand: 390489\n  token pack wallet: 655187\n  withdraw: 255483\n  unequip: 407017\n\n[PASS] testGasFullFarmLongIdleBoundedChunks() (gas: 119295605)\nLogs:\n  settle full 24-item farm eight epochs after 40 idle: 12496054\n\n[PASS] testGasTypicalFarmSettlementHasNoBounty() (gas: 8944774)\nLogs:\n  settle typical three-item farm one epoch: 923830\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.06s (1.08s CPU time)\n\nRan 3 tests for test/HookBinding.t.sol:HookBindingTest\n[PASS] testHoldBeforeGameExistsThenBindOnceAndFlushExactStreams() (gas: 43434476)\n[PASS] testLookAlikeCannotBindEvenWhenTeamCalls() (gas: 1908025)\n[PASS] testWrongRouterAndMissingCodeRejectedBeforePermanentBind() (gas: 41150130)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.06s (21.47ms CPU time)\n\nRan 12 tests for test/AuditV317.t.sol:AuditV317Test\n[PASS] testAdvanceEpochDefersUntilTheRearmedEventResolves() (gas: 1433172)\n[PASS] testDestroyedItemResyncWaitsUntilTheFarmIsCaughtUp() (gas: 12580622)\n[PASS] testDestroyedItemWeightStale() (gas: 10356036)\n[PASS] testEnhancementInsideWindowStillCapturesAndResolvesNormally() (gas: 1164136)\n[PASS] testEnhancementLapseEmitsResolvedAsFailureAndKeepsSoulboundChecks() (gas: 2005877)\n[PASS] testEnhancementRearmGrind() (gas: 53784157)\n[PASS] testOwnerActionClearsThePendingResync() (gas: 8345887)\n[PASS] testSubmittedPlanDiscardedAfterHashWindow() (gas: 1740590)\n[PASS] testUnlockBlockedWhileEpochStale() (gas: 895813)\n[PASS] testUnlockLiveAndCaughtUpStillResyncsWeight() (gas: 58436968)\n[PASS] testUnlockWhileBehindReturnsPrincipalAndSkipsResync() (gas: 56212427)\n[PASS] testUnplannedLapsedWindowAlsoRearmsAndNeverUsesAPrecomputableSeed() (gas: 230726)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 1.06s (1.05s CPU time)\n\nRan 14 tests for test/V34.t.sol:V34Test\n[PASS] testBestFarmCapsAbsoluteSpendAndBreaksTiesByAddress() (gas: 4665724)\n[PASS] testBestFarmNeedsTwentyEpochsAndUsesCappedAbsoluteSpend() (gas: 4144232)\n[PASS] testBuybackSlippage150BpsMaxAndIntervalCannotBeBypassed() (gas: 756212)\n[PASS] testDonationsAndOrdinaryInflowsCannotPretendToBeEndowment() (gas: 1520675)\n[PASS] testEntropyAt256BoundaryAndAt257RearmsWithoutPayOrMint() (gas: 3283396)\n[PASS] testFirstRewardStartsCurrentEpochAtHalfTimeAndSnapshotCannotBeReplaced() (gas: 4843822)\n[PASS] testFreeFarmDoesNotDiluteDistrictOrClaimPaidPrize() (gas: 4739687)\n[PASS] testGameReadinessBothChecksRollbackEthAndTokenPurchase() (gas: 3618362)\n[PASS] testHookUninitializedCannotOpenOrStartEpochAndCallerCannotStartClock() (gas: 6045893)\n[PASS] testLaunchTaxExactBoundaries() (gas: 5929129)\n[PASS] testMythicGateEvaluatedAtRevealNotAtPayment() (gas: 1624053)\n[PASS] testPackOpeningFollowsHookAndNotLegacyDeployTimestamp() (gas: 101151)\n[PASS] testRemainderTransferredToPredictedPoolBeforeDeploymentAndNoApprovalNeeded() (gas: 2463041)\n[PASS] testStarterEntropyRearmsAfterClaimWindowAndNoDoubleMint() (gas: 772310)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 679.79ms (107.33ms CPU time)\n\nRan 9 tests for test/Packs.t.sol:PacksTest\n[PASS] testExactPaymentAndFutureBlockRequired() (gas: 1671228)\n[PASS] testExactRarityThresholdsAndMythicGate() (gas: 282935)\n[PASS] testExpiryRearmsWithoutMintingAndInventoryOpeningLimit() (gas: 3797222)\n[PASS] testFuzzVrgdaAlwaysBounded(uint32,uint32) (runs: 256, μ: 61264, ~: 63085)\nLogs:\n  Bound result 52490\n\n[PASS] testItemTypeDistributionExact() (gas: 626492)\n[PASS] testNoWalletGlobalOrTokenPackDailyLimit() (gas: 4392810)\n[PASS] testStarterWindowProofTokenIdOnceAndInventoryFailureRetry() (gas: 881490)\n[PASS] testTokenPackSameQuoteAndSplitWhenUsingWalletOrCredits() (gas: 76592671)\n[PASS] testVrgdaInitialStepDecayFloorCeilingAndBulkPricing() (gas: 1299987)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.04s (603.90ms CPU time)\n\nRan 6 tests for test/SeasonAudit.t.sol:SeasonAuditTest\n[PASS] testAuditThresholdStrictAndNoWhaleSoftCap() (gas: 40508248)\n[PASS] testLotteryEntitlementSurvivesFullInventory() (gas: 131721528)\n[PASS] testPackSupplyDropOnlyActiveFarmsAtDoublePace() (gas: 11743280)\n[PASS] testParameterChangesCannotChangeClosedEpochBetweenBatches() (gas: 12523805)\n[PASS] testSeasonCannotFinalizeEarlyAndExpiredLotteryMustRearm() (gas: 124179117)\n[PASS] testWeeklyThreeDistinctTicketWinnersFuturePackAndBestPrize() (gas: 124934770)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.06s (2.30s CPU time)\n\nRan 6 tests for test/Endowment.t.sol:EndowmentTest\n[PASS] testDirectTransferCannotBypassOrBackdateDrip() (gas: 368166)\n[PASS] testExactFundingFullLinearDripAndConservation() (gas: 832168)\n[PASS] testFuzzCumulativePaymentsCannotExceedVestedPrincipal(uint32,uint128) (runs: 256, μ: 523191, ~: 524727)\nLogs:\n  Bound result 21\n  Bound result 7760567710688070922\n\n[PASS] testNoTeamDonorOrSwarmWithdrawalOrReserveAuthority() (gas: 614309)\n[PASS] testParamsSnapshotCannotAccelerateOrRelockExistingEndowment() (gas: 303686)\n[PASS] testUnderfundingCannotActivateAndDonationsStayConserved() (gas: 453428)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 966.44ms (930.33ms CPU time)\n\nRan 5 tests for test/FarmDailyBasisV317.t.sol:FarmDailyBasisV317Test\n[PASS] testBasisRisesAtOnceToAHigherSettledYield() (gas: 15550655)\n[PASS] testDecayConstantIsExposed() (gas: 8403)\n[PASS] testProRataEntryEpochIsScaledToItsFullEpochEquivalent() (gas: 8748921)\n[PASS] testStarvingForManyEpochsDecaysGeometricallyNotToTheFloor() (gas: 28087075)\n[PASS] testZeroNetEpochOnlyDecaysTheBasisByOneStep() (gas: 14591209)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.02s (406.82ms CPU time)\n\nRan 6 tests for test/Regression.t.sol:RegressionTest\n[PASS] testCableRepairRestoresOnlyRemainingHalfEpoch() (gas: 11818095)\n[PASS] testEmptyEpochPreservesLastSettledRateButResetsScrapAllowance() (gas: 11008366)\n[PASS] testFuzzCableRepairBlendHandlesNonMonotonicRarityBonuses(uint16) (runs: 256, μ: 1374187, ~: 1374014)\nLogs:\n  Bound result 2\n\n[PASS] testRegisterOnlyAccountsDoNotAddSettlementWorkAndEmptyFarmCanRetire() (gas: 2037709)\n[PASS] testRepairAndPaidPackCannotRetroactivelyBoostEpoch() (gas: 9562743)\n[PASS] testUnlimitedFreshPacksCannotDrainPoolByScrapping() (gas: 9668475)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.16s (1.21s CPU time)\n\nRan 13 tests for test/Events.t.sol:EventsTest\n[PASS] testCheapTariffAppliesCitywide() (gas: 6431880)\n[PASS] testColdPowerFireImmuneAndCleanPowerSurgeImmune() (gas: 7916395)\n[PASS] testFallbackAndExpiredSeedIndependentOfSwarmNumber() (gas: 1788804)\n[PASS] testFireNoCoolingZeroYieldColdPowerImmune() (gas: 6156432)\n[PASS] testGreenWaveRaisesDistrictMiningTenPercent() (gas: 6433957)\n[PASS] testLobbyOwnDistrictSplitDecayAndMinimumWeight() (gas: 1083530)\n[PASS] testOutageAndOffgridRoomMitigation() (gas: 7068792)\n[PASS] testPlansOnlyNextTwoOnceAndBoundedSeverity() (gas: 344926)\n[PASS] testRollingCapsAndInitialPositiveQuotaWithHostilePlans() (gas: 102269963)\n[PASS] testSurgeCanDestroyCommonButNeverLegendary() (gas: 6422908)\n[PASS] testSurgeDamagesExactlyOneItemAndCleanPowerImmune() (gas: 6305934)\n[PASS] testSurgeNeverDestroysLegendaryOrMythic() (gas: 9523164)\n[PASS] testTheftRouterDisabledAndRepairRestores() (gas: 6862770)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 1.32s (719.19ms CPU time)\n\nRan 2 tests for test/ReservedEventsV35.t.sol:ReservedEventsV35Test\n[PASS] testFuzzReservedFestivalCannotExceedFifteenPercent(uint16) (runs: 256, μ: 4927536, ~: 4927534)\n[PASS] testReservedHeatwaveExtraCoolingWearAndBothProtections() (gas: 10178642)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.32s (1.35s CPU time)\n\nRan 9 tests for test/Epochs.t.sol:EpochsTest\n[PASS] testCannotAdvanceEarlyAndBountyOnce() (gas: 2513731)\n[PASS] testClaimsEveryEpochAndRedistributionIsNextEpoch() (gas: 12010062)\n[PASS] testGasAdvanceIndependentOfRoster() (gas: 895978527)\nLogs:\n  advance empty roster: 1284212\n  advance 1000 farms: 1473392\n\n[PASS] testNoCatchupEmissionDuringGap() (gas: 6270392)\n[PASS] testNoRetroactiveEquipmentAndBoundedBatches() (gas: 5790681)\n[PASS] testNoWhaleCapHashShares() (gas: 10182869)\n[PASS] testReferralOneLevelSetOnceNoSelf() (gas: 7531610)\n[PASS] testTaxCurveExactAndFloor() (gas: 34112)\n[PASS] testWithdrawFailureRollsBackAndReentrancyCannotClaimTwice() (gas: 7446317)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 8.02s (8.19s CPU time)\n\nRan 15 tests for test/LaunchHook.t.sol:LaunchHookTest\n[PASS] testAcceptedManagerFloatConstraintOnTokenOnlyPool() (gas: 438507)\n[PASS] testAllCallbacksRejectNonManagerEvenWithCorrectPool() (gas: 159896)\n[PASS] testAnotherSenderCannotInitializeFactoryPool() (gas: 234464)\n[PASS] testExactOutputAndZeroInputRefusedInBothDirections() (gas: 383766)\n[PASS] testFactoryInitializesOnceThroughRealPoolManager() (gas: 204494)\n[PASS] testFeesHeldAndFlushRefusedUntilDeskAndRouterBind() (gas: 782750)\n[PASS] testFuzzBuyStepsConserveEthAndTokens(uint96,uint16) (runs: 256, μ: 1337023, ~: 1062330)\nLogs:\n  Bound result 9999999999999016022\n  Bound result 10\n\n[PASS] testHookHasNoOwnerOrUpgradeEntryPoint() (gas: 9058924)\n[PASS] testManagerCannotDriveCallbacksForAnotherPool() (gas: 99574)\n[PASS] testPartialFillRefusedWithExactError() (gas: 195454)\n[PASS] testPermissionsMatchV4CoreABIAndMinedAddress() (gas: 26115)\n[PASS] testPinnedCreationHashAndRuntimeSize() (gas: 115688)\n[PASS] testPriceLimitedBuyRefusedBeforeFundsMove() (gas: 543405)\n[PASS] testSellFeesAccrueOnActualOutputAndFactoryCanCollect() (gas: 2611271)\n[PASS] testWrongPoolTermsCannotInitialize() (gas: 282717)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 15.81s (898.23ms CPU time)\n\nRan 9 tests for test/LazyAccounting.t.sol:LazyAccountingTest\n[PASS] testAuditChargesTenPercentEvenAtHalfSeverityAndThresholdIsFrozen() (gas: 6161890)\n[PASS] testClaimCatchesUpWhilePacksPausedAndDoesNotEraseRemainingHistory() (gas: 25641763)\n[PASS] testExhaustedFarmCannotCollectRedistributionByRemainingIdle() (gas: 15191242)\n[PASS] testFuzzLazyEqualsIndependentEagerForRandomFarmsAndAllEvents(uint256) (runs: 256, μ: 45582670, ~: 45594086)\n[PASS] testGlobalAccumulatorAndWeightsAreSnapshottedBeforeMutations() (gas: 9311279)\n[PASS] testLateSeasonSettlementPaysMiningWithoutChangingFrozenWinners() (gas: 59490917)\n[PASS] testOneWeiMiningGreenCannotLockSettlementThroughEnvelopeRounding() (gas: 11069658)\n[PASS] testSparseMatureVintageConsumedBeforeRecentSlotAfterWrap() (gas: 43222421)\n[PASS] testStaleActionsRequireChunksAndNeverBlockGlobalAdvance() (gas: 40505475)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 15.91s (16.72s CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantsTest\n[PASS]\nInvariantsTest invariants:\n[PASS] invariantAllowlistRootAndWalletLimit\n[PASS] invariantInventoryAndEthLiabilities\n[PASS] invariantLocksAndPotAlwaysBacked\n[PASS] invariantPriceAndParamsBounds\n[PASS] invariantReceiptsNeverForfeitOrFixMissingEntropy\n[PASS] invariantReservesBackedAndPendingCovered\n[PASS] invariantTokenConservationNoBurns\n InvariantsTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------+-----------+-------+---------+----------╮\n| Contract    | Selector  | Calls | Reverts | Discards |\n+======================================================+\n| GameHandler | advance   | 605   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | buy       | 592   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | claim     | 554   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | equip     | 596   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | expand    | 605   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | freeClaim | 576   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | fundPot   | 586   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | lock      | 601   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | resolve   | 614   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | rollover  | 552   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | settle    | 579   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | tokenPack | 562   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unlock    | 620   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unplace   | 550   | 0       | 0        |\n╰-------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 19800000000000000\n  Bound result 4900\n  Bound result 65536\n  Bound result 44\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 60.40s (60.34s CPU time)\n\nRan 58 test suites in 60.40s (119.67s CPU time): 355 tests passed, 0 failed, 6 skipped (361 total tests)\n","passed":true},{"durationMs":315,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Billboards.bidBillboard(uint256,uint256,string,string)\",\"Billboards.settleBillboard(uint256,uint256)\",\"Billboards.withdrawRefund()\",\"Civic.announce(uint256,string)\",\"Civic.buyLot(uint256)\",\"Civic.claimWar(uint256)\",\"Civic.consumeCityEvent()\",\"Civic.enable(uint256)\",\"Civic.finishCollapse()\",\"Civic.finishWar()\",\"Civic.fundCollapse(uint256)\",\"Civic.fundWar(uint256)\",\"Civic.grantDistrictBoost(uint256,uint16,string)\",\"Civic.listLot(uint8,uint8,uint8)\",\"Civic.startCollapse(uint256)\",\"Civic.startWar(uint8,uint8)\",\"Economy.autoRepair(address,uint256,uint256[24])\",\"Economy.lock(uint256,uint256)\",\"Economy.unlock()\",\"EndowmentEscrow.forward(address,uint64,uint256,bytes,uint64,uint256,bytes)\",\"Enhancement.activateCap()\",\"Enhancement.announceCap(uint8,string)\",\"Enhancement.capture(uint256)\",\"Enhancement.commit(uint256,uint256,bool)\",\"Enhancement.resolve(uint256)\",\"FarmCore.activity(address,uint256,uint256,uint256)\",\"FarmCore.autoRepair(address,uint256)\",\"FarmCore.buyRoom(uint256,bool)\",\"FarmCore.buyTokenPack(bool)\",\"FarmCore.civicPurchase(address,uint256)\",\"FarmCore.claimDrop()\",\"FarmCore.expand(bool)\",\"FarmCore.grantDrop(address,bytes32)\",\"FarmCore.lobby(uint256,bool)\",\"FarmCore.paidPackBought(address,uint256,uint256)\",\"FarmCore.place(uint256,uint256,uint256)\",\"FarmCore.prepareEnhancement(address,uint256,uint256,bool)\",\"FarmCore.process(address,uint256)\",\"FarmCore.register(address)\",\"FarmCore.repair(uint256,bool)\",\"FarmCore.repairCable(bool)\",\"FarmCore.retire(address)\",\"FarmCore.scrap(uint256,uint256)\",\"FarmCore.setAutoRepair(bool,uint16)\",\"FarmCore.setReferrer(address)\",\"FarmCore.sync()\",\"FarmCore.syncFor(address)\",\"FarmCore.unplace(uint256,uint256)\",\"FarmEngine.process(address,uint256,(uint256[24],uint8[24],uint16[24],bool,uint64,uint16))\",\"FarmItems.destroy(uint256)\",\"FarmItems.equip(address,uint256)\",\"FarmItems.expand(address)\",\"FarmItems.maintain(uint256,uint16,uint8)\",\"FarmItems.mint(address,uint8,uint8,bool)\",\"FarmItems.mintDrop(address,bytes32)\",\"FarmItems.safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\",\"FarmItems.safeTransferFrom(address,address,uint256,uint256,bytes)\",\"FarmItems.unequip(address,uint256)\",\"FarmRewards.advanceEpoch()\",\"FarmRewards.award(address,uint256)\",\"FarmRewards.beginMining(address,uint256)\",\"FarmRewards.claim(uint256)\",\"FarmRewards.flagResync(address)\",\"FarmRewards.initialize(address)\",\"FarmRewards.recordSales(uint256)\",\"FarmRewards.releasePrize(uint256)\",\"FarmRewards.scrap(address,uint256,uint256)\",\"FarmRewards.setReferrer(address,address)\",\"FarmRewards.setWeight(address,uint256)\",\"FarmRewards.settle(address,uint256)\",\"FarmRewards.spend(address,uint256)\",\"FarmRewards.spendTo(address,uint256,address)\",\"FeeRouter.depositBaseFee()\",\"FeeRouter.depositLaunchTax()\",\"FeeRouter.depositLobby()\",\"FeeRouter.depositPack()\",\"FeeRouter.depositSellTax()\",\"FeeRouter.executeBuys(uint256,uint256)\",\"FeeRouter.executePotBuys(uint256,uint256)\",\"FeeRouter.executeSells(uint256,uint256)\",\"FeeRouter.payBounty(address)\",\"FeeRouter.payWork(address,uint8,uint256,uint256)\",\"FeeRouter.receive()\",\"FeeRouter.routeTokens(uint256)\",\"FeeRouter.withdraw()\",\"FeeRouter.zapBuy(uint256,address)\",\"GameRegistry.register(uint256,uint64,uint256,bytes)\",\"GridOperator.lobbyETH()\",\"GridOperator.resolve(uint256)\",\"GridOperator.resolveFor(uint256,address)\",\"GridOperator.shift(uint256)\",\"GridOperator.submitPlan(uint256,uint8,uint16,bytes32,string)\",\"GridOperator.tokenLobby(address,uint256)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\",\"MarketFactory.deploy((address,address,int24,address,address,bytes32),bytes32)\",\"PackSale.buyPackFor(address)\",\"PackSale.buyPacksFor(address,uint256,uint256)\",\"PackSale.buyWithETH(address,uint256,uint256,uint256)\",\"PackSale.captureEntropy(uint256)\",\"PackSale.openPack(uint256)\",\"PackSale.pause(uint256)\",\"PackSale.rearm(uint256)\",\"PackSale.resolve(uint256,uint256)\",\"PackSale.rewardPack(address)\",\"PackSale.tokenPack(address)\",\"PackSale.unpause()\",\"Params.set(uint8,uint256,string)\",\"RewardPool.donate(uint256)\",\"RewardPool.fundEndowment()\",\"RewardPool.pay(address,uint256)\",\"RewardPool.recordInflow(uint256)\",\"RewardPool.recycle(uint256)\",\"RewardPool.reserve(uint256)\",\"Season.addPrize(uint256,uint256)\",\"Season.claimBest(uint256)\",\"Season.claimDistrict(uint256)\",\"Season.claimLottery(uint256)\",\"Season.complete(address,uint256)\",\"Season.depositPot(uint256)\",\"Season.finalize(uint256)\",\"Season.prepare(uint256,uint256)\",\"Season.rearm(uint256)\",\"Season.recordActivity(address,uint256,uint256,uint256)\",\"Season.recordRepair(address,uint256,uint256)\",\"Season.recordSpend(address,uint256,bool)\",\"Season.rollover(uint256)\",\"StandardAdapter.buy(uint256,address)\",\"StandardAdapter.unlockCallback(bytes)\",\"StandardMarket.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"StandardMarket.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"StandardMarket.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"StandardMarket.bindFeeRouter(address,uint64,uint256)\",\"StandardMarket.buy(uint256,address)\",\"StandardMarket.flushFees()\",\"StandardMarket.receive()\",\"StandardMarket.sell(uint256,uint256,address)\",\"StandardMarket.unlockCallback(bytes)\",\"StarterClaim.captureEntropy(uint256)\",\"StarterClaim.claim(uint256,bytes32[])\",\"StarterClaim.claimFree(uint256,bytes32[])\",\"StarterClaim.rearm(uint256)\",\"StarterClaim.resolve(uint256)\",\"SwarmDesk.askBackup(uint8,bytes)\",\"SwarmDesk.bind(address,bytes,bytes,uint64,uint8,uint64,uint8,uint64)\",\"SwarmDesk.clearExpired(bytes32)\",\"SwarmDesk.execute(uint8,bytes)\",\"SwarmDesk.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"SwarmDesk.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"SwarmDesk.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"V4Market.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"V4Market.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"V4Market.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"V4Market.bindFeeRouter(address,uint64,uint256)\",\"V4Market.buy(uint256,address)\",\"V4Market.flushFees()\",\"V4Market.receive()\",\"V4Market.sell(uint256,uint256,address)\",\"V4Market.unlockCallback(bytes)\"],\"files\":{\".gitignore\":8,\"README.md\":93,\"artifacts/build-lint-v3.txt\":2369,\"artifacts/build-v3.txt\":3,\"artifacts/economic-targets-v3.json\":9,\"artifacts/fmt-v3.txt\":0,\"artifacts/foundry-v3.txt\":845,\"artifacts/funded-sensitivity/simulation-v3.json\":13928,\"artifacts/funded-sensitivity/simulation-v3.md\":51,\"artifacts/funding-sensitivity-v3.json\":342,\"artifacts/gas-actions-v3.txt\":15,\"artifacts/policy-sensitivity-v3.json\":554,\"artifacts/python-tests-v3.txt\":18,\"artifacts/regulator-example.json\":59,\"artifacts/robinhood-fork-v3.txt\":7,\"artifacts/runtime-sizes-v3.json\":23,\"artifacts/simulation-v3.json\":13928,\"artifacts/simulation-v3.md\":51,\"artifacts/tuned-funded/simulation-v3.json\":13928,\"artifacts/tuned-funded/simulation-v3.md\":51,\"artifacts/v2/README.md\":3,\"artifacts/v2/foundry-tests.txt\":178,\"artifacts/v2/offline-tests.txt\":187,\"artifacts/v2/offline-verification.json\":21,\"artifacts/v2/previous-README.md\":108,\"artifacts/v2/previous-design.md\":120,\"artifacts/v2/previous-report.md\":75,\"artifacts/v2/previous-security-review.md\":29,\"artifacts/v2/previous-simulation-assumptions.md\":52,\"artifacts/v2/robinhood-fork.txt\":7,\"artifacts/v2/rpc-probe.json\":16,\"artifacts/v2/runtime-sizes.json\":21,\"artifacts/v2/simulation.md\":95,\"artifacts/v2/verification.json\":110,\"artifacts/v31/allocation-summary.md\":6,\"artifacts/v31/baseline-budget.md\":14,\"artifacts/v31/boundary-checks.json\":10880,\"artifacts/v31/candidate-stress/simulation.json\":32636,\"artifacts/v31/evidence/factory-prediction.json\":14,\"artifacts/v31/evidence/launch-and-cost-facts.json\":130,\"artifacts/v31/evidence/standalone-hook-build.json\":38,\"artifacts/v31/final/comparison.md\":50,\"artifacts/v31/funded/comparison.md\":52,\"artifacts/v31/funded/replay.json\":290,\"artifacts/v31/funding-comparison.md\":8,\"artifacts/v31/regulator-example.json\":73,\"artifacts/v31/stress-comparison.md\":20,\"artifacts/v31/summary.json\":13,\"artifacts/v31/validation.json\":250,\"artifacts/v310/forge-test-launch.txt\":496,\"artifacts/v310/forge-test-repo-changed-suites.txt\":115,\"artifacts/v310/forge-test-repo-full-before-new-tests.txt\":437,\"artifacts/v310/pins-check.txt\":2,\"artifacts/v311/rehearsal.log\":377,\"artifacts/v312/forge-fmt.txt\":1,\"artifacts/v312/forge-test-launch.txt\":381,\"artifacts/v312/forge-test-repo.txt\":384,\"artifacts/v312/launch-creation-hashes.txt\":5,\"artifacts/v312/node-tests.txt\":10,\"artifacts/v312/pins-check.txt\":2,\"artifacts/v312/python-tests.txt\":3,\"artifacts/v312/rehearsal.log\":368,\"artifacts/v313/forge-fmt.txt\":0,\"artifacts/v313/forge-test.txt\":468,\"artifacts/v313/launch-creation-hashes.txt\":6,\"artifacts/v313/module-pins.txt\":15,\"artifacts/v313/pins-check.txt\":2,\"artifacts/v314/authority-check.txt\":1,\"artifacts/v314/consistency-check.txt\":1,\"artifacts/v314/creation-hashes.json\":21,\"artifacts/v314/deploy-gate.txt\":1,\"artifacts/v314/flatten-build.txt\":871,\"artifacts/v314/flatten-check.txt\":2,\"artifacts/v314/forge-build.txt\":4752,\"artifacts/v314/forge-fmt.txt\":0,\"artifacts/v314/forge-test.txt\":487,\"artifacts/v314/launch-creation-hashes.txt\":20,\"artifacts/v314/module-pins-check.txt\":1,\"artifacts/v314/node-tests.txt\":22,\"artifacts/v314/python-tests.txt\":39,\"artifacts/v314/rehearsal-build.log\":4895,\"artifacts/v314/rehearsal.log\":352,\"artifacts/v314/runtime-sizes.json\":21,\"artifacts/v314/swarm-pins-check.txt\":1,\"artifacts/v315/creation-hashes.json\":21,\"artifacts/v315/deploy-gate.txt\":1,\"artifacts/v315/forge-build.txt\":1062,\"artifacts/v315/forge-fmt.txt\":0,\"artifacts/v315/forge-test.txt\":412,\"artifacts/v315/launch-creation-hashes.txt\":20,\"artifacts/v315/module-pins-check.txt\":1,\"artifacts/v315/node-tests.txt\":22,\"artifacts/v315/python-tests.txt\":39,\"artifacts/v315/rehearsal-build.log\":4921,\"artifacts/v315/rehearsal.log\":387,\"artifacts/v315/runtime-sizes.json\":21,\"artifacts/v315/swarm-pins-check.txt\":1,\"artifacts/v316/creation-hashes.json\":21,\"artifacts/v316/deploy-gate.txt\":1,\"artifacts/v316/forge-build.txt\":4736,\"artifacts/v316/forge-fmt.txt\":0,\"artifacts/v316/forge-test.txt\":505,\"artifacts/v316/launch-creation-hashes.txt\":20,\"artifacts/v316/module-pins-check.txt\":1,\"artifacts/v316/node-tests.txt\":7,\"artifacts/v316/python-tests.txt\":3,\"artifacts/v316/rehearsal-build.log\":4921,\"artifacts/v316/rehearsal.log\":392,\"artifacts/v316/runtime-sizes.json\":21,\"artifacts/v316/swarm-pins-check.txt\":1,\"artifacts/v317/creation-hashes.json\":21,\"artifacts/v317/deploy-gate.txt\":1,\"artifacts/v317/forge-fmt.txt\":0,\"artifacts/v317/forge-test.txt\":442,\"artifacts/v317/launch-creation-hashes.txt\":20,\"artifacts/v317/module-pins-check.txt\":1,\"artifacts/v317/node-tests.txt\":14,\"artifacts/v317/python-tests.txt\":5,\"artifacts/v317/rehearsal-build.log\":4959,\"artifacts/v317/rehearsal.log\":392,\"artifacts/v317/runtime-sizes.json\":21,\"artifacts/v317/swarm-pins-check.txt\":1,\"artifacts/v318/creation-hashes.json\":21,\"artifacts/v318/deploy-gate.txt\":1,\"artifacts/v318/forge-fmt.txt\":0,\"artifacts/v318/forge-test.txt\":487,\"artifacts/v318/launch-creation-hashes.txt\":20,\"artifacts/v318/module-pins-check.txt\":1,\"artifacts/v318/node-tests.txt\":24,\"artifacts/v318/rehearsal-build.log\":4973,\"artifacts/v318/rehearsal.log\":392,\"artifacts/v318/runtime-sizes.json\":21,\"artifacts/v318/swarm-pins-check.txt\":1,\"artifacts/v32/contract-sizes.json\":54,\"artifacts/v32/forge-build.log\":2734,\"artifacts/v32/forge-fmt.log\":0,\"artifacts/v32/forge-test.log\":310,\"artifacts/v32/model-checks.log\":5,\"artifacts/v32/module-pins.log\":1,\"artifacts/v32/python-tests.log\":25,\"artifacts/v32/regulator-example.json\":73,\"artifacts/v32/simulation-checks.json\":11,\"artifacts/v32/simulation-checks.log\":11,\"artifacts/v32/validation.json\":61,\"artifacts/v32/verified-baseline/comparison.md\":8,\"artifacts/v32/verified-baseline/simulation.json\":22622,\"artifacts/v32/verified-sensitivities/comparison.md\":68,\"artifacts/v33/simulation.json\":116,\"artifacts/v34/build.txt\":2931,\"artifacts/v34/format.txt\":0,\"artifacts/v34/pins.txt\":1,\"artifacts/v34/python-tests.txt\":5,\"artifacts/v34/reveal-test.txt\":1,\"artifacts/v34/simulation.json\":91766,\"artifacts/v34/simulation.md\":43,\"artifacts/v34/tests.txt\":306,\"artifacts/v35/simulation.json\":22605,\"artifacts/v35/simulation.md\":104,\"artifacts/v35/verification.json\":132,\"artifacts/v36/simulation-phases.json\":179,\"artifacts/v36/simulation-phases.md\":13,\"artifacts/v37/byte-sizes.json\":131,\"artifacts/v37/verification.json\":28,\"artifacts/v39/forge-build-repo.txt\":3,\"artifacts/v39/forge-fmt.txt\":1,\"artifacts/v39/forge-test-launch.txt\":8,\"artifacts/v39/forge-test-repo.txt\":390,\"artifacts/v39/pins-check.txt\":2,\"artifacts/v39/pins.json\":68,\"artifacts/v39/runtime-sizes.json\":197,\"artifacts/v39/simulation.json\":381,\"artifacts/v39/simulation.md\":29,\"artifacts/verification-v3.json\":67,\"docs/accepted-v314.md\":10,\"docs/accepted-v315.md\":22,\"docs/accepted-v316.md\":24,\"docs/accepted-v317.md\":46,\"docs/accepted-v318.md\":56,\"docs/api-v35.md\":41,\"docs/blackout-hook-launch.md\":219,\"docs/dependency-provenance.md\":9,\"docs/design.md\":69,\"docs/entropy-v34.md\":31,\"docs/launch-upstream-sha256.json\":518,\"docs/launch-v31.md\":121,\"docs/launch-v314-plan.json\":196,\"docs/launch-v34.md\":44,\"docs/launch-v35.md\":40,\"docs/lazy-accounting-v32.md\":48,\"docs/m2-trust-assumption.md\":121,\"docs/oracle-v37/event.json\":1,\"docs/oracle-v37/oracle-config.json\":21,\"docs/oracle-v37/regulator.json\":1,\"docs/params-keys-v313.md\":113,\"docs/report-v3.md\":143,\"docs/report-v31.md\":128,\"docs/report-v32.md\":138,\"docs/report-v33.md\":107,\"docs/report-v34.md\":58,\"docs/report-v36.md\":89,\"docs/report-v38.md\":83,\"docs/research/b94e6839-platform-report.md\":238,\"docs/review-v31.md\":77,\"docs/review-v32.md\":32,\"docs/review-v33.md\":19,\"docs/review-v34.md\":30,\"docs/review-v35-independent.md\":69,\"docs/review-v37-independent.md\":44,\"docs/review-v39-independent.md\":105,\"docs/security-review.md\":29,\"docs/simulation-assumptions.md\":43,\"docs/simulation-v3-historical.md\":44,\"docs/simulation-v34.md\":34,\"foundry.toml\":21,\"keeper/README.md\":120,\"keeper/blackout-keeper.service\":23,\"keeper/keeper.env.example\":18,\"keeper/keeper.mjs\":578,\"keeper/lib/abi.mjs\":95,\"keeper/lib/eth.mjs\":186,\"keeper/lib/oracle.mjs\":57,\"keeper/wiring.example.json\":17,\"launch-v31.md\":3,\"launch-v36.md\":34,\"launch-v37.md\":144,\"launch-v38.md\":57,\"launch-v39.md\":255,\"launch/V4Market.sol\":1894,\"operations/dormant-v35.md\":17,\"regulator.md\":60,\"report.md\":537,\"script/Deploy.s.sol\":252,\"script/DeployMarket.s.sol\":15,\"script/PredictGame.s.sol\":49,\"script/SwarmArgs.sol\":38,\"sim/blackout_sim_v2.py\":509,\"sim/blackout_sim_v3.py\":338,\"sim/blackout_sim_v31.py\":24,\"sim/blackout_sim_v32.py\":380,\"sim/blackout_sim_v33.py\":395,\"sim/blackout_sim_v34.py\":444,\"sim/candidate_stress_v31.py\":21,\"sim/heartbeat_boundaries_v31.py\":25,\"sim/heartbeat_sweep_v31.py\":46,\"sim/policy_sensitivity_v3.py\":19,\"sim/run_v32.py\":34,\"sim/run_v33.py\":58,\"sim/run_v34.py\":54,\"sim/run_v35.py\":273,\"sim/run_v36.py\":83,\"sim/run_v39.py\":153,\"sim/tune_v3.py\":16,\"src/Billboards.sol\":135,\"src/Civic.sol\":302,\"src/Economy.sol\":222,\"src/EndowmentEscrow.sol\":111,\"src/Enhancement.sol\":164,\"src/FarmCore.sol\":611,\"src/FarmEngine.sol\":299,\"src/FarmItems.sol\":165,\"src/FarmRewards.sol\":607,\"src/FeeRouter.sol\":313,\"src/GameRegistry.sol\":101,\"src/GridOperator.sol\":276,\"src/LaunchToken.sol\":11,\"src/MarketFactory.sol\":61,\"src/PackSale.sol\":293,\"src/Params.sol\":181,\"src/RewardPool.sol\":113,\"src/Season.sol\":368,\"src/StandardAdapter.sol\":77,\"src/StandardMarket.sol\":22,\"src/StarterClaim.sol\":149,\"src/SwarmDesk.sol\":548,\"src/V4Market.sol\":590,\"src/interfaces/IGame.sol\":53,\"src/interfaces/IGameRegistry.sol\":15,\"src/interfaces/ILaunchHook.sol\":7,\"src/interfaces/IV4.sol\":26,\"src/interfaces/Interfaces.sol\":20,\"src/lib/ChainClock.sol\":22,\"src/lib/EconomyMath.sol\":48,\"src/lib/Errors.sol\":13,\"src/lib/GameModule.sol\":17,\"src/lib/ItemMath.sol\":31,\"src/lib/ItemMetadata.sol\":79,\"src/lib/ModuleCode.sol\":49,\"src/lib/Robinhood.sol\":15,\"src/lib/SwarmCode.sol\":18,\"src/oracle/OracleAttestation.sol\":221,\"src/oracle/SignatureCheckerCompat.sol\":14,\"test/AuditV314.t.sol\":116,\"test/AuditV315.t.sol\":199,\"test/AuditV317.t.sol\":359,\"test/AuditV318.t.sol\":319,\"test/AutoRepairReviewV35.t.sol\":39,\"test/Base.t.sol\":310,\"test/Bounties.t.sol\":290,\"test/CivicV35.t.sol\":224,\"test/Clock.t.sol\":54,\"test/DeployGateV314.t.sol\":94,\"test/Deployment.t.sol\":94,\"test/EconomyV35.t.sol\":398,\"test/Endowment.t.sol\":123,\"test/EndowmentEscrowV38.t.sol\":200,\"test/EndowmentGame.t.sol\":51,\"test/Epochs.t.sol\":177,\"test/Events.t.sol\":252,\"test/Factory.t.sol\":31,\"test/FarmDailyBasisV317.t.sol\":146,\"test/FeesParams.t.sol\":135,\"test/ForeignTokenTwin.t.sol\":288,\"test/Gas.t.sol\":110,\"test/GridV35.t.sol\":66,\"test/HeartbeatBpsV313.t.sol\":149,\"test/HookBinding.t.sol\":113,\"test/Invariants.t.sol\":211,\"test/Items.t.sol\":246,\"test/KeeperProfit.t.sol\":95,\"test/LaunchHook.t.sol\":339,\"test/LaunchToken.t.sol\":188,\"test/LazyAccounting.t.sol\":447,\"test/Market.t.sol\":121,\"test/OracleConformanceV37.t.sol\":105,\"test/Packs.t.sol\":167,\"test/Pause.t.sol\":76,\"test/PhasedReleaseV36.t.sol\":165,\"test/PotV35.t.sol\":106,\"test/PredictionV34.t.sol\":46,\"test/Registry.t.sol\":140,\"test/Regression.t.sol\":156,\"test/ReservedEventsV35.t.sol\":41,\"test/ReviewV34.t.sol\":145,\"test/SeasonAudit.t.sol\":204,\"test/StandardAdapter.t.sol\":81,\"test/StandardMarket.t.sol\":63,\"test/StandardV4Integration.t.sol\":128,\"test/SwarmDeskV37.t.sol\":705,\"test/TwinCaptureV312.t.sol\":255,\"test/V310.t.sol\":79,\"test/V33.t.sol\":561,\"test/V34.t.sol\":315,\"test/V39.t.sol\":213,\"test/V4Integration.t.sol\":229,\"test/WarReviewV35.t.sol\":69,\"test/YieldFloorReviewV35.t.sol\":31,\"test/deploy-gate-v314.test.mjs\":42,\"test/fixtures/keeper-v39-vectors.json\":56,\"test/fixtures/oracle-hash-vectors.json\":102,\"test/fork/RehearsalV311.t.sol\":812,\"test/fork/RobinhoodFork.t.sol\":39,\"test/keeper-v39.test.mjs\":34,\"test/mocks/MockGameRegistry.sol\":52,\"test/mocks/MockMarket.sol\":74,\"test/mocks/MockOracleSigner.sol\":17,\"test/mocks/MockSwarmIntake.sol\":67,\"test/mocks/MockToken.sol\":38,\"test/mocks/MockV4Manager.sol\":118,\"test/oracle-v310.test.mjs\":22,\"test/oracle-v37.test.mjs\":42,\"test/python/test_entropy_bot.py\":31,\"test/python/test_merkle.py\":19,\"test/python/test_regulator.py\":30,\"test/python/test_v31.py\":38,\"test/python/test_v32.py\":58,\"test/python/test_v34.py\":33,\"test/python/test_v35.py\":71,\"test/reveal.test.mjs\":24,\"test/ui-v35.test.mjs\":27,\"tools/check_deploy_gate.mjs\":48,\"tools/check_launch_source.py\":89,\"tools/check_v32_results.py\":52,\"tools/check_v37_authority.py\":20,\"tools/entropy_bot.py\":106,\"tools/freepack_merkle.py\":20,\"tools/make_oracle_bodies.mjs\":45,\"tools/oracle_question_hash.mjs\":80,\"tools/pin_module_code.py\":95,\"tools/pin_swarm_code.py\":48,\"tools/regulator.py\":81,\"tools/rehearse_v311.sh\":28,\"tools/report_v31.py\":55,\"tools/schedule_bodies.mjs\":16,\"tools/starter_merkle.py\":72,\"tools/swarm_constructor_args.mjs\":57,\"ui/app.js\":178,\"ui/index.html\":22,\"ui/reveal.js\":34,\"ui/style.css\":3},\"excluded\":[\"vendor/\",\"node_modules/\"],\"truncated\":true}","passed":true},{"durationMs":17472,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/V4Market.sol:541: V4Market._sellCallback(bytes) (src/V4Market.sol#541-564) sends eth to arbitrary user\n[high/medium] arbitrary-send-eth at src/V4Market.sol:215: V4Market.flushFees() (src/V4Market.sol#215-229) sends eth to arbitrary user\n[high/medium] weak-prng at src/V4Market.sol:330: V4Market._record(bool,uint256) (src/V4Market.sol#330-351) uses a weak PRNG: \"b = longVolumes[p % 24] (src/V4Market.sol#339)\"\n[high/medium] weak-prng at src/V4Market.sol:285: V4Market._observe(uint256) (src/V4Market.sol#285-305) uses a weak PRNG: \"observations[minute % 32] = Observation(uint64(minute),c) (src/V4Market.sol#299)\"\n[high/medium] weak-prng at src/V4Market.sol:330: V4Market._record(bool,uint256) (src/V4Market.sol#330-351) uses a weak PRNG: \"delete longVolumes[p % 24] (src/V4Market.sol#341)\"\n[high/medium] weak-prng at src/V4Market.sol:330: V4Market._record(bool,uint256) (src/V4Market.sol#330-351) uses a weak PRNG: \"delete shortVolumes[p % 12] (src/V4Market.sol#335)\"\n[high/medium] weak-prng at src/V4Market.sol:330: V4Market._record(bool,uint256) (src/V4Market.sol#330-351) uses a weak PRNG: \"a = shortVolumes[p % 12] (src/V4Market.sol#333)\"\n[high/medium] weak-prng at src/V4Market.sol:400: V4Market.nextStepIn() (src/V4Market.sol#400-403) uses a weak PRNG: \"LAUNCH_TAX_STEP - t % LAUNCH_TAX_STEP (src/V4Market.sol#402)\"\n[high/medium] weak-prng at src/V4Market.sol:307: V4Market._cumulativeAt(uint256) (src/V4Market.sol#307-314) uses a weak PRNG: \"o = observations[minute % 32] (src/V4Market.sol#311)\"\n[high/medium] incorrect-exp at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[high/medium] reentrancy-balance at src/FarmCore.sol:486: Reentrancy in FarmCore._splitCharge(address,uint256,bool) (src/FarmCore.sol#486-496):\n[high/medium] reentrancy-balance at src/Civic.sol:56: Reentrancy in Civic._take(address,uint256) (src/Civic.sol#56-63):\n[high/medium] reentrancy-balance at src/FeeRouter.sol:228: Reentrancy in FeeRouter.executePotBuys(uint256,uint256) (src/FeeRouter.sol#228-242):\n[high/medium] reentrancy-balance at src/PackSale.sol:189: Reentrancy in PackSale._buy(address,address,uint256,uint256,bool) (src/PackSale.sol#189-208):\n[high/medium] reentrancy-balance at src/FeeRouter.sol:287: Reentrancy in FeeRouter.executeBuys(uint256,uint256) (src/FeeRouter.sol#287-312):\n[high/medium] reentrancy-balance at src/FeeRouter.sol:176: Reentrancy in FeeRouter.zapBuy(uint256,address) (src/FeeRouter.sol#176-184):\n[high/medium] reentrancy-balance at src/FarmCore.sol:426: Reentrancy in FarmCore._charge(address,uint256,bool,uint8) (src/FarmCore.sol#426-440):\n[high/medium] reentrancy-balance at src/RewardPool.sol:87: Reentrancy in RewardPool.donate(uint256) (src/RewardPool.sol#87-94):\n[high/medium] reentrancy-balance at src/PackSale.sol:189: Reentrancy in PackSale._buy(address,address,uint256,uint256,bool) (src/PackSale.sol#189-208):\n[high/medium] reentrancy-balance at src/StandardAdapter.sol:53: Reentrancy in StandardAdapter.buy(uint256,address) (src/StandardAdapter.sol#53-62):\n[high/medium] reentrancy-balance at src/Economy.sol:137: Reentrancy in Economy.lock(uint256,uint256) (src/Economy.sol#137-154):\n[high/medium] reentrancy-balance at src/Billboards.sol:55: Reentrancy in Billboards._take(address,uint256) (src/Billboards.sol#55-62):\n[high/medium] reentrancy-eth at src/Civic.sol:238: Reentrancy in Civic.fundCollapse(uint256) (src/Civic.sol#238-244):\n[high/medium] reentrancy-eth at src/Civic.sol:288: Reentrancy in Civic.buyLot(uint256) (src/Civic.sol#288-301):\n[high/medium] reentrancy-eth at src/FarmCore.sol:474: Reentrancy in FarmCore.buyTokenPack(bool) (src/FarmCore.sol#474-484):\n[high/medium] reentrancy-eth at src/FarmCore.sol:100: Reentrancy in FarmCore.buyRoom(uint256,bool) (src/FarmCore.sol#100-109):\n[high/medium] reentrancy-eth at src/FarmCore.sol:474: Reentrancy in FarmCore.buyTokenPack(bool) (src/FarmCore.sol#474-484):\n[high/medium] reentrancy-eth at src/FarmCore.sol:451: Reentrancy in FarmCore.repairCable(bool) (src/FarmCore.sol#451-459):\n[high/high] uninitialized-state at src/Civic.sol:149: Civic.warTop (src/Civic.sol#124) is never initialized. It is used in:\n[medium/medium] boolean-cst at src/Enhancement.sol:55: Enhancement.announceCap(uint8,string) (src/Enhancement.sol#55-66) uses a Boolean constant improperly:\n[medium/medium] divide-before-multiply at src/V4Market.sol:514: V4Market.quoteSell(uint256) (src/V4Market.sol#514-518) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/V4Market.sol:285: V4Market._observe(uint256) (src/V4Market.sol#285-305) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/Base64.sol:18: Base64.encode(bytes) (vendor/openzeppelin/contracts/utils/Base64.sol#18-94) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmEngine.sol:157: FarmEngine._accumulate(FarmEngine.Snapshot,uint256,uint256,FarmEngine.RoomStats,FarmEngine.Acc) (src/FarmEngine.sol#157-172) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/V4Market.sol:307: V4Market._cumulativeAt(uint256) (src/V4Market.sol#307-314) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/Economy.sol:89: Economy.itemDaily(uint256) (src/Economy.sol#89-95) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/PackSale.sol:129: PackSale.priceAt(uint256) (src/PackSale.sol#129-148) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmRewards.sol:169: FarmRewards.advanceEpoch() (src/FarmRewards.sol#169-243) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmCore.sol:506: FarmCore.scrap(uint256,uint256) (src/FarmCore.sol#506-517) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/V4Market.sol:285: V4Market._observe(uint256) (src/V4Market.sol#285-305) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmEngine.sol:157: FarmEngine._accumulate(FarmEngine.Snapshot,uint256,uint256,FarmEngine.RoomStats,FarmEngine.Acc) (src/FarmEngine.sol#157-172) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/Economy.sol:89: Economy.itemDaily(uint256) (src/Economy.sol#89-95) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmEngine.sol:157: FarmEngine._accumulate(FarmEngine.Snapshot,uint256,uint256,FarmEngine.RoomStats,FarmEngine.Acc) (src/FarmEngine.sol#157-172) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmCore.sol:506: FarmCore.scrap(uint256,uint256) (src/FarmCore.sol#506-517) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FeeRouter.sol:193: FeeRouter.executeSells(uint256,uint256) (src/FeeRouter.sol#193-226) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/Enhancement.sol:55: Enhancement.announceCap(uint8,string) (src/Enhancement.sol#55-66) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/FarmCore.sol:309: FarmCore._roll(address,uint256) (src/FarmCore.sol#309-324) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/GridOperator.sol:197: GridOperator._resolve(uint256,address) (src/GridOperator.sol#197-261) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/GridOperator.sol:197: GridOperator._resolve(uint256,address) (src/GridOperator.sol#197-261) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:285: V4Market._observe(uint256) (src/V4Market.sol#285-305) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/FarmRewards.sol:317: FarmRewards.beginMining(address,uint256) (src/FarmRewards.sol#317-330) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:316: V4Market.twap() (src/V4Market.sol#316-321) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:285: V4Market._observe(uint256) (src/V4Market.sol#285-305) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/FarmCore.sol:216: FarmCore.maxLevelByAge(address) (src/FarmCore.sol#216-223) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/FarmCore.sol:506: FarmCore.scrap(uint256,uint256) (src/FarmCore.sol#506-517) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:382: V4Market.sinceLaunch() (src/V4Market.sol#382-384) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Civic.sol:83: Civic.enable(uint256) (src/Civic.sol#83-89) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/EndowmentEscrow.sol:61: EndowmentEscrow.forward(address,uint64,uint256,bytes,uint64,uint256,bytes) (src/EndowmentEscrow.sol#61-89) uses a dangerous strict equality:\n[medium/high] locked-ether at src/GridOperator.sol:148: Contract locking ether found:\n[medium/medium] reentrancy-no-eth at src/StarterClaim.sol:134: Reentrancy in StarterClaim.resolve(uint256) (src/StarterClaim.sol#134-148):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:86: Reentrancy in FarmCore.civicPurchase(address,uint256) (src/FarmCore.sol#86-93):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:352: Reentrancy in FarmCore.place(uint256,uint256,uint256) (src/FarmCore.sol#352-386):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:524: Reentrancy in FarmCore.process(address,uint256) (src/FarmCore.sol#524-556):\n[medium/medium] reentrancy-no-eth at src/FeeRouter.sol:193: Reentrancy in FeeRouter.executeSells(uint256,uint256) (src/FeeRouter.sol#193-226):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:435: Reentrancy in FarmRewards._reward(address,uint256,FarmRewards.Share,uint256,uint256) (src/FarmRewards.sol#435-467):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:364: Reentrancy in FarmRewards._settle(address,uint256) (src/FarmRewards.sol#364-379):\n[medium/medium] reentrancy-no-eth at src/Economy.sol:159: Reentrancy in Economy.unlock() (src/Economy.sol#159-177):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:388: Reentrancy in FarmCore.unplace(uint256,uint256) (src/FarmCore.sol#388-398):\n[medium/medium] reentrancy-no-eth at src/PackSale.sol:275: Reentrancy in PackSale.resolve(uint256,uint256) (src/PackSale.sol#275-292):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:169: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#169-243):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:352: Reentrancy in FarmCore.place(uint256,uint256,uint256) (src/FarmCore.sol#352-386):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:555: Reentrancy in FarmRewards.claim(uint256) (src/FarmRewards.sol#555-565):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:381: Reentrancy in FarmRewards._settleOne(address,uint256) (src/FarmRewards.sol#381-406):\n[medium/medium] reentrancy-no-eth at src/GridOperator.sol:163: Reentrancy in GridOperator.shift(uint256) (src/GridOperator.sol#163-175):\n[medium/medium] reentrancy-no-eth at src/FeeRouter.sol:193: Reentrancy in FeeRouter.executeSells(uint256,uint256) (src/FeeRouter.sol#193-226):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:119: Reentrancy in FarmCore.autoRepair(address,uint256) (src/FarmCore.sol#119-129):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:292: Reentrancy in FarmCore._prepare(address) (src/FarmCore.sol#292-298):\n[medium/medium] reentrancy-no-eth at src/Enhancement.sol:152: Reentrancy in Enhancement.resolve(uint256) (src/Enhancement.sol#152-163):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:169: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#169-243):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:326: Reentrancy in FarmCore.paidPackBought(address,uint256,uint256) (src/FarmCore.sol#326-334):\n[medium/medium] reentrancy-no-eth at src/V4Market.sol:566: Reentrancy in V4Market.unlockCallback(bytes) (src/V4Market.sol#566-589):\n[medium/medium] reentrancy-no-eth at src/V4Market.sol:541: Reentrancy in V4Market._sellCallback(bytes) (src/V4Market.sol#541-564):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:435: Reentrancy in FarmRewards._reward(address,uint256,FarmRewards.Share,uint256,uint256) (src/FarmRewards.sol#435-467):\n[medium/medium] reentrancy-no-eth at src/Enhancement.sol:77: Reentrancy in Enhancement.commit(uint256,uint256,bool) (src/Enhancement.sol#77-93):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:169: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#169-243):\n[medium/medium] uninitialized-local at src/Economy.sol:187: Economy._insert(uint256,address).prev (src/Economy.sol#187) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:122: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256).a (src/FarmEngine.sol#122) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GridOperator.sol:122: GridOperator.gridStability(uint256).total (src/GridOperator.sol#122) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Civic.sol:159: Civic.fundWar(uint256).slot (src/Civic.sol#159) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmCore.sol:545: FarmCore.process(address,uint256).removed (src/FarmCore.sol#545) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GridOperator.sol:2","passed":true},{"durationMs":2500,"exitCode":0,"name":"aderyn","output":"[high] contract-locks-ether at src/GridOperator.sol:13: Contract locks Ether without a withdraw function (2 places)\n[high] eth-send-unchecked-address at src/Billboards.sol:94: ETH transferred without address checks (12 places)\n[high] misused-boolean at src/PackSale.sol:121: Misused boolean with logical operators (2 places)\n[high] reentrancy-state-change at src/Billboards.sol:98: Reentrancy: State change after external call (98 places)\n[high] reused-contract-name at src/Billboards.sol:15: Contract Name Reused in Different Files (7 places)\n[high] unprotected-initializer at src/MarketFactory.sol:18: Unprotected initializer\n[high] unsafe-casting at src/Economy.sol:143: Unsafe Casting of integers (2 places)\n[low] costly-loop at src/FarmCore.sol:318: Costly operations inside loop (15 places)\n[low] division-before-multiplication at src/FarmCore.sol:513: Incorrect Order of Division and Multiplication (2 places)\n[low] large-numeric-literal at src/Civic.sol:187: Large Numeric Literal (130 places)\n[low] literal-instead-of-constant at src/Billboards.sol:48: Literal Instead of Constant (676 places)\n[low] local-variable-shadowing at src/FarmRewards.sol:39: Local Variable Shadows State Variable (4 places)\n[low] missing-inheritance at src/Params.sol:6: Missing Inheritance\n[low] non-reentrant-not-first at src/FarmRewards.sol:586: `nonReentrant` is Not the First Modifier (2 places)\n[low] require-revert-in-loop at src/Billboards.sol:78: Loop Contains `require`/`revert` (13 places)\n[low] state-change-without-event at src/Billboards.sol:128: State Change Without Event (22 places)\n[low] unchecked-return at src/Enhancement.sol:98: Unchecked Return (18 places)\n[low] uninitialized-local-variable at src/Billboards.sol:78: Uninitialized Local Variable (36 places)\n[low] unused-import at src/Billboards.sol:8: Unused Import (6 places)\n[low] unused-public-function at src/Billboards.sol:47: Public Function Not Used Internally (20 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f611e9665bdc0edcb344399b7507a26881d12049c50978203253c24f362ef1d9","verifiedTreeHash":"130b2ddb70d4969fc9771da61f1296fbb7ddfc86","verifierVersion":"0.1.0+67c588fa"}]}