{"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":"b29c69c8-bd5b-477b-bed1-9fceed0f35b5","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"4142c1c95542ebb65709ac50d0f941c7e8e2893eac94ad7a770401f943be94f8","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.5: extend v3.4 (job 3470cfdb, same repo). NO DEPLOY. Keep v3.4 unless changed below.\nX: https://x.com/IMDBlackout | Site: playblackout.xyz | Free pack claim (live): https://playblackout.xyz/freepack\n\nGOAL: token-first economy. Maintaining a farm stays profitable from mining alone; growing it (enhance, rooms, locks, lobby) costs more tokens than it mines, so growers buy the token. All token prices scale with mining (hours/days of yield at the last settled rate, with floors), never fixed amounts.\n\n1. TOKEN-ONLY\n- Packs only for the token (remove ETH packs). VRGDA in tokens, no ETH peg.\n- PACK PRICE RESEARCH: 2-3 parameter sets (start/floor/ceiling/decay/target), each as \"pack = N days of average farm mining, pays back in X days\". Simulate hype/steady/weak and a 50% token drop: week 1/2/3 cohort payback, team ETH, drawdown. Recommend one; requester picks; easy to switch before deploy.\n- \"Buy with ETH\" zap: one tx swaps ETH via the official pool (min-out) and buys the pack.\n- Packs and lobby split: 88% reward pool (tokens), 10% team, 2% heartbeat. Team/heartbeat shares sold to ETH by FeeRouter in small batches (max once per 5 min, 150 bps slippage, vs 30-min average, size adapts to depth). System sells pay normal fee only. Heartbeat cap 1 ETH, excess stays in pool.\n- Other token spends 100% to the reward pool. No burns. Swap fees unchanged.\n- Rooms: room 1 free; 2/3/4 cost 2/5/10 days of the farm's mining. Age/level gates stay.\n\n2. REPAIR\n- Wear 1%/active epoch; idle farms don't wear. Output tiers: 100-80% =100%, 80-60 =85%, 60-40 =65%, 40-20 =40%, <20 =0 (overheated). Event damage uses tiers.\n- Each 10% restored costs N hours of that item's mining (N default 6, swarm range 4-8). Optional auto-repair below a player threshold (default 80%) at settlement.\n- Targets: repair returns >=2x cost; sink ~10% of active mining; repairers net 85-90% vs <60% for non-repairers over 25 days.\n\n3. ENHANCEMENT (replaces overclock)\n- success / on failure / hash bonus / cost in item yield days:\n+1 95% none +3% 0.25 | +2 90% none +6% 0.5 | +3 80% none +10% 1 | +4 70% -1 lvl +14% 1.5 | +5 60% -1 +19% 2.5 | +6 50% -1, 10% burn +25% 4 | +7 40% -1, 25% burn +32% 6 | +8 30% -1, 50% burn +40% 9\n- Build up to +16, cap +8 at launch; swarm may raise to +12 then +16, upward only, >=30 days apart, announced. +9..+16 (success/burn on fail/bonus/days): 25/55/44/12, 22/60/48/15, 20/65/52/19, 18/70/56/24, 15/75/60/30, 12/80/64/37, 10/85/67/45, 8/90/70/55.\n- Commit + future block randomness, re-arm on expiry, no retry. +6..+8 need level 7, +9+ need level 10. One global cap for enhance+combos+sets. Simulate +12/+16 unlocks.\n\n4. LOCKS AND DISTRICT STAKE\n- Lock 7d (>=5 days of farm mining) =+5% hash, 14d (>=10) =+10%, 30d (>=20) =+20%. No early unlock. Redistribution within emission, capped.\n- Locked tokens = district grid stake. By district share of city stake: largest = negative events x0.5, positive x1.5; average x1; near zero = negative x1.5, positive x0.5. Never immune. Wallet max 10% of district stake.\n- Lobby token-only (split as above), 3-day boost, combined with stake into one \"grid stability\" per district. Fix: Green wave AND Cheap tariff favor stable districts.\n\n5. SEASON PRIZES\n- 50% of sell surcharge ETH buys tokens into a weekly pot. Best farm 40% + existing 1% weekly mining (minimum). Lottery 3 winners 30% + Epic/Legendary item. Best district 30% to paying farms + Rare pack. Unclaimed rolls over after 4 weeks. Prize items unscrappable until first paid purchase.\n\n6. FREE PACK ALLOWLIST (https://playblackout.xyz/freepack, max 500)\n- Merkle claim, one starter pack per wallet. Swarm sets root once within 7 days after launch, then immutable. 30-day claim window.\n- All starter-flagged items (allowlist + Identity MD) unscrappable until the farm's first paid purchase; mining normal.\n- ui/: \"Claim your free pack\" for listed wallets, link to the claim page for others.\n\n7. METADATA: FarmItems.uri(id) on-chain JSON (e.g. \"+7 ASIC\", rarity, durability, tier, starter) + on-chain pixel SVG per kind/rarity (navy/purple, #39E6FF, #FFE600, #FF3DF2), glow at +12. Still soulbound.\n\n8. BILLBOARDS: 8 (one per district), weekly token auction, 32-char text + X handle, no links, swarm may blank offensive text, 100% to pool. Views for site and letters.\n\n9. EXTENSIBILITY\n- buyPackFor(recipient) for future gifting add-ons.\n- Reserved events, weight 0: Heatwave (extra cooling wear; Airflow/Cold Power protected), Festival (+5-15% district output).\n- Once per season the swarm may give one district 0-15% output for a week.\n- Documented read API: farms, items by owner, tiers, repair/enhance quotes, locks, stability, events, season and pot, billboards, launch status.\n\n10. DORMANT MODULES (deployed off, not in public docs/site). Swarm enables each once with 48h notice. Tested now.\n- District war: 48h, two districts, token war chests (wallet max 10%), score = chest + active hash. Winner +10% output a week, chest back + half of loser chest pro-rata; other half to pool.\n- Grid collapse: city-wide 24h token goal. Met = Green wave for all for a day; missed = one city-wide outage epoch. Tokens to pool.\n- Black market: weekly descending-price auction of 1-3 rare items for tokens, limited supply, to pool.\n\n11. PACKAGING: max 8 contracts per IMD contract job. Propose merged modules or a third launch via GameRegistry. Keep v3.4 binding/readiness guarantees.\n\n12. SIMULATION: maintain-only players profitable; growers spend 1.3-1.5x what they mine (report share bought on market). Report pack options, repair groups, enhance outcomes, sinks by type, locked supply, season pot (target 0.3-1 ETH value/week steady), team ETH after token sales, system sell pressure, cohort payback, drawdown, vs v3.4.\n\n13. GENERAL: no upgrades. Pause only new pack purchases (incl. zap) and black market buys, 72h max, auto-expiry. Update ui/ (not dormant modules). forge build/test/fmt pass; invariants for token conservation, pricing, locks, allowlist, pot. Second contributor adversarial review; fix high/medium. Report: changes, tests, sim tables, pack options with recommendation, open questions. No deploy, no broadcast, no token actions.","parentJobId":"3470cfdb-98c6-42dd-87c4-547701799dc9","planHash":"d0e03f9a12dd5691ceee0d213ea6af613cb1d07b027e1e1c4d8e95a3e3791e2f","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":"51731","feedbackHash":"41d24947929a5da560ffce20e6af8ca6d1fced83c5c78a79cdefc876444424b4","nodeKey":"build_contract_project","submissionHash":"4142c1c95542ebb65709ac50d0f941c7e8e2893eac94ad7a770401f943be94f8","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"5be05c79c77bcfe04edd36edfc399afcd721cf7c85831605c37f200eacdd5bcc","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"01eff85b41bb0687738e2385cee658a4c50f9fd279980b0ee6e1825c9eb19460","device":"6960837f8e61d811","findings":[],"hash":"4142c1c95542ebb65709ac50d0f941c7e8e2893eac94ad7a770401f943be94f8","nodeId":"f31cf364-c2ba-4f49-a2ea-f71abc2adb6a","outcome":"completed","summary":"Implemented BLACKOUT v3.5 contracts, UI, simulations, and operational documentation. No deployment, broadcast, or live token actions.\n\n- `forge build`, `forge test`, and `forge fmt --check` passed: **215 tests passed**, one optional fork skipped.\n- **34 Python tests** and **2 JavaScript test files** passed.\n- Independent review completed; all three confirmed medium findings fixed.\n- Protected configuration and dependencies unchanged.\n\n**Balanced** is the recommended pack profile; selection remains gated pending requester choice.\n\nThe [implementation report](/root/nft6/.identitymd/work/b29c69c8-bd5b-477b-bed1-9fceed0f35b5/f31cf364-c2ba-4f49-a2ea-f71abc2adb6a/report.md) includes simulation tables, verification evidence, assumptions, and open launch decisions.","treeHash":"cc73238d20375c74f1016fb8c1281d239f002e35","usage":{"cachedInputTokens":21565952,"inputTokens":445115,"model":"gpt-6-astra","outputTokens":131026,"runtime":"codex","turns":20,"wallClockMs":5103379}}],"verification":[{"checks":[{"durationMs":170282,"exitCode":0,"name":"build","output":"Compiling 165 files with Solc 0.8.26\nSolc 0.8.26 finished in 169.93s\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:258:22:\n    |\n258 |     function _record(bool sell, uint256 amount) private {\n    |                      ^^^^^^^^^\nNote: The other declaration is here:\n   --> src/V4Market.sol:444:5:\n    |\n444 |     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 (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:145:5:\n    |\n145 |     function ready() public view returns (bool) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[boolean-cst]: misuse of a boolean constant\n   ╭▸ src/Enhancement.sol:51:63\n   │\n51 │             (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[missing-events-access-control]: `claims` is changed without an event but is used for access control\n   ╭▸ src/StarterClaim.sol:98:9\n   │\n98 │         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:119:9\n    │\n119 │         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:120:9\n    │\n120 │         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/StarterClaim.sol:31:13\n   │\n31 │         if (block.timestamp < launchTime() || block.timestamp > launchTime() + 7 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:31:47\n   │\n31 │         if (block.timestamp < launchTime() || block.timestamp > launchTime() + 7 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/Enhancement.sol:62:34\n   │\n62 │         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:79:9\n   │\n79 │         core.prepareEnhancement(msg.sender, item, cost, wallet);\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/StarterClaim.sol:54:9\n   │\n54 │         farm().register(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/Enhancement.sol:83:9\n   │\n83 │         emit EnhancementCommitted(id, msg.sender, item, target, ChainClock.number() + 2, 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/StarterClaim.sol:42:13\n   │\n42 │         if (block.timestamp >= freeClaimEnds()) revert TooEarly();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/Enhancement.sol:82:50\n   │\n82 │         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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/StarterClaim.sol:55:9\n   │\n55 │         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:56:9\n   │\n56 │         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:53:40\n   │\n53 │         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[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/Enhancement.sol:94:24\n   │\n94 │             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/StarterClaim.sol:99:9\n   │\n99 │         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:91:13\n   │\n91 │         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-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Enhancement.sol:116:21\n    │\n116 │         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:117:14\n    │\n117 │         else inventory.maintain(a.item, x.durability, level);\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:91:58\n   │\n91 │         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:100:9\n    │\n100 │         emit StarterCommitted(tokenId, msg.sender, target);\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:118:9\n    │\n118 │         emit EnhancementResolved(id, success, burned, level);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StarterClaim.sol:97:25\n   │\n97 │         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/StarterClaim.sol:121:9\n    │\n121 │         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/Economy.sol:59:39\n   │\n59 │             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:91:45\n   │\n91 │         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:91:35\n   │\n91 │         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:83:45\n   │\n83 │         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:83:35\n   │\n83 │         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:48:30\n   │\n48 │         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:87:64\n   │\n87 │         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:95:30\n   │\n95 │             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:95:23\n   │\n95 │             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:62:17\n   │\n62 │             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:63:21\n   │\n63 │             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:64:13\n   │\n64 │             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:84:37\n   │\n84 │         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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Economy.sol:73:27\n   │\n73 │         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:86:16\n   │\n86 │         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:87:28\n   │\n87 │         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[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/Billboards.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 `_status` is updated\n    ╭▸ src/FeeRouter.sol:151:9\n    │\n151 │         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:152:9\n    │\n152 │         emit TokensRouted(reward, t, h);\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/Economy.sol:128:9\n    │\n128 │         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:141:9\n    │\n141 │         IEconomyCore(registry.module(2)).syncFor(msg.sender);\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/FeeRouter.sol:160:9\n    │\n160 │         market().buy{value: msg.value}(minOut, recipient);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/Billboards.sol:83:17\n   │\n83 │                 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:89:17\n   │\n89 │                 revert InvalidValue();\n   │                 ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/FeeRouter.sol:160:9\n    │\n160 │         market().buy{value: msg.value}(minOut, recipient);\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/Economy.sol:142:9\n    │\n142 │         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:132:42\n    │\n132 │         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:132:67\n    │\n132 │         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:132:109\n    │\n132 │         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:140:13\n    │\n140 │         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 `heartbeatTokens` is updated\n    ╭▸ src/FeeRouter.sol:178:13\n    │\n178 │             RewardPool(rewardPool()).recordInflow(excess);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `locks` is updated\n    ╭▸ src/Economy.sol:148:9\n    │\n148 │         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:159:9\n    │\n159 │         IEconomyCore(registry.module(2)).syncFor(msg.sender);\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:193:9\n    │\n193 │         m.sell(amount, minOut, address(this));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-balance\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Economy.sol:147:30\n    │\n147 │         if (l.amount == 0 || block.timestamp < l.end) 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/Billboards.sol:71:9\n   │\n71 │         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/Economy.sol:161:9\n    │\n161 │         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/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[reentrancy-no-eth]: external call can be reentered before `heartbeatBalance` is updated\n    ╭▸ src/FeeRouter.sol:193:9\n    │\n193 │         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:198:22\n    │\n198 │         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:173:30\n    │\n173 │         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:203:9\n    │\n203 │         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:193:9\n    │\n193 │         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:215:9\n    │\n215 │         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:218:9\n    │\n218 │         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:208:29\n    │\n208 │         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:219:9\n    │\n219 │         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:215:9\n    │\n215 │         market().buy{value: amount}(minOut, season());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/FeeRouter.sol:260:22\n    │\n260 │         (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:262:9\n    │\n262 │         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:281:9\n    │\n281 │         market().buy{value: ethAmount}(minOut, rewardPool());\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: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 `_status` is updated\n    ╭▸ src/FeeRouter.sol:284:50\n    │\n284 │         if (!RewardPool(rewardPool()).endowed()) RewardPool(rewardPool()).recordInflow(received);\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FeeRouter.sol:272:29\n    │\n272 │         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:288:9\n    │\n288 │         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:289:9\n    │\n289 │         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:281:9\n    │\n281 │         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 `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[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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/StarterClaim.sol:137:20\n    │\n137 │         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/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[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[missing-events-arithmetic]: `heldBase` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:414:9\n    │\n414 │         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: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[missing-events-arithmetic]: `heldSellTax` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:415:9\n    │\n415 │         heldSellTax += excess;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/StarterClaim.sol:152:13\n    │\n152 │             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/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[missing-events-arithmetic]: `heldBase` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:475:9\n    │\n475 │         heldBase += base;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\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[calls-loop]: external call inside a loop\n   ╭▸ src/StarterClaim.sol:79:26\n   │\n79 │         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:152:13\n    │\n152 │             items().mint(c.player, k, r, true);\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/GridOperator.sol:106:16\n    │\n106 │         return block.timestamp < uint256(l.at) + 3 days ? l.amount : 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/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-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/StarterClaim.sol:154:9\n    │\n154 │         emit StarterResolved(tokenId, h == bytes32(0));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:117:13\n    │\n117 │             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:118:28\n    │\n118 │             if (stake[i] > largest) largest = stake[i];\n    │                            ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\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[unused-return]: return value of an external call is not used\n    ╭▸ src/StarterClaim.sol:152:13\n    │\n152 │             items().mint(c.player, k, r, true);\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[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[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:116:24\n    │\n116 │             stake[i] = eco.districtStake(i);\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/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/GridOperator.sol:149:52\n    │\n149 │         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/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[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[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[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:111:31\n    │\n111 │         Economy eco = Economy(registry.module(10));\n    │                               ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\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[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:130:35\n    │\n130 │         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:163:33\n    │\n163 │             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:110:21\n    │\n110 │         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:157:20\n    │\n157 │         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:158:21\n    │\n158 │         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/GridOperator.sol:240:9\n    │\n240 │         fees().payWork(keeper, Params.Key.EntropyBounty, 1, startGas - gasleft());\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/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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Economy.sol:172:23\n    │\n172 │         previous[p] = prev;\n    │                       ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Economy.sol:183:25\n    │\n183 │         for (uint256 i; i < 10 && p != address(0); ++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:199:57\n    │\n199 │             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:200:27\n    │\n200 │             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:215:13\n    │\n215 │             sum += w;\n    │             ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\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[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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:223:34\n    │\n223 │                     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[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[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[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[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[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[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: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[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[missing-events-access-control]: `commits` is changed without an event but is used for access control\n    ╭▸ src/PackSale.sol:263:9\n    │\n263 │         c.seed = keccak256(abi.encode(h, address(this), id));\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/PackSale.sol:71:16\n   │\n71 │         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:77:13\n   │\n77 │         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/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/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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PackSale.sol:126:16\n    │\n126 │         return block.timestamp >= opensAt() && !paused();\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\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[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[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/PackSale.sol:153:13\n    │\n153 │         p = Economy(registry.module(10)).averageDaily() * daysPrice / 1 ether;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/PackSale.sol:139:27\n    │\n139 │         uint256 elapsed = block.timestamp > opensAt() ? block.timestamp - opensAt() : 0;\n    │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\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/PackSale.sol:141:24\n    │\n141 │         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[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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:141:50\n    │\n141 │         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[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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:144:30\n    │\n144 │             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[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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:146:30\n    │\n146 │             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:146:75\n    │\n146 │             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:150:37\n    │\n150 │         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:120:28\n    │\n120 │         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:120:16\n    │\n120 │         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:122:27\n    │\n122 │             : 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:122:15\n    │\n122 │             : 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:100:23\n    │\n100 │         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:144:47\n    │\n144 │             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:153:21\n    │\n153 │         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:153:13\n    │\n153 │         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:61:33\n   │\n61 │         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:61:25\n   │\n61 │         uint256 daily = Economy(registry.module(10)).averageDaily();\n   │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\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[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/PackSale.sol:56:9\n   │\n56 │         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/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[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[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-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-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-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[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[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[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-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 `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[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/PackSale.sol:191:28\n    │\n191 │         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-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-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[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[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-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[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[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 `_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-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[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[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-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[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PackSale.sol:208:9\n    │\n208 │         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:209:9\n    │\n209 │         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:216:9\n    │\n216 │         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 `_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/PackSale.sol:243:9\n    │\n243 │         emit PackCommitted(id, p, n, target, guaranteed);\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/PackSale.sol:215:13\n    │\n215 │         if (t.balanceOf(address(fees())) - before_ != cost) 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/PackSale.sol:221:25\n    │\n221 │         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/PackSale.sol:241:25\n    │\n241 │         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:265:9\n    │\n265 │         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/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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:279:20\n    │\n279 │         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:298:13\n    │\n298 │             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:96:26\n   │\n96 │         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:298:13\n    │\n298 │             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:300:9\n    │\n300 │         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:298:13\n    │\n298 │             items().mint(c.player, k, r, c.guaranteed);\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: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 `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[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/Civic.sol:55:13\n   │\n55 │         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 `_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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/Civic.sol:78:75\n   │\n78 │         if (feature >= 3 || 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:97:17\n   │\n97 │         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:97:74\n   │\n97 │         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/FarmCore.sol:513:9\n    │\n513 │         items().destroy(id);\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Civic.sol:131:13\n    │\n131 │             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: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/Civic.sol:167:14\n    │\n167 │         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:167:66\n    │\n167 │         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:146:42\n    │\n146 │         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[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/Civic.sol:65:9\n   │\n65 │         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:186:40\n    │\n186 │         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-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-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Civic.sol:196:9\n    │\n196 │         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:222:67\n    │\n222 │             !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:233:34\n    │\n233 │         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:237:9\n    │\n237 │         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:241:34\n    │\n241 │         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:255:13\n    │\n255 │         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:274:48\n    │\n274 │         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:292:9\n    │\n292 │         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:293:14\n    │\n293 │         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:294:9\n    │\n294 │         emit LotBought(w, msg.sender, id, cost);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-arithmetic]: `otherInflow` is changed without an event but is used in arithmetic\n   ╭▸ src/RewardPool.sol:81:23\n   │\n81 │         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[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/V4Market.sol:167:24\n    │\n167 │         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:168:26\n    │\n168 │         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:169:29\n    │\n169 │         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:170:9\n    │\n170 │         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:171:29\n    │\n171 │         if (launchTax != 0) emit LaunchTaxFlushed(launchTax);\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/RewardPool.sol:73:17\n   │\n73 │             if (token().balanceOf(address(this)) - before_ != missing) revert InvalidValue();\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/RewardPool.sol:97:13\n   │\n97 │         if (token().balanceOf(address(this)) - before_ != amount) revert InvalidValue();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\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:105:9\n    │\n105 │         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:113:67\n    │\n113 │     function pay(address to, uint256 amount) external onlyRewards nonReentrant {\n    │                                                                   ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\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[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-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-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[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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:221:13\n    │\n221 │             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:234:9\n    │\n234 │         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:228:38\n    │\n228 │             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:231:23\n    │\n231 │         cumulative += (1e60 / lastPrice) * (now_ - 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:226:13\n    │\n226 │         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:226:27\n    │\n226 │         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:227:38\n    │\n227 │         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/V4Market.sol:229:53\n    │\n229 │             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:240:50\n    │\n240 │         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:247:35\n    │\n247 │         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:262:13\n    │\n262 │         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:268:13\n    │\n268 │         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:264:24\n    │\n264 │             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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:270:24\n    │\n270 │             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:273:24\n    │\n273 │             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:274:24\n    │\n274 │             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:276:23\n    │\n276 │             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:277:23\n    │\n277 │             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:287:17\n    │\n287 │                 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:288:17\n    │\n288 │                 b += shortVolumes[i].buys;\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:286:17\n    │\n286 │             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:296:17\n    │\n296 │             if (uint256(longVolumes[i].period) + 24 > current) {\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:351:13\n    │\n351 │         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:350:13\n    │\n350 │         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:356:27\n    │\n356 │         uint256 decayed = storedFeeWad > fall ? storedFeeWad - fall : projectBps() * 1 ether;\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:377:13\n    │\n377 │             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:370:25\n    │\n370 │         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[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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:373:19\n    │\n373 │         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:373:27\n    │\n373 │         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:382:43\n    │\n382 │         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/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-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:407:9\n    │\n407 │         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:393:27\n    │\n393 │         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:396:28\n    │\n396 │             _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:400:26\n    │\n400 │         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[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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:400:34\n    │\n400 │         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:408:42\n    │\n408 │         return (this.afterSwap.selector, int128(int256(base + excess + network)));\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:408:49\n    │\n408 │         return (this.afterSwap.selector, int128(int256(base + excess + network)));\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/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[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/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[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[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-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/V4Market.sol:426:31\n    │\n426 │         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/V4Market.sol:452:31\n    │\n452 │         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:478:22\n    │\n478 │         (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:460:39\n    │\n460 │             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:463:25\n    │\n463 │         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:464:26\n    │\n464 │         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:465:44\n    │\n465 │         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:466:25\n    │\n466 │         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:466:33\n    │\n466 │         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:473:9\n    │\n473 │         manager.settle();\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\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[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[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[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[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[reentrancy-no-eth]: external call can be reentered before `updatedAt` is updated\n    ╭▸ src/V4Market.sol:459:24\n    │\n459 │           int256 delta = manager.swap(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━━━━┛\n460 │ ┃             key(), SwapParams(false, -int256(amount), 1461446703485210103287273052203988822378723970341), \"\"\n461 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\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[reentrancy-no-eth]: external call can be reentered before `updatedAt` is updated\n    ╭▸ src/V4Market.sol:492:24\n    │\n492 │         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:492:62\n    │\n492 │         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:494:27\n    │\n494 │         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:495:29\n    │\n495 │         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:497:30\n    │\n497 │             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:498:20\n    │\n498 │                 || 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:498:28\n    │\n498 │                 || 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:503:9\n    │\n503 │         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:504:40\n    │\n504 │         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:504:48\n    │\n504 │         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:507:27\n    │\n507 │         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:507:35\n    │\n507 │         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-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/V4Market.sol:514:22\n    │\n514 │         (bool ok,) = networkRecipient.call{value: amount}(\"\");\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/V4Market.sol:516:9\n    │\n516 │         emit NetworkPaid(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\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/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":38263,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/RobinhoodFork.t.sol:RobinhoodForkTest\n[SKIP] testForkArbSysAndHistoricalHash() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 281.23µs (92.01µs CPU time)\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 432.23µs (369.95µs CPU time)\n\nRan 1 test for test/YieldFloorReviewV35.t.sol:IndependentYieldFloorReview\n[PASS] testFirstEpochItemQuotesKeepNonzeroFloorAtCorrectScale() (gas: 639113)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.14ms (949.36µs CPU time)\n\nRan 1 test for test/WarReviewV35.t.sol:IndependentWarReview\n[PASS] testWarWinnerCannotChangeAfterDeadline() (gas: 5403540)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.77ms (2.55ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testConstructorRejectsMissingInputsAndDoesNotCallExternalContracts() (gas: 4190)\n[PASS] testForeignCallerDoesNotGetAnyAuthority() (gas: 36943648)\n[PASS] testImmutableGraphAndEip170Sizes() (gas: 167491)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 13.43ms (4.46ms CPU time)\n\nRan 1 test for test/PredictionV34.t.sol:PredictionV34Test\n[PASS] testFullGraphPredictsPoolBeforeRegistryDeployment() (gas: 3662360)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 13.99ms (661.26µs CPU time)\n\nRan 2 tests for test/Factory.t.sol:FactoryTest\n[PASS] testFactoryInvalidSearchRange() (gas: 5140)\n[PASS] testHookFactoryFlagsImmutableConfigAndIdempotence() (gas: 5006358)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 18.76ms (9.69ms CPU time)\n\nRan 5 tests for test/Registry.t.sol:RegistryTest\n[PASS] testAllModulePinsMatchExactPinnedCompilerArtifacts() (gas: 601244)\n[PASS] testAuthenticatedEnrollmentRejectsUncreatedWrongCodeAndWrongRegistry() (gas: 2805280)\n[PASS] testConstructorAcceptsEmptyGraphWithoutExternalCalls() (gas: 14247)\n[PASS] testCounterfeitRuntimeAtAnotherFactoryCannotEnroll() (gas: 1509054)\n[PASS] testCounterfeitRuntimeWithPoisonedCreditCannotEnroll() (gas: 5426607)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 19.58ms (3.63ms CPU time)\n\nRan 3 tests for test/HookBinding.t.sol:HookBindingTest\n[PASS] testHoldBeforeGameExistsThenBindOnceAndFlushExactStreams() (gas: 42800196)\n[PASS] testLookAlikeCannotBindEvenWhenTeamCalls() (gas: 1937661)\n[PASS] testWrongRouterAndMissingCodeRejectedBeforePermanentBind() (gas: 40406538)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 19.66ms (11.05ms CPU time)\n\nRan 2 tests for test/GridV35.t.sol:GridV35Test\n[PASS] testGreenAndCheapBothFavorTheStableDistrict() (gas: 4150527)\n[PASS] testReservedEventsHaveZeroLaunchWeightAndCannotBePlanned() (gas: 371543)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 22.68ms (8.58ms CPU time)\n\nRan 3 tests for test/StandardAdapter.t.sol:StandardAdapterTest\n[PASS] testExistingHookKeyPreservedAndNoExtraFee() (gas: 332412)\n[PASS] testRequiresThirtyMinutesFreshOracleAndAuthorizedCallback() (gas: 194045)\n[PASS] testSettlementSlippageFailurePreservesCredits() (gas: 261846)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 8.38ms (917.00µs CPU time)\n\nRan 6 tests for test/CivicV35.t.sol:CivicV35Test\n[PASS] testBillboardsBidRefundTextRulesAndPoolOnly() (gas: 946867)\n[PASS] testBlackMarketDescendingLimitedAndPause() (gas: 3891628)\n[PASS] testCollapseSuccessAndSingleOutageFailure() (gas: 833225)\n[PASS] testDormantDisabledAndNoticeOnce() (gas: 321451)\n[PASS] testOnceSeasonBoostBoundsAndSnapshot() (gas: 1740817)\n[PASS] testWarFreezeScoresConservationAndPayoutOnlyOnce() (gas: 1382669)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 29.93ms (15.71ms CPU time)\n\nRan 5 tests for test/KeeperProfit.t.sol:KeeperProfitTest\n[PASS] testPaidPackEntropyKeeperProfit() (gas: 1197695)\nLogs:\n  paid pack entropy execution gas: 138888\n  paid pack entropy bounty wei: 3373225000000\n  paid pack entropy execution plus 21000 gas cost wei: 3197760000000\n\n[PASS] testPlanEntropyKeeperProfit() (gas: 1681911)\nLogs:\n  plan entropy execution gas: 161864\n  plan entropy bounty wei: 4456600000000\n  plan entropy execution plus 21000 gas cost wei: 3657280000000\n\n[PASS] testSeasonFinalizeThreeWinnersAndPrizeKeeperProfit() (gas: 3433679)\nLogs:\n  season finalize three winners and prize execution gas: 624363\n  season finalize three winners and prize bounty wei: 15356550000000\n  season finalize three winners and prize execution plus 21000 gas cost wei: 12907260000000\n\n[PASS] testSeasonPrepareIsConstantUnpaidWork() (gas: 1344152)\n[PASS] testStarterEntropyKeeperProfit() (gas: 325338)\nLogs:\n  starter entropy execution gas: 141769\n  starter entropy bounty wei: 3371175000000\n  starter entropy execution plus 21000 gas cost wei: 3255380000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 32.14ms (14.80ms CPU time)\n\nRan 3 tests for test/Pause.t.sol:PauseTest\n[PASS] testOnlySwarmBoundedDurationAndCannotExtendPause() (gas: 245136)\n[PASS] testSalePausedWhileEntropyClaimsWithdrawalsAndEpochsContinue() (gas: 15283452)\n[PASS] testUnpauseCannotResetNextPauseCooldown() (gas: 196502)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 44.83ms (36.27ms CPU time)\n\nRan 1 test for test/StandardV4Integration.t.sol:StandardV4IntegrationTest\n[PASS] testStandardAdapterRealPoolPaysExistingHookExactlyOnce() (gas: 1965961)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 51.25ms (1.65ms CPU time)\n\nRan 2 tests for test/AutoRepairReviewV35.t.sol:IndependentAutoRepairReview\n[PASS] testAutomaticRepairRecordsHistoricalWeekBeforeCompletion() (gas: 5439223)\n[PASS] testLateAutomaticRepairCannotReopenSeasonEligibility() (gas: 4318977)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 57.20ms (41.49ms CPU time)\n\nRan 14 tests for test/V34.t.sol:V34Test\n[PASS] testBestFarmCapsAbsoluteSpendAndBreaksTiesByAddress() (gas: 4649076)\n[PASS] testBestFarmNeedsTwentyEpochsAndUsesCappedAbsoluteSpend() (gas: 4125454)\n[PASS] testBuybackSlippage150BpsMaxAndIntervalCannotBeBypassed() (gas: 772648)\n[PASS] testDonationsAndOrdinaryInflowsCannotPretendToBeEndowment() (gas: 1518556)\n[PASS] testEntropyAt256BoundaryAndAt257RearmsWithoutPayOrMint() (gas: 3309972)\n[PASS] testFirstRewardStartsCurrentEpochAtHalfTimeAndSnapshotCannotBeReplaced() (gas: 4894308)\n[PASS] testFreeFarmDoesNotDiluteDistrictOrClaimPaidPrize() (gas: 4706561)\n[PASS] testGameReadinessBothChecksRollbackEthAndTokenPurchase() (gas: 3655223)\n[PASS] testHookUninitializedCannotOpenOrStartEpochAndCallerCannotStartClock() (gas: 5242745)\n[PASS] testLaunchTaxExactBoundaries() (gas: 5130146)\n[PASS] testMythicGateEvaluatedAtRevealNotAtPayment() (gas: 1636801)\n[PASS] testPackOpeningFollowsHookAndNotLegacyDeployTimestamp() (gas: 102859)\n[PASS] testRemainderTransferredToPredictedPoolBeforeDeploymentAndNoApprovalNeeded() (gas: 2510831)\n[PASS] testStarterEntropyRearmsAfterClaimWindowAndNoDoubleMint() (gas: 773281)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 59.53ms (46.12ms CPU time)\n\nRan 8 tests for test/FeesParams.t.sol:FeesParamsTest\n[PASS] testAllDefaultParamsWithinHardBounds() (gas: 935024)\n[PASS] testBuyBackPoolOnlySlippageFailureRollbackAndDustGriefBlocked() (gas: 785580)\n[PASS] testExactEthSplitsHeartbeatCapAndPullPayments() (gas: 467106)\n[PASS] testFuzzNoStepAboveTenPercent(uint96) (runs: 256, μ: 44593, ~: 44717)\nLogs:\n  Bound result 7391\n\n[PASS] testFuzzSplitsConserveEveryWei(uint96) (runs: 256, μ: 184976, ~: 187232)\nLogs:\n  Bound result 4001049266\n\n[PASS] testHeartbeatCapFixedAtOneEth() (gas: 192806)\n[PASS] testParamsStepCooldownBoundsAuthorityAndLetter() (gas: 195336)\n[PASS] testPoolNoPublicReserveRecycleOrPayment() (gas: 135227)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 67.93ms (59.86ms CPU time)\n\nRan 3 tests for test/PotV35.t.sol:PotV35Test\n[PASS] testPotDepositRequiresActualTokensAndAuthority() (gas: 259231)\n[PASS] testPotSplitDistinctLotteryDistrictAndRollbackOnFullInventory() (gas: 11501224)\n[PASS] testPotUnclaimedRolloverOnlyAfterFourWeeksNoDoubleClaim() (gas: 6423222)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 110.08ms (22.03ms CPU time)\n\nRan 10 tests for test/Bounties.t.sol:BountiesTest\n[PASS] testBuyBountyProportionalCapNoDustCreditAndFailureRollback() (gas: 676397)\n[PASS] testEmptyRosterAndInvalidBatchReceiveNothing() (gas: 1432917)\n[PASS] testEveryWorkKindBoundedByHeartbeatAndAuthorizedProducer() (gas: 64172865)\n[PASS] testLazySettlementUnpaidAndCannotReplay() (gas: 7047433)\n[PASS] testOnlyFinalizePaidOnceAndEmptyWeekUnpaid() (gas: 2281965)\n[PASS] testPackEntropyCapturedOnceWithFullInventoryAndThroughPause() (gas: 3729744)\n[PASS] testPlanResolutionPaidOnceIncludingAdvanceForwarding() (gas: 2948892)\n[PASS] testRemovedWorkBountiesRejectedEvenFromOldProducer() (gas: 178841)\n[PASS] testStarterEntropySurvivesFullInventoryExpiryAndPauseWithoutReplayPayment() (gas: 5341194)\n[PASS] testWorkCreditRespectsZeroGasPricePriceCeilingAndUnitCap() (gas: 331009)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 110.68ms (97.90ms CPU time)\n\nRan 6 tests for test/V4Integration.t.sol:V4IntegrationTest\n[PASS] testRealV4BuyAndSingleSwapSellTaxConserveSettlement() (gas: 2302858)\n[PASS] testRealV4ManipulatedSpotCannotInstantlySetBuybackQuote() (gas: 1897405)\n[PASS] testRealV4SmallBuyPaysPositiveKeeperMargin() (gas: 2073654)\nLogs:\n  real V4 0.2ETH buy gas: 1924726\n  real V4 buy bounty wei: 48487775000000\n\n[PASS] testRealV4SystemBuyUsesTwapAndOnlySystemFunds() (gas: 2087442)\n[PASS] testRealV4SystemSalesUseDepthTwapNormalFeesAndConserveTokens() (gas: 2218481)\n[PASS] testSystemBuybackOffsetsRecordedSellImbalance() (gas: 2494365)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 140.49ms (8.06ms CPU time)\n\nRan 7 tests for test/V33.t.sol:LaunchProtectionTest\n[PASS] testBuyTaxHasImmutableSteps() (gas: 94596)\n[PASS] testLaunchTaxChargedAndRoutedEntirelyToPool() (gas: 232779)\n[PASS] testNoBuySizeLimitAtAnyLaunchStep() (gas: 1703776)\n[PASS] testNormalBuyAfterDecayHasNoLaunchTax() (gas: 1495118)\n[PASS] testSellsPayNormalFeeDuringLaunch() (gas: 355624)\n[PASS] testSnipersSplittingBuysStillPayTheCurve() (gas: 645455)\n[PASS] testViewsBeforeInitialization() (gas: 4257902)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 147.01ms (4.46ms CPU time)\n\nRan 6 tests for test/Endowment.t.sol:EndowmentTest\n[PASS] testDirectTransferCannotBypassOrBackdateDrip() (gas: 366673)\n[PASS] testExactFundingFullLinearDripAndConservation() (gas: 841517)\n[PASS] testFuzzCumulativePaymentsCannotExceedVestedPrincipal(uint32,uint128) (runs: 256, μ: 541664, ~: 543045)\nLogs:\n  Bound result 3305605\n  Bound result 35145104108081215548\n\n[PASS] testNoTeamDonorOrSwarmWithdrawalOrReserveAuthority() (gas: 644214)\n[PASS] testParamsSnapshotCannotAccelerateOrRelockExistingEndowment() (gas: 327098)\n[PASS] testUnderfundingCannotActivateAndDonationsStayConserved() (gas: 456525)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 201.23ms (186.30ms CPU time)\n\nRan 1 test for test/EndowmentGame.t.sol:EndowmentGameTest\n[PASS] testRealMiningCannotSpendFutureEndowment() (gas: 125207145)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 202.11ms (193.36ms CPU time)\n\nRan 20 tests for test/V33.t.sol:V33Test\n[PASS] testActionBeforeExpiryMovesBucketWithoutDoubleCount() (gas: 26270924)\n[PASS] testAdvanceIsConstantInExpiringFarms() (gas: 38963853)\n[PASS] testAgeCapsAtBoundaries() (gas: 204021)\n[PASS] testClaimDoesNotRecommitWhileBehind() (gas: 37712435)\n[PASS] testClaimRecommitsAndPackRecommits() (gas: 61565262)\n[PASS] testDistrictScoreAveragePerFarmAndTenPercentWalletCap() (gas: 4715585)\n[PASS] testHeartbeatCapExcessGoesToPoolAndBaseFeeStaysHalf() (gas: 256273)\n[PASS] testIdleFarmLeavesDenominatorAfterTwelveEpochs() (gas: 23713404)\n[PASS] testLaunchTaxDepositIsAllPoolAndMarketOnly() (gas: 136370)\n[PASS] testMergeRemoved() (gas: 515411)\n[PASS] testPackLobbySellSplit88Team10Heartbeat2() (gas: 363543)\n[PASS] testPackSaleOpensSixtyMinutesAfterLaunch() (gas: 1278676)\n[PASS] testPaidXpCannotBypassAgeGates() (gas: 59750050)\n[PASS] testPaidXpCappedPerDayActivityUncapped() (gas: 13439563)\n[PASS] testPartialRoomIsClippedNotReverted() (gas: 2189570)\n[PASS] testRewardsEarnedBeforeExpiryAreNeverLost() (gas: 48317469)\n[PASS] testSingleWhaleDistrictCannotWinAlone() (gas: 4654295)\n[PASS] testSyncRecommitsFromNextEpoch() (gas: 33810659)\n[PASS] testTokenPacksAlsoWaitForOpening() (gas: 60761)\n[PASS] testTopSpenderTrackingIsExact() (gas: 5523073)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 327.55ms (952.64ms CPU time)\n\nRan 18 tests for test/EconomyV35.t.sol:EconomyV35Test\n[PASS] testAllEnhancementTableEndpointsAndGlobalBonusCap() (gas: 1473500)\n[PASS] testDurabilityBoundariesAndIdleNoWear() (gas: 38584992)\n[PASS] testEnhanceBurnFailureAndLevelGate() (gas: 1231850)\n[PASS] testEnhanceCapsNoticeUpwardOnlyAndThirtyDays() (gas: 356259)\n[PASS] testEnhanceCommitCannotPlaceScrapOrRetryAndCanRearm() (gas: 1808382)\n[PASS] testFeeSalesDepthSlippageCadenceAndNormalFeePot() (gas: 1728352)\n[PASS] testFreeAllowlistOnceWindowStarterScrapAndMetadata() (gas: 3125703)\n[PASS] testFreeRootCannotBeSetAfterSevenDays() (gas: 62657)\n[PASS] testFreeRootWindowIndexLimitAndUnsetState() (gas: 163754)\n[PASS] testFuzzPriceCurveDaysBounds(uint32,uint32) (runs: 256, μ: 93069, ~: 94571)\nLogs:\n  Bound result 96316\n\n[PASS] testLockBonusRedistributesWithinReservedEmission() (gas: 11796112)\n[PASS] testLockEscrowNoEarlyExitAndWalletCap() (gas: 5436696)\n[PASS] testQuoteScalesLastSettlementAndHasFloor() (gas: 4331527)\n[PASS] testRepairYieldQuoteAndAutoRepairCreditsOnly() (gas: 10922187)\n[PASS] testRoomsChargeYieldDaysAndRetainAgeGates() (gas: 2656610)\n[PASS] testSystemSellDustCannotOccupyCadenceAndCappedHeartbeatReturnsTokens() (gas: 1548159)\n[PASS] testTokenOnlyGiftSplitsNoEthPeg() (gas: 1750202)\n[PASS] testZapAtomicMinOutPauseAndRefund() (gas: 1457614)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 461.69ms (408.28ms CPU time)\n\nRan 6 tests for test/Regression.t.sol:RegressionTest\n[PASS] testCableRepairRestoresOnlyRemainingHalfEpoch() (gas: 11957566)\n[PASS] testEmptyEpochPreservesLastSettledRateButResetsScrapAllowance() (gas: 11117922)\n[PASS] testFuzzCableRepairBlendHandlesNonMonotonicRarityBonuses(uint16) (runs: 256, μ: 1379921, ~: 1379857)\nLogs:\n  Bound result 3\n\n[PASS] testRegisterOnlyAccountsDoNotAddSettlementWorkAndEmptyFarmCanRetire() (gas: 2073466)\n[PASS] testRepairAndPaidPackCannotRetroactivelyBoostEpoch() (gas: 9659922)\n[PASS] testUnlimitedFreshPacksCannotDrainPoolByScrapping() (gas: 9762097)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 463.55ms (508.02ms CPU time)\n\nRan 11 tests for test/Items.t.sol:ItemsTest\n[PASS] testComputeHashSupportHashAndBonusesReplaceDuo() (gas: 4810618)\n[PASS] testDurabilityWearRepairAndEnhancementMetadataPreserved() (gas: 8496467)\n[PASS] testEquipRarityGatesAndMythicGate() (gas: 4235376)\n[PASS] testFullStackRarityCapAndRoomFlags() (gas: 7838498)\n[PASS] testInventoryMintCannotExceedCapacityAndExpansionRises() (gas: 3371060)\n[PASS] testLockedItemCannotBeScrappedUntilEpochRolls() (gas: 6063237)\n[PASS] testOffgridSavings() (gas: 2756211)\n[PASS] testPaidXpCannotBypassRoomTwoAgeGate() (gas: 3834921)\n[PASS] testRoomGatesAndLevelProgression() (gas: 79250224)\n[PASS] testScrapPaysPoolYieldAndCannotRepeat() (gas: 7638216)\n[PASS] testSoulboundOnlyOwnFarmAndNoDuplicateTypes() (gas: 2300698)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 525.14ms (355.13ms CPU time)\n\nRan 6 tests for test/SeasonAudit.t.sol:SeasonAuditTest\n[PASS] testAuditThresholdStrictAndNoWhaleSoftCap() (gas: 40968740)\n[PASS] testLotteryEntitlementSurvivesFullInventory() (gas: 132583108)\n[PASS] testPackSupplyDropOnlyActiveFarmsAtDoublePace() (gas: 11672262)\n[PASS] testParameterChangesCannotChangeClosedEpochBetweenBatches() (gas: 12678086)\n[PASS] testSeasonCannotFinalizeEarlyAndExpiredLotteryMustRearm() (gas: 125483334)\n[PASS] testWeeklyThreeDistinctTicketWinnersRarePackAndBestPrize() (gas: 125695636)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 598.47ms (1.37s CPU time)\n\nRan 13 tests for test/Events.t.sol:EventsTest\n[PASS] testCheapTariffAppliesCitywide() (gas: 6495119)\n[PASS] testColdPowerFireImmuneAndCleanPowerSurgeImmune() (gas: 8017158)\n[PASS] testFallbackAndExpiredSeedIndependentOfSwarmNumber() (gas: 1693336)\n[PASS] testFireNoCoolingZeroYieldColdPowerImmune() (gas: 6221621)\n[PASS] testGreenWaveRaisesDistrictMiningTenPercent() (gas: 6496288)\n[PASS] testLobbyOwnDistrictSplitDecayAndMinimumWeight() (gas: 1069441)\n[PASS] testOutageAndOffgridRoomMitigation() (gas: 7152114)\n[PASS] testPlansOnlyNextTwoOnceAndBoundedSeverity() (gas: 349846)\n[PASS] testRollingCapsAndInitialPositiveQuotaWithHostilePlans() (gas: 101300179)\n[PASS] testSurgeCanDestroyCommonButNeverLegendary() (gas: 6329216)\n[PASS] testSurgeDamagesExactlyOneItemAndCleanPowerImmune() (gas: 6370436)\n[PASS] testSurgeNeverDestroysLegendaryOrMythic() (gas: 9651158)\n[PASS] testTheftRouterDisabledAndRepairRestores() (gas: 6939769)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 599.56ms (496.64ms CPU time)\n\nRan 6 tests for test/Market.t.sol:MarketTest\n[PASS] testBuyChargesOnlyBaseAndNetworkPullPayment() (gas: 1768185)\n[PASS] testFuzzTotalFeeHardCap(uint96) (runs: 256, μ: 1816064, ~: 1820970)\nLogs:\n  Bound result 2948\n\n[PASS] testOnlyManagerCorrectPoolExactInputAndHookAddress() (gas: 114394)\n[PASS] testSingleDumpIncludesItselfAndFeeDecaysWithoutGriefReset() (gas: 16904260)\n[PASS] testTwapAveragesEthPriceAcrossUnequalPrices() (gas: 2337942)\n[PASS] testTwapWarmupAndFlashManipulationResistance() (gas: 1891979)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 599.74ms (609.09ms CPU time)\n\nRan 2 tests for test/ReservedEventsV35.t.sol:ReservedEventsV35Test\n[PASS] testFuzzReservedFestivalCannotExceedFifteenPercent(uint16) (runs: 256, μ: 4981039, ~: 4981038)\n[PASS] testReservedHeatwaveExtraCoolingWearAndBothProtections() (gas: 10312542)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 875.08ms (898.79ms CPU time)\n\nRan 2 tests for test/StandardMarket.t.sol:StandardMarketTest\n[PASS] testFuzzStandardSellNeverAddsProgressiveSurcharge(uint96) (runs: 256, μ: 1828677, ~: 1839119)\nLogs:\n  Bound result 2955\n\n[PASS] testStandardBuyOnePercentEvenSplitAndNetworkQuarterPercent() (gas: 1715016)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 875.12ms (857.41ms CPU time)\n\nRan 3 tests for test/Gas.t.sol:GasTest\n[PASS] testGasCommonActions() (gas: 10974087)\nLogs:\n  buy token pack: 933842\n  open one pack: 514107\n  equip: 983432\n  repair wallet: 623165\n  enhancement commit: 565413\n  expand: 397626\n  token pack wallet: 662491\n  withdraw: 251238\n  unequip: 415318\n\n[PASS] testGasFullFarmLongIdleBoundedChunks() (gas: 121681304)\nLogs:\n  settle full 24-item farm eight epochs after 40 idle: 12944336\n\n[PASS] testGasTypicalFarmSettlementHasNoBounty() (gas: 9059470)\nLogs:\n  settle typical three-item farm one epoch: 938213\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 12.22s (552.06ms CPU time)\n\nRan 9 tests for test/Epochs.t.sol:EpochsTest\n[PASS] testCannotAdvanceEarlyAndBountyOnce() (gas: 2539516)\n[PASS] testClaimsEveryEpochAndRedistributionIsNextEpoch() (gas: 12116856)\n[PASS] testGasAdvanceIndependentOfRoster() (gas: 912923255)\nLogs:\n  advance empty roster: 1298371\n  advance 1000 farms: 1488484\n\n[PASS] testNoCatchupEmissionDuringGap() (gas: 6328719)\n[PASS] testNoRetroactiveEquipmentAndBoundedBatches() (gas: 5854667)\n[PASS] testNoWhaleCapHashShares() (gas: 10293803)\n[PASS] testReferralOneLevelSetOnceNoSelf() (gas: 7610155)\n[PASS] testTaxCurveExactAndFloor() (gas: 27414)\n[PASS] testWithdrawFailureRollsBackAndReentrancyCannotClaimTwice() (gas: 7503191)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 12.18s (7.19s CPU time)\n\nRan 5 tests for test/ReviewV34.t.sol:ReviewV34Test\n[PASS] testCanonicalCompetingRegistryCannotTakeOverBinding() (gas: 48654122)\n[PASS] testDustBuyCannotConsumeGlobalBuyInterval() (gas: 351099)\n[PASS] testLateGreenEntrySettlesWithinReservedEnvelope() (gas: 4478255)\n[PASS] testMeaningfulSmallBuyCanUseLessThanMaximumBatch() (gas: 284831)\n[PASS] testSameConfigurationAtUncommittedCoordinatesCannotBind() (gas: 8256827)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 12.25s (20.17ms CPU time)\n\nRan 9 tests for test/LazyAccounting.t.sol:LazyAccountingTest\n[PASS] testAuditChargesTenPercentEvenAtHalfSeverityAndThresholdIsFrozen() (gas: 6223604)\n[PASS] testClaimCatchesUpWhilePacksPausedAndDoesNotEraseRemainingHistory() (gas: 25975143)\n[PASS] testExhaustedFarmCannotCollectRedistributionByRemainingIdle() (gas: 15338545)\n[PASS] testFuzzLazyEqualsIndependentEagerForRandomFarmsAndAllEvents(uint256) (runs: 256, μ: 46384244, ~: 46399661)\n[PASS] testGlobalAccumulatorAndWeightsAreSnapshottedBeforeMutations() (gas: 9427358)\n[PASS] testLateSeasonSettlementPaysMiningWithoutChangingFrozenWinners() (gas: 60217171)\n[PASS] testOneWeiMiningGreenCannotLockSettlementThroughEnvelopeRounding() (gas: 11251824)\n[PASS] testSparseMatureVintageConsumedBeforeRecentSlotAfterWrap() (gas: 43760648)\n[PASS] testStaleActionsRequireChunksAndNeverBlockGlobalAdvance() (gas: 41087296)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 12.42s (12.90s CPU time)\n\nRan 9 tests for test/Packs.t.sol:PacksTest\n[PASS] testExactPaymentAndFutureBlockRequired() (gas: 1682996)\n[PASS] testExactRarityThresholdsAndMythicGate() (gas: 270966)\n[PASS] testExpiryRearmsWithoutMintingAndInventoryOpeningLimit() (gas: 3817332)\n[PASS] testFuzzVrgdaAlwaysBounded(uint32,uint32) (runs: 256, μ: 64624, ~: 66236)\nLogs:\n  Bound result 96316\n\n[PASS] testItemTypeDistributionExact() (gas: 589021)\n[PASS] testNoWalletGlobalOrTokenPackDailyLimit() (gas: 4503251)\n[PASS] testStarterWindowProofTokenIdOnceAndInventoryFailureRetry() (gas: 881460)\n[PASS] testTokenPackSameQuoteAndSplitWhenUsingWalletOrCredits() (gas: 77416305)\n[PASS] testVrgdaInitialStepDecayFloorCeilingAndBulkPricing() (gas: 1325943)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 12.42s (332.96ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantsTest\n[PASS]\nInvariantsTest invariants:\n[PASS] invariantAllowlistRootAndWalletLimit\n[PASS] invariantInventoryAndEthLiabilities\n[PASS] invariantLocksAndPotAlwaysBacked\n[PASS] invariantPriceAndParamsBounds\n[PASS] invariantReceiptsNeverForfeitOrFixMissingEntropy\n[PASS] invariantReservesBackedAndPendingCovered\n[PASS] invariantTokenConservationNoBurns\n InvariantsTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------+-----------+-------+---------+----------╮\n| Contract    | Selector  | Calls | Reverts | Discards |\n+======================================================+\n| GameHandler | advance   | 605   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | buy       | 639   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | claim     | 525   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | equip     | 533   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | expand    | 564   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | freeClaim | 575   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | fundPot   | 568   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | lock      | 564   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | resolve   | 578   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | rollover  | 602   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | settle    | 648   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | tokenPack | 595   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unlock    | 594   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unplace   | 602   | 0       | 0        |\n╰-------------+-----------+-------+---------+----------╯\n\nLogs:\n  Bound result 11573\n  Bound result 2628\n  Bound result 557\n  Bound result 8071\n  Bound result 864000000\n  Bound result 1905\n  Bound result 1500\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 38.11s (38.08s CPU time)\n\nRan 39 test suites in 38.12s (106.31s CPU time): 215 tests passed, 0 failed, 1 skipped (216 total tests)\n","passed":true},{"durationMs":124,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Billboards.bidBillboard(uint256,uint256,string,string)\",\"Billboards.blankBillboard(uint256,uint256)\",\"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()\",\"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,address,int24,address,address,bytes32),bytes32)\",\"PackSale.buyPackFor(address)\",\"PackSale.buyPacksFor(address,uint256,uint256)\",\"PackSale.buyWithETH(address,uint256,uint256,uint256)\",\"PackSale.captureEntropy(uint256)\",\"PackSale.openPack(uint256)\",\"PackSale.pause(uint256)\",\"PackSale.rearm(uint256)\",\"PackSale.resolve(uint256,uint256)\",\"PackSale.rewardPack(address)\",\"PackSale.selectProfile(uint8)\",\"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)\",\"StandardMarket.withdrawNetwork()\",\"StarterClaim.captureEntropy(uint256)\",\"StarterClaim.claim(uint256,bytes32[])\",\"StarterClaim.claimFree(uint256,bytes32[])\",\"StarterClaim.rearm(uint256)\",\"StarterClaim.resolve(uint256)\",\"StarterClaim.setFreeRoot(bytes32)\",\"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)\",\"V4Market.withdrawNetwork()\"],\"files\":{\".gitignore\":6,\"README.md\":44,\"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/verification-v3.json\":67,\"docs/api-v35.md\":38,\"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/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/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/security-review.md\":29,\"docs/simulation-assumptions.md\":43,\"docs/simulation-v3-historical.md\":44,\"docs/simulation-v34.md\":34,\"foundry.toml\":20,\"launch-v31.md\":3,\"launch/V4Market.sol\":1611,\"operations/dormant-v35.md\":15,\"regulator.md\":60,\"report.md\":67,\"script/Deploy.s.sol\":157,\"script/DeployMarket.s.sol\":15,\"script/PredictGame.s.sol\":47,\"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/tune_v3.py\":16,\"src/Billboards.sol\":142,\"src/Civic.sol\":296,\"src/Economy.sol\":199,\"src/Enhancement.sol\":120,\"src/FarmCore.sol\":597,\"src/FarmEngine.sol\":251,\"src/FarmItems.sol\":165,\"src/FarmRewards.sol\":555,\"src/FeeRouter.sol\":291,\"src/GameRegistry.sol\":86,\"src/GridOperator.sol\":251,\"src/MarketFactory.sol\":72,\"src/PackSale.sol\":302,\"src/Params.sol\":181,\"src/RewardPool.sol\":119,\"src/Season.sol\":371,\"src/StandardAdapter.sol\":77,\"src/StandardMarket.sol\":24,\"src/StarterClaim.sol\":156,\"src/V4Market.sol\":518,\"src/interfaces/IGame.sol\":51,\"src/interfaces/IGameRegistry.sol\":13,\"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\":12,\"src/lib/GameModule.sol\":17,\"src/lib/ItemMath.sol\":31,\"src/lib/ItemMetadata.sol\":79,\"src/lib/ModuleCode.sol\":23,\"test/AutoRepairReviewV35.t.sol\":39,\"test/Base.t.sol\":263,\"test/Bounties.t.sol\":290,\"test/CivicV35.t.sol\":225,\"test/Clock.t.sol\":54,\"test/Deployment.t.sol\":71,\"test/EconomyV35.t.sol\":401,\"test/Endowment.t.sol\":123,\"test/EndowmentGame.t.sol\":51,\"test/Epochs.t.sol\":177,\"test/Events.t.sol\":238,\"test/Factory.t.sol\":37,\"test/FeesParams.t.sol\":134,\"test/Gas.t.sol\":110,\"test/GridV35.t.sol\":62,\"test/HookBinding.t.sol\":116,\"test/Invariants.t.sol\":206,\"test/Items.t.sol\":246,\"test/KeeperProfit.t.sol\":95,\"test/LazyAccounting.t.sol\":421,\"test/Market.t.sol\":124,\"test/Packs.t.sol\":167,\"test/Pause.t.sol\":76,\"test/PotV35.t.sol\":108,\"test/PredictionV34.t.sol\":45,\"test/Registry.t.sol\":129,\"test/Regression.t.sol\":154,\"test/ReservedEventsV35.t.sol\":41,\"test/ReviewV34.t.sol\":139,\"test/SeasonAudit.t.sol\":187,\"test/StandardAdapter.t.sol\":80,\"test/StandardMarket.t.sol\":60,\"test/StandardV4Integration.t.sol\":130,\"test/V33.t.sol\":566,\"test/V34.t.sol\":315,\"test/V4Integration.t.sol\":192,\"test/WarReviewV35.t.sol\":69,\"test/YieldFloorReviewV35.t.sol\":31,\"test/fork/RobinhoodFork.t.sol\":39,\"test/mocks/MockGameRegistry.sol\":47,\"test/mocks/MockMarket.sol\":67,\"test/mocks/MockToken.sol\":38,\"test/mocks/MockV4Manager.sol\":67,\"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/entropy_bot.py\":106,\"tools/freepack_merkle.py\":20,\"tools/pin_module_code.py\":23,\"tools/regulator.py\":81,\"tools/report_v31.py\":55,\"tools/starter_merkle.py\":72,\"ui/app.js\":126,\"ui/index.html\":20,\"ui/reveal.js\":34,\"ui/style.css\":1},\"excluded\":[\"vendor/\",\"node_modules/\"],\"truncated\":true}","passed":true},{"durationMs":34256,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/V4Market.sol:158: V4Market.flushFees() (src/V4Market.sol#158-172) sends eth to arbitrary user\n[high/medium] arbitrary-send-eth at src/V4Market.sol:456: V4Market._sellCallback(bytes) (src/V4Market.sol#456-481) sends eth to arbitrary user\n[high/medium] weak-prng at src/V4Market.sol:258: V4Market._record(bool,uint256) (src/V4Market.sol#258-279) uses a weak PRNG: \"delete shortVolumes[p % 12] (src/V4Market.sol#263)\"\n[high/medium] weak-prng at src/V4Market.sol:258: V4Market._record(bool,uint256) (src/V4Market.sol#258-279) uses a weak PRNG: \"b = longVolumes[p % 24] (src/V4Market.sol#267)\"\n[high/medium] weak-prng at src/V4Market.sol:258: V4Market._record(bool,uint256) (src/V4Market.sol#258-279) uses a weak PRNG: \"delete longVolumes[p % 24] (src/V4Market.sol#269)\"\n[high/medium] weak-prng at src/V4Market.sol:237: V4Market._cumulativeAt(uint256) (src/V4Market.sol#237-244) uses a weak PRNG: \"o = observations[minute % 32] (src/V4Market.sol#241)\"\n[high/medium] weak-prng at src/V4Market.sol:258: V4Market._record(bool,uint256) (src/V4Market.sol#258-279) uses a weak PRNG: \"a = shortVolumes[p % 12] (src/V4Market.sol#261)\"\n[high/medium] weak-prng at src/V4Market.sol:215: V4Market._observe(uint256) (src/V4Market.sol#215-235) uses a weak PRNG: \"observations[minute % 32] = Observation(uint64(minute),c) (src/V4Market.sol#229)\"\n[high/medium] weak-prng at src/V4Market.sol:327: V4Market.nextStepIn() (src/V4Market.sol#327-330) uses a weak PRNG: \"LAUNCH_TAX_STEP - t % LAUNCH_TAX_STEP (src/V4Market.sol#329)\"\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/Economy.sol:127: Reentrancy in Economy.lock(uint256,uint256) (src/Economy.sol#127-143):\n[high/medium] reentrancy-balance at src/PackSale.sol:198: Reentrancy in PackSale._buy(address,address,uint256,uint256,bool) (src/PackSale.sol#198-217):\n[high/medium] reentrancy-balance at src/FeeRouter.sol:206: Reentrancy in FeeRouter.executePotBuys(uint256,uint256) (src/FeeRouter.sol#206-220):\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:155: Reentrancy in FeeRouter.zapBuy(uint256,address) (src/FeeRouter.sol#155-163):\n[high/medium] reentrancy-balance at src/RewardPool.sol:65: Reentrancy in RewardPool.fundEndowment() (src/RewardPool.sol#65-76):\n[high/medium] reentrancy-balance at src/Billboards.sol:56: Reentrancy in Billboards._take(address,uint256) (src/Billboards.sol#56-63):\n[high/medium] reentrancy-balance at src/PackSale.sol:198: Reentrancy in PackSale._buy(address,address,uint256,uint256,bool) (src/PackSale.sol#198-217):\n[high/medium] reentrancy-balance at src/Civic.sol:50: Reentrancy in Civic._take(address,uint256) (src/Civic.sol#50-57):\n[high/medium] reentrancy-balance at src/RewardPool.sol:93: Reentrancy in RewardPool.donate(uint256) (src/RewardPool.sol#93-100):\n[high/medium] reentrancy-balance at src/FeeRouter.sol:265: Reentrancy in FeeRouter.executeBuys(uint256,uint256) (src/FeeRouter.sol#265-290):\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/StandardAdapter.sol:53: Reentrancy in StandardAdapter.buy(uint256,address) (src/StandardAdapter.sol#53-62):\n[high/medium] reentrancy-eth at src/Civic.sol:232: Reentrancy in Civic.fundCollapse(uint256) (src/Civic.sol#232-238):\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/Civic.sol:282: Reentrancy in Civic.buyLot(uint256) (src/Civic.sol#282-295):\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:143: Civic.warTop (src/Civic.sol#118) is never initialized. It is used in:\n[medium/medium] boolean-cst at src/Enhancement.sol:48: Enhancement.announceCap(uint8,string) (src/Enhancement.sol#48-59) uses a Boolean constant improperly:\n[medium/medium] divide-before-multiply at src/FarmEngine.sol:111: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256) (src/FarmEngine.sol#111-162) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/V4Market.sol:237: V4Market._cumulativeAt(uint256) (src/V4Market.sol#237-244) 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 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:215: V4Market._observe(uint256) (src/V4Market.sol#215-235) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmCore.sol: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 src/FarmEngine.sol:111: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256) (src/FarmEngine.sol#111-162) 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/FarmRewards.sol:161: FarmRewards.advanceEpoch() (src/FarmRewards.sol#161-232) 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:111: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256) (src/FarmEngine.sol#111-162) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FeeRouter.sol:172: FeeRouter.executeSells(uint256,uint256) (src/FeeRouter.sol#172-204) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/Economy.sol:82: Economy.itemDaily(uint256) (src/Economy.sol#82-88) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/PackSale.sol:138: PackSale.priceAt(uint256) (src/PackSale.sol#138-157) 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:215: V4Market._observe(uint256) (src/V4Market.sol#215-235) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/Economy.sol:82: Economy.itemDaily(uint256) (src/Economy.sol#82-88) 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/Enhancement.sol:48: Enhancement.announceCap(uint8,string) (src/Enhancement.sol#48-59) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:246: V4Market.twap() (src/V4Market.sol#246-251) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:215: V4Market._observe(uint256) (src/V4Market.sol#215-235) 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/GridOperator.sol:181: GridOperator._resolve(uint256,address) (src/GridOperator.sol#181-241) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:215: V4Market._observe(uint256) (src/V4Market.sol#215-235) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Civic.sol:77: Civic.enable(uint256) (src/Civic.sol#77-83) 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/GridOperator.sol:181: GridOperator._resolve(uint256,address) (src/GridOperator.sol#181-241) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:309: V4Market.sinceLaunch() (src/V4Market.sol#309-311) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/FarmRewards.sol:297: FarmRewards.beginMining(address,uint256) (src/FarmRewards.sol#297-310) uses a dangerous strict equality:\n[medium/high] locked-ether at src/GridOperator.sol:138: Contract locking ether found:\n[medium/medium] reentrancy-no-eth at src/RewardPool.sol:65: Reentrancy in RewardPool.fundEndowment() (src/RewardPool.sol#65-76):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:503: Reentrancy in FarmRewards.claim(uint256) (src/FarmRewards.sol#503-513):\n[medium/medium] reentrancy-no-eth at src/V4Market.sol:456: Reentrancy in V4Market._sellCallback(bytes) (src/V4Market.sol#456-481):\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/StarterClaim.sol:141: Reentrancy in StarterClaim.resolve(uint256) (src/StarterClaim.sol#141-155):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:161: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#161-232):\n[medium/medium] reentrancy-no-eth at src/GridOperator.sol:153: Reentrancy in GridOperator.shift(uint256) (src/GridOperator.sol#153-165):\n[medium/medium] reentrancy-no-eth at src/FeeRouter.sol:172: Reentrancy in FeeRouter.executeSells(uint256,uint256) (src/FeeRouter.sol#172-204):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:344: Reentrancy in FarmRewards._settle(address,uint256) (src/FarmRewards.sol#344-354):\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:483: Reentrancy in V4Market.unlockCallback(bytes) (src/V4Market.sol#483-508):\n[medium/medium] reentrancy-no-eth at src/PackSale.sol:284: Reentrancy in PackSale.resolve(uint256,uint256) (src/PackSale.sol#284-301):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:161: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#161-232):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:326: Reentrancy in FarmCore.paidPackBought(address,uint256,uint256) (src/FarmCore.sol#326-334):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:161: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#161-232):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:352: Reentrancy in FarmCore.place(uint256,uint256,uint256) (src/FarmCore.sol#352-386):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:388: Reentrancy in FarmCore.unplace(uint256,uint256) (src/FarmCore.sol#388-398):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:356: Reentrancy in FarmRewards._settleOne(address,uint256) (src/FarmRewards.sol#356-430):\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:161: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#161-232):\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/FeeRouter.sol:172: Reentrancy in FeeRouter.executeSells(uint256,uint256) (src/FeeRouter.sol#172-204):\n[medium/medium] reentrancy-no-eth at src/Economy.sol:145: Reentrancy in Economy.unlock() (src/Economy.sol#145-162):\n[medium/medium] reentrancy-no-eth at src/Enhancement.sol:69: Reentrancy in Enhancement.commit(uint256,uint256,bool) (src/Enhancement.sol#69-84):\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/GridOperator.sol:112: GridOperator.gridStability(uint256).total (src/GridOperator.sol#112) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Civic.sol:153: Civic.fundWar(uint256).slot (src/Civic.sol#153) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:113: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256).mask (src/FarmEngine.sol#113) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GridOperator.sol:195: GridOperator._resolve(uint256,address).repeated (src/GridOperator.sol#195) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:177: FarmEngine.process(address,uint256,FarmEngine.Snapshot).occupied (src/FarmEngine.sol#177) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GridOperator.sol:113: GridOperator.gridStability(uint256).largest (src/GridOperator.sol#113) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Season.sol:188: Season._track(uint256,uint256,address).slot (src/Season.sol#188) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:182: FarmEngine.process(address,uint256,FarmEngine.Snapshot).cursor (src/FarmEngine.sol#182) is a local variable never initialized\n[medium/medium] uninitialized-local at src/V4Market.sol:348: V4Market._se","passed":true},{"durationMs":1662,"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:95: ETH transferred without address checks (14 places)\n[high] reentrancy-state-change at src/Billboards.sol:103: Reentrancy: State change after external call (89 places)\n[high] reused-contract-name at src/Billboards.sol:15: Contract Name Reused in Different Files (2 places)\n[high] unprotected-initializer at src/MarketFactory.sol:19: Unprotected initializer\n[high] unsafe-casting at src/Economy.sol:132: 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:181: Large Numeric Literal (127 places)\n[low] literal-instead-of-constant at src/Billboards.sol:49: Literal Instead of Constant (625 places)\n[low] local-variable-shadowing at src/FarmRewards.sol:36: Local Variable Shadows State Variable (3 places)\n[low] missing-inheritance at src/Params.sol:6: Missing Inheritance\n[low] modifier-used-only-once at src/Billboards.sol:43: Modifier Invoked Only Once\n[low] non-reentrant-not-first at src/FarmRewards.sol:534: `nonReentrant` is Not the First Modifier (2 places)\n[low] require-revert-in-loop at src/Billboards.sol:79: Loop Contains `require`/`revert` (12 places)\n[low] state-change-without-event at src/Billboards.sol:135: 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:79: Uninitialized Local Variable (36 places)\n[low] unused-import at src/Billboards.sol:10: Unused Import (4 places)\n[low] unused-public-function at src/Billboards.sol:48: Public Function Not Used Internally (17 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"4142c1c95542ebb65709ac50d0f941c7e8e2893eac94ad7a770401f943be94f8","verifiedTreeHash":"cc73238d20375c74f1016fb8c1281d239f002e35","verifierVersion":"0.1.0+0e08a464"}]}