{"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":"14e753f9-5e78-4130-84d0-17d862a4ad7d","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"d8a5c6a0cf2ac848ac40c09c7b8bd355b6b2fa9e7c42118a7b17e6197aaf7d15","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.1: update the v3 contracts from job 5ce56cbc (same repo, branch with the v3 report) and re-run the sim. NO DEPLOY. Keep everything in v3 unless changed below.\n\n1. REWARD POOL ENDOWMENT IN TOKENS (no ETH capital is available)\n- At launch a share of the token supply goes to the game RewardPool instead of the AMM (poolBps lowered). These are not team tokens: no owner, no withdrawal, they can only be emitted to players by the normal mining rules.\n- Endowment drips into the available pool linearly (Params: drip period 14-56 days, default 42), so early emission does not front-load it. Compare with instant availability.\n- Sweep endowment 10 / 15 / 20 / 25% of supply (AMM share 80 / 75 / 70 / 65%, swarm 10% unchanged), same opening cap in ETH. Pick the best share for payback in ETH terms without killing price from emission sell pressure.\n\n2. KEEPER BOUNTIES (game must run with nobody online)\n- Besides advanceEpoch, pay small bounties for real work only: farm settlement batch, pool buyback, plan/entropy resolution, weekly season finalize. Bounties from the heartbeat balance, each bounded in Params, paid only when the call does useful work (no spam, no empty batches, one bounty per unit of work).\n- Size them so a public bot is profitable at Robinhood Chain gas. Check in the sim that the 2% heartbeat share covers all bounties plus swarm runs in every scenario. If not, propose the smallest change (higher heartbeat share or cap) and show its effect on team and rewards.\n\n3. LAUNCH FACTS (from the IMD worker code) AND DEPLOY ORDER\n- Custom univ4_hook launches are allowed (own hook + token). Use the custom fee path. The hook must fit that format: a single hook contract file, constructor up to 16 args, no owner.\n- Supply below poolBps 9000 must go to remainderTo, a plain address: team wallet 0x6d51cBE774aeAe4dd40bCA2560E9bc2695A0d007, which transfers the endowment to RewardPool publicly right after the game deploys. Design and document that step.\n- The swarm 10% goes to ~900 contributor agents with a claim lock, not to NFT holders. Model them as sellers (35 / 50 / 65% in 14 days).\n- Game contracts deploy after the token as evm_contracts launches: max 8 contracts and 16 constructor args each. Split into 2 launches or merge contracts, and document the exact deploy order and constructor args.\n- The hook launches before FeeRouter/RewardPool exist. Make the hook hold its ETH fees until a one-time bind to FeeRouter (callable once by the team address, immutable after), or a better trustless design.\n- Heartbeat runs are paid in $IMD by whoever adds runs. Check if a contract can fund heartbeat runs from the heartbeat ETH balance; if not, document the manual top-up and its cost.\n\n4. SIM\nRe-run steady / hype / weak, custom fee path, unfunded (0 ETH) for every endowment option. Targets: week-1 joiner whole-cohort payback <= 14 days in steady (10 ideal), steady and hype alive >= 21 days, event losses <= 10% of weekly yield, team ETH reported. Say clearly which option meets the targets, or what still misses and why.\n\n5. TESTS AND REVIEW\nTests for endowment drip (conservation, no withdrawal path, cannot be emitted faster than the drip), every bounty (paid once, only for useful work, bounded by heartbeat balance), hook fee holding and one-time bind, and the full suite. A second contributor with fresh context reviews the changes; fix high and medium.\n\nDeliver: updated repo, report.md with the endowment comparison table, recommended launch parameters (poolBps, endowment %, drip days, bounty sizes), the step-by-step launch and deploy order, regulator.md update.\n\nUpgrades and pausing: Not upgradeable. Only PackSale can be paused, by the swarm role, auto-unpause after max 72h. Claims, withdrawals, advanceEpoch and keeper calls can never be paused. The hook has no owner; its only privileged action is the one-time bind to FeeRouter by the team address.","parentJobId":"5ce56cbc-1158-455f-9c37-453120687a3a","planHash":"cca89d240a7a0dcdd0feaa7a1774f6988310f26dfc2af17a2be5a8b73a094e64","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":"51500","feedbackHash":"c34e1ecd52d0060a0b1a2a7100773bbf282bb4e4be86f143ec54d92e0e1a7197","nodeKey":"build_contract_project","submissionHash":"d8a5c6a0cf2ac848ac40c09c7b8bd355b6b2fa9e7c42118a7b17e6197aaf7d15","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"69fa58ff2eeded31bf9814602d682b4db49a4b89223830f7b311d77292e659e5","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"0a997bd484f745d2c4b575de4f38a4d4af3d0086fb27b07a4c1f69bab3acd5fa","device":"2e343a06f770172d","findings":[],"hash":"d8a5c6a0cf2ac848ac40c09c7b8bd355b6b2fa9e7c42118a7b17e6197aaf7d15","nodeId":"bf190ee5-d9fd-4518-9979-267ed731b608","outcome":"completed","summary":"Implemented BLACKOUT v3.1. Nothing deployed.\n\n- `forge build`, `forge test`, and `forge fmt --check` pass: **123 tests passed**, one optional offline skip.\n- Independent review complete; no open high/medium findings.\n- Completed **117 simulation runs**.\n\n**No tested option meets every economic target.** The research candidate is 20% endowment, `poolBps=7000`, 42-day drip, and 31% heartbeat share with a 4.5 ETH cap. Funding checks pass, but steady payback is 24.5 days, hype stalls at day 16, and unattended weak event loss reaches 10.49%.\n\nUpdated [report.md](report.md), [regulator.md](regulator.md), and [launch/deployment instructions](docs/launch-v31.md) document the comparisons, parameters, and operational responsibilities.","treeHash":"8625cfa25405d6b0eac8b107c1cdfcd2b250bad4","usage":{"cachedInputTokens":21328896,"inputTokens":470017,"model":"gpt-6-astra","outputTokens":126795,"runtime":"codex","turns":24,"wallClockMs":5158155}}],"verification":[{"checks":[{"durationMs":77388,"exitCode":0,"name":"build","output":"Compiling 141 files with Solc 0.8.26\nSolc 0.8.26 finished in 77.20s\nCompiler run successful!\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n   ╭▸ src/GameRegistry.sol:76:58\n   │\n76 │             factory.predictContract(launchNumber, index, abi.encodePacked(creationCode, abi.encode(address(this))));\n   │                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Params.sol:170:13\n    │\n170 │         if (block.timestamp < lastChanged[k] + 1 days) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StandardAdapter.sol:46:64\n   │\n46 │         if (rate == 0 || rate > 1e40 || window < 30 minutes || at > block.timestamp || block.timestamp - at > 5 minutes)\n   │                                                                ━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StandardAdapter.sol:46:88\n   │\n46 │         if (rate == 0 || rate > 1e40 || window < 30 minutes || at > block.timestamp || block.timestamp - at > 5 minutes)\n   │                                                                                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/StandardAdapter.sol:58:9\n   │\n58 │         manager.unlock(abi.encode(msg.value, minOut, recipient));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/StandardAdapter.sol:58:9\n   │\n58 │         manager.unlock(abi.encode(msg.value, minOut, recipient));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:67:62\n   │\n67 │         int256 delta = manager.swap(key(), SwapParams(true, -int256(input), 4295128740), \"\");\n   │                                                              ━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:68:27\n   │\n68 │         int128 ethDelta = int128(delta >> 128);\n   │                           ━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:69:22\n   │\n69 │         int128 out = int128(delta);\n   │                      ━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:70:30\n   │\n70 │         if (ethDelta >= 0 || uint256(-int256(ethDelta)) != input || out <= 0 || uint256(uint128(out)) < minimum) {\n   │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:70:81\n   │\n70 │         if (ethDelta >= 0 || uint256(-int256(ethDelta)) != input || out <= 0 || uint256(uint128(out)) < minimum) {\n   │                                                                                 ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:70:89\n   │\n70 │         if (ethDelta >= 0 || uint256(-int256(ethDelta)) != input || out <= 0 || uint256(uint128(out)) < minimum) {\n   │                                                                                         ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/StandardAdapter.sol:73:9\n   │\n73 │         manager.settle{value: input}();\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:74:49\n   │\n74 │         manager.take(address(token), recipient, uint256(uint128(out)));\n   │                                                 ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:74:57\n   │\n74 │         manager.take(address(token), recipient, uint256(uint128(out)));\n   │                                                         ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:75:27\n   │\n75 │         return abi.encode(uint256(uint128(out)));\n   │                           ━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StandardAdapter.sol:75:35\n   │\n75 │         return abi.encode(uint256(uint128(out)));\n   │                                   ━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/PackSale.sol:33:16\n   │\n33 │         return block.timestamp < pausedUntil;\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-events-arithmetic]: `heldBase` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:305:9\n    │\n305 │         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/PackSale.sol:39:13\n   │\n39 │         if (block.timestamp < nextPauseAt) 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:306:9\n    │\n306 │         heldSellTax += excess;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `heldBase` is changed without an event but is used in arithmetic\n    ╭▸ src/V4Market.sol:342:9\n    │\n342 │         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/PackSale.sol:86:27\n   │\n86 │         uint256 elapsed = block.timestamp > launchTime() ? block.timestamp - launchTime() : 0;\n   │                           ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PackSale.sol:88:24\n   │\n88 │         int256 ahead = int256(sales * 1 ether) - int256(elapsed * target * 1 ether / 1 hours);\n   │                        ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PackSale.sol:88:50\n   │\n88 │         int256 ahead = int256(sales * 1 ether) - int256(elapsed * target * 1 ether / 1 hours);\n   │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PackSale.sol:91:30\n   │\n91 │             exponent = wadLn(int256(1 ether + params().get(Params.Key.PriceStepBps) * 1e14)) * ahead / 1 ether;\n   │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PackSale.sol:93:30\n   │\n93 │             exponent = wadLn(int256(1 ether - params().get(Params.Key.PriceDecayBps) * 1e14)) * (-ahead)\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:94:19\n   │\n94 │                 / 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:98:51\n   │\n98 │         p = params().get(Params.Key.PriceStart) * 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:78:16\n   │\n78 │         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/PackSale.sol:62:23\n   │\n62 │         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:87:26\n   │\n87 │         uint256 target = params().get(Params.Key.DemandTarget);\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:91:47\n   │\n91 │             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:93:47\n   │\n93 │             exponent = wadLn(int256(1 ether - params().get(Params.Key.PriceDecayBps) * 1e14)) * (-ahead)\n   │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:98:13\n   │\n98 │         p = params().get(Params.Key.PriceStart) * uint256(wadExp(exponent)) / 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:99:23\n   │\n99 │         uint256 low = params().get(Params.Key.PriceFloor);\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:24\n    │\n100 │         uint256 high = params().get(Params.Key.PriceCeiling);\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/PackSale.sol:122:9\n    │\n122 │         fees().depositPack{value: msg.value}();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/FeeRouter.sol:150:22\n    │\n150 │         (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:152:9\n    │\n152 │         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:167:9\n    │\n167 │         market().buy{value: ethAmount}(minOut, rewardPool());\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/FeeRouter.sol:173:9\n    │\n173 │         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:174:9\n    │\n174 │         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:167:9\n    │\n167 │         market().buy{value: ethAmount}(minOut, rewardPool());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/GridOperator.sol:102:13\n    │\n102 │         if (halves >= 128) 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/GridOperator.sol:121:9\n    │\n121 │         fees().depositLobby{value: msg.value}();\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/GridOperator.sol:120:9\n    │\n120 │         season().recordSpend(msg.sender, msg.value, 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/PackSale.sol:119:9\n    │\n119 │         farm().register(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/PackSale.sol:120:9\n    │\n120 │         farm().paidPackBought(msg.sender, n, msg.value);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:116:30\n    │\n116 │         return epoch != 0 && block.timestamp < epochs[epoch].end;\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-events-access-control]: `fees` is changed without an event but is used for access control\n   ╭▸ src/V4Market.sol:95:9\n   │\n95 │         fees = candidate;\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:117:25\n    │\n117 │         if (paused() || block.timestamp < launchTime() || msg.value != quote(n)) revert InvalidValue();\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n   ╭▸ src/MarketFactory.sol:18:13\n   │\n18 │ ┏             abi.encodePacked(\n19 │ ┃                 type(V4Market).creationCode,\n20 │ ┃                 abi.encode(c.manager, c.token, c.networkRecipient, uint24(0), c.tickSpacing)\n21 │ ┃             )\n   │ ┗━━━━━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\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:141:9\n    │\n141 │         emit PackCommitted(id, p, n, target, guaranteed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-access-control]: `farms` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:167:9\n    │\n167 │         f.serial = nextSerial++;\n    │         ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `epoch` is updated\n    ╭▸ src/FarmRewards.sol:132:13\n    │\n132 │             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:139:13\n    │\n139 │             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 `_status` is updated\n    ╭▸ src/FarmRewards.sol:154:9\n    │\n154 │         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:155:9\n    │\n155 │         fees().payBounty(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/MarketFactory.sol:56:9\n   │\n56 │         emit MarketDeployed(address(market), salt);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-access-control]: `farms` is changed without an event but is used for access control\n    ╭▸ src/FarmCore.sol:180:9\n    │\n180 │         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:429:9\n    │\n429 │         farms[p].xp += 100;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:128:13\n    │\n128 │         if (block.timestamp < launchTime() || !ready() || (epoch != 0 && block.timestamp < epochs[epoch].end)) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmRewards.sol:128:74\n    │\n128 │         if (block.timestamp < launchTime() || !ready() || (epoch != 0 && block.timestamp < epochs[epoch].end)) {\n    │                                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmRewards.sol:80:23\n   │\n80 │         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:150:36\n    │\n150 │             epochParam[epoch][k] = params().get(Params.Key(k));\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/FarmCore.sol:145:53\n    │\n145 │         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/FarmRewards.sol:140:13\n    │\n140 │             emit EpochClosed(epoch, old.budget, old.roster);\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:156:9\n    │\n156 │         emit EpochStarted(epoch, e.start, e.end, msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:134:26\n    │\n134 │             old.roster = uint64(core().count());\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:144:19\n    │\n144 │         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/FarmCore.sol:166:18\n    │\n166 │         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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:145:17\n    │\n145 │         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[calls-loop]: external call inside a loop\n   ╭▸ src/FarmCore.sol:66:26\n   │\n66 │         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:187:39\n    │\n187 │             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:181:25\n    │\n181 │         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[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:198:9\n    │\n198 │         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:199:9\n    │\n199 │         season().recordSpend(p, ethValue, true);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PackSale.sol:139:25\n    │\n139 │         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:159:9\n    │\n159 │         fees().payWork(keeper, Params.Key.EntropyBounty, 1, startGas - gasleft());\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:232:9\n    │\n232 │         items().equip(msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:225:29\n    │\n225 │             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:233:9\n    │\n233 │         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:225:63\n    │\n225 │             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/PackSale.sol:176:13\n    │\n176 │             items().mint(c.player, k, r, false);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:131:52\n    │\n131 │         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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/PackSale.sol:176:36\n    │\n176 │             items().mint(c.player, k, r, false);\n    │                                    ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/PackSale.sol:175:47\n    │\n175 │             if (c.guaranteed && i % 3 == 0 && r < 1) r = 1;\n    │                                               ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/PackSale.sol:58:26\n   │\n58 │         return FarmItems(registry.module(3));\n   │                          ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:243:9\n    │\n243 │         items().unequip(msg.sender, id);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/PackSale.sol:176:13\n    │\n176 │             items().mint(c.player, k, r, false);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/GridOperator.sol:62:23\n   │\n62 │         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/GridOperator.sol:109:33\n    │\n109 │         uint256 reduction = a * params().get(Params.Key.LobbyKBps) / (1 ether + a);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/GridOperator.sol:111:25\n    │\n111 │         uint256 floor = params().get(Params.Key.LobbyMinWeight);\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:244:9\n    │\n244 │         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/PackSale.sol:178:9\n    │\n178 │         emit PackOpened(id, n, c.expired);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:139:20\n    │\n139 │         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:140:21\n    │\n140 │         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[unused-return]: return value of an external call is not used\n    ╭▸ src/PackSale.sol:176:13\n    │\n176 │             items().mint(c.player, k, r, false);\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/V4Market.sol:108:24\n    │\n108 │         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:109:26\n    │\n109 │         if (excess != 0) fees.depositSellTax{value: excess}();\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/FarmCore.sol:252:56\n    │\n252 │             if (f.loadout[i] != 0 || f.active[i] != 0) revert InvalidValue();\n    │                                                        ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/V4Market.sol:110:9\n    │\n110 │         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/FarmCore.sol:287:9\n    │\n287 │         emit Spent(p, kind, paid, nominal);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmRewards.sol:88:22\n   │\n88 │         return ICore(registry.module(2));\n   │                      ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/GridOperator.sol:214:9\n    │\n214 │         fees().payWork(keeper, Params.Key.EntropyBounty, 1, startGas - gasleft());\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:165:31\n    │\n165 │         uint256 x = shares[e][core().playerAt(a)].raw;\n    │                               ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/FarmCore.sol:278:17\n    │\n278 │             if (token().balanceOf(pool()) - before_ != paid) revert InvalidValue();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:166:31\n    │\n166 │         uint256 y = shares[e][core().playerAt(b)].raw;\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:188:16\n    │\n188 │         while (i * 2 + 1 < h.length) {\n    │                ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:280:20\n    │\n280 │             paid = rewards().spend(p, nominal);\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/RewardPool.sol:50:33\n   │\n50 │         if (endowment() == 0 || block.timestamp >= dripStart + dripPeriod) return 0;\n   │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:179:27\n    │\n179 │             if (old == k) repeated++;\n    │                           ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:286:9\n    │\n286 │         season().recordSpend(p, value, kind == 0 || kind == 3 || kind == 4);\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:297:9\n    │\n297 │         items().maintain(id, 10000, x.overclock);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/GridOperator.sol:178:57\n    │\n178 │             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:194:13\n    │\n194 │             sum += w;\n    │             ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/RewardPool.sol:65:13\n   │\n65 │         if (token().balanceOf(address(this)) - before_ != endowment()) revert InvalidValue();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/GridOperator.sol:202:34\n    │\n202 │                     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[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/RewardPool.sol:89:13\n   │\n89 │         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:96:9\n   │\n96 │         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:104:67\n    │\n104 │     function pay(address to, uint256 amount) external onlyRewards nonReentrant {\n    │                                                                   ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmCore.sol:306:32\n    │\n306 │         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:307:29\n    │\n307 │         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[missing-events-access-control]: `lotteryClaimed` is changed without an event but is used for access control\n    ╭▸ src/Season.sol:219:9\n    │\n219 │         lotteryClaimed[w][msg.sender] = true;\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/StarterClaim.sol:61:9\n   │\n61 │         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/Season.sol:83:13\n   │\n83 │         if (block.timestamp < launchTime()) 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:54:13\n   │\n54 │         if (block.timestamp < launchTime() + 48 hours || block.timestamp >= launchTime() + 16 days) revert TooEarly();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/StarterClaim.sol:54:58\n   │\n54 │         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:62:9\n   │\n62 │         emit StarterCommitted(tokenId, msg.sender, target);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/StarterClaim.sol:59:25\n   │\n59 │         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/FarmCore.sol:316:9\n    │\n316 │         items().maintain(id, x.durability, x.overclock + 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/StarterClaim.sol:77:9\n   │\n77 │         fees().payWork(keeper, Params.Key.EntropyBounty, 1, startGas - gasleft());\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:140:13\n    │\n140 │             fees().payWork(msg.sender, Params.Key.SeasonScoreBounty, cursor - before_, startGas - gasleft());\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:91:13\n   │\n91 │             items().mint(c.player, h == bytes32(0) ? 0 : k, h == bytes32(0) ? 1 : r, true);\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:128:25\n    │\n128 │         for (uint256 n; n < limit && cursor < s.participants; ++n) {\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/V4Market.sol:158:13\n    │\n158 │             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:171:9\n    │\n171 │         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/Season.sol:144:13\n    │\n144 │             emit SeasonPrepared(w, s.target);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/StarterClaim.sol:42:26\n   │\n42 │         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:91:13\n   │\n91 │             items().mint(c.player, h == bytes32(0) ? 0 : k, h == bytes32(0) ? 1 : r, true);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/V4Market.sol:165:38\n    │\n165 │             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:168:23\n    │\n168 │         cumulative += (1e60 / lastPrice) * (now_ - updatedAt);\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Season.sol:143:24\n    │\n143 │             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-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/StarterClaim.sol:93:9\n   │\n93 │         emit StarterResolved(tokenId, h == bytes32(0));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:163:13\n    │\n163 │         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:163:27\n    │\n163 │         if (last >= 32 && first < last - 31) first = last - 31;\n    │                           ━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/StarterClaim.sol:91:13\n   │\n91 │             items().mint(c.player, h == bytes32(0) ? 0 : k, h == bytes32(0) ? 1 : r, true);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:164:38\n    │\n164 │         for (uint256 minute = first; minute <= last; ++minute) {\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:324:9\n    │\n324 │         items().expand(msg.sender);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:166:53\n    │\n166 │             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:177:50\n    │\n177 │         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:184:35\n    │\n184 │         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:198:13\n    │\n198 │         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:204:13\n    │\n204 │         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:200:24\n    │\n200 │             a.period = uint64(p);\n    │                        ━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:184:39\n    │\n184 │             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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:206:24\n    │\n206 │             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:209:24\n    │\n209 │             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[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:185:18\n    │\n185 │             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:187:34\n    │\n187 │         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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:210:24\n    │\n210 │             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:212:23\n    │\n212 │             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:213:23\n    │\n213 │             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[reentrancy-no-eth]: external call can be reentered before `farms` is updated\n    ╭▸ src/FarmCore.sol:286:9\n    │\n286 │         season().recordSpend(p, value, kind == 0 || kind == 3 || kind == 4);\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:175:25\n    │\n175 │         for (uint256 i; i < 3 && left != 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/V4Market.sol:224:17\n    │\n224 │                 b += shortVolumes[i].buys;\n    │                 ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/V4Market.sol:223:17\n    │\n223 │                 s += shortVolumes[i].sells;\n    │                 ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:333:9\n    │\n333 │         rewards().recordSales(1);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:222:17\n    │\n222 │             if (uint256(shortVolumes[i].period) + 12 > current) {\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:334:14\n    │\n334 │         id = ITokenPacks(packs()).tokenPack(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/Season.sol:188:9\n    │\n188 │         emit SeasonFinalized(w, s.winnerDistrict, s.best, s.seed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:232:17\n    │\n232 │             if (uint256(longVolumes[i].period) + 24 > current) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Season.sol:172:92\n    │\n172 │             if (s.districtSpend[d] > s.districtSpend[s.winnerDistrict]) s.winnerDistrict = uint8(d);\n    │                                                                                            ━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/V4Market.sol:250:13\n    │\n250 │         if (average != 0 && price > average) dev = Math.min(1000, 10000 - Math.mulDiv(average, 10000, price));\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Season.sol:194:20\n    │\n194 │         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 `scrapAllowance` is updated\n    ╭▸ src/FarmRewards.sol:273:42\n    │\n273 │                 if (scrapAllowance != 0) 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/V4Market.sol:249:13\n    │\n249 │         if (block.timestamp >= initializedAt + 31 minutes) average = twap();\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/Season.sol:214:14\n    │\n214 │         id = packs().rewardPack(msg.sender);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/V4Market.sol:255:27\n    │\n255 │         uint256 decayed = storedFeeWad > fall ? storedFeeWad - fall : projectBps() * 1 ether;\n    │                           ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/Season.sol:223:14\n    │\n223 │         id = items().mint(msg.sender, k, r, false);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `settledEpoch` is updated\n    ╭▸ src/FarmRewards.sol:256:17\n    │\n256 │                 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 `settledEpoch` is updated\n    ╭▸ src/FarmRewards.sol:258:21\n    │\n258 │                     core().grantDrop(p, keccak256(abi.encode(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/FarmCore.sol:340:9\n    │\n340 │         grid().tokenLobby(msg.sender, Math.mulDiv(paid, 1 ether, market().quote(1 ether)));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `settledEpoch` is updated\n    ╭▸ src/FarmRewards.sol:260:17\n    │\n260 │                 season().recordActivity(p, (e.start - launchTime()) / 7 days, gross);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `settledEpoch` is updated\n    ╭▸ src/FarmRewards.sol:265:33\n    │\n265 │                 if (prize != 0) season().addPrize((e.start - launchTime()) / 7 days, prize);\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `settledEpoch` is updated\n    ╭▸ src/FarmRewards.sol:276:35\n    │\n276 │                 if (recycle != 0) pool().recycle(recycle);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:269:25\n    │\n269 │         uint256 ethIn = uint256(-p.amountSpecified);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:271:19\n    │\n271 │         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:271:27\n    │\n271 │         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:273:43\n    │\n273 │         return (this.beforeSwap.selector, int256(fee << 128), 0);\n    │                                           ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:210:68\n    │\n210 │                 (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:283:24\n    │\n283 │         if (work != 0) fees().payWork(msg.sender, bountyKind, work, startGas - gasleft());\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:359:13\n    │\n359 │             items().destroy(ids[i]);\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:362:18\n    │\n362 │         result = items().mint(msg.sender, x.kind, x.rarity + 1, false);\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/FarmEngine.sol:105:19\n    │\n105 │             raw = raw * (10 + f.clocks[idx]) / 10;\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:109:29\n    │\n109 │             s.productive += raw * f.health[idx] / 10000;\n    │                             ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:348:39\n    │\n348 │             FarmItems.Item memory y = items().data(ids[i]);\n    │                                       ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:359:13\n    │\n359 │             items().destroy(ids[i]);\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:363:9\n    │\n363 │         emit Merged(msg.sender, result);\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:352:15\n    │\n352 │             ) 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/FarmCore.sol:354:39\n    │\n354 │                 if (ids[i] == ids[j]) revert InvalidValue();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/FarmEngine.sol:87:41\n   │\n87 │             if (x.holder != address(0)) mask |= 1 << x.kind;\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/V4Market.sol:298:9\n    │\n298 │         emit SellFee(sender, output, bps, hour, day, dev);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:102:13\n    │\n102 │             tags |= 1 << ItemMath.tag(x.kind);\n    │             ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:284:27\n    │\n284 │         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:287:28\n    │\n287 │             _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[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:39:26\n   │\n39 │         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:86:39\n   │\n86 │             FarmItems.Item memory x = items().data(id);\n   │                                       ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:291:26\n    │\n291 │         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[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:99:39\n   │\n99 │             FarmItems.Item memory x = items().data(id);\n   │                                       ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:291:34\n    │\n291 │         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[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:372:9\n    │\n372 │         items().destroy(id);\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n  ╭▸ src/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[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:373:26\n    │\n373 │         uint256 earned = rewards().scrap(msg.sender, hash, minimum);\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/V4Market.sol:299:42\n    │\n299 │         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:299:49\n    │\n299 │         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[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/FarmCore.sol:370:24\n    │\n370 │         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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmRewards.sol:255:42\n    │\n255 │                 e.spent += net + redis + referral;\n    │                                          ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/FarmCore.sol:374:9\n    │\n374 │         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/FarmRewards.sol:224:29\n    │\n224 │             for (uint256 n; n < limit && e.cursor < e.audited; ++n) {\n    │                             ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmRewards.sol:216:17\n    │\n216 │                 work++;\n    │                 ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmRewards.sol:208:29\n    │\n208 │             for (uint256 n; n < limit && e.cursor < e.roster; ++n) {\n    │                             ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmRewards.sol:234:29\n    │\n234 │             for (uint256 n; n < limit && e.cursor < e.roster; ++n) {\n    │                             ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmCore.sol:386:39\n    │\n386 │             FarmItems.Item memory x = items().data(snap.ids[i]);\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:209:29\n    │\n209 │                 address p = core().playerAt(e.cursor);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:210:68\n    │\n210 │                 (uint256 raw, uint256 productive, uint256 power) = core().process(p, id);\n    │                                                                    ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:225:28\n    │\n225 │                 shares[id][core().playerAt(_pop(id))].audit = true;\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:235:29\n    │\n235 │                 address p = core().playerAt(e.cursor++);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:256:17\n    │\n256 │                 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:258:21\n    │\n258 │                     core().grantDrop(p, keccak256(abi.encode(seed, p, \"item\")));\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/FarmRewards.sol:100:24\n    │\n100 │         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:104:16\n    │\n104 │         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:260:17\n    │\n260 │                 season().recordActivity(p, (e.start - launchTime()) / 7 days, gross);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmCore.sol:412:48\n    │\n412 │         (raw, productive, power, theftUntil) = engine().process(p, e, snap);\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:314:9\n    │\n314 │         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:280:17\n    │\n280 │                 emit EpochSettled(id, e.mining, recycle);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmCore.sol:408:14\n    │\n408 │         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:416:28\n    │\n416 │             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[unused-return]: return value of an external call is not used\n    ╭▸ src/FarmRewards.sol:203:69\n    │\n203 │         (GridOperator.Kind kind, uint16 severity,, bytes32 seed,) = grid().eventAt(id);\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:449:14\n    │\n449 │         id = items().mint(msg.sender, k, r == 0 ? 0 : 1, false);\n    │              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmRewards.sol:311:19\n    │\n311 │         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:312:48\n    │\n312 │         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:331:25\n    │\n331 │         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:337:45\n    │\n337 │             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:346:9\n    │\n346 │         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:347:9\n    │\n347 │         emit Claimed(msg.sender, amount, tax);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/FarmRewards.sol:353:9\n    │\n353 │         pool().recycle(consumed);\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:316:31\n    │\n316 │         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[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/FarmRewards.sol:350:66\n    │\n350 │     function spend(address p, uint256 nominal) external onlyCore nonReentrant returns (uint256 consumed) {\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/FarmRewards.sol:354:9\n    │\n354 │         emit Spent(p, consumed);\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:357:80\n    │\n357 │     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:371:9\n    │\n371 │         pool().recycle(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `initializedAt` is updated\n    ╭▸ src/V4Market.sol:328:24\n    │\n328 │         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:328:62\n    │\n328 │         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:330:27\n    │\n330 │         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:331:29\n    │\n331 │         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:333:30\n    │\n333 │             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:334:20\n    │\n334 │                 || 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:334:28\n    │\n334 │                 || 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:339:9\n    │\n339 │         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:340:40\n    │\n340 │         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:340:48\n    │\n340 │         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:343:27\n    │\n343 │         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:343:35\n    │\n343 │         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:350:22\n    │\n350 │         (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:352:9\n    │\n352 │         emit NetworkPaid(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/FarmEngine.sol:142:32\n    │\n142 │             if (f.ids[i] != 0) occupied++;\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:164:30\n    │\n164 │                 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:174:21\n    │\n174 │                     damage += 3000 * uint256(severity) / 10000 / (before_.airflow ? 2 : 1);\n    │                     ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[calls-loop]: external call inside a loop\n   ╭▸ src/FarmEngine.sol:47:25\n   │\n47 │         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:59:25\n   │\n59 │         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:43:23\n   │\n43 │         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:59:63\n   │\n59 │         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:161:43\n    │\n161 │                 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:166:25\n    │\n166 │                         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:177:17\n    │\n177 │                 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: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:199:17\n    │\n199 │                 items().maintain(id, x.durability > 50 ? x.durability - 50 : 0, 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/FarmEngine.sol:79:24\n   │\n79 │         if (room >= 4) 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/FarmEngine.sol:154:32\n    │\n154 │                 f.theftUntil = uint64(e + 2);\n    │                                ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/FarmEngine.sol:176:33\n    │\n176 │                 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:177:38\n    │\n177 │                 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\n","passed":true},{"durationMs":16405,"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 196.84µs (77.22µs CPU time)\n\nRan 2 tests for test/Clock.t.sol:ClockTest\n[PASS] testLocalEvmFutureBlockAnd256BlockBoundary() (gas: 220367)\n[PASS] testRobinhoodUsesArbSysNotL1EstimateAndHandlesExpiry() (gas: 443925)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 416.70µs (285.32µs CPU time)\n\nRan 2 tests for test/Factory.t.sol:FactoryTest\n[PASS] testFactoryInvalidSearchRange() (gas: 4984)\n[PASS] testHookFactoryFlagsImmutableConfigAndIdempotence() (gas: 2294505)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.53ms (1.79ms CPU time)\n\nRan 3 tests for test/StandardAdapter.t.sol:StandardAdapterTest\n[PASS] testExistingHookKeyPreservedAndNoExtraFee() (gas: 325352)\n[PASS] testRequiresThirtyMinutesFreshOracleAndAuthorizedCallback() (gas: 194045)\n[PASS] testSettlementSlippageFailurePreservesCredits() (gas: 256375)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 7.59ms (1.52ms CPU time)\n\nRan 5 tests for test/Registry.t.sol:RegistryTest\n[PASS] testAllModulePinsMatchExactPinnedCompilerArtifacts() (gas: 236372)\n[PASS] testAuthenticatedEnrollmentRejectsUncreatedWrongCodeAndWrongRegistry() (gas: 2709599)\n[PASS] testConstructorAcceptsEmptyGraphWithoutExternalCalls() (gas: 10041)\n[PASS] testCounterfeitRuntimeAtAnotherFactoryCannotEnroll() (gas: 1469238)\n[PASS] testCounterfeitRuntimeWithPoisonedCreditCannotEnroll() (gas: 3185671)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 8.10ms (2.95ms CPU time)\n\nRan 3 tests for test/HookBinding.t.sol:HookBindingTest\n[PASS] testFlushFailureRestoresEscrowAndDoesNotStopSwaps() (gas: 555019)\n[PASS] testHoldBeforeGameExistsThenBindOnceAndFlushExactStreams() (gas: 1967729)\n[PASS] testWrongRouterAndMissingCodeRejectedBeforePermanentBind() (gas: 1059719)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 9.56ms (3.80ms CPU time)\n\nRan 3 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testConstructorRejectsMissingInputsAndDoesNotCallExternalContracts() (gas: 4154)\n[PASS] testForeignCallerDoesNotGetAnyAuthority() (gas: 22369380)\n[PASS] testImmutableGraphAndEip170Sizes() (gas: 153656)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 13.57ms (7.26ms CPU time)\n\nRan 5 tests for test/KeeperProfit.t.sol:KeeperProfitTest\n[PASS] testPaidPackEntropyKeeperProfit() (gas: 691784)\nLogs:\n  paid pack entropy execution gas: 137269\n  paid pack entropy bounty wei: 3324700000000\n  paid pack entropy execution plus 21000 gas cost wei: 3165380000000\n\n[PASS] testPlanEntropyKeeperProfit() (gas: 1440632)\nLogs:\n  plan entropy execution gas: 157574\n  plan entropy bounty wei: 4335675000000\n  plan entropy execution plus 21000 gas cost wei: 3571480000000\n\n[PASS] testSeasonFinalizeThreeWinnersAndPrizeKeeperProfit() (gas: 2703701)\nLogs:\n  season finalize three winners and prize execution gas: 570498\n  season finalize three winners and prize bounty wei: 14481975000000\n  season finalize three winners and prize execution plus 21000 gas cost wei: 11829960000000\n\n[PASS] testSeasonPrepareSingleParticipantKeeperProfit() (gas: 1190375)\nLogs:\n  season prepare one participant execution gas: 178184\n  season prepare one participant bounty wei: 4190850000000\n  season prepare one participant execution plus 21000 gas cost wei: 3983680000000\n\n[PASS] testStarterEntropyKeeperProfit() (gas: 274488)\nLogs:\n  starter entropy execution gas: 139836\n  starter entropy bounty wei: 3317175000000\n  starter entropy execution plus 21000 gas cost wei: 3216720000000\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 15.38ms (8.71ms CPU time)\n\nRan 3 tests for test/Pause.t.sol:PauseTest\n[PASS] testOnlySwarmBoundedDurationAndCannotExtendPause() (gas: 234226)\n[PASS] testSalePausedWhileEntropyClaimsWithdrawalsAndEpochsContinue() (gas: 10768601)\n[PASS] testUnpauseCannotResetNextPauseCooldown() (gas: 187697)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 28.11ms (22.16ms CPU time)\n\nRan 10 tests for test/Bounties.t.sol:BountiesTest\n[PASS] testAuditSelectionBountyOnlyForActuallySelectedFarms() (gas: 5386153)\n[PASS] testBuyBountyProportionalCapNoDustCreditAndFailureRollback() (gas: 715797)\n[PASS] testEmptyRosterAndInvalidBatchReceiveNothing() (gas: 1183732)\n[PASS] testEveryWorkKindBoundedByHeartbeatAndAuthorizedProducer() (gas: 63232864)\n[PASS] testPackEntropyCapturedOnceWithFullInventoryAndThroughPause() (gas: 2392032)\n[PASS] testPlanResolutionPaidOnceIncludingAdvanceForwarding() (gas: 2340288)\n[PASS] testSettlementPaidPerUnitNotPerCallAndCannotReplay() (gas: 3347373)\n[PASS] testStarterEntropySurvivesFullInventoryExpiryAndPauseWithoutReplayPayment() (gas: 3776023)\n[PASS] testWeeklyScoringAndFinalizeEachPaidOnceAndEmptyWeekUnpaid() (gas: 2265234)\n[PASS] testWorkCreditRespectsZeroGasPricePriceCeilingAndUnitCap() (gas: 320132)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 71.31ms (86.65ms CPU time)\n\nRan 2 tests for test/StandardMarket.t.sol:StandardMarketTest\n[PASS] testFuzzStandardSellNeverAddsProgressiveSurcharge(uint96) (runs: 256, μ: 1778151, ~: 1789787)\nLogs:\n  Bound result 17622\n\n[PASS] testStandardBuyOnePercentEvenSplitAndNetworkQuarterPercent() (gas: 1665539)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 76.28ms (70.87ms CPU time)\n\nRan 9 tests for test/Packs.t.sol:PacksTest\n[PASS] testExactPaymentAndFutureBlockRequired() (gas: 1109369)\n[PASS] testExactRarityThresholdsAndMythicGate() (gas: 270970)\n[PASS] testExpiryThreeCommonGpusAndInventoryOpeningLimit() (gas: 2369076)\n[PASS] testFuzzVrgdaAlwaysBounded(uint32,uint32) (runs: 256, μ: 44593, ~: 44574)\nLogs:\n  Bound result 39999\n\n[PASS] testItemTypeDistributionExact() (gas: 591753)\n[PASS] testNoWalletGlobalOrTokenPackDailyLimit() (gas: 3734800)\n[PASS] testStarterWindowProofTokenIdOnceAndInventoryFailureRetry() (gas: 574862)\n[PASS] testTokenPackDiscountAllToPoolAndBonusWhenInternal() (gas: 5955558)\n[PASS] testVrgdaInitialStepDecayFloorCeilingAndBulkPricing() (gas: 792119)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 81.04ms (98.98ms CPU time)\n\nRan 5 tests for test/V4Integration.t.sol:V4IntegrationTest\n[PASS] testRealV4BuyAndSingleSwapSellTaxConserveSettlement() (gas: 2251961)\n[PASS] testRealV4ManipulatedSpotCannotInstantlySetBuybackQuote() (gas: 1850204)\n[PASS] testRealV4SmallBuyPaysPositiveKeeperMargin() (gas: 1973585)\nLogs:\n  real V4 0.2ETH buy gas: 1837743\n  real V4 buy bounty wei: 46320350000000\n\n[PASS] testRealV4SystemBuyUsesTwapAndOnlySystemFunds() (gas: 1999728)\n[PASS] testSystemBuybackOffsetsRecordedSellImbalance() (gas: 2405344)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 87.83ms (6.75ms CPU time)\n\nRan 6 tests for test/Endowment.t.sol:EndowmentTest\n[PASS] testDirectTransferCannotBypassOrBackdateDrip() (gas: 364462)\n[PASS] testExactFundingFullLinearDripAndConservation() (gas: 803798)\n[PASS] testFuzzCumulativePaymentsCannotExceedVestedPrincipal(uint32,uint128) (runs: 256, μ: 520062, ~: 521650)\nLogs:\n  Bound result 80\n  Bound result 7574\n\n[PASS] testNoTeamDonorOrSwarmWithdrawalOrReserveAuthority() (gas: 621434)\n[PASS] testParamsSnapshotCannotAccelerateOrRelockExistingEndowment() (gas: 320979)\n[PASS] testUnderfundingCannotActivateAndDonationsStayConserved() (gas: 440979)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 96.47ms (82.48ms CPU time)\n\nRan 6 tests for test/Market.t.sol:MarketTest\n[PASS] testBuyChargesOnlyBaseAndNetworkPullPayment() (gas: 285313)\n[PASS] testFuzzTotalFeeHardCap(uint96) (runs: 256, μ: 1814535, ~: 1819604)\nLogs:\n  Bound result 20094097950717350012\n\n[PASS] testOnlyManagerCorrectPoolExactInputAndHookAddress() (gas: 108671)\n[PASS] testSingleDumpIncludesItselfAndFeeDecaysWithoutGriefReset() (gas: 16839752)\n[PASS] testTwapAveragesEthPriceAcrossUnequalPrices() (gas: 2335354)\n[PASS] testTwapWarmupAndFlashManipulationResistance() (gas: 1888831)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 104.64ms (138.83ms CPU time)\n\nRan 8 tests for test/FeesParams.t.sol:FeesParamsTest\n[PASS] testAllDefaultParamsWithinHardBounds() (gas: 892638)\n[PASS] testBuyBackPoolOnlySlippageFailureRollbackAndDustGriefBlocked() (gas: 823448)\n[PASS] testExactEthSplitsHeartbeatCapAndPullPayments() (gas: 441753)\n[PASS] testFuzzNoStepAboveTenPercent(uint96) (runs: 256, μ: 44624, ~: 44717)\nLogs:\n  Bound result 3309\n\n[PASS] testFuzzSplitsConserveEveryWei(uint96) (runs: 256, μ: 160086, ~: 162408)\nLogs:\n  Bound result 3309\n\n[PASS] testLoweringHeartbeatCapCannotUnderflowOrBlockRouting() (gas: 313141)\n[PASS] testParamsStepCooldownBoundsAuthorityAndLetter() (gas: 195336)\n[PASS] testPoolNoPublicReserveRecycleOrPayment() (gas: 126725)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 128.07ms (170.97ms CPU time)\n\nRan 1 test for test/StandardV4Integration.t.sol:StandardV4IntegrationTest\n[PASS] testStandardAdapterRealPoolPaysExistingHookExactlyOnce() (gas: 2053595)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 128.34ms (1.02ms CPU time)\n\nRan 1 test for test/EndowmentGame.t.sol:EndowmentGameTest\n[PASS] testRealMiningCannotSpendFutureEndowment() (gas: 92324026)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 137.82ms (132.05ms CPU time)\n\nRan 3 tests for test/Gas.t.sol:GasTest\n[PASS] testGasCommonActions() (gas: 6876427)\nLogs:\n  buy ETH pack: 551520\n  open one pack: 377594\n  equip: 218631\n  repair wallet: 278909\n  overclock: 136218\n  expand: 149822\n  token pack internal: 274165\n  withdraw: 123110\n  unequip: 117947\n\n[PASS] testGasEightFullFarmsSettlementStaysBounded() (gas: 84335748)\nLogs:\n  measure eight full 24-item farms: 17347631\n  measure bounty wei: 434204525000000\n  credit eight full farms: 3144337\n  credit bounty wei: 79121550000000\n\n[PASS] testGasTypicalFarmSettlementAndProfit() (gas: 6135777)\nLogs:\n  measure typical three-item farm: 752672\n  measure typical bounty: 19330625000000\n  credit typical farm: 1247577\n  credit typical bounty: 31702550000000\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 231.67ms (251.11ms CPU time)\n\nRan 6 tests for test/SeasonAudit.t.sol:SeasonAuditTest\n[PASS] testAuditExactTopDecileNoWhaleSoftCap() (gas: 21281575)\n[PASS] testLotteryEntitlementSurvivesFullInventory() (gas: 93840712)\n[PASS] testPackSupplyDropOnlyActiveFarmsAtDoublePace() (gas: 11621341)\n[PASS] testParameterChangesCannotChangeClosedEpochBetweenBatches() (gas: 7813052)\n[PASS] testSeasonCannotFinalizeEarlyAndExpiredLotteryMustRearm() (gas: 92097884)\n[PASS] testWeeklyThreeDistinctTicketWinnersRarePackAndBestPrize() (gas: 92709061)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 274.87ms (736.55ms CPU time)\n\nRan 13 tests for test/Events.t.sol:EventsTest\n[PASS] testCheapTariffAppliesCitywide() (gas: 5352967)\n[PASS] testColdPowerFireImmuneAndCleanPowerSurgeImmune() (gas: 3471793)\n[PASS] testFallbackAndExpiredSeedIndependentOfSwarmNumber() (gas: 1442208)\n[PASS] testFireNoCoolingZeroYieldColdPowerImmune() (gas: 2776882)\n[PASS] testGreenWaveRaisesDistrictMiningTenPercent() (gas: 5354302)\n[PASS] testLobbyOwnDistrictSplitDecayAndMinimumWeight() (gas: 448752)\n[PASS] testOutageAndOffgridRoomMitigation() (gas: 3102892)\n[PASS] testPlansOnlyNextTwoOnceAndBoundedSeverity() (gas: 333625)\n[PASS] testRollingCapsAndInitialPositiveQuotaWithHostilePlans() (gas: 87576236)\n[PASS] testSurgeCanDestroyCommonButNeverLegendary() (gas: 2896485)\n[PASS] testSurgeDamagesExactlyOneItemAndCleanPowerImmune() (gas: 2793233)\n[PASS] testSurgeNeverDestroysLegendaryOrMythic() (gas: 5868509)\n[PASS] testTheftRouterDisabledAndRepairRestores() (gas: 3073207)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 300.17ms (215.82ms CPU time)\n\nRan 11 tests for test/Items.t.sol:ItemsTest\n[PASS] testComputeHashSupportHashAndBonusesReplaceDuo() (gas: 2360699)\n[PASS] testDurabilityDecayRepairAndOverclockPreserved() (gas: 6459747)\n[PASS] testEquipRarityGatesAndMythicGate() (gas: 5193454)\n[PASS] testFullStackRarityCapAndRoomFlags() (gas: 3100083)\n[PASS] testInventoryMintCannotExceedCapacityAndExpansionRises() (gas: 2052309)\n[PASS] testMergeThreeIdenticalAndNoLegendaryMergeOrLockedExit() (gas: 6397581)\n[PASS] testOffgridSavings() (gas: 1320390)\n[PASS] testPaidXpCannotBypassRoomTwoAgeGate() (gas: 3607722)\n[PASS] testRoomGatesAndLevelProgression() (gas: 59616021)\n[PASS] testScrapPaysPoolYieldAndCannotRepeat() (gas: 5969107)\n[PASS] testSoulboundOnlyOwnFarmAndNoDuplicateTypes() (gas: 1029560)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 300.26ms (276.71ms CPU time)\n\nRan 6 tests for test/Regression.t.sol:RegressionTest\n[PASS] testCableRepairRestoresOnlyRemainingHalfEpoch() (gas: 9525350)\n[PASS] testEmptyEpochResetsScrapRateAndAllowance() (gas: 9305720)\n[PASS] testFuzzCableRepairBlendHandlesNonMonotonicRarityBonuses(uint16) (runs: 256, μ: 1014081, ~: 1014022)\nLogs:\n  Bound result 124\n\n[PASS] testRegisterOnlyAccountsDoNotAddSettlementWorkAndEmptyFarmCanRetire() (gas: 891447)\n[PASS] testRepairAndPaidPackCannotRetroactivelyBoostEpoch() (gas: 7559146)\n[PASS] testUnlimitedFreshPacksCannotDrainPoolByScrapping() (gas: 7075171)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 300.35ms (345.04ms CPU time)\n\nRan 9 tests for test/Epochs.t.sol:EpochsTest\n[PASS] testCannotAdvanceEarlyAndBountyOnce() (gas: 1835886)\n[PASS] testClaimsEveryEpochAndRedistributionIsNextEpoch() (gas: 9971686)\n[PASS] testGasAdvanceIndependentOfRoster() (gas: 436156707)\nLogs:\n  advance empty roster: 897600\n  advance 1000 farms: 898510\n\n[PASS] testNoCatchupEmissionDuringGap() (gas: 5395894)\n[PASS] testNoRetroactiveEquipmentAndBoundedBatches() (gas: 4957138)\n[PASS] testNoWhaleCapHashShares() (gas: 7441000)\n[PASS] testReferralOneLevelSetOnceNoSelf() (gas: 5751365)\n[PASS] testTaxCurveExactAndFloor() (gas: 27070)\n[PASS] testWithdrawFailureRollsBackAndReentrancyCannotClaimTwice() (gas: 5928077)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.64s (1.68s CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantsTest\n[PASS]\nInvariantsTest invariants:\n[PASS] invariantInventoryAndEthLiabilities\n[PASS] invariantPriceAndParamsBounds\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   | 974   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | buy       | 1040  | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | claim     | 991   | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | equip     | 1031  | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | expand    | 1067  | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | resolve   | 1040  | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | tokenPack | 1009  | 0       | 0        |\n|-------------+-----------+-------+---------+----------|\n| GameHandler | unplace   | 1040  | 0       | 0        |\n╰-------------+-----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 16.30s (16.29s CPU time)\n\nRan 25 test suites in 16.31s (20.35s CPU time): 123 tests passed, 0 failed, 1 skipped (124 total tests)\n","passed":true},{"durationMs":83,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"FarmCore.activity(address,uint256,uint256,uint256)\",\"FarmCore.buyTokenPack(bool)\",\"FarmCore.claimDrop()\",\"FarmCore.expand(bool)\",\"FarmCore.grantDrop(address,bytes32)\",\"FarmCore.lobby(uint256,bool)\",\"FarmCore.merge(uint256[3],bool)\",\"FarmCore.overclock(uint256,bool)\",\"FarmCore.paidPackBought(address,uint256,uint256)\",\"FarmCore.place(uint256,uint256,uint256)\",\"FarmCore.process(address,uint256)\",\"FarmCore.register(address)\",\"FarmCore.repair(uint256,bool)\",\"FarmCore.repairCable(bool)\",\"FarmCore.retire(address)\",\"FarmCore.scrap(uint256,uint256)\",\"FarmCore.setReferrer(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.safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\",\"FarmItems.safeTransferFrom(address,address,uint256,uint256,bytes)\",\"FarmItems.unequip(address,uint256)\",\"FarmRewards.advanceEpoch()\",\"FarmRewards.award(address,uint256)\",\"FarmRewards.claim(uint256)\",\"FarmRewards.processEpoch(uint256)\",\"FarmRewards.recordSales(uint256)\",\"FarmRewards.releasePrize(uint256)\",\"FarmRewards.scrap(address,uint256,uint256)\",\"FarmRewards.setReferrer(address,address)\",\"FarmRewards.spend(address,uint256)\",\"FeeRouter.depositBaseFee()\",\"FeeRouter.depositLobby()\",\"FeeRouter.depositPack()\",\"FeeRouter.depositSellTax()\",\"FeeRouter.executeBuys(uint256,uint256)\",\"FeeRouter.payBounty(address)\",\"FeeRouter.payWork(address,uint8,uint256,uint256)\",\"FeeRouter.receive()\",\"FeeRouter.withdraw()\",\"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),bytes32)\",\"PackSale.captureEntropy(uint256)\",\"PackSale.openPack(uint256)\",\"PackSale.pause(uint256)\",\"PackSale.resolve(uint256,uint256)\",\"PackSale.rewardPack(address)\",\"PackSale.tokenPack(address)\",\"PackSale.unpause()\",\"Params.set(uint8,uint256,string)\",\"RewardPool.activateEndowment()\",\"RewardPool.donate(uint256)\",\"RewardPool.fundEndowment()\",\"RewardPool.pay(address,uint256)\",\"RewardPool.recycle(uint256)\",\"RewardPool.reserve(uint256)\",\"Season.addPrize(uint256,uint256)\",\"Season.claimDistrict(uint256)\",\"Season.claimLottery(uint256)\",\"Season.finalize(uint256)\",\"Season.prepare(uint256,uint256)\",\"Season.rearm(uint256)\",\"Season.recordActivity(address,uint256,uint256)\",\"Season.recordSpend(address,uint256,bool)\",\"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)\",\"StandardMarket.buy(uint256,address)\",\"StandardMarket.flushFees()\",\"StandardMarket.receive()\",\"StandardMarket.unlockCallback(bytes)\",\"StandardMarket.withdrawNetwork()\",\"StarterClaim.captureEntropy(uint256)\",\"StarterClaim.claim(uint256,bytes32[])\",\"StarterClaim.resolve(uint256)\",\"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)\",\"V4Market.buy(uint256,address)\",\"V4Market.flushFees()\",\"V4Market.receive()\",\"V4Market.unlockCallback(bytes)\",\"V4Market.withdrawNetwork()\"],\"files\":{\".gitignore\":6,\"README.md\":51,\"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/verification-v3.json\":67,\"docs/dependency-provenance.md\":9,\"docs/design.md\":67,\"docs/launch-v31.md\":94,\"docs/report-v3.md\":143,\"docs/review-v31.md\":77,\"docs/security-review.md\":29,\"docs/simulation-assumptions.md\":41,\"docs/simulation-v3-historical.md\":44,\"foundry.toml\":20,\"launch/V4Market.sol\":889,\"regulator.md\":56,\"report.md\":128,\"script/Deploy.s.sol\":142,\"script/DeployMarket.s.sol\":15,\"sim/blackout_sim_v2.py\":509,\"sim/blackout_sim_v3.py\":338,\"sim/blackout_sim_v31.py\":24,\"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/tune_v3.py\":16,\"src/FarmCore.sol\":468,\"src/FarmEngine.sol\":204,\"src/FarmItems.sol\":118,\"src/FarmRewards.sol\":378,\"src/FeeRouter.sol\":176,\"src/GameRegistry.sol\":82,\"src/GridOperator.sol\":225,\"src/MarketFactory.sol\":58,\"src/PackSale.sol\":180,\"src/Params.sol\":175,\"src/RewardPool.sol\":110,\"src/Season.sol\":225,\"src/StandardAdapter.sol\":77,\"src/StandardMarket.sol\":26,\"src/StarterClaim.sol\":95,\"src/V4Market.sol\":354,\"src/interfaces/IGame.sol\":37,\"src/interfaces/IGameRegistry.sol\":13,\"src/interfaces/IV4.sol\":25,\"src/interfaces/Interfaces.sol\":14,\"src/lib/ChainClock.sol\":22,\"src/lib/Errors.sol\":12,\"src/lib/GameModule.sol\":14,\"src/lib/ItemMath.sol\":31,\"src/lib/ModuleCode.sol\":19,\"test/Base.t.sol\":149,\"test/Bounties.t.sol\":346,\"test/Clock.t.sol\":50,\"test/Deployment.t.sol\":71,\"test/Endowment.t.sol\":123,\"test/EndowmentGame.t.sol\":47,\"test/Epochs.t.sol\":178,\"test/Events.t.sol\":239,\"test/Factory.t.sol\":30,\"test/FeesParams.t.sol\":136,\"test/Gas.t.sol\":130,\"test/HookBinding.t.sol\":117,\"test/Invariants.t.sol\":129,\"test/Items.t.sol\":265,\"test/KeeperProfit.t.sol\":93,\"test/Market.t.sol\":114,\"test/Packs.t.sol\":160,\"test/Pause.t.sol\":73,\"test/Registry.t.sol\":125,\"test/Regression.t.sol\":152,\"test/SeasonAudit.t.sol\":176,\"test/StandardAdapter.t.sol\":80,\"test/StandardMarket.t.sol\":56,\"test/StandardV4Integration.t.sol\":114,\"test/V4Integration.t.sol\":152,\"test/fork/RobinhoodFork.t.sol\":39,\"test/mocks/MockGameRegistry.sol\":47,\"test/mocks/MockMarket.sol\":37,\"test/mocks/MockToken.sol\":38,\"test/mocks/MockV4Manager.sol\":62,\"test/python/test_merkle.py\":19,\"test/python/test_regulator.py\":25,\"test/python/test_v31.py\":38,\"tools/pin_module_code.py\":23,\"tools/regulator.py\":63,\"tools/report_v31.py\":55,\"tools/starter_merkle.py\":72},\"excluded\":[\"vendor/\",\"node_modules/\"],\"truncated\":true}","passed":true},{"durationMs":14944,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/V4Market.sol:101: V4Market.flushFees() (src/V4Market.sol#101-111) sends eth to arbitrary user\n[high/medium] weak-prng at src/V4Market.sol:194: V4Market._record(bool,uint256) (src/V4Market.sol#194-215) uses a weak PRNG: \"delete longVolumes[p % 24] (src/V4Market.sol#205)\"\n[high/medium] weak-prng at src/V4Market.sol:152: V4Market._observe(uint256) (src/V4Market.sol#152-172) uses a weak PRNG: \"observations[minute % 32] = Observation(uint64(minute),c) (src/V4Market.sol#166)\"\n[high/medium] weak-prng at src/V4Market.sol:174: V4Market._cumulativeAt(uint256) (src/V4Market.sol#174-181) uses a weak PRNG: \"o = observations[minute % 32] (src/V4Market.sol#178)\"\n[high/medium] weak-prng at src/V4Market.sol:194: V4Market._record(bool,uint256) (src/V4Market.sol#194-215) uses a weak PRNG: \"delete shortVolumes[p % 12] (src/V4Market.sol#199)\"\n[high/medium] weak-prng at src/V4Market.sol:194: V4Market._record(bool,uint256) (src/V4Market.sol#194-215) uses a weak PRNG: \"b = longVolumes[p % 24] (src/V4Market.sol#203)\"\n[high/medium] weak-prng at src/V4Market.sol:194: V4Market._record(bool,uint256) (src/V4Market.sol#194-215) uses a weak PRNG: \"a = shortVolumes[p % 12] (src/V4Market.sol#197)\"\n[high/medium] weak-prng at src/GridOperator.sol:98: GridOperator.lobbyAmount(uint256) (src/GridOperator.sol#98-105) uses a weak PRNG: \"a * 259200 / (259200 + dt % 259200) (src/GridOperator.sol#104)\"\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/RewardPool.sol:85: Reentrancy in RewardPool.donate(uint256) (src/RewardPool.sol#85-91):\n[high/medium] reentrancy-balance at src/FeeRouter.sol:155: Reentrancy in FeeRouter.executeBuys(uint256,uint256) (src/FeeRouter.sol#155-175):\n[high/medium] reentrancy-balance at src/RewardPool.sol:61: Reentrancy in RewardPool.fundEndowment() (src/RewardPool.sol#61-67):\n[high/medium] reentrancy-balance at src/FarmCore.sol:272: Reentrancy in FarmCore._charge(address,uint256,bool,uint8) (src/FarmCore.sol#272-288):\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/FarmCore.sol:327: Reentrancy in FarmCore.buyTokenPack(bool) (src/FarmCore.sol#327-335):\n[high/medium] reentrancy-eth at src/FarmCore.sol:300: Reentrancy in FarmCore.repairCable(bool) (src/FarmCore.sol#300-308):\n[high/high] uninitialized-state at src/FarmRewards.sol:170: FarmRewards.heaps (src/FarmRewards.sol#67) is never initialized. It is used in:\n[medium/medium] divide-before-multiply at src/FarmEngine.sol:78: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256) (src/FarmEngine.sol#78-126) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmCore.sol:366: FarmCore.scrap(uint256,uint256) (src/FarmCore.sol#366-375) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmEngine.sol:78: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256) (src/FarmEngine.sol#78-126) 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:152: V4Market._observe(uint256) (src/V4Market.sol#152-172) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at vendor/openzeppelin/contracts/utils/math/Math.sol:123: Math.mulDiv(uint256,uint256,uint256) (vendor/openzeppelin/contracts/utils/math/Math.sol#123-202) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at 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:174: V4Market._cumulativeAt(uint256) (src/V4Market.sol#174-181) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/V4Market.sol:152: V4Market._observe(uint256) (src/V4Market.sol#152-172) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/FarmCore.sol:366: FarmCore.scrap(uint256,uint256) (src/FarmCore.sol#366-375) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/FarmCore.sol:366: FarmCore.scrap(uint256,uint256) (src/FarmCore.sol#366-375) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:152: V4Market._observe(uint256) (src/V4Market.sol#152-172) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/FarmCore.sol:202: FarmCore.setReferrer(address) (src/FarmCore.sol#202-206) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/V4Market.sol:183: V4Market.twap() (src/V4Market.sol#183-188) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:198: Reentrancy in FarmRewards.processEpoch(uint256) (src/FarmRewards.sol#198-284):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:127: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#127-157):\n[medium/medium] reentrancy-no-eth at src/Season.sol:121: Reentrancy in Season.prepare(uint256,uint256) (src/Season.sol#121-146):\n[medium/medium] reentrancy-no-eth at src/V4Market.sol:320: Reentrancy in V4Market.unlockCallback(bytes) (src/V4Market.sol#320-344):\n[medium/medium] reentrancy-no-eth at src/RewardPool.sol:61: Reentrancy in RewardPool.fundEndowment() (src/RewardPool.sol#61-67):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:198: Reentrancy in FarmRewards.processEpoch(uint256) (src/FarmRewards.sol#198-284):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:198: Reentrancy in FarmRewards.processEpoch(uint256) (src/FarmRewards.sol#198-284):\n[medium/medium] reentrancy-no-eth at src/FarmCore.sol:393: Reentrancy in FarmCore.process(address,uint256) (src/FarmCore.sol#393-418):\n[medium/medium] reentrancy-no-eth at src/PackSale.sol:163: Reentrancy in PackSale.resolve(uint256,uint256) (src/PackSale.sol#163-179):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:198: Reentrancy in FarmRewards.processEpoch(uint256) (src/FarmRewards.sol#198-284):\n[medium/medium] reentrancy-no-eth at src/FarmRewards.sol:127: Reentrancy in FarmRewards.advanceEpoch() (src/FarmRewards.sol#127-157):\n[medium/medium] uninitialized-local at src/FarmCore.sol:380: FarmCore.roomStats(address,uint256).snap (src/FarmCore.sol#380) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:80: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256).mask (src/FarmEngine.sol#80) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GridOperator.sol:174: GridOperator._resolve(uint256,address).repeated (src/GridOperator.sol#174) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:140: FarmEngine.process(address,uint256,FarmEngine.Snapshot).occupied (src/FarmEngine.sol#140) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PackSale.sol:172: PackSale.resolve(uint256,uint256).k (src/PackSale.sol#172) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmRewards.sol:247: FarmRewards.processEpoch(uint256).referral (src/FarmRewards.sol#247) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:145: FarmEngine.process(address,uint256,FarmEngine.Snapshot).cursor (src/FarmEngine.sol#145) is a local variable never initialized\n[medium/medium] uninitialized-local at src/V4Market.sol:247: V4Market._sellFee(uint256).average (src/V4Market.sol#247) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:82: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256).rarity (src/FarmEngine.sol#82) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:163: FarmEngine.process(address,uint256,FarmEngine.Snapshot).damage (src/FarmEngine.sol#163) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:146: FarmEngine.process(address,uint256,FarmEngine.Snapshot).baseline (src/FarmEngine.sol#146) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GridOperator.sol:173: GridOperator._resolve(uint256,address).positives (src/GridOperator.sol#173) is a local variable never initialized\n[medium/medium] uninitialized-local at src/V4Market.sol:218: V4Market.imbalances().s (src/V4Market.sol#218) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PackSale.sol:173: PackSale.resolve(uint256,uint256).r (src/PackSale.sol#173) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmEngine.sol:81: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256).tags (src/FarmEngine.sol#81) is a local variable never initialized\n[medium/medium] uninitialized-local at src/V4Market.sol:219: V4Market.imbalances().b (src/V4Market.sol#219) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmCore.sol:401: FarmCore.process(address,uint256).occupied (src/FarmCore.sol#401) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GridOperator.sol:188: GridOperator._resolve(uint256,address).weights (src/GridOperator.sol#188) is a local variable never initialized\n[medium/medium] uninitialized-local at src/FarmRewards.sol:204: FarmRewards.processEpoch(uint256).work (src/FarmRewards.sol#204) is a local variable never initialized\n[medium/medium] uninitialized-local at src/GridOperator.sol:189: GridOperator._resolve(uint256,address).sum (src/GridOperator.sol#189) is a local variable never initialized\n[medium/medium] unused-return at src/StandardAdapter.sol:53: StandardAdapter.buy(uint256,address) (src/StandardAdapter.sol#53-62) ignores return value by manager.unlock(abi.encode(msg.value,minOut,recipient)) (src/StandardAdapter.sol#58)\n[medium/medium] unused-return at src/V4Market.sol:320: V4Market.unlockCallback(bytes) (src/V4Market.sol#320-344) ignores return value by manager.settle{value: input}() (src/V4Market.sol#339)\n[medium/medium] unused-return at src/StarterClaim.sol:80: StarterClaim.resolve(uint256) (src/StarterClaim.sol#80-94) ignores return value by items().mint(c.player,0,1,true) (src/StarterClaim.sol#91)\n[medium/medium] unused-return at src/Season.sol:217: Season.claimLottery(uint256) (src/Season.sol#217-224) ignores return value by (k,None) = ItemMath.draw(seed,false,false) (src/Season.sol#221)\n[medium/medium] unused-return at src/PackSale.sol:163: PackSale.resolve(uint256,uint256) (src/PackSale.sol#163-179) ignores return value by items().mint(c.player,k,r,false) (src/PackSale.sol#176)\n[medium/medium] unused-return at src/FeeRouter.sol:155: FeeRouter.executeBuys(uint256,uint256) (src/FeeRouter.sol#155-175) ignores return value by market().buy{value: ethAmount}(minOut,rewardPool()) (src/FeeRouter.sol#167)\n[medium/medium] unused-return at src/FarmRewards.sol:198: FarmRewards.processEpoch(uint256) (src/FarmRewards.sol#198-284) ignores return value by (kind,severity,None,seed,None) = grid().eventAt(id) (src/FarmRewards.sol#203)\n[medium/medium] unused-return at src/StarterClaim.sol:80: StarterClaim.resolve(uint256) (src/StarterClaim.sol#80-94) ignores return value by items().mint(c.player,k,r,true) (src/StarterClaim.sol#91)\n[medium/medium] unused-return at src/StandardAdapter.sol:64: StandardAdapter.unlockCallback(bytes) (src/StandardAdapter.sol#64-76) ignores return value by manager.settle{value: input}() (src/StandardAdapter.sol#73)\n[low/medium] events-maths at src/FarmRewards.sol:357: FarmRewards.scrap(address,uint256,uint256) (src/FarmRewards.sol#357-363) should emit an event for: \n[low/medium] events-maths at src/PackSale.sol:116: PackSale.openPack(uint256) (src/PackSale.sol#116-123) should emit an event for: \n[low/medium] calls-loop at src/FarmRewards.sol:164: FarmRewards._greater(uint256,uint256,uint256) (src/FarmRewards.sol#164-168) has external calls inside a loop: y = shares[e][core().playerAt(b)].raw (src/FarmRewards.sol#166)\n[low/medium] calls-loop at src/FarmEngine.sol:38: FarmEngine.items() (src/FarmEngine.sol#38-40) has external calls inside a loop: FarmItems(registry.module(3)) (src/FarmEngine.sol#39)\n[low/medium] calls-loop at src/PackSale.sol:85: PackSale.priceAt(uint256) (src/PackSale.sol#85-103) has external calls inside a loop: exponent = wadLn(int256(1000000000000000000 + params().get(Params.Key.PriceStepBps) * 1e14)) * ahead / 1000000000000000000 (src/PackSale.sol#91)\n[low/medium] calls-loop at src/FarmEngine.sol:78: FarmEngine._stats(FarmEngine.Snapshot,uint256,bool,uint256) (src/FarmEngine.sol#78-126) has external calls inside a loop: x_scope_2 = items().data(id_scope_1) (src/FarmEngine.sol#99)\n[low/medium] calls-loop at src/FarmRewards.sol:87: FarmRewards.core() (src/FarmRewards.sol#87-89) has external calls inside a loop: ICore(registry.module(2)) (src/FarmRewards.sol#88)\n[low/medium] calls-loop at src/FarmRewards.sol:198: FarmRewards.processEpoch(uint256) (src/FarmRewards.sol#198-284) has external calls inside a loop: shares[id][core().playerAt(_pop(id))].audit = true (src/FarmRewards.sol#225)\n[low/medium] calls-loop at src/FarmEngine.sol:128: FarmEngine.process(address,uint256,FarmEngine.Snapshot) (src/FarmEngine.sol#128-203) has external calls inside a loop: items().maintain(id,uint16(0),x.overclock) (src/FarmEngine.sol#177)\n[low/medium] calls-loop at src/FarmEngine.sol:128: FarmEngine.process(address,uint256,FarmEngine.Snapshot) (src/FarmEngine.sol#128-203) has external calls inside a loop: items().maintain(id,uint16(x.durability - damage),x.overclock) (src/FarmEngine.sol#177)\n[low/medium] calls-loop at src/FarmCore.sol:177: FarmCore._roll(address,uint256) (src/FarmCore.sol#177-191) has external calls inside a loop: x = items().data(f.active[i]) (src/FarmCore.sol#187)\n[low/medium] calls-loop at src/FarmCore.sol:65: FarmCore.items() (src/FarmCore.sol#65-67) has external calls inside a loop: FarmItems(registry.module(3)) (src/FarmCore.sol#66)\n[low/medium] calls-loop at src/FarmCore.sol:177: FarmC","passed":true},{"durationMs":951,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/GameRegistry.sol:76: `abi.encodePacked()` Hash Collision (2 places)\n[high] contract-locks-ether at src/GridOperator.sol:11: Contract locks Ether without a withdraw function (3 places)\n[high] eth-send-unchecked-address at src/FeeRouter.sol:146: ETH transferred without address checks (4 places)\n[high] reentrancy-state-change at src/FarmCore.sol:217: Reentrancy: State change after external call (46 places)\n[high] unprotected-initializer at src/MarketFactory.sol:16: Unprotected initializer\n[low] costly-loop at src/FarmCore.sol:185: Costly operations inside loop (17 places)\n[low] division-before-multiplication at src/FarmCore.sol:370: Incorrect Order of Division and Multiplication\n[low] large-numeric-literal at src/FarmCore.sol:293: Large Numeric Literal (78 places)\n[low] literal-instead-of-constant at src/FarmCore.sol:62: Literal Instead of Constant (406 places)\n[low] local-variable-shadowing at src/FarmRewards.sol:45: Local Variable Shadows State Variable (2 places)\n[low] missing-inheritance at src/Params.sol:6: Missing Inheritance\n[low] non-reentrant-not-first at src/FarmRewards.sol:350: `nonReentrant` is Not the First Modifier (3 places)\n[low] require-revert-in-loop at src/FarmCore.sol:223: Loop Contains `require`/`revert` (10 places)\n[low] state-change-without-event at src/FarmCore.sol:393: State Change Without Event (16 places)\n[low] unchecked-return at src/FarmCore.sol:296: Unchecked Return (12 places)\n[low] uninitialized-local-variable at src/FarmCore.sol:223: Uninitialized Local Variable (35 places)\n[low] unused-public-function at src/FarmCore.sol:150: Public Function Not Used Internally (4 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d8a5c6a0cf2ac848ac40c09c7b8bd355b6b2fa9e7c42118a7b17e6197aaf7d15","verifiedTreeHash":"8625cfa25405d6b0eac8b107c1cdfcd2b250bad4","verifierVersion":"0.1.0+0e08a464"}]}