{"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":"420b1475-e595-4ec0-bdfc-a91079209909","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"718baa8e335f61a1a0bad748212d5678fd1278b98329809056cb6e6a1f996813","dependsOn":["audit_imported_code"],"execution":{"mustProduce":["src/LaunchToken.sol"],"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"cd13aeccbc9ce1d71b885ea92540f8f90d6579516a1a12f3802d3919733e5fe4","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"58c09591e18bee68112ad0985d9cb8ae63db19be7469ab783f4e3daa148756ad","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"6cce9d5add78ac0e6d0fc1024a150562c9a4c5b074843489499fb3b38d2a07fb","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"waiting"},{"acceptedSubmissionHash":"6c1fcd9c940cd596cea2cc465f8ab176b0b5fbd566e902cb622225806ad7bb11","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"14fd35b55427737b9bd2bc11a591c0e0b0ae29f53f494178dfe9876f6f0dc57a","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"failed"},{"acceptedSubmissionHash":null,"dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"working"}],"objective":"BLACKOUT v3.18 L2 on Robinhood Chain (4663). NO SOURCE CHANGES. L1 is deployed (launch 1628): SwarmDesk 0x5cb0686a4475d1f8a6c6e5240579080a4a05b609, EndowmentEscrow 0x11947494c0ba91508eb7409648193818c36521fb.\nSource: commit 86e71d47b12094dc6a37c6a05cd4f84f2f970b78 of identity-md-launches/launch-1544-blackout-swarmdesk-bootstrap-robinhood. Build with the unchanged repo foundry.toml: solc 0.8.26, optimizer 200, cancun, viaIR false, bytecode_hash none.\nDeploy the platform token plus V4Market hook using onchain univ4_hook, pairWith eth, economics poolBps 7000 and remainderTo 0x11947494c0ba91508eb7409648193818c36521fb (the deployed L1 EndowmentEscrow). Platform pool fee 12500, tick spacing 60. Paying wallet 0x6d51cBE774aeAe4dd40bCA2560E9bc2695A0d007 receives the platform 1% via LaunchFactory.claimFees; the platform keeps 0.25%. The hook adds its 1% rewards share after the stepped launch tax and its existing sell surcharge. Omit owner and initialMarketCapWei. Return token, hook, launch number and pool key.\nGAME_CONFIG_HASH: 0x11ed7438974e96ecc962201e9c46422c7bf239d725876863fa25a56c734b20d3.\nExact ordered constructor words and expected creation hash:\n[0] V4Market [\"$poolManager\",\"$token\",\"12500\",\"60\",\"$factory\",\"0x5cb0686a4475d1f8a6c6e5240579080a4a05b609\",\"0x11ed7438974e96ecc962201e9c46422c7bf239d725876863fa25a56c734b20d3\"]\nCreation hash: 0x8d6e02398e351aa4c28486a92d7ec60baf7edc67ccaaa88eed4bd61e9b9092a4\nNo literal IMD protocol addresses may appear as constructor words. Protocol endpoints are compiled in; allowed platform placeholders stay as shown.\nAccepted findings (low/info only, full text in docs/accepted-v318.md; do not change source for them):\n- Exact-input swaps only; v3.18 buys must carry the extreme sqrtPriceLimitX96 4295128740 (PriceLimitedBuy otherwise) and a partial fill reverts (PartialFill), so tax is never paid on unconsumed ETH; routers protect buyers with a minimum output.\n- a3749636 low, manager float: beforeSwap takes the buy tax from the PoolManager before the swapper settles; the live Robinhood PoolManager holds about 24,500 ETH. Remaining a3749636 info items accepted.\n- RewardPool shortfall: repair with a plain token transfer.\n- spot() bounds: zero, underflowed or above-1e40 prices revert.\n- Fixed oracle signer/endpoints: compiled in, no owner rotation.\n- Answers between job A and job B: stored after L3, executed only after all L4 modules are registered; stream-0 answers before role 1 revert NotConfigured and are re-presented later.\n- Future-block randomness: native L2 block entropy, not VRF; enhancement attempts lapse to their worst outcome; grid events re-arm.\n- Reserved Params keys: no gameplay effect.\n- M-2 matching twin and binder liveness: only the pinned binder 0x6d51…d007 can bind, once; it cannot bypass any proof.\n- GameRegistry.register prefill by a byte-identical copy: keeper registers every role immediately and verifies module(role).\n- Season.rollover before finalize: keeper finalizes, then rolls over weekly.\n- FeeRouter.executeSells sweep rollback: repeats on the next success.\n- FarmRewards same-epoch vintage back-dating: at most about 54 bps, self-triggered.\n- Deploy-gate tool takes only the JSON plan.\n- Civic.claimWar rounding dust stays in the game.\n- No max-cost bound on openPack/buyTokenPack.\n- Unused minter/caller permissions incl. Season.recordSpend admitting GridOperator; dead fields; stale FarmRewards budget comment (code reserves 159% against at most 157.5%).\n- PackSale.buyPacksFor gifting: value only flows in.\n- One-shot escrow: forward runs once after the whole remainder has landed.\n- Economy._insert 33-tie lock griefing: no funds at risk.\n- Festival severity band always +15%.\n- 9cab6f32 low: PackSale.resolve sets Mythic eligibility at resolve time (0.3% rolls may be deferred to level 10); no funds move.\n- 9cab6f32 low: SwarmDesk.execute is permissionless; an early call inside the Params cooldown drops that week's single bounded step; the keeper executes after cooldown.\n- askBackup: anyone may spend the Desk's donated IMD once per slot, bounded by the 0.5 IMD cap.\nProject: https://playblackout.xyz\n\nToken name: BLACKOUT\nToken symbol: BLACKOUT","parentJobId":null,"planHash":"7e53d84dcc1b108a474f7afd1211156e8b618153086b0d0709cd7a019df25775","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"420b1475-e595-4ec0-bdfc-a91079209909","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1695-blackout"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52014","feedbackHash":"242f69ff8adbed9c1fac62245b3a64bab0ad71c53df5496bd6c618bc30de14bd","nodeKey":"adapt_contract_project","submissionHash":"718baa8e335f61a1a0bad748212d5678fd1278b98329809056cb6e6a1f996813","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51026","feedbackHash":"2a0d736693e06942fbe31f7bda9a9baece3f53fb4c37a6612d2c41e569e00985","nodeKey":"audit_economics","submissionHash":"cd13aeccbc9ce1d71b885ea92540f8f90d6579516a1a12f3802d3919733e5fe4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51382","feedbackHash":"0ed060bfa316fad2be77f1c47e320bca1a9ac45fe82b84687603dfbca1a64404","nodeKey":"audit_flow","submissionHash":"58c09591e18bee68112ad0985d9cb8ae63db19be7469ab783f4e3daa148756ad","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51216","feedbackHash":"e119db3a006b27d944821e28d3b6e900b1147427b6c705665f0e7b9d587627d9","nodeKey":"audit_imported_code","submissionHash":"6cce9d5add78ac0e6d0fc1024a150562c9a4c5b074843489499fb3b38d2a07fb","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51450","feedbackHash":"16ddc8a578714a1fdbe73e35ab30db86664d6e366fdb4c30db69db36f178271f","nodeKey":"audit_math","submissionHash":"6c1fcd9c940cd596cea2cc465f8ab176b0b5fbd566e902cb622225806ad7bb11","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50981","feedbackHash":"756e302bc43dd1038a34383d815bacbd752e4faf2b91bff8521322af459431bc","nodeKey":"audit_permissions","submissionHash":"14fd35b55427737b9bd2bc11a591c0e0b0ae29f53f494178dfe9876f6f0dc57a","tag1":"review:submission","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"cbd45f83f2bd6c08f0073199ce8bdcdf73591e0bb4265d548908a10a6727340d","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5739ce0d803a43cd","findings":[],"hash":"14fd35b55427737b9bd2bc11a591c0e0b0ae29f53f494178dfe9876f6f0dc57a","nodeId":"7a0a2a74-ddaa-470a-8595-b11800dd81f6","outcome":"completed","summary":"The review is complete. The findings file is written at the repository root, and no source or configuration file was touched.\n\n**Outcome: no new defects in the permission model.** The findings list is empty. The coverage record answers all 160 listed entry points plus three invariant rows, every one as `holds`, none unreached.\n\n**What I covered in depth (the assigned L2 deliverable):**\n- V4Market: every callback is manager-only against the exact pool id, `afterInitialize` additionally requires the LaunchFactory sender and runs once, `buy` and `sell` are callable only by the bound FeeRouter with the sell recipient pinned to it, `receive` admits only PoolManager, and `unlockCallback` requires both the manager and an active buy or sell flag. `bindFeeRouter` is permissionless but proves the Desk-bound canonical registry, factory CREATE2 initcode, config hash, Params-to-Desk link, market identity and role-6 enrollment, and cannot rebind. `flushFees` can only forward to that proven router.\n- Buy and sell symmetry: the before-swap tax and the after-swap `PartialFill` check derive from the same same-block tax rate, the sell charge is applied to the raw pool output as the unspecified-currency delta, and the hook's own system swaps account for the suppressed callbacks explicitly. The system sell paying only the 1% base is the documented v3.5 design, not a gap.\n- LaunchToken is unmodified OpenZeppelin ERC20 with no privileged function. Constructor words contain no IMD protocol address.\n\n**Wider inventory (Trail of Bits style):** every state-changing function across the thirteen game modules, FeeRouter, RewardPool, Params, GameRegistry, SwarmDesk and EndowmentEscrow was classified by caller and guard. The only privileged role is the SwarmDesk acting as `swarmWallet`, whose powers are all bounded on-chain and originate from attester-signed answers. Each permissionless keeper path has a caller-bounded minimum output tied to TWAP, a size cap, or both, so no keeper can extract value through the function it is allowed to call.\n\n**Static-analysis leads checked and dismissed:** the two `arbitrary-send-eth` lines (destination is the proven router), the Civic `warTop` uninitialized-state line (empty slots read as zero contribution, which is the intended replacement rule), and the aderyn `unprotected-initializer` on MarketFactory (no initializer exists; it is a deterministic CREATE2 helper).\n\n**Not done:** no scratch tests were written, since no finding reached a severity that requires a proof. Numerical, oracle and settlement-math correctness were outside my three guides and are left to the other specialists.","treeHash":null,"usage":{"cachedInputTokens":1685272,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":36238,"runtime":"claude","turns":28,"wallClockMs":563091}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"85f29f4c09dba910","findings":[],"hash":"58c09591e18bee68112ad0985d9cb8ae63db19be7469ab783f4e3daa148756ad","nodeId":"d324eef2-8d5c-45fd-91fb-3eb79909d798","outcome":"completed","summary":"The review is complete and the findings file is written.\n\n**Outcome:** no defect with a concrete failing input was found in the assigned area. The file at `.imd-findings.json` holds an empty findings list plus a coverage record for all 160 listed entry points and four invariants.\n\n**What I traced and confirmed (69 rows marked `holds`)**\n\n- **V4Market and StandardMarket:** every hook callback, the one-shot `bindFeeRouter` proof chain, `buy`, `sell`, `flushFees`, and `receive`. I read the vendored v4-core PoolManager and Hooks code to confirm the before-swap specified delta and after-swap unspecified delta net the hook's `take` calls to zero. A scratch test against the real PoolManager checked the 30-minute step boundary, 1-wei and 11-wei buys in the tax window, a full bind and flush, and a system buy through FeeRouter. ETH balance equalled the three held streams throughout.\n- **FeeRouter, RewardPool, EndowmentEscrow, GameRegistry, LaunchToken, Params.set, Season.depositPot:** access checks, balance-delta accounting, and state-before-external-call ordering all hold. The FeeRouter token split arithmetic cannot underflow.\n- **Periphery libraries:** Robinhood, Errors, GameModule, ModuleCode, SwarmCode, ChainClock, EconomyMath, ItemMath, IV4, Interfaces, OracleAttestation, SignatureCheckerCompat. The hook's Params keys 24 to 26 exist with matching defaults.\n- **Value intake paths** of PackSale, FarmCore.buyTokenPack and lobby, Billboards, and the Civic collapse and lot functions.\n\n**Static-analysis leads checked and rejected:** arbitrary ETH sends go only to the proven FeeRouter; the modulo indices are ring buffers; `GridOperator.lobbyETH` reverts so no ETH locks; `MarketFactory.deploy` sets only immutables.\n\n**Not reached (95 rows):** the L3/L4 game modules outside the hook and fee path, including Farm*, Season claims, Civic wars, Economy, Enhancement, GridOperator resolution, PackSale and StarterClaim entropy, and the SwarmDesk oracle flow. The scratch test directory was removed and no repository file was changed.","treeHash":null,"usage":{"cachedInputTokens":2508796,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":46042,"runtime":"claude","turns":36,"wallClockMs":816879}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f2101c240e0b52a9","findings":[],"hash":"6c1fcd9c940cd596cea2cc465f8ab176b0b5fbd566e902cb622225806ad7bb11","nodeId":"e05c283c-6f53-454a-aa0e-db15264f58be","outcome":"completed","summary":"The review is complete. The findings file is written and valid.\n\n**Outcome:** no substantiated defect in the assigned area (Math Precision, Boundary, Numerical Gap). The file `.imd-findings.json` holds an empty findings list and a coverage record with 165 rows: all 160 verifier entry points plus five invariant rows. 131 entry points are marked `holds`, 29 `unreached`, which is above the 80% threshold.\n\n**What I traced and found sound**\n\n- **V4Market hook math.** The buy tax in beforeSwap and the expected consumption in afterSwap use the identical floor formula, so a full fill can never trip PartialFill. The fee-shifted delta is bounded by the int128 check. Sell charges are capped at 15% of output. The TWAP ring of 32 one-minute slots always holds minutes M-31 through M after the last observation, and the 31-minute warm-up guarantees the 30-minute lookback never reads an unset slot. The 1e60 inverse-price accumulator keeps at least 1e20 resolution under the 1e40 price bound. The existing v3.18 hook suite passes locally.\n- **FarmRewards reward envelope.** Productive hash after every maximal multiplier (festival 15%, district 15%, war 10%, same lock boost as the committed weight) reaches at most 143.75% of weight, under the 150% allocation cap that would otherwise lock a farm's settlement cursor. Entry epochs are clamped explicitly. Per-epoch allocations sum below the 159% budget plus redistribution, so the dust computation cannot underflow. Vintage eviction only matures credits at least 8 days old.\n- **FeeRouter splits.** Team, pot, heartbeat and reward shares always sum to the deposit. The heartbeat balance can never exceed its cap because the cap is pinned to 1 ETH in Params, which rules out the underflow lead I had in executeSells.\n- **Season, Civic, Economy, PackSale, RewardPool, GridOperator.** Pot splits total exactly 100%, district payout divisor is always at least one, war payout and pool remainder cannot underflow, auction quote never underflows at the 7-day cap, pack price exponent is clamped and bounded by floor and ceiling, drip and reservation accounting is linear, and grid stability divisions are guarded.\n\n**Static-analysis leads.** The weak-PRNG, divide-before-multiply and arbitrary-send lines on V4Market are ring-buffer indexing, negligible truncation, and router-only recipients. None reproduced as a defect.\n\n**Not reached.** Enhancement, StarterClaim, FarmItems, SwarmDesk, GameRegistry.register and GridOperator's entropy resolution were not traced within budget. They are outside the math area and are marked `unreached` in the coverage record.","treeHash":null,"usage":{"cachedInputTokens":1964630,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":45640,"runtime":"claude","turns":27,"wallClockMs":684905}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa2b7fcb5f53535a","findings":[{"citation":"resolved","description":"Between the L2 launch and the one-time bindFeeRouter call, every buy in the 30-minute launch window moves up to 90% of its ETH into the hook (heldLaunchTax) and every later swap moves 1% (heldBase, heldSellTax). The hook has no owner and only one exit for that ETH: flushFees, which reverts NotConfigured until fees is set. bindFeeRouter can only succeed once _canonical(r) holds, i.e. IHookDesk(desk).registry() == r, which requires the L1 SwarmDesk to have been bound by the pinned binder wallet 0x6d51...d007 after L3. docs/accepted-v318.md accepts binder liveness for the escrowed endowment only; it does not mention that the hook's accumulated ETH (potentially most of the first ten minutes of buy volume) is locked by the same key. Reproduced with the real v4 PoolManager (test/scratch, not kept): a 10 ETH buy in the first minute leaves address(hook).balance == 9 ether and heldLaunchTax == 9 ether, and flushFees() reverts NotConfigured; no other function moves ETH out. Not a code defect under the pinned design (NO SOURCE CHANGES) but a concrete trust/liveness dependency that should be stated in the accepted list and the runbook: the binder key, L3 and L4 must all complete or the launch-window tax is lost forever.","line":199,"path":"src/V4Market.sol","reproduction":"State: hook deployed and pool initialized at T0, fees == address(0). Input: any buyer swaps 10 ETH exact-input at BUY_PRICE_LIMIT at T0+1min. Expected: the 9 ETH launch tax eventually reaches the FeeRouter rewards. Actual: hook holds 9 ETH; flushFees() reverts NotConfigured; bindFeeRouter(router, n, i) reverts InvalidProof at _canonical until SwarmDesk.registry() names the registry, which only the binder wallet can cause; if that key is lost, the ETH is locked permanently.","severity":"low","snippet":"        if (address(fees) == address(0)) revert NotConfigured();","title":"Launch tax and 1% share held by the unbound hook are unrecoverable if the Desk never binds"},{"citation":"resolved","description":"The launch rules supplied with this task say application contracts are fully configured in nonpayable constructors and nothing is configured after deployment. V4Market sets fees and params after deployment through bindFeeRouter. The call is permissionless, one-shot and gated by CREATE2/initcode proofs (registry factory coordinates, gameConfigHash, Params/Desk linkage, Desk canonical binding, FeeRouter enrollment as module 6), so there is no owner or privileged party and the only values written are proven addresses; the FeeRouter cannot be a constructor word because it is created in a later launch (L4). This is a policy-compatibility decision for the adapter and the panel, not a code defect: the requester pins the creation hash 0x8d6e0239... and forbids source changes, and removing or replacing the binding would change that hash. Recorded so the admission step decides explicitly rather than by omission.","line":147,"path":"src/V4Market.sol","reproduction":"State: freshly launched hook, fees == 0, params == 0. Observation: after deployment anyone may call bindFeeRouter(router, launch, index) with a router whose proofs pass; it writes fees and params once (AlreadyDone afterwards). Expected by the launch rules: no post-deployment configuration. Actual: one proof-gated post-deployment write exists by design.","severity":"info","snippet":"    function bindFeeRouter(address router, uint64 registryLaunch, uint256 registryIndex) external nonReentrant {","title":"bindFeeRouter is post-deployment configuration; launch policy expects constructor-only configuration"},{"citation":"resolved","description":"afterSwap records buy volume as the ETH the pool consumed (the input after the 90/50/25% stepped tax), while sells record the full gross ETH output. During the launch window the imbalance meters therefore see roughly a tenth of the ETH buyers actually paid, so the progressive sell surcharge (hour and day components, Params keys 24 and 25) rises faster than the paid flows justify. Measured with the real v4 PoolManager on a 1000-unit full-range pool at 1 token per ETH: a 10 ETH buy at T0 (1 ETH consumed, 9 ETH tax) followed by a 100-token sell gave gross output 90.044 ETH, heldBase 0.9004 ETH and heldSellTax 7.8159 ETH, i.e. a 968 bps total sell charge; counting the 10 ETH the buyer paid would give hour imbalance 7961 bps and day imbalance 7844 bps, a total of about 812 bps, so the seller paid about 1.4 ETH more. Bounded by TOTAL_CAP_BPS (15%) and limited to the 30-minute window; the hook's own comment treats the meters as pool-flow meters, so this may be intended. Reported so the requester confirms the intent; no source change is requested.","line":452,"path":"src/V4Market.sol","reproduction":"State: pool initialized at T0 with full-range liquidity; t = T0 + 1 min. Calls: buyer swaps 10 ETH exact-input at BUY_PRICE_LIMIT (records 1 ETH of buys); seller swaps 100 tokens exact-input at MAX_SQRT_PRICE - 1. Expected (paid-volume accounting): about 812 bps sell charge. Actual: 968 bps (heldSellTax 7.8159 ETH on 90.044 ETH gross).","severity":"info","snippet":"            _record(false, consumed);","title":"Launch-window buys are recorded net of tax while sells are recorded gross, inflating the sell surcharge for 30 minutes"},{"citation":"resolved","description":"_observe back-fills one Observation (two storage words) per elapsed minute, capped at 31, on the first swap after an idle gap, and it runs in beforeSwap so the swapper pays it. Measured with the real v4 PoolManager: a buy immediately after another buy cost 165,237 gas through the manager, the same buy after a 5-day gap cost 533,066 gas. Correctness is unaffected (the 30-minute TWAP only needs the last 31 minutes and the ring check o.minute != minute guards stale slots). Integrators that hard-code a swap gas limit near the hot-path figure will see the first post-idle swap run out of gas; estimateGas handles it. Informational.","line":272,"path":"src/V4Market.sol","reproduction":"State: pool initialized, one swap at T, no swaps until T + 5 days. Input: 1 ETH buy at BUY_PRICE_LIMIT. Expected: gas comparable to a back-to-back swap (about 165k). Actual: about 533k gas because 31 ring entries are written in beforeSwap.","severity":"info","snippet":"        for (uint256 minute = first; minute <= last; ++minute) {","title":"First swap after more than 31 idle minutes writes up to 31 observation slots (about 3.2x gas)"},{"citation":"resolved","description":"The hook pins POOL_FEE = 12500 in the constructor and folds the fee and tick spacing 60 into poolId; afterInitialize and both swap callbacks revert Unauthorized for any other key. The launch rules say the pool opens at the fee the LaunchFactory reads from the chain's LaunchFees contract (1.25% by default) regardless of pool.fee in the manifest. If that network value is anything other than 12500 when the L2 launch runs, the factory's initialize call hits afterInitialize with a key whose hash differs from poolId and the whole launch transaction reverts (fail-safe, no funds move). The adapter should read LaunchFees on Robinhood (4663) right before submission and keep tickSpacing 60. The quote/quoteSell views also assume the 12500 LP fee.","line":129,"path":"src/V4Market.sol","reproduction":"State: LaunchFees on chain 4663 returns a fee other than 12500 (e.g. 10000). Call: LaunchFactory launch with this hook. Expected: pool opens at the network fee. Actual: PoolManager.initialize -> V4Market.afterInitialize -> _check(k) reverts Unauthorized because keccak256(abi.encode(k)) != poolId; the launch transaction reverts.","severity":"info","snippet":"                || desk_ == address(0) || spacing_ <= 0 || spacing_ > 32767 || fee_ != POOL_FEE","title":"Launch requires the network pool fee to be exactly 12500 at launch time; a different LaunchFees value reverts the launch transaction"},{"citation":"resolved","description":"Scope of this L2 review is the hook plus the platform token. Read in full: src/V4Market.sol, src/interfaces/IV4.sol, src/interfaces/ILaunchHook.sol, src/lib/Robinhood.sol, docs/accepted-v318.md, test/AuditV318.t.sol, test/V4Integration.t.sol (setup), test/mocks/MockV4Manager.sol (partial), the FeeRouter deposit and receive paths (src/FeeRouter.sol lines 96-135), the vendored v4-core Hooks.beforeSwap/afterSwap delta handling and Pool.swap delta construction, and the three protected floor tests. Not reached within the budget (not deployed by this step; they are L1/L3/L4 contracts): SwarmDesk, EndowmentEscrow, GameRegistry, Params, FarmCore, FarmEngine, FarmRewards, FarmItems, PackSale, Season, Civic, Economy, Enhancement, GridOperator, Billboards, StarterClaim, RewardPool, StandardAdapter, StandardMarket, MarketFactory, oracle/*. The token: there is no src/LaunchToken.sol in the tree; launch-v39.md says the platform supplies the standard token for L2, and the protected floor takes the token creation code from IMD_TOKEN_CREATION_CODE, so the adapter must confirm that path rather than expect a repository token. Verified: forge build (solc 0.8.26, optimizer 200, cancun, via_ir false, bytecode_hash none) succeeds; keccak256(type(V4Market).creationCode) == 0x8d6e02398e351aa4c28486a92d7ec60baf7edc67ccaaa88eed4bd61e9b9092a4 (matches the task); runtime 21,534 bytes under EIP-170; a linear opcode scan of the runtime (the protected floor's method) finds no DELEGATECALL, CALLCODE or SELFDESTRUCT; the constructor makes no external call (passes the empty-chain floor); seven constructor words, all of supported types, none a literal IMD protocol address; no owner, initializer, proxy, mint, pause or blocklist surface. forge test on test/AuditV318.t.sol: 12 passed, 0 failed. Slither on src (vendor/test/script filtered): V4Market items are arbitrary-send to the proven router, modulo ring indexing flagged as weak PRNG, divide-before-multiply in the harmonic TWAP accumulator (1e60 / price times seconds, bounded by spot()'s 1..1e40 range), and cross-function reentrancy on TWAP state inside the hook's own unlock, all reviewed as non-issues. Aderyn was not run. Checked and found consistent against v4-core: beforeSwap specified-delta fee charged on ETH input equals ethIn - consumed in afterSwap for every step (9000/5000/2500/100 bps), PartialFill and PriceLimitedBuy guards, sell surcharge taken on actual ETH output, hook take/credit nets to zero in every unlock, TWAP ring sufficiency for a 30-minute window, spot() bounds enforce themselves because every swap re-checks in afterSwap. A clean read is not proof of absence of defects.","line":44,"path":"src/V4Market.sol","reproduction":"Not a defect. Commands run: forge build; forge test --match-path test/AuditV318.t.sol; forge test --match-path test/scratch/Probe.t.sol (real PoolManager probes: unbound-hook held tax, idle-gap gas, launch-window sell surcharge, dust buys); slither . --filter-paths vendor|test|script; python opcode scan of out/V4Market.sol/V4Market.json deployedBytecode.","severity":"info","snippet":"contract V4Market is ReentrancyGuard {","title":"Coverage: contracts read, contracts not reached, and verifications run"}],"hash":"6cce9d5add78ac0e6d0fc1024a150562c9a4c5b074843489499fb3b38d2a07fb","nodeId":"4b9c5e15-a25b-4890-be5a-ea0bc10483f9","outcome":"completed","summary":"The review is complete. The findings file is written, every snippet matches its source line, and the working tree holds no other changes.\n\n**Outcome.** No critical, high or medium defect was found in the V4Market hook as it arrived. The findings file at `.imd-findings.json` holds one low finding and five informational entries, including the required coverage statement.\n\n**What was verified**\n- The build under the unchanged repo configuration succeeds, and the hook's creation-code hash equals the task's expected value 0x8d6e…92a4.\n- Runtime is 21,534 bytes, a linear opcode scan finds no DELEGATECALL, CALLCODE or SELFDESTRUCT, and the constructor makes no external call.\n- The v3.18 audit suite passes on the real v4 PoolManager (12 tests, 0 failures). Slither on the hook reported only expected patterns, each reviewed as a non-issue. Aderyn was not run.\n- Traced against vendored v4-core: the beforeSwap ETH charge matches afterSwap's consumed check at every tax step, the hook's take and credit net to zero in every unlock, sell surcharge is taken on actual ETH output, the TWAP ring buffer always covers the 30-minute window, and spot() bounds re-enforce themselves on every swap.\n\n**Findings written**\n- **Low.** ETH held by the unbound hook (up to 90% of launch-window buy volume plus every 1% share) can only leave through flushFees, which reverts until the one-time bind. That bind needs the L1 SwarmDesk to have been bound by the pinned binder wallet. The accepted binder-liveness line covers the escrowed endowment but not this ETH. Reproduced with the real PoolManager: a 10 ETH buy in the first minute locks 9 ETH with no recovery path.\n- **Info.** bindFeeRouter is a proof-gated, permissionless, one-shot post-deployment write, which the launch rules otherwise disallow. Recorded as a policy decision for the adapter and panel, since the requester forbids source changes and pins the creation hash.\n- **Info.** Launch-window buys are recorded net of tax while sells are recorded gross, so the sell surcharge rises faster for 30 minutes. Measured: 968 bps charged versus about 812 bps under paid-volume accounting on the probe scenario.\n- **Info.** The first swap after a 31-minute idle gap writes up to 31 ring slots in beforeSwap. Measured 533k gas versus 165k for a back-to-back swap.\n- **Info.** The hook pins pool fee 12500 and tick spacing 60 into the pool id. If the network LaunchFees value differs at launch, the launch transaction reverts in afterInitialize. The adapter should check that value right before submission.\n- **Info, coverage.** Read in full: V4Market, its interfaces, Robinhood constants, the FeeRouter deposit paths, the v3.18 tests and the protected floor tests. Not reached: the L1, L3 and L4 application modules, which this step does not deploy. There is no src/LaunchToken.sol in the tree; the runbook says the platform supplies the token, which the adapter must confirm.\n\nScratch tests were removed. The next reader is the adapter, who should confirm the token source path and decide on the binding-policy question before the panel review.","treeHash":null,"usage":{"cachedInputTokens":1395344,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":43555,"runtime":"claude","turns":22,"wallClockMs":717059}},{"artifacts":[],"attempt":1,"bundleHash":"c927c82350e76f42a67c137bf52cdcc363af0aae74fa3e53b5b511d1ce637fea","device":"b5d96cb4e4dd8f0e","findings":[],"hash":"718baa8e335f61a1a0bad748212d5678fd1278b98329809056cb6e6a1f996813","nodeId":"6b47d042-b1cb-44d6-bc8c-0c83f8976826","outcome":"completed","summary":"Added the missing `src/LaunchToken.sol`: BLACKOUT, 18 decimals, fixed supply of 1 billion tokens minted to the deploying factory. Updated tests and `ADAPTATION.md`.\n\nExisting contracts, build configuration, and V4Market’s pinned creation hash remain unchanged.\n\nValidation: `forge build` passed; seeded tests: **344 passed, 0 failed, 6 skipped**; supplied token floor: **7 passed**.","treeHash":"2d7e662b902f8087d5c9762e7adbb95740d9b786","usage":{"cachedInputTokens":4286848,"inputTokens":263879,"model":"gpt-6-astra","outputTokens":36930,"runtime":"codex","turns":13,"wallClockMs":1472903}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c5099ef07f22abee","findings":[],"hash":"99a02eb71694326baafd1e8961ab9df56df4ec936cecbd5cde6115c7da4d55f5","nodeId":"b0dd398f-0af7-4697-8e81-d26531809ee8","outcome":"failed","summary":"needs input: The required V4Market constructor words at indices 0 and 4 are exactly $poolManager and $factory, but this job's evm_project manifest validator rejects both. The brief forbids literal protocol addresses, source changes, and changing kind. The existing launch.json already matches the mandated constructor words, so no manifest-only repair can satisfy both the brief and the validator. — Can you provide an evm_project validation and deployment path that accepts and resolves $poolManager and $factory for this univ4_hook launch, or revise the required constructor words to a supported representation?","treeHash":null,"usage":{"cachedInputTokens":2928000,"inputTokens":131182,"model":"gpt-6-astra","outputTokens":13805,"runtime":"codex","turns":15,"wallClockMs":1333306}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"56b13350bba65fd7","findings":[],"hash":"cd13aeccbc9ce1d71b885ea92540f8f90d6579516a1a12f3802d3919733e5fe4","nodeId":"82b4666d-a0f1-4fda-9e64-e4b853086410","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root.\n\n**Result: no new defect in the assigned area.** The economic security, invariant and flow-gap passes over the L2 deployment found nothing beyond the items already accepted in docs/accepted-v318.md. The findings list is empty, so the file reports a clean review with a full coverage record.\n\n**What I verified**\n\n- **Hook ETH conservation.** A scratch test on the real vendored PoolManager ran launch-window buys at two tax steps, external sells, a post-window buy, a system reward buy, a system sell and a flush. At every step the hook's balance equalled the sum of its three held counters, and after the flush the FeeRouter's balance equalled its reward, heartbeat, pot and credit ledgers.\n- **Buy tax accounting.** The beforeSwap charge on the specified input and the afterSwap exact-consumption check agree on the real manager, so the v3.18 fix holds and partial fills cannot occur against full-range liquidity for an ETH-to-token exact-input swap.\n- **Sell surcharge bounds.** The fee never drops below 1% or exceeds 15%, the deviation term uses the post-swap spot against a correctly backfilled 30-minute TWAP, and a wash buy before a dump saves nothing net (17.3 ETH of hook charges versus 13.4 ETH for roughly double the volume).\n- **System swap guards.** Keeper buys and sells are bounded to 1.5% from TWAP, so a sandwich costs the attacker more in fees than the bounded loss it could cause.\n- **L2 to L1 flow.** The 20% remainder sent to the L1 EndowmentEscrow is exactly the 200,000,000 token endowment the registry commits to, so the one-shot forward and RewardPool funding can succeed.\n- **Static-analysis leads.** The arbitrary-send and reentrancy lines on V4Market are false positives: the sell recipient is pinned to the FeeRouter and every value path is guarded or settled before the external call. Two dead leads outside the area were also closed: the heartbeat cap is pinned to exactly 1 ETH, and the epoch reserve is at most 2.4% of the available pool.\n\n**Coverage record**\n\n| Verdict | Rows |\n|---|---|\n| holds | 49 |\n| unreached | 111 |\n| finding | 0 |\n\nAll 160 listed entry points have a row. The `holds` rows cover V4Market, StandardMarket, StandardAdapter, FeeRouter, RewardPool, Economy, EndowmentEscrow, LaunchToken, MarketFactory and Params.set. The `unreached` rows are the L4 game modules (Billboards, Civic, Enhancement, FarmCore, FarmEngine, FarmItems, FarmRewards, GameRegistry, GridOperator, PackSale, Season, StarterClaim, SwarmDesk), which are outside the economic area and were not traced within the budget.\n\nThe scratch test lives under test/scratch/ and is not part of the submission. No source or configuration file was changed.","treeHash":null,"usage":{"cachedInputTokens":2125915,"inputTokens":392,"model":"claude-fable-5-1","outputTokens":29430,"runtime":"claude","turns":30,"wallClockMs":1184987}}],"verification":[{"checks":[{"durationMs":52375,"exitCode":0,"name":"build","output":"Compiling 200 files with Solc 0.8.26\nSolc 0.8.26 finished in 52.03s\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:305:22:\n    |\n305 |     function _record(bool sell, uint256 amount) private {\n    |                      ^^^^^^^^^\nNote: The other declaration is here:\n   --> src/V4Market.sol:504:5:\n    |\n504 |     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":67498,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\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 9.65ms (3.62ms 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 10.92ms (5.66ms 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 11.72ms (6.37ms CPU time)\n\nRan 1 test for test/DeployGateV314.t.sol:DeployGateV314Test\n[PASS] testAllLaunchConstructorsWorkWithNoProtocolCode() (gas: 47296062)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 28.46ms (23.20ms CPU time)\n\nRan 3 tests for test/AuditV318.t.sol:AuditV318PartialFillTest\n[PASS] testAfterSwapAcceptsExactFillAtEveryStep() (gas: 2199373)\n[PASS] testAfterSwapRefusesAPartialFill() (gas: 415962)\n[PASS] testMockBeforeSwapRefusesNonExtremeLimitAndKeepsExactOutputRefusal() (gas: 197452)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 49.22ms (12.88ms 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 51.06ms (35.08ms 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 52.09ms (16.34ms CPU time)\n\nRan 1 test for test/LaunchToken.t.sol:LaunchTokenHookTest\n[PASS] testHookConstructionPreservesFactoryTokenSupply() (gas: 21707018)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 59.07ms (54.09ms CPU time)\n\nRan 7 tests for test/V33.t.sol:LaunchProtectionTest\n[PASS] testBuyTaxHasImmutableSteps() (gas: 97111)\n[PASS] testLaunchTaxChargedAndRoutedEntirelyToPool() (gas: 228216)\n[PASS] testNoBuySizeLimitAtAnyLaunchStep() (gas: 1691893)\n[PASS] testNormalBuyAfterDecayHasNoLaunchTax() (gas: 1479627)\n[PASS] testSellsPayNormalFeeDuringLaunch() (gas: 339677)\n[PASS] testSnipersSplittingBuysStillPayTheCurve() (gas: 657970)\n[PASS] testViewsBeforeInitialization() (gas: 4786746)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 52.50ms (8.77ms 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 51.60ms (5.87ms 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 4.10ms (3.87ms 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.23ms (1.11ms 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 69.26ms (18.95ms 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 76.99ms (36.73ms 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 77.84ms (41.12ms 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 79.60ms (48.08ms CPU time)\n\nRan 9 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzzSelfTransferPreservesBalance(uint256) (runs: 256, μ: 55057, ~: 54766)\nLogs:\n  Bound result 3\n\n[PASS] testFuzzTransferFromSpendsOnlyApprovedAmount(uint256,uint256) (runs: 256, μ: 163310, ~: 165143)\nLogs:\n  Bound result 149\n  Bound result 50\n\n[PASS] testFuzzTransferMovesExactAmountWithoutChangingSupply(uint256) (runs: 256, μ: 92118, ~: 92308)\nLogs:\n  Bound result 3\n\n[PASS] testInfiniteApprovalRemainsUnchanged() (gas: 149447)\n[PASS] testInsufficientBalanceAndAllowanceCannotMoveTokens() (gas: 153092)\n[PASS] testMetadataAndEntireSupplyBelongToDeployer() (gas: 75827)\n[PASS] testNeitherDeployerNorThirdPartyHasMintOrAdminEntrypoints() (gas: 603521)\n[PASS] testRuntimeIsBoundedAndContainsNoForbiddenOpcodes() (gas: 1031094)\n[PASS] testZeroRecipientCannotBurnSupply() (gas: 47579)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 100.87ms (91.96ms CPU time)\n\nRan 6 tests for test/ForeignTokenTwin.t.sol:ForeignTokenTwinTest\n[PASS] testBinderBindsTheGenuineRegistryThenAlreadyDone() (gas: 2793358)\n[PASS] testBinderCannotBypassAnyProof() (gas: 7228653)\n[PASS] testForeignTwinCannotBindFromTheAttacker() (gas: 1433024)\n[PASS] testForeignTwinIsSelfConsistentAndPassesEveryProofExceptTheBinder() (gas: 137061)\n[PASS] testNoNonBinderCanBindEitherRegistry() (gas: 2005687)\n[PASS] testZeroBinderRevertsAtConstruction() (gas: 673051)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 50.87ms (22.82ms 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 113.20ms (76.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, μ: 30107, ~: 30016)\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 117.75ms (84.05ms CPU time)\n\nRan 1 test for test/L2LaunchV318.t.sol:L2V318ArtifactTest\n[PASS] testPinnedSevenWordConstructorWorksOnEmptyChainAndRuntimePassesFloor() (gas: 24419229)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 67.64ms (67.51ms CPU time)\n\nRan 6 tests for test/L2LaunchV318.t.sol:L2V318AuditTest\n[PASS] testIdleObservationBackfillCostsMoreButLeavesTwapUsable() (gas: 2533926)\nLogs:\n  hot swap gas: 163108\n  first swap after five idle days gas: 565137\n\n[PASS] testLaunchWindowMeterEffectOutlivesTheThirtyMinuteTaxWindow() (gas: 1113704)\n[PASS] testLaunchWindowMetersUseNetBuyFlowAndGrossSellFlow() (gas: 844811)\nLogs:\n  gross sell ETH wei: 90044456705534709298\n  pool-flow sell charge bps: 968\n  paid-flow counterfactual bps: 811\n\n[PASS] testNetworkFeeOrSpacingMismatchCannotInitializeAnotherPool() (gas: 213974)\n[PASS] testUnboundLaunchTaxWaitsForBinderThenPermissionlessOneShotHookBinding() (gas: 7868882)\n[PASS] testUnboundPostWindowBaseAndSurchargeAreAlsoHeldUntilBinding() (gas: 2123701)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 13.64ms (7.36ms 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 41.23ms (20.51ms CPU time)\n\nRan 3 tests for test/HookBinding.t.sol:HookBindingTest\n[PASS] testHoldBeforeGameExistsThenBindOnceAndFlushExactStreams() (gas: 43435048)\n[PASS] testLookAlikeCannotBindEvenWhenTeamCalls() (gas: 1908201)\n[PASS] testWrongRouterAndMissingCodeRejectedBeforePermanentBind() (gas: 41150218)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 91.68ms (71.29ms 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 60.44ms (43.28ms 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 68.95ms (50.89ms 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 40.37ms (1.38ms 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 27.11ms (9.69ms 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 255.04ms (209.06ms 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 264.19ms (222.03ms 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: 2181038)\n[PASS] testHookHasNoNetworkShareRecipientOrWithdrawal() (gas: 107668)\n[PASS] testMarketFactoryConfigHasNoNetworkRecipient() (gas: 10171661)\n[PASS] testRegistryAcceptsEitherToolchainPinAndNothingElse() (gas: 590544)\n[PASS] testSellSurchargeStillProgressiveAndCappedAtFifteenPercent() (gas: 1832534)\n[PASS] testStepLaunchTaxUnchangedAndFullyToRewards() (gas: 1292225)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 278.45ms (236.89ms 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: 5948895)\n[PASS] testLaunchTaxExactBoundaries() (gas: 5831609)\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 174.81ms (163.92ms 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, μ: 522870, ~: 524715)\nLogs:\n  Bound result 4506\n  Bound result 50000\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 361.18ms (341.31ms CPU time)\n\nRan 2 tests for test/StandardMarket.t.sol:StandardMarketTest\n[PASS] testFuzzStandardSellNeverAddsProgressiveSurcharge(uint96) (runs: 256, μ: 1806068, ~: 1813963)\nLogs:\n  Bound result 3\n\n[PASS] testStandardBuyOnePercentAllToRewards() (gas: 1673466)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 474.55ms (429.63ms 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, μ: 44939, ~: 45115)\nLogs:\n  Bound result 395\n\n[PASS] testFuzzSplitsConserveEveryWei(uint96) (runs: 256, μ: 207616, ~: 210856)\nLogs:\n  Bound result 3\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 431.20ms (486.22ms 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 520.32ms (817.73ms 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 473.28ms (438.54ms CPU time)\n\nRan 6 tests for test/Market.t.sol:MarketTest\n[PASS] testBuyChargesExactlyOnePercentAllToRewards() (gas: 1730007)\n[PASS] testFuzzTotalFeeHardCap(uint96) (runs: 256, μ: 1805845, ~: 1809180)\nLogs:\n  Bound result 3\n\n[PASS] testOnlyManagerCorrectPoolExactInputAndHookAddress() (gas: 111284)\n[PASS] testSingleDumpIncludesItselfAndFeeDecaysWithoutGriefReset() (gas: 17163513)\n[PASS] testTwapAveragesEthPriceAcrossUnequalPrices() (gas: 2330865)\n[PASS] testTwapWarmupAndFlashManipulationResistance() (gas: 1883323)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 565.55ms (580.57ms 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 853.68µs (72.92µs CPU time)\n\nRan 5 tests for test/ReviewV34.t.sol:ReviewV34Test\n[PASS] testCanonicalCompetingRegistryCannotTakeOverBinding() (gas: 9502782)\n[PASS] testDustBuyCannotConsumeGlobalBuyInterval() (gas: 336156)\n[PASS] testLateGreenEntrySettlesWithinReservedEnvelope() (gas: 4441470)\n[PASS] testMeaningfulSmallBuyCanUseLessThanMaximumBatch() (gas: 263646)\n[PASS] testSameConfigurationAtUncommittedCoordinatesCannotBind() (gas: 9589277)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 95.97ms (51.01ms 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 684.52ms (903.02ms CPU time)\n\nRan 8 tests for test/V4Integration.t.sol:V4IntegrationTest\n[PASS] testRealV4BuyAndSingleSwapSellTaxConserveSettlement() (gas: 2269731)\n[PASS] testRealV4ManipulatedSpotCannotInstantlySetBuybackQuote() (gas: 1909871)\n[PASS] testRealV4SmallBuyPaysPositiveKeeperMargin() (gas: 2072687)\nLogs:\n  real V4 0.2ETH buy gas: 1933528\n  real V4 buy bounty wei: 48651375000000\n\n[PASS] testRealV4SystemBuyUsesTwapAndOnlySystemFunds() (gas: 2078498)\n[PASS] testRealV4SystemSalesUseDepthTwapNormalFeesAndConserveTokens() (gas: 2247043)\n[PASS] testSystemBuybackOffsetsRecordedSellImbalance() (gas: 2509612)\n[PASS] testTenEthPoolRewardBuyAtSpotTwapIncludesLpFee() (gas: 2151712)\n[PASS] testTenEthPoolSystemSellAtSpotTwapIncludesLpFee() (gas: 4120061)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 664.94ms (49.39ms CPU time)\n\nRan 1 test for test/StandardV4Integration.t.sol:StandardV4IntegrationTest\n[PASS] testStandardAdapterRealPoolPaysExistingHookExactlyOnce() (gas: 1949215)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 812.51ms (2.35ms CPU time)\n\nRan 2 tests for test/Factory.t.sol:FactoryTest\n[PASS] testFactoryInvalidSearchRange() (gas: 4937)\n[PASS] testHookFactoryFlagsImmutableConfigAndIdempotence() (gas: 7975916)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 170.39ms (135.03ms 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, μ: 476459, ~: 477920)\nLogs:\n  Bound result 11\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 861.77ms (839.52ms 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 861.78ms (1.82s CPU time)\n\nRan 9 tests for test/AuditV318.t.sol:AuditV318Test\n[PASS] testAuditPriceLimitedBuyRevertsInsteadOfPayingTaxOnUnconsumedEth() (gas: 132927)\n[PASS] testBeforeSwapNamesThePriceLimitedBuyError() (gas: 63433)\n[PASS] testFullFillBuysPayEachStepExactly() (gas: 2527120)\n[PASS] testFullFillTenEthBuyPaysExactlyNinetyPercentInTheFirstStep() (gas: 413400)\n[PASS] testFuzzOnlyTheExtremeBoundBuysAndPaysTheFlooredTax(uint96,uint160,uint8) (runs: 256, μ: 1474202, ~: 1367460)\nLogs:\n  Bound result 99254458094816678182\n  Bound result 7175873692729236725383503880\n  Bound result 1\n\n[PASS] testPriceLimitedBuyRefusedAfterLaunchWindowToo() (gas: 4642431)\n[PASS] testPriceLimitedSellStillFillsPartiallyAndIsChargedOnActualOutput() (gas: 2237288)\n[PASS] testPublicInterfaceUnchanged() (gas: 108830)\n[PASS] testSystemRewardBuyStillFills() (gas: 1992012)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 942.34ms (361.55ms 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 638.35ms (806.85ms 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, μ: 1374204, ~: 1374014)\nLogs:\n  Bound result 3\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.02s (1.20s CPU time)\n\nRan 7 tests for test/HeartbeatBpsV313.t.sol:HeartbeatBpsV313Test\n[PASS] testFuzzAnyShareConservesEveryWeiAndNeverMovesTeamOrPot(uint16,uint96) (runs: 256, μ: 1399456, ~: 1628577)\nLogs:\n  Bound result 4749\n  Bound result 12835\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 1.68s (1.65s 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: 12111396)\n[PASS] testRecordWithOtherHookOrOtherPairCurrencyIsRefused() (gas: 6245556)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.77s (39.15ms 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.77s (2.57s CPU time)\n\nRan 2 tests for test/ReservedEventsV35.t.sol:ReservedEventsV35Test\n[PASS] testFuzzReservedFestivalCannotExceedFifteenPercent(uint16) (runs: 256, μ: 4927535, ~: 4927534)\n[PASS] testReservedHeatwaveExtraCoolingWearAndBothProtections() (gas: 10178642)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.41s (1.45s 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.79s (1.19s 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.90s (1.02s 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.65s (8.78s 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, μ: 61457, ~: 63085)\nLogs:\n  Bound result 10800\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 17.76s (574.55ms 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, μ: 88622, ~: 90188)\nLogs:\n  Bound result 10800\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 17.88s (710.12ms 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, μ: 45597943, ~: 45621057)\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 17.88s (18.77s 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   | 580   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | buy       | 603   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | claim     | 569   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | equip     | 630   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | expand    | 642   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | freeClaim | 584   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | fundPot   | 543   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | lock      | 580   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | resolve   | 570   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | rollover  | 562   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | settle    | 587   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | tokenPack | 589   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unlock    | 571   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unplace   | 582   | 0       | 0        |\n╰-------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 7436\n  Bound result 7000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 67.06s (67.01s CPU time)\n\nRan 60 test suites in 67.24s (151.58s CPU time): 344 tests passed, 0 failed, 6 skipped (350 total tests)\n","passed":true},{"durationMs":354,"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,\"ADAPTATION.md\":164,\"README.md\":91,\"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\":81,\"docs/api-v35.md\":41,\"docs/dependency-provenance.md\":9,\"docs/design.md\":69,\"docs/entropy-v34.md\":31,\"docs/l2-v318-handoff.md\":144,\"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\":263,\"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\":565,\"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/L2LaunchV318.t.sol\":380,\"test/LaunchToken.t.sol\":147,\"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_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":17262,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/V4Market.sol:516: V4Market._sellCallback(bytes) (src/V4Market.sol#516-539) sends eth to arbitrary user\n[high/medium] arbitrary-send-eth at src/V4Market.sol:198: V4Market.flushFees() (src/V4Market.sol#198-212) sends eth to arbitrary user\n[high/medium] weak-prng at src/V4Market.sol:375: V4Market.nextStepIn() (src/V4Market.sol#375-378) uses a weak PRNG: \"LAUNCH_TAX_STEP - t % LAUNCH_TAX_STEP (src/V4Market.sol#377)\"\n[high/medium] weak-prng at src/V4Market.sol:305: V4Market._record(bool,uint256) (src/V4Market.sol#305-326) uses a weak PRNG: \"delete shortVolumes[p % 12] (src/V4Market.sol#310)\"\n[high/medium] weak-prng at src/V4Market.sol:260: V4Market._observe(uint256) (src/V4Market.sol#260-280) uses a weak PRNG: \"observations[minute % 32] = Observation(uint64(minute),c) (src/V4Market.sol#274)\"\n[high/medium] weak-prng at src/V4Market.sol:305: V4Market._record(bool,uint256) (src/V4Market.sol#305-326) uses a weak PRNG: \"b = longVolumes[p % 24] (src/V4Market.sol#314)\"\n[high/medium] weak-prng at src/V4Market.sol:282: V4Market._cumulativeAt(uint256) (src/V4Market.sol#282-289) uses a weak PRNG: \"o = observations[minute % 32] (src/V4Market.sol#286)\"\n[high/medium] weak-prng at src/V4Market.sol:305: V4Market._record(bool,uint256) (src/V4Market.sol#305-326) uses a weak PRNG: \"a = shortVolumes[p % 12] (src/V4Market.sol#308)\"\n[high/medium] weak-prng at src/V4Market.sol:305: V4Market._record(bool,uint256) (src/V4Market.sol#305-326) uses a weak PRNG: \"delete longVolumes[p % 24] (src/V4Market.sol#316)\"\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/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/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: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 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/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/V4Market.sol:260: V4Market._observe(uint256) (src/V4Market.sol#260-280) 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/V4Market.sol:282: V4Market._cumulativeAt(uint256) (src/V4Market.sol#282-289) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/V4Market.sol:260: V4Market._observe(uint256) (src/V4Market.sol#260-280) 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/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/V4Market.sol:489: V4Market.quoteSell(uint256) (src/V4Market.sol#489-493) 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/FarmRewards.sol:317: FarmRewards.beginMining(address,uint256) (src/FarmRewards.sol#317-330) 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/V4Market.sol:357: V4Market.sinceLaunch() (src/V4Market.sol#357-359) 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:291: V4Market.twap() (src/V4Market.sol#291-296) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:260: V4Market._observe(uint256) (src/V4Market.sol#260-280) 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/V4Market.sol:260: V4Market._observe(uint256) (src/V4Market.sol#260-280) 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/V4Market.sol:541: Reentrancy in V4Market.unlockCallback(bytes) (src/V4Market.sol#541-564):\n[medium/medium] reentrancy-no-eth at src/V4Market.sol:516: Reentrancy in V4Market._sellCallback(bytes) (src/V4Market.sol#516-539):\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/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:214: GridOperator._resolve(uint256,address).repeated (src/GridOperator.sol#214) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GridOperator.sol:123: GridOperator.gridStability(uint256).largest (src/GridOperator.sol#123) is a local variable never initialized\n[medium/medium] uninitialized-local at sr","passed":true},{"durationMs":2678,"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 (131 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 (19 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"718baa8e335f61a1a0bad748212d5678fd1278b98329809056cb6e6a1f996813","verifiedTreeHash":"2d7e662b902f8087d5c9762e7adbb95740d9b786","verifierVersion":"0.1.0+67c588fa"}]}