{"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":"14aa1d96-3c67-4b18-af80-481cf2b92ea8","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"2ba381ef978ac963127d1ec033a698957790730bdaa064ac0ea42e668bd629ee","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"}],"objective":"BLACKOUT v3.9: extend v3.8 (job b5d8b2ab, same repo). NO DEPLOY. Finish every \"Not done\" item from the v3.8 report. You MAY change foundry.toml in this job.\nX: https://x.com/IMDBlackout | Site: playblackout.xyz | Free pack: https://playblackout.xyz/freepack\n\n1. Hook fees: remove the hook's own 0.25% network share; after the launch tax window the hook adds exactly 1% to rewards on every swap; remove the team half of FeeRouter._base (team swap income is the platform 1% to the paying wallet). Keep the stepped launch tax and the progressive sell surcharge. Update all fee assertions.\n2. Toolchain: set via_ir = false and bytecode_hash = \"none\" (the IMD verifier settings), rebuild, re-pin all ModuleCode/SwarmCode hashes, keep every runtime under 24,576 bytes (split FarmCore into an existing module if needed). Keep max 8 contracts per launch.\n3. Severity: keep the Desk band 5000-7000 and add an on-chain floor of 3000 in GridOperator.\n4. Re-run the Balanced launch-core simulation with 10 ETH initial FDV and the swarm 10% claimable 1 hour after launch; report payback, drawdown, team ETH vs v3.6.\n5. Keeper: attestation relay (fetch from the IMD oracle API, submit to Desk), wiring commands in order (register, Desk.bind right after job A with a check of Desk.registry(), bindFeeRouter, escrow.forward, fundEndowment), LaunchFactory claimFees. UI: same changes.\n6. launch-v39.md: final ordered runbook with Sepolia rehearsal first, exact objective texts for every paid step (under 8000 chars, X link included).\n7. forge build/test/fmt pass under the new settings. Second contributor reviews the diff. Report changes, tests, simulation, anything still open. No deploy, no broadcast, no token actions.\n\nUpgrades and pausing: Not upgradeable. All contracts are immutable; the hook has no owner. No admin keys, no proxy, no migration, no personal or team wallet with any game power.  The only \"swarm role\" is the SwarmDesk contract, which acts solely on attested IMD oracle answers (verified attester signature, pinned questions, freshness, replay protection), delivered by Intake/IntakeDelivery or relayed permissionlessly via submit. Through those answers it can only: submit bounded event plans (severity 5000-7000, on-chain floor 3000); change Params within hard-coded ranges (max 10% per 24h); announce features, which anyone can enable after 48 hours and nothing can ever disable; raise the enhancement cap +8 to +12 to +16, upward only, at least 30 days apart; pause new pack purchases (incl. the ETH zap) and black market buys for at most 72 hours, with automatic expiry and at least 72 live hours between pauses.  Never pausable: claims, withdrawals, sync, settlement, epochs, entropy, repairs, locks and unlocks, buybacks, season finalize, Desk.bind, bindFeeRouter, EndowmentEscrow.forward and endowment funding.  Fixed at deploy, never changeable: pack profile (Balanced), free pack and Identity MD Merkle roots, snapshot block, endowment amount. EndowmentEscrow has no owner and one exit only: forward to the authenticated RewardPool. If oracle answers stop, the game keeps running on its fallback event table and current Params.","parentJobId":"b5d8b2ab-fb37-4d3a-95d6-e13c5d09b1bb","planHash":"0fb8c6a73465921890db204dbc3347f6d7da17208d12428700f42f9597746653","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"21248c45-9e6e-4e68-bf90-de66eeac77cd","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1269-reports-v1-job-b9e37680-814c-4f17-b4bc-6"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52179","feedbackHash":"a421987ebcef196be84c5f98ef396c38be1fd580f61ff6e89c271778a03ab56c","nodeKey":"build_contract_project","submissionHash":"e4024243a876dc081c92d5420c6d42d219934c17bf9a9aa45fe8d139a8ce3969","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"52230","feedbackHash":"2408e13ac81549649da9e346152ab2529f7fd9eea50492035763b88e5092158a","nodeKey":"build_contract_project","submissionHash":"2ba381ef978ac963127d1ec033a698957790730bdaa064ac0ea42e668bd629ee","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"d87880b07bc16e9e3c4d6cefada64a85248bfe3b0d16dca5d7bc3f77090087ed","state":"completed","submissions":[{"artifacts":[],"attempt":3,"bundleHash":"2332c087ee64239f2a6d45b0434b95a293f7a50ec26ee5cb8f694fcb16be2174","device":"04f946173ab09bec","findings":[],"hash":"2ba381ef978ac963127d1ec033a698957790730bdaa064ac0ea42e668bd629ee","nodeId":"a3e3f643-6864-4dc1-900b-3a6e924e3b53","outcome":"completed","summary":"","treeHash":"6e8c7724963b0a721e2ff139d3ef77ba5720eac7","usage":{"cachedInputTokens":19267707,"inputTokens":1830,"model":"claude-fable-5-1","outputTokens":185365,"runtime":"claude","turns":61,"wallClockMs":4937191}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ee2cc12e7dfe571a","findings":[],"hash":"d15ee5f0e9b6889b76f8df51c190217581494d01bdf141590b43de829cf4f26a","nodeId":"a3e3f643-6864-4dc1-900b-3a6e924e3b53","outcome":"failed","summary":"wrote outside the task's allowed paths: foundry.toml","treeHash":null,"usage":{"cachedInputTokens":6834002,"inputTokens":1890,"model":"claude-fable-5-1","outputTokens":54318,"runtime":"claude","turns":61,"wallClockMs":1099761}},{"artifacts":[],"attempt":2,"bundleHash":"aace99dab91ad47d67b1582aeb4713745466f678c2bbfe04e91c3acecc28291e","device":"02f22d6f13810ca8","findings":[],"hash":"e4024243a876dc081c92d5420c6d42d219934c17bf9a9aa45fe8d139a8ce3969","nodeId":"a3e3f643-6864-4dc1-900b-3a6e924e3b53","outcome":"completed","summary":"Time budget is exhausted, so I am stopping here with the state recorded honestly.\n\n**Outcome.** Items 1, 3, 4, 5 and 6 of the v3.9 brief are implemented in the working tree; item 2 (toolchain) is blocked and item 7 is partly done. The full `forge test` run was started but had not finished compiling under via-IR when time ran out, so I could not confirm the suites green. `forge build` passed after the fee and severity changes, and `forge fmt` was applied to every changed Solidity file.\n\n**What changed**\n- `src/V4Market.sol`: network share removed entirely (constant, credit, recipient argument, `withdrawNetwork`). After the stepped launch tax, every swap adds exactly 1% to reward buys. The progressive sell surcharge stays, now switched by `surchargeEnabled()` because the old `projectBps()==100` short-circuit would have disabled it. Constructor is now 8 arguments.\n- `src/FeeRouter.sol`: the base fee goes 100% to reward buys; the team half is gone.\n- `src/GridOperator.sol`: on-chain severity floor of 3000; the Desk keeps 5000 to 7000.\n- `StandardMarket`, `MarketFactory`, mocks and seven test files updated. New tests cover the 1% rule, zero team share from the base stream, hook balance conservation, and the floor (2999 refused, 3000 and 7000 accepted).\n- `ModuleCode` and `SwarmCode` re-pinned for the committed configuration. The module pins were verified against the formatted sources. A background rebuild to refresh `SwarmCode` after formatting was still running at the end, so that file should be re-checked with `tools/pin_swarm_code.py --check` after one more build.\n- `sim/run_v39.py` and `artifacts/v39/simulation.md`: Balanced, 10 ETH FDV, swarm sale at hour one. Payback stays at 3.75 days, team ETH is flat versus v3.6, drawdown rises with the swarm sale fraction.\n- Keeper: `relay`, five ordered `wire-*` commands, `claim-fees`, plus `keeper/lib/abi.mjs`, whose output byte-matches `cast calldata`. UI text updated. `launch-v39.md`, `docs/review-v39.md` and `report.md` written.\n\n**Blocked and open**\n- `foundry.toml` was not touched because the platform rejected the previous attempt for writing it. Measured with environment overrides, the sources do not compile without via-IR: legacy codegen hits \"stack too deep\" in `V4Market`, `SwarmDesk`, `FarmCore`, `FarmEngine` and `FarmRewards`. That refactor, the re-pin under the verifier toolchain and the size check are documented as the first step of the runbook for the requester.\n- Full test confirmation, the Sepolia rehearsal and an independent review remain open and are listed in `report.md`.","treeHash":"7cd26c423eafbba65ae1a0c6d2664c454934f142","usage":{"cachedInputTokens":6273765,"inputTokens":1638,"model":"claude-fable-5-1","outputTokens":61932,"runtime":"claude","turns":54,"wallClockMs":2521162}}],"verification":[{"checks":[{"durationMs":206744,"exitCode":0,"name":"build","output":"Compiling 184 files with Solc 0.8.26\nSolc 0.8.26 finished in 206.45s\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:300:22:\n    |\n300 |     function _record(bool sell, uint256 amount) private {\n    |                      ^^^^^^^^^\nNote: The other declaration is here:\n   --> src/V4Market.sol:490:5:\n    |\n490 |     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/Events.t.sol:199:9:\n    |\n199 |         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:160:13:\n    |\n160 |             uint256 quote = d.packs.quote(112);\n    |             ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/LazyAccounting.t.sol:395:9:\n    |\n395 |         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 (2072): Unused local variable.\n  --> test/Regression.t.sol:73:9:\n   |\n73 |         uint256 previous = d.items.data(id).durability;\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 (2018): Function state mutability can be restricted to pure\n   --> src/FarmRewards.sol:146:5:\n    |\n146 |     function ready() public view returns (bool) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[missing-events-access-control]: `bestClaimed` is changed without an event but is used for access control\n   ╭▸ src/Season.sol:76:9\n   │\n76 │         bestClaimed[w] = true;\n   │         ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `seasons` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:174:21\n    │\n174 │                     seasons[w].districtSpend[d] += districtSpendOf[w][p];\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-arithmetic]: `heldBase` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:461:9\n    │\n461 │         heldBase += base;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-access-control]: `seasons` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:241:17\n    │\n241 │                 seasons[w].districtSpend[d] += districtSpendOf[w][p];\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-arithmetic]: `heldSellTax` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:462:9\n    │\n462 │         heldSellTax += excess;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-access-control]: `seasons` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:263:9\n    │\n263 │         s.totalTickets += weight;\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `seasons` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:275:9\n    │\n275 │         seasons[w].prize += amount;\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `lotteryClaimed` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:364:9\n    │\n364 │         lotteryClaimed[w][msg.sender] = true;\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-arithmetic]: `heldBase` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:520:9\n    │\n520 │         heldBase += base;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:151:30\n    │\n151 │         return epoch != 0 && block.timestamp < epochs[epoch].end;\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `scrapAllowance` is updated\n    ╭▸ src/FarmRewards.sol:165:13\n    │\n165 │             pool().recycle(scrapAllowance);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `epoch` is updated\n    ╭▸ src/FarmRewards.sol:169:13\n    │\n169 │             grid().resolveFor(epoch, msg.sender);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `epoch` is updated\n    ╭▸ src/FarmRewards.sol:179:17\n    │\n179 │                 pool().reserve(old.budget);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `epoch` is updated\n    ╭▸ src/FarmRewards.sol:186:33\n    │\n186 │                 if (prize != 0) season().addPrize(week, prize);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:230:9\n    │\n230 │         grid().shift(epoch);\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:231:9\n    │\n231 │         fees().payBounty(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmRewards.sol:189:40\n    │\n189 │                     lastAverageDaily = old.mining * (10000 - old.tariff) / 10000 * 4 / activeFarmCount[epoch];\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:163:13\n    │\n163 │         if (block.timestamp < launchTime() || (epoch != 0 && block.timestamp < epochs[epoch].end)) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:163:62\n    │\n163 │         if (block.timestamp < launchTime() || (epoch != 0 && block.timestamp < epochs[epoch].end)) revert TooEarly();\n    │                                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:115:23\n    │\n115 │         return Params(registry.params());\n    │                       ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/Billboards.sol:60:13\n   │\n60 │         if (t.balanceOf(address(this)) - before_ != amount) revert InvalidValue();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:226:36\n    │\n226 │             epochParam[epoch][k] = params().get(Params.Key(k));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:198:13\n    │\n198 │             emit EpochClosed(epoch, old.budget, old.raw);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:209:13\n    │\n209 │             emit Expired(epoch, gone);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:232:9\n    │\n232 │         emit EpochStarted(epoch, e.start, e.end, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FarmRewards.sol:171:13\n    │\n171 │             (old.kind, old.severity, old.district, old.seed,) = grid().eventAt(epoch);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:202:19\n    │\n202 │         e.start = uint64(block.timestamp);\n    │                   ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:203:17\n    │\n203 │         e.end = uint64(block.timestamp + EPOCH);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/Billboards.sol:82:17\n   │\n82 │                 revert InvalidValue();\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/Billboards.sol:88:17\n   │\n88 │                 revert InvalidValue();\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarketFactory.sol:70:9\n   │\n70 │         emit MarketDeployed(address(market), salt);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/Billboards.sol:70:9\n   │\n70 │         RewardPool(pool).donate(amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Billboards.sol:120:9\n    │\n120 │         emit BillboardSettled(w, d, b.bid);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/Civic.sol:61:13\n   │\n61 │         if (t.balanceOf(address(this)) - before_ != amount) revert InvalidValue();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Civic.sol:84:82\n   │\n84 │         if (feature >= FEATURES || noticeAt[feature] == 0 || enabled[feature] || block.timestamp < noticeAt[feature]) {\n   │                                                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:103:17\n    │\n103 │         return (block.timestamp < boostUntil[d] ? seasonBoost[d] : 0) + (block.timestamp < warBoostUntil[d] ? 1000 : 0);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:103:74\n    │\n103 │         return (block.timestamp < boostUntil[d] ? seasonBoost[d] : 0) + (block.timestamp < warBoostUntil[d] ? 1000 : 0);\n    │                                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Civic.sol:137:13\n    │\n137 │             uint64(block.timestamp + 48 hours),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Season.sol:67:26\n   │\n67 │         if (rolled[w] || block.timestamp >= claimDeadline(w)) revert TooEarly();\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Civic.sol:173:66\n    │\n173 │         if (!found && contribution[warId][msg.sender] > low) top[slot] = msg.sender;\n    │                                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Civic.sol:173:14\n    │\n173 │         if (!found && contribution[warId][msg.sender] > low) top[slot] = msg.sender;\n    │              ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:152:42\n    │\n152 │         if (!enabled[0] || warId == 0 || block.timestamp >= w.end || w.settled || (d != w.a && d != w.b)) {\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/Civic.sol:71:9\n   │\n71 │         RewardPool(pool).donate(amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:192:40\n    │\n192 │         if (warId == 0 || w.settled || block.timestamp < w.end) revert TooEarly();\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Civic.sol:202:9\n    │\n202 │         emit WarFinished(warId, w.winner, w.payout, toPool);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:228:67\n    │\n228 │             !enabled[1] || !collapseFinalized || outagePending || block.timestamp < greenUntil\n    │                                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:239:34\n    │\n239 │         if (collapseFinalized || block.timestamp >= collapseEnd) revert TooEarly();\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Civic.sol:243:9\n    │\n243 │         emit CollapseFunded(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:247:34\n    │\n247 │         if (collapseFinalized || block.timestamp < collapseEnd) revert TooEarly();\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:261:13\n    │\n261 │         if (block.timestamp < greenUntil) return 1;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Civic.sol:280:48\n    │\n280 │         lots[w] = Lot(kind, rarity, supply, 0, uint64(block.timestamp));\n    │                                                ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Civic.sol:298:9\n    │\n298 │         ICore(registry.module(2)).civicPurchase(msg.sender, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Civic.sol:299:14\n    │\n299 │         id = FarmItems(registry.module(3)).mint(msg.sender, l.kind, l.rarity, false);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Civic.sol:300:9\n    │\n300 │         emit LotBought(w, msg.sender, id, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Params.sol:176:13\n    │\n176 │         if (block.timestamp < lastChanged[k] + 1 days) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Season.sol:81:26\n   │\n81 │         if (rolled[w] || block.timestamp < claimDeadline(w)) revert TooEarly();\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:309:9\n    │\n309 │         emit MiningStarted(p, epoch, secondsLeft, weighted);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/GridOperator.sol:116:16\n    │\n116 │         return block.timestamp < uint256(l.at) + 3 days ? l.amount : 0;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Season.sol:154:13\n    │\n154 │         if (block.timestamp < launchTime()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:127:13\n    │\n127 │             total += stake[i];\n    │             ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Season.sol:161:13\n    │\n161 │         if (block.timestamp >= deadline(w) || completed[w][p]) return;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:128:28\n    │\n128 │             if (stake[i] > largest) largest = stake[i];\n    │                            ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Season.sol:202:60\n    │\n202 │         if (districtSpendOf[w][p] > low) topSpenders[w][d][slot] = p;\n    │                                                            ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:126:24\n    │\n126 │             stake[i] = eco.districtStake(i);\n    │                        ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Season.sol:234:13\n    │\n234 │         if (block.timestamp >= deadline(w) || completed[w][p]) return;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Season.sol:253:13\n    │\n253 │         if (block.timestamp >= deadline(w) || completed[w][p]) return;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Season.sol:280:42\n    │\n280 │         if (!rewards().seasonReady(w) || block.timestamp < deadline(w) || limit == 0 || limit > 64) revert TooEarly();\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Season.sol:283:20\n    │\n283 │         s.target = uint64(ChainClock.number() + 2);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:159:52\n    │\n159 │         lobbies[d] = Lobby(lobbyAmount(d) + value, uint64(block.timestamp));\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:121:31\n    │\n121 │         Economy eco = Economy(registry.module(10));\n    │                               ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:140:35\n    │\n140 │         stable += 5000 * lobby / (eco.averageDaily() * 5 + lobby);\n    │                                   ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:173:33\n    │\n173 │             outputBonus[e][d] = civic.outputBonus(d);\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/GridOperator.sol:120:21\n    │\n120 │         if (d >= 8) revert InvalidValue();\n    │                     ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:167:20\n    │\n167 │         x.target = uint64(ChainClock.number() + 1);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:168:21\n    │\n168 │         x.started = uint64(block.timestamp);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:328:39\n    │\n328 │             if (s.best != address(0)) rewards().award(s.best, s.prize);\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:329:18\n    │\n329 │             else rewards().releasePrize(s.prize);\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:331:34\n    │\n331 │         if (s.participants != 0) fees().payWork(msg.sender, Params.Key.SeasonBounty, 1, startGas - gasleft());\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Season.sol:319:25\n    │\n319 │         for (uint256 i; i < 3 && left != 0; ++i) {\n    │                         ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Season.sol:332:9\n    │\n332 │         emit SeasonFinalized(w, s.winnerDistrict, s.best, s.seed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Season.sol:315:36\n    │\n315 │                 s.winnerDistrict = uint8(d);\n    │                                    ━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmRewards.sol:350:25\n    │\n350 │         for (uint256 n; n < limit && cursor < settledEpoch; ++n) {\n    │                         ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Season.sol:338:20\n    │\n338 │         s.target = uint64(ChainClock.number() + 2);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:123:22\n    │\n123 │         return ICore(registry.module(2));\n    │                      ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:359:60\n    │\n359 │         (uint256 raw, uint256 productive, uint256 power) = core().process(p, id);\n    │                                                            ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:139:16\n    │\n139 │         return registry.launchTime();\n    │                ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:425:9\n    │\n425 │         core().autoRepair(p, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:119:27\n    │\n119 │         return RewardPool(registry.module(0));\n    │                           ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:446:26\n    │\n446 │         if (unused != 0) pool().recycle(unused);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:449:28\n    │\n449 │             if (dust != 0) pool().recycle(dust);\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:431:13\n    │\n431 │             core().activity(p, id, o.gross, o.net);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:433:17\n    │\n433 │                 core().grantDrop(p, keccak256(abi.encode(e.seed, p, \"item\")));\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:135:24\n    │\n135 │         return ISeason(registry.module(8));\n    │                        ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:435:13\n    │\n435 │             season().recordActivity(p, week, o.gross, weight);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/GridOperator.sol:250:9\n    │\n250 │         fees().payWork(keeper, Params.Key.EntropyBounty, 1, startGas - gasleft());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:380:13\n    │\n380 │             season().complete(p, week);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:359:14\n    │\n359 │         id = packs().rewardPack(msg.sender);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:477:13\n    │\n477 │             emit Credited(p, e, amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:488:9\n    │\n488 │         emit Credited(p, e, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:450:13\n    │\n450 │             emit EpochSettled(id, e.spent, dust);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/FarmRewards.sol:422:35\n    │\n422 │         if (spent > o.allocation) revert InvalidValue();\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:369:14\n    │\n369 │         id = items().mint(msg.sender, k, r, true);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:475:13\n    │\n475 │         if (block.timestamp >= at + 7 days) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:485:19\n    │\n485 │         v.epoch = uint64(e);\n    │                   ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:486:48\n    │\n486 │         if (at > v.at || v.amount == 0) v.at = uint64(at);\n    │                                                ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:209:57\n    │\n209 │             if (old == Kind.Green || old == Kind.Cheap) positives++;\n    │                                                         ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:210:27\n    │\n210 │             if (old == k) repeated++;\n    │                           ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:225:13\n    │\n225 │             sum += w;\n    │             ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmRewards.sol:514:25\n    │\n514 │         for (uint256 n; n < 32 && amount != 0; ++n) {\n    │                         ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:503:36\n    │\n503 │             if (old.amount != 0 && block.timestamp >= uint256(old.at) + 7 days) {\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:520:45\n    │\n520 │             if (taxed) tax += used * taxBps(block.timestamp > v.at ? block.timestamp - v.at : 0) / 10000;\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:233:34\n    │\n233 │                     x.district = uint8(d);\n    │                                  ━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `farms` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:287:9\n    │\n287 │         f.serial = nextSerial++;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `purchasedRoom` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:107:9\n    │\n107 │         purchasedRoom[msg.sender][room] = true;\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `farms` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:241:9\n    │\n241 │         f.paidXpToday += amount;\n    │         ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `farms` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:312:9\n    │\n312 │         f.active = f.loadout;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `farms` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:559:9\n    │\n559 │         farms[p].xp += 100;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/V4Market.sol:203:24\n    │\n203 │         if (base != 0) fees.depositBaseFee{value: base}();\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:288:9\n    │\n288 │         rewards().initialize(p);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:295:13\n    │\n295 │         if (rewards().settle(p, 8) < rewards().settledEpoch()) revert CatchUpRequired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:301:9\n    │\n301 │ ┏         rewards()\n302 │ ┃             .setWeight(\n303 │ ┃                 p,\n304 │ ┃                 engine().allocationHash(farms[p].loadout, farms[p].paid != 0) * (10000 + _boost(p, block.timestamp))\n305 │ ┃                     / 10000\n306 │ ┃             );\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/V4Market.sol:204:26\n    │\n204 │         if (excess != 0) fees.depositSellTax{value: excess}();\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/V4Market.sol:205:29\n    │\n205 │         if (launchTax != 0) fees.depositLaunchTax{value: launchTax}();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/FarmCore.sol:92:9\n   │\n92 │         season().recordSpend(p, cost, true);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:206:9\n    │\n206 │         emit FeesFlushed(base, excess);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:207:29\n    │\n207 │         if (launchTax != 0) emit LaunchTaxFlushed(launchTax);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:288:9\n    │\n288 │         rewards().initialize(p);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:295:13\n    │\n295 │         if (rewards().settle(p, 8) < rewards().settledEpoch()) revert CatchUpRequired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:301:9\n    │\n301 │ ┏         rewards()\n302 │ ┃             .setWeight(\n303 │ ┃                 p,\n304 │ ┃                 engine().allocationHash(farms[p].loadout, farms[p].paid != 0) * (10000 + _boost(p, block.timestamp))\n305 │ ┃                     / 10000\n306 │ ┃             );\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:359:60\n    │\n359 │         (uint256 raw, uint256 productive, uint256 power) = core().process(p, id);\n    │                                                            ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:380:13\n    │\n380 │             season().complete(p, week);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:425:9\n    │\n425 │         core().autoRepair(p, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:431:13\n    │\n431 │             core().activity(p, id, o.gross, o.net);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:433:17\n    │\n433 │                 core().grantDrop(p, keccak256(abi.encode(e.seed, p, \"item\")));\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:435:13\n    │\n435 │             season().recordActivity(p, week, o.gross, weight);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:446:26\n    │\n446 │         if (unused != 0) pool().recycle(unused);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:449:28\n    │\n449 │             if (dust != 0) pool().recycle(dust);\n    │                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:533:9\n    │\n533 │         pool().pay(msg.sender, net);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:293:9\n    │\n293 │         emit Committed(p, weight, epoch + 1, expiry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:534:9\n    │\n534 │         emit Claimed(msg.sender, amount, tax);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:542:9\n    │\n542 │         emit Spent(p, consumed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `purchasedRoom` is updated\n    ╭▸ src/FarmCore.sol:432:13\n    │\n432 │             RewardPool(pool()).recordInflow(paid);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `purchasedRoom` is updated\n    ╭▸ src/FarmCore.sol:434:20\n    │\n434 │             paid = rewards().spend(p, nominal);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `purchasedRoom` is updated\n    ╭▸ src/FarmCore.sol:437:9\n    │\n437 │         season().recordSpend(p, paid, kind == 0 || kind == 3 || kind == 4);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:553:9\n    │\n553 │         emit Spent(p, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:438:9\n    │\n438 │         emit Spent(p, kind, paid, nominal);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:108:9\n    │\n108 │         emit RoomPurchased(msg.sender, room, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/FarmRewards.sol:556:80\n    │\n556 │     function scrap(address p, uint256 hash, uint256 minimum) external onlyCore nonReentrant returns (uint256 amount) {\n    │                                                                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:570:9\n    │\n570 │         pool().recycle(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:116:9\n    │\n116 │         emit AutoRepairSet(msg.sender, autoRepairThreshold[msg.sender]);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:127:13\n    │\n127 │             emit Spent(p, 0, paid, paid);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StandardAdapter.sol:46:64\n   │\n46 │         if (rate == 0 || rate > 1e40 || window < 30 minutes || at > block.timestamp || block.timestamp - at > 5 minutes)\n   │                                                                ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StandardAdapter.sol:46:88\n   │\n46 │         if (rate == 0 || rate > 1e40 || window < 30 minutes || at > block.timestamp || block.timestamp - at > 5 minutes)\n   │                                                                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/StandardAdapter.sol:58:9\n   │\n58 │         manager.unlock(abi.encode(msg.value, minOut, recipient));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/StandardAdapter.sol:58:9\n   │\n58 │         manager.unlock(abi.encode(msg.value, minOut, recipient));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:67:62\n   │\n67 │         int256 delta = manager.swap(key(), SwapParams(true, -int256(input), 4295128740), \"\");\n   │                                                              ━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:68:27\n   │\n68 │         int128 ethDelta = int128(delta >> 128);\n   │                           ━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:69:22\n   │\n69 │         int128 out = int128(delta);\n   │                      ━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:70:30\n   │\n70 │         if (ethDelta >= 0 || uint256(-int256(ethDelta)) != input || out <= 0 || uint256(uint128(out)) < minimum) {\n   │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:70:81\n   │\n70 │         if (ethDelta >= 0 || uint256(-int256(ethDelta)) != input || out <= 0 || uint256(uint128(out)) < minimum) {\n   │                                                                                 ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:70:89\n   │\n70 │         if (ethDelta >= 0 || uint256(-int256(ethDelta)) != input || out <= 0 || uint256(uint128(out)) < minimum) {\n   │                                                                                         ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/StandardAdapter.sol:73:9\n   │\n73 │         manager.settle{value: input}();\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:74:49\n   │\n74 │         manager.take(address(token), recipient, uint256(uint128(out)));\n   │                                                 ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:74:57\n   │\n74 │         manager.take(address(token), recipient, uint256(uint128(out)));\n   │                                                         ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:75:27\n   │\n75 │         return abi.encode(uint256(uint128(out)));\n   │                           ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:75:35\n   │\n75 │         return abi.encode(uint256(uint128(out)));\n   │                                   ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:432:13\n    │\n432 │             RewardPool(pool()).recordInflow(paid);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:434:20\n    │\n434 │             paid = rewards().spend(p, nominal);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:437:9\n    │\n437 │         season().recordSpend(p, paid, kind == 0 || kind == 3 || kind == 4);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[missing-events-access-control]: `claims` is changed without an event but is used for access control\n   ╭▸ src/StarterClaim.sol:91:9\n   │\n91 │         claims[tokenId] = Claim(msg.sender, target, false);\n   │         ━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `entropyHash` is changed without an event but is used for access control\n    ╭▸ src/StarterClaim.sol:112:9\n    │\n112 │         entropyHash[tokenId] = h;\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:218:36\n    │\n218 │         uint256 age = born == 0 || block.timestamp < born ? 0 : block.timestamp - born;\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:219:13\n    │\n219 │         if (age >= 5 days) return 10;\n    │             ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:220:13\n    │\n220 │         if (age >= 3 days) return 9;\n    │             ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:221:13\n    │\n221 │         if (age >= 1 days) return 6;\n    │             ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-events-access-control]: `entropyCaptured` is changed without an event but is used for access control\n    ╭▸ src/StarterClaim.sol:113:9\n    │\n113 │         entropyCaptured[tokenId] = true;\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:228:13\n    │\n228 │         if (f.paidXpDay != block.timestamp / 1 days) return PAID_XP_PER_DAY;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:234:24\n    │\n234 │         uint64 today = uint64(block.timestamp / 1 days);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/StarterClaim.sol:47:9\n   │\n47 │         farm().register(msg.sender);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:261:53\n    │\n261 │         if (room == 1) return farms[p].born != 0 && block.timestamp >= farms[p].born + 3 days;\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StarterClaim.sol:35:13\n   │\n35 │         if (block.timestamp >= freeClaimEnds()) revert TooEarly();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/StarterClaim.sol:48:9\n   │\n48 │         emit StarterCommitted(id, msg.sender, ChainClock.number() + 2);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/StarterClaim.sol:49:9\n   │\n49 │         emit FreePackClaimed(msg.sender, index, id);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StarterClaim.sol:46:40\n   │\n46 │         claims[id] = Claim(msg.sender, uint64(ChainClock.number() + 2), false);\n   │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:289:9\n    │\n289 │         emit Registered(p, district(p));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:286:18\n    │\n286 │         f.born = uint64(block.timestamp);\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/StarterClaim.sol:92:9\n   │\n92 │         farm().register(msg.sender);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StarterClaim.sol:84:13\n   │\n84 │         if (block.timestamp < launchTime() + 48 hours || block.timestamp >= launchTime() + 16 days) revert TooEarly();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StarterClaim.sol:84:58\n   │\n84 │         if (block.timestamp < launchTime() + 48 hours || block.timestamp >= launchTime() + 16 days) revert TooEarly();\n   │                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/StarterClaim.sol:93:9\n   │\n93 │         emit StarterCommitted(tokenId, msg.sender, target);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:146:26\n    │\n146 │         return FarmItems(registry.module(3));\n    │                          ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:320:39\n    │\n320 │             FarmItems.Item memory x = items().data(f.active[i]);\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StarterClaim.sol:90:25\n   │\n90 │         uint64 target = uint64(ChainClock.number() + 2);\n   │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:313:25\n    │\n313 │         f.activeEpoch = uint64(e);\n    │                         ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:315:25\n    │\n315 │         f.activeBoost = uint16(_boost(p, rewards().epochTime(e)));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/StarterClaim.sol:114:9\n    │\n114 │         fees().payWork(keeper, Params.Key.EntropyBounty, 1, startGas - gasleft());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/StarterClaim.sol:130:20\n    │\n130 │         c.target = uint64(ChainClock.number() + 2);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/StarterClaim.sol:145:13\n    │\n145 │             items().mint(c.player, k, r, true);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/StarterClaim.sol:72:26\n   │\n72 │         return FarmItems(registry.module(3));\n   │                          ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/StarterClaim.sol:145:13\n    │\n145 │             items().mint(c.player, k, r, true);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/StarterClaim.sol:147:9\n    │\n147 │         emit StarterResolved(tokenId, h == bytes32(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:332:9\n    │\n332 │         rewards().recordSales(n);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:333:9\n    │\n333 │         season().recordSpend(p, ethValue, true);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/StarterClaim.sol:145:13\n    │\n145 │             items().mint(c.player, k, r, true);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:344:9\n    │\n344 │         rewards().setReferrer(msg.sender, inviter);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:262:13\n    │\n262 │             emit PriceObserved(now_, price);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:275:9\n    │\n275 │         emit PriceObserved(now_, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/V4Market.sol:269:38\n    │\n269 │             uint256 c = cumulative + (1e60 / lastPrice) * (minute * 60 - updatedAt);\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:145:27\n    │\n145 │         o.questionChain = uint32(policyWord);\n    │                           ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/V4Market.sol:272:23\n    │\n272 │         cumulative += (1e60 / lastPrice) * (now_ - updatedAt);\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:146:23\n    │\n146 │         o.fromBlock = uint48(policyWord >> 32);\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint48' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:147:21\n    │\n147 │         o.toBlock = uint48(policyWord >> 80);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint48' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:148:22\n    │\n148 │         o.maxPrice = uint96(policyWord >> 128);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:267:13\n    │\n267 │         if (last >= 32 && first < last - 31) first = last - 31;\n    │             ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:267:27\n    │\n267 │         if (last >= 32 && first < last - 31) first = last - 31;\n    │                           ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:268:38\n    │\n268 │         for (uint256 minute = first; minute <= last; ++minute) {\n    │                                      ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:153:26\n    │\n153 │         b.heartbeatBps = uint16(policyWord >> 224);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:270:53\n    │\n270 │             observations[minute % 32] = Observation(uint64(minute), c);\n    │                                                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/V4Market.sol:281:50\n    │\n281 │         if (ts >= updatedAt) return cumulative + (1e60 / lastPrice) * (ts - updatedAt);\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:288:35\n    │\n288 │         if (initializedAt == 0 || block.timestamp < initializedAt + 31 minutes) revert NotConfigured();\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:304:13\n    │\n304 │         if (a.period != p) {\n    │             ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:310:13\n    │\n310 │         if (b.period != p) {\n    │             ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-events-access-control]: `commits` is changed without an event but is used for access control\n    ╭▸ src/PackSale.sol:254:9\n    │\n254 │         c.seed = keccak256(abi.encode(h, address(this), id));\n    │         ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:306:24\n    │\n306 │             a.period = uint64(p);\n    │                        ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:373:9\n    │\n373 │         items().equip(msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:312:24\n    │\n312 │             b.period = uint64(p);\n    │                        ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:375:13\n    │\n375 │           if (rewards()\n    │ ┏━━━━━━━━━━━━━┛\n376 │ ┃                 .beginMining(\n377 │ ┃                     msg.sender,\n378 │ ┃                     engine().allocationHash(f.loadout, f.paid != 0) * (10000 + _boost(msg.sender, block.timestamp))\n379 │ ┃                         / 10000\n380 │ ┃                 )) {\n    │ ┗━━━━━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:315:24\n    │\n315 │             a.sells += uint192(amount);\n    │                        ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint192' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:316:24\n    │\n316 │             b.sells += uint192(amount);\n    │                        ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint192' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:318:23\n    │\n318 │             a.buys += uint192(amount);\n    │                       ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint192' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:319:23\n    │\n319 │             b.buys += uint192(amount);\n    │                       ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint192' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/PackSale.sol:62:16\n   │\n62 │         return block.timestamp < pausedUntil;\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:252:14\n    │\n252 │           id = ISwarmIntake(config.intake)\n    │ ┏━━━━━━━━━━━━━━┛\n253 │ ┃             .requestWithFailure(\n254 │ ┃                 config.action,\n255 │ ┃                 body,\n    ‡ ┃\n259 │ ┃                 price\n260 │ ┃             );\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/PackSale.sol:68:13\n   │\n68 │         if (block.timestamp < nextPauseAt) revert TooEarly();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/V4Market.sol:329:17\n    │\n329 │                 s += shortVolumes[i].sells;\n    │                 ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/V4Market.sol:330:17\n    │\n330 │                 b += shortVolumes[i].buys;\n    │                 ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:366:29\n    │\n366 │             if (old != 0 && items().data(old).kind == x.kind) revert InvalidValue();\n    │                             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:328:17\n    │\n328 │             if (uint256(shortVolumes[i].period) + 12 > current) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PackSale.sol:117:16\n    │\n117 │         return block.timestamp >= opensAt() && !paused();\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:385:9\n    │\n385 │         emit Placed(msg.sender, id, room, slot);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:246:20\n    │\n246 │                 || block.timestamp < s * _period(stream) + 1 hours\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/FarmCore.sol:366:63\n    │\n366 │             if (old != 0 && items().data(old).kind == x.kind) revert InvalidValue();\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/PackSale.sol:144:13\n    │\n144 │         p = Economy(registry.module(10)).averageDaily() * daysPrice / 1 ether;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:338:17\n    │\n338 │             if (uint256(longVolumes[i].period) + 24 > current) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:265:13\n    │\n265 │         if (deadline > end) deadline = end;\n    │             ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PackSale.sol:130:27\n    │\n130 │         uint256 elapsed = block.timestamp > opensAt() ? block.timestamp - opensAt() : 0;\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:267:9\n    │\n267 │         emit BackupAsked(stream, s, id, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:132:24\n    │\n132 │         int256 ahead = int256(sales * 1 ether) - int256(elapsed * target * 1 ether / 1 hours);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:132:50\n    │\n132 │         int256 ahead = int256(sales * 1 ether) - int256(elapsed * target * 1 ether / 1 hours);\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:266:31\n    │\n266 │         pending[id] = Pending(uint64(s), uint64(deadline), stream + 1);\n    │                               ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:266:42\n    │\n266 │         pending[id] = Pending(uint64(s), uint64(deadline), stream + 1);\n    │                                          ━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:135:30\n    │\n135 │             exponent = wadLn(int256(1 ether + params().get(Params.Key.PriceStepBps) * 1e14)) * ahead / 1 ether;\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/V4Market.sol:394:13\n    │\n394 │         if (average != 0 && price > average) dev = Math.min(1000, 10000 - Math.mulDiv(average, 10000, price));\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:137:30\n    │\n137 │             exponent = wadLn(int256(1 ether - decay * 1e14)) * (-ahead) / int256(target) / 1 ether;\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:137:75\n    │\n137 │             exponent = wadLn(int256(1 ether - decay * 1e14)) * (-ahead) / int256(target) / 1 ether;\n    │                                                                           ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:393:13\n    │\n393 │         if (block.timestamp >= initializedAt + 31 minutes) average = twap();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:399:27\n    │\n399 │         uint256 decayed = storedFeeWad > fall ? storedFeeWad - fall : PROJECT_BPS * 1 ether;\n    │                           ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:141:37\n    │\n141 │         uint256 daysPrice = start * uint256(wadExp(exponent)) / 1 ether;\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:395:9\n    │\n395 │         items().unequip(msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:111:28\n    │\n111 │         return ILaunchHook(registry.market()).initializedAt() == 0\n    │                            ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:111:16\n    │\n111 │         return ILaunchHook(registry.market()).initializedAt() == 0\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:113:27\n    │\n113 │             : ILaunchHook(registry.market()).initializedAt() + OPEN_DELAY;\n    │                           ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:113:15\n    │\n113 │             : ILaunchHook(registry.market()).initializedAt() + OPEN_DELAY;\n    │               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:91:23\n   │\n91 │         return Params(registry.params());\n   │                       ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:135:47\n    │\n135 │             exponent = wadLn(int256(1 ether + params().get(Params.Key.PriceStepBps) * 1e14)) * ahead / 1 ether;\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:397:9\n    │\n397 │         emit Unplaced(msg.sender, id, room, slot);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:144:21\n    │\n144 │         p = Economy(registry.module(10)).averageDaily() * daysPrice / 1 ether;\n    │                     ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:144:13\n    │\n144 │         p = Economy(registry.module(10)).averageDaily() * daysPrice / 1 ether;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:52:33\n   │\n52 │         uint256 daily = Economy(registry.module(10)).averageDaily();\n   │                                 ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:52:25\n   │\n52 │         uint256 daily = Economy(registry.module(10)).averageDaily();\n   │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PackSale.sol:47:9\n   │\n47 │         revert InvalidValue();\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:420:13\n    │\n420 │             emit LaunchTax(sender, ethIn, taxBps, fee);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:413:25\n    │\n413 │         uint256 ethIn = uint256(-p.amountSpecified);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:416:19\n    │\n416 │         if (fee > uint256(uint128(type(int128).max))) revert InvalidValue();\n    │                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:416:27\n    │\n416 │         if (fee > uint256(uint128(type(int128).max))) revert InvalidValue();\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:425:43\n    │\n425 │         return (this.beforeSwap.selector, int256(fee << 128), 0);\n    │                                           ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:414:9\n    │\n414 │         emit Retired(p);\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/FarmCore.sol:405:56\n    │\n405 │             if (f.loadout[i] != 0 || f.active[i] != 0) revert InvalidValue();\n    │                                                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[arbitrary-send-erc20]: `transferFrom` uses an arbitrary `from`; require it to equal `msg.sender` or `address(this)`\n    ╭▸ src/FarmCore.sol:430:13\n    │\n430 │             token().safeTransferFrom(p, pool(), paid);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-erc20\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FarmCore.sol:431:17\n    │\n431 │             if (token().balanceOf(pool()) - before_ != paid) revert InvalidValue();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:313:13\n    │\n313 │             a.expiresAt < block.timestamp || uint256(a.issuedAt) + (stream == 0 ? 6 hours : 1 days) < block.timestamp\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:313:46\n    │\n313 │             a.expiresAt < block.timestamp || uint256(a.issuedAt) + (stream == 0 ? 6 hours : 1 days) < block.timestamp\n    │                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:314:31\n    │\n314 │                 || (direct && block.timestamp >= p.deadline)\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:330:13\n    │\n330 │             emit AnswerIgnored(a.requestId, 2);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:334:13\n    │\n334 │             emit AnswerIgnored(a.requestId, 2);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:348:9\n    │\n348 │         emit AnswerStored(stream, a.requestId, s, a.answer);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:346:59\n    │\n346 │             keccak256(a.answer), a.requestId, a.issuedAt, uint64(until), uint64(s), true, uint48(ChainClock.number())\n    │                                                           ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:346:74\n    │\n346 │             keccak256(a.answer), a.requestId, a.issuedAt, uint64(until), uint64(s), true, uint48(ChainClock.number())\n    │                                                                          ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:346:91\n    │\n346 │             keccak256(a.answer), a.requestId, a.issuedAt, uint64(until), uint64(s), true, uint48(ChainClock.number())\n    │                                                                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint48' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:447:9\n    │\n447 │         items().maintain(id, 10000, x.overclock);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:454:9\n    │\n454 │         emit SellFee(sender, output, bps, hour, day, dev);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:436:27\n    │\n436 │         int128 ethDelta = int128(delta >> 128);\n    │                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:439:28\n    │\n439 │             _record(false, uint256(-int256(ethDelta)));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:443:26\n    │\n443 │         uint256 output = uint256(uint128(ethDelta));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:443:34\n    │\n443 │         uint256 output = uint256(uint128(ethDelta));\n    │                                  ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:445:42\n    │\n445 │         return (this.afterSwap.selector, int128(int256(_chargeSell(sender, output, price))));\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:445:49\n    │\n445 │         return (this.afterSwap.selector, int128(int256(_chargeSell(sender, output, price))));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:456:32\n    │\n456 │         f.cableRepairedEpoch = uint64(rewards().epoch());\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:457:29\n    │\n457 │         f.routerRepairBps = uint16((rewards().epochEnd() - block.timestamp) * 10000 / 6 hours);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:470:9\n    │\n470 │         items().expand(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:365:37\n    │\n365 │         if (p.streamPlusOne == 0 || block.timestamp < p.deadline) revert TooEarly();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:367:35\n    │\n367 │         emit OracleFailure(id, 0, bytes32(\"timeout\"));\n    │                                   ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:492:13\n    │\n492 │             rewards().spendTo(p, amount, router);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:494:9\n    │\n494 │         FeeRouter(payable(router)).routeTokens(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:480:9\n    │\n480 │         rewards().recordSales(1);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:481:9\n    │\n481 │         season().recordSpend(msg.sender, price, true);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:482:14\n    │\n482 │         id = ITokenPacks(packs()).tokenPack(msg.sender);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FarmCore.sol:490:17\n    │\n490 │             if (token().balanceOf(router) - before_ != amount) revert InvalidValue();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:492:13\n    │\n492 │             rewards().spendTo(p, amount, router);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:494:9\n    │\n494 │         FeeRouter(payable(router)).routeTokens(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:501:9\n    │\n501 │         season().recordSpend(msg.sender, amount, true);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:502:9\n    │\n502 │         grid().tokenLobby(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:513:9\n    │\n513 │         items().destroy(id);\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:514:26\n    │\n514 │         uint256 earned = rewards().scrap(msg.sender, hash, minimum);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmCore.sol:512:24\n    │\n512 │         uint256 hash = ItemMath.baseHash(x.rarity) * (x.kind < 3 ? 10000 : 6000) / 10000 * x.durability / 10000;\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:515:9\n    │\n515 │         emit Scrapped(msg.sender, id, earned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmCore.sol:535:14\n    │\n535 │         if (!occupied) return (0, 0, 0);\n    │              ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:546:28\n    │\n546 │             if (id != 0 && items().data(id).holder == address(0)) _remove(f, id);\n    │                            ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:578:14\n    │\n578 │         id = items().mintDrop(msg.sender, seed);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:405:13\n    │\n405 │             grid.submitPlan(e, GridOperator.Kind(kind), severity, v[5], notice);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:421:13\n    │\n421 │             params.set(k, target, notice);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:426:47\n    │\n426 │             if (civic.noticeAt(feature) == 0) civic.announce(feature, notice);\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:430:13\n    │\n430 │             enhancement.announceCap(enhancement.cap() == 8 ? 12 : 16, notice);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:434:17\n    │\n434 │               try civic.grantDistrictBoost(\n    │ ┏━━━━━━━━━━━━━━━━━┛\n435 │ ┃                 _clamp(uint256(v[11]) >> 128, 1, 8) - 1,\n436 │ ┃                 uint16(_clamp(uint256(v[11]) & type(uint128).max, 0, 1500)),\n437 │ ┃                 notice\n438 │ ┃             ) {}\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:445:13\n    │\n445 │             packs.unpause();\n    │             ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:447:17\n    │\n447 │             try packs.pause(_clamp(uint256(v[12]) - 1, 1, 72 hours)) {}\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:453:17\n    │\n453 │               try civic.startWar(\n    │ ┏━━━━━━━━━━━━━━━━━┛\n454 │ ┃                 uint8(_clamp(uint256(v[13]) >> 128, 1, 8) - 1),\n455 │ ┃                 uint8(_clamp(uint256(v[13]) & type(uint128).max, 1, 8) - 1)\n456 │ ┃             ) {}\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:463:17\n    │\n463 │             try civic.startCollapse(_clamp(uint256(v[14]), daily, daily * 100)) {}\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:469:17\n    │\n469 │               try civic.listLot(\n    │ ┏━━━━━━━━━━━━━━━━━┛\n470 │ ┃                 uint8(_clamp(uint256(v[15]) >> 16, 1, 12) - 1),\n471 │ ┃                 uint8(_clamp((uint256(v[15]) >> 8) & 255, 1, 3)),\n472 │ ┃                 uint8(_clamp(uint256(v[15]) & 255, 1, 3))\n473 │ ┃             ) {}\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:375:13\n    │\n375 │         if (block.timestamp >= r.validUntil || r.slot != slot(stream)) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:385:9\n    │\n385 │         emit Executed(stream, r.requestId, letter);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:404:33\n    │\n404 │             if (e <= current || grid.planAt(e).submitted) continue;\n    │                                 ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:405:13\n    │\n405 │             grid.submitPlan(e, GridOperator.Kind(kind), severity, v[5], notice);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:398:22\n    │\n398 │         uint8 kind = uint8(_clamp(uint256(v[2]), 0, maxKind));\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:400:27\n    │\n400 │         uint16 severity = uint16(_clamp(uint256(v[3]), SEVERITY_MIN, SEVERITY_MAX));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:401:24\n    │\n401 │         districtHint = uint8(_clamp(uint256(v[4]), 0, 7)); // Advisory only; preserve weighted district/entropy rules.\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-arithmetic]: `otherInflow` is changed without an event but is used in arithmetic\n   ╭▸ src/RewardPool.sol:75:23\n   │\n75 │         if (!endowed) otherInflow += amount;\n   │                       ━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:63:39\n   │\n63 │             FarmItems.Item memory x = inventory.data(id);\n   │                                       ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:420:34\n    │\n420 │             if (target == old || block.timestamp < params.lastChanged(k) + 1 days) continue;\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:417:27\n    │\n417 │             uint256 old = params.get(k);\n    │                           ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:418:40\n    │\n418 │             (uint256 lo, uint256 hi) = params.bounds(k);\n    │                                        ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:420:52\n    │\n420 │             if (target == old || block.timestamp < params.lastChanged(k) + 1 days) continue;\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:421:13\n    │\n421 │             params.set(k, target, notice);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:95:45\n   │\n95 │         FarmItems.Item memory x = FarmItems(registry.module(3)).data(id);\n   │                                             ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:95:35\n   │\n95 │         FarmItems.Item memory x = FarmItems(registry.module(3)).data(id);\n   │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:87:45\n   │\n87 │         FarmItems.Item memory x = FarmItems(registry.module(3)).data(id);\n   │                                             ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:87:35\n   │\n87 │         FarmItems.Item memory x = FarmItems(registry.module(3)).data(id);\n   │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:440:17\n    │\n440 │                 emit ActionSkipped(0, reason);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:449:17\n    │\n449 │                 emit ActionSkipped(1, reason);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:458:17\n    │\n458 │                 emit ActionSkipped(2, reason);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:465:17\n    │\n465 │                 emit ActionSkipped(3, reason);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:475:17\n    │\n475 │                 emit ActionSkipped(4, reason);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:52:30\n   │\n52 │         return IYieldRewards(registry.module(1));\n   │                              ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:91:64\n   │\n91 │         return Math.mulDiv(hash * 4, Math.max(HASH_RATE_FLOOR, rewards().lastYieldPerHash()), 1 ether);\n   │                                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:436:17\n    │\n436 │                 uint16(_clamp(uint256(v[11]) & type(uint128).max, 0, 1500)),\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:99:30\n   │\n99 │             missing * Params(registry.params()).get(Params.Key.RepairHours),\n   │                              ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:99:23\n   │\n99 │             missing * Params(registry.params()).get(Params.Key.RepairHours),\n   │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/RewardPool.sol:51:33\n   │\n51 │         if (endowment() == 0 || block.timestamp >= dripStart + dripPeriod) return 0;\n   │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:66:17\n   │\n66 │             if (reward.pending(p) < cost) continue;\n   │                 ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:67:21\n   │\n67 │             paid += reward.spend(p, cost);\n   │                     ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:68:13\n   │\n68 │             inventory.maintain(id, 10000, x.overclock);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:454:17\n    │\n454 │                 uint8(_clamp(uint256(v[13]) >> 128, 1, 8) - 1),\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/Economy.sol:88:37\n   │\n88 │         if (x.holder == address(0)) revert InvalidValue();\n   │                                     ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n  ╭▸ src/lib/ItemMath.sol:8:25\n  │\n8 │         if (rarity > 4) revert InvalidValue();\n  │                         ━━━━━━━━━━━━━━━━━━━━━━\n  │\n  ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/lib/EconomyMath.sol:19:39\n   │\n19 │         if (level == 0 || level > 16) revert InvalidValue();\n   │                                       ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:455:17\n    │\n455 │                 uint8(_clamp(uint256(v[13]) & type(uint128).max, 1, 8) - 1)\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:470:17\n    │\n470 │                 uint8(_clamp(uint256(v[15]) >> 16, 1, 12) - 1),\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:471:17\n    │\n471 │                 uint8(_clamp((uint256(v[15]) >> 8) & 255, 1, 3)),\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:472:17\n    │\n472 │                 uint8(_clamp(uint256(v[15]) & 255, 1, 3))\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Economy.sol:77:27\n   │\n77 │         if (start == 0 || start > block.timestamp) revert NotConfigured();\n   │                           ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/RewardPool.sol:91:13\n   │\n91 │         if (token().balanceOf(address(this)) - before_ != amount) revert InvalidValue();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n   ╭▸ src/Economy.sol:90:16\n   │\n90 │         hash = hash * (10000 + EconomyMath.bonus(x.overclock)) / 10000;\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n   ╭▸ src/Economy.sol:91:28\n   │\n91 │         return Math.mulDiv(hash * 4, Math.max(HASH_RATE_FLOOR, rewards().lastYieldPerHash()), 1 ether);\n   │                            ━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/RewardPool.sol:99:9\n   │\n99 │         emit Reserved(amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/RewardPool.sol:107:67\n    │\n107 │     function pay(address to, uint256 amount) external onlyRewards nonReentrant {\n    │                                                                   ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[boolean-cst]: misuse of a boolean constant\n   ╭▸ src/Enhancement.sol:55:63\n   │\n55 │             (cap == 8 ? next != 12 : cap == 12 ? next != 16 : true) || announcedCap != 0 || bytes(letter).length == 0\n   │                                                               ━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/boolean-cst\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/V4Market.sol:472:31\n    │\n472 │         received = abi.decode(manager.unlock(abi.encode(msg.value, minOut, recipient)), (uint256));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Economy.sol:136:9\n    │\n136 │         IEconomyCore(registry.module(2)).syncFor(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Economy.sol:149:9\n    │\n149 │         IEconomyCore(registry.module(2)).syncFor(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Economy.sol:150:9\n    │\n150 │         emit Locked(msg.sender, amount, block.timestamp + days_ * 1 days, bps);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Enhancement.sol:66:34\n   │\n66 │         if (announcedCap == 0 || block.timestamp < activationAt) revert TooEarly();\n   │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Economy.sol:140:42\n    │\n140 │         locks[msg.sender] = Lock(amount, uint64(block.timestamp), uint64(block.timestamp + days_ * 1 days), uint16(bps));\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Economy.sol:140:67\n    │\n140 │         locks[msg.sender] = Lock(amount, uint64(block.timestamp), uint64(block.timestamp + days_ * 1 days), uint16(bps));\n    │                                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `pending` is updated\n   ╭▸ src/Enhancement.sol:85:9\n   │\n85 │         core.prepareEnhancement(msg.sender, item, cost, wallet);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Economy.sol:140:109\n    │\n140 │         locks[msg.sender] = Lock(amount, uint64(block.timestamp), uint64(block.timestamp + days_ * 1 days), uint16(bps));\n    │                                                                                                             ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/FarmEngine.sol:61:30\n   │\n61 │             (, uint256 hi) = params().bounds(k);\n   │                              ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/Enhancement.sol:89:9\n   │\n89 │         emit EnhancementCommitted(id, msg.sender, item, target, ChainClock.number() + 2, cost);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Economy.sol:148:13\n    │\n148 │         if (t.balanceOf(address(this)) - before_ != amount) revert InvalidValue();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:40:26\n   │\n40 │         return FarmItems(registry.module(3));\n   │                          ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:74:27\n   │\n74 │             f.clocks[i] = items().data(ids[i]).overclock;\n   │                           ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/Enhancement.sol:88:50\n   │\n88 │         attempts[id] = Attempt(msg.sender, item, uint64(ChainClock.number() + 2), target, bytes32(0), false, false);\n   │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:126:39\n    │\n126 │             FarmItems.Item memory x = items().data(id);\n    │                                       ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:160:35\n    │\n160 │         FarmItems.Item memory x = items().data(id);\n    │                                   ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `locks` is updated\n    ╭▸ src/Economy.sol:156:9\n    │\n156 │         IEconomyCore(registry.module(2)).syncFor(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:44:23\n   │\n44 │         return Params(registry.params());\n   │                       ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:61:30\n   │\n61 │             (, uint256 hi) = params().bounds(k);\n   │                              ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:48:25\n   │\n48 │         return IRewards(registry.module(1));\n   │                         ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Enhancement.sol:100:24\n    │\n100 │             a.target = uint64(ChainClock.number() + 2);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:64:25\n   │\n64 │         return active ? rewards().epochParam(e, uint256(k)) : params().get(k);\n   │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:64:63\n   │\n64 │         return active ? rewards().epochParam(e, uint256(k)) : params().get(k);\n   │                                                               ━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Economy.sol:167:9\n    │\n167 │         IEconomyCore(registry.module(2)).syncFor(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/FarmEngine.sol:121:24\n    │\n121 │         if (room >= 4) revert InvalidValue();\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Enhancement.sol:122:21\n    │\n122 │         if (burned) inventory.destroy(a.item);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Enhancement.sol:123:14\n    │\n123 │         else inventory.maintain(a.item, x.durability, level);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:88:39\n   │\n88 │             FarmItems.Item memory x = items().data(ids[i]);\n   │                                       ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Economy.sol:155:30\n    │\n155 │         if (l.amount == 0 || block.timestamp < l.end) revert TooEarly();\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Economy.sol:169:9\n    │\n169 │         emit Unlocked(msg.sender, l.amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Enhancement.sol:124:9\n    │\n124 │         emit EnhancementResolved(id, success, burned, level);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Economy.sol:180:23\n    │\n180 │         previous[p] = prev;\n    │                       ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Economy.sol:191:25\n    │\n191 │         for (uint256 i; i < 10 && p != address(0); ++i) {\n    │                         ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmEngine.sol:168:29\n    │\n168 │         a.baseProductive += raw * tier / 10000;\n    │                             ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmEngine.sol:169:15\n    │\n169 │         raw = raw * (10000 + EconomyMath.bonus(f.clocks[idx])) / 10000;\n    │               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmEngine.sol:171:25\n    │\n171 │         s.productive += raw * tier / 10000;\n    │                         ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:202:32\n    │\n202 │             if (f.ids[i] != 0) occupied++;\n    │                                ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FeeRouter.sol:162:9\n    │\n162 │         RewardPool(rewardPool()).recordInflow(reward);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:163:9\n    │\n163 │         emit TokensRouted(reward, t, h);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/FeeRouter.sol:171:9\n    │\n171 │         market().buy{value: msg.value}(minOut, recipient);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FeeRouter.sol:171:9\n    │\n171 │         market().buy{value: msg.value}(minOut, recipient);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `heartbeatTokens` is updated\n    ╭▸ src/FeeRouter.sol:189:13\n    │\n189 │             RewardPool(rewardPool()).recordInflow(excess);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-balance]: external call can be reentered before a stale contract balance is checked\n    ╭▸ src/FeeRouter.sol:204:9\n    │\n204 │         m.sell(amount, minOut, address(this));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-balance\n\nwarning[reentrancy-no-eth]: external call can be reentered before `heartbeatBalance` is updated\n    ╭▸ src/FeeRouter.sol:204:9\n    │\n204 │         m.sell(amount, minOut, address(this));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FeeRouter.sol:209:22\n    │\n209 │         uint256 hb = received * h / amount;\n    │                      ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FeeRouter.sol:184:30\n    │\n184 │         if (lastSell != 0 && block.timestamp < lastSell + 5 minutes) revert TooEarly();\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:214:9\n    │\n214 │         emit TokensSold(amount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FeeRouter.sol:204:9\n    │\n204 │         m.sell(amount, minOut, address(this));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/FeeRouter.sol:226:9\n    │\n226 │         market().buy{value: amount}(minOut, season());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FeeRouter.sol:229:9\n    │\n229 │         IPotSeason(season()).depositPot(received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FeeRouter.sol:219:29\n    │\n219 │         if (lastBuy != 0 && block.timestamp < lastBuy + 5 minutes) revert TooEarly();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:230:9\n    │\n230 │         emit PotBought(amount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FeeRouter.sol:226:9\n    │\n226 │         market().buy{value: amount}(minOut, season());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/PackSale.sol:182:28\n    │\n182 │         uint256 received = fees().zapBuy{value: msg.value}(minTokens, address(this));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/FeeRouter.sol:271:22\n    │\n271 │         (bool ok,) = msg.sender.call{value: a}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:273:9\n    │\n273 │         emit Withdrawn(msg.sender, a);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/FeeRouter.sol:292:9\n    │\n292 │         market().buy{value: ethAmount}(minOut, rewardPool());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FeeRouter.sol:295:50\n    │\n295 │         if (!RewardPool(rewardPool()).endowed()) RewardPool(rewardPool()).recordInflow(received);\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FeeRouter.sol:283:29\n    │\n283 │         if (lastBuy != 0 && block.timestamp < lastBuy + MIN_BUY_INTERVAL) revert TooEarly();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:299:9\n    │\n299 │         emit WorkBounty(msg.sender, Params.Key.BuyBounty, ethAmount, paid);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:300:9\n    │\n300 │         emit Bought(ethAmount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FeeRouter.sol:292:9\n    │\n292 │         market().buy{value: ethAmount}(minOut, rewardPool());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/V4Market.sol:498:31\n    │\n498 │         received = abi.decode(manager.unlock(abi.encode(amount, minOut, recipient)), (uint256));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/V4Market.sol:522:22\n    │\n522 │         (bool ok,) = recipient.call{value: net}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:506:39\n    │\n506 │             key(), SwapParams(false, -int256(amount), 1461446703485210103287273052203988822378723970341), \"\"\n    │                                       ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:509:25\n    │\n509 │         int128 ethOut = int128(delta >> 128);\n    │                         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:510:26\n    │\n510 │         int128 tokenIn = int128(delta);\n    │                          ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:511:44\n    │\n511 │         if (ethOut <= 0 || tokenIn >= 0 || uint256(-int256(tokenIn)) != amount) revert InsufficientBalance();\n    │                                            ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:512:25\n    │\n512 │         uint256 gross = uint256(uint128(ethOut));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:512:33\n    │\n512 │         uint256 gross = uint256(uint128(ethOut));\n    │                                 ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/V4Market.sol:518:9\n    │\n518 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `updatedAt` is updated\n    ╭▸ src/V4Market.sol:505:24\n    │\n505 │           int256 delta = manager.swap(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━━━━┛\n506 │ ┃             key(), SwapParams(false, -int256(amount), 1461446703485210103287273052203988822378723970341), \"\"\n507 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:199:9\n    │\n199 │         farm().register(recipient);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:200:9\n    │\n200 │         farm().paidPackBought(recipient, n, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:207:9\n    │\n207 │         fees().routeTokens(cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `updatedAt` is updated\n    ╭▸ src/V4Market.sol:535:24\n    │\n535 │         int256 delta = manager.swap(key(), SwapParams(true, -int256(input), 4295128740), \"\");\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:239:39\n    │\n239 │             FarmItems.Item memory x = items().data(id);\n    │                                       ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:535:62\n    │\n535 │         int256 delta = manager.swap(key(), SwapParams(true, -int256(input), 4295128740), \"\");\n    │                                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:537:27\n    │\n537 │         int128 ethDelta = int128(delta >> 128);\n    │                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:538:29\n    │\n538 │         int128 tokenDelta = int128(delta);\n    │                             ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:540:30\n    │\n540 │             ethDelta >= 0 || uint256(-int256(ethDelta)) != input || tokenDelta <= 0\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:541:20\n    │\n541 │                 || uint256(uint128(tokenDelta)) < minOut\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:244:21\n    │\n244 │                     items().destroy(id);\n    │                     ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:259:13\n    │\n259 │             items().maintain(id, uint16(x.durability > damage ? x.durability - damage : 0), x.overclock);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:541:28\n    │\n541 │                 || uint256(uint128(tokenDelta)) < minOut\n    │                            ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:295:39\n    │\n295 │             FarmItems.Item memory x = items().data(id);\n    │                                       ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:296:13\n    │\n296 │             items().maintain(id, x.durability > 100 ? x.durability - 100 : 0, x.overclock);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/V4Market.sol:546:9\n    │\n546 │         manager.settle{value: input}();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:547:40\n    │\n547 │         manager.take(token, recipient, uint256(uint128(tokenDelta)));\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:547:48\n    │\n547 │         manager.take(token, recipient, uint256(uint128(tokenDelta)));\n    │                                                ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:549:27\n    │\n549 │         return abi.encode(uint256(uint128(tokenDelta)));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:549:35\n    │\n549 │         return abi.encode(uint256(uint128(tokenDelta)));\n    │                                   ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PackSale.sol:234:9\n    │\n234 │         emit PackCommitted(id, p, n, target, guaranteed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmEngine.sol:221:32\n    │\n221 │                 f.theftUntil = uint64(e + 2);\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/PackSale.sol:206:13\n    │\n206 │         if (t.balanceOf(address(fees())) - before_ != cost) revert InvalidValue();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:252:17\n    │\n252 │                 damage += 3000 * uint256(ev.severity) / 10000 / (before_.airflow ? 2 : 1);\n    │                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PackSale.sol:212:25\n    │\n212 │         if (paused() || block.timestamp < opensAt()) revert TooEarly();\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmEngine.sol:258:29\n    │\n258 │             f.health[idx] = uint16(f.health[idx] > damage ? f.health[idx] - damage : 0);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmEngine.sol:259:34\n    │\n259 │             items().maintain(id, uint16(x.durability > damage ? x.durability - damage : 0), x.overclock);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:232:25\n    │\n232 │         uint64 target = uint64(ChainClock.number() + 2);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:256:9\n    │\n256 │         fees().payWork(keeper, Params.Key.EntropyBounty, 1, startGas - gasleft());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:270:20\n    │\n270 │         c.target = uint64(ChainClock.number() + 2);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:289:13\n    │\n289 │             items().mint(c.player, k, r, c.guaranteed);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:87:26\n   │\n87 │         return FarmItems(registry.module(3));\n   │                          ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:289:13\n    │\n289 │             items().mint(c.player, k, r, c.guaranteed);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PackSale.sol:291:9\n    │\n291 │         emit PackOpened(id, n, c.expired);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/PackSale.sol:289:13\n    │\n289 │             items().mint(c.player, k, r, c.guaranteed);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/EconomyV35.t.sol:152:43\n    │\n152 │         assertEq(d.economy.boostAt(alice, block.timestamp), 500);\n    │                                           ━━━━━━━━━━━━━━━\n    ‡\n156 │         vm.warp(block.timestamp + 7 days);\n    │         ───────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/EconomyV35.t.sol:156:17\n    │\n156 │         vm.warp(block.timestamp + 7 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/PhasedReleaseV36.t.sol:145:49\n    │\n145 │         assertEq(d.civic.noticeAt(ENHANCEMENT), block.timestamp + 48 hours);\n    │                                                 ━━━━━━━━━━━━━━━\n146 │         vm.warp(block.timestamp + 48 hours - 1);\n    │         ─────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/PhasedReleaseV36.t.sol:146:17\n    │\n146 │         vm.warp(block.timestamp + 48 hours - 1);\n    │         ────────━━━━━━━━━━━━━━━──────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:210:17\n    │\n210 │         vm.warp(block.timestamp + 1 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:67:29\n    │\n 67 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    ‡\n227 │         vm.warp(d.civic.noticeAt(3));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:68:30\n    │\n 68 │         a.expiresAt = uint64(block.timestamp + 6 hours);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n227 │         vm.warp(d.civic.noticeAt(3));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:220:39\n    │\n220 │         assertEq(d.civic.noticeAt(3), block.timestamp + 48 hours);\n    │                                       ━━━━━━━━━━━━━━━\n    ‡\n227 │         vm.warp(d.civic.noticeAt(3));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:283:17\n    │\n283 │         vm.warp(block.timestamp + 6 hours);\n    │         ────────━━━━━━━━━━━━━━━─────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:67:29\n    │\n 67 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    ‡\n336 │         vm.warp(block.timestamp + 6 hours);\n    │         ────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:68:30\n    │\n 68 │         a.expiresAt = uint64(block.timestamp + 6 hours);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n336 │         vm.warp(block.timestamp + 6 hours);\n    │         ────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:336:17\n    │\n336 │         vm.warp(block.timestamp + 6 hours);\n    │         ────────━━━━━━━━━━━━━━━─────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:582:17\n    │\n582 │         vm.warp(block.timestamp + 2 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/V34.t.sol:149:25\n    │\n149 │         uint256 start = block.timestamp;\n    │                         ━━━━━━━━━━━━━━━\n    ‡\n152 │         vm.warp(start + 60 minutes - 1);\n    │         ─────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/V34.t.sol:230:17\n    │\n230 │         vm.warp(block.timestamp + 5 minutes - 1);\n    │         ────────━━━━━━━━━━━━━━━───────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/V34.t.sol:233:17\n    │\n233 │         vm.warp(block.timestamp + 1);\n    │         ────────━━━━━━━━━━━━━━━───── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":31558,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/Clock.t.sol:ClockTest\n[PASS] testLocalEvmFutureBlockAnd256BlockBoundary() (gas: 220367)\n[PASS] testRobinhoodUsesArbSysNotL1EstimateAndHandlesExpiry() (gas: 233856)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 344.80µs (213.44µs CPU time)\n\nRan 1 test for test/YieldFloorReviewV35.t.sol:IndependentYieldFloorReview\n[PASS] testFirstEpochItemQuotesKeepNonzeroFloorAtCorrectScale() (gas: 683745)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 705.84µs (603.85µs CPU time)\n\nRan 1 test for test/WarReviewV35.t.sol:IndependentWarReview\n[PASS] testWarWinnerCannotChangeAfterDeadline() (gas: 5455469)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.10ms (932.01µs CPU time)\n\nRan 4 tests for test/OracleConformanceV37.t.sol:OracleConformanceV37Test\n[PASS] testAcceptsOriginalProtocolSignature() (gas: 17497)\n[PASS] testDigestMatchesUnmodifiedProtocolVector() (gas: 12987)\n[PASS] testFreshVectorSignerSignature() (gas: 26896)\n[PASS] testSelectorsExactlyMatchLiveProtocol() (gas: 3935)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.29ms (585.71µs CPU time)\n\nRan 2 tests for test/Factory.t.sol:FactoryTest\n[PASS] testFactoryInvalidSearchRange() (gas: 5210)\n[PASS] testHookFactoryFlagsImmutableConfigAndIdempotence() (gas: 4314311)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.57ms (1.75ms CPU time)\n\nRan 5 tests for test/KeeperProfit.t.sol:KeeperProfitTest\n[PASS] testPaidPackEntropyKeeperProfit() (gas: 1178926)\nLogs:\n  paid pack entropy execution gas: 139044\n  paid pack entropy bounty wei: 3373225000000\n  paid pack entropy execution plus 21000 gas cost wei: 3200880000000\n\n[PASS] testPlanEntropyKeeperProfit() (gas: 1685875)\nLogs:\n  plan entropy execution gas: 162905\n  plan entropy bounty wei: 4478175000000\n  plan entropy execution plus 21000 gas cost wei: 3678100000000\n\n[PASS] testSeasonFinalizeThreeWinnersAndPrizeKeeperProfit() (gas: 3435599)\nLogs:\n  season finalize three winners and prize execution gas: 624501\n  season finalize three winners and prize bounty wei: 15356100000000\n  season finalize three winners and prize execution plus 21000 gas cost wei: 12910020000000\n\n[PASS] testSeasonPrepareIsConstantUnpaidWork() (gas: 1344772)\n[PASS] testStarterEntropyKeeperProfit() (gas: 325838)\nLogs:\n  starter entropy execution gas: 141904\n  starter entropy bounty wei: 3371200000000\n  starter entropy execution plus 21000 gas cost wei: 3258080000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 15.77ms (7.61ms CPU time)\n\nRan 2 tests for test/GridV35.t.sol:GridV35Test\n[PASS] testGreenAndCheapBothFavorTheStableDistrict() (gas: 4152333)\n[PASS] testReservedEventsHaveZeroLaunchWeightAndPlanOnlyWhenEnabled() (gas: 640925)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 16.88ms (9.23ms CPU time)\n\nRan 5 tests for test/EndowmentEscrowV38.t.sol:EndowmentEscrowV38Test\n[PASS] testConstructorRejectsMissingInputs() (gas: 6401)\n[PASS] testForwardRejectsBadProofs() (gas: 2577834)\n[PASS] testForwardRequiresBalance() (gas: 734056)\n[PASS] testForwardSendsWholeBalanceOnceToAuthenticatedPoolAndFundsEndowment() (gas: 1666969)\n[PASS] testForwardWithRealEndowmentActivatesDrip() (gas: 11308085)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 17.51ms (6.78ms CPU time)\n\nRan 3 tests for test/StandardAdapter.t.sol:StandardAdapterTest\n[PASS] testExistingHookKeyPreservedAndNoExtraFee() (gas: 324552)\n[PASS] testRequiresThirtyMinutesFreshOracleAndAuthorizedCallback() (gas: 194045)\n[PASS] testSettlementSlippageFailurePreservesCredits() (gas: 239739)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 20.63ms (1.50ms CPU time)\n\nRan 7 tests for test/V33.t.sol:LaunchProtectionTest\n[PASS] testBuyTaxHasImmutableSteps() (gas: 94024)\n[PASS] testLaunchTaxChargedAndRoutedEntirelyToPool() (gas: 224558)\n[PASS] testNoBuySizeLimitAtAnyLaunchStep() (gas: 1680826)\n[PASS] testNormalBuyAfterDecayHasNoLaunchTax() (gas: 1472578)\n[PASS] testSellsPayNormalFeeDuringLaunch() (gas: 332929)\n[PASS] testSnipersSplittingBuysStillPayTheCurve() (gas: 643993)\n[PASS] testViewsBeforeInitialization() (gas: 4409567)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 24.14ms (3.37ms CPU time)\n\nRan 2 tests for test/AutoRepairReviewV35.t.sol:IndependentAutoRepairReview\n[PASS] testAutomaticRepairRecordsHistoricalWeekBeforeCompletion() (gas: 5385136)\n[PASS] testLateAutomaticRepairCannotReopenSeasonEligibility() (gas: 4264908)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 25.83ms (23.76ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testConstructorRejectsMissingInputsAndDoesNotCallExternalContracts() (gas: 4190)\n[PASS] testForeignCallerDoesNotGetAnyAuthority() (gas: 42168530)\n[PASS] testImmutableGraphAndEip170Sizes() (gas: 167318)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 26.82ms (6.88ms CPU time)\n\nRan 6 tests for test/CivicV35.t.sol:CivicV35Test\n[PASS] testBillboardsBidRefundTextRulesAndPoolOnly() (gas: 943011)\n[PASS] testBlackMarketDescendingLimitedAndPause() (gas: 3838822)\n[PASS] testCollapseSuccessAndSingleOutageFailure() (gas: 816491)\n[PASS] testDormantDisabledAndNoticeOnce() (gas: 304624)\n[PASS] testOnceSeasonBoostBoundsAndSnapshot() (gas: 1743868)\n[PASS] testWarFreezeScoresConservationAndPayoutOnlyOnce() (gas: 1366070)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 28.09ms (12.61ms CPU time)\n\nRan 5 tests for test/ReviewV34.t.sol:ReviewV34Test\n[PASS] testCanonicalCompetingRegistryCannotTakeOverBinding() (gas: 8803655)\n[PASS] testDustBuyCannotConsumeGlobalBuyInterval() (gas: 334438)\n[PASS] testLateGreenEntrySettlesWithinReservedEnvelope() (gas: 4423526)\n[PASS] testMeaningfulSmallBuyCanUseLessThanMaximumBatch() (gas: 263260)\n[PASS] testSameConfigurationAtUncommittedCoordinatesCannotBind() (gas: 8871788)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 35.07ms (17.30ms 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 89.78µs (18.01µs CPU time)\n\nRan 1 test for test/StandardV4Integration.t.sol:StandardV4IntegrationTest\n[PASS] testStandardAdapterRealPoolPaysExistingHookExactlyOnce() (gas: 1932780)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 38.40ms (843.25µs CPU time)\n\nRan 3 tests for test/HookBinding.t.sol:HookBindingTest\n[PASS] testHoldBeforeGameExistsThenBindOnceAndFlushExactStreams() (gas: 43232711)\n[PASS] testLookAlikeCannotBindEvenWhenTeamCalls() (gas: 1909503)\n[PASS] testWrongRouterAndMissingCodeRejectedBeforePermanentBind() (gas: 40974227)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 25.07ms (13.46ms CPU time)\n\nRan 8 tests for test/V39.t.sol:V39Test\n[PASS] testBaseDepositsAreEntirelyRewardEth() (gas: 185097)\n[PASS] testGridAcceptsSeverityFromThreeThousandAndRejectsBelow() (gas: 2982771)\n[PASS] testHookAddsExactlyOnePercentOnBuysAndSellsAfterLaunchWindow() (gas: 2151624)\n[PASS] testHookHasNoNetworkShareRecipientOrWithdrawal() (gas: 113630)\n[PASS] testMarketFactoryConfigHasNoNetworkRecipient() (gas: 5787045)\n[PASS] testRegistryAcceptsEitherToolchainPinAndNothingElse() (gas: 876035)\n[PASS] testSellSurchargeStillProgressiveAndCappedAtFifteenPercent() (gas: 1819105)\n[PASS] testStepLaunchTaxUnchangedAndFullyToRewards() (gas: 1283556)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 42.04ms (21.99ms CPU time)\n\nRan 14 tests for test/V34.t.sol:V34Test\n[PASS] testBestFarmCapsAbsoluteSpendAndBreaksTiesByAddress() (gas: 4652560)\n[PASS] testBestFarmNeedsTwentyEpochsAndUsesCappedAbsoluteSpend() (gas: 4128384)\n[PASS] testBuybackSlippage150BpsMaxAndIntervalCannotBeBypassed() (gas: 752661)\n[PASS] testDonationsAndOrdinaryInflowsCannotPretendToBeEndowment() (gas: 1532098)\n[PASS] testEntropyAt256BoundaryAndAt257RearmsWithoutPayOrMint() (gas: 3271493)\n[PASS] testFirstRewardStartsCurrentEpochAtHalfTimeAndSnapshotCannotBeReplaced() (gas: 4824553)\n[PASS] testFreeFarmDoesNotDiluteDistrictOrClaimPaidPrize() (gas: 4709729)\n[PASS] testGameReadinessBothChecksRollbackEthAndTokenPurchase() (gas: 3579969)\n[PASS] testHookUninitializedCannotOpenOrStartEpochAndCallerCannotStartClock() (gas: 5396570)\n[PASS] testLaunchTaxExactBoundaries() (gas: 5281074)\n[PASS] testMythicGateEvaluatedAtRevealNotAtPayment() (gas: 1617796)\n[PASS] testPackOpeningFollowsHookAndNotLegacyDeployTimestamp() (gas: 103221)\n[PASS] testRemainderTransferredToPredictedPoolBeforeDeploymentAndNoApprovalNeeded() (gas: 2620664)\n[PASS] testStarterEntropyRearmsAfterClaimWindowAndNoDoubleMint() (gas: 773193)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 47.60ms (42.95ms CPU time)\n\nRan 1 test for test/PredictionV34.t.sol:PredictionV34Test\n[PASS] testFullGraphPredictsPoolBeforeRegistryDeployment() (gas: 4072266)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.83ms (696.94µs CPU time)\n\nRan 3 tests for test/PotV35.t.sol:PotV35Test\n[PASS] testPotDepositRequiresActualTokensAndAuthority() (gas: 259549)\n[PASS] testPotSplitDistinctLotteryDistrictAndRollbackOnFullInventory() (gas: 11505072)\n[PASS] testPotUnclaimedRolloverOnlyAfterFourWeeksNoDoubleClaim() (gas: 6430963)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 41.66ms (29.99ms CPU time)\n\nRan 5 tests for test/Registry.t.sol:RegistryTest\n[PASS] testAllModulePinsMatchExactPinnedCompilerArtifacts() (gas: 895436)\n[PASS] testAuthenticatedEnrollmentRejectsUncreatedWrongCodeAndWrongRegistry() (gas: 2835987)\n[PASS] testConstructorAcceptsEmptyGraphWithoutExternalCalls() (gas: 14247)\n[PASS] testCounterfeitRuntimeAtAnotherFactoryCannotEnroll() (gas: 1634390)\n[PASS] testCounterfeitRuntimeWithPoisonedCreditCannotEnroll() (gas: 5659107)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 58.34ms (5.86ms CPU time)\n\nRan 10 tests for test/Bounties.t.sol:BountiesTest\n[PASS] testBuyBountyProportionalCapNoDustCreditAndFailureRollback() (gas: 678807)\n[PASS] testEmptyRosterAndInvalidBatchReceiveNothing() (gas: 1435549)\n[PASS] testEveryWorkKindBoundedByHeartbeatAndAuthorizedProducer() (gas: 64313477)\n[PASS] testLazySettlementUnpaidAndCannotReplay() (gas: 6956601)\n[PASS] testOnlyFinalizePaidOnceAndEmptyWeekUnpaid() (gas: 2283318)\n[PASS] testPackEntropyCapturedOnceWithFullInventoryAndThroughPause() (gas: 3711589)\n[PASS] testPlanResolutionPaidOnceIncludingAdvanceForwarding() (gas: 2954629)\n[PASS] testRemovedWorkBountiesRejectedEvenFromOldProducer() (gas: 178997)\n[PASS] testStarterEntropySurvivesFullInventoryExpiryAndPauseWithoutReplayPayment() (gas: 5337227)\n[PASS] testWorkCreditRespectsZeroGasPricePriceCeilingAndUnitCap() (gas: 331935)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 61.52ms (95.54ms CPU time)\n\nRan 8 tests for test/PhasedReleaseV36.t.sol:PhasedReleaseV36Test\n[PASS] testBillboardsDisabledThenEnabled() (gas: 416589)\n[PASS] testEnableIsNoticedOnceNeverOffAndSwarmOnly() (gas: 362929)\n[PASS] testEnhancementDisabledThenEnabledOnce() (gas: 1100493)\n[PASS] testEverythingDeploysDisabledAndCoreStillWorks() (gas: 8135211)\n[PASS] testFuzzUnannouncedFeatureCannotBeEnabled(uint256) (runs: 256, μ: 30543, ~: 30418)\n[PASS] testLocksStakeAndLobbyDisabledThenEnabled() (gas: 2841712)\n[PASS] testPotDisabledFollowsV34RoutingThenEnabled() (gas: 443405)\n[PASS] testReservedEventsDisabledThenEnabled() (gas: 564717)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 71.31ms (36.41ms CPU time)\n\nRan 6 tests for test/V4Integration.t.sol:V4IntegrationTest\n[PASS] testRealV4BuyAndSingleSwapSellTaxConserveSettlement() (gas: 2241521)\n[PASS] testRealV4ManipulatedSpotCannotInstantlySetBuybackQuote() (gas: 1894587)\n[PASS] testRealV4SmallBuyPaysPositiveKeeperMargin() (gas: 2060859)\nLogs:\n  real V4 0.2ETH buy gas: 1922773\n  real V4 buy bounty wei: 48436750000000\n\n[PASS] testRealV4SystemBuyUsesTwapAndOnlySystemFunds() (gas: 2067858)\n[PASS] testRealV4SystemSalesUseDepthTwapNormalFeesAndConserveTokens() (gas: 2217372)\n[PASS] testSystemBuybackOffsetsRecordedSellImbalance() (gas: 2489114)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 79.31ms (7.28ms CPU time)\n\nRan 3 tests for test/Pause.t.sol:PauseTest\n[PASS] testOnlySwarmBoundedDurationAndCannotExtendPause() (gas: 245682)\n[PASS] testSalePausedWhileEntropyClaimsWithdrawalsAndEpochsContinue() (gas: 15103257)\n[PASS] testUnpauseCannotResetNextPauseCooldown() (gas: 196898)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 35.55ms (28.31ms CPU time)\n\nRan 1 test for test/EndowmentGame.t.sol:EndowmentGameTest\n[PASS] testRealMiningCannotSpendFutureEndowment() (gas: 129631026)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 172.01ms (157.58ms CPU time)\n\nRan 8 tests for test/FeesParams.t.sol:FeesParamsTest\n[PASS] testAllDefaultParamsWithinHardBounds() (gas: 937724)\n[PASS] testBuyBackPoolOnlySlippageFailureRollbackAndDustGriefBlocked() (gas: 770665)\n[PASS] testExactEthSplitsHeartbeatCapAndPullPayments() (gas: 498724)\n[PASS] testFuzzNoStepAboveTenPercent(uint96) (runs: 256, μ: 44675, ~: 44789)\nLogs:\n  Bound result 502\n\n[PASS] testFuzzSplitsConserveEveryWei(uint96) (runs: 256, μ: 193648, ~: 196507)\nLogs:\n  Bound result 10117\n\n[PASS] testHeartbeatCapFixedAtOneEth() (gas: 202001)\n[PASS] testParamsStepCooldownBoundsAuthorityAndLetter() (gas: 195564)\n[PASS] testPoolNoPublicReserveRecycleOrPayment() (gas: 135323)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 201.83ms (55.21ms CPU time)\n\nRan 18 tests for test/EconomyV35.t.sol:EconomyV35Test\n[PASS] testAllEnhancementTableEndpointsAndGlobalBonusCap() (gas: 1480015)\n[PASS] testDurabilityBoundariesAndIdleNoWear() (gas: 38231585)\n[PASS] testEnhanceBurnFailureAndLevelGate() (gas: 1229400)\n[PASS] testEnhanceCapsNoticeUpwardOnlyAndThirtyDays() (gas: 356589)\n[PASS] testEnhanceCommitCannotPlaceScrapOrRetryAndCanRearm() (gas: 1803198)\n[PASS] testFeeSalesDepthSlippageCadenceAndNormalFeePot() (gas: 1719374)\n[PASS] testFreeAllowlistOnceWindowStarterScrapAndMetadata() (gas: 3126978)\n[PASS] testFreeRootRemainsFrozenAfterSevenDays() (gas: 44826)\n[PASS] testFreeRootWindowAndIndexLimit() (gas: 55592)\n[PASS] testFuzzPriceCurveDaysBounds(uint32,uint32) (runs: 256, μ: 88509, ~: 90225)\nLogs:\n  Bound result 14753\n\n[PASS] testLockBonusRedistributesWithinReservedEmission() (gas: 11600973)\n[PASS] testLockEscrowNoEarlyExitAndWalletCap() (gas: 5367923)\n[PASS] testQuoteScalesLastSettlementAndHasFloor() (gas: 4277664)\n[PASS] testRepairYieldQuoteAndAutoRepairCreditsOnly() (gas: 10801717)\n[PASS] testRoomsChargeYieldDaysAndRetainAgeGates() (gas: 2604863)\n[PASS] testSystemSellDustCannotOccupyCadenceAndCappedHeartbeatReturnsTokens() (gas: 1538803)\n[PASS] testTokenOnlyGiftSplitsNoEthPeg() (gas: 1728985)\n[PASS] testZapAtomicMinOutPauseAndRefund() (gas: 1436733)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 232.93ms (321.19ms CPU time)\n\nRan 20 tests for test/V33.t.sol:V33Test\n[PASS] testActionBeforeExpiryMovesBucketWithoutDoubleCount() (gas: 26207615)\n[PASS] testAdvanceIsConstantInExpiringFarms() (gas: 38631871)\n[PASS] testAgeCapsAtBoundaries() (gas: 204335)\n[PASS] testClaimDoesNotRecommitWhileBehind() (gas: 37363053)\n[PASS] testClaimRecommitsAndPackRecommits() (gas: 60887979)\n[PASS] testDistrictScoreAveragePerFarmAndTenPercentWalletCap() (gas: 4724485)\n[PASS] testHeartbeatCapExcessGoesToPoolAndBaseFeeIsAllRewards() (gas: 260111)\n[PASS] testIdleFarmLeavesDenominatorAfterTwelveEpochs() (gas: 23715695)\n[PASS] testLaunchTaxDepositIsAllPoolAndMarketOnly() (gas: 136754)\n[PASS] testMergeRemoved() (gas: 515587)\n[PASS] testPackLobbySellSplit88Team10Heartbeat2() (gas: 391176)\n[PASS] testPackSaleOpensSixtyMinutesAfterLaunch() (gas: 1255769)\n[PASS] testPaidXpCannotBypassAgeGates() (gas: 59087314)\n[PASS] testPaidXpCappedPerDayActivityUncapped() (gas: 13258916)\n[PASS] testPartialRoomIsClippedNotReverted() (gas: 2143948)\n[PASS] testRewardsEarnedBeforeExpiryAreNeverLost() (gas: 47585743)\n[PASS] testSingleWhaleDistrictCannotWinAlone() (gas: 4663909)\n[PASS] testSyncRecommitsFromNextEpoch() (gas: 33449265)\n[PASS] testTokenPacksAlsoWaitForOpening() (gas: 60973)\n[PASS] testTopSpenderTrackingIsExact() (gas: 5532945)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 346.18ms (940.30ms CPU time)\n\nRan 9 tests for test/Packs.t.sol:PacksTest\n[PASS] testExactPaymentAndFutureBlockRequired() (gas: 1663991)\n[PASS] testExactRarityThresholdsAndMythicGate() (gas: 270966)\n[PASS] testExpiryRearmsWithoutMintingAndInventoryOpeningLimit() (gas: 3789254)\n[PASS] testFuzzVrgdaAlwaysBounded(uint32,uint32) (runs: 256, μ: 62190, ~: 64112)\nLogs:\n  Bound result 14753\n\n[PASS] testItemTypeDistributionExact() (gas: 589021)\n[PASS] testNoWalletGlobalOrTokenPackDailyLimit() (gas: 4417904)\n[PASS] testStarterWindowProofTokenIdOnceAndInventoryFailureRetry() (gas: 881836)\n[PASS] testTokenPackSameQuoteAndSplitWhenUsingWalletOrCredits() (gas: 76503326)\n[PASS] testVrgdaInitialStepDecayFloorCeilingAndBulkPricing() (gas: 1295040)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 360.95ms (260.45ms CPU time)\n\nRan 6 tests for test/Market.t.sol:MarketTest\n[PASS] testBuyChargesExactlyOnePercentAllToRewards() (gas: 1721167)\n[PASS] testFuzzTotalFeeHardCap(uint96) (runs: 256, μ: 1795157, ~: 1798259)\nLogs:\n  Bound result 11276\n\n[PASS] testOnlyManagerCorrectPoolExactInputAndHookAddress() (gas: 112236)\n[PASS] testSingleDumpIncludesItselfAndFeeDecaysWithoutGriefReset() (gas: 16713699)\n[PASS] testTwapAveragesEthPriceAcrossUnequalPrices() (gas: 2309622)\n[PASS] testTwapWarmupAndFlashManipulationResistance() (gas: 1869072)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 434.64ms (444.08ms CPU time)\n\nRan 2 tests for test/StandardMarket.t.sol:StandardMarketTest\n[PASS] testFuzzStandardSellNeverAddsProgressiveSurcharge(uint96) (runs: 256, μ: 1795723, ~: 1802795)\nLogs:\n  Bound result 8649\n\n[PASS] testStandardBuyOnePercentAllToRewards() (gas: 1659800)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 434.74ms (417.58ms CPU time)\n\nRan 11 tests for test/Items.t.sol:ItemsTest\n[PASS] testComputeHashSupportHashAndBonusesReplaceDuo() (gas: 4693806)\n[PASS] testDurabilityWearRepairAndEnhancementMetadataPreserved() (gas: 8380892)\n[PASS] testEquipRarityGatesAndMythicGate() (gas: 4156578)\n[PASS] testFullStackRarityCapAndRoomFlags() (gas: 7641158)\n[PASS] testInventoryMintCannotExceedCapacityAndExpansionRises() (gas: 3357190)\n[PASS] testLockedItemCannotBeScrappedUntilEpochRolls() (gas: 5988835)\n[PASS] testOffgridSavings() (gas: 2690438)\n[PASS] testPaidXpCannotBypassRoomTwoAgeGate() (gas: 3775503)\n[PASS] testRoomGatesAndLevelProgression() (gas: 78443003)\n[PASS] testScrapPaysPoolYieldAndCannotRepeat() (gas: 7559748)\n[PASS] testSoulboundOnlyOwnFarmAndNoDuplicateTypes() (gas: 2248377)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 461.91ms (303.90ms CPU time)\n\nRan 3 tests for test/Gas.t.sol:GasTest\n[PASS] testGasCommonActions() (gas: 10837211)\nLogs:\n  buy token pack: 916913\n  open one pack: 514355\n  equip: 960927\n  repair wallet: 615984\n  enhancement commit: 566704\n  expand: 390375\n  token pack wallet: 645844\n  withdraw: 251298\n  unequip: 400338\n\n[PASS] testGasFullFarmLongIdleBoundedChunks() (gas: 120706589)\nLogs:\n  settle full 24-item farm eight epochs after 40 idle: 12706268\n\n[PASS] testGasTypicalFarmSettlementHasNoBounty() (gas: 8923375)\nLogs:\n  settle typical three-item farm one epoch: 910524\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 465.07ms (513.76ms CPU time)\n\nRan 6 tests for test/SeasonAudit.t.sol:SeasonAuditTest\n[PASS] testAuditThresholdStrictAndNoWhaleSoftCap() (gas: 39985693)\n[PASS] testLotteryEntitlementSurvivesFullInventory() (gas: 130065245)\n[PASS] testPackSupplyDropOnlyActiveFarmsAtDoublePace() (gas: 11545294)\n[PASS] testParameterChangesCannotChangeClosedEpochBetweenBatches() (gas: 12445416)\n[PASS] testSeasonCannotFinalizeEarlyAndExpiredLotteryMustRearm() (gas: 123053145)\n[PASS] testWeeklyThreeDistinctTicketWinnersRarePackAndBestPrize() (gas: 123265439)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 432.14ms (1.07s CPU time)\n\nRan 6 tests for test/Regression.t.sol:RegressionTest\n[PASS] testCableRepairRestoresOnlyRemainingHalfEpoch() (gas: 11812549)\n[PASS] testEmptyEpochPreservesLastSettledRateButResetsScrapAllowance() (gas: 11013283)\n[PASS] testFuzzCableRepairBlendHandlesNonMonotonicRarityBonuses(uint16) (runs: 256, μ: 1371963, ~: 1371901)\nLogs:\n  Bound result 1\n\n[PASS] testRegisterOnlyAccountsDoNotAddSettlementWorkAndEmptyFarmCanRetire() (gas: 2020875)\n[PASS] testRepairAndPaidPackCannotRetroactivelyBoostEpoch() (gas: 9562444)\n[PASS] testUnlimitedFreshPacksCannotDrainPoolByScrapping() (gas: 9650862)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 809.94ms (459.66ms CPU time)\n\nRan 19 tests for test/SwarmDeskV37.t.sol:SwarmDeskV37Test\n[PASS] testBackupFailureUnknownFailureDeadlineAndPriceCap() (gas: 747581)\n[PASS] testBackupPullsExactPriceRecordsRequestAndRestrictsBodyAndCadence() (gas: 1182040)\n[PASS] testEmptyChainConstructorAndAuthenticatedBindingRejectSpoofs() (gas: 10317633)\n[PASS] testEventClampingAndFallbackWithoutAnswer() (gas: 1037766)\n[PASS] testExpiredOldSlotOldEpochAndUnexecutedAnswersNeverAct() (gas: 824190)\n[PASS] testFlatConstructorRejectsUnusedPackedBits() (gas: 6272668)\n[PASS] testForgedTamperedWrongSignerWrongDomainAndCallerRejected() (gas: 340323)\n[PASS] testFutureIssueWrongTypeMalformedLengthAndPriceNeverConsume() (gas: 306693)\n[PASS] testFuzzEveryParamHardBoundsAndTenPercentStep(uint8,uint248) (runs: 256, μ: 454529, ~: 456696)\nLogs:\n  Bound result 0\n\n[PASS] testNextSlotAcceptsSameQuestionAndChangedExecutionBytesReject() (gas: 1123422)\n[PASS] testNoAdminPathsAndEntireGraphUsesDesk() (gas: 388647)\n[PASS] testNoopRegulatorAcceptedAndParamsCooldownPreserved() (gas: 435462)\n[PASS] testRegulatorClampsParamsAnnouncesPhasesAndThirtyDayCaps() (gas: 1108366)\n[PASS] testReplayDifferentSourceAndSecondAnswerSameSlotIgnored() (gas: 1041173)\n[PASS] testRobinhoodNativeClockCallbackWithin200k() (gas: 343487)\n[PASS] testScheduleDeliveryStoresUnder200kThenExecutesTwoPlans() (gas: 964655)\n[PASS] testSubmitRelayAcceptsAttestedAnswerFromAnyoneOnce() (gas: 1063578)\n[PASS] testSubmitRelayRejectsForgedWrongQuestionStaleAndMalformed() (gas: 1791536)\n[PASS] testWrongQuestionUnknownRequestWeakPanelAndWindowRejected() (gas: 362819)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 812.13ms (813.54ms CPU time)\n\nRan 2 tests for test/ReservedEventsV35.t.sol:ReservedEventsV35Test\n[PASS] testFuzzReservedFestivalCannotExceedFifteenPercent(uint16) (runs: 256, μ: 4936490, ~: 4936489)\n[PASS] testReservedHeatwaveExtraCoolingWearAndBothProtections() (gas: 10123682)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 756.76ms (779.84ms CPU time)\n\nRan 9 tests for test/Epochs.t.sol:EpochsTest\n[PASS] testCannotAdvanceEarlyAndBountyOnce() (gas: 2523245)\n[PASS] testClaimsEveryEpochAndRedistributionIsNextEpoch() (gas: 12001358)\n[PASS] testGasAdvanceIndependentOfRoster() (gas: 890477284)\nLogs:\n  advance empty roster: 1300825\n  advance 1000 farms: 1490867\n\n[PASS] testNoCatchupEmissionDuringGap() (gas: 6265710)\n[PASS] testNoRetroactiveEquipmentAndBoundedBatches() (gas: 5795273)\n[PASS] testNoWhaleCapHashShares() (gas: 10138739)\n[PASS] testReferralOneLevelSetOnceNoSelf() (gas: 7524348)\n[PASS] testTaxCurveExactAndFloor() (gas: 27438)\n[PASS] testWithdrawFailureRollsBackAndReentrancyCannotClaimTwice() (gas: 7440019)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.84s (4.90s CPU time)\n\nRan 6 tests for test/Endowment.t.sol:EndowmentTest\n[PASS] testDirectTransferCannotBypassOrBackdateDrip() (gas: 366921)\n[PASS] testExactFundingFullLinearDripAndConservation() (gas: 815523)\n[PASS] testFuzzCumulativePaymentsCannotExceedVestedPrincipal(uint32,uint128) (runs: 256, μ: 515006, ~: 516653)\nLogs:\n  Bound result 14\n  Bound result 19921759451314593\n\n[PASS] testNoTeamDonorOrSwarmWithdrawalOrReserveAuthority() (gas: 617186)\n[PASS] testParamsSnapshotCannotAccelerateOrRelockExistingEndowment() (gas: 300180)\n[PASS] testUnderfundingCannotActivateAndDonationsStayConserved() (gas: 452319)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 9.58s (9.57s CPU time)\n\nRan 13 tests for test/Events.t.sol:EventsTest\n[PASS] testCheapTariffAppliesCitywide() (gas: 6431161)\n[PASS] testColdPowerFireImmuneAndCleanPowerSurgeImmune() (gas: 7907430)\n[PASS] testFallbackAndExpiredSeedIndependentOfSwarmNumber() (gas: 1694219)\n[PASS] testFireNoCoolingZeroYieldColdPowerImmune() (gas: 6157263)\n[PASS] testGreenWaveRaisesDistrictMiningTenPercent() (gas: 6432223)\n[PASS] testLobbyOwnDistrictSplitDecayAndMinimumWeight() (gas: 1080008)\n[PASS] testOutageAndOffgridRoomMitigation() (gas: 7065123)\n[PASS] testPlansOnlyNextTwoOnceAndBoundedSeverity() (gas: 350457)\n[PASS] testRollingCapsAndInitialPositiveQuotaWithHostilePlans() (gas: 101399210)\n[PASS] testSurgeCanDestroyCommonButNeverLegendary() (gas: 6265009)\n[PASS] testSurgeDamagesExactlyOneItemAndCleanPowerImmune() (gas: 6306133)\n[PASS] testSurgeNeverDestroysLegendaryOrMythic() (gas: 9531205)\n[PASS] testTheftRouterDisabledAndRepairRestores() (gas: 6866808)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 9.60s (355.16ms CPU time)\n\nRan 9 tests for test/LazyAccounting.t.sol:LazyAccountingTest\n[PASS] testAuditChargesTenPercentEvenAtHalfSeverityAndThresholdIsFrozen() (gas: 6159689)\n[PASS] testClaimCatchesUpWhilePacksPausedAndDoesNotEraseRemainingHistory() (gas: 25665007)\n[PASS] testExhaustedFarmCannotCollectRedistributionByRemainingIdle() (gas: 15115858)\n[PASS] testFuzzLazyEqualsIndependentEagerForRandomFarmsAndAllEvents(uint256) (runs: 256, μ: 45583909, ~: 45581225)\n[PASS] testGlobalAccumulatorAndWeightsAreSnapshottedBeforeMutations() (gas: 9283952)\n[PASS] testLateSeasonSettlementPaysMiningWithoutChangingFrozenWinners() (gas: 59518906)\n[PASS] testOneWeiMiningGreenCannotLockSettlementThroughEnvelopeRounding() (gas: 11085608)\n[PASS] testSparseMatureVintageConsumedBeforeRecentSlotAfterWrap() (gas: 43761321)\n[PASS] testStaleActionsRequireChunksAndNeverBlockGlobalAdvance() (gas: 40555111)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 9.68s (10.11s 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   | 628   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | buy       | 608   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | claim     | 553   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | equip     | 553   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | expand    | 591   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | freeClaim | 582   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | fundPot   | 609   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | lock      | 555   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | resolve   | 616   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | rollover  | 575   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | settle    | 546   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | tokenPack | 612   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unlock    | 595   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unplace   | 569   | 0       | 0        |\n╰-------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000\n  Bound result 480000\n  Bound result 1\n  Bound result 12066\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 31.42s (31.38s CPU time)\n\nRan 44 test suites in 31.42s (71.78s CPU time): 259 tests passed, 0 failed, 1 skipped (260 total tests)\n","passed":true},{"durationMs":145,"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.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)\",\"MarketFactory.deploy((address,address,int24,address,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)\",\"SwarmDesk.clearExpired(bytes32)\",\"SwarmDesk.execute(uint8,bytes)\",\"SwarmDesk.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"SwarmDesk.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"SwarmDesk.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"V4Market.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"V4Market.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"V4Market.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"V4Market.bindFeeRouter(address,uint64,uint256)\",\"V4Market.buy(uint256,address)\",\"V4Market.flushFees()\",\"V4Market.receive()\",\"V4Market.sell(uint256,uint256,address)\",\"V4Market.unlockCallback(bytes)\"],\"files\":{\".gitignore\":8,\"README.md\":49,\"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/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/api-v35.md\":41,\"docs/dependency-provenance.md\":9,\"docs/design.md\":69,\"docs/entropy-v34.md\":31,\"docs/launch-v31.md\":121,\"docs/launch-v34.md\":44,\"docs/launch-v35.md\":40,\"docs/lazy-accounting-v32.md\":48,\"docs/oracle-v37/event.json\":1,\"docs/oracle-v37/oracle-config.json\":21,\"docs/oracle-v37/regulator.json\":1,\"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/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/security-review.md\":29,\"docs/simulation-assumptions.md\":43,\"docs/simulation-v3-historical.md\":44,\"docs/simulation-v34.md\":34,\"foundry.toml\":20,\"keeper/README.md\":117,\"keeper/blackout-keeper.service\":23,\"keeper/keeper.env.example\":18,\"keeper/keeper.mjs\":537,\"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/V4Market.sol\":1898,\"operations/dormant-v35.md\":17,\"regulator.md\":60,\"report.md\":83,\"script/Deploy.s.sol\":184,\"script/DeployMarket.s.sol\":15,\"script/PredictGame.s.sol\":49,\"script/SwarmArgs.sol\":30,\"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\":207,\"src/EndowmentEscrow.sol\":112,\"src/Enhancement.sol\":126,\"src/FarmCore.sol\":597,\"src/FarmEngine.sol\":299,\"src/FarmItems.sol\":165,\"src/FarmRewards.sol\":577,\"src/FeeRouter.sol\":302,\"src/GameRegistry.sol\":102,\"src/GridOperator.sol\":261,\"src/MarketFactory.sol\":72,\"src/PackSale.sol\":293,\"src/Params.sol\":181,\"src/RewardPool.sol\":113,\"src/Season.sol\":371,\"src/StandardAdapter.sol\":77,\"src/StandardMarket.sol\":23,\"src/StarterClaim.sol\":149,\"src/SwarmDesk.sol\":479,\"src/V4Market.sol\":551,\"src/interfaces/IGame.sol\":51,\"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\":51,\"src/lib/SwarmCode.sol\":18,\"src/oracle/OracleAttestation.sol\":221,\"src/oracle/SignatureCheckerCompat.sol\":14,\"test/AutoRepairReviewV35.t.sol\":39,\"test/Base.t.sol\":306,\"test/Bounties.t.sol\":290,\"test/CivicV35.t.sol\":224,\"test/Clock.t.sol\":54,\"test/Deployment.t.sol\":94,\"test/EconomyV35.t.sol\":389,\"test/Endowment.t.sol\":123,\"test/EndowmentEscrowV38.t.sol\":171,\"test/EndowmentGame.t.sol\":51,\"test/Epochs.t.sol\":177,\"test/Events.t.sol\":238,\"test/Factory.t.sol\":37,\"test/FeesParams.t.sol\":135,\"test/Gas.t.sol\":110,\"test/GridV35.t.sol\":66,\"test/HookBinding.t.sol\":113,\"test/Invariants.t.sol\":211,\"test/Items.t.sol\":246,\"test/KeeperProfit.t.sol\":95,\"test/LazyAccounting.t.sol\":421,\"test/Market.t.sol\":130,\"test/OracleConformanceV37.t.sol\":107,\"test/Packs.t.sol\":167,\"test/Pause.t.sol\":76,\"test/PhasedReleaseV36.t.sol\":165,\"test/PotV35.t.sol\":108,\"test/PredictionV34.t.sol\":48,\"test/Registry.t.sol\":143,\"test/Regression.t.sol\":154,\"test/ReservedEventsV35.t.sol\":41,\"test/ReviewV34.t.sol\":146,\"test/SeasonAudit.t.sol\":187,\"test/StandardAdapter.t.sol\":81,\"test/StandardMarket.t.sol\":63,\"test/StandardV4Integration.t.sol\":128,\"test/SwarmDeskV37.t.sol\":597,\"test/V33.t.sol\":561,\"test/V34.t.sol\":315,\"test/V39.t.sol\":226,\"test/V4Integration.t.sol\":190,\"test/WarReviewV35.t.sol\":69,\"test/YieldFloorReviewV35.t.sol\":31,\"test/fixtures/keeper-v39-vectors.json\":55,\"test/fixtures/oracle-hash-vectors.json\":102,\"test/fork/RobinhoodFork.t.sol\":39,\"test/keeper-v39.test.mjs\":34,\"test/mocks/MockGameRegistry.sol\":52,\"test/mocks/MockMarket.sol\":67,\"test/mocks/MockSwarmIntake.sol\":67,\"test/mocks/MockToken.sol\":38,\"test/mocks/MockV4Manager.sol\":118,\"test/oracle-v37.test.mjs\":41,\"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_v32_results.py\":52,\"tools/check_v37_authority.py\":19,\"tools/entropy_bot.py\":106,\"tools/freepack_merkle.py\":20,\"tools/make_oracle_bodies.mjs\":46,\"tools/oracle_question_hash.mjs\":80,\"tools/pin_module_code.py\":103,\"tools/pin_swarm_code.py\":47,\"tools/regulator.py\":81,\"tools/report_v31.py\":55,\"tools/starter_merkle.py\":72,\"tools/swarm_constructor_args.mjs\":44,\"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":29952,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/V4Market.sol:194: V4Market.flushFees() (src/V4Market.sol#194-208) sends eth to arbitrary user\n[high/medium] arbitrary-send-eth at src/V4Market.sol:502: V4Market._sellCallback(bytes) (src/V4Market.sol#502-525) sends eth to arbitrary user\n[high/medium] weak-prng at src/V4Market.sol:300: V4Market._record(bool,uint256) (src/V4Market.sol#300-321) uses a weak PRNG: \"b = longVolumes[p % 24] (src/V4Market.sol#309)\"\n[high/medium] weak-prng at src/V4Market.sol:278: V4Market._cumulativeAt(uint256) (src/V4Market.sol#278-285) uses a weak PRNG: \"o = observations[minute % 32] (src/V4Market.sol#282)\"\n[high/medium] weak-prng at src/V4Market.sol:256: V4Market._observe(uint256) (src/V4Market.sol#256-276) uses a weak PRNG: \"observations[minute % 32] = Observation(uint64(minute),c) (src/V4Market.sol#270)\"\n[high/medium] weak-prng at src/V4Market.sol:300: V4Market._record(bool,uint256) (src/V4Market.sol#300-321) uses a weak PRNG: \"a = shortVolumes[p % 12] (src/V4Market.sol#303)\"\n[high/medium] weak-prng at src/V4Market.sol:300: V4Market._record(bool,uint256) (src/V4Market.sol#300-321) uses a weak PRNG: \"delete shortVolumes[p % 12] (src/V4Market.sol#305)\"\n[high/medium] weak-prng at src/V4Market.sol:300: V4Market._record(bool,uint256) (src/V4Market.sol#300-321) uses a weak PRNG: \"delete longVolumes[p % 24] (src/V4Market.sol#311)\"\n[high/medium] weak-prng at src/V4Market.sol:370: V4Market.nextStepIn() (src/V4Market.sol#370-373) uses a weak PRNG: \"LAUNCH_TAX_STEP - t % LAUNCH_TAX_STEP (src/V4Market.sol#372)\"\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/Civic.sol:56: Reentrancy in Civic._take(address,uint256) (src/Civic.sol#56-63):\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/FarmCore.sol:425: Reentrancy in FarmCore._charge(address,uint256,bool,uint8) (src/FarmCore.sol#425-439):\n[high/medium] reentrancy-balance at src/FeeRouter.sol:276: Reentrancy in FeeRouter.executeBuys(uint256,uint256) (src/FeeRouter.sol#276-301):\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/FeeRouter.sol:166: Reentrancy in FeeRouter.zapBuy(uint256,address) (src/FeeRouter.sol#166-174):\n[high/medium] reentrancy-balance at src/FarmCore.sol:485: Reentrancy in FarmCore._splitCharge(address,uint256,bool) (src/FarmCore.sol#485-495):\n[high/medium] reentrancy-balance at src/Economy.sol:134: Reentrancy in Economy.lock(uint256,uint256) (src/Economy.sol#134-151):\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/FeeRouter.sol:217: Reentrancy in FeeRouter.executePotBuys(uint256,uint256) (src/FeeRouter.sol#217-231):\n[high/medium] reentrancy-balance at src/Billboards.sol:55: Reentrancy in Billboards._take(address,uint256) (src/Billboards.sol#55-62):\n[high/medium] reentrancy-eth at src/Civic.sol:238: Reentrancy in Civic.fundCollapse(uint256) (src/Civic.sol#238-244):\n[high/medium] reentrancy-eth at src/Civic.sol:288: Reentrancy in Civic.buyLot(uint256) (src/Civic.sol#288-301):\n[high/medium] reentrancy-eth at src/FarmCore.sol:450: Reentrancy in FarmCore.repairCable(bool) (src/FarmCore.sol#450-458):\n[high/medium] reentrancy-eth at src/FarmCore.sol:473: Reentrancy in FarmCore.buyTokenPack(bool) (src/FarmCore.sol#473-483):\n[high/medium] reentrancy-eth at src/FarmCore.sol:100: Reentrancy in FarmCore.buyRoom(uint256,bool) (src/FarmCore.sol#100-109):\n[high/medium] reentrancy-eth at src/FarmCore.sol:473: Reentrancy in FarmCore.buyTokenPack(bool) (src/FarmCore.sol#473-483):\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:52: Enhancement.announceCap(uint8,string) (src/Enhancement.sol#52-63) uses a Boolean constant improperly:\n[medium/medium] divide-before-multiply at src/FeeRouter.sol:183: FeeRouter.executeSells(uint256,uint256) (src/FeeRouter.sol#183-215) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/Base64.sol:18: Base64.encode(bytes) (vendor/openzeppelin/contracts/utils/Base64.sol#18-94) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmEngine.sol:157: FarmEngine._accumulate(FarmEngine.Snapshot,uint256,uint256,FarmEngine.RoomStats,FarmEngine.Acc) (src/FarmEngine.sol#157-172) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/V4Market.sol:278: V4Market._cumulativeAt(uint256) (src/V4Market.sol#278-285) 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:86: Economy.itemDaily(uint256) (src/Economy.sol#86-92) 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/Economy.sol:86: Economy.itemDaily(uint256) (src/Economy.sol#86-92) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmCore.sol:505: FarmCore.scrap(uint256,uint256) (src/FarmCore.sol#505-516) 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/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 src/FarmRewards.sol:162: FarmRewards.advanceEpoch() (src/FarmRewards.sol#162-233) 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 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:256: V4Market._observe(uint256) (src/V4Market.sol#256-276) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/V4Market.sol:256: V4Market._observe(uint256) (src/V4Market.sol#256-276) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmCore.sol:505: FarmCore.scrap(uint256,uint256) (src/FarmCore.sol#505-516) performs a multiplication on the result of a division:\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/V4Market.sol:352: V4Market.sinceLaunch() (src/V4Market.sol#352-354) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/FarmRewards.sol:298: FarmRewards.beginMining(address,uint256) (src/FarmRewards.sol#298-311) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/EndowmentEscrow.sol:62: EndowmentEscrow.forward(address,uint64,uint256,bytes,uint64,uint256,bytes) (src/EndowmentEscrow.sol#62-90) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:287: V4Market.twap() (src/V4Market.sol#287-292) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:256: V4Market._observe(uint256) (src/V4Market.sol#256-276) 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:256: V4Market._observe(uint256) (src/V4Market.sol#256-276) 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/FarmCore.sol:505: FarmCore.scrap(uint256,uint256) (src/FarmCore.sol#505-516) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Enhancement.sol:52: Enhancement.announceCap(uint8,string) (src/Enhancement.sol#52-63) 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:119: Reentrancy in FarmCore.autoRepair(address,uint256) (src/FarmCore.sol#119-129):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:357: Reentrancy in FarmRewards._settleOne(address,uint256) (src/FarmRewards.sol#357-382):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:162: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#162-233):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:345: Reentrancy in FarmRewards._settle(address,uint256) (src/FarmRewards.sol#345-355):\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/V4Market.sol:502: Reentrancy in V4Market._sellCallback(bytes) (src/V4Market.sol#502-525):\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/FarmCore.sol:352: Reentrancy in FarmCore.place(uint256,uint256,uint256) (src/FarmCore.sol#352-386):\n[medium/medium] reentrancy-no-eth at src/Enhancement.sol:74: Reentrancy in Enhancement.commit(uint256,uint256,bool) (src/Enhancement.sol#74-90):\n[medium/medium] reentrancy-no-eth at src/FeeRouter.sol:183: Reentrancy in FeeRouter.executeSells(uint256,uint256) (src/FeeRouter.sol#183-215):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:162: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#162-233):\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/GridOperator.sol:163: Reentrancy in GridOperator.shift(uint256) (src/GridOperator.sol#163-175):\n[medium/medium] reentrancy-no-eth at src/FeeRouter.sol:183: Reentrancy in FeeRouter.executeSells(uint256,uint256) (src/FeeRouter.sol#183-215):\n[medium/medium] reentrancy-no-eth at src/Economy.sol:153: Reentrancy in Economy.unlock() (src/Economy.sol#153-170):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:411: Reentrancy in FarmRewards._reward(address,uint256,FarmRewards.Share,uint256,uint256) (src/FarmRewards.sol#411-437):\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/FarmRewards.sol:162: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#162-233):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:523: Reentrancy in FarmCore.process(address,uint256) (src/FarmCore.sol#523-548):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:525: Reentrancy in FarmRewards.claim(uint256) (src/FarmRewards.sol#525-535):\n[medium/medium] reentrancy-no-eth at src/V4Market.sol:527: Reentrancy in V4Market.unlockCallback(bytes) (src/V4Market.sol#527-550):\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/FarmRewards.sol:411: Reentrancy in FarmRewards._reward(address,uint256,FarmRewards.Share,uint256,uint256) (src/FarmRewards.sol#411-437):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:162: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#162-233):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:292: Reentrancy in FarmCore._prepare(address) (src/FarmCore.sol#292-298):\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/SwarmDesk.sol:151: SwarmDesk.constructor(address,address,address,address,bytes32,uint256,bytes32,bytes32,bytes32,bytes32,address,bytes32).b (src/SwarmDesk.sol#151) 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/GridOperator.sol:205: GridOperator._resolve(uint256,address).repeated (src/GridOperator.sol#205) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SwarmDesk.sol:139: SwarmDesk.constructor(address,address,address,address,bytes32,uint256,bytes32,bytes32,bytes32,bytes32,address,bytes32).o (src/SwarmDesk.sol#139) 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 src/Season","passed":true},{"durationMs":1333,"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 (100 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:19: Unprotected initializer\n[high] unsafe-casting at src/Economy.sol:140: Unsafe Casting of integers\n[low] costly-loop at src/FarmCore.sol:318: Costly operations inside loop (15 places)\n[low] division-before-multiplication at src/FarmCore.sol:512: Incorrect Order of Division and Multiplication (2 places)\n[low] large-numeric-literal at src/Civic.sol:187: Large Numeric Literal (123 places)\n[low] literal-instead-of-constant at src/Billboards.sol:48: Literal Instead of Constant (673 places)\n[low] local-variable-shadowing at src/FarmRewards.sol:36: 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:556: `nonReentrant` is Not the First Modifier (2 places)\n[low] require-revert-in-loop at src/Billboards.sol:78: Loop Contains `require`/`revert` (12 places)\n[low] state-change-without-event at src/Billboards.sol:128: State Change Without Event (21 places)\n[low] unchecked-return at src/FarmCore.sol:106: Unchecked Return (17 places)\n[low] uninitialized-local-variable at src/Billboards.sol:78: Uninitialized Local Variable (35 places)\n[low] unused-import at src/Billboards.sol:8: Unused Import (5 places)\n[low] unused-public-function at src/Billboards.sol:47: Public Function Not Used Internally (18 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2ba381ef978ac963127d1ec033a698957790730bdaa064ac0ea42e668bd629ee","verifiedTreeHash":"6e8c7724963b0a721e2ff139d3ef77ba5720eac7","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":445297,"exitCode":0,"name":"build","output":"Compiling 183 files with Solc 0.8.26\nSolc 0.8.26 finished in 444.67s\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:281:22:\n    |\n281 |     function _record(bool sell, uint256 amount) private {\n    |                      ^^^^^^^^^\nNote: The other declaration is here:\n   --> src/V4Market.sol:471:5:\n    |\n471 |     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/Events.t.sol:216:9:\n    |\n216 |         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:160:13:\n    |\n160 |             uint256 quote = d.packs.quote(112);\n    |             ^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/LazyAccounting.t.sol:395:9:\n    |\n395 |         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 (2072): Unused local variable.\n  --> test/Regression.t.sol:73:9:\n   |\n73 |         uint256 previous = d.items.data(id).durability;\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 (2018): Function state mutability can be restricted to pure\n   --> src/FarmRewards.sol:145:5:\n    |\n145 |     function ready() public view returns (bool) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[missing-events-arithmetic]: `otherInflow` is changed without an event but is used in arithmetic\n   ╭▸ src/RewardPool.sol:75:23\n   │\n75 │         if (!endowed) otherInflow += amount;\n   │                       ━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/RewardPool.sol:51:33\n   │\n51 │         if (endowment() == 0 || block.timestamp >= dripStart + dripPeriod) return 0;\n   │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/FarmEngine.sol:61:30\n   │\n61 │             (, uint256 hi) = params().bounds(k);\n   │                              ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:40:26\n   │\n40 │         return FarmItems(registry.module(3));\n   │                          ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:74:27\n   │\n74 │             f.clocks[i] = items().data(ids[i]).overclock;\n   │                           ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:121:39\n    │\n121 │             FarmItems.Item memory x = items().data(id);\n    │                                       ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:134:39\n    │\n134 │             FarmItems.Item memory x = items().data(id);\n    │                                       ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[missing-events-arithmetic]: `heldBase` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:442:9\n    │\n442 │         heldBase += base;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:44:23\n   │\n44 │         return Params(registry.params());\n   │                       ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:61:30\n   │\n61 │             (, uint256 hi) = params().bounds(k);\n   │                              ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:48:25\n   │\n48 │         return IRewards(registry.module(1));\n   │                         ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:64:25\n   │\n64 │         return active ? rewards().epochParam(e, uint256(k)) : params().get(k);\n   │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:64:63\n   │\n64 │         return active ? rewards().epochParam(e, uint256(k)) : params().get(k);\n   │                                                               ━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[missing-events-arithmetic]: `heldSellTax` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:443:9\n    │\n443 │         heldSellTax += excess;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/FarmEngine.sol:112:24\n    │\n112 │         if (room >= 4) revert InvalidValue();\n    │                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n  ╭▸ src/lib/ItemMath.sol:8:25\n  │\n8 │         if (rarity > 4) revert InvalidValue();\n  │                         ━━━━━━━━━━━━━━━━━━━━━━\n  │\n  ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/lib/EconomyMath.sol:19:39\n   │\n19 │         if (level == 0 || level > 16) revert InvalidValue();\n   │                                       ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:147:27\n    │\n147 │         o.questionChain = uint64(contextWord);\n    │                           ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-arithmetic]: `heldBase` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:501:9\n    │\n501 │         heldBase += base;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:88:39\n   │\n88 │             FarmItems.Item memory x = items().data(ids[i]);\n   │                                       ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:148:23\n    │\n148 │         o.fromBlock = uint64(contextWord >> 64);\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:149:21\n    │\n149 │         o.toBlock = uint64(contextWord >> 128);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:154:28\n    │\n154 │         b.registryLaunch = uint64(bindingWord);\n    │                            ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:155:27\n    │\n155 │         b.registryIndex = uint8(bindingWord >> 64);\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:156:26\n    │\n156 │         b.paramsLaunch = uint64(bindingWord >> 72);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:157:25\n    │\n157 │         b.paramsIndex = uint8(bindingWord >> 136);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:158:26\n    │\n158 │         b.heartbeatBps = uint16(bindingWord >> 144);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/RewardPool.sol:91:13\n   │\n91 │         if (token().balanceOf(address(this)) - before_ != amount) revert InvalidValue();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmEngine.sol:141:31\n    │\n141 │             baseProductive += raw * EconomyMath.tier(f.health[idx]) / 10000;\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[missing-events-access-control]: `farms` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:287:9\n    │\n287 │         f.serial = nextSerial++;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmEngine.sol:142:19\n    │\n142 │             raw = raw * (10000 + EconomyMath.bonus(f.clocks[idx])) / 10000;\n    │                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmEngine.sol:144:29\n    │\n144 │             s.productive += raw * EconomyMath.tier(f.health[idx]) / 10000;\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/RewardPool.sol:99:9\n   │\n99 │         emit Reserved(amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/RewardPool.sol:107:67\n    │\n107 │     function pay(address to, uint256 amount) external onlyRewards nonReentrant {\n    │                                                                   ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[missing-events-access-control]: `purchasedRoom` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:107:9\n    │\n107 │         purchasedRoom[msg.sender][room] = true;\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `farms` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:241:9\n    │\n241 │         f.paidXpToday += amount;\n    │         ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:264:14\n    │\n264 │           id = ISwarmIntake(config.intake)\n    │ ┏━━━━━━━━━━━━━━┛\n265 │ ┃             .requestWithFailure(\n266 │ ┃                 config.action,\n267 │ ┃                 body,\n    ‡ ┃\n271 │ ┃                 price\n272 │ ┃             );\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:137:13\n    │\n137 │             tags |= 1 << ItemMath.tag(x.kind);\n    │             ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:122:41\n    │\n122 │             if (x.holder != address(0)) mask |= 1 << x.kind;\n    │                                         ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:140:13\n    │\n140 │             baseRaw += raw;\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:141:13\n    │\n141 │             baseProductive += raw * EconomyMath.tier(f.health[idx]) / 10000;\n    │             ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:258:20\n    │\n258 │                 || block.timestamp < s * _period(stream) + 1 hours\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:277:13\n    │\n277 │         if (deadline > end) deadline = end;\n    │             ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:279:9\n    │\n279 │         emit BackupAsked(stream, s, id, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:278:31\n    │\n278 │         pending[id] = Pending(uint64(s), uint64(deadline), stream + 1);\n    │                               ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:278:42\n    │\n278 │         pending[id] = Pending(uint64(s), uint64(deadline), stream + 1);\n    │                                          ━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `farms` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:312:9\n    │\n312 │         f.active = f.loadout;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `farms` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:559:9\n    │\n559 │         farms[p].xp += 100;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:150:30\n    │\n150 │         return epoch != 0 && block.timestamp < epochs[epoch].end;\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `scrapAllowance` is updated\n    ╭▸ src/FarmRewards.sol:164:13\n    │\n164 │             pool().recycle(scrapAllowance);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `epoch` is updated\n    ╭▸ src/FarmRewards.sol:168:13\n    │\n168 │             grid().resolveFor(epoch, msg.sender);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `epoch` is updated\n    ╭▸ src/FarmRewards.sol:178:17\n    │\n178 │                 pool().reserve(old.budget);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/Civic.sol:61:13\n   │\n61 │         if (t.balanceOf(address(this)) - before_ != amount) revert InvalidValue();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `epoch` is updated\n    ╭▸ src/FarmRewards.sol:185:33\n    │\n185 │                 if (prize != 0) season().addPrize(week, prize);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:288:9\n    │\n288 │         rewards().initialize(p);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Civic.sol:84:82\n   │\n84 │         if (feature >= FEATURES || noticeAt[feature] == 0 || enabled[feature] || block.timestamp < noticeAt[feature]) {\n   │                                                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:295:13\n    │\n295 │         if (rewards().settle(p, 8) < rewards().settledEpoch()) revert CatchUpRequired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:301:9\n    │\n301 │ ┏         rewards()\n302 │ ┃             .setWeight(\n303 │ ┃                 p,\n304 │ ┃                 engine().allocationHash(farms[p].loadout, farms[p].paid != 0) * (10000 + _boost(p, block.timestamp))\n305 │ ┃                     / 10000\n306 │ ┃             );\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:103:17\n    │\n103 │         return (block.timestamp < boostUntil[d] ? seasonBoost[d] : 0) + (block.timestamp < warBoostUntil[d] ? 1000 : 0);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:103:74\n    │\n103 │         return (block.timestamp < boostUntil[d] ? seasonBoost[d] : 0) + (block.timestamp < warBoostUntil[d] ? 1000 : 0);\n    │                                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:229:9\n    │\n229 │         grid().shift(epoch);\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:230:9\n    │\n230 │         fees().payBounty(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Civic.sol:137:13\n    │\n137 │             uint64(block.timestamp + 48 hours),\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/FarmCore.sol:92:9\n   │\n92 │         season().recordSpend(p, cost, true);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmRewards.sol:188:40\n    │\n188 │                     lastAverageDaily = old.mining * (10000 - old.tariff) / 10000 * 4 / activeFarmCount[epoch];\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Civic.sol:173:14\n    │\n173 │         if (!found && contribution[warId][msg.sender] > low) top[slot] = msg.sender;\n    │              ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Civic.sol:173:66\n    │\n173 │         if (!found && contribution[warId][msg.sender] > low) top[slot] = msg.sender;\n    │                                                                  ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:162:13\n    │\n162 │         if (block.timestamp < launchTime() || (epoch != 0 && block.timestamp < epochs[epoch].end)) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:162:62\n    │\n162 │         if (block.timestamp < launchTime() || (epoch != 0 && block.timestamp < epochs[epoch].end)) revert TooEarly();\n    │                                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:114:23\n    │\n114 │         return Params(registry.params());\n    │                       ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:225:36\n    │\n225 │             epochParam[epoch][k] = params().get(Params.Key(k));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:152:42\n    │\n152 │         if (!enabled[0] || warId == 0 || block.timestamp >= w.end || w.settled || (d != w.a && d != w.b)) {\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:197:13\n    │\n197 │             emit EpochClosed(epoch, old.budget, old.raw);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:208:13\n    │\n208 │             emit Expired(epoch, gone);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:231:9\n    │\n231 │         emit EpochStarted(epoch, e.start, e.end, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:288:9\n    │\n288 │         rewards().initialize(p);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:295:13\n    │\n295 │         if (rewards().settle(p, 8) < rewards().settledEpoch()) revert CatchUpRequired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:301:9\n    │\n301 │ ┏         rewards()\n302 │ ┃             .setWeight(\n303 │ ┃                 p,\n304 │ ┃                 engine().allocationHash(farms[p].loadout, farms[p].paid != 0) * (10000 + _boost(p, block.timestamp))\n305 │ ┃                     / 10000\n306 │ ┃             );\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FarmRewards.sol:170:13\n    │\n170 │             (old.kind, old.severity, old.district, old.seed,) = grid().eventAt(epoch);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:201:19\n    │\n201 │         e.start = uint64(block.timestamp);\n    │                   ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:202:17\n    │\n202 │         e.end = uint64(block.timestamp + EPOCH);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/Civic.sol:71:9\n   │\n71 │         RewardPool(pool).donate(amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:192:40\n    │\n192 │         if (warId == 0 || w.settled || block.timestamp < w.end) revert TooEarly();\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Civic.sol:202:9\n    │\n202 │         emit WarFinished(warId, w.winner, w.payout, toPool);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:228:67\n    │\n228 │             !enabled[1] || !collapseFinalized || outagePending || block.timestamp < greenUntil\n    │                                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:239:34\n    │\n239 │         if (collapseFinalized || block.timestamp >= collapseEnd) revert TooEarly();\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Civic.sol:243:9\n    │\n243 │         emit CollapseFunded(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:247:34\n    │\n247 │         if (collapseFinalized || block.timestamp < collapseEnd) revert TooEarly();\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Civic.sol:261:13\n    │\n261 │         if (block.timestamp < greenUntil) return 1;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Civic.sol:280:48\n    │\n280 │         lots[w] = Lot(kind, rarity, supply, 0, uint64(block.timestamp));\n    │                                                ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Civic.sol:298:9\n    │\n298 │         ICore(registry.module(2)).civicPurchase(msg.sender, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Civic.sol:299:14\n    │\n299 │         id = FarmItems(registry.module(3)).mint(msg.sender, l.kind, l.rarity, false);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Civic.sol:300:9\n    │\n300 │         emit LotBought(w, msg.sender, id, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `purchasedRoom` is updated\n    ╭▸ src/FarmCore.sol:432:13\n    │\n432 │             RewardPool(pool()).recordInflow(paid);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `purchasedRoom` is updated\n    ╭▸ src/FarmCore.sol:434:20\n    │\n434 │             paid = rewards().spend(p, nominal);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `purchasedRoom` is updated\n    ╭▸ src/FarmCore.sol:437:9\n    │\n437 │         season().recordSpend(p, paid, kind == 0 || kind == 3 || kind == 4);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:438:9\n    │\n438 │         emit Spent(p, kind, paid, nominal);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:108:9\n    │\n108 │         emit RoomPurchased(msg.sender, room, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:325:13\n    │\n325 │             a.expiresAt < block.timestamp || uint256(a.issuedAt) + (stream == 0 ? 6 hours : 1 days) < block.timestamp\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:325:46\n    │\n325 │             a.expiresAt < block.timestamp || uint256(a.issuedAt) + (stream == 0 ? 6 hours : 1 days) < block.timestamp\n    │                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:326:31\n    │\n326 │                 || (direct && block.timestamp >= p.deadline)\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:342:13\n    │\n342 │             emit AnswerIgnored(a.requestId, 2);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:346:13\n    │\n346 │             emit AnswerIgnored(a.requestId, 2);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:360:9\n    │\n360 │         emit AnswerStored(stream, a.requestId, s, a.answer);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:358:59\n    │\n358 │             keccak256(a.answer), a.requestId, a.issuedAt, uint64(until), uint64(s), true, uint48(ChainClock.number())\n    │                                                           ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:358:74\n    │\n358 │             keccak256(a.answer), a.requestId, a.issuedAt, uint64(until), uint64(s), true, uint48(ChainClock.number())\n    │                                                                          ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:358:91\n    │\n358 │             keccak256(a.answer), a.requestId, a.issuedAt, uint64(until), uint64(s), true, uint48(ChainClock.number())\n    │                                                                                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint48' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:116:9\n    │\n116 │         emit AutoRepairSet(msg.sender, autoRepairThreshold[msg.sender]);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:127:13\n    │\n127 │             emit Spent(p, 0, paid, paid);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:308:9\n    │\n308 │         emit MiningStarted(p, epoch, secondsLeft, weighted);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:432:13\n    │\n432 │             RewardPool(pool()).recordInflow(paid);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:434:20\n    │\n434 │             paid = rewards().spend(p, nominal);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:437:9\n    │\n437 │         season().recordSpend(p, paid, kind == 0 || kind == 3 || kind == 4);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:218:36\n    │\n218 │         uint256 age = born == 0 || block.timestamp < born ? 0 : block.timestamp - born;\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:219:13\n    │\n219 │         if (age >= 5 days) return 10;\n    │             ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:220:13\n    │\n220 │         if (age >= 3 days) return 9;\n    │             ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:221:13\n    │\n221 │         if (age >= 1 days) return 6;\n    │             ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:228:13\n    │\n228 │         if (f.paidXpDay != block.timestamp / 1 days) return PAID_XP_PER_DAY;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:377:37\n    │\n377 │         if (p.streamPlusOne == 0 || block.timestamp < p.deadline) revert TooEarly();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:379:35\n    │\n379 │         emit OracleFailure(id, 0, bytes32(\"timeout\"));\n    │                                   ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'bytes32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[boolean-cst]: misuse of a boolean constant\n   ╭▸ src/Enhancement.sol:55:63\n   │\n55 │             (cap == 8 ? next != 12 : cap == 12 ? next != 16 : true) || announcedCap != 0 || bytes(letter).length == 0\n   │                                                               ━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/boolean-cst\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Enhancement.sol:66:34\n   │\n66 │         if (announcedCap == 0 || block.timestamp < activationAt) revert TooEarly();\n   │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `pending` is updated\n   ╭▸ src/Enhancement.sol:85:9\n   │\n85 │         core.prepareEnhancement(msg.sender, item, cost, wallet);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/Enhancement.sol:89:9\n   │\n89 │         emit EnhancementCommitted(id, msg.sender, item, target, ChainClock.number() + 2, cost);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/Enhancement.sol:88:50\n   │\n88 │         attempts[id] = Attempt(msg.sender, item, uint64(ChainClock.number() + 2), target, bytes32(0), false, false);\n   │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Enhancement.sol:100:24\n    │\n100 │             a.target = uint64(ChainClock.number() + 2);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Enhancement.sol:122:21\n    │\n122 │         if (burned) inventory.destroy(a.item);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Enhancement.sol:123:14\n    │\n123 │         else inventory.maintain(a.item, x.durability, level);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Enhancement.sol:124:9\n    │\n124 │         emit EnhancementResolved(id, success, burned, level);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:417:13\n    │\n417 │             grid.submitPlan(e, GridOperator.Kind(kind), severity, v[5], notice);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:433:13\n    │\n433 │             params.set(k, target, notice);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:438:47\n    │\n438 │             if (civic.noticeAt(feature) == 0) civic.announce(feature, notice);\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:442:13\n    │\n442 │             enhancement.announceCap(enhancement.cap() == 8 ? 12 : 16, notice);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:446:17\n    │\n446 │               try civic.grantDistrictBoost(\n    │ ┏━━━━━━━━━━━━━━━━━┛\n447 │ ┃                 _clamp(uint256(v[11]) >> 128, 1, 8) - 1,\n448 │ ┃                 uint16(_clamp(uint256(v[11]) & type(uint128).max, 0, 1500)),\n449 │ ┃                 notice\n450 │ ┃             ) {}\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:234:24\n    │\n234 │         uint64 today = uint64(block.timestamp / 1 days);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:457:13\n    │\n457 │             packs.unpause();\n    │             ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:459:17\n    │\n459 │             try packs.pause(_clamp(uint256(v[12]) - 1, 1, 72 hours)) {}\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:465:17\n    │\n465 │               try civic.startWar(\n    │ ┏━━━━━━━━━━━━━━━━━┛\n466 │ ┃                 uint8(_clamp(uint256(v[13]) >> 128, 1, 8) - 1),\n467 │ ┃                 uint8(_clamp(uint256(v[13]) & type(uint128).max, 1, 8) - 1)\n468 │ ┃             ) {}\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:261:53\n    │\n261 │         if (room == 1) return farms[p].born != 0 && block.timestamp >= farms[p].born + 3 days;\n    │                                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:475:17\n    │\n475 │             try civic.startCollapse(_clamp(uint256(v[14]), daily, daily * 100)) {}\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SwarmDesk.sol:481:17\n    │\n481 │               try civic.listLot(\n    │ ┏━━━━━━━━━━━━━━━━━┛\n482 │ ┃                 uint8(_clamp(uint256(v[15]) >> 16, 1, 12) - 1),\n483 │ ┃                 uint8(_clamp((uint256(v[15]) >> 8) & 255, 1, 3)),\n484 │ ┃                 uint8(_clamp(uint256(v[15]) & 255, 1, 3))\n485 │ ┃             ) {}\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:289:9\n    │\n289 │         emit Registered(p, district(p));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:286:18\n    │\n286 │         f.born = uint64(block.timestamp);\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:387:13\n    │\n387 │         if (block.timestamp >= r.validUntil || r.slot != slot(stream)) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:397:9\n    │\n397 │         emit Executed(stream, r.requestId, letter);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:146:26\n    │\n146 │         return FarmItems(registry.module(3));\n    │                          ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:320:39\n    │\n320 │             FarmItems.Item memory x = items().data(f.active[i]);\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:313:25\n    │\n313 │         f.activeEpoch = uint64(e);\n    │                         ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:315:25\n    │\n315 │         f.activeBoost = uint16(_boost(p, rewards().epochTime(e)));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:416:33\n    │\n416 │             if (e <= current || grid.planAt(e).submitted) continue;\n    │                                 ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:417:13\n    │\n417 │             grid.submitPlan(e, GridOperator.Kind(kind), severity, v[5], notice);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:410:22\n    │\n410 │         uint8 kind = uint8(_clamp(uint256(v[2]), 0, maxKind));\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:412:27\n    │\n412 │         uint16 severity = uint16(_clamp(uint256(v[3]), SEVERITY_MIN, SEVERITY_MAX));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:413:24\n    │\n413 │         districtHint = uint8(_clamp(uint256(v[4]), 0, 7)); // Advisory only; preserve weighted district/entropy rules.\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SwarmDesk.sol:432:34\n    │\n432 │             if (target == old || block.timestamp < params.lastChanged(k) + 1 days) continue;\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmRewards.sol:349:25\n    │\n349 │         for (uint256 n; n < limit && cursor < settledEpoch; ++n) {\n    │                         ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:429:27\n    │\n429 │             uint256 old = params.get(k);\n    │                           ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:430:40\n    │\n430 │             (uint256 lo, uint256 hi) = params.bounds(k);\n    │                                        ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:122:22\n    │\n122 │         return ICore(registry.module(2));\n    │                      ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:358:60\n    │\n358 │         (uint256 raw, uint256 productive, uint256 power) = core().process(p, id);\n    │                                                            ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:432:52\n    │\n432 │             if (target == old || block.timestamp < params.lastChanged(k) + 1 days) continue;\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SwarmDesk.sol:433:13\n    │\n433 │             params.set(k, target, notice);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:452:17\n    │\n452 │                 emit ActionSkipped(0, reason);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:138:16\n    │\n138 │         return registry.launchTime();\n    │                ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:461:17\n    │\n461 │                 emit ActionSkipped(1, reason);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:470:17\n    │\n470 │                 emit ActionSkipped(2, reason);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:477:17\n    │\n477 │                 emit ActionSkipped(3, reason);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SwarmDesk.sol:487:17\n    │\n487 │                 emit ActionSkipped(4, reason);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FeeRouter.sol:162:9\n    │\n162 │         RewardPool(rewardPool()).recordInflow(reward);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:401:13\n    │\n401 │             core().autoRepair(p, id);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:118:27\n    │\n118 │         return RewardPool(registry.module(0));\n    │                           ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:412:30\n    │\n412 │             if (unused != 0) pool().recycle(unused);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:415:32\n    │\n415 │                 if (dust != 0) pool().recycle(dust);\n    │                                ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:419:17\n    │\n419 │                 core().activity(p, id, gross, net);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:421:21\n    │\n421 │                     core().grantDrop(p, keccak256(abi.encode(e.seed, p, \"item\")));\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:134:24\n    │\n134 │         return ISeason(registry.module(8));\n    │                        ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:423:17\n    │\n423 │                 season().recordActivity(p, week, gross, weight);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:428:13\n    │\n428 │             season().complete(p, week);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:448:17\n    │\n448 │                 uint16(_clamp(uint256(v[11]) & type(uint128).max, 0, 1500)),\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:163:9\n    │\n163 │         emit TokensRouted(reward, t, h);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/FeeRouter.sol:171:9\n    │\n171 │         market().buy{value: msg.value}(minOut, recipient);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:466:17\n    │\n466 │                 uint8(_clamp(uint256(v[13]) >> 128, 1, 8) - 1),\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:467:17\n    │\n467 │                 uint8(_clamp(uint256(v[13]) & type(uint128).max, 1, 8) - 1)\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:482:17\n    │\n482 │                 uint8(_clamp(uint256(v[15]) >> 16, 1, 12) - 1),\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:483:17\n    │\n483 │                 uint8(_clamp((uint256(v[15]) >> 8) & 255, 1, 3)),\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FeeRouter.sol:171:9\n    │\n171 │         market().buy{value: msg.value}(minOut, recipient);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SwarmDesk.sol:484:17\n    │\n484 │                 uint8(_clamp(uint256(v[15]) & 255, 1, 3))\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:455:13\n    │\n455 │             emit Credited(p, e, amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:466:9\n    │\n466 │         emit Credited(p, e, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:332:9\n    │\n332 │         rewards().recordSales(n);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:333:9\n    │\n333 │         season().recordSpend(p, ethValue, true);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `heartbeatTokens` is updated\n    ╭▸ src/FeeRouter.sol:189:13\n    │\n189 │             RewardPool(rewardPool()).recordInflow(excess);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:416:17\n    │\n416 │                 emit EpochSettled(id, e.spent, dust);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/FarmRewards.sol:398:37\n    │\n398 │             if (spent > allocation) revert InvalidValue();\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-balance]: external call can be reentered before a stale contract balance is checked\n    ╭▸ src/FeeRouter.sol:204:9\n    │\n204 │         m.sell(amount, minOut, address(this));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-balance\n\nwarning[missing-events-access-control]: `bestClaimed` is changed without an event but is used for access control\n   ╭▸ src/Season.sol:76:9\n   │\n76 │         bestClaimed[w] = true;\n   │         ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `seasons` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:174:21\n    │\n174 │                     seasons[w].districtSpend[d] += districtSpendOf[w][p];\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `heartbeatBalance` is updated\n    ╭▸ src/FeeRouter.sol:204:9\n    │\n204 │         m.sell(amount, minOut, address(this));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[missing-events-access-control]: `seasons` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:241:17\n    │\n241 │                 seasons[w].districtSpend[d] += districtSpendOf[w][p];\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmRewards.sol:396:43\n    │\n396 │             uint256 spent = net + redis + referral;\n    │                                           ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FeeRouter.sol:209:22\n    │\n209 │         uint256 hb = received * h / amount;\n    │                      ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[missing-events-access-control]: `seasons` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:263:9\n    │\n263 │         s.totalTickets += weight;\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `seasons` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:275:9\n    │\n275 │         seasons[w].prize += amount;\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FeeRouter.sol:184:30\n    │\n184 │         if (lastSell != 0 && block.timestamp < lastSell + 5 minutes) revert TooEarly();\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-events-access-control]: `lotteryClaimed` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:364:9\n    │\n364 │         lotteryClaimed[w][msg.sender] = true;\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:214:9\n    │\n214 │         emit TokensSold(amount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FeeRouter.sol:204:9\n    │\n204 │         m.sell(amount, minOut, address(this));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/FeeRouter.sol:226:9\n    │\n226 │         market().buy{value: amount}(minOut, season());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:453:13\n    │\n453 │         if (block.timestamp >= at + 7 days) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Season.sol:67:26\n   │\n67 │         if (rolled[w] || block.timestamp >= claimDeadline(w)) revert TooEarly();\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:463:19\n    │\n463 │         v.epoch = uint64(e);\n    │                   ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:464:48\n    │\n464 │         if (at > v.at || v.amount == 0) v.at = uint64(at);\n    │                                                ━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FeeRouter.sol:229:9\n    │\n229 │         IPotSeason(season()).depositPot(received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FeeRouter.sol:219:29\n    │\n219 │         if (lastBuy != 0 && block.timestamp < lastBuy + 5 minutes) revert TooEarly();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:230:9\n    │\n230 │         emit PotBought(amount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:344:9\n    │\n344 │         rewards().setReferrer(msg.sender, inviter);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FeeRouter.sol:226:9\n    │\n226 │         market().buy{value: amount}(minOut, season());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmRewards.sol:492:25\n    │\n492 │         for (uint256 n; n < 32 && amount != 0; ++n) {\n    │                         ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:481:36\n    │\n481 │             if (old.amount != 0 && block.timestamp >= uint256(old.at) + 7 days) {\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:498:45\n    │\n498 │             if (taxed) tax += used * taxBps(block.timestamp > v.at ? block.timestamp - v.at : 0) / 10000;\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/FeeRouter.sol:271:22\n    │\n271 │         (bool ok,) = msg.sender.call{value: a}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:273:9\n    │\n273 │         emit Withdrawn(msg.sender, a);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/FeeRouter.sol:292:9\n    │\n292 │         market().buy{value: ethAmount}(minOut, rewardPool());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FeeRouter.sol:295:50\n    │\n295 │         if (!RewardPool(rewardPool()).endowed()) RewardPool(rewardPool()).recordInflow(received);\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FeeRouter.sol:283:29\n    │\n283 │         if (lastBuy != 0 && block.timestamp < lastBuy + MIN_BUY_INTERVAL) revert TooEarly();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:299:9\n    │\n299 │         emit WorkBounty(msg.sender, Params.Key.BuyBounty, ethAmount, paid);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FeeRouter.sol:300:9\n    │\n300 │         emit Bought(ethAmount, received);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FeeRouter.sol:292:9\n    │\n292 │         market().buy{value: ethAmount}(minOut, rewardPool());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Season.sol:81:26\n   │\n81 │         if (rolled[w] || block.timestamp < claimDeadline(w)) revert TooEarly();\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Season.sol:154:13\n    │\n154 │         if (block.timestamp < launchTime()) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:373:9\n    │\n373 │         items().equip(msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:375:13\n    │\n375 │           if (rewards()\n    │ ┏━━━━━━━━━━━━━┛\n376 │ ┃                 .beginMining(\n377 │ ┃                     msg.sender,\n378 │ ┃                     engine().allocationHash(f.loadout, f.paid != 0) * (10000 + _boost(msg.sender, block.timestamp))\n379 │ ┃                         / 10000\n380 │ ┃                 )) {\n    │ ┗━━━━━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Season.sol:161:13\n    │\n161 │         if (block.timestamp >= deadline(w) || completed[w][p]) return;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Season.sol:202:60\n    │\n202 │         if (districtSpendOf[w][p] > low) topSpenders[w][d][slot] = p;\n    │                                                            ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:366:29\n    │\n366 │             if (old != 0 && items().data(old).kind == x.kind) revert InvalidValue();\n    │                             ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:385:9\n    │\n385 │         emit Placed(msg.sender, id, room, slot);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/FarmCore.sol:366:63\n    │\n366 │             if (old != 0 && items().data(old).kind == x.kind) revert InvalidValue();\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Season.sol:234:13\n    │\n234 │         if (block.timestamp >= deadline(w) || completed[w][p]) return;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Season.sol:253:13\n    │\n253 │         if (block.timestamp >= deadline(w) || completed[w][p]) return;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Season.sol:280:42\n    │\n280 │         if (!rewards().seasonReady(w) || block.timestamp < deadline(w) || limit == 0 || limit > 64) revert TooEarly();\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Season.sol:283:20\n    │\n283 │         s.target = uint64(ChainClock.number() + 2);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:395:9\n    │\n395 │         items().unequip(msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:397:9\n    │\n397 │         emit Unplaced(msg.sender, id, room, slot);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:328:39\n    │\n328 │             if (s.best != address(0)) rewards().award(s.best, s.prize);\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:329:18\n    │\n329 │             else rewards().releasePrize(s.prize);\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:331:34\n    │\n331 │         if (s.participants != 0) fees().payWork(msg.sender, Params.Key.SeasonBounty, 1, startGas - gasleft());\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Season.sol:319:25\n    │\n319 │         for (uint256 i; i < 3 && left != 0; ++i) {\n    │                         ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:414:9\n    │\n414 │         emit Retired(p);\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/FarmCore.sol:405:56\n    │\n405 │             if (f.loadout[i] != 0 || f.active[i] != 0) revert InvalidValue();\n    │                                                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Season.sol:332:9\n    │\n332 │         emit SeasonFinalized(w, s.winnerDistrict, s.best, s.seed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Season.sol:315:36\n    │\n315 │                 s.winnerDistrict = uint8(d);\n    │                                    ━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[arbitrary-send-erc20]: `transferFrom` uses an arbitrary `from`; require it to equal `msg.sender` or `address(this)`\n    ╭▸ src/FarmCore.sol:430:13\n    │\n430 │             token().safeTransferFrom(p, pool(), paid);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-erc20\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Season.sol:338:20\n    │\n338 │         s.target = uint64(ChainClock.number() + 2);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FarmCore.sol:431:17\n    │\n431 │             if (token().balanceOf(pool()) - before_ != paid) revert InvalidValue();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:358:60\n    │\n358 │         (uint256 raw, uint256 productive, uint256 power) = core().process(p, id);\n    │                                                            ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:401:13\n    │\n401 │             core().autoRepair(p, id);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:412:30\n    │\n412 │             if (unused != 0) pool().recycle(unused);\n    │                              ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:415:32\n    │\n415 │                 if (dust != 0) pool().recycle(dust);\n    │                                ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:419:17\n    │\n419 │                 core().activity(p, id, gross, net);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:421:21\n    │\n421 │                     core().grantDrop(p, keccak256(abi.encode(e.seed, p, \"item\")));\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:423:17\n    │\n423 │                 season().recordActivity(p, week, gross, weight);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:428:13\n    │\n428 │             season().complete(p, week);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:511:9\n    │\n511 │         pool().pay(msg.sender, net);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:359:14\n    │\n359 │         id = packs().rewardPack(msg.sender);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:369:14\n    │\n369 │         id = items().mint(msg.sender, k, r, true);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:292:9\n    │\n292 │         emit Committed(p, weight, epoch + 1, expiry);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:512:9\n    │\n512 │         emit Claimed(msg.sender, amount, tax);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:447:9\n    │\n447 │         items().maintain(id, 10000, x.overclock);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:520:9\n    │\n520 │         emit Spent(p, consumed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmRewards.sol:531:9\n    │\n531 │         emit Spent(p, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/FarmRewards.sol:534:80\n    │\n534 │     function scrap(address p, uint256 hash, uint256 minimum) external onlyCore nonReentrant returns (uint256 amount) {\n    │                                                                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:548:9\n    │\n548 │         pool().recycle(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/GridOperator.sol:115:16\n    │\n115 │         return block.timestamp < uint256(l.at) + 3 days ? l.amount : 0;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:126:13\n    │\n126 │             total += stake[i];\n    │             ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:127:28\n    │\n127 │             if (stake[i] > largest) largest = stake[i];\n    │                            ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:125:24\n    │\n125 │             stake[i] = eco.districtStake(i);\n    │                        ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:158:52\n    │\n158 │         lobbies[d] = Lobby(lobbyAmount(d) + value, uint64(block.timestamp));\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:456:32\n    │\n456 │         f.cableRepairedEpoch = uint64(rewards().epoch());\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:457:29\n    │\n457 │         f.routerRepairBps = uint16((rewards().epochEnd() - block.timestamp) * 10000 / 6 hours);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:120:31\n    │\n120 │         Economy eco = Economy(registry.module(10));\n    │                               ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:139:35\n    │\n139 │         stable += 5000 * lobby / (eco.averageDaily() * 5 + lobby);\n    │                                   ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:172:33\n    │\n172 │             outputBonus[e][d] = civic.outputBonus(d);\n    │                                 ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/GridOperator.sol:119:21\n    │\n119 │         if (d >= 8) revert InvalidValue();\n    │                     ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:166:20\n    │\n166 │         x.target = uint64(ChainClock.number() + 1);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:167:21\n    │\n167 │         x.started = uint64(block.timestamp);\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:470:9\n    │\n470 │         items().expand(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/GridOperator.sol:249:9\n    │\n249 │         fees().payWork(keeper, Params.Key.EntropyBounty, 1, startGas - gasleft());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/V4Market.sol:190:24\n    │\n190 │         if (base != 0) fees.depositBaseFee{value: base}();\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/V4Market.sol:191:26\n    │\n191 │         if (excess != 0) fees.depositSellTax{value: excess}();\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/V4Market.sol:192:29\n    │\n192 │         if (launchTax != 0) fees.depositLaunchTax{value: launchTax}();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:193:9\n    │\n193 │         emit FeesFlushed(base, excess);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:194:29\n    │\n194 │         if (launchTax != 0) emit LaunchTaxFlushed(launchTax);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:492:13\n    │\n492 │             rewards().spendTo(p, amount, router);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:494:9\n    │\n494 │         FeeRouter(payable(router)).routeTokens(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:224:13\n    │\n224 │             sum += w;\n    │             ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:208:57\n    │\n208 │             if (old == Kind.Green || old == Kind.Cheap) positives++;\n    │                                                         ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:209:27\n    │\n209 │             if (old == k) repeated++;\n    │                           ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:232:34\n    │\n232 │                     x.district = uint8(d);\n    │                                  ━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:480:9\n    │\n480 │         rewards().recordSales(1);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:481:9\n    │\n481 │         season().recordSpend(msg.sender, price, true);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:482:14\n    │\n482 │         id = ITokenPacks(packs()).tokenPack(msg.sender);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FarmCore.sol:490:17\n    │\n490 │             if (token().balanceOf(router) - before_ != amount) revert InvalidValue();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:492:13\n    │\n492 │             rewards().spendTo(p, amount, router);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:494:9\n    │\n494 │         FeeRouter(payable(router)).routeTokens(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:501:9\n    │\n501 │         season().recordSpend(msg.sender, amount, true);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:502:9\n    │\n502 │         grid().tokenLobby(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:513:9\n    │\n513 │         items().destroy(id);\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:514:26\n    │\n514 │         uint256 earned = rewards().scrap(msg.sender, hash, minimum);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmCore.sol:512:24\n    │\n512 │         uint256 hash = ItemMath.baseHash(x.rarity) * (x.kind < 3 ? 10000 : 6000) / 10000 * x.durability / 10000;\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:515:9\n    │\n515 │         emit Scrapped(msg.sender, id, earned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmCore.sol:535:14\n    │\n535 │         if (!occupied) return (0, 0, 0);\n    │              ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:546:28\n    │\n546 │             if (id != 0 && items().data(id).holder == address(0)) _remove(f, id);\n    │                            ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:578:14\n    │\n578 │         id = items().mintDrop(msg.sender, seed);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[missing-events-access-control]: `claims` is changed without an event but is used for access control\n   ╭▸ src/StarterClaim.sol:91:9\n   │\n91 │         claims[tokenId] = Claim(msg.sender, target, false);\n   │         ━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `entropyHash` is changed without an event but is used for access control\n    ╭▸ src/StarterClaim.sol:112:9\n    │\n112 │         entropyHash[tokenId] = h;\n    │         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `entropyCaptured` is changed without an event but is used for access control\n    ╭▸ src/StarterClaim.sol:113:9\n    │\n113 │         entropyCaptured[tokenId] = true;\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/StarterClaim.sol:47:9\n   │\n47 │         farm().register(msg.sender);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StarterClaim.sol:35:13\n   │\n35 │         if (block.timestamp >= freeClaimEnds()) revert TooEarly();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/StarterClaim.sol:48:9\n   │\n48 │         emit StarterCommitted(id, msg.sender, ChainClock.number() + 2);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/StarterClaim.sol:49:9\n   │\n49 │         emit FreePackClaimed(msg.sender, index, id);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:244:13\n    │\n244 │             emit PriceObserved(now_, price);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StarterClaim.sol:46:40\n   │\n46 │         claims[id] = Claim(msg.sender, uint64(ChainClock.number() + 2), false);\n   │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:257:9\n    │\n257 │         emit PriceObserved(now_, price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/V4Market.sol:251:38\n    │\n251 │             uint256 c = cumulative + (1e60 / lastPrice) * (minute * 60 - updatedAt);\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/V4Market.sol:254:23\n    │\n254 │         cumulative += (1e60 / lastPrice) * (now_ - updatedAt);\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/StarterClaim.sol:92:9\n   │\n92 │         farm().register(msg.sender);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:249:13\n    │\n249 │         if (last >= 32 && first < last - 31) first = last - 31;\n    │             ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:249:27\n    │\n249 │         if (last >= 32 && first < last - 31) first = last - 31;\n    │                           ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:250:38\n    │\n250 │         for (uint256 minute = first; minute <= last; ++minute) {\n    │                                      ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StarterClaim.sol:84:13\n   │\n84 │         if (block.timestamp < launchTime() + 48 hours || block.timestamp >= launchTime() + 16 days) revert TooEarly();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:252:53\n    │\n252 │             observations[minute % 32] = Observation(uint64(minute), c);\n    │                                                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StarterClaim.sol:84:58\n   │\n84 │         if (block.timestamp < launchTime() + 48 hours || block.timestamp >= launchTime() + 16 days) revert TooEarly();\n   │                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/V4Market.sol:263:50\n    │\n263 │         if (ts >= updatedAt) return cumulative + (1e60 / lastPrice) * (ts - updatedAt);\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/StarterClaim.sol:93:9\n   │\n93 │         emit StarterCommitted(tokenId, msg.sender, target);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:270:35\n    │\n270 │         if (initializedAt == 0 || block.timestamp < initializedAt + 31 minutes) revert NotConfigured();\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StarterClaim.sol:90:25\n   │\n90 │         uint64 target = uint64(ChainClock.number() + 2);\n   │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:285:13\n    │\n285 │         if (a.period != p) {\n    │             ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:291:13\n    │\n291 │         if (b.period != p) {\n    │             ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:287:24\n    │\n287 │             a.period = uint64(p);\n    │                        ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/StarterClaim.sol:114:9\n    │\n114 │         fees().payWork(keeper, Params.Key.EntropyBounty, 1, startGas - gasleft());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:293:24\n    │\n293 │             b.period = uint64(p);\n    │                        ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:296:24\n    │\n296 │             a.sells += uint192(amount);\n    │                        ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint192' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:297:24\n    │\n297 │             b.sells += uint192(amount);\n    │                        ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint192' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:299:23\n    │\n299 │             a.buys += uint192(amount);\n    │                       ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint192' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:300:23\n    │\n300 │             b.buys += uint192(amount);\n    │                       ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint192' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/V4Market.sol:311:17\n    │\n311 │                 b += shortVolumes[i].buys;\n    │                 ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/V4Market.sol:310:17\n    │\n310 │                 s += shortVolumes[i].sells;\n    │                 ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:309:17\n    │\n309 │             if (uint256(shortVolumes[i].period) + 12 > current) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:319:17\n    │\n319 │             if (uint256(longVolumes[i].period) + 24 > current) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/StarterClaim.sol:130:20\n    │\n130 │         c.target = uint64(ChainClock.number() + 2);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/V4Market.sol:381:13\n    │\n381 │         if (average != 0 && price > average) dev = Math.min(1000, 10000 - Math.mulDiv(average, 10000, price));\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:380:13\n    │\n380 │         if (block.timestamp >= initializedAt + 31 minutes) average = twap();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:386:27\n    │\n386 │         uint256 decayed = storedFeeWad > fall ? storedFeeWad - fall : projectBps() * 1 ether;\n    │                           ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/StarterClaim.sol:145:13\n    │\n145 │             items().mint(c.player, k, r, true);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/StarterClaim.sol:72:26\n   │\n72 │         return FarmItems(registry.module(3));\n   │                          ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/StarterClaim.sol:145:13\n    │\n145 │             items().mint(c.player, k, r, true);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/StarterClaim.sol:147:9\n    │\n147 │         emit StarterResolved(tokenId, h == bytes32(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/StarterClaim.sol:145:13\n    │\n145 │             items().mint(c.player, k, r, true);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:407:13\n    │\n407 │             emit LaunchTax(sender, ethIn, taxBps, fee);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:400:25\n    │\n400 │         uint256 ethIn = uint256(-p.amountSpecified);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:403:19\n    │\n403 │         if (fee > uint256(uint128(type(int128).max))) revert InvalidValue();\n    │                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:403:27\n    │\n403 │         if (fee > uint256(uint128(type(int128).max))) revert InvalidValue();\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:411:43\n    │\n411 │         return (this.beforeSwap.selector, int256(fee << 128), 0);\n    │                                           ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Params.sol:176:13\n    │\n176 │         if (block.timestamp < lastChanged[k] + 1 days) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:435:9\n    │\n435 │         emit SellFee(sender, output, bps, hour, day, dev);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:422:27\n    │\n422 │         int128 ethDelta = int128(delta >> 128);\n    │                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:425:28\n    │\n425 │             _record(false, uint256(-int256(ethDelta)));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:429:26\n    │\n429 │         uint256 output = uint256(uint128(ethDelta));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:429:34\n    │\n429 │         uint256 output = uint256(uint128(ethDelta));\n    │                                  ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:436:42\n    │\n436 │         return (this.afterSwap.selector, int128(int256(base + excess)));\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:436:49\n    │\n436 │         return (this.afterSwap.selector, int128(int256(base + excess)));\n    │                                                 ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/MarketFactory.sol:70:9\n   │\n70 │         emit MarketDeployed(address(market), salt);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StandardAdapter.sol:46:64\n   │\n46 │         if (rate == 0 || rate > 1e40 || window < 30 minutes || at > block.timestamp || block.timestamp - at > 5 minutes)\n   │                                                                ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StandardAdapter.sol:46:88\n   │\n46 │         if (rate == 0 || rate > 1e40 || window < 30 minutes || at > block.timestamp || block.timestamp - at > 5 minutes)\n   │                                                                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/StandardAdapter.sol:58:9\n   │\n58 │         manager.unlock(abi.encode(msg.value, minOut, recipient));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/StandardAdapter.sol:58:9\n   │\n58 │         manager.unlock(abi.encode(msg.value, minOut, recipient));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:67:62\n   │\n67 │         int256 delta = manager.swap(key(), SwapParams(true, -int256(input), 4295128740), \"\");\n   │                                                              ━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:68:27\n   │\n68 │         int128 ethDelta = int128(delta >> 128);\n   │                           ━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:69:22\n   │\n69 │         int128 out = int128(delta);\n   │                      ━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:70:30\n   │\n70 │         if (ethDelta >= 0 || uint256(-int256(ethDelta)) != input || out <= 0 || uint256(uint128(out)) < minimum) {\n   │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:70:81\n   │\n70 │         if (ethDelta >= 0 || uint256(-int256(ethDelta)) != input || out <= 0 || uint256(uint128(out)) < minimum) {\n   │                                                                                 ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:70:89\n   │\n70 │         if (ethDelta >= 0 || uint256(-int256(ethDelta)) != input || out <= 0 || uint256(uint128(out)) < minimum) {\n   │                                                                                         ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/StandardAdapter.sol:73:9\n   │\n73 │         manager.settle{value: input}();\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:74:49\n   │\n74 │         manager.take(address(token), recipient, uint256(uint128(out)));\n   │                                                 ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:74:57\n   │\n74 │         manager.take(address(token), recipient, uint256(uint128(out)));\n   │                                                         ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:75:27\n   │\n75 │         return abi.encode(uint256(uint128(out)));\n   │                           ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:75:35\n   │\n75 │         return abi.encode(uint256(uint128(out)));\n   │                                   ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-events-access-control]: `commits` is changed without an event but is used for access control\n    ╭▸ src/PackSale.sol:254:9\n    │\n254 │         c.seed = keccak256(abi.encode(h, address(this), id));\n    │         ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/V4Market.sol:453:31\n    │\n453 │         received = abi.decode(manager.unlock(abi.encode(msg.value, minOut, recipient)), (uint256));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/PackSale.sol:62:16\n   │\n62 │         return block.timestamp < pausedUntil;\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/PackSale.sol:68:13\n   │\n68 │         if (block.timestamp < nextPauseAt) revert TooEarly();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PackSale.sol:117:16\n    │\n117 │         return block.timestamp >= opensAt() && !paused();\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/PackSale.sol:144:13\n    │\n144 │         p = Economy(registry.module(10)).averageDaily() * daysPrice / 1 ether;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PackSale.sol:130:27\n    │\n130 │         uint256 elapsed = block.timestamp > opensAt() ? block.timestamp - opensAt() : 0;\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:132:24\n    │\n132 │         int256 ahead = int256(sales * 1 ether) - int256(elapsed * target * 1 ether / 1 hours);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:132:50\n    │\n132 │         int256 ahead = int256(sales * 1 ether) - int256(elapsed * target * 1 ether / 1 hours);\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:135:30\n    │\n135 │             exponent = wadLn(int256(1 ether + params().get(Params.Key.PriceStepBps) * 1e14)) * ahead / 1 ether;\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:137:30\n    │\n137 │             exponent = wadLn(int256(1 ether - decay * 1e14)) * (-ahead) / int256(target) / 1 ether;\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:137:75\n    │\n137 │             exponent = wadLn(int256(1 ether - decay * 1e14)) * (-ahead) / int256(target) / 1 ether;\n    │                                                                           ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:141:37\n    │\n141 │         uint256 daysPrice = start * uint256(wadExp(exponent)) / 1 ether;\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:111:28\n    │\n111 │         return ILaunchHook(registry.market()).initializedAt() == 0\n    │                            ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:111:16\n    │\n111 │         return ILaunchHook(registry.market()).initializedAt() == 0\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:113:27\n    │\n113 │             : ILaunchHook(registry.market()).initializedAt() + OPEN_DELAY;\n    │                           ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:113:15\n    │\n113 │             : ILaunchHook(registry.market()).initializedAt() + OPEN_DELAY;\n    │               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:91:23\n   │\n91 │         return Params(registry.params());\n   │                       ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:135:47\n    │\n135 │             exponent = wadLn(int256(1 ether + params().get(Params.Key.PriceStepBps) * 1e14)) * ahead / 1 ether;\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:144:21\n    │\n144 │         p = Economy(registry.module(10)).averageDaily() * daysPrice / 1 ether;\n    │                     ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:144:13\n    │\n144 │         p = Economy(registry.module(10)).averageDaily() * daysPrice / 1 ether;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:52:33\n   │\n52 │         uint256 daily = Economy(registry.module(10)).averageDaily();\n   │                                 ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:52:25\n   │\n52 │         uint256 daily = Economy(registry.module(10)).averageDaily();\n   │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PackSale.sol:47:9\n   │\n47 │         revert InvalidValue();\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/V4Market.sol:479:31\n    │\n479 │         received = abi.decode(manager.unlock(abi.encode(amount, minOut, recipient)), (uint256));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/V4Market.sol:503:22\n    │\n503 │         (bool ok,) = recipient.call{value: net}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:487:39\n    │\n487 │             key(), SwapParams(false, -int256(amount), 1461446703485210103287273052203988822378723970341), \"\"\n    │                                       ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:490:25\n    │\n490 │         int128 ethOut = int128(delta >> 128);\n    │                         ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:491:26\n    │\n491 │         int128 tokenIn = int128(delta);\n    │                          ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:492:44\n    │\n492 │         if (ethOut <= 0 || tokenIn >= 0 || uint256(-int256(tokenIn)) != amount) revert InsufficientBalance();\n    │                                            ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:493:25\n    │\n493 │         uint256 gross = uint256(uint128(ethOut));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:493:33\n    │\n493 │         uint256 gross = uint256(uint128(ethOut));\n    │                                 ━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/V4Market.sol:499:9\n    │\n499 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `updatedAt` is updated\n    ╭▸ src/V4Market.sol:486:24\n    │\n486 │           int256 delta = manager.swap(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━━━━┛\n487 │ ┃             key(), SwapParams(false, -int256(amount), 1461446703485210103287273052203988822378723970341), \"\"\n488 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `updatedAt` is updated\n    ╭▸ src/V4Market.sol:516:24\n    │\n516 │         int256 delta = manager.swap(key(), SwapParams(true, -int256(input), 4295128740), \"\");\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:516:62\n    │\n516 │         int256 delta = manager.swap(key(), SwapParams(true, -int256(input), 4295128740), \"\");\n    │                                                              ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:518:27\n    │\n518 │         int128 ethDelta = int128(delta >> 128);\n    │                           ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:519:29\n    │\n519 │         int128 tokenDelta = int128(delta);\n    │                             ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:521:30\n    │\n521 │             ethDelta >= 0 || uint256(-int256(ethDelta)) != input || tokenDelta <= 0\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:522:20\n    │\n522 │                 || uint256(uint128(tokenDelta)) < minOut\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:522:28\n    │\n522 │                 || uint256(uint128(tokenDelta)) < minOut\n    │                            ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/V4Market.sol:527:9\n    │\n527 │         manager.settle{value: input}();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:528:40\n    │\n528 │         manager.take(token, recipient, uint256(uint128(tokenDelta)));\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:528:48\n    │\n528 │         manager.take(token, recipient, uint256(uint128(tokenDelta)));\n    │                                                ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:530:27\n    │\n530 │         return abi.encode(uint256(uint128(tokenDelta)));\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:530:35\n    │\n530 │         return abi.encode(uint256(uint128(tokenDelta)));\n    │                                   ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/Billboards.sol:60:13\n   │\n60 │         if (t.balanceOf(address(this)) - before_ != amount) revert InvalidValue();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/Billboards.sol:82:17\n   │\n82 │                 revert InvalidValue();\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/Billboards.sol:88:17\n   │\n88 │                 revert InvalidValue();\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/Billboards.sol:70:9\n   │\n70 │         RewardPool(pool).donate(amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Billboards.sol:120:9\n    │\n120 │         emit BillboardSettled(w, d, b.bid);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:63:39\n   │\n63 │             FarmItems.Item memory x = inventory.data(id);\n   │                                       ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:95:45\n   │\n95 │         FarmItems.Item memory x = FarmItems(registry.module(3)).data(id);\n   │                                             ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:95:35\n   │\n95 │         FarmItems.Item memory x = FarmItems(registry.module(3)).data(id);\n   │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:87:45\n   │\n87 │         FarmItems.Item memory x = FarmItems(registry.module(3)).data(id);\n   │                                             ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:87:35\n   │\n87 │         FarmItems.Item memory x = FarmItems(registry.module(3)).data(id);\n   │                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:52:30\n   │\n52 │         return IYieldRewards(registry.module(1));\n   │                              ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:91:64\n   │\n91 │         return Math.mulDiv(hash * 4, Math.max(HASH_RATE_FLOOR, rewards().lastYieldPerHash()), 1 ether);\n   │                                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:99:30\n   │\n99 │             missing * Params(registry.params()).get(Params.Key.RepairHours),\n   │                              ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:99:23\n   │\n99 │             missing * Params(registry.params()).get(Params.Key.RepairHours),\n   │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:66:17\n   │\n66 │             if (reward.pending(p) < cost) continue;\n   │                 ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:67:21\n   │\n67 │             paid += reward.spend(p, cost);\n   │                     ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/Economy.sol:68:13\n   │\n68 │             inventory.maintain(id, 10000, x.overclock);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/Economy.sol:88:37\n   │\n88 │         if (x.holder == address(0)) revert InvalidValue();\n   │                                     ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Economy.sol:77:27\n   │\n77 │         if (start == 0 || start > block.timestamp) revert NotConfigured();\n   │                           ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n   ╭▸ src/Economy.sol:90:16\n   │\n90 │         hash = hash * (10000 + EconomyMath.bonus(x.overclock)) / 10000;\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n   ╭▸ src/Economy.sol:91:28\n   │\n91 │         return Math.mulDiv(hash * 4, Math.max(HASH_RATE_FLOOR, rewards().lastYieldPerHash()), 1 ether);\n   │                            ━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Economy.sol:136:9\n    │\n136 │         IEconomyCore(registry.module(2)).syncFor(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Economy.sol:149:9\n    │\n149 │         IEconomyCore(registry.module(2)).syncFor(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Economy.sol:150:9\n    │\n150 │         emit Locked(msg.sender, amount, block.timestamp + days_ * 1 days, bps);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Economy.sol:140:42\n    │\n140 │         locks[msg.sender] = Lock(amount, uint64(block.timestamp), uint64(block.timestamp + days_ * 1 days), uint16(bps));\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Economy.sol:140:67\n    │\n140 │         locks[msg.sender] = Lock(amount, uint64(block.timestamp), uint64(block.timestamp + days_ * 1 days), uint16(bps));\n    │                                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Economy.sol:140:109\n    │\n140 │         locks[msg.sender] = Lock(amount, uint64(block.timestamp), uint64(block.timestamp + days_ * 1 days), uint16(bps));\n    │                                                                                                             ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/Economy.sol:148:13\n    │\n148 │         if (t.balanceOf(address(this)) - before_ != amount) revert InvalidValue();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-no-eth]: external call can be reentered before `locks` is updated\n    ╭▸ src/Economy.sol:156:9\n    │\n156 │         IEconomyCore(registry.module(2)).syncFor(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Economy.sol:167:9\n    │\n167 │         IEconomyCore(registry.module(2)).syncFor(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Economy.sol:155:30\n    │\n155 │         if (l.amount == 0 || block.timestamp < l.end) revert TooEarly();\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Economy.sol:169:9\n    │\n169 │         emit Unlocked(msg.sender, l.amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Economy.sol:180:23\n    │\n180 │         previous[p] = prev;\n    │                       ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Economy.sol:191:25\n    │\n191 │         for (uint256 i; i < 10 && p != address(0); ++i) {\n    │                         ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/PackSale.sol:182:28\n    │\n182 │         uint256 received = fees().zapBuy{value: msg.value}(minTokens, address(this));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:199:9\n    │\n199 │         farm().register(recipient);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:200:9\n    │\n200 │         farm().paidPackBought(recipient, n, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:207:9\n    │\n207 │         fees().routeTokens(cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PackSale.sol:234:9\n    │\n234 │         emit PackCommitted(id, p, n, target, guaranteed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:201:30\n    │\n201 │                 if (surge && cursor == target && !before_.clean) {\n    │                              ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/PackSale.sol:206:13\n    │\n206 │         if (t.balanceOf(address(fees())) - before_ != cost) revert InvalidValue();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:211:21\n    │\n211 │                     damage += 3000 * uint256(severity) / 10000 / (before_.airflow ? 2 : 1);\n    │                     ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:179:32\n    │\n179 │             if (f.ids[i] != 0) occupied++;\n    │                                ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PackSale.sol:212:25\n    │\n212 │         if (paused() || block.timestamp < opensAt()) revert TooEarly();\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:198:43\n    │\n198 │                 FarmItems.Item memory x = items().data(id);\n    │                                           ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:203:25\n    │\n203 │                         items().destroy(id);\n    │                         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:218:17\n    │\n218 │                 items().maintain(id, uint16(x.durability > damage ? x.durability - damage : 0), x.overclock);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:52:29\n   │\n52 │         return GridOperator(registry.module(7));\n   │                             ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:237:29\n    │\n237 │             uint256 boost = grid().outputBonus(e, uint256(keccak256(abi.encodePacked(p))) % 8);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:232:25\n    │\n232 │         uint64 target = uint64(ChainClock.number() + 2);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:245:43\n    │\n245 │                 FarmItems.Item memory x = items().data(id);\n    │                                           ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmEngine.sol:246:17\n    │\n246 │                 items().maintain(id, x.durability > 100 ? x.durability - 100 : 0, x.overclock);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:256:9\n    │\n256 │         fees().payWork(keeper, Params.Key.EntropyBounty, 1, startGas - gasleft());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmEngine.sol:191:32\n    │\n191 │                 f.theftUntil = uint64(e + 2);\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmEngine.sol:217:33\n    │\n217 │                 f.health[idx] = uint16(f.health[idx] > damage ? f.health[idx] - damage : 0);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmEngine.sol:218:38\n    │\n218 │                 items().maintain(id, uint16(x.durability > damage ? x.durability - damage : 0), x.overclock);\n    │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:270:20\n    │\n270 │         c.target = uint64(ChainClock.number() + 2);\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:289:13\n    │\n289 │             items().mint(c.player, k, r, c.guaranteed);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:87:26\n   │\n87 │         return FarmItems(registry.module(3));\n   │                          ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:289:13\n    │\n289 │             items().mint(c.player, k, r, c.guaranteed);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PackSale.sol:291:9\n    │\n291 │         emit PackOpened(id, n, c.expired);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/PackSale.sol:289:13\n    │\n289 │             items().mint(c.player, k, r, c.guaranteed);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/EconomyV35.t.sol:152:43\n    │\n152 │         assertEq(d.economy.boostAt(alice, block.timestamp), 500);\n    │                                           ━━━━━━━━━━━━━━━\n    ‡\n156 │         vm.warp(block.timestamp + 7 days);\n    │         ───────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/EconomyV35.t.sol:156:17\n    │\n156 │         vm.warp(block.timestamp + 7 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/PhasedReleaseV36.t.sol:145:49\n    │\n145 │         assertEq(d.civic.noticeAt(ENHANCEMENT), block.timestamp + 48 hours);\n    │                                                 ━━━━━━━━━━━━━━━\n146 │         vm.warp(block.timestamp + 48 hours - 1);\n    │         ─────────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/PhasedReleaseV36.t.sol:146:17\n    │\n146 │         vm.warp(block.timestamp + 48 hours - 1);\n    │         ────────━━━━━━━━━━━━━━━──────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:210:17\n    │\n210 │         vm.warp(block.timestamp + 1 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:67:29\n    │\n 67 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    ‡\n227 │         vm.warp(d.civic.noticeAt(3));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:68:30\n    │\n 68 │         a.expiresAt = uint64(block.timestamp + 6 hours);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n227 │         vm.warp(d.civic.noticeAt(3));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:220:39\n    │\n220 │         assertEq(d.civic.noticeAt(3), block.timestamp + 48 hours);\n    │                                       ━━━━━━━━━━━━━━━\n    ‡\n227 │         vm.warp(d.civic.noticeAt(3));\n    │         ──────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:283:17\n    │\n283 │         vm.warp(block.timestamp + 6 hours);\n    │         ────────━━━━━━━━━━━━━━━─────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:67:29\n    │\n 67 │         a.issuedAt = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━\n    ‡\n336 │         vm.warp(block.timestamp + 6 hours);\n    │         ────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:68:30\n    │\n 68 │         a.expiresAt = uint64(block.timestamp + 6 hours);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n336 │         vm.warp(block.timestamp + 6 hours);\n    │         ────────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:336:17\n    │\n336 │         vm.warp(block.timestamp + 6 hours);\n    │         ────────━━━━━━━━━━━━━━━─────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SwarmDeskV37.t.sol:565:17\n    │\n565 │         vm.warp(block.timestamp + 2 days);\n    │         ────────━━━━━━━━━━━━━━━────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/V34.t.sol:149:25\n    │\n149 │         uint256 start = block.timestamp;\n    │                         ━━━━━━━━━━━━━━━\n    ‡\n152 │         vm.warp(start + 60 minutes - 1);\n    │         ─────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/V34.t.sol:230:17\n    │\n230 │         vm.warp(block.timestamp + 5 minutes - 1);\n    │         ────────━━━━━━━━━━━━━━━───────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/V34.t.sol:233:17\n    │\n233 │         vm.warp(block.timestamp + 1);\n    │         ────────━━━━━━━━━━━━━━━───── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":63477,"exitCode":1,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/Clock.t.sol:ClockTest\n[PASS] testLocalEvmFutureBlockAnd256BlockBoundary() (gas: 220367)\n[PASS] testRobinhoodUsesArbSysNotL1EstimateAndHandlesExpiry() (gas: 233856)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 849.70µs (414.35µs CPU time)\n\nRan 4 tests for test/OracleConformanceV37.t.sol:OracleConformanceV37Test\n[PASS] testAcceptsOriginalProtocolSignature() (gas: 17497)\n[PASS] testDigestMatchesUnmodifiedProtocolVector() (gas: 12987)\n[PASS] testFreshVectorSignerSignature() (gas: 26896)\n[PASS] testSelectorsExactlyMatchLiveProtocol() (gas: 3935)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.99ms (1.24ms CPU time)\n\nRan 1 test for test/PredictionV34.t.sol:PredictionV34Test\n[PASS] testFullGraphPredictsPoolBeforeRegistryDeployment() (gas: 3702562)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 22.32ms (1.46ms 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 140.85µs (23.24µs CPU time)\n\nRan 5 tests for test/Registry.t.sol:RegistryTest\n[PASS] testAllModulePinsMatchExactPinnedCompilerArtifacts() (gas: 603103)\n[PASS] testAuthenticatedEnrollmentRejectsUncreatedWrongCodeAndWrongRegistry() (gas: 2834708)\n[PASS] testConstructorAcceptsEmptyGraphWithoutExternalCalls() (gas: 14247)\n[PASS] testCounterfeitRuntimeAtAnotherFactoryCannotEnroll() (gas: 1634123)\n[PASS] testCounterfeitRuntimeWithPoisonedCreditCannotEnroll() (gas: 5658337)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 22.68ms (5.93ms CPU time)\n\nRan 3 tests for test/StandardAdapter.t.sol:StandardAdapterTest\n[FAIL: assertion failed: 500000000000000000 != 0] testExistingHookKeyPreservedAndNoExtraFee() (gas: 350331)\n[PASS] testRequiresThirtyMinutesFreshOracleAndAuthorizedCallback() (gas: 194045)\n[FAIL: assertion failed: 1000000000000000000 != 500000000000000000] testSettlementSlippageFailurePreservesCredits() (gas: 239647)\nSuite result: FAILED. 1 passed; 2 failed; 0 skipped; finished in 24.54ms (2.20ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testConstructorRejectsMissingInputsAndDoesNotCallExternalContracts() (gas: 4190)\n[PASS] testForeignCallerDoesNotGetAnyAuthority() (gas: 42159558)\n[PASS] testImmutableGraphAndEip170Sizes() (gas: 167360)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 26.89ms (10.24ms CPU time)\n\nRan 5 tests for test/KeeperProfit.t.sol:KeeperProfitTest\n[PASS] testPaidPackEntropyKeeperProfit() (gas: 1193590)\nLogs:\n  paid pack entropy execution gas: 138956\n  paid pack entropy bounty wei: 3373225000000\n  paid pack entropy execution plus 21000 gas cost wei: 3199120000000\n\n[PASS] testPlanEntropyKeeperProfit() (gas: 1685312)\nLogs:\n  plan entropy execution gas: 162541\n  plan entropy bounty wei: 4471275000000\n  plan entropy execution plus 21000 gas cost wei: 3670820000000\n\n[PASS] testSeasonFinalizeThreeWinnersAndPrizeKeeperProfit() (gas: 3434663)\nLogs:\n  season finalize three winners and prize execution gas: 624431\n  season finalize three winners and prize bounty wei: 15356550000000\n  season finalize three winners and prize execution plus 21000 gas cost wei: 12908620000000\n\n[PASS] testSeasonPrepareIsConstantUnpaidWork() (gas: 1344508)\n[PASS] testStarterEntropyKeeperProfit() (gas: 325636)\nLogs:\n  starter entropy execution gas: 141816\n  starter entropy bounty wei: 3371200000000\n  starter entropy execution plus 21000 gas cost wei: 3256320000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 29.88ms (15.26ms CPU time)\n\nRan 6 tests for test/CivicV35.t.sol:CivicV35Test\n[PASS] testBillboardsBidRefundTextRulesAndPoolOnly() (gas: 942493)\n[PASS] testBlackMarketDescendingLimitedAndPause() (gas: 3867613)\n[PASS] testCollapseSuccessAndSingleOutageFailure() (gas: 816219)\n[PASS] testDormantDisabledAndNoticeOnce() (gas: 304448)\n[PASS] testOnceSeasonBoostBoundsAndSnapshot() (gas: 1743405)\n[PASS] testWarFreezeScoresConservationAndPayoutOnlyOnce() (gas: 1365692)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 39.53ms (30.88ms CPU time)\n\nRan 3 tests for test/HookBinding.t.sol:HookBindingTest\n[PASS] testHoldBeforeGameExistsThenBindOnceAndFlushExactStreams() (gas: 43230040)\n[FAIL: assertion failed: 10000000000000000 != 20000000000000000] testLookAlikeCannotBindEvenWhenTeamCalls() (gas: 1834519)\n[PASS] testWrongRouterAndMissingCodeRejectedBeforePermanentBind() (gas: 40971953)\nSuite result: FAILED. 2 passed; 1 failed; 0 skipped; finished in 40.30ms (24.56ms CPU time)\n\nRan 5 tests for test/ReviewV34.t.sol:ReviewV34Test\n[PASS] testCanonicalCompetingRegistryCannotTakeOverBinding() (gas: 8440320)\n[PASS] testDustBuyCannotConsumeGlobalBuyInterval() (gas: 333954)\n[PASS] testLateGreenEntrySettlesWithinReservedEnvelope() (gas: 4481623)\n[PASS] testMeaningfulSmallBuyCanUseLessThanMaximumBatch() (gas: 262820)\n[PASS] testSameConfigurationAtUncommittedCoordinatesCannotBind() (gas: 8505956)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 42.02ms (27.01ms CPU time)\n\nRan 2 tests for test/StandardMarket.t.sol:StandardMarketTest\n[FAIL: assertion failed: 0 != 17283229463219212; counterexample: calldata=0x5f96915b0000000000000000000000000000000000000000000000002ff879201159697c args=[3456645892643842428 [3.456e18]]] testFuzzStandardSellNeverAddsProgressiveSurcharge(uint96) (runs: 0, μ: 0, ~: 0)\nLogs:\n  Bound result 3456645892643842428\n\n[PASS] testStandardBuyOnePercentAllToRewardsNoNetworkShare() (gas: 1665105)\nSuite result: FAILED. 1 passed; 1 failed; 0 skipped; finished in 44.56ms (11.73ms CPU time)\n\nRan 7 tests for test/V33.t.sol:LaunchProtectionTest\n[FAIL: assertion failed: 100 != 225] testBuyTaxHasImmutableSteps() (gas: 60904)\n[PASS] testLaunchTaxChargedAndRoutedEntirelyToPool() (gas: 224514)\n[FAIL: assertion failed: 50000000000000000 != 112500000000000000] testNoBuySizeLimitAtAnyLaunchStep() (gas: 1680732)\n[FAIL: assertion failed: 3000000000000000 != 6750000000000000] testNormalBuyAfterDecayHasNoLaunchTax() (gas: 1466480)\n[PASS] testSellsPayNormalFeeDuringLaunch() (gas: 332951)\n[PASS] testSnipersSplittingBuysStillPayTheCurve() (gas: 643993)\n[PASS] testViewsBeforeInitialization() (gas: 4231719)\nSuite result: FAILED. 4 passed; 3 failed; 0 skipped; finished in 44.87ms (10.02ms CPU time)\n\nRan 6 tests for test/V4Integration.t.sol:V4IntegrationTest\n[PASS] testRealV4BuyAndSingleSwapSellTaxConserveSettlement() (gas: 2262094)\n[PASS] testRealV4ManipulatedSpotCannotInstantlySetBuybackQuote() (gas: 1894609)\n[PASS] testRealV4SmallBuyPaysPositiveKeeperMargin() (gas: 2060287)\nLogs:\n  real V4 0.2ETH buy gas: 1922333\n  real V4 buy bounty wei: 48426850000000\n\n[PASS] testRealV4SystemBuyUsesTwapAndOnlySystemFunds() (gas: 2067440)\n[PASS] testRealV4SystemSalesUseDepthTwapNormalFeesAndConserveTokens() (gas: 2217004)\n[PASS] testSystemBuybackOffsetsRecordedSellImbalance() (gas: 2488740)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 60.69ms (17.85ms CPU time)\n\nRan 5 tests for test/EndowmentEscrowV38.t.sol:EndowmentEscrowV38Test\n[PASS] testConstructorRejectsMissingInputs() (gas: 6401)\n[PASS] testForwardRejectsBadProofs() (gas: 2336627)\n[PASS] testForwardRequiresBalance() (gas: 661505)\n[PASS] testForwardSendsWholeBalanceOnceToAuthenticatedPoolAndFundsEndowment() (gas: 1523560)\n[PASS] testForwardWithRealEndowmentActivatesDrip() (gas: 10958492)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 61.05ms (20.04ms CPU time)\n\nRan 1 test for test/YieldFloorReviewV35.t.sol:IndependentYieldFloorReview\n[PASS] testFirstEpochItemQuotesKeepNonzeroFloorAtCorrectScale() (gas: 683745)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.29ms (1.10ms CPU time)\n\nRan 1 test for test/WarReviewV35.t.sol:IndependentWarReview\n[PASS] testWarWinnerCannotChangeAfterDeadline() (gas: 5455469)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.00ms (1.73ms CPU time)\n\nRan 3 tests for test/PotV35.t.sol:PotV35Test\n[PASS] testPotDepositRequiresActualTokensAndAuthority() (gas: 259417)\n[PASS] testPotSplitDistinctLotteryDistrictAndRollbackOnFullInventory() (gas: 11508147)\n[PASS] testPotUnclaimedRolloverOnlyAfterFourWeeksNoDoubleClaim() (gas: 6428266)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 37.08ms (38.01ms CPU time)\n\nRan 2 tests for test/Factory.t.sol:FactoryTest\n[PASS] testFactoryInvalidSearchRange() (gas: 5210)\n[PASS] testHookFactoryFlagsImmutableConfigAndIdempotence() (gas: 7386185)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 81.49ms (58.26ms CPU time)\n\nRan 2 tests for test/GridV35.t.sol:GridV35Test\n[PASS] testGreenAndCheapBothFavorTheStableDistrict() (gas: 4178258)\n[PASS] testReservedEventsHaveZeroLaunchWeightAndPlanOnlyWhenEnabled() (gas: 640847)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 32.75ms (16.85ms CPU time)\n\nRan 8 tests for test/PhasedReleaseV36.t.sol:PhasedReleaseV36Test\n[PASS] testBillboardsDisabledThenEnabled() (gas: 416475)\n[PASS] testEnableIsNoticedOnceNeverOffAndSwarmOnly() (gas: 362709)\n[PASS] testEnhancementDisabledThenEnabledOnce() (gas: 1107976)\n[PASS] testEverythingDeploysDisabledAndCoreStillWorks() (gas: 8235472)\n[PASS] testFuzzUnannouncedFeatureCannotBeEnabled(uint256) (runs: 256, μ: 30563, ~: 30418)\n[PASS] testLocksStakeAndLobbyDisabledThenEnabled() (gas: 2895493)\n[PASS] testPotDisabledFollowsV34RoutingThenEnabled() (gas: 443053)\n[PASS] testReservedEventsDisabledThenEnabled() (gas: 564561)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 86.12ms (76.25ms CPU time)\n\nRan 3 tests for test/Pause.t.sol:PauseTest\n[PASS] testOnlySwarmBoundedDurationAndCannotExtendPause() (gas: 245462)\n[PASS] testSalePausedWhileEntropyClaimsWithdrawalsAndEpochsContinue() (gas: 15316223)\n[PASS] testUnpauseCannotResetNextPauseCooldown() (gas: 196722)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 91.29ms (71.82ms CPU time)\n\nRan 6 tests for test/Market.t.sol:MarketTest\n[PASS] testBuyChargesExactlyOnePercentAllToRewards() (gas: 1701389)\n[FAIL: assertion failed: 1488000000000000000000 > 1475000000000000000000; counterexample: calldata=0x514be0d600000000000000000000000000000000000000005cfd60570b7b777f98036f9f args=[28778934088802723748999557023 [2.877e28]]] testFuzzTotalFeeHardCap(uint96) (runs: 4, μ: 1798398, ~: 1798341)\nLogs:\n  Bound result 88802723748999557023\n\n[PASS] testOnlyManagerCorrectPoolExactInputAndHookAddress() (gas: 112206)\n[PASS] testSingleDumpIncludesItselfAndFeeDecaysWithoutGriefReset() (gas: 16715063)\n[FAIL: assertion failed: 1584000000000000000 != 1564000000000000000] testTwapAveragesEthPriceAcrossUnequalPrices() (gas: 2309571)\n[FAIL: assertion failed: 990000000000000000 != 977500000000000000] testTwapWarmupAndFlashManipulationResistance() (gas: 36528)\nSuite result: FAILED. 3 passed; 3 failed; 0 skipped; finished in 123.99ms (69.68ms CPU time)\n\nRan 10 tests for test/Bounties.t.sol:BountiesTest\n[PASS] testBuyBountyProportionalCapNoDustCreditAndFailureRollback() (gas: 677619)\n[PASS] testEmptyRosterAndInvalidBatchReceiveNothing() (gas: 1435376)\n[PASS] testEveryWorkKindBoundedByHeartbeatAndAuthorizedProducer() (gas: 64268245)\n[PASS] testLazySettlementUnpaidAndCannotReplay() (gas: 7047785)\n[PASS] testOnlyFinalizePaidOnceAndEmptyWeekUnpaid() (gas: 2282852)\n[PASS] testPackEntropyCapturedOnceWithFullInventoryAndThroughPause() (gas: 3726209)\n[PASS] testPlanResolutionPaidOnceIncludingAdvanceForwarding() (gas: 2952808)\n[PASS] testRemovedWorkBountiesRejectedEvenFromOldProducer() (gas: 178997)\n[PASS] testStarterEntropySurvivesFullInventoryExpiryAndPauseWithoutReplayPayment() (gas: 5344801)\n[PASS] testWorkCreditRespectsZeroGasPricePriceCeilingAndUnitCap() (gas: 331583)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 128.22ms (174.24ms CPU time)\n\nRan 14 tests for test/V34.t.sol:V34Test\n[PASS] testBestFarmCapsAbsoluteSpendAndBreaksTiesByAddress() (gas: 4650264)\n[PASS] testBestFarmNeedsTwentyEpochsAndUsesCappedAbsoluteSpend() (gas: 4126444)\n[PASS] testBuybackSlippage150BpsMaxAndIntervalCannotBeBypassed() (gas: 751209)\n[PASS] testDonationsAndOrdinaryInflowsCannotPretendToBeEndowment() (gas: 1532134)\n[PASS] testEntropyAt256BoundaryAndAt257RearmsWithoutPayOrMint() (gas: 3301007)\n[PASS] testFirstRewardStartsCurrentEpochAtHalfTimeAndSnapshotCannotBeReplaced() (gas: 4898072)\n[PASS] testFreeFarmDoesNotDiluteDistrictOrClaimPaidPrize() (gas: 4707630)\n[PASS] testGameReadinessBothChecksRollbackEthAndTokenPurchase() (gas: 3638651)\n[PASS] testHookUninitializedCannotOpenOrStartEpochAndCallerCannotStartClock() (gas: 5218682)\n[FAIL: assertion failed: 100 != 225] testLaunchTaxExactBoundaries() (gas: 5094062)\n[PASS] testMythicGateEvaluatedAtRevealNotAtPayment() (gas: 1632280)\n[PASS] testPackOpeningFollowsHookAndNotLegacyDeployTimestamp() (gas: 102969)\n[PASS] testRemainderTransferredToPredictedPoolBeforeDeploymentAndNoApprovalNeeded() (gas: 2620700)\n[PASS] testStarterEntropyRearmsAfterClaimWindowAndNoDoubleMint() (gas: 773262)\nSuite result: FAILED. 13 passed; 1 failed; 0 skipped; finished in 118.09ms (98.03ms CPU time)\n\nRan 1 test for test/StandardV4Integration.t.sol:StandardV4IntegrationTest\n[PASS] testStandardAdapterRealPoolPaysExistingHookExactlyOnce() (gas: 1935995)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 257.93ms (2.68ms CPU time)\n\nRan 6 tests for test/Endowment.t.sol:EndowmentTest\n[PASS] testDirectTransferCannotBypassOrBackdateDrip() (gas: 366921)\n[PASS] testExactFundingFullLinearDripAndConservation() (gas: 815523)\n[PASS] testFuzzCumulativePaymentsCannotExceedVestedPrincipal(uint32,uint128) (runs: 256, μ: 515241, ~: 516677)\nLogs:\n  Bound result 2982\n  Bound result 3946\n\n[PASS] testNoTeamDonorOrSwarmWithdrawalOrReserveAuthority() (gas: 617162)\n[PASS] testParamsSnapshotCannotAccelerateOrRelockExistingEndowment() (gas: 300180)\n[PASS] testUnderfundingCannotActivateAndDonationsStayConserved() (gas: 452319)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 273.21ms (257.38ms CPU time)\n\nRan 2 tests for test/AutoRepairReviewV35.t.sol:IndependentAutoRepairReview\n[PASS] testAutomaticRepairRecordsHistoricalWeekBeforeCompletion() (gas: 5443019)\n[PASS] testLateAutomaticRepairCannotReopenSeasonEligibility() (gas: 4322747)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 371.14ms (39.59ms CPU time)\n\nRan 1 test for test/EndowmentGame.t.sol:EndowmentGameTest\n[PASS] testRealMiningCannotSpendFutureEndowment() (gas: 130408679)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 453.27ms (431.40ms CPU time)\n\nRan 14 tests for test/Events.t.sol:EventsTest\n[PASS] testCheapTariffAppliesCitywide() (gas: 6495182)\n[PASS] testColdPowerFireImmuneAndCleanPowerSurgeImmune() (gas: 8018330)\n[PASS] testFallbackAndExpiredSeedIndependentOfSwarmNumber() (gas: 1693704)\n[PASS] testFireNoCoolingZeroYieldColdPowerImmune() (gas: 6221605)\n[PASS] testGreenWaveRaisesDistrictMiningTenPercent() (gas: 6496351)\n[PASS] testLobbyOwnDistrictSplitDecayAndMinimumWeight() (gas: 1087527)\n[PASS] testOutageAndOffgridRoomMitigation() (gas: 7152692)\n[PASS] testPlansOnlyNextTwoOnceAndBoundedSeverity() (gas: 393099)\n[PASS] testRollingCapsAndInitialPositiveQuotaWithHostilePlans() (gas: 101349227)\n[PASS] testSeverityFloorThreeThousandOnChain() (gas: 363159)\n[PASS] testSurgeCanDestroyCommonButNeverLegendary() (gas: 6329222)\n[PASS] testSurgeDamagesExactlyOneItemAndCleanPowerImmune() (gas: 6370442)\n[PASS] testSurgeNeverDestroysLegendaryOrMythic() (gas: 9605310)\n[PASS] testTheftRouterDisabledAndRepairRestores() (gas: 6940140)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 553.58ms (662.07ms CPU time)\n\nRan 11 tests for test/Items.t.sol:ItemsTest\n[PASS] testComputeHashSupportHashAndBonusesReplaceDuo() (gas: 4809219)\n[PASS] testDurabilityWearRepairAndEnhancementMetadataPreserved() (gas: 8499748)\n[PASS] testEquipRarityGatesAndMythicGate() (gas: 4222359)\n[PASS] testFullStackRarityCapAndRoomFlags() (gas: 7839631)\n[PASS] testInventoryMintCannotExceedCapacityAndExpansionRises() (gas: 3372216)\n[PASS] testLockedItemCannotBeScrappedUntilEpochRolls() (gas: 6069945)\n[PASS] testOffgridSavings() (gas: 2753169)\n[PASS] testPaidXpCannotBypassRoomTwoAgeGate() (gas: 3784512)\n[PASS] testRoomGatesAndLevelProgression() (gas: 79286480)\n[PASS] testScrapPaysPoolYieldAndCannotRepeat() (gas: 7640286)\n[PASS] testSoulboundOnlyOwnFarmAndNoDuplicateTypes() (gas: 2302218)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 514.97ms (618.28ms CPU time)\n\nRan 8 tests for test/FeesParams.t.sol:FeesParamsTest\n[PASS] testAllDefaultParamsWithinHardBounds() (gas: 937724)\n[FAIL: assertion failed: 2000000000000000000 != 1000000000000000000] testBuyBackPoolOnlySlippageFailureRollbackAndDustGriefBlocked() (gas: 319640)\n[PASS] testExactEthSplitsHeartbeatCapAndPullPayments() (gas: 503829)\n[PASS] testFuzzNoStepAboveTenPercent(uint96) (runs: 256, μ: 44693, ~: 44789)\nLogs:\n  Bound result 8019\n\n[PASS] testFuzzSplitsConserveEveryWei(uint96) (runs: 256, μ: 192834, ~: 196375)\nLogs:\n  Bound result 21353187000492163744\n\n[PASS] testHeartbeatCapFixedAtOneEth() (gas: 201869)\n[PASS] testParamsStepCooldownBoundsAuthorityAndLetter() (gas: 195564)\n[PASS] testPoolNoPublicReserveRecycleOrPayment() (gas: 135323)\nSuite result: FAILED. 7 passed; 1 failed; 0 skipped; finished in 618.39ms (376.44ms CPU time)\n\nRan 9 tests for test/Packs.t.sol:PacksTest\n[PASS] testExactPaymentAndFutureBlockRequired() (gas: 1678475)\n[PASS] testExactRarityThresholdsAndMythicGate() (gas: 270966)\n[PASS] testExpiryRearmsWithoutMintingAndInventoryOpeningLimit() (gas: 3810271)\n[PASS] testFuzzVrgdaAlwaysBounded(uint32,uint32) (runs: 256, μ: 62327, ~: 63928)\nLogs:\n  Bound result 24213\n\n[PASS] testItemTypeDistributionExact() (gas: 589021)\n[PASS] testNoWalletGlobalOrTokenPackDailyLimit() (gas: 4448646)\n[PASS] testStarterWindowProofTokenIdOnceAndInventoryFailureRetry() (gas: 881553)\n[PASS] testTokenPackSameQuoteAndSplitWhenUsingWalletOrCredits() (gas: 77438415)\n[PASS] testVrgdaInitialStepDecayFloorCeilingAndBulkPricing() (gas: 1308962)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 652.72ms (627.44ms CPU time)\n\nRan 6 tests for test/Regression.t.sol:RegressionTest\n[PASS] testCableRepairRestoresOnlyRemainingHalfEpoch() (gas: 11960016)\n[PASS] testEmptyEpochPreservesLastSettledRateButResetsScrapAllowance() (gas: 11121302)\n[PASS] testFuzzCableRepairBlendHandlesNonMonotonicRarityBonuses(uint16) (runs: 256, μ: 1380363, ~: 1380307)\nLogs:\n  Bound result 9987\n\n[PASS] testRegisterOnlyAccountsDoNotAddSettlementWorkAndEmptyFarmCanRetire() (gas: 2074698)\n[PASS] testRepairAndPaidPackCannotRetroactivelyBoostEpoch() (gas: 9662591)\n[PASS] testUnlimitedFreshPacksCannotDrainPoolByScrapping() (gas: 9743803)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 836.70ms (951.83ms CPU time)\n\nRan 3 tests for test/Gas.t.sol:GasTest\n[PASS] testGasCommonActions() (gas: 10981698)\nLogs:\n  buy token pack: 931761\n  open one pack: 514087\n  equip: 983972\n  repair wallet: 623507\n  enhancement commit: 574253\n  expand: 397946\n  token pack wallet: 660658\n  withdraw: 251272\n  unequip: 415682\n\n[PASS] testGasFullFarmLongIdleBoundedChunks() (gas: 121689846)\nLogs:\n  settle full 24-item farm eight epochs after 40 idle: 12946108\n\n[PASS] testGasTypicalFarmSettlementHasNoBounty() (gas: 9062665)\nLogs:\n  settle typical three-item farm one epoch: 939511\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.02s (1.04s CPU time)\n\nRan 6 tests for test/SeasonAudit.t.sol:SeasonAuditTest\n[PASS] testAuditThresholdStrictAndNoWhaleSoftCap() (gas: 40942632)\n[PASS] testLotteryEntitlementSurvivesFullInventory() (gas: 132648909)\n[PASS] testPackSupplyDropOnlyActiveFarmsAtDoublePace() (gas: 11615322)\n[PASS] testParameterChangesCannotChangeClosedEpochBetweenBatches() (gas: 12680258)\n[PASS] testSeasonCannotFinalizeEarlyAndExpiredLotteryMustRearm() (gas: 125546248)\n[PASS] testWeeklyThreeDistinctTicketWinnersRarePackAndBestPrize() (gas: 125758541)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.37s (2.47s CPU time)\n\nRan 2 tests for test/ReservedEventsV35.t.sol:ReservedEventsV35Test\n[PASS] testFuzzReservedFestivalCannotExceedFifteenPercent(uint16) (runs: 256, μ: 4986045, ~: 4986043)\n[PASS] testReservedHeatwaveExtraCoolingWearAndBothProtections() (gas: 10320955)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.53s (1.58s CPU time)\n\nRan 9 tests for test/Epochs.t.sol:EpochsTest\n[PASS] testCannotAdvanceEarlyAndBountyOnce() (gas: 2537728)\n[PASS] testClaimsEveryEpochAndRedistributionIsNextEpoch() (gas: 12121580)\n[PASS] testGasAdvanceIndependentOfRoster() (gas: 913502463)\nLogs:\n  advance empty roster: 1300616\n  advance 1000 farms: 1489219\n\n[PASS] testNoCatchupEmissionDuringGap() (gas: 6330394)\n[PASS] testNoRetroactiveEquipmentAndBoundedBatches() (gas: 5860843)\n[PASS] testNoWhaleCapHashShares() (gas: 10292786)\n[PASS] testReferralOneLevelSetOnceNoSelf() (gas: 7611585)\n[PASS] testTaxCurveExactAndFloor() (gas: 27510)\n[PASS] testWithdrawFailureRollsBackAndReentrancyCannotClaimTwice() (gas: 7504989)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 13.72s (13.89s CPU time)\n\nRan 18 tests for test/EconomyV35.t.sol:EconomyV35Test\n[PASS] testAllEnhancementTableEndpointsAndGlobalBonusCap() (gas: 1482152)\n[PASS] testDurabilityBoundariesAndIdleNoWear() (gas: 38604008)\n[PASS] testEnhanceBurnFailureAndLevelGate() (gas: 1235033)\n[PASS] testEnhanceCapsNoticeUpwardOnlyAndThirtyDays() (gas: 356369)\n[PASS] testEnhanceCommitCannotPlaceScrapOrRetryAndCanRearm() (gas: 1826083)\n[PASS] testFeeSalesDepthSlippageCadenceAndNormalFeePot() (gas: 1733246)\n[PASS] testFreeAllowlistOnceWindowStarterScrapAndMetadata() (gas: 3021004)\n[PASS] testFreeRootRemainsFrozenAfterSevenDays() (gas: 44804)\n[PASS] testFreeRootWindowAndIndexLimit() (gas: 55526)\n[PASS] testFuzzPriceCurveDaysBounds(uint32,uint32) (runs: 256, μ: 88544, ~: 90059)\nLogs:\n  Bound result 30785331\n\n[PASS] testLockBonusRedistributesWithinReservedEmission() (gas: 11804781)\n[PASS] testLockEscrowNoEarlyExitAndWalletCap() (gas: 5449193)\n[PASS] testQuoteScalesLastSettlementAndHasFloor() (gas: 4327902)\n[PASS] testRepairYieldQuoteAndAutoRepairCreditsOnly() (gas: 10930062)\n[PASS] testRoomsChargeYieldDaysAndRetainAgeGates() (gas: 2658238)\n[PASS] testSystemSellDustCannotOccupyCadenceAndCappedHeartbeatReturnsTokens() (gas: 1552912)\n[PASS] testTokenOnlyGiftSplitsNoEthPeg() (gas: 1743373)\n[PASS] testZapAtomicMinOutPauseAndRefund() (gas: 1450703)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 17.88s (596.46ms CPU time)\n\nRan 20 tests for test/V33.t.sol:V33Test\n[PASS] testActionBeforeExpiryMovesBucketWithoutDoubleCount() (gas: 26287790)\n[PASS] testAdvanceIsConstantInExpiringFarms() (gas: 38986155)\n[PASS] testAgeCapsAtBoundaries() (gas: 204321)\n[PASS] testClaimDoesNotRecommitWhileBehind() (gas: 37733810)\n[PASS] testClaimRecommitsAndPackRecommits() (gas: 61593581)\n[PASS] testDistrictScoreAveragePerFarmAndTenPercentWalletCap() (gas: 4722957)\n[FAIL: assertion failed: 10000000000000000000 != 10500000000000000000] testHeartbeatCapExcessGoesToPoolAndBaseFeeStaysHalf() (gas: 251323)\n[PASS] testIdleFarmLeavesDenominatorAfterTwelveEpochs() (gas: 23726779)\n[PASS] testLaunchTaxDepositIsAllPoolAndMarketOnly() (gas: 136634)\n[PASS] testMergeRemoved() (gas: 515555)\n[PASS] testPackLobbySellSplit88Team10Heartbeat2() (gas: 390748)\n[PASS] testPackSaleOpensSixtyMinutesAfterLaunch() (gas: 1269945)\n[PASS] testPaidXpCannotBypassAgeGates() (gas: 59710130)\n[PASS] testPaidXpCappedPerDayActivityUncapped() (gas: 13398470)\n[PASS] testPartialRoomIsClippedNotReverted() (gas: 2170540)\n[PASS] testRewardsEarnedBeforeExpiryAreNeverLost() (gas: 48344180)\n[PASS] testSingleWhaleDistrictCannotWinAlone() (gas: 4662425)\n[PASS] testSyncRecommitsFromNextEpoch() (gas: 33828762)\n[PASS] testTokenPacksAlsoWaitForOpening() (gas: 60853)\n[PASS] testTopSpenderTrackingIsExact() (gas: 5530977)\nSuite result: FAILED. 19 passed; 1 failed; 0 skipped; finished in 18.52s (1.72s CPU time)\n\nRan 19 tests for test/SwarmDeskV37.t.sol:SwarmDeskV37Test\n[PASS] testBackupFailureUnknownFailureDeadlineAndPriceCap() (gas: 747581)\n[PASS] testBackupPullsExactPriceRecordsRequestAndRestrictsBodyAndCadence() (gas: 1182020)\n[PASS] testEmptyChainConstructorAndAuthenticatedBindingRejectSpoofs() (gas: 10547358)\n[PASS] testEventClampingAndFallbackWithoutAnswer() (gas: 1036530)\n[PASS] testExpiredOldSlotOldEpochAndUnexecutedAnswersNeverAct() (gas: 824274)\n[PASS] testFlatConstructorRejectsUnusedPackedBits() (gas: 1440400)\n[PASS] testForgedTamperedWrongSignerWrongDomainAndCallerRejected() (gas: 340341)\n[PASS] testFutureIssueWrongTypeMalformedLengthAndPriceNeverConsume() (gas: 306689)\n[PASS] testFuzzEveryParamHardBoundsAndTenPercentStep(uint8,uint248) (runs: 256, μ: 454252, ~: 456733)\nLogs:\n  Bound result 23\n\n[PASS] testNextSlotAcceptsSameQuestionAndChangedExecutionBytesReject() (gas: 1123454)\n[PASS] testNoAdminPathsAndEntireGraphUsesDesk() (gas: 388430)\n[PASS] testNoopRegulatorAcceptedAndParamsCooldownPreserved() (gas: 435384)\n[PASS] testRegulatorClampsParamsAnnouncesPhasesAndThirtyDayCaps() (gas: 1108090)\n[PASS] testReplayDifferentSourceAndSecondAnswerSameSlotIgnored() (gas: 1041159)\n[PASS] testRobinhoodNativeClockCallbackWithin200k() (gas: 343499)\n[PASS] testScheduleDeliveryStoresUnder200kThenExecutesTwoPlans() (gas: 964645)\n[PASS] testSubmitRelayAcceptsAttestedAnswerFromAnyoneOnce() (gas: 1063598)\n[PASS] testSubmitRelayRejectsForgedWrongQuestionStaleAndMalformed() (gas: 1791742)\n[PASS] testWrongQuestionUnknownRequestWeakPanelAndWindowRejected() (gas: 362838)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 18.38s (18.38s CPU time)\n\nRan 9 tests for test/LazyAccounting.t.sol:LazyAccountingTest\n[PASS] testAuditChargesTenPercentEvenAtHalfSeverityAndThresholdIsFrozen() (gas: 6223030)\n[PASS] testClaimCatchesUpWhilePacksPausedAndDoesNotEraseRemainingHistory() (gas: 26023632)\n[PASS] testExhaustedFarmCannotCollectRedistributionByRemainingIdle() (gas: 15344051)\n[PASS] testFuzzLazyEqualsIndependentEagerForRandomFarmsAndAllEvents(uint256) (runs: 256, μ: 46365049, ~: 46373362)\n[PASS] testGlobalAccumulatorAndWeightsAreSnapshottedBeforeMutations() (gas: 9423901)\n[PASS] testLateSeasonSettlementPaysMiningWithoutChangingFrozenWinners() (gas: 60268926)\n[PASS] testOneWeiMiningGreenCannotLockSettlementThroughEnvelopeRounding() (gas: 11201193)\n[PASS] testSparseMatureVintageConsumedBeforeRecentSlotAfterWrap() (gas: 43800883)\n[PASS] testStaleActionsRequireChunksAndNeverBlockGlobalAdvance() (gas: 41146529)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 18.52s (19.35s 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   | 609   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | buy       | 562   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | claim     | 598   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | equip     | 556   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | expand    | 562   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | freeClaim | 560   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | fundPot   | 609   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | lock      | 617   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | resolve   | 584   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | rollover  | 569   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | settle    | 580   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | tokenPack | 592   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unlock    | 637   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unplace   | 557   | 0       | 0        |\n╰-------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 10040\n  Bound result 978437222393138198062\n  Bound result 343777045636145830506\n  Bound result 2805\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 63.22s (63.18s CPU time)\n\nRan 43 test suites in 63.23s (159.85s CPU time): 239 tests passed, 13 failed, 1 skipped (253 total tests)\n\nFailing tests:\nEncountered 1 failing test in test/FeesParams.t.sol:FeesParamsTest\n[FAIL: assertion failed: 2000000000000000000 != 1000000000000000000] testBuyBackPoolOnlySlippageFailureRollbackAndDustGriefBlocked() (gas: 319640)\n\nEncountered 1 failing test in test/HookBinding.t.sol:HookBindingTest\n[FAIL: assertion failed: 10000000000000000 != 20000000000000000] testLookAlikeCannotBindEvenWhenTeamCalls() (gas: 1834519)\n\nEncountered 3 failing tests in test/Market.t.sol:MarketTest\n[FAIL: assertion failed: 1488000000000000000000 > 1475000000000000000000; counterexample: calldata=0x514be0d600000000000000000000000000000000000000005cfd60570b7b777f98036f9f args=[28778934088802723748999557023 [2.877e28]]] testFuzzTotalFeeHardCap(uint96) (runs: 4, μ: 1798398, ~: 1798341)\n[FAIL: assertion failed: 1584000000000000000 != 1564000000000000000] testTwapAveragesEthPriceAcrossUnequalPrices() (gas: 2309571)\n[FAIL: assertion failed: 990000000000000000 != 977500000000000000] testTwapWarmupAndFlashManipulationResistance() (gas: 36528)\n\nEncountered 2 failing tests in test/StandardAdapter.t.sol:StandardAdapterTest\n[FAIL: assertion failed: 500000000000000000 != 0] testExistingHookKeyPreservedAndNoExtraFee() (gas: 350331)\n[FAIL: assertion failed: 1000000000000000000 != 500000000000000000] testSettlementSlippageFailurePreservesCredits() (gas: 239647)\n\nEncountered 1 failing test in test/StandardMarket.t.sol:StandardMarketTest\n[FAIL: assertion failed: 0 != 17283229463219212; counterexample: calldata=0x5f96915b0000000000000000000000000000000000000000000000002ff879201159697c args=[3456645892643842428 [3.456e18]]] testFuzzStandardSellNeverAddsProgressiveSurcharge(uint96) (runs: 0, μ: 0, ~: 0)\n\nEncountered 3 failing tests in test/V33.t.sol:LaunchProtectionTest\n[FAIL: assertion failed: 100 != 225] testBuyTaxHasImmutableSteps() (gas: 60904)\n[FAIL: assertion failed: 50000000000000000 != 112500000000000000] testNoBuySizeLimitAtAnyLaunchStep() (gas: 1680732)\n[FAIL: assertion failed: 3000000000000000 != 6750000000000000] testNormalBuyAfterDecayHasNoLaunchTax() (gas: 1466480)\n\nEncountered 1 failing test in test/V33.t.sol:V33Test\n[FAIL: assertion failed: 10000000000000000000 != 10500000000000000000] testHeartbeatCapExcessGoesToPoolAndBaseFeeStaysHalf() (gas: 251323)\n\nEncountered 1 failing test in test/V34.t.sol:V34Test\n[FAIL: assertion failed: 100 != 225] testLaunchTaxExactBoundaries() (gas: 5094062)\n\nEncountered a total of 13 failing tests, 239 tests succeeded\n\nTip: Run `forge test --rerun` to retry only the 13 failed tests\nTip: Run `forge test --debug --match-test <TEST_NAME>` to inspect one failing test in the debugger\n\nFuzz seed: 0x2480402937133c5a158ced2c6ca49585b98d20dc4e62a1700533dce47c22bba9 (use `--fuzz-seed` to reproduce)\n","passed":false}],"detail":"test failed with exit code 1","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"e4024243a876dc081c92d5420c6d42d219934c17bf9a9aa45fe8d139a8ce3969","verifiedTreeHash":"7cd26c423eafbba65ae1a0c6d2664c454934f142","verifierVersion":"0.1.0+fb8278c5"}]}