{"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":"55bfb5c6-093b-4ab4-83ef-5ddb1a4c1cf3","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"fb2918c9239910cd78c17bcd079e72fa497cf6bf50685bdc971d7ede3ef39095","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"71a713407c0ddb5a858aaef80b761ed2def3fe57c42183b26ded234de0dfe00c","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"130949862c13f91ad8bf83e97f83a7b4a78230882f05d799c8521ae790c6326a","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"13012d29e907dfa98f5e1ab360fa6dbc7f7d1b282b8f795c75f6ae11ae4afcc6","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":"1bddfa1524cf6f3dad6ad72d9c4ef183875143e8b4261ecbe7f9736b2af26e38","dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"956bda2a1d1022219c696fbfd415f6c600bc5edae23502d37adc36d4d3eddd7a","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"3231d2bf09c4b55825b86394294d83b3a84131eb84c7824bd05d4ceb3ef4e1f4","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"744b62f23ff59014ee496e3d97d35a3e21a7ad232a0f2b87cd718b7ca168bbd6","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"ed34a9623b5fa67867fb99ee912ff7d3c7a0cc769f476b66d73ec68e39f0939c","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Audit and deploy Sherwood v2 on Robinhood Chain (4663) for $IMD, with no new token. Sherwood v2 (src/SherwoodV2.sol) is a Uniswap v4 hook running a leaderboard game in rolling 20-hour rounds on one native-ETH/$IMD pool: every buy scores points and pays 5% of its ETH into the round's pot. Moves are Buy, Steal, Robin Hood, Flip (Dice Protocol randomness) and Shield, with stacking charges. Each pot pays the top 3 40/20/10%, 8% to the King of the Hill (longest at #1), 10% buys back and burns $IMD through the existing ETH/$IMD 1% pool, 7% buys back and burns $PFWA (the host token) through its holder pool, and 5% rolls over. Prizes are claimed within 7 days; anything unclaimed goes into the live round's pot. A v4 hook needs its permission flags (0x20CC) in its address, and this launch takes no salt, so deploy ONE contract, src/SherwoodV2Launcher.sol:SherwoodV2Launcher, whose constructor finds the salt onchain and deploys the hook with CREATE2 (about 10M gas; rehearsed on a fork in test/SherwoodV2LauncherFork.t.sol). The hook is launcher.hook(). Constructor arguments, in order: poolManager 0x8366a39cc670b4001a1121b8f6a443a643e40951, token ($IMD) 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, host ($PFWA) 0xa934ba4f59070149d37a93f8a002af79bae35563, hostHolderMin 100000000000000000000000, dice 0xd8a0680e7699526b57140ed4eafdcc7219dc0a0c, diceProvider 0x8741b8a825644d9ef18faf2dab5e9b47b900f2b6, owner $owner, genesis 1791835200. Please keep the game rules and the split as they are; fix anything the audit finds. Focus: swap delta accounting and the two buyback swaps in unlockCallback, pot/prize/referral/claim/sweep accounting (ETH out can never exceed ETH in, and settlement can never revert), the flip lifecycle with Dice, the charge clocks, the King of the Hill reign tracking, and anything that could block swaps, settlement or claims. Our own notes for the audit are in README.md under Sherwood v2. This repository already carries the fixes from IMD launch 1355's audit of this code (ADAPTATION.md, revisions 1 and 2) and, in revision 3, the fix for the finding that parked that launch: settle now credits a final unknown spell to the round's final #1 (test_settleCreditsTheFinalUnknownSpellToTheFinalLeader). The runtime is 24,480 bytes, 96 under EIP-170.","parentJobId":null,"planHash":"90684159d5f27307fad16dedc860e5e44ad88a9d69f9648d515f04f9167cf00b","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"55bfb5c6-093b-4ab4-83ef-5ddb1a4c1cf3","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1389-audit-deploy-sherwood-v2"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51512","feedbackHash":"74275ea3b086f4fca3f5c437c2bbc176f6f07b1ee9a1a873b4b052b7a09b0009","nodeKey":"adapt_contract_project","submissionHash":"fb2918c9239910cd78c17bcd079e72fa497cf6bf50685bdc971d7ede3ef39095","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51081","feedbackHash":"728a5971714b55ae96993c4b7fce5aa3404f513fedca09384e42c270a5a0e153","nodeKey":"audit_economics","submissionHash":"71a713407c0ddb5a858aaef80b761ed2def3fe57c42183b26ded234de0dfe00c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52161","feedbackHash":"e7e01c71fd38dcd3e9aad2cc4ecdba88fa44447c6c0f7b8e7e56634b12503e6c","nodeKey":"audit_flow","submissionHash":"130949862c13f91ad8bf83e97f83a7b4a78230882f05d799c8521ae790c6326a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50989","feedbackHash":"61af7f3a807f171558ff9c9863996aaf4f1ec04f7882eadb9ab058a401e1e759","nodeKey":"audit_imported_code","submissionHash":"13012d29e907dfa98f5e1ab360fa6dbc7f7d1b282b8f795c75f6ae11ae4afcc6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52666","feedbackHash":"dffce41e2091c43b79d9dbdc2f0e09f014def636a211036eb7b845046915ba54","nodeKey":"audit_judge","submissionHash":"1bddfa1524cf6f3dad6ad72d9c4ef183875143e8b4261ecbe7f9736b2af26e38","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52200","feedbackHash":"4043be6beec38131ae921283662e723efc3725484fe1f1809a20fedc8b250827","nodeKey":"audit_math","submissionHash":"956bda2a1d1022219c696fbfd415f6c600bc5edae23502d37adc36d4d3eddd7a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52145","feedbackHash":"1285614075caad62b98dce22ac5e5d55d000e5f450c3e42eb771813332f9cac1","nodeKey":"audit_permissions","submissionHash":"3231d2bf09c4b55825b86394294d83b3a84131eb84c7824bd05d4ceb3ef4e1f4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52210","feedbackHash":"5e864296cd4ad8ae4a9843cf790ccb2dcac510e3c7d7757b18b4dfc6fe7e1126","nodeKey":"manifest","submissionHash":"744b62f23ff59014ee496e3d97d35a3e21a7ad232a0f2b87cd718b7ca168bbd6","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52222","feedbackHash":"335350b6cf65f98998df8156124dbc339a0cc5a408d78b93563039e0595a75fb","nodeKey":"write_foundry_tests","submissionHash":"ed34a9623b5fa67867fb99ee912ff7d3c7a0cc769f476b66d73ec68e39f0939c","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"44df50947c04703d1078147a0c8485f7ef56abe2371a69f054c593dcbbd85a08","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e36579e0223ff908","findings":[{"citation":"resolved","description":"The brief says 10% of every pot buys back and burns $IMD through the existing ETH/$IMD 1% pool and 7% burns $PFWA through its holder pool, and the launch rules want applications configured in their constructors. The hook instead leaves both buyback pools empty at deployment and lets the owner set each once with setBuybackPool / setHostBuybackPool (src/SherwoodV2.sol:1112 and :1120). _checkBuybackPool (:1128) only requires currency0 == ETH, currency1 == the token and hooks != this hook; any fee, tick spacing and any other hook are accepted, and nothing ties the key to the 1% pool or the holder pool. A pool whose hook returns a beforeSwap delta that takes the ETH (a flag-bearing contract anyone can deploy and initialize a pool with) therefore receives the burn reserve instead of the pool the brief names: unlockCallback (:1070) settles exactly delta.amount0, accepts any `out` >= the operator's minOut (0 is allowed), and marks the reserve spent. The same owner also creates the game pool (beforeInitialize) and names the operator after deployment. This is owner trust, but it is a diversion path for 17% of every pot that the brief's wording does not allow, it is configured after deployment rather than in the constructor, and the ETH/$IMD 1% pool key (fee 10000, tickSpacing 100, hooks 0) and the holder pool key (fee 0x800000, tickSpacing 200, hooks 0xb914f955294799de4b891bd2EA8AF628Fa1c68CC) are static values the launcher could take as constructor arguments (6 more words, 14 of the allowed 16) and store without touching another contract, which keeps the empty-chain rehearsal passing. Fix: fix both burn pool keys in the constructor (or at least the hooks field, which is what decides where the ETH goes), remove or restrict the setters, and keep _checkBuybackPool on first use.","line":1112,"path":"src/SherwoodV2.sol","reproduction":"State: a fresh SherwoodV2 (owner = O). Deploy CaptureHook at an address with flags BEFORE_SWAP | BEFORE_SWAP_RETURNS_DELTA whose beforeSwap takes ethIn-1 of currency0 to address T and returns toBeforeSwapDelta(ethIn-1, 0); initialize PoolKey(ETH, token, 3000, 60, CaptureHook) with liquidity. O calls setBuybackPool(thatKey): accepted. alice buys 0.1 ETH (pot 0.005 ETH); after roundEnd(0)+15min settle(0,100): buybackReserve = 0.0005 ETH. O (or the operator) calls buybackAndBurn(0.0005 ether, 0). Expected: 0.0005 ETH swapped in the ETH/$IMD 1% pool and the tokens sent to 0xdEaD. Actual: T.balance == 499999999999999 wei, DEAD received 0 tokens, buybackReserve == 0 and BuybackBurned(amount, 0) was emitted. Scratch test test/scratch/BuybackDiversion.t.sol (passes on this code, showing the diversion).","severity":"medium","snippet":"    function setBuybackPool(PoolKey calldata key) external onlyOwner {","title":"Burn pools are chosen by the owner after deployment and are not checked against the brief: a pool whose hook captures ETH takes the whole 17% burn share"},{"citation":"resolved","description":"The hook is deployed unconfigured: the game pool can only be created by the owner (beforeInitialize at :431 requires sender == owner) and the two burn pools can only be set by the owner (:1112, :1120). setOwner (:1101) writes any address in one step, including address(0) or a typo, and there is no acceptOwner. A wrong setOwner before the setup in script/SetupSherwoodV2.s.sol is unrecoverable: no pool can ever be initialized on the hook, so the launched contract can never run a game, and after setup a lost owner means the burn reserves can only be swapped by the current operator. Fix: reject address(0) and use a two-step transfer (pendingOwner + acceptOwner); 96 bytes of runtime margin are available, and one internal constant view could be dropped if needed.","line":1101,"path":"src/SherwoodV2.sol","reproduction":"State: freshly deployed hook, owner O, poolId == 0, buybackPool unset. O calls setOwner(address(0)) (or any address nobody controls): succeeds, OwnerChanged(0). Then O calls poolManager.initialize(PoolKey(ETH, IMD, 9000, 180, hook), price): reverts NotOwner from beforeInitialize; O calls setBuybackPool(burnKey): reverts NotOwner; setOperator: reverts NotOwner. Expected: the owner handover is refused or can be reverted by the new owner accepting; actual: the hook is permanently unusable (no pool can ever carry it) and every pot/reserve path is dead.","severity":"low","snippet":"    function setOwner(address next) external onlyOwner {","title":"setOwner is single-step with no zero check: setting the owner to 0 before the owner setup leaves the hook permanently without a game pool or burn pools"},{"citation":"resolved","description":"_mine (:53) hashes salts 0,1,2,... until the CREATE2 address matches the 14 flag bits, so the number of tries is a geometric draw with mean 16,384 that is fixed by the launcher's own address (factory address + launch salt) and the hook's init-code hash. Each try costs about 100-125 gas (keccak of 85 bytes plus the loop; the README's own figure is 16k tries for about 2M gas), so a draw of k tries costs about 125k gas on top of the hook creation (about 5.5M, mostly the 24,480-byte code deposit). P(k > 100,000) is about 0.2% (about 18M gas in total), P(k > 200,000) about 5e-6 (about 30M), and at MAX_TRIES = 400,000 the constructor would need about 55M gas, more than a 32M per-transaction limit, before it could revert NoSalt. The verifier simulates the exact transaction, so a bad draw parks the launch rather than wasting ETH, but the deployer's gasCeilingWei must be sized for the tail, not the mean, and the salt the factory uses decides the outcome. Informational: this matches ADAPTATION.md's open item; no code change is required, only a gas ceiling that admits well above the 10M mean (about 18M covers all but 1 draw in 500).","line":17,"path":"src/SherwoodV2Launcher.sol","reproduction":"Input: a factory address and launch salt for which the first index i with (keccak256(0xff ++ launcherAddress ++ i ++ initHash) & 0x3FFF) == 0x20CC exceeds (gasCeiling - 5.5M) / 125. Expected: the launch deploys the hook. Actual: the launcher constructor runs out of gas inside _mine (or, past 400,000 tries, reverts NoSalt) and the deployment transaction fails; e.g. with a 10M ceiling any draw above about 36,000 tries (about 11% of launcher addresses) fails, with a 15M ceiling about 1% fail.","severity":"info","snippet":"    uint256 internal constant MAX_TRIES = 400_000; // missing a match this long is ~e^-24","title":"Launcher salt mining is open-ended: the deploy gas depends on the launcher address, up to about 45M gas at MAX_TRIES, so the gas ceiling must cover a bad draw"}],"hash":"13012d29e907dfa98f5e1ab360fa6dbc7f7d1b282b8f795c75f6ae11ae4afcc6","nodeId":"26694d3e-e178-47a1-85b6-2903616cd1ee","outcome":"completed","summary":"The review is complete. `.imd-findings.json` holds three findings, each with a concrete failing input, and all snippets match the tree. Nothing outside `test/scratch/` and the findings file was created.\n\n**Outcome: no critical or high defect found.** The hook's delta accounting, pot and prize accounting, flip lifecycle, charge clocks and reign tracking held up against every counterexample I tried, and the project's 250 unit tests pass on this commit. The three findings are a trust-boundary gap, an ownership footgun, and a deployment-gas note.\n\n**Findings written**\n\n- **Medium, `src/SherwoodV2.sol:1112`.** Both burn pools are set by the owner after deployment, and the check only requires ETH as currency0, the right token as currency1, and a hook other than this one. The brief's \"existing ETH/$IMD 1% pool\" and \"holder pool\" are not enforced. A scratch test (test/scratch/BuybackDiversion.t.sol) initializes a pool whose hook takes the ETH in beforeSwap, has the owner set it as the buyback pool, and runs `buybackAndBurn`: the beneficiary receives the whole reserve minus 1 wei, zero tokens reach the dead address, and the reserve is marked spent. Fix suggested: fix the two pool keys (at least their hook fields) in the constructor; 6 extra arguments still fit under the 16-argument limit and need no external call.\n- **Low, `src/SherwoodV2.sol:1101`.** `setOwner` is single-step with no zero check. Since the game pool and burn pools can only be created by the owner, a mistaken `setOwner` before setup leaves a hook no pool can ever carry.\n- **Info, `src/SherwoodV2Launcher.sol:17`.** Salt mining is open-ended: tries are a geometric draw fixed by the launcher's address, about 125 gas each. A 10M gas ceiling fails for roughly 1 in 9 launcher addresses; about 18M covers all but 1 in 500.\n\n**Coverage**\n\n- Read in full: `src/SherwoodV2.sol`, `src/SherwoodV2Launcher.sol`, the setup script, `launch.json` (schema-valid: three keys, 8 string arguments, notes 2,814 characters), and the relevant v4-core hook and PoolManager paths.\n- Read for context only: `src/Sherwood.sol` (v1, not launched here), the test suite and fixtures.\n- Not reached: the live Dice contract's `refundRequest`. The hook's `receive()` writes storage, so a refund pushed with a 2300-gas stipend would revert. The live bytecode has no transfer/send stipend pattern, which suggests a full-gas call, but my fork rehearsal of the refund did not complete against the public RPC in the time available, so this stays unverified rather than a finding. The holder-pool hook's behavior under the host buyback was also not independently verified beyond the project's own fork test.","treeHash":null,"usage":{"cachedInputTokens":2746503,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":70891,"runtime":"claude","turns":39,"wallClockMs":1866442}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ca075d17c94a854b","findings":[{"citation":"resolved","description":"_credit sets _leader[round] to any player credited while the cache is empty (`leader == address(0)`), even when that player's updated total is still at or below zero (src/SherwoodV2.sol:763-764). _currentLeader then returns that player as #1 although nobody is above zero (the reign tracking already treats them as nobody: _setReign maps a leader with points <= 0 to address(0)). The ROBIN_HOOD branch only skips when the leader is address(0)/UNKNOWN_REIGN or the player themself, so with a below-zero cached #1 and another recent player it reaches _spend: the charge is consumed and `moved` is 0 because _positive(leader) is 0. The README rule is 'a Robin Hood with no leader ... plays as a Buy and keeps its charge', and the ROBIN_HOOD/no-leader path (leader == address(0)) does keep it; this cache state is the one case where it does not. Reachable whenever every scoring player of a round is at or below zero (lost flips, reflected attacks, sells), which is plausible early in a round. Impact is a wrongly consumed Robin Hood charge (1 per hour, 3 banked); no ETH is involved. Minimal fix: in the ROBIN_HOOD branch require `points[round][leader] > 0` (or `_positive(round, leader) > 0`) before spending the charge, or have _credit only adopt a player as the cached leader when `updated > 0` when the cache is empty.","line":559,"path":"src/SherwoodV2.sol","reproduction":"Round 0, fixture test/helpers/SherwoodV2Fixture.sol. 1) alice BUY 0.001 ETH (1 pt), alice FLIP 0.003 ETH, Dice reveals odd: alice = -2, cache rescans to address(0). 2) carol BUY 0.001, FLIP 0.007, loses: carol = -6. 3) bob BUY 0.001 (bob is cached #1 at 1), FLIP 0.005, loses: bob = -4; the callback rescans (3 players <= MAX_CALLBACK_SCAN) and sets _leader = address(0), reignHolder = 0. 4) alice BUY 0.001: alice = -1 and, because the cache is empty, _leader = alice (leader(0) == alice) while reignHolder stays 0. 5) carol plays ROBIN_HOOD with 0.001 ETH: robinsLeft(carol) was 3. Expected (README): nobody is above zero, so the move plays as a Buy and robinsLeft(carol) stays 3. Actual: _currentLeader returns alice (-1), _lowestRecent returns carol/bob, _spend runs, robinsLeft(carol) == 2, pointsMoved == 0. The scratch test test/scratch/RobinHoodNoLeader.t.sol fails on this code with 'charge spent on a Robin Hood with no leader above zero: 2 != 3'.","severity":"low","snippet":"                address leader = _currentLeader(round);\n                if (uint160(leader) > uint160(UNKNOWN_REIGN) && leader != player) {\n                    target = _lowestRecent(round, leader);","title":"Robin Hood spends a charge against a cached #1 who is at or below zero (README: no leader keeps the charge)"},{"citation":"resolved","description":"The manifest's notes end with 'After deployment the owner initializes the game pool against launcher.hook() and sets the two buyback pools with setBuybackPool and setHostBuybackPool'. Revision 4 (ADAPTATION.md) removed both setters from src/SherwoodV2.sol and fixed the burn pool keys at deployment (buybackPool()/hostBuybackPool() are derived from the token/host constructor arguments and constants); the only remaining `setBuybackPool` is in the v1 contract src/Sherwood.sol:716. The notes are explanatory text, not deployment authority, and the contracts list and constructor arguments match the brief, so this does not change what is deployed; but an operator following the notes would look for a setup step that does not exist. The README and script/SetupSherwoodV2.s.sol are already correct (create the game pool, setOperator). Fix: drop the sentence about the setters from the notes when the manifest step rewrites launch.json.","line":18,"path":"launch.json","reproduction":"grep -n setBuybackPool src/SherwoodV2.sol README.md script/SetupSherwoodV2.s.sol returns nothing; grep -n setBuybackPool launch.json matches line 18. Expected: the notes describe the accepted tree (fixed burn pools, no setter). Actual: they name two owner calls that would revert as unknown selectors on the deployed hook.","severity":"info","snippet":"  \"notes\": \"Sherwood v2 on Robinhood Chain (4663) for the existing $IMD token. No new token, pool, distributor, ETH funding or initialization call: this manifest deploys exactly one contract, src/SherwoodV2Launcher.sol:SherwoodV2Launcher. A Uniswap v4 hook must carry its permission flags in the low 14 bits of its address and this launch takes no salt, so the launcher's constructor mines the first CREATE2 salt (from its own address, up to 400000 tries, about one in 16384 matches) whose address carries flags 0x20CC (beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta), then deploys src/SherwoodV2.sol:SherwoodV2 there with CREATE2 and reverts with NoSalt if the create fails. Mining and hook deployment together cost about 10M gas, rehearsed on a fork in test/SherwoodV2LauncherFork.t.sol. The game is launcher.hook() and the salt used is launcher.salt(). Neither constructor calls another contract (the launcher only hashes and creates; the hook stores its argu","title":"launch.json notes describe post-deploy setters (setBuybackPool/setHostBuybackPool) that SherwoodV2 no longer has"}],"hash":"130949862c13f91ad8bf83e97f83a7b4a78230882f05d799c8521ae790c6326a","nodeId":"68b3e16f-7ad5-4cbe-90a6-1af870a74f4b","outcome":"completed","summary":"Both probes pass. The review is complete and `.imd-findings.json` holds the results.\n\n**Outcome:** the control flow in `src/SherwoodV2.sol` holds in every focus area. I found one low defect with a failing proof test and one informational manifest note. No critical, high or medium finding.\n\n**Findings written to `.imd-findings.json`:**\n- **Low, Robin Hood charge with no leader above zero** (`src/SherwoodV2.sol:559`). When every scoring player is at or below zero, a credit while the leader cache is empty makes a below-zero player the cached #1. A Robin Hood then reaches the charge spend and moves nothing, although the README says a Robin Hood with no leader keeps its charge. The self-contained proof `test/scratch/RobinHoodNoLeader.t.sol` fails on this tree with `robinsLeft` 2 instead of 3.\n- **Info, stale manifest notes** (`launch.json:18`). The notes tell the owner to call two setters that revision 4 removed from v2. Contracts and constructor arguments match the brief.\n\n**What I verified and recorded as holding:**\n- Swap deltas: a buy's fee take plus the positive specified delta makes the swapper pay exactly its declared amount, and the partial-fill check compares the pre-hook pool delta. A sell's fee flows through the unspecified delta and nets the take.\n- Both buyback swaps settle exactly what the pool took, burn the net output, and return partial fills to their own reserve. Both fixed pool keys exist on the live chain. I confirmed slot0 for the 1%/100 key and the holder key by RPC, and the launcher fork rehearsal burns through both.\n- Pot, prize, referral, claim and sweep accounting conserve ETH. Settlement has no revert path other than gas, and every pending flip is expirable five minutes before settlement opens.\n- Flip lifecycle, charge clocks, and King of the Hill reign tracking, including a cold-storage callback on a 12-player board where the previous player takes #1 within the 200k limit, and a batched settlement that credits the final unknown spell to the right King.\n- $IMD and $PFWA transfer without fee, so the holding rule and holder bonus work as written.\n\n**Coverage:** all 19 SherwoodV2 entry points are answered (18 hold, one carries finding 1), plus rows for the three invariants, the manifest and the live dependencies. The 17 Sherwood v1 entry points are marked unreached, since v1 is deployed, unchanged and outside this area.\n\nFiles under `test/scratch/` are probes only and are not part of the submission.","treeHash":null,"usage":{"cachedInputTokens":3752457,"inputTokens":738,"model":"claude-fable-5-1","outputTokens":74794,"runtime":"claude","turns":41,"wallClockMs":1721147}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"30bcdea6dcb9ee40","findings":[{"citation":"resolved","description":"_credit adopts any credited player as the cached leader while the cache is empty, even when their updated total is still <= 0 (src/SherwoodV2.sol:764). _scan and _setReign both define #1 as 'above zero' (line 816 `if (best <= 0) leader = address(0)`, line 832), so the reign stays with nobody, but _currentLeader returns the sub-zero player and the ROBIN_HOOD branch (lines 559-564) only skips for address(0), UNKNOWN_REIGN or the player themself. With another recent player present it reaches _spend: the charge is consumed and pointsMoved is 0 because _positive(leader) is 0. The README rule is that a Robin Hood with no leader plays as a Buy and keeps its charge; the address(0) path honours it and this cache state does not. Reachable whenever every scoring player is at or below zero (lost flips, reflects, sells), which is plausible early in a round. No ETH moves; one Robin Hood charge (1 per hour, 3 banked) is lost. Merged from audit_flow. Minimal fix that keeps the rules: in the ROBIN_HOOD branch require points[round][leader] > 0 before _spend, or have _credit adopt an empty cache only when updated > 0.","line":764,"path":"src/SherwoodV2.sol","reproduction":"Fixture test/helpers/SherwoodV2Fixture.sol, round 0. (1) alice BUY 0.001 (1 pt), alice FLIP 0.003, dice.reveal(1, bytes32(1)) loses: alice -2. (2) carol BUY 0.001, carol FLIP 0.007, reveal(2, 1) loses: carol -6. (3) bob BUY 0.001 (cached #1), bob FLIP 0.005, reveal(3, 1) loses: bob -4; the callback rescans 3 players and sets leader(0) == address(0), reignHolder(0) == 0. (4) alice BUY 0.001: points(0, alice) == -1 and leader(0) == alice while reignHolder stays 0. (5) robinsLeft(carol) == 3; carol plays ROBIN_HOOD with 0.001 ETH. Expected (README): nobody is above zero, the move plays as a Buy and robinsLeft(carol) stays 3. Actual: robinsLeft(carol) == 2, pointsMoved 0. test/scratch/JudgeRepro.t.sol test_robinHoodSpendsChargeAgainstSubZeroCachedLeader fails on this tree with 'charge spent with nobody above zero: 2 != 3'.","severity":"low","snippet":"        if (leader == address(0) || updated > points[round][leader]) _leader[round] = player;","title":"Robin Hood spends a charge against a cached #1 who is at or below zero (README: no leader keeps the charge)"},{"citation":"resolved","description":"Two tie rules coexist. Live, _credit (line 764, `updated > points[round][leader]`) and _scan (line 809, `p > best`) hand #1 over only on a strictly higher score, so on a tie the incumbent keeps #1: the King of the Hill clock runs for them, Robin Hood targets them, leader() and reignHolder() show them. At settlement the ranking loop (lines 920-929) also uses strict '>' but walks _players in join order, so on the same tie the player who joined the round first is ranked #1 and takes FIRST_BPS (40%) while the live #1 gets SECOND_BPS (20%) and is still the King. Points are small integers (1 per 0.001 ETH, 100 cap a buy), so exact ties at the top are an ordinary state, and a player with a lower join index can engineer it by buying up to exactly the leader's score and never past it. No ETH is lost or over-paid, but 20% of the pot is paid against the ranking the game displayed all round. Merged from audit_permissions. Fix that keeps the rules and split: break the top-slot tie at settlement in favour of the live rule (when p == r.topPoints[0] and a == _reign[round].holder, move a into slot 0), or apply join order in _credit/_scan too and document the rule.","line":920,"path":"src/SherwoodV2.sol","reproduction":"Fixture test/helpers/SherwoodV2Fixture.sol, round 0, three plain buys. (1) alice BUY 0.005: alice 5, _players = [alice]. (2) bob BUY 0.01: bob 10 > 5, leader(0) == bob, reignHolder(0) == bob. (3) alice BUY 0.005: alice 10 == bob 10, _credit's 10 > 10 is false, leader(0) and reignHolder(0) stay bob for the rest of the round. Warp to roundEnd(0)+SETTLE_DELAY, settle(0, 100). Expected (the rule the game showed live): top[0] == bob with 40%, top[1] == alice with 20%, king == bob. Actual: result(0) top[0] == alice, prize[0] == 400000000000000 (40% of the 1e15 pot), top[1] == bob, prize[1] == 200000000000000, king == bob. test/scratch/JudgeRepro.t.sol test_tieBreakLiveVsSettle fails on this tree with 'live #1 is not ranked #1 at settlement'.","severity":"low","snippet":"            if (p > r.topPoints[0]) {","title":"Tie at the top: the live #1 (reign holder, Robin Hood target) and the settlement #1 (40% prize) are different players"},{"citation":"resolved","description":"The constructor pairs the roles (line 388 `operator = _owner;`) but acceptOwner (lines 1132-1137) only rewrites owner. After a handover the old owner is still operator and can keep calling buybackAndBurn and buybackAndBurnHost with any minOut (the guard at line 1061/1071 is `msg.sender != operator && msg.sender != owner`) and refundDiceRequest, until the new owner notices and calls setOperator. The new owner can fix it, so this is an init/handover asymmetry rather than a bypass, but a transferred hook silently keeps a second privileged key that can swap both burn reserves (17% of every pot) at a price of its choosing. Merged from audit_permissions. Minimal fix: in acceptOwner, `if (operator == owner) operator = msg.sender;` before `owner = msg.sender;` (there are 922 B of EIP-170 margin), or document that a handover must be followed by setOperator.","line":1134,"path":"src/SherwoodV2.sol","reproduction":"Deploy with owner A (fixture): owner() == A, operator() == A. A calls setOwner(B); B calls acceptOwner(). Expected: control fully moved to B. Actual: owner() == B, operator() == A. alice buys 0.1 ETH, round 0 settles (buybackReserve > 0); A calls buybackAndBurn(buybackReserve, 0) and it succeeds, buybackReserve becomes 0. test/scratch/JudgeRepro.t.sol test_acceptOwnerLeavesOldOwnerAsOperator passes on this tree, i.e. the behaviour is present.","severity":"low","snippet":"        owner = msg.sender;","title":"acceptOwner does not mirror the constructor: the previous owner stays operator and keeps buyback and Dice-refund powers"},{"citation":"resolved","description":"Revision 3 made settle credit a final unknown spell (holder == UNKNOWN_REIGN at the round's end) to the round's final #1 (lines 934-942). The views were not updated: reignOf only adds the running spell when player == g.holder, never true while the holder is the UNKNOWN_REIGN marker, and kingOfTheHill is built on reignOf. From the moment #1 loses a flip on a board of more than MAX_CALLBACK_SCAN (12) players until the next play, sell or expiry (or settlement if none comes) the site reports the previous holder as King-elect with their old seconds and 0 for the de-facto #1, while settle crowns the de-facto #1 with the whole spell. No funds move; the frontend and anyone deciding whether to play, settle or defend #1 off these views sees the wrong King. Merged from audit_economics. Fix: when g.holder == UNKNOWN_REIGN, kingOfTheHill (which already scans every player) adds _reignClock(round) - g.since to the current top-scoring player, mirroring settle.","line":1257,"path":"src/SherwoodV2.sol","reproduction":"Fixture test/helpers/SherwoodV2Fixture.sol. (1) t0: alice BUY 0.1 (100), carol BUY 0.06 (60), eleven more wallets BUY 0.001 each: playerCount(0) == 13. (2) t0+1h: alice FLIP 0.05; dice.reveal(1, bytes32(1)) loses: alice 50, carol 60, reignHolder(0) == address(1). (3) Nobody plays; warp to roundEnd(0)+SETTLE_DELAY. (4) kingOfTheHill(0) returns alice and reignOf(0, carol) returns 0. (5) settle(0, max): result(0).king == carol, kingReign == 68399. Expected: the view documented as 'who would be if it ended now' returns carol before settlement. Actual: alice. test/scratch/JudgeRepro.t.sol test_kingViewDivergesDuringUnknownSpell fails on this tree with 'view disagrees with settle'.","severity":"low","snippet":"        if (player != address(0) && player == g.holder) s += _reignClock(round) - g.since;","title":"kingOfTheHill and reignOf disagree with settle while #1 is unknown: the views show the old holder as King and 0 seconds for the player settle will crown"},{"citation":"resolved","description":"expireFlip is permissionless and, 10 minutes after the request, credits the full stake as a plain buy and deletes the flip; the real reveal is then dropped (line 716 `if (f.player == address(0)) return;`). Nothing binds the outcome once Dice's reveal exists: if the provider's reveal lands later than FLIP_TIMEOUT (a slow or backlogged provider, a Dice outage), the flipper can watch for it and choose. A losing reveal is pre-empted with expireFlip, so the player keeps +stake instead of -stake and `previous` is never paid; a winning reveal is left alone and pays 2x-3x. The flipper's outcome becomes max(buy, flip) instead of the coin the pot paid Dice for. Low because it needs a provider later than the 10-minute timeout and visibility of the pending reveal; it changes points, not ETH. Merged from audit_economics. Fixes that keep the rules: lengthen FLIP_TIMEOUT to cover the provider's worst-case latency (keeping SETTLE_DELAY above it), or let only the operator expire a flip whose reveal Dice already holds.","line":737,"path":"src/SherwoodV2.sol","reproduction":"Fixture test/helpers/SherwoodV2Fixture.sol. (1) bob BUY 0.01: bob 10, lastPlayer bob. (2) alice FLIP 0.1: sequence 1, stake 100, previous bob. (3) warp +10 minutes; alice calls expireFlip(1): points(0, alice) == 100. (4) dice.reveal(1, bytes32(1)) (a loss) runs the callback, which returns at f.player == address(0): alice stays 100, bob stays 10. Expected with the reveal available: alice -100, bob +100. Actual: alice +100, bob +0; had the reveal been a win alice would not have called expireFlip and taken 200-300. test/scratch/JudgeRepro.t.sol test_lateLosingRevealPreempted passes on this tree, i.e. the behaviour is present.","severity":"low","snippet":"        if (f.player == address(0) || block.timestamp < f.requestedAt + FLIP_TIMEOUT) revert FlipNotExpired();","title":"A Dice reveal later than FLIP_TIMEOUT can be selectively pre-empted: expireFlip turns a losing flip into a plain buy while a winning one is let through"},{"citation":"resolved","description":"buybackAndBurn and buybackAndBurnHost are correctly guarded (operator or owner) and unlockCallback is correct: exact input, settles exactly what the pool took, burns the net tokens, returns a partial fill to the right reserve (verified against the vendored v4 Hooks.afterSwap: the swapper's delta is swapDelta minus hookDelta, so ethPaid can never exceed amount). The permitted actor picks the only slippage bound: with minTokenOut = 0 the reserve is swapped down to MIN_SQRT_PRICE+1 against whatever liquidity the 1% pool or the holder pool has, and a party able to order transactions around the operator's can hold the other side. The README documents this ('Slippage protection relies only on the operator's minOut'), so it is an accepted power of the role, recorded here as the material privileged power of this contract: a compromised operator key turns 17% of every pot into sandwich profit bounded by pool depth. No code change is required by the brief; an on-chain floor derived from the pool's current sqrtPrice would preserve the design. Merged from audit_permissions.","line":1092,"path":"src/SherwoodV2.sol","reproduction":"State: buybackReserve = R after a settlement; the ETH/$IMD 1% pool has depth D. As the operator (or a bundle it controls): (1) swap E ETH for $IMD in the 1% pool; (2) buybackAndBurn(R, 0): unlockCallback swaps R ETH zeroForOne to the price limit and burns whatever comes out; (3) sell the $IMD from step 1 into the moved price. Expected under the stated design: the burn executes near the live quote (the upkeep job's minOut). Actual with minOut = 0: step 2 accepts any output above zero; nothing in the contract reverts at any step. In the fixture, buybackAndBurn(reserve, 0) by the operator succeeds with no price check (test_acceptOwnerLeavesOldOwnerAsOperator in test/scratch/JudgeRepro.t.sol exercises the call).","severity":"info","snippet":"        if (out < minOut) revert TooLittleOut();","title":"Trust assumption: the operator alone sets minOut for both burn swaps, so the burn reserves' execution price is at the operator's discretion"}],"hash":"1bddfa1524cf6f3dad6ad72d9c4ef183875143e8b4261ecbe7f9736b2af26e38","nodeId":"02384549-1c95-472c-901f-0745c9ac5356","outcome":"completed","summary":"Review complete. The findings file at `.imd-findings.json` holds six findings and a 38-row coverage record (all 35 listed entry points answered, plus three invariants), and the project's full non-fork suite including the invariant tests passes on this tree.\n\n**What I kept, all reproduced with scratch tests against the real v4 core fixture**\n\n- **Low: Robin Hood spends a charge against a sub-zero cached leader.** `_credit` adopts any credited player into an empty cache even at or below zero, so a Robin Hood runs and burns its charge while nobody is above zero. Scratch test fails with \"2 != 3\".\n- **Low: tie at the top is resolved differently live and at settlement.** The incumbent keeps #1 live (strict greater-than), but settlement walks join order, so on an exact tie the earlier joiner takes 40% while the live #1 and King takes 20%.\n- **Low: acceptOwner leaves the previous owner as operator.** After a handover the old owner still runs both buybacks with any minOut and Dice refunds until the new owner calls setOperator.\n- **Low: kingOfTheHill and reignOf disagree with settle during an unknown spell.** The views show the old holder and 0 seconds for the player settle crowns with 68,399 seconds.\n- **Low: a Dice reveal later than the 10-minute timeout can be selectively pre-empted.** A losing reveal is turned into a plain buy by expireFlip; a winning one is left alone.\n- **Info: operator-chosen minOut is the only price bound on the burn swaps.** Documented trust assumption, recorded as the contract's material privileged power.\n\n**What I dropped**\n\n- The three \"stale launch.json notes\" findings from audit_math, audit_flow and audit_permissions do not reproduce: the notes in the tree already say the burn pools are fixed and nothing is set after deployment.\n- The \"flip EV exceeds a buy\" item is the rule as commissioned, not a defect.\n\n**My own pass found nothing above low.** I verified the swap delta accounting against the vendored v4 `Hooks.afterSwap` (the hook sees the raw swap delta, so the partial-fill guard is correct and `ethPaid` can never exceed the burn amount), traced ETH conservation across pot, prizes, referral cuts, sweeps and reserves, the flip lifecycle, the charge clocks, and reign tracking including the revision 3 final-unknown branch. Nothing blocks swaps, settlement or claims. The launcher's init code and the hook's 23,654-byte runtime are within the factory's limits. Nothing in the tree was modified; the scratch tests live under `test/scratch/` and are not kept.","treeHash":null,"usage":{"cachedInputTokens":1253385,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":48009,"runtime":"claude","turns":22,"wallClockMs":994928}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e02bec63aa9dcaa5","findings":[{"citation":"resolved","description":"Two different definitions of '#1' coexist. Live, _credit (src/SherwoodV2.sol:764 `if (leader == address(0) || updated > points[round][leader]) _leader[round] = player;`) and _scan (src/SherwoodV2.sol:809 `if (p > best) (best, leader) = (p, a);`) only hand #1 over on a strictly greater score, so on a tie the incumbent stays #1: the King of the Hill clock keeps running for them (_setReign), Robin Hood targets them, the site's leader() and reignHolder() show them. At settlement, the ranking loop (lines 920-929) also uses strict '>' but walks _players in join order, so on the same tie the player who joined the round first is ranked #1 and takes FIRST_BPS (40%), while the live #1 is ranked #2 (20%). Points are small integers (1 per 0.001 ETH, capped at 100 a buy), so exact ties at the top are an ordinary state, not an edge case. The asymmetry is between the live cache's rule (incumbent wins ties) and settle's rule (join order wins ties). Impact: 20% of the pot (the difference between the #1 and #2 shares) is paid to a different player than the one the game itself treated as #1 for the whole round, and that player is also the King (so the round can end with the King ranked #2 behind a player who never held #1). No ETH is lost or over-paid; it is paid against the game's own displayed ranking. Minimal fix (keeps rules and split): make settlement break ties for the top slot in favour of the live rule, e.g. when `p == r.topPoints[0]` and `a == _reign[round].holder` (or `a == _leader[round]` after the rescan is complete, which settle already guarantees via pendingFlips == 0 and the final-unknown branch), move `a` into slot 0; or, if join order is the intended rule, apply it in _credit/_scan too (needs a per-round join index). Either way document the rule in the README. A player can engineer this: with bob live #1 at 100 points and carol holding a lower join index, carol buys until she reaches exactly 100 (never more), stays #2 on every live view all round (so bob keeps the reign and remains the Robin Hood target), and is ranked #1 at settlement by join order; the test above is that sequence with 10 points.","line":920,"path":"src/SherwoodV2.sol","reproduction":"Round 0, three buys, nothing else. (1) alice buys 0.005 ETH, BUY: alice 5 points, _players[0] = [alice], leader alice. (2) bob buys 0.01 ETH, BUY: bob 10 > 5, leader bob, reignHolder bob. (3) alice buys 0.005 ETH, BUY: alice 10 == bob 10; _credit: 10 > 10 is false, leader() stays bob, reignHolder() stays bob for the rest of the round. Warp to roundEnd(0)+SETTLE_DELAY, settle(0, 100). Expected (by the live rule the game showed all round): top[0] = bob (40%), top[1] = alice (20%), king = bob. Actual: result(0) gives top[0] = alice, prize[0] = 40% of the pot, top[1] = bob, prize[1] = 20%, king = bob. Confirmed with a scratch test on this tree (test/scratch/Asymmetries.t.sol test_tieBreakDiffersBetweenLiveLeaderAndSettlement, passes = reproduces): top[0] 0x3288...dac6 (alice), king 0x1D96...d3e (bob), prize0 400000000000000, prize1 200000000000000 on a 1e15 pot.","severity":"low","snippet":"            if (p > r.topPoints[0]) {\n                (r.top[2], r.topPoints[2]) = (r.top[1], r.topPoints[1]);\n                (r.top[1], r.topPoints[1]) = (r.top[0], r.topPoints[0]);\n                (r.top[0], r.topPoints[0]) = (a, p);","title":"Tie-break for #1 differs between the live leader (reign, Robin Hood target) and settlement ranking: on equal points the incumbent keeps #1 live, but the earlier joiner takes the 40% prize"},{"citation":"resolved","description":"buybackAndBurn and buybackAndBurnHost (src/SherwoodV2.sol:1060-1077) are guarded correctly (operator or owner) and the swap in unlockCallback is correct (exact input, settles exactly what the pool took, burns the net tokens, returns a partial fill to the right reserve). The combination is the seam the Trust Gap guide names: the permitted actor picks the only slippage bound. With minTokenOut = 0 the reserve is swapped to the price limit MIN_SQRT_PRICE+1 against whatever liquidity the 1% pool or the holder pool has at that moment, and the operator (or anyone whose transaction the operator's can be ordered after) can hold the other side. This is documented in README.md ('Slippage protection relies only on the operator's minOut'; 'minPfwaOut is the operator's choice (the upkeep job uses a live quote)') and is an accepted power of the role, not a permission bypass; it is recorded here as the material privileged power of this contract, with its preconditions. Unprivileged amplifier: none on Robinhood Chain as configured (sequencer ordering, no public mempool); if the operator key is a hot bot key, its compromise turns both reserves (17% of every pot) into the attacker's sandwich profit, bounded by pool depth. No code change is required by the brief; a defensive option that preserves the design is an on-chain floor (e.g. minOut >= a share of the quote from the pool's current sqrtPrice) so a zero or absurd minOut reverts.","line":1064,"path":"src/SherwoodV2.sol","reproduction":"State: buybackReserve = R after a settlement; the ETH/$IMD 1% pool has depth D. Call sequence by the operator wallet (or a bundle it controls): (1) swap E ETH for $IMD in the 1% pool; (2) buybackAndBurn(R, 0): unlockCallback swaps R ETH zeroForOne down to the price limit, burning whatever it gets; (3) sell the $IMD from step 1 into the moved price. Expected under the stated design: the burn executes near the live quote (the upkeep job's minOut). Actual with minOut = 0: step 2 accepts any output above zero, so the reserve pays the full price impact of R on D and step 3 collects it; with R comparable to D the burn receives a small fraction of the tokens a quoted execution would. Nothing in the contract reverts at any step.","severity":"info","snippet":"        bytes memory result_ = poolManager.unlock(abi.encode(false, amount, minTokenOut));","title":"Trust assumption (access x economics): the operator alone sets minOut for both burn swaps, so the burn reserves' execution price is entirely at the operator's discretion"},{"citation":"resolved","description":"The constructor pairs the two roles (src/SherwoodV2.sol:388 `operator = _owner;`), but acceptOwner (lines 1132-1137) only rewrites owner. After a handover the old owner is still operator and can keep calling buybackAndBurn, buybackAndBurnHost (with any minOut, see finding 2) and refundDiceRequest until the new owner notices and calls setOperator. The new owner can fix it (setOperator is onlyOwner), so this is an asymmetry between init and handover rather than a bypass; it matters because the README's roles table presents the operator as something the owner names, and a transferred hook silently keeps a second privileged key. Minimal fix that keeps the design: in acceptOwner, `if (operator == owner) operator = msg.sender;` before `owner = msg.sender;` (costs a few bytes; 96 B of EIP-170 margin remain), or document that a handover must be followed by setOperator.","line":1134,"path":"src/SherwoodV2.sol","reproduction":"Deploy with owner = A: owner() == A, operator() == A. A calls setOwner(B); B calls acceptOwner(). Expected: control fully moved to B. Actual: owner() == B, operator() == A; A calls buybackAndBurn(buybackReserve, 0) and it succeeds (the guard at line 1061 is `msg.sender != operator && msg.sender != owner`), and A calls refundDiceRequest(seq) successfully. B must separately call setOperator(x) to end A's access.","severity":"info","snippet":"        owner = msg.sender;","title":"Ownership handover does not mirror the constructor: the previous owner stays operator after acceptOwner, keeping buyback and Dice-refund powers"},{"citation":"resolved","description":"The manifest's notes end with 'After deployment the owner initializes the game pool against launcher.hook() and sets the two buyback pools with setBuybackPool and setHostBuybackPool'. Those setters were removed by revision 4 (ADAPTATION.md): both burn pool keys are now constants derived from the constructor's token and host arguments (buybackPool() and hostBuybackPool(), src/SherwoodV2.sol:1111-1120) and the compiled ABI has no such functions. Notes are explanatory text and carry no deployment authority, so the contracts, constructor arguments and $owner in the manifest are unaffected and match the brief (8 arguments, in the hook's order). The stale sentence only misdescribes the post-deploy owner procedure, which script/SetupSherwoodV2.s.sol now limits to creating the game pool and setOperator.","line":18,"path":"launch.json","reproduction":"Read launch.json line 18 (notes), last sentence, then grep the ABI: `forge inspect src/SherwoodV2.sol:SherwoodV2 abi | grep -i setBuybackPool` returns nothing. Expected: notes that match the accepted tree (owner creates the game pool via PoolManager.initialize and calls setOperator; burn pools are fixed). Actual: notes name two functions that do not exist in the deployed hook.","severity":"info","snippet":"  \"notes\": \"Sherwood v2 on Robinhood Chain (4663) for the existing $IMD token. No new token, pool, distributor, ETH funding or initialization call: this manifest deploys exactly one contract, src/SherwoodV2Launcher.sol:SherwoodV2Launcher. A Uniswap v4 hook must carry its permission flags in the low 14 bits of its address and this launch takes no salt, so the launcher's constructor mines the first CREATE2 salt (from its own address, up to 400000 tries, about one in 16384 matches) whose address carries flags 0x20CC (beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta), then deploys src/SherwoodV2.sol:SherwoodV2 there with CREATE2 and reverts with NoSalt if the create fails. Mining and hook deployment together cost about 10M gas, rehearsed on a fork in test/SherwoodV2LauncherFork.t.sol. The game is launcher.hook() and the salt used is launcher.salt(). Neither constructor calls another contract (the launcher only hashes and creates; the hook stores its argu","title":"launch.json notes describe owner setup steps that no longer exist (setBuybackPool / setHostBuybackPool were removed in revision 4)"}],"hash":"3231d2bf09c4b55825b86394294d83b3a84131eb84c7824bd05d4ceb3ef4e1f4","nodeId":"0c284296-cbf1-420a-ba60-968c9cefef07","outcome":"completed","summary":"Review complete. The findings are in `.imd-findings.json` with a coverage row for every listed entry point.\n\n**What I found in the assigned area (Access Control, Trust Gap, Asymmetry)**\n\n- **Low, settle tie-break asymmetry.** The live notion of #1 keeps the incumbent on equal points, so the King clock, Robin Hood targeting and the site's leader view all stay with the incumbent. Settlement ranks ties by join order instead, so on the same tie the earlier joiner takes 40% and the live #1 drops to 20%. A player with a lower join index can engineer this by buying up to an exact tie. Reproduced with a scratch test on this tree. Anchored at the ranking loop in `settle`.\n- **Info, trust assumption.** The operator alone sets `minOut` for both burn swaps, so the execution price of 17% of every pot is at the operator's discretion. The README accepts this. I recorded it with the concrete call sequence and noted that there is no unprivileged amplifier on a sequencer chain.\n- **Info, handover asymmetry.** The constructor sets operator = owner, but `acceptOwner` does not, so the previous owner keeps buyback and Dice-refund powers until the new owner calls `setOperator`.\n- **Info, stale manifest notes.** The notes in launch.json still tell the owner to call two burn-pool setters that revision 4 removed. The contract entry and constructor arguments are correct.\n\n**What held under my lenses**\n\n- The permission map has no weaker writer for any guarded variable and no escalation path. All hook callbacks and the unlock callback are reachable only from the PoolManager, and the unlock callback only from the hook's own two burn functions.\n- ETH accounting conserves: every inflow lands in one bucket, settlement cannot underflow or revert, claims and sweeps are disjoint at the deadline.\n- The thinnest margin in the flip lifecycle is the small-board Dice callback. I measured its worst case with the previous player at zero points, a first reign write and cold storage.\n\n| Scenario | Callback gas |\n|---|---|\n| Leader loses on 12 players, worst state | 183,021 |\n| Dice limit | 200,000 |\n\n**Not reached**\n\n- The 17 v1 Sherwood entry points are marked unreached. V1 is already live and is not deployed by this launch.\n- A candidate about Robin Hood spending a charge on a negative cached leader did not reproduce, because the robber's own credit takes the lead first. It is not reported.\n\nScratch tests live under `test/scratch/` and are not part of the submission.","treeHash":null,"usage":{"cachedInputTokens":2127871,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":71149,"runtime":"claude","turns":35,"wallClockMs":2025016}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2c968e88904ec22b","findings":[{"citation":"resolved","description":"expireFlip is permissionless and, once FLIP_TIMEOUT (10 minutes) has passed, credits the full stake as a plain buy and deletes the flip, after which the real reveal is dropped (_entropyCallback returns at `if (f.player == address(0)) return;`). Nothing binds the outcome once Dice's reveal exists: if the provider's reveal lands later than 10 minutes after the request (a slow or backlogged provider, a stalled keeper, a Dice outage), the flipper can watch for the reveal and choose. A losing reveal (randomNumber odd) is pre-empted with expireFlip, so the player keeps +stake instead of -stake and the previous player is never paid; a winning reveal is left alone and pays 2x-3x. The flipper's outcome becomes max(buy, flip) instead of the fair coin the round's pot paid Dice for. Economics: for a 0.1 ETH flip (100 points) the fair EV is 100-150 points; with selection it is 150-200 points, and the opponent `previous` loses the stake they should have received on a loss. The pot still paid the Dice fee for the request. Severity is low because it needs a provider that is later than FLIP_TIMEOUT and, on Robinhood Chain's sequencer, visibility of the pending reveal; it does not move ETH. Possible fixes that keep the rules: make an expired flip score nothing extra until the round's reveal is known (e.g. only credit the stake if Dice has no revelation for that sequence, or let the operator alone expire), or lengthen FLIP_TIMEOUT so the provider's worst-case latency is covered and keep SETTLE_DELAY above it.","line":737,"path":"src/SherwoodV2.sol","reproduction":"Fixture: test/helpers/SherwoodV2Fixture.sol (real v4 core, AuditDice). 1) bob buys 0.01 ETH (BUY): bob 10 points, lastPlayer = bob. 2) alice buys 0.1 ETH with move FLIP: sequence 1, stake 100, previous bob, alice has 0 points. 3) warp +10 minutes (FLIP_TIMEOUT); Dice's losing reveal (randomNumber = 1) is about to land. 4) alice calls expireFlip(1): points(0, alice) == 100. 5) dice.reveal(1, bytes32(1)) now runs the callback, which returns at f.player == address(0): points(0, alice) stays 100 and bob stays 10. Expected: with the reveal available the flip is a loss, alice -100 and bob +100. Actual: alice +100, bob +0. Had the same reveal been a win alice would simply not call expireFlip and take 200-300. Confirmed by test/scratch/EconProbe.t.sol test_lateLosingRevealCanBePreemptedByExpiry (passes on this code, i.e. the behaviour is present).","severity":"low","snippet":"        if (f.player == address(0) || block.timestamp < f.requestedAt + FLIP_TIMEOUT) revert FlipNotExpired();","title":"A late Dice reveal can be selectively pre-empted: expireFlip turns a losing flip into a plain buy while a winning one is let through"},{"citation":"resolved","description":"Revision 3 made settle credit a final unknown spell (holder == UNKNOWN_REIGN at the round's end) to the round's final #1. The views were not updated: reignOf only adds the running spell when `player == g.holder`, which is never true while the holder is the UNKNOWN_REIGN marker, and kingOfTheHill builds on reignOf. So from the moment #1 loses a flip on a board of more than MAX_CALLBACK_SCAN (12) players until the next play/sell/expiry (or, if none comes, until settlement) the site reports the previous holder as King-elect with their old seconds and 0 seconds for the de-facto #1, while settle crowns the de-facto #1 with the whole spell. In the reproduction the view says alice (3,600 s) and settle says carol (68,399 s). This is the Invariant guide's view/write divergence; it changes no funds, but the frontend and anyone deciding whether to play, settle or defend #1 off these views sees the wrong King. A fix is to mirror settle in the view: when g.holder == UNKNOWN_REIGN, add `_reignClock(round) - g.since` to the current top-scoring player (which reignOf cannot know for a single player without a scan; kingOfTheHill, which already scans every player, can).","line":1257,"path":"src/SherwoodV2.sol","reproduction":"Fixture: test/helpers/SherwoodV2Fixture.sol. 1) t0: alice buys 0.1 ETH (100 points, #1), carol buys 0.06 ETH (60), eleven more wallets buy 0.001 ETH each (13 players). 2) t0+1h: alice buys 0.05 ETH with FLIP; dice.reveal(1, bytes32(1)) makes her lose 50: alice 50, carol 60, reignHolder(0) == address(1). 3) Nobody plays again; warp to roundEnd(0) + SETTLE_DELAY. 4) kingOfTheHill(0) returns alice and reignOf(0, carol) returns 0. 5) settle(0, max): result(0).king == carol with kingReign == 68,399 (the spell from the reveal to the round's end). Expected: the view that documents itself as 'who would be if it ended now' returns carol before settlement. Actual: alice. Confirmed by test/scratch/EconProbe.t.sol test_kingViewDivergesFromSettleDuringUnknownSpell.","severity":"info","snippet":"        if (player != address(0) && player == g.holder) s += _reignClock(round) - g.since;","title":"kingOfTheHill and reignOf (the site's views) disagree with settle while #1 is unknown: the view shows the old holder as King and 0 seconds for the player settle will crown"},{"citation":"resolved","description":"This is the rule as written (win 2x-3x the stake, lose the stake to the previous player), reported as economics the requester asked to see, not as a defect in the implementation. For a buy of B points: a plain buy scores B; a solo flip has expectation 0.5 x (2..3)B = 1.0B..1.5B for the flipper, so a flip never has lower expectation than a buy and is strictly better above the minimum size (the multiplier scales with the buy, FLIP_WIN_BPS_MIN..MAX at lines 77-78). The loss goes to `previous`, which is simply lastPlayer[round]: a player who first buys with a second wallet makes that wallet `previous`, so a lost flip pays themselves and the pair's combined expectation is 1.5B..2.0B per flip versus 1.0B for a buy, with no downside. Each flip also spends up to its buy's own 5% pot share on the Dice fee (today 0.000025 ETH, i.e. half of a 0.001 ETH buy's contribution). Charges bound this to 3 flips a round (6 banked) per wallet, but wallets are free. The effect is on the leaderboard only (prizes are then split by points), not on ETH conservation. If the intent is that a flip is a fair gamble, the win multiplier or the loss destination (e.g. burn the stake rather than pay `previous`) is the knob; otherwise this is a documented edge for players who understand it.","line":721,"path":"src/SherwoodV2.sol","reproduction":"Fixture: test/helpers/SherwoodV2Fixture.sol, wallets A and B of one person. 1) A buys 0.001 ETH (1 point): lastPlayer = A. 2) B buys 0.1 ETH with FLIP: stake 100, win 300 (scaledBps(20000, 30000, 100) = 30000), previous = A, pot pays 0.000025 ETH to Dice out of the buy's 0.005 ETH share. 3a) reveal even: B +300 (test test_multipleFlipsResolveOutOfOrderAgainstSavedPreviousPlayers shows a 0.05 ETH win paying 125). 3b) reveal odd: B -100, A +100: the pair holds the same 100 points a BUY would have scored. Expected if a flip were a fair gamble: the pair can lose points. Actual: the pair's total is never below a plain buy's and is 300 half the time.","severity":"info","snippet":"        address paidTo = won ? f.player : f.previous;\n        uint256 amount = won ? f.win : f.stake;","title":"Flip expectation is above a plain buy and a two-wallet pair never loses points on a flip, with the Dice fee paid by the round's pot"}],"hash":"71a713407c0ddb5a858aaef80b761ed2def3fe57c42183b26ded234de0dfe00c","nodeId":"719715b2-5346-4c15-9c5e-7fd87bcabe0a","outcome":"completed","summary":"The review is complete. No tracked file was changed; only the findings file and two scratch probes under `test/scratch/` were written.\n\n**Outcome: no fund-moving defect found in the economics.** The swap delta accounting, pot/prize/referral/claim/sweep flows, the two buyback swaps, the flip lifecycle, the charge clocks and the reign tracking all hold under the Economic Security, Invariant and Flow Gap checks. Three findings are recorded in `.imd-findings.json`, none above low.\n\n**Findings**\n\n- **Low. Late Dice reveal can be selectively pre-empted.** After 10 minutes `expireFlip` is permissionless and scores the stake as a buy, and any later reveal is dropped. If the provider is late, a flipper expires a losing reveal and lets a winning one through, so their outcome becomes max(buy, flip) and the previous player never receives the lost stake. Points only, no ETH. Confirmed with a scratch test.\n- **Info. Views disagree with settle during an unknown spell.** After #1 loses a flip on a board above 12 players, `kingOfTheHill` and `reignOf` show the old holder as King and zero seconds for the player settle will crown with the whole spell. Confirmed with a scratch test (view says alice, settle crowns carol with 68,399 s).\n- **Info. Flip economics.** A flip's expectation is 1.0 to 1.5 times a plain buy, and a two-wallet pair whose second wallet is `previous` never loses points on a flip, while the pot pays the Dice fee. This is the rule as written, reported as economics rather than a defect.\n\n**What was verified**\n\n- Full local suite: 253 tests pass, including the 256x96 ETH-conservation invariant run.\n- Launcher fork rehearsal against live Robinhood Chain passes: deploy, pool setup, a play, settlement, and both burns through the live 1% pool and the live Hookr holder hook.\n- Live $IMD transfers in full on a fork, so `bought` equals what winners actually receive.\n- Live Dice bytecode has no 2300-gas transfer pattern, so refunds into `receive()` cannot fail.\n- Settlement cannot underflow: prizes, referral cuts and burns commit at most 98.9% of a pot.\n\n**Coverage** answers all 35 listed entry points. Every SherwoodV2 entry point is `holds` except `expireFlip` (finding 1). The Sherwood v1 entry points are marked `unreached`, since v1 is not deployed by this launch and was not reviewed.","treeHash":null,"usage":{"cachedInputTokens":2024542,"inputTokens":452,"model":"claude-fable-5-1","outputTokens":63261,"runtime":"claude","turns":32,"wallClockMs":1200880}},{"artifacts":[],"attempt":1,"bundleHash":"028bf73c61b58206142899a3a50d5ddedae4661e195920178a14329e2610cbb1","device":"dff6c0d3de4aa913","findings":[],"hash":"744b62f23ff59014ee496e3d97d35a3e21a7ad232a0f2b87cd718b7ca168bbd6","nodeId":"d3b51eb7-1450-4323-a283-4d5e1eccac57","outcome":"completed","summary":"launch.json is done and verified. Only that file changed.\n\n**What I found:** the tree already carried a manifest from the earlier accepted commit, and its structure and arguments were correct: kind `evm_contracts`, one contract, SherwoodV2Launcher, with the eight constructor arguments in declaration order (poolManager, $IMD token, $PFWA host, hostHolderMin, dice, diceProvider, `$owner`, genesis 1791835200), matching both the brief and the launcher's constructor. The notes, though, described two owner setters, setBuybackPool and setHostBuybackPool, that do not exist in the accepted source. In the implementation both buyback pool keys are constants exposed by the `buybackPool` and `hostBuybackPool` views, so nothing is set after deployment.\n\n**What I did:** rewrote that final part of the notes to describe the accepted implementation. They now state that the buyback pools are fixed constants, that the only post-deployment step is the owner initializing the native-ETH/$IMD game pool with launcher.hook() as its hook (beforeInitialize accepts only the owner, only those currencies, and only once), and that ownership hands over in two steps via setOwner and acceptOwner, with setOperator naming the buyback operator. Everything else in the notes was left as written.\n\n**Checks:**\n- Manifest parses as JSON with exactly the keys kind, contracts and notes. Notes are 3,294 characters, under the 4,000 limit. One contract with 8 string arguments.\n- `forge build` succeeds.\n- `forge test`: 256 passed, 0 failed, 2 skipped (the fork rehearsals that need a live RPC).\n- `git status` shows launch.json as the only modified file.","treeHash":"f96928bf8ade5a12e099d71791b86f7f44edeef4","usage":{"cachedInputTokens":322547,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":4246,"runtime":"claude","turns":9,"wallClockMs":606446}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fdbedee33322a6ef","findings":[{"citation":"resolved","description":"Revision 4 removed both burn-pool setters and fixed the two burn pools as constants (src/SherwoodV2.sol:191-196, buybackPool()/hostBuybackPool() at 1111-1120). The manifest notes, which the final review and the owner read as the description of the accepted implementation, still say: 'After deployment the owner initializes the game pool against launcher.hook() and sets the two buyback pools with setBuybackPool and setHostBuybackPool'. The described post-deploy procedure doesn't match the code. No funds are at risk, because the pools are fixed in the code. The problem is that the signed manifest misdescribes the owner's powers and setup: an owner, or a script that follows the notes, calls selectors that don't exist. The repo's own script/SetupSherwoodV2.s.sol and README (lines 160-169) already say the burn pools need no setup call.","line":18,"path":"launch.json","reproduction":"Deploy SherwoodV2Launcher with the manifest's arguments, then follow the notes and, as $owner, call hook.setBuybackPool((0x0, IMD, 10000, 100, 0x0)). Expected from the notes: the buyback pool is set. Actual: the call reverts, because SherwoodV2 has no function with that selector and no fallback (test/SherwoodV2LaunchConfig.t.sol:75 asserts the same low-level call fails). grep -n 'function setBuybackPool' src/SherwoodV2.sol returns nothing. Fix: in the notes, replace the sentence with 'After deployment the owner creates the ETH/$IMD game pool against launcher.hook() and may name an operator with setOperator. The two burn pools are fixed in the hook. A handover is setOwner(next), then acceptOwner() by next.'","severity":"low","snippet":"  \"notes\": \"Sherwood v2 on Robinhood Chain (4663) for the existing $IMD token. No new token, pool, distributor, ETH funding or initialization call: this manifest deploys exactly one contract, src/SherwoodV2Launcher.sol:SherwoodV2Launcher. A Uniswap v4 hook must carry its permission flags in the low 14 bits of its address and this launch takes no salt, so the launcher's constructor mines the first CREATE2 salt (from its own address, up to 400000 tries, about one in 16384 matches) whose address carries flags 0x20CC (beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta), then deploys src/SherwoodV2.sol:SherwoodV2 there with CREATE2 and reverts with NoSalt if the create fails. Mining and hook deployment together cost about 10M gas, rehearsed on a fork in test/SherwoodV2LauncherFork.t.sol. The game is launcher.hook() and the salt used is launcher.salt(). Neither constructor calls another contract (the launcher only hashes and creates; the hook stores its argu","title":"launch.json notes tell the owner to call setBuybackPool and setHostBuybackPool, which SherwoodV2 no longer has"}],"hash":"956bda2a1d1022219c696fbfd415f6c600bc5edae23502d37adc36d4d3eddd7a","nodeId":"802bb6ef-6d74-444d-8e0f-5df2c242e4f0","outcome":"completed","summary":"I found no math defects in SherwoodV2. The review reports one low-severity finding, and it is in the deployment notes, not the code. All 253 unit tests pass (`forge test --no-match-contract Fork`); I did not run the fork tests. The tree is unchanged, and the results are in `.imd-findings.json`.\n\n**The finding (low): `launch.json:18`.** The manifest notes tell the owner to \"set the two buyback pools with setBuybackPool and setHostBuybackPool\". Revision 4 removed both functions and fixed the two burn pools as constants in the hook. An owner, or a script, that follows the notes calls functions that don't exist, and the call reverts. No funds are at risk, but the signed manifest misdescribes the owner's setup and powers. The suggested fix is to rewrite that sentence: the owner creates the game pool and may name an operator, the burn pools need no setup, and a handover is `setOwner(next)` then `acceptOwner()`.\n\n**What I checked and found sound:**\n- **Swap deltas:** the buy and sell fees net to zero in the hook's account. The partial-fill check uses the same rounding as the fee, so a fully filled buy passes exactly. Below 20 wei the fee rounds to zero, which is harmless.\n- **Buyback swaps in `unlockCallback`:** on an exact-input swap the ETH paid can never exceed the amount, even with the holder pool's hook. A partial fill returns the rest to the right reserve. A shortfall below `minOut` reverts the whole burn.\n- **Settlement split:**\n  - Prizes are at most 78% of the pot, referral cuts at most 3.9%, and burns 17%, so the rollover is always at least about 1.1% and can't underflow.\n  - A partial forfeit never pays more than the prize.\n  - Once a round is settled its pot can't receive any more ETH, so nothing gets stranded.\n- **Claims, referrals and sweeps:** each pays out only after its bookkeeping is updated. At the exact deadline a claim still works and a sweep doesn't, so the two can never both run.\n- **Flips:** the Dice fee leaves the pot before the request, and a refund comes back into the buyback reserve. Any pending flip can be expired 5 minutes before settlement opens. A reveal that arrives after expiry is ignored.\n- **Charge clocks:** a clock never passes the current time, and a new wallet's first spend leaves its bank one short of full (17 of 18 Steals, for example).\n- **King of the Hill:** every reign timestamp is capped at the round's end, so no reign seconds are counted after the round ends. The revision 3 unknown-spell credit can't underflow.\n\n**Coverage:** the file has a row for every listed entry point, plus four invariants.\n- All 18 SherwoodV2 entry points `hold`, each with a one-line reason.\n- The 17 entry points on the v1 contract (`src/Sherwood.sol`) are marked `unreached`. This launch doesn't deploy v1, so I spent the time on v2.\n\nNo finding is high enough to need a Foundry proof test. Two edges are not defects but not covered by a test either. When two players tie for #1, settlement and the running leader tracking may pick different ones. On boards over 1,500 players, how fast the rescan finishes depends on the gas each swap is sent with.","treeHash":null,"usage":{"cachedInputTokens":1471382,"inputTokens":32,"model":"claude-opus-5-5","outputTokens":34453,"runtime":"claude","turns":16,"wallClockMs":1107746}},{"artifacts":[],"attempt":1,"bundleHash":"2bebc66ea8a40f85fded11db8d2c51e2e1d51d11235f8f05aa61376493ecab25","device":"357c46e3781993d4","findings":[],"hash":"ed34a9623b5fa67867fb99ee912ff7d3c7a0cc769f476b66d73ec68e39f0939c","nodeId":"8245a8f0-b414-4010-8cd7-204002bd1c63","outcome":"completed","summary":"Done. `forge test` passes: 279 tests, 0 failures, 2 skipped (the fork suites, which skip with no RPC configured). Only files under `test/` changed.\n\n**What I added**\n\n- `test/SherwoodV2Edges.t.sol` (21 tests through the real PoolManager). Failure paths and edges the existing 253 tests did not pin:\n  - Settlement with a zero batch, an empty round (burns plus an 83% rollover, nothing to claim or sweep), rollover landing in the round live at settlement, settling the live round or an impossible round number, second claims, sweeps after a full claim, and claims or sweeps for rounds that never settled.\n  - A buyback request ten times the reserve spends exactly the reserve and leaves the other one alone. An empty reserve cannot burn.\n  - Hook data of 20, 33, 63 and 64 bytes with an unknown move: the move word decodes, the rest is ignored, the referrer and welcome bonus apply only on 64 bytes.\n  - Robin Hood by the leader keeps its charge. A Steal from a player wiped to zero spends its charge and moves nothing. A shield raised near a round's end still reflects in the next round.\n  - A flip in the last second of a round expires exactly at the ten-minute mark, before settlement opens, scores as a buy in its own round and starts no reign. Late reveals and double expiries change nothing.\n  - The `kingOfTheHill` view agrees with the settled King.\n  - Seven fuzz properties with inline run counts: every wei of a settled pot lands in exactly one of prizes, referral cut, reserves and rollover under fuzzed partial sales by all winners, through claims and the sweep; buy points and fees from one wei up; Steal and Robin Hood charge banks, spends and next-charge times; shield charges at every 0.025 ETH crossing; Steals, Robin Hoods and reflects are zero-sum; `fundPot` round bounds.\n- `test/SherwoodV2FreshBoardInvariant.t.sol`. A second invariant campaign reusing the six-actor handler from a different start (fresh board, Dice fee at its cap, a reflected Robin Hood leaving a player below zero, a flip pending), 128 runs of depth 64 with reverts failing the run. Invariants: ETH held equals every obligation and never exceeds ETH in; the live round's reign holder is the cached #1 with the most points; settled rounds keep seven days to claim, hold no pending flips and award no prize above its share or to anyone at or below zero.\n- `test/SHERWOOD_V2_TESTING.md` gains a revision 5 section describing the above.\n\n**Defects found: none.** Every property held on the code as it stands, so no `.imd-findings.json` was written. The three failures I hit while writing were harness mistakes, not contract behaviour: a timestamp cached across a `vm.warp` under via-IR, a view call consumed by `expectRevert`, and a balance check that forgot the rollover. Each is noted in the testing notes so the next contributor avoids them.\n\n**Still owed:** no fork run was made here. The live rehearsal in `test/SherwoodV2LauncherFork.t.sol` against Robinhood Chain remains to be run before deployment, as the earlier notes already state.","treeHash":"a89b8306b93a0edeb2d7ed58d0332f96be0fc2ba","usage":{"cachedInputTokens":2900848,"inputTokens":610,"model":"claude-fable-5-1","outputTokens":79405,"runtime":"claude","turns":40,"wallClockMs":1654923}},{"artifacts":[],"attempt":1,"bundleHash":"dac113e7e7b61d19b1018f5f2b8ee2a6a7ba5b76911c798dee5cb97a82fc134d","device":"8c9c4986ca881107","findings":[],"hash":"fb2918c9239910cd78c17bcd079e72fa497cf6bf50685bdc971d7ede3ef39095","nodeId":"a62499a5-017d-4ffb-9ed0-0eb9dfbdf3a7","outcome":"completed","summary":"Done. The build passes, all 254 local tests pass (the twelfth suite is the scratch harness copy, which is not submitted), and the 10 fork tests pass against the live Robinhood Chain RPC.\n\n**What the audit found and what changed**\n\n- **Medium, burn pools chosen by the owner after deployment.** Confirmed by reading the arrived code: the setter accepted any fee, tick spacing and hook other than the game hook, so a capture-hook pool could take the 17% burn share. Fixed in `src/SherwoodV2.sol` by fixing both keys in the hook. The game-token burn pool is the ETH/token 1% pool with no hook, and the host burn pool is the ETH/$PFWA holder pool with Hookr's holder hook. The currencies come from the constructor's token and host arguments, so the launcher keeps its eight arguments as the brief and the committed launch.json state. The two setters, their check and stored keys are gone. In $PFWA's own game the single burn goes through the holder pool, which the fork test previously set by hand.\n- **Low, single-step owner handover.** Confirmed by reading. The owner now names a next owner who must call acceptOwner, and naming zero cancels. A mistaken handover can no longer strand the hook before the game pool exists.\n- **Info, open-ended salt mining.** No code change. The launcher is untouched, and the gas-ceiling note stays as an open item for the deployer. A scratch factory rehearsal on an empty chain cost about 6.9M gas.\n\n**Tests and docs**\n\n- New `test/SherwoodV2LaunchConfig.t.sol` covers the fixed keys, the audit's capture-pool scenario on the fixed code, and both owner-handover reproductions.\n- A new `test/helpers/MockHolderHook.sol` is etched at the holder hook's fixed address so unit tests can create that pool. The fixture, main suite, accounting, invariant, buyback-hook fuzz and both fork suites were adapted to the fixed keys. The fork launcher rehearsal now asserts both live pools exist and burns through them without any setup call.\n- The setup script drops the two setter steps and checks both pools exist. README and ADAPTATION.md describe revision 4, the reasons, and the checks run.\n\n**Side effects worth knowing**\n\n- The hook's runtime fell to 23,654 bytes, 922 under the EIP-170 limit, because the stored keys and setters were larger than the two-step owner and the key views.\n- Protected paths, launch.json and the launcher source are unchanged.","treeHash":"6bdf11844e29eede04b195ee161cfe6861cb4515","usage":{"cachedInputTokens":6793253,"inputTokens":1634,"model":"claude-fable-5-1","outputTokens":58361,"runtime":"claude","turns":52,"wallClockMs":1857549}}],"verification":[{"checks":[{"durationMs":306353,"exitCode":0,"name":"build","output":"Compiling 109 files with Solc 0.8.26\nSolc 0.8.26 finished in 305.18s\nCompiler run successful with warnings:\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:559:17:\n    |\n559 |                 address leader = _currentLeader(round);\n    |                 ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:763:9:\n    |\n763 |         address leader = _leader[round];\n    |         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:798:63:\n    |\n798 |     function _scan(uint256 round, bool all) internal returns (address leader) {\n    |                                                               ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:831:39:\n    |\n831 |     function _setReign(uint256 round, address leader) internal {\n    |                                       ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:871:43:\n    |\n871 |     function _lowestRecent(uint256 round, address leader) internal view returns (address lowest) {\n    |                                           ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:364:17:\n    |\n364 |                 address leader = _currentLeader(day);\n    |                 ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:490:9:\n    |\n490 |         address leader = _leader[day];\n    |         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:501:60:\n    |\n501 |     function _currentLeader(uint256 day) internal returns (address leader) {\n    |                                                            ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:529:41:\n    |\n529 |     function _lowestRecent(uint256 day, address leader) internal view returns (address lowest) {\n    |                                         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:677:9:\n    |\n677 |         bytes memory result = poolManager.unlock(abi.encode(amount, minPfwaOut));\n    |         ^^^^^^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:764:5:\n    |\n764 |     function result(uint256 day)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[weak-prng]: weak randomness derived from a predictable on-chain value\n    ╭▸ src/SherwoodV2.sol:689:30\n    │\n689 │         bytes32 userRandom = keccak256(abi.encode(player, ethIn, block.number, block.timestamp, gasleft()));\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/weak-prng\n\nwarning[weak-prng]: weak randomness derived from a predictable on-chain value\n    ╭▸ src/Sherwood.sol:427:30\n    │\n427 │         bytes32 userRandom = keccak256(abi.encode(player, ethIn, block.number, block.timestamp, gasleft()));\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/weak-prng\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n   ╭▸ src/SherwoodV2Launcher.sol:37:29\n   │\n37 │           bytes memory init = abi.encodePacked(\n   │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n38 │ ┃             type(SherwoodV2).creationCode,\n39 │ ┃             abi.encode(poolManager, token, host, hostHolderMin, dice, diceProvider, owner, genesis)\n40 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/SherwoodV2Launcher.sol:72:14\n   │\n72 │         if (!found) revert NoSalt();\n   │              ━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:213:80\n    │\n213 │     constructor(IPoolManager _poolManager, Currency _pfwa, IDiceEntropy _dice, address _diceProvider, address _owner) {\n    │                                                                                ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:213:103\n    │\n213 │     constructor(IPoolManager _poolManager, Currency _pfwa, IDiceEntropy _dice, address _diceProvider, address _owner) {\n    │                                                                                                       ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Sherwood.sol:283:13\n    │\n283 │             emit PotFunded(day, fee, false);\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/Sherwood.sol:338:21\n    │\n338 │                     emit ReferrerSet(player, referrer);\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/Sherwood.sol:445:9\n    │\n445 │         emit FlipRequested(sequence, day, player, stake);\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/Sherwood.sol:352:13\n    │\n352 │             emit Played(day, player, move, ethIn, 0, previous, 0);\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/Sherwood.sol:376:13\n    │\n376 │             emit Played(day, player, move, ethIn, scored, target, moved);\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/Sherwood.sol:383:17\n    │\n383 │                 emit ReferralPoints(day, ref, player, bonus);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:277:25\n    │\n277 │         uint256 ethIn = uint256(-params.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/Sherwood.sol:286:63\n    │\n286 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\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/Sherwood.sol:286:70\n    │\n286 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:322:58\n    │\n322 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/Sherwood.sol:314:17\n    │\n314 │                 emit PotFunded(day, fee, true);\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/Sherwood.sol:320:13\n    │\n320 │             emit PointsWiped(day, tx.origin, uint256(had));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:298:32\n    │\n298 │             uint256 declared = uint256(-params.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/Sherwood.sol:299:17\n    │\n299 │             if (uint256(int256(-delta.amount0())) + (declared * FEE_BPS) / 10_000 < declared) revert PartialFill();\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/Sherwood.sol:301:32\n    │\n301 │             if (pfwaOut > 0 && uint256(-params.amountSpecified) >= MIN_BUY) {\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/Sherwood.sol:302:52\n    │\n302 │                 bought[currentDay()][tx.origin] += uint256(int256(pfwaOut));\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/Sherwood.sol:310:20\n    │\n310 │             fee = (uint256(int256(ethOut)) * FEE_BPS) / 10_000;\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/Sherwood.sol:319:36\n    │\n319 │             _debit(day, tx.origin, uint256(had));\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/Sherwood.sol:320:46\n    │\n320 │             emit PointsWiped(day, tx.origin, uint256(had));\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/Sherwood.sol:322:44\n    │\n322 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/Sherwood.sol:322:51\n    │\n322 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/Sherwood.sol:345:26\n    │\n345 │         uint256 scored = (base * bonusBps) / 10_000;\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/Sherwood.sol:380:29\n    │\n380 │             uint256 bonus = (scored * REFERRAL_POINTS_BPS) / 10_000;\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/Sherwood.sol:376:59\n    │\n376 │             emit Played(day, player, move, ethIn, scored, target, moved);\n    │                                                           ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:376:67\n    │\n376 │             emit Played(day, player, move, ethIn, scored, target, moved);\n    │                                                                   ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:435:15\n    │\n435 │         flips[sequence] = PendingFlip({\n    │               ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:426:13\n    │\n426 │         if (diceFee > MAX_DICE_FEE || pot[day] < diceFee) return false;\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:438:18\n    │\n438 │             day: uint64(day),\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/Sherwood.sol:439:26\n    │\n439 │             requestedAt: 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/Sherwood.sol:440:20\n    │\n440 │             stake: uint96(stake),\n    │                    ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:441:18\n    │\n441 │             win: uint96((stake * scaledBps(FLIP_WIN_BPS_MIN, FLIP_WIN_BPS_MAX, base)) / 10_000)\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SherwoodV2.sol:376:9\n    │\n376 │         address _diceProvider,\n    │         ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SherwoodV2.sol:377:9\n    │\n377 │         address _owner,\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Sherwood.sol:468:39\n    │\n468 │         if (f.player == address(0) || block.timestamp < f.requestedAt + FLIP_TIMEOUT) revert FlipNotExpired();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:486:48\n    │\n486 │         int256 updated = points[day][player] + int256(amount);\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/Sherwood.sol:496:32\n    │\n496 │         points[day][player] -= int256(amount);\n    │                                ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:509:21\n    │\n509 │             if (p > best) (best, leader) = (p, players[i]);\n    │                     ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:518:24\n    │\n518 │         return p > 0 ? uint256(p) : 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[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/Sherwood.sol:598:31\n    │\n598 │                 uint256 cut = (prize * REFERRAL_PRIZE_BPS) / 10_000;\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/Sherwood.sol:594:13\n    │\n594 │             awarded += prize;\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/Sherwood.sol:545:13\n    │\n545 │         if (block.timestamp < (day + 1) * 1 days + SETTLE_DELAY) revert DayNotOver();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Sherwood.sol:584:31\n    │\n584 │             uint256 balance = IBalanceOf(Currency.unwrap(pfwa)).balanceOf(winner);\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:570:20\n    │\n570 │         r.cursor = uint64(end);\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/Sherwood.sol:606:23\n    │\n606 │         r.settledAt = 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/Sherwood.sol:627:17\n    │\n627 │                 amount += r.prize[i];\n    │                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Sherwood.sol:617:13\n    │\n617 │         if (block.timestamp > claimDeadline(day)) revert ClaimWindowClosed();\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/Sherwood.sol:633:9\n    │\n633 │         emit PrizeClaimed(day, msg.sender, amount);\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/Sherwood.sol:625:42\n    │\n625 │                 if (balance < r.held[i]) revert MustHoldToClaim();\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/Sherwood.sol:650:9\n    │\n650 │         emit ReferralClaimed(msg.sender, 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/Sherwood.sol:663:17\n    │\n663 │                 amount += r.prize[i];\n    │                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Sherwood.sol:657:13\n    │\n657 │         if (block.timestamp <= claimDeadline(day)) revert ClaimWindowOpen();\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/Sherwood.sol:679:9\n    │\n679 │         emit BuybackBurned(amount, burned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:686:66\n    │\n686 │             key, SwapParams({zeroForOne: true, amountSpecified: -int256(amount), sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1}), \"\"\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/Sherwood.sol:688:27\n    │\n688 │         uint256 ethPaid = uint256(int256(-delta.amount0()));\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/Sherwood.sol:689:27\n    │\n689 │         uint256 pfwaOut = uint256(int256(delta.amount1()));\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[unused-return]: return value of an external call is not used\n    ╭▸ src/Sherwood.sol:691:9\n    │\n691 │         poolManager.settle{value: ethPaid}();\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/SherwoodV2.sol:423:16\n    │\n423 │         return block.timestamp < GENESIS ? 0 : (block.timestamp - GENESIS) / ROUND_LENGTH;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:705:23\n    │\n705 │     function setOwner(address next) external onlyOwner {\n    │                       ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:710:26\n    │\n710 │     function setOperator(address next) external onlyOwner {\n    │                          ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SherwoodV2.sol:468:33\n    │\n468 │         if (ethIn >= MIN_BUY && block.timestamp >= GENESIS) _play(round, tx.origin, ethIn, hookData);\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/SherwoodV2.sol:466:13\n    │\n466 │             emit PotFunded(round, fee, false);\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/SherwoodV2.sol:848:9\n    │\n848 │         emit ReignChanged(round, leader, at);\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/SherwoodV2.sol:527:21\n    │\n527 │                     emit ReferrerSet(player, referrer);\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/SherwoodV2.sol:605:13\n    │\n605 │             emit ShieldArmed(round, player, until);\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/SherwoodV2.sol:708:9\n    │\n708 │         emit FlipRequested(sequence, round, player, stake);\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/SherwoodV2.sol:543:13\n    │\n543 │             emit Played(round, player, move, ethIn, 0, previous, 0);\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/SherwoodV2.sol:637:9\n    │\n637 │         emit Reflected(round, attacker, defender, amount, move);\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/SherwoodV2.sol:576:13\n    │\n576 │             emit Played(round, player, move, ethIn, scored, target, moved);\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/SherwoodV2.sol:583:17\n    │\n583 │                 emit ReferralPoints(round, ref, player, bonus);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:460:25\n    │\n460 │         uint256 ethIn = uint256(-params.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/SherwoodV2.sol:469:63\n    │\n469 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\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/SherwoodV2.sol:469:70\n    │\n469 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SherwoodV2.sol:508:58\n    │\n508 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/SherwoodV2.sol:485:56\n    │\n485 │             if (tokenOut > 0 && declared >= MIN_BUY && block.timestamp >= GENESIS) {\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/SherwoodV2.sol:498:17\n    │\n498 │                 emit PotFunded(round, fee, true);\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/SherwoodV2.sol:505:13\n    │\n505 │             emit PointsWiped(round, tx.origin, uint256(had));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:481:32\n    │\n481 │             uint256 declared = uint256(-params.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/SherwoodV2.sol:482:17\n    │\n482 │             if (uint256(int256(-delta.amount0())) + (declared * FEE_BPS) / 10_000 < declared) revert PartialFill();\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/SherwoodV2.sol:486:54\n    │\n486 │                 bought[currentRound()][tx.origin] += uint256(int256(tokenOut));\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/SherwoodV2.sol:494:20\n    │\n494 │             fee = (uint256(int256(ethOut)) * FEE_BPS) / 10_000;\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/SherwoodV2.sol:504:38\n    │\n504 │             _debit(round, tx.origin, uint256(had));\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/SherwoodV2.sol:505:48\n    │\n505 │             emit PointsWiped(round, tx.origin, uint256(had));\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/SherwoodV2.sol:508:44\n    │\n508 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/SherwoodV2.sol:508:51\n    │\n508 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/SherwoodV2.sol:536:26\n    │\n536 │         uint256 scored = (base * bonusBps) / 10_000;\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/SherwoodV2.sol:580:29\n    │\n580 │             uint256 bonus = (scored * REFERRAL_POINTS_BPS) / 10_000;\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/SherwoodV2.sol:576:61\n    │\n576 │             emit Played(round, player, move, ethIn, scored, target, moved);\n    │                                                             ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SherwoodV2.sol:576:69\n    │\n576 │             emit Played(round, player, move, ethIn, scored, target, moved);\n    │                                                                     ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:524:63\n    │\n524 │                 address referrer = word >> 160 == 0 ? address(uint160(word)) : address(0);\n    │                                                               ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' is safe 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/SherwoodV2.sol:596:20\n    │\n596 │         s.played = uint128(played + ethIn);\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/SherwoodV2.sol:620:16\n    │\n620 │         return n < cap ? n : cap;\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/SherwoodV2.sol:626:17\n    │\n626 │         return (clock > full ? clock : full) + recharge;\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/SherwoodV2.sol:642:16\n    │\n642 │         return block.timestamp < shieldUntil[player];\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SherwoodV2.sol:697:15\n    │\n697 │         flips[sequence] = PendingFlip({\n    │               ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SherwoodV2.sol:688:13\n    │\n688 │         if (diceFee > MAX_DICE_FEE || diceFee > (ethIn * FEE_BPS) / 10_000 || pot[round] < diceFee) return false;\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:700:20\n    │\n700 │             round: uint64(round),\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/SherwoodV2.sol:701:26\n    │\n701 │             requestedAt: 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/SherwoodV2.sol:702:20\n    │\n702 │             stake: uint96(stake),\n    │                    ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:703:18\n    │\n703 │             win: uint96((stake * scaledBps(FLIP_WIN_BPS_MIN, FLIP_WIN_BPS_MAX, base)) / 10_000)\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SherwoodV2.sol:737:39\n    │\n737 │         if (f.player == address(0) || block.timestamp < f.requestedAt + FLIP_TIMEOUT) revert FlipNotExpired();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:759:50\n    │\n759 │         int256 updated = points[round][player] + int256(amount);\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/SherwoodV2.sol:769:34\n    │\n769 │         points[round][player] -= int256(amount);\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/SherwoodV2.sol:838:27\n    │\n838 │                 g.since = uint64(at); // points changed: the spell starts over\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/SherwoodV2.sol:847:19\n    │\n847 │         g.since = 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SherwoodV2.sol:854:16\n    │\n854 │         return block.timestamp < end ? block.timestamp : end;\n    │                ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:860:24\n    │\n860 │         return p > 0 ? uint256(p) : 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[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/SherwoodV2.sol:979:31\n    │\n979 │                 uint256 cut = (prize * REFERRAL_PRIZE_BPS) / 10_000;\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/SherwoodV2.sol:974:13\n    │\n974 │             awarded += prize;\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/SherwoodV2.sol:894:13\n    │\n894 │         if (block.timestamp < roundEnd(round) + SETTLE_DELAY) revert RoundNotOver();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SherwoodV2.sol:964:31\n    │\n964 │             uint256 balance = IBalanceOf(Currency.unwrap(token)).balanceOf(winner);\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:906:23\n    │\n906 │             g.since = uint64(end);\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/SherwoodV2.sol:931:20\n    │\n931 │         r.cursor = uint64(end_);\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/SherwoodV2.sol:941:41\n    │\n941 │             (g.holder, g.since) = (top, uint64(end));\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/SherwoodV2.sol:943:40\n    │\n943 │         (r.king, r.kingReign) = (king, uint64(kingReign));\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/SherwoodV2.sol:987:23\n    │\n987 │         r.settledAt = 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/SherwoodV2.sol:1014:17\n     │\n1014 │                 amount += r.prize[i];\n     │                 ━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/SherwoodV2.sol:1004:13\n     │\n1004 │         if (block.timestamp > claimDeadline(round)) revert ClaimWindowClosed();\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/SherwoodV2.sol:1020:9\n     │\n1020 │         emit PrizeClaimed(round, msg.sender, amount);\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/SherwoodV2.sol:1012:42\n     │\n1012 │                 if (balance < r.held[i]) revert MustHoldToClaim();\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/SherwoodV2.sol:1037:9\n     │\n1037 │         emit ReferralClaimed(msg.sender, 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/SherwoodV2.sol:1050:17\n     │\n1050 │                 amount += r.prize[i];\n     │                 ━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/SherwoodV2.sol:1044:13\n     │\n1044 │         if (block.timestamp <= claimDeadline(round)) revert ClaimWindowOpen();\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/SherwoodV2.sol:1054:9\n     │\n1054 │         emit UnclaimedSwept(round, 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/SherwoodV2.sol:1066:9\n     │\n1066 │         emit BuybackBurned(amount, burned);\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/SherwoodV2.sol:1076:9\n     │\n1076 │         emit HostBuybackBurned(amount, burned);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/SherwoodV2.sol:1086:53\n     │\n1086 │                 zeroForOne: true, amountSpecified: -int256(amount), sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1\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/SherwoodV2.sol:1090:27\n     │\n1090 │         uint256 ethPaid = uint256(int256(-delta.amount0()));\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/SherwoodV2.sol:1091:23\n     │\n1091 │         uint256 out = uint256(int256(delta.amount1()));\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[unused-return]: return value of an external call is not used\n     ╭▸ src/SherwoodV2.sol:1093:9\n     │\n1093 │         poolManager.settle{value: ethPaid}();\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n     ╭▸ src/SherwoodV2.sol:1126:23\n     │\n1126 │     function setOwner(address next) external onlyOwner {\n     │                       ━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n     ╭▸ src/SherwoodV2.sol:1139:26\n     │\n1139 │     function setOperator(address next) external onlyOwner {\n     │                          ━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/SherwoodV2.sol:1244:16\n     │\n1244 │         return n >= cap ? 0 : clock + (n + 1) * recharge;\n     │                ━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n     ╭▸ src/SherwoodV2.sol:1270:47\n     │\n1270 │             if (_outreigns(round, a, s, best, bestReign)) (best, bestReign) = (a, s);\n     │                                               ━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\n","passed":true},{"durationMs":97091,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/SherwoodV2LauncherFork.t.sol:SherwoodV2LauncherForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 814.54µs (0.00ns CPU time)\n\nRan 1 test for test/SherwoodV2Fork.t.sol:SherwoodV2ForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 952.40µs (0.00ns CPU time)\n\nRan 1 test for test/SherwoodV2Launcher.t.sol:SherwoodV2LauncherOfflineTest\n[PASS] test_constructorWorksOnEmptyChainAndFactoryDoesNotOwnHook() (gas: 512997)\nLogs:\n  offline launcher deployment gas: 25706\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 8.00ms (7.69ms CPU time)\n\nRan 8 tests for test/SherwoodV2Lifecycle.t.sol:SherwoodV2LifecycleTest\n[PASS] testFuzz_diceOutageFallsBackWithoutConsumingFlip(uint256,bool) (runs: 1000, μ: 591246, ~: 587136)\n[PASS] test_diceFeeAtCapNeedsABuyWhoseShareCoversItAndOneWeiAboveCapFallsBack() (gas: 2214989)\n[PASS] test_eachChargeClockRechargesAtItsExactBoundary() (gas: 11519395)\n[PASS] test_expiryAndDiceRefundUseSeparateAccountingAndCannotRepeat() (gas: 943567)\n[PASS] test_multipleFlipsResolveOutOfOrderAgainstSavedPreviousPlayers() (gas: 2691413)\n[PASS] test_partialRechargeSurvivesSpendingAnotherBankedCharge() (gas: 1387295)\n[PASS] test_referralTransferFailureRollsBackAndCrossFunctionReentryIsBlocked() (gas: 2991576)\n[PASS] test_timeoutRecoveryUnblocksBatchedSettlementAtExactOpening() (gas: 2085535)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 692.13ms (720.32ms CPU time)\n\nRan 1 test for test/SherwoodV2BuybackHook.t.sol:SherwoodV2BuybackHookTest\n[PASS] testFuzz_hostBurnUsesNetDeltasIncludingTheHolderHooksFees(uint256) (runs: 1000, μ: 1032052, ~: 1032156)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 705.76ms (702.22ms CPU time)\n\nRan 142 tests for test/SherwoodV2.t.sol:SherwoodV2Test\n[PASS] test_beforeGenesisFeesGoToRoundZeroButNothingScores() (gas: 1214659)\n[PASS] test_belowMinimumScoresNothingButPaysFee() (gas: 241633)\n[PASS] test_buyScoresByBuySizeAndFundsPot() (gas: 531812)\n[PASS] test_buyStoppedByPriceLimitReverts() (gas: 445468)\n[PASS] test_buybackAndBurnHostBurnsHostToDead() (gas: 1384585)\n[PASS] test_buybackPoolIsFixedToTheOnePercentPoolWithNoSetter() (gas: 57202)\n[PASS] test_buybackSwapsInOtherPoolAndBurns() (gas: 1088890)\n[PASS] test_buyerReceivesPfwaForEthAfterFee() (gas: 520953)\n[PASS] test_buysAreRecordedPerRound() (gas: 536247)\n[PASS] test_buysScoreInTheRoundTheyHappen() (gas: 1215723)\n[PASS] test_cannotReferYourselfOrTheOneWhoReferredYou() (gas: 1166841)\n[PASS] test_chargesBankedPastTheCapAreDropped() (gas: 922099)\n[PASS] test_chargesCarryAcrossRounds() (gas: 9167833)\n[PASS] test_claimDeadlineFromRoundEndWhenSettledOnTime() (gas: 910805)\n[PASS] test_diceFeeAboveCapScoresAsBuy() (gas: 618557)\n[PASS] test_diceRefundFromAnywhereGoesToBuybackReserve() (gas: 681031)\n[PASS] test_dirtyReferrerWordIsIgnoredNotAReasonToRevert() (gas: 945667)\n[PASS] test_exactOutputReverts() (gas: 82018)\n[PASS] test_expiredFlipsUnblockSettlement() (gas: 1061813)\n[PASS] test_flipChargesStackAcrossRounds() (gas: 3070370)\n[PASS] test_flipLossComesOffExistingPoints() (gas: 1329928)\n[PASS] test_flipLossGoesNegativeAndPaysPreviousPlayer() (gas: 1118224)\n[PASS] test_flipPaysDiceFeeFromPot() (gas: 608916)\n[PASS] test_flipRevealedAfterSettlementIsIgnored() (gas: 1610534)\n[PASS] test_flipScoresAsBuyWhenDiceFeeExceedsTheBuysPotShare() (gas: 1153876)\n[PASS] test_flipScoresAsBuyWhenDiceRefuses() (gas: 706890)\n[PASS] test_flipWinDoublesPoints() (gas: 1125586)\n[PASS] test_flipWinScalesWithBuySizeNotBonus() (gas: 1194850)\n[PASS] test_fullSizeFlipWinPaysTriple() (gas: 1110710)\n[PASS] test_fullSizeRobinHoodMoves33Percent() (gas: 1325699)\n[PASS] test_fullSizeStealTakes40Percent() (gas: 938447)\n[PASS] test_fundPotRejectsRoundsTooFarAhead() (gas: 139335)\n[PASS] test_fundPotSeedsCurrentAndFutureRounds() (gas: 171132)\n[PASS] test_gas_completingSettleBatch() (gas: 9330925)\nLogs:\n  settle, 24 players, 4 prizes (one batch): 722754\n  claim, King only: 90792\n\n[PASS] test_gas_reignUpkeep() (gas: 70231003)\nLogs:\n  buy, #1 unchanged: 357366\n  buy, #1 changes: 368397\n  leader sell with 203 players (rescan): 1239914\n\n[PASS] test_holderBonusDoesNotRaiseStealShare() (gas: 1379376)\n[PASS] test_holderBonusForKeepingLastRoundsBuys() (gas: 1384954)\n[PASS] test_holderBonusMaxesAt125Points() (gas: 969686)\n[PASS] test_holderBonusNeedsLastRoundsPlay() (gas: 969509)\n[PASS] test_holdingRuleUsesBalanceAtSettlement() (gas: 1183951)\n[PASS] test_hostBonusAtTheThreshold() (gas: 1189145)\n[PASS] test_hostBonusStacksWithTheOtherBonuses() (gas: 1859648)\n[PASS] test_hostBurnReserveAccruesSevenPercent() (gas: 1740638)\n[PASS] test_hostBuybackPoolIsFixedToTheHolderPoolWithNoSetter() (gas: 47037)\n[PASS] test_hostSameAsGameTokenTurnsHostFeaturesOff() (gas: 1428518)\n[PASS] test_hostWiring() (gas: 25917)\n[PASS] test_kingFullTieGoesToTheEarlierPlayer() (gas: 1814273)\n[PASS] test_kingMustHoldToClaim() (gas: 2492581)\n[PASS] test_kingOutsideTopThreeClaimsKingPrize() (gas: 2495661)\n[PASS] test_kingPrizeForfeitsPartly() (gas: 1640625)\n[PASS] test_kingTieGoesToMorePoints() (gas: 2348615)\n[PASS] test_kingWhoSoldEverythingGetsNothing() (gas: 2385994)\n[PASS] test_lateSettlementStillGivesSevenDaysToClaim() (gas: 1030583)\n[PASS] test_leaderChangeAfterRoundEndCountsNothing() (gas: 1648527)\n[PASS] test_leaderLostFlipCallbackFitsDiceGasLimitOnABigBoard() (gas: 70590963)\nLogs:\n  leader loss on 202 players, callback gas: 111847\n\n[PASS] test_leaderLostFlipDefersTheRescanJustPastTheBound() (gas: 5226416)\nLogs:\n  leader loss on 13 players, callback gas: 91947\n\n[PASS] test_leaderLostFlipRescansASmallBoardInsideTheCallback() (gas: 4977163)\nLogs:\n  leader loss on 12 players, callback gas: 166233\n\n[PASS] test_negativePlayersNeverPlace() (gas: 1521626)\n[PASS] test_noHolderBonusAfterSellingLastRoundsBuys() (gas: 1035634)\n[PASS] test_noHookDataIsPlainBuy() (gas: 513972)\n[PASS] test_noKingShareRollsOver() (gas: 1062431)\n[PASS] test_noPrizeShareIfReferrerSkippedTheRound() (gas: 1798104)\n[PASS] test_noWelcomeBonusWithoutAReferrer() (gas: 515571)\n[PASS] test_onlyDiceCanDeliverRandomness() (gas: 31867)\n[PASS] test_onlyOneGamePool() (gas: 47275)\n[PASS] test_onlyTheOwnerCanCreateThePool() (gas: 268974)\n[PASS] test_otherFlipOutcomesFitDiceGasLimitOnABigBoard() (gas: 69471853)\nLogs:\n  non-leader loss, callback gas: 76387\n  win taking #1, callback gas: 79333\n\n[PASS] test_partialWinnerMustKeepWhatTheyHeldToClaim() (gas: 1200847)\n[PASS] test_plainEthTransferLandsInCurrentPot() (gas: 65612)\n[PASS] test_pointsCapAt100PerBuy() (gas: 517010)\n[PASS] test_potSplitSumsToWhole() (gas: 79960)\n[PASS] test_rankAndKingClaimNeedsTheHolding() (gas: 1695010)\n[PASS] test_rankAndKingClaimedTogether() (gas: 1573586)\n[PASS] test_recentPlayersMostRecentFirst() (gas: 3905356)\n[PASS] test_reentrantWinnerGetsNothingExtra() (gas: 1400447)\n[PASS] test_referralShareComesOutOfTheRollover() (gas: 1602076)\n[PASS] test_referralWorstCaseKeepsRolloverAboveZero() (gas: 2908606)\n[PASS] test_referredPlayerGetsHolderBonusNextRound() (gas: 1373063)\n[PASS] test_referrerEarnsTenPercentPointsOnlyInRoundsTheyPlayed() (gas: 1172539)\n[PASS] test_referrerIsSetOnceAndNeverChanges() (gas: 1166502)\n[PASS] test_referrerOnlyOnTheFirstPlay() (gas: 1101710)\n[PASS] test_referrerTakesFivePercentOfKingPrize() (gas: 2715842)\n[PASS] test_referrerTakesFivePercentOfPrize() (gas: 1582730)\n[PASS] test_reflectedRobinHoodTakesTheFullCutBelowZero() (gas: 1314267)\n[PASS] test_reflectedStealTakesTheFullCutBelowZero() (gas: 1583910)\n[PASS] test_reignCanBeVacant() (gas: 1222762)\n[PASS] test_reignChangesOnFlipExpiry() (gas: 1125250)\n[PASS] test_reignChangesOnFlipLoss() (gas: 1943750)\n[PASS] test_reignChangesOnFlipWin() (gas: 1136037)\n[PASS] test_reignChangesOnReflect() (gas: 1200844)\n[PASS] test_reignChangesOnRobinHood() (gas: 1335622)\n[PASS] test_reignChangesOnSellWipe() (gas: 1176746)\n[PASS] test_reignChangesOnSteal() (gas: 952901)\n[PASS] test_reignCountsSecondsAtNumberOne() (gas: 1402252)\n[PASS] test_reignStopsAtRoundEndAndIsFinalizedAtSettlement() (gas: 1423182)\n[PASS] test_robinHoodAfterShieldExpiresLands() (gas: 1313636)\n[PASS] test_robinHoodCanPayTheMover() (gas: 1150161)\n[PASS] test_robinHoodChargesStackAndRecharge() (gas: 2406451)\n[PASS] test_robinHoodFindsNewLeaderAfterLeaderLosesPoints() (gas: 2190004)\n[PASS] test_robinHoodIntoShieldIsReflected() (gas: 1551898)\n[PASS] test_robinHoodMovesLeaderPointsToLowestRecent() (gas: 1316301)\n[PASS] test_roundBoundaries() (gas: 64775)\n[PASS] test_samePermissionsAsV1() (gas: 12910)\n[PASS] test_scaledBpsRange() (gas: 17508)\n[PASS] test_seededPotPaysTheWinner() (gas: 967070)\n[PASS] test_sellLeavesNegativeScore() (gas: 1345234)\n[PASS] test_sellWipesPointsAndFundsPot() (gas: 825215)\n[PASS] test_settleAllRemainingWithMax() (gas: 1435694)\n[PASS] test_settleCreditsTheFinalUnknownSpellToTheFinalLeader() (gas: 5941441)\n[PASS] test_settleInBatches() (gas: 1910394)\n[PASS] test_settleInBatchesSendsNothing() (gas: 1982913)\n[PASS] test_settleNeverCallsWinners() (gas: 1247355)\nLogs:\n  settle with a gas-burning winner: 367793\n\n[PASS] test_settleSplitsPotAndWinnersClaim() (gas: 2792917)\n[PASS] test_settleTimingPerRound() (gas: 1824018)\n[PASS] test_settleWaitsForPendingFlips() (gas: 1865010)\n[PASS] test_shieldChargeEarnedAtCumulativeThreshold() (gas: 1308773)\n[PASS] test_shieldChargesCapAtOne() (gas: 1500028)\n[PASS] test_shieldExpiresAfterThirtyMinutes() (gas: 979759)\n[PASS] test_shieldRearmRefreshesExpiry() (gas: 787812)\n[PASS] test_shieldScoresLikeABuyAndArmsWithTheChargeItEarns() (gas: 552536)\n[PASS] test_shieldWithoutChargeIsPlainBuy() (gas: 526853)\n[PASS] test_stealChargesStackAndRecharge() (gas: 8873349)\n[PASS] test_stealFromNegativePlayerTakesNothing() (gas: 2294954)\n[PASS] test_stealIntoShieldIsReflected() (gas: 1199188)\n[PASS] test_stealOnYourselfDoesNothingExtra() (gas: 731279)\n[PASS] test_stealTakes20PercentOfPreviousPlayer() (gas: 925943)\n[PASS] test_stealThatTakesNothingLeavesTheShieldUp() (gas: 1267621)\n[PASS] test_stealWithNoTargetUsesNoCharge() (gas: 754114)\n[PASS] test_sweepLandsInTheRoundLiveWhenSwept() (gas: 1100163)\n[PASS] test_sweepTakesRankAndKingLeftUnclaimed() (gas: 1613917)\n[PASS] test_sweepUnsettledRoundReverts() (gas: 554115)\n[PASS] test_throwawayWalletPaysTheFullCutToBreakAShield() (gas: 1631766)\n[PASS] test_unawardedSharesRollOverWhenFewerThanThreePlayers() (gas: 901283)\n[PASS] test_unclaimedKingPrizeDeadlineAndSweep() (gas: 2686439)\n[PASS] test_unclaimedPrizesSweepAfterSevenDays() (gas: 1313979)\n[PASS] test_unknownMoveIsPlainBuy() (gas: 516211)\n[PASS] test_unrevealedFlipExpiresAsPlainBuy() (gas: 797427)\n[PASS] test_walletThatRefusesEthCanClaimOnceItAccepts() (gas: 1944822)\n[PASS] test_welcomeBonusOnlyInTheFirstRound() (gas: 1468627)\n[PASS] test_winnerMustHoldThatRoundsBuysToClaim() (gas: 1134231)\n[PASS] test_winnerWhoSoldEverythingForfeitsAtSettlement() (gas: 1485651)\n[PASS] test_winnerWhoSoldPartForfeitsThatShare() (gas: 1661370)\nSuite result: ok. 142 passed; 0 failed; 0 skipped; finished in 770.84ms (740.43ms CPU time)\n\nRan 67 tests for test/Sherwood.t.sol:SherwoodTest\n[PASS] test_belowMinimumScoresNothingButPaysFee() (gas: 239165)\n[PASS] test_buyScoresByBuySizeAndFundsPot() (gas: 474711)\n[PASS] test_buyStoppedByPriceLimitReverts() (gas: 389537)\n[PASS] test_buybackPoolCannotBeTheGamePool() (gas: 47444)\n[PASS] test_buybackPoolIsSetOnce() (gas: 103255)\n[PASS] test_buybackSwapsInOtherPoolAndBurns() (gas: 974940)\n[PASS] test_buyerReceivesPfwaForEthAfterFee() (gas: 465362)\n[PASS] test_buysAreRecordedPerDay() (gas: 478211)\n[PASS] test_cannotReferYourselfOrTheOneWhoReferredYou() (gas: 1047635)\n[PASS] test_diceFeeAboveCapScoresAsBuy() (gas: 558574)\n[PASS] test_diceRefundFromAnywhereGoesToBuybackReserve() (gas: 620104)\n[PASS] test_exactOutputReverts() (gas: 81719)\n[PASS] test_expiredFlipsUnblockSettlement() (gas: 922334)\n[PASS] test_flipLossComesOffExistingPoints() (gas: 1176958)\n[PASS] test_flipLossGoesNegativeAndPaysPreviousPlayer() (gas: 974405)\n[PASS] test_flipPaysDiceFeeFromPot() (gas: 548383)\n[PASS] test_flipRevealedAfterSettlementIsIgnored() (gas: 1328378)\n[PASS] test_flipScoresAsBuyWhenDiceRefuses() (gas: 640479)\n[PASS] test_flipWinDoublesPoints() (gas: 974723)\n[PASS] test_flipWinScalesWithBuySizeNotBonus() (gas: 1003012)\n[PASS] test_fullSizeFlipWinPaysTriple() (gas: 959278)\n[PASS] test_fullSizeRobinHoodMoves33Percent() (gas: 1179962)\n[PASS] test_fullSizeStealTakes40Percent() (gas: 831588)\n[PASS] test_fundPotSeedsTodayAndFutureDays() (gas: 168013)\n[PASS] test_holderBonusDoesNotRaiseStealShare() (gas: 1197032)\n[PASS] test_holderBonusForKeepingYesterdaysBuys() (gas: 1225572)\n[PASS] test_holderBonusMaxesAt125Points() (gas: 832916)\n[PASS] test_holderBonusNeedsYesterdaysPlay() (gas: 831315)\n[PASS] test_lateSettlementStillGivesSevenDaysToClaim() (gas: 820918)\n[PASS] test_negativePlayersNeverPlace() (gas: 1239262)\n[PASS] test_noHolderBonusAfterSellingYesterdaysBuys() (gas: 912559)\n[PASS] test_noHookDataIsPlainBuy() (gas: 455840)\n[PASS] test_noPrizeShareIfReferrerSkippedTheDay() (gas: 1483911)\n[PASS] test_noWelcomeBonusWithoutAReferrer() (gas: 459560)\n[PASS] test_onlyDiceCanDeliverRandomness() (gas: 31151)\n[PASS] test_onlyOneGamePool() (gas: 45863)\n[PASS] test_onlyTheOwnerCanCreateThePool() (gas: 245306)\n[PASS] test_partialWinnerMustKeepWhatTheyHeldToClaim() (gas: 1000839)\n[PASS] test_plainEthTransferLandsInTodaysPot() (gas: 66341)\n[PASS] test_pointsCapAt100PerBuy() (gas: 460410)\n[PASS] test_recentPlayersMostRecentFirst() (gas: 3575468)\n[PASS] test_referralShareComesOutOfTheRollover() (gas: 1370935)\n[PASS] test_referredPlayerGetsHolderBonusNextDay() (gas: 1196727)\n[PASS] test_referrerEarnsTenPercentPointsOnlyOnDaysTheyPlayed() (gas: 1067348)\n[PASS] test_referrerIsSetOnceAndNeverChanges() (gas: 1056028)\n[PASS] test_referrerOnlyOnTheFirstPlay() (gas: 990776)\n[PASS] test_referrerTakesFivePercentOfPrize() (gas: 1305693)\n[PASS] test_robinHoodCanPayTheMover() (gas: 1032297)\n[PASS] test_robinHoodFindsNewLeaderAfterLeaderLosesPoints() (gas: 1980670)\n[PASS] test_robinHoodMovesLeaderPointsToLowestRecent() (gas: 1180890)\n[PASS] test_scaledBpsRange() (gas: 40873)\n[PASS] test_seededPotPaysTheWinner() (gas: 797988)\n[PASS] test_sellLeavesNegativeScore() (gas: 1201382)\n[PASS] test_sellWipesPointsAndFundsPot() (gas: 769889)\n[PASS] test_settleInBatches() (gas: 1632465)\n[PASS] test_settleSplitsPotAndWinnersClaim() (gas: 2129562)\n[PASS] test_settleWaitsForPendingFlips() (gas: 1545814)\n[PASS] test_stealFromNegativePlayerTakesNothing() (gas: 2030423)\n[PASS] test_stealOnYourselfDoesNothingExtra() (gas: 656907)\n[PASS] test_stealTakes20PercentOfPreviousPlayer() (gas: 827645)\n[PASS] test_unawardedSharesRollOverWhenFewerThanThreePlayers() (gas: 716371)\n[PASS] test_unclaimedPrizesSweepAfterSevenDays() (gas: 916550)\n[PASS] test_unrevealedFlipExpiresAsPlainBuy() (gas: 704517)\n[PASS] test_welcomeBonusOnlyOnTheFirstDay() (gas: 1306614)\n[PASS] test_winnerMustHoldThatDaysBuysToClaim() (gas: 936200)\n[PASS] test_winnerWhoSoldEverythingForfeitsAtSettlement() (gas: 1253371)\n[PASS] test_winnerWhoSoldPartForfeitsThatShare() (gas: 1337127)\nSuite result: ok. 67 passed; 0 failed; 0 skipped; finished in 770.95ms (66.76ms CPU time)\n\nRan 1 test for test/SherwoodV2UnknownReignKing.t.sol:SherwoodV2UnknownReignKingTest\n[PASS] test_kingOfTheHillIsTheLongestAtFirstPlaceNotTheFinalLeader() (gas: 527725566)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.32s (3.32s CPU time)\n\nRan 5 tests for test/SherwoodV2LargeBoardKing.t.sol:SherwoodV2LargeBoardKingTest\n[PASS] test_debitOfTheRunningBestRestartsTheRescan() (gas: 520773066)\n[PASS] test_kingPrizeGoesToTrueLeaderOnLargeBoard() (gas: 527641577)\n[PASS] test_rescanFinishesInOnePlayWithGasToSpare() (gas: 515431520)\nLogs:\n  1,501 cold players rescanned in one play, gas: 7478536\n\n[PASS] test_rescanResumesInChunksUnderATightGasBudget() (gas: 518436680)\nLogs:\n  resolved board, plain buy gas: 348762\n\n[PASS] test_robinHoodWaitsForTheRescanAndKeepsItsCharge() (gas: 516145728)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 3.37s (16.00s CPU time)\n\nRan 10 tests for test/SherwoodV2Accounting.t.sol:SherwoodV2AccountingTest\n[PASS] testFuzz_batchedSettlementSameAsSinglePass(uint256,uint256,uint256) (runs: 1000, μ: 3434046, ~: 3373287)\n[PASS] testFuzz_buyDeltaMatchesEveryBalance(uint256) (runs: 1000, μ: 392903, ~: 537526)\n[PASS] testFuzz_sellDeltaAndRoundTripCannotCreateETH(uint256,uint256) (runs: 1000, μ: 812930, ~: 814273)\n[PASS] testFuzz_slippageRevertIsAtomicForEitherBurn(bool,uint256) (runs: 1000, μ: 526483, ~: 526534)\n[PASS] test_bothPartialBuybacksRefundOnlyTheirOwnReserve() (gas: 1981798)\n[PASS] test_claimAtExactDeadlineThenSweepCannotDoubleSpend() (gas: 1783105)\n[PASS] test_emptyBuybackLiquidityPreservesReserveAndClaims() (gas: 1689820)\n[PASS] test_oneWeiAndFeeRoundingBoundary() (gas: 513154)\n[PASS] test_partialBuyRollsBackFeeDiceRequestChargesAndReferral() (gas: 662589)\n[PASS] test_unprivilegedCallbacksAndOperatorCannotChangeOwnerOrPools() (gas: 276732)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 3.44s (3.08s CPU time)\n\nRan 4 tests for test/SherwoodV2LaunchConfig.t.sol:SherwoodV2LaunchConfigTest\n[PASS] test_burnPoolsAreTheBriefsPoolsDerivedFromTheConstructor() (gas: 30244)\n[PASS] test_ownerCannotRedirectTheBurnToACapturePool() (gas: 1471834)\n[PASS] test_ownerHandoverIsTwoStep() (gas: 340263)\n[PASS] test_ownerHandoverToAWrongAddressIsHarmlessAndCancellable() (gas: 485329)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.54s (4.18ms CPU time)\n\nRan 12 tests for test/SherwoodV2UnknownReign.t.sol:SherwoodV2UnknownReignTest\n[PASS] testFuzz_chunkedRescanFindsTheTrueLeader(uint256) (runs: 6, μ: 525333255, ~: 525399403)\n[PASS] test_anUnknownSpellDoesNotLeakIntoTheNextRound() (gas: 520908035)\n[PASS] test_boardOfExactlyMaxLeaderScanIsRescannedInsideTheDebitingSwap() (gas: 515121910)\n[PASS] test_debitOfTheLeaderOnABigBoardLeavesFirstPlaceUnknownUntilTheNextPlayRescans() (gas: 527690082)\n[PASS] test_deferredDiceRescanIsResolvedByASellAndCreditedBackToTheReveal() (gas: 6354619)\n[PASS] test_diceLossByTheRunningBestRestartsTheRescanAndTheSpell() (gas: 520062104)\n[PASS] test_expiredFlipOfTheLeaderRescansAndLeavesNoMarker() (gas: 5196516)\n[PASS] test_expiredFlipResumesTheRescanBeforeItCreditsTheStake() (gas: 515791727)\n[PASS] test_reignSecondsNeverOverlapAcrossRepeatedUnknownSpellsAndTheKingIsTheLongest() (gas: 535476749)\n[PASS] test_robinHoodByTheStaleCachedLeaderWaitsForTheRescanAndKeepsItsCharge() (gas: 515736965)\n[PASS] test_sellByAPlayerWithoutPointsNeitherResumesNorRestartsTheSpell() (gas: 515767484)\n[PASS] test_sellByAScoredPlayerResumesTheRescanBeforeItsOwnDebit() (gas: 516864248)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 8.70s (38.55s CPU time)\n\nRan 3 tests for test/SherwoodFork.t.sol:SherwoodForkTest\n[PASS] test_fork_buyOnLivePoolManager() (gas: 516575)\nLogs:\n  PFWA bought with 0.01 ETH: 119478\n\n[PASS] test_fork_buybackBurnsThroughHolderPool() (gas: 1845129)\nLogs:\n  PFWA burned from 0.0005 ETH buyback: 6184\n\n[PASS] test_fork_flipRequestsRealDice() (gas: 602775)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 8.92s (8.86s CPU time)\n\nRan 2 tests for test/SherwoodV2Invariant.t.sol:SherwoodV2InvariantTest\n[PASS]\nSherwoodV2InvariantTest invariants:\n[PASS] invariant_allETHHasExactlyOneLiability\n[PASS] invariant_chargeViewsAndReignsStayConsistent\n[PASS] invariant_finalWinnersMatchScoresAndReignDurations\n[PASS] invariant_pendingFlipCountersMatchLiveRequests\n[PASS] invariant_settledRanksPrizesAndScoresNeverChange\n[PASS] invariant_totalETHOutNeverExceedsRecordedETHIn\n SherwoodV2InvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------+-----------------+-------+---------+----------╮\n| Contract          | Selector        | Calls | Reverts | Discards |\n+==================================================================+\n| SherwoodV2Handler | advance         | 2109  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | burn            | 2063  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | buy             | 2111  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | claim           | 2093  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | diceFailure     | 1981  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | fund            | 2050  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | refund          | 1966  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | resolve         | 2084  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | sell            | 1979  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | settleRound     | 1997  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | sweep           | 2120  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | transferHolding | 2023  | 0       | 0        |\n╰-------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_handlerExercisesRecoveryClaimsAndSweeps() (gas: 4233327)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 96.80s (96.78s CPU time)\n\nRan 14 test suites in 96.81s (131.05s CPU time): 256 tests passed, 0 failed, 2 skipped (258 total tests)\n","passed":true},{"durationMs":186,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Sherwood._entropyCallback(uint64,address,bytes32)\",\"Sherwood.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"Sherwood.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"Sherwood.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"Sherwood.buybackAndBurn(uint256,uint256)\",\"Sherwood.claim(uint256)\",\"Sherwood.claimReferral()\",\"Sherwood.expireFlip(uint64)\",\"Sherwood.fundPot(uint256)\",\"Sherwood.receive()\",\"Sherwood.refundDiceRequest(uint64)\",\"Sherwood.setBuybackPool((address,address,uint24,int24,address))\",\"Sherwood.setOperator(address)\",\"Sherwood.setOwner(address)\",\"Sherwood.settle(uint256,uint256)\",\"Sherwood.sweepUnclaimed(uint256)\",\"Sherwood.unlockCallback(bytes)\",\"SherwoodV2._entropyCallback(uint64,address,bytes32)\",\"SherwoodV2.acceptOwner()\",\"SherwoodV2.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"SherwoodV2.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"SherwoodV2.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"SherwoodV2.buybackAndBurn(uint256,uint256)\",\"SherwoodV2.buybackAndBurnHost(uint256,uint256)\",\"SherwoodV2.claim(uint256)\",\"SherwoodV2.claimReferral()\",\"SherwoodV2.expireFlip(uint64)\",\"SherwoodV2.fundPot(uint256)\",\"SherwoodV2.receive()\",\"SherwoodV2.refundDiceRequest(uint64)\",\"SherwoodV2.setOperator(address)\",\"SherwoodV2.setOwner(address)\",\"SherwoodV2.settle(uint256,uint256)\",\"SherwoodV2.sweepUnclaimed(uint256)\",\"SherwoodV2.unlockCallback(bytes)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":247,\"AUDIT.md\":30,\"README.md\":177,\"foundry.toml\":22,\"launch.json\":19,\"script/DeploySherwoodV2.s.sol\":60,\"script/DryRunImd.s.sol\":16,\"script/SetupSherwoodV2.s.sol\":53,\"src/Sherwood.sol\":833,\"src/SherwoodV2.sol\":1325,\"src/SherwoodV2Launcher.sol\":74,\"test/SHERWOOD_V2_TESTING.md\":104,\"test/Sherwood.t.sol\":910,\"test/SherwoodFork.t.sol\":132,\"test/SherwoodV2.t.sol\":2499,\"test/SherwoodV2Accounting.t.sol\":288,\"test/SherwoodV2BuybackHook.t.sol\":90,\"test/SherwoodV2Fork.t.sol\":270,\"test/SherwoodV2Invariant.t.sol\":190,\"test/SherwoodV2LargeBoardKing.t.sol\":241,\"test/SherwoodV2LaunchConfig.t.sol\":179,\"test/SherwoodV2Launcher.t.sol\":78,\"test/SherwoodV2LauncherFork.t.sol\":117,\"test/SherwoodV2Lifecycle.t.sol\":248,\"test/SherwoodV2UnknownReign.t.sol\":438,\"test/SherwoodV2UnknownReignKing.t.sol\":132,\"test/helpers/MockHolderHook.sol\":43,\"test/helpers/SherwoodV2Fixture.sol\":215,\"test/helpers/SherwoodV2Handler.sol\":331},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"744b62f23ff59014ee496e3d97d35a3e21a7ad232a0f2b87cd718b7ca168bbd6","verifiedTreeHash":"f96928bf8ade5a12e099d71791b86f7f44edeef4","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":163446,"exitCode":0,"name":"build","output":"Compiling 111 files with Solc 0.8.26\nSolc 0.8.26 finished in 162.87s\nCompiler run successful with warnings:\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:559:17:\n    |\n559 |                 address leader = _currentLeader(round);\n    |                 ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:763:9:\n    |\n763 |         address leader = _leader[round];\n    |         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:798:63:\n    |\n798 |     function _scan(uint256 round, bool all) internal returns (address leader) {\n    |                                                               ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:831:39:\n    |\n831 |     function _setReign(uint256 round, address leader) internal {\n    |                                       ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:871:43:\n    |\n871 |     function _lowestRecent(uint256 round, address leader) internal view returns (address lowest) {\n    |                                           ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:364:17:\n    |\n364 |                 address leader = _currentLeader(day);\n    |                 ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:490:9:\n    |\n490 |         address leader = _leader[day];\n    |         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:501:60:\n    |\n501 |     function _currentLeader(uint256 day) internal returns (address leader) {\n    |                                                            ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:529:41:\n    |\n529 |     function _lowestRecent(uint256 day, address leader) internal view returns (address lowest) {\n    |                                         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:677:9:\n    |\n677 |         bytes memory result = poolManager.unlock(abi.encode(amount, minPfwaOut));\n    |         ^^^^^^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:764:5:\n    |\n764 |     function result(uint256 day)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n   ╭▸ src/SherwoodV2Launcher.sol:37:29\n   │\n37 │           bytes memory init = abi.encodePacked(\n   │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n38 │ ┃             type(SherwoodV2).creationCode,\n39 │ ┃             abi.encode(poolManager, token, host, hostHolderMin, dice, diceProvider, owner, genesis)\n40 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/SherwoodV2Launcher.sol:72:14\n   │\n72 │         if (!found) revert NoSalt();\n   │              ━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[weak-prng]: weak randomness derived from a predictable on-chain value\n    ╭▸ src/SherwoodV2.sol:689:30\n    │\n689 │         bytes32 userRandom = keccak256(abi.encode(player, ethIn, block.number, block.timestamp, gasleft()));\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/weak-prng\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SherwoodV2.sol:377:9\n    │\n377 │         address _owner,\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SherwoodV2.sol:376:9\n    │\n376 │         address _diceProvider,\n    │         ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SherwoodV2.sol:423:16\n    │\n423 │         return block.timestamp < GENESIS ? 0 : (block.timestamp - GENESIS) / ROUND_LENGTH;\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/SherwoodV2.sol:468:33\n    │\n468 │         if (ethIn >= MIN_BUY && block.timestamp >= GENESIS) _play(round, tx.origin, ethIn, hookData);\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/SherwoodV2.sol:466:13\n    │\n466 │             emit PotFunded(round, fee, false);\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/SherwoodV2.sol:848:9\n    │\n848 │         emit ReignChanged(round, leader, at);\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/SherwoodV2.sol:527:21\n    │\n527 │                     emit ReferrerSet(player, referrer);\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/SherwoodV2.sol:605:13\n    │\n605 │             emit ShieldArmed(round, player, until);\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/SherwoodV2.sol:708:9\n    │\n708 │         emit FlipRequested(sequence, round, player, stake);\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/SherwoodV2.sol:543:13\n    │\n543 │             emit Played(round, player, move, ethIn, 0, previous, 0);\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/SherwoodV2.sol:637:9\n    │\n637 │         emit Reflected(round, attacker, defender, amount, move);\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/SherwoodV2.sol:576:13\n    │\n576 │             emit Played(round, player, move, ethIn, scored, target, moved);\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/SherwoodV2.sol:583:17\n    │\n583 │                 emit ReferralPoints(round, ref, player, bonus);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:460:25\n    │\n460 │         uint256 ethIn = uint256(-params.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/SherwoodV2.sol:469:63\n    │\n469 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\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/SherwoodV2.sol:469:70\n    │\n469 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SherwoodV2.sol:508:58\n    │\n508 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/SherwoodV2.sol:485:56\n    │\n485 │             if (tokenOut > 0 && declared >= MIN_BUY && block.timestamp >= GENESIS) {\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/SherwoodV2.sol:498:17\n    │\n498 │                 emit PotFunded(round, fee, true);\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/SherwoodV2.sol:505:13\n    │\n505 │             emit PointsWiped(round, tx.origin, uint256(had));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:481:32\n    │\n481 │             uint256 declared = uint256(-params.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/SherwoodV2.sol:482:17\n    │\n482 │             if (uint256(int256(-delta.amount0())) + (declared * FEE_BPS) / 10_000 < declared) revert PartialFill();\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/SherwoodV2.sol:486:54\n    │\n486 │                 bought[currentRound()][tx.origin] += uint256(int256(tokenOut));\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/SherwoodV2.sol:494:20\n    │\n494 │             fee = (uint256(int256(ethOut)) * FEE_BPS) / 10_000;\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/SherwoodV2.sol:504:38\n    │\n504 │             _debit(round, tx.origin, uint256(had));\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/SherwoodV2.sol:505:48\n    │\n505 │             emit PointsWiped(round, tx.origin, uint256(had));\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/SherwoodV2.sol:508:44\n    │\n508 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/SherwoodV2.sol:508:51\n    │\n508 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/SherwoodV2.sol:536:26\n    │\n536 │         uint256 scored = (base * bonusBps) / 10_000;\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/SherwoodV2.sol:580:29\n    │\n580 │             uint256 bonus = (scored * REFERRAL_POINTS_BPS) / 10_000;\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/SherwoodV2.sol:576:69\n    │\n576 │             emit Played(round, player, move, ethIn, scored, target, moved);\n    │                                                                     ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SherwoodV2.sol:576:61\n    │\n576 │             emit Played(round, player, move, ethIn, scored, target, moved);\n    │                                                             ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:524:63\n    │\n524 │                 address referrer = word >> 160 == 0 ? address(uint160(word)) : address(0);\n    │                                                               ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' is safe 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/SherwoodV2.sol:596:20\n    │\n596 │         s.played = uint128(played + ethIn);\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/SherwoodV2.sol:620:16\n    │\n620 │         return n < cap ? n : cap;\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/SherwoodV2.sol:626:17\n    │\n626 │         return (clock > full ? clock : full) + recharge;\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/SherwoodV2.sol:642:16\n    │\n642 │         return block.timestamp < shieldUntil[player];\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SherwoodV2.sol:688:13\n    │\n688 │         if (diceFee > MAX_DICE_FEE || diceFee > (ethIn * FEE_BPS) / 10_000 || pot[round] < diceFee) return 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/SherwoodV2.sol:697:15\n    │\n697 │         flips[sequence] = PendingFlip({\n    │               ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:700:20\n    │\n700 │             round: uint64(round),\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/SherwoodV2.sol:701:26\n    │\n701 │             requestedAt: 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/SherwoodV2.sol:702:20\n    │\n702 │             stake: uint96(stake),\n    │                    ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:703:18\n    │\n703 │             win: uint96((stake * scaledBps(FLIP_WIN_BPS_MIN, FLIP_WIN_BPS_MAX, base)) / 10_000)\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SherwoodV2.sol:737:39\n    │\n737 │         if (f.player == address(0) || block.timestamp < f.requestedAt + FLIP_TIMEOUT) revert FlipNotExpired();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:759:50\n    │\n759 │         int256 updated = points[round][player] + int256(amount);\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/SherwoodV2.sol:769:34\n    │\n769 │         points[round][player] -= int256(amount);\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/SherwoodV2.sol:838:27\n    │\n838 │                 g.since = uint64(at); // points changed: the spell starts over\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/SherwoodV2.sol:847:19\n    │\n847 │         g.since = 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SherwoodV2.sol:854:16\n    │\n854 │         return block.timestamp < end ? block.timestamp : end;\n    │                ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:860:24\n    │\n860 │         return p > 0 ? uint256(p) : 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[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/SherwoodV2.sol:979:31\n    │\n979 │                 uint256 cut = (prize * REFERRAL_PRIZE_BPS) / 10_000;\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/SherwoodV2.sol:974:13\n    │\n974 │             awarded += prize;\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/SherwoodV2.sol:894:13\n    │\n894 │         if (block.timestamp < roundEnd(round) + SETTLE_DELAY) revert RoundNotOver();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SherwoodV2.sol:964:31\n    │\n964 │             uint256 balance = IBalanceOf(Currency.unwrap(token)).balanceOf(winner);\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:906:23\n    │\n906 │             g.since = uint64(end);\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/SherwoodV2.sol:931:20\n    │\n931 │         r.cursor = uint64(end_);\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/SherwoodV2.sol:941:41\n    │\n941 │             (g.holder, g.since) = (top, uint64(end));\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/SherwoodV2.sol:943:40\n    │\n943 │         (r.king, r.kingReign) = (king, uint64(kingReign));\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/SherwoodV2.sol:987:23\n    │\n987 │         r.settledAt = 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/SherwoodV2.sol:1014:17\n     │\n1014 │                 amount += r.prize[i];\n     │                 ━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/SherwoodV2.sol:1004:13\n     │\n1004 │         if (block.timestamp > claimDeadline(round)) revert ClaimWindowClosed();\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/SherwoodV2.sol:1020:9\n     │\n1020 │         emit PrizeClaimed(round, msg.sender, amount);\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/SherwoodV2.sol:1012:42\n     │\n1012 │                 if (balance < r.held[i]) revert MustHoldToClaim();\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/SherwoodV2.sol:1037:9\n     │\n1037 │         emit ReferralClaimed(msg.sender, 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/SherwoodV2.sol:1050:17\n     │\n1050 │                 amount += r.prize[i];\n     │                 ━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/SherwoodV2.sol:1044:13\n     │\n1044 │         if (block.timestamp <= claimDeadline(round)) revert ClaimWindowOpen();\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/SherwoodV2.sol:1054:9\n     │\n1054 │         emit UnclaimedSwept(round, 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/SherwoodV2.sol:1066:9\n     │\n1066 │         emit BuybackBurned(amount, burned);\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/SherwoodV2.sol:1076:9\n     │\n1076 │         emit HostBuybackBurned(amount, burned);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/SherwoodV2.sol:1086:53\n     │\n1086 │                 zeroForOne: true, amountSpecified: -int256(amount), sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1\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/SherwoodV2.sol:1090:27\n     │\n1090 │         uint256 ethPaid = uint256(int256(-delta.amount0()));\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/SherwoodV2.sol:1091:23\n     │\n1091 │         uint256 out = uint256(int256(delta.amount1()));\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[unused-return]: return value of an external call is not used\n     ╭▸ src/SherwoodV2.sol:1093:9\n     │\n1093 │         poolManager.settle{value: ethPaid}();\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n     ╭▸ src/SherwoodV2.sol:1126:23\n     │\n1126 │     function setOwner(address next) external onlyOwner {\n     │                       ━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n     ╭▸ src/SherwoodV2.sol:1139:26\n     │\n1139 │     function setOperator(address next) external onlyOwner {\n     │                          ━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/SherwoodV2.sol:1244:16\n     │\n1244 │         return n >= cap ? 0 : clock + (n + 1) * recharge;\n     │                ━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n     ╭▸ src/SherwoodV2.sol:1270:47\n     │\n1270 │             if (_outreigns(round, a, s, best, bestReign)) (best, bestReign) = (a, s);\n     │                                               ━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[weak-prng]: weak randomness derived from a predictable on-chain value\n    ╭▸ src/Sherwood.sol:427:30\n    │\n427 │         bytes32 userRandom = keccak256(abi.encode(player, ethIn, block.number, block.timestamp, gasleft()));\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/weak-prng\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:213:103\n    │\n213 │     constructor(IPoolManager _poolManager, Currency _pfwa, IDiceEntropy _dice, address _diceProvider, address _owner) {\n    │                                                                                                       ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:213:80\n    │\n213 │     constructor(IPoolManager _poolManager, Currency _pfwa, IDiceEntropy _dice, address _diceProvider, address _owner) {\n    │                                                                                ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Sherwood.sol:283:13\n    │\n283 │             emit PotFunded(day, fee, false);\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/Sherwood.sol:338:21\n    │\n338 │                     emit ReferrerSet(player, referrer);\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/Sherwood.sol:445:9\n    │\n445 │         emit FlipRequested(sequence, day, player, stake);\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/Sherwood.sol:352:13\n    │\n352 │             emit Played(day, player, move, ethIn, 0, previous, 0);\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/Sherwood.sol:376:13\n    │\n376 │             emit Played(day, player, move, ethIn, scored, target, moved);\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/Sherwood.sol:383:17\n    │\n383 │                 emit ReferralPoints(day, ref, player, bonus);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:277:25\n    │\n277 │         uint256 ethIn = uint256(-params.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/Sherwood.sol:286:63\n    │\n286 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\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/Sherwood.sol:286:70\n    │\n286 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:322:58\n    │\n322 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/Sherwood.sol:314:17\n    │\n314 │                 emit PotFunded(day, fee, true);\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/Sherwood.sol:320:13\n    │\n320 │             emit PointsWiped(day, tx.origin, uint256(had));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:298:32\n    │\n298 │             uint256 declared = uint256(-params.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/Sherwood.sol:299:17\n    │\n299 │             if (uint256(int256(-delta.amount0())) + (declared * FEE_BPS) / 10_000 < declared) revert PartialFill();\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/Sherwood.sol:301:32\n    │\n301 │             if (pfwaOut > 0 && uint256(-params.amountSpecified) >= MIN_BUY) {\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/Sherwood.sol:302:52\n    │\n302 │                 bought[currentDay()][tx.origin] += uint256(int256(pfwaOut));\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/Sherwood.sol:310:20\n    │\n310 │             fee = (uint256(int256(ethOut)) * FEE_BPS) / 10_000;\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/Sherwood.sol:319:36\n    │\n319 │             _debit(day, tx.origin, uint256(had));\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/Sherwood.sol:320:46\n    │\n320 │             emit PointsWiped(day, tx.origin, uint256(had));\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/Sherwood.sol:322:44\n    │\n322 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/Sherwood.sol:322:51\n    │\n322 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/Sherwood.sol:345:26\n    │\n345 │         uint256 scored = (base * bonusBps) / 10_000;\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/Sherwood.sol:380:29\n    │\n380 │             uint256 bonus = (scored * REFERRAL_POINTS_BPS) / 10_000;\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/Sherwood.sol:376:59\n    │\n376 │             emit Played(day, player, move, ethIn, scored, target, moved);\n    │                                                           ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:376:67\n    │\n376 │             emit Played(day, player, move, ethIn, scored, target, moved);\n    │                                                                   ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:426:13\n    │\n426 │         if (diceFee > MAX_DICE_FEE || pot[day] < diceFee) return 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/Sherwood.sol:435:15\n    │\n435 │         flips[sequence] = PendingFlip({\n    │               ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:438:18\n    │\n438 │             day: uint64(day),\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/Sherwood.sol:439:26\n    │\n439 │             requestedAt: 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/Sherwood.sol:440:20\n    │\n440 │             stake: uint96(stake),\n    │                    ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:441:18\n    │\n441 │             win: uint96((stake * scaledBps(FLIP_WIN_BPS_MIN, FLIP_WIN_BPS_MAX, base)) / 10_000)\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Sherwood.sol:468:39\n    │\n468 │         if (f.player == address(0) || block.timestamp < f.requestedAt + FLIP_TIMEOUT) revert FlipNotExpired();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:486:48\n    │\n486 │         int256 updated = points[day][player] + int256(amount);\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/Sherwood.sol:496:32\n    │\n496 │         points[day][player] -= int256(amount);\n    │                                ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:509:21\n    │\n509 │             if (p > best) (best, leader) = (p, players[i]);\n    │                     ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:518:24\n    │\n518 │         return p > 0 ? uint256(p) : 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[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/Sherwood.sol:598:31\n    │\n598 │                 uint256 cut = (prize * REFERRAL_PRIZE_BPS) / 10_000;\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/Sherwood.sol:594:13\n    │\n594 │             awarded += prize;\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/Sherwood.sol:545:13\n    │\n545 │         if (block.timestamp < (day + 1) * 1 days + SETTLE_DELAY) revert DayNotOver();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Sherwood.sol:584:31\n    │\n584 │             uint256 balance = IBalanceOf(Currency.unwrap(pfwa)).balanceOf(winner);\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:570:20\n    │\n570 │         r.cursor = uint64(end);\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/Sherwood.sol:606:23\n    │\n606 │         r.settledAt = 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/Sherwood.sol:627:17\n    │\n627 │                 amount += r.prize[i];\n    │                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Sherwood.sol:617:13\n    │\n617 │         if (block.timestamp > claimDeadline(day)) revert ClaimWindowClosed();\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/Sherwood.sol:633:9\n    │\n633 │         emit PrizeClaimed(day, msg.sender, amount);\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/Sherwood.sol:625:42\n    │\n625 │                 if (balance < r.held[i]) revert MustHoldToClaim();\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/Sherwood.sol:650:9\n    │\n650 │         emit ReferralClaimed(msg.sender, 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/Sherwood.sol:663:17\n    │\n663 │                 amount += r.prize[i];\n    │                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Sherwood.sol:657:13\n    │\n657 │         if (block.timestamp <= claimDeadline(day)) revert ClaimWindowOpen();\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/Sherwood.sol:679:9\n    │\n679 │         emit BuybackBurned(amount, burned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:686:66\n    │\n686 │             key, SwapParams({zeroForOne: true, amountSpecified: -int256(amount), sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1}), \"\"\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/Sherwood.sol:688:27\n    │\n688 │         uint256 ethPaid = uint256(int256(-delta.amount0()));\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/Sherwood.sol:689:27\n    │\n689 │         uint256 pfwaOut = uint256(int256(delta.amount1()));\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[unused-return]: return value of an external call is not used\n    ╭▸ src/Sherwood.sol:691:9\n    │\n691 │         poolManager.settle{value: ethPaid}();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:705:23\n    │\n705 │     function setOwner(address next) external onlyOwner {\n    │                       ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:710:26\n    │\n710 │     function setOperator(address next) external onlyOwner {\n    │                          ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SherwoodV2Edges.t.sol:377:21\n    │\n377 │             vm.warp(block.timestamp + bound(gaps[i], 0, 3 hours));\n    │             ────────━━━━━━━━━━━━━━━────────────────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SherwoodV2Edges.t.sol:386:32\n    │\n377 │             vm.warp(block.timestamp + bound(gaps[i], 0, 3 hours));\n    │             ───────────────────────────────────────────────────── `vm.warp` changes this environment here\n    ‡\n386 │                 assertGt(next, block.timestamp);\n    │                                ━━━━━━━━━━━━━━━\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SherwoodV2Edges.t.sol:387:32\n    │\n377 │             vm.warp(block.timestamp + bound(gaps[i], 0, 3 hours));\n    │             ───────────────────────────────────────────────────── `vm.warp` changes this environment here\n    ‡\n387 │                 assertLe(next, block.timestamp + 10 minutes);\n    │                                ━━━━━━━━━━━━━━━\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":49892,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/SherwoodV2LauncherFork.t.sol:SherwoodV2LauncherForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 344.53µs (0.00ns CPU time)\n\nRan 1 test for test/SherwoodV2Fork.t.sol:SherwoodV2ForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 505.32µs (0.00ns CPU time)\n\nRan 4 tests for test/SherwoodV2LaunchConfig.t.sol:SherwoodV2LaunchConfigTest\n[PASS] test_burnPoolsAreTheBriefsPoolsDerivedFromTheConstructor() (gas: 30244)\n[PASS] test_ownerCannotRedirectTheBurnToACapturePool() (gas: 1471834)\n[PASS] test_ownerHandoverIsTwoStep() (gas: 340263)\n[PASS] test_ownerHandoverToAWrongAddressIsHarmlessAndCancellable() (gas: 485329)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 5.55ms (1.69ms CPU time)\n\nRan 1 test for test/SherwoodV2Launcher.t.sol:SherwoodV2LauncherOfflineTest\n[PASS] test_constructorWorksOnEmptyChainAndFactoryDoesNotOwnHook() (gas: 512997)\nLogs:\n  offline launcher deployment gas: 25706\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.42ms (3.31ms CPU time)\n\nRan 10 tests for test/SherwoodV2Accounting.t.sol:SherwoodV2AccountingTest\n[PASS] testFuzz_batchedSettlementSameAsSinglePass(uint256,uint256,uint256) (runs: 1000, μ: 3435111, ~: 3373287)\n[PASS] testFuzz_buyDeltaMatchesEveryBalance(uint256) (runs: 1000, μ: 400311, ~: 537550)\n[PASS] testFuzz_sellDeltaAndRoundTripCannotCreateETH(uint256,uint256) (runs: 1000, μ: 813261, ~: 814273)\n[PASS] testFuzz_slippageRevertIsAtomicForEitherBurn(bool,uint256) (runs: 1000, μ: 526471, ~: 526533)\n[PASS] test_bothPartialBuybacksRefundOnlyTheirOwnReserve() (gas: 1981798)\n[PASS] test_claimAtExactDeadlineThenSweepCannotDoubleSpend() (gas: 1783105)\n[PASS] test_emptyBuybackLiquidityPreservesReserveAndClaims() (gas: 1689820)\n[PASS] test_oneWeiAndFeeRoundingBoundary() (gas: 513154)\n[PASS] test_partialBuyRollsBackFeeDiceRequestChargesAndReferral() (gas: 662589)\n[PASS] test_unprivilegedCallbacksAndOperatorCannotChangeOwnerOrPools() (gas: 276732)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 645.30ms (1.98s CPU time)\n\nRan 1 test for test/SherwoodV2BuybackHook.t.sol:SherwoodV2BuybackHookTest\n[PASS] testFuzz_hostBurnUsesNetDeltasIncludingTheHolderHooksFees(uint256) (runs: 1000, μ: 1032049, ~: 1032156)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 700.45ms (692.39ms CPU time)\n\nRan 21 tests for test/SherwoodV2Edges.t.sol:SherwoodV2EdgesTest\n[PASS] testFuzz_buyPointsAndPotFollowTheEthIn(uint256) (runs: 300, μ: 415827, ~: 546728)\n[PASS] testFuzz_fundPotAcceptsTheCurrentRoundThroughAYearAhead(uint256,uint256) (runs: 200, μ: 61708, ~: 51435)\n[PASS] testFuzz_robinChargesRechargeOnePerHourUpToThree(uint256,uint8) (runs: 200, μ: 1463547, ~: 1605406)\n[PASS] testFuzz_settlementConservesEveryWeiOfThePot(uint256,uint256,uint256,uint256) (runs: 300, μ: 3167276, ~: 3171002)\n[PASS] testFuzz_shieldChargeTracksEveryCrossingOfTheMark(uint256[6],uint256) (runs: 300, μ: 1919141, ~: 1922070)\n[PASS] testFuzz_stealChargesNeverExceedTheBankAndSpendExactlyOne(uint256[8]) (runs: 200, μ: 4766176, ~: 4766262)\n[PASS] testFuzz_stealsRobinHoodsAndReflectsAreZeroSum(uint256[10]) (runs: 200, μ: 3198262, ~: 3200885)\n[PASS] test_buybackNeverSpendsMoreThanTheReserveAndAnEmptyReserveCannotBurn() (gas: 497100)\n[PASS] test_claimsSweepsAndReferralClaimsForRoundsThatNeverSettledRevert() (gas: 88795)\n[PASS] test_emptyRoundSettlesIntoBurnsAndRolloverWithNothingToClaimOrSweep() (gas: 490491)\n[PASS] test_flipInTheLastSecondOfARoundExpiresBeforeSettlementOpens() (gas: 1244049)\n[PASS] test_hookDataOfOddLengthsDecodesTheMoveAndIgnoresTheRest() (gas: 2127703)\n[PASS] test_kingOfTheHillViewIsTheOracleForTheSettledKing() (gas: 1714123)\n[PASS] test_robinHoodByTheLeaderPlaysAsABuyAndKeepsItsCharge() (gas: 1129042)\n[PASS] test_rolloverLandsInTheRoundLiveAtSettlementNotTheNextOne() (gas: 901700)\n[PASS] test_secondClaimRevertsAndASweepAfterAFullClaimMovesNothing() (gas: 1120865)\n[PASS] test_settleOfTheLiveRoundOrAnImpossibleRoundReverts() (gas: 597697)\n[PASS] test_settleWithAZeroBatchMakesNoProgressAndNeverReverts() (gas: 1557522)\n[PASS] test_settlementIsBlockedOnlyUntilTheLastSecondFlipIsExpired() (gas: 1135826)\n[PASS] test_shieldRaisedNearTheEndOfARoundStillReflectsInTheNext() (gas: 1449602)\n[PASS] test_stealFromAPreviousPlayerWipedToZeroSpendsTheChargeAndMovesNothing() (gas: 1209189)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 700.40ms (2.64s CPU time)\n\nRan 1 test for test/SherwoodV2UnknownReignKing.t.sol:SherwoodV2UnknownReignKingTest\n[PASS] test_kingOfTheHillIsTheLongestAtFirstPlaceNotTheFinalLeader() (gas: 527725566)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.29s (1.29s CPU time)\n\nRan 5 tests for test/SherwoodV2LargeBoardKing.t.sol:SherwoodV2LargeBoardKingTest\n[PASS] test_debitOfTheRunningBestRestartsTheRescan() (gas: 520773066)\n[PASS] test_kingPrizeGoesToTrueLeaderOnLargeBoard() (gas: 527641577)\n[PASS] test_rescanFinishesInOnePlayWithGasToSpare() (gas: 515431520)\nLogs:\n  1,501 cold players rescanned in one play, gas: 7478536\n\n[PASS] test_rescanResumesInChunksUnderATightGasBudget() (gas: 518436680)\nLogs:\n  resolved board, plain buy gas: 348762\n\n[PASS] test_robinHoodWaitsForTheRescanAndKeepsItsCharge() (gas: 516145728)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.39s (6.20s CPU time)\n\nRan 8 tests for test/SherwoodV2Lifecycle.t.sol:SherwoodV2LifecycleTest\n[PASS] testFuzz_diceOutageFallsBackWithoutConsumingFlip(uint256,bool) (runs: 1000, μ: 591257, ~: 587136)\n[PASS] test_diceFeeAtCapNeedsABuyWhoseShareCoversItAndOneWeiAboveCapFallsBack() (gas: 2214989)\n[PASS] test_eachChargeClockRechargesAtItsExactBoundary() (gas: 11519395)\n[PASS] test_expiryAndDiceRefundUseSeparateAccountingAndCannotRepeat() (gas: 943567)\n[PASS] test_multipleFlipsResolveOutOfOrderAgainstSavedPreviousPlayers() (gas: 2691413)\n[PASS] test_partialRechargeSurvivesSpendingAnotherBankedCharge() (gas: 1387295)\n[PASS] test_referralTransferFailureRollsBackAndCrossFunctionReentryIsBlocked() (gas: 2991576)\n[PASS] test_timeoutRecoveryUnblocksBatchedSettlementAtExactOpening() (gas: 2085535)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 1.43s (613.89ms CPU time)\n\nRan 142 tests for test/SherwoodV2.t.sol:SherwoodV2Test\n[PASS] test_beforeGenesisFeesGoToRoundZeroButNothingScores() (gas: 1214659)\n[PASS] test_belowMinimumScoresNothingButPaysFee() (gas: 241633)\n[PASS] test_buyScoresByBuySizeAndFundsPot() (gas: 531812)\n[PASS] test_buyStoppedByPriceLimitReverts() (gas: 445468)\n[PASS] test_buybackAndBurnHostBurnsHostToDead() (gas: 1384585)\n[PASS] test_buybackPoolIsFixedToTheOnePercentPoolWithNoSetter() (gas: 57202)\n[PASS] test_buybackSwapsInOtherPoolAndBurns() (gas: 1088890)\n[PASS] test_buyerReceivesPfwaForEthAfterFee() (gas: 520953)\n[PASS] test_buysAreRecordedPerRound() (gas: 536247)\n[PASS] test_buysScoreInTheRoundTheyHappen() (gas: 1215723)\n[PASS] test_cannotReferYourselfOrTheOneWhoReferredYou() (gas: 1166841)\n[PASS] test_chargesBankedPastTheCapAreDropped() (gas: 922099)\n[PASS] test_chargesCarryAcrossRounds() (gas: 9167833)\n[PASS] test_claimDeadlineFromRoundEndWhenSettledOnTime() (gas: 910805)\n[PASS] test_diceFeeAboveCapScoresAsBuy() (gas: 618557)\n[PASS] test_diceRefundFromAnywhereGoesToBuybackReserve() (gas: 681031)\n[PASS] test_dirtyReferrerWordIsIgnoredNotAReasonToRevert() (gas: 945667)\n[PASS] test_exactOutputReverts() (gas: 82018)\n[PASS] test_expiredFlipsUnblockSettlement() (gas: 1061813)\n[PASS] test_flipChargesStackAcrossRounds() (gas: 3070370)\n[PASS] test_flipLossComesOffExistingPoints() (gas: 1329928)\n[PASS] test_flipLossGoesNegativeAndPaysPreviousPlayer() (gas: 1118224)\n[PASS] test_flipPaysDiceFeeFromPot() (gas: 608916)\n[PASS] test_flipRevealedAfterSettlementIsIgnored() (gas: 1610534)\n[PASS] test_flipScoresAsBuyWhenDiceFeeExceedsTheBuysPotShare() (gas: 1153876)\n[PASS] test_flipScoresAsBuyWhenDiceRefuses() (gas: 706890)\n[PASS] test_flipWinDoublesPoints() (gas: 1125586)\n[PASS] test_flipWinScalesWithBuySizeNotBonus() (gas: 1194850)\n[PASS] test_fullSizeFlipWinPaysTriple() (gas: 1110710)\n[PASS] test_fullSizeRobinHoodMoves33Percent() (gas: 1325699)\n[PASS] test_fullSizeStealTakes40Percent() (gas: 938447)\n[PASS] test_fundPotRejectsRoundsTooFarAhead() (gas: 139335)\n[PASS] test_fundPotSeedsCurrentAndFutureRounds() (gas: 171132)\n[PASS] test_gas_completingSettleBatch() (gas: 9330925)\nLogs:\n  settle, 24 players, 4 prizes (one batch): 722754\n  claim, King only: 90792\n\n[PASS] test_gas_reignUpkeep() (gas: 70231003)\nLogs:\n  buy, #1 unchanged: 357366\n  buy, #1 changes: 368397\n  leader sell with 203 players (rescan): 1239914\n\n[PASS] test_holderBonusDoesNotRaiseStealShare() (gas: 1379376)\n[PASS] test_holderBonusForKeepingLastRoundsBuys() (gas: 1384954)\n[PASS] test_holderBonusMaxesAt125Points() (gas: 969686)\n[PASS] test_holderBonusNeedsLastRoundsPlay() (gas: 969509)\n[PASS] test_holdingRuleUsesBalanceAtSettlement() (gas: 1183951)\n[PASS] test_hostBonusAtTheThreshold() (gas: 1189145)\n[PASS] test_hostBonusStacksWithTheOtherBonuses() (gas: 1859648)\n[PASS] test_hostBurnReserveAccruesSevenPercent() (gas: 1740638)\n[PASS] test_hostBuybackPoolIsFixedToTheHolderPoolWithNoSetter() (gas: 47037)\n[PASS] test_hostSameAsGameTokenTurnsHostFeaturesOff() (gas: 1428518)\n[PASS] test_hostWiring() (gas: 25917)\n[PASS] test_kingFullTieGoesToTheEarlierPlayer() (gas: 1814273)\n[PASS] test_kingMustHoldToClaim() (gas: 2492581)\n[PASS] test_kingOutsideTopThreeClaimsKingPrize() (gas: 2495661)\n[PASS] test_kingPrizeForfeitsPartly() (gas: 1640625)\n[PASS] test_kingTieGoesToMorePoints() (gas: 2348615)\n[PASS] test_kingWhoSoldEverythingGetsNothing() (gas: 2385994)\n[PASS] test_lateSettlementStillGivesSevenDaysToClaim() (gas: 1030583)\n[PASS] test_leaderChangeAfterRoundEndCountsNothing() (gas: 1648527)\n[PASS] test_leaderLostFlipCallbackFitsDiceGasLimitOnABigBoard() (gas: 70590963)\nLogs:\n  leader loss on 202 players, callback gas: 111847\n\n[PASS] test_leaderLostFlipDefersTheRescanJustPastTheBound() (gas: 5226416)\nLogs:\n  leader loss on 13 players, callback gas: 91947\n\n[PASS] test_leaderLostFlipRescansASmallBoardInsideTheCallback() (gas: 4977163)\nLogs:\n  leader loss on 12 players, callback gas: 166233\n\n[PASS] test_negativePlayersNeverPlace() (gas: 1521626)\n[PASS] test_noHolderBonusAfterSellingLastRoundsBuys() (gas: 1035634)\n[PASS] test_noHookDataIsPlainBuy() (gas: 513972)\n[PASS] test_noKingShareRollsOver() (gas: 1062431)\n[PASS] test_noPrizeShareIfReferrerSkippedTheRound() (gas: 1798104)\n[PASS] test_noWelcomeBonusWithoutAReferrer() (gas: 515571)\n[PASS] test_onlyDiceCanDeliverRandomness() (gas: 31867)\n[PASS] test_onlyOneGamePool() (gas: 47275)\n[PASS] test_onlyTheOwnerCanCreateThePool() (gas: 268974)\n[PASS] test_otherFlipOutcomesFitDiceGasLimitOnABigBoard() (gas: 69471853)\nLogs:\n  non-leader loss, callback gas: 76387\n  win taking #1, callback gas: 79333\n\n[PASS] test_partialWinnerMustKeepWhatTheyHeldToClaim() (gas: 1200847)\n[PASS] test_plainEthTransferLandsInCurrentPot() (gas: 65612)\n[PASS] test_pointsCapAt100PerBuy() (gas: 517010)\n[PASS] test_potSplitSumsToWhole() (gas: 79960)\n[PASS] test_rankAndKingClaimNeedsTheHolding() (gas: 1695010)\n[PASS] test_rankAndKingClaimedTogether() (gas: 1573586)\n[PASS] test_recentPlayersMostRecentFirst() (gas: 3905356)\n[PASS] test_reentrantWinnerGetsNothingExtra() (gas: 1400447)\n[PASS] test_referralShareComesOutOfTheRollover() (gas: 1602076)\n[PASS] test_referralWorstCaseKeepsRolloverAboveZero() (gas: 2908606)\n[PASS] test_referredPlayerGetsHolderBonusNextRound() (gas: 1373063)\n[PASS] test_referrerEarnsTenPercentPointsOnlyInRoundsTheyPlayed() (gas: 1172539)\n[PASS] test_referrerIsSetOnceAndNeverChanges() (gas: 1166502)\n[PASS] test_referrerOnlyOnTheFirstPlay() (gas: 1101710)\n[PASS] test_referrerTakesFivePercentOfKingPrize() (gas: 2715842)\n[PASS] test_referrerTakesFivePercentOfPrize() (gas: 1582730)\n[PASS] test_reflectedRobinHoodTakesTheFullCutBelowZero() (gas: 1314267)\n[PASS] test_reflectedStealTakesTheFullCutBelowZero() (gas: 1583910)\n[PASS] test_reignCanBeVacant() (gas: 1222762)\n[PASS] test_reignChangesOnFlipExpiry() (gas: 1125250)\n[PASS] test_reignChangesOnFlipLoss() (gas: 1943750)\n[PASS] test_reignChangesOnFlipWin() (gas: 1136037)\n[PASS] test_reignChangesOnReflect() (gas: 1200844)\n[PASS] test_reignChangesOnRobinHood() (gas: 1335622)\n[PASS] test_reignChangesOnSellWipe() (gas: 1176746)\n[PASS] test_reignChangesOnSteal() (gas: 952901)\n[PASS] test_reignCountsSecondsAtNumberOne() (gas: 1402252)\n[PASS] test_reignStopsAtRoundEndAndIsFinalizedAtSettlement() (gas: 1423182)\n[PASS] test_robinHoodAfterShieldExpiresLands() (gas: 1313636)\n[PASS] test_robinHoodCanPayTheMover() (gas: 1150161)\n[PASS] test_robinHoodChargesStackAndRecharge() (gas: 2406451)\n[PASS] test_robinHoodFindsNewLeaderAfterLeaderLosesPoints() (gas: 2190004)\n[PASS] test_robinHoodIntoShieldIsReflected() (gas: 1551898)\n[PASS] test_robinHoodMovesLeaderPointsToLowestRecent() (gas: 1316301)\n[PASS] test_roundBoundaries() (gas: 64775)\n[PASS] test_samePermissionsAsV1() (gas: 12910)\n[PASS] test_scaledBpsRange() (gas: 17508)\n[PASS] test_seededPotPaysTheWinner() (gas: 967070)\n[PASS] test_sellLeavesNegativeScore() (gas: 1345234)\n[PASS] test_sellWipesPointsAndFundsPot() (gas: 825215)\n[PASS] test_settleAllRemainingWithMax() (gas: 1435694)\n[PASS] test_settleCreditsTheFinalUnknownSpellToTheFinalLeader() (gas: 5941441)\n[PASS] test_settleInBatches() (gas: 1910394)\n[PASS] test_settleInBatchesSendsNothing() (gas: 1982913)\n[PASS] test_settleNeverCallsWinners() (gas: 1247355)\nLogs:\n  settle with a gas-burning winner: 367793\n\n[PASS] test_settleSplitsPotAndWinnersClaim() (gas: 2792917)\n[PASS] test_settleTimingPerRound() (gas: 1824018)\n[PASS] test_settleWaitsForPendingFlips() (gas: 1865010)\n[PASS] test_shieldChargeEarnedAtCumulativeThreshold() (gas: 1308773)\n[PASS] test_shieldChargesCapAtOne() (gas: 1500028)\n[PASS] test_shieldExpiresAfterThirtyMinutes() (gas: 979759)\n[PASS] test_shieldRearmRefreshesExpiry() (gas: 787812)\n[PASS] test_shieldScoresLikeABuyAndArmsWithTheChargeItEarns() (gas: 552536)\n[PASS] test_shieldWithoutChargeIsPlainBuy() (gas: 526853)\n[PASS] test_stealChargesStackAndRecharge() (gas: 8873349)\n[PASS] test_stealFromNegativePlayerTakesNothing() (gas: 2294954)\n[PASS] test_stealIntoShieldIsReflected() (gas: 1199188)\n[PASS] test_stealOnYourselfDoesNothingExtra() (gas: 731279)\n[PASS] test_stealTakes20PercentOfPreviousPlayer() (gas: 925943)\n[PASS] test_stealThatTakesNothingLeavesTheShieldUp() (gas: 1267621)\n[PASS] test_stealWithNoTargetUsesNoCharge() (gas: 754114)\n[PASS] test_sweepLandsInTheRoundLiveWhenSwept() (gas: 1100163)\n[PASS] test_sweepTakesRankAndKingLeftUnclaimed() (gas: 1613917)\n[PASS] test_sweepUnsettledRoundReverts() (gas: 554115)\n[PASS] test_throwawayWalletPaysTheFullCutToBreakAShield() (gas: 1631766)\n[PASS] test_unawardedSharesRollOverWhenFewerThanThreePlayers() (gas: 901283)\n[PASS] test_unclaimedKingPrizeDeadlineAndSweep() (gas: 2686439)\n[PASS] test_unclaimedPrizesSweepAfterSevenDays() (gas: 1313979)\n[PASS] test_unknownMoveIsPlainBuy() (gas: 516211)\n[PASS] test_unrevealedFlipExpiresAsPlainBuy() (gas: 797427)\n[PASS] test_walletThatRefusesEthCanClaimOnceItAccepts() (gas: 1944822)\n[PASS] test_welcomeBonusOnlyInTheFirstRound() (gas: 1468627)\n[PASS] test_winnerMustHoldThatRoundsBuysToClaim() (gas: 1134231)\n[PASS] test_winnerWhoSoldEverythingForfeitsAtSettlement() (gas: 1485651)\n[PASS] test_winnerWhoSoldPartForfeitsThatShare() (gas: 1661370)\nSuite result: ok. 142 passed; 0 failed; 0 skipped; finished in 1.43s (354.89ms CPU time)\n\nRan 67 tests for test/Sherwood.t.sol:SherwoodTest\n[PASS] test_belowMinimumScoresNothingButPaysFee() (gas: 239165)\n[PASS] test_buyScoresByBuySizeAndFundsPot() (gas: 474711)\n[PASS] test_buyStoppedByPriceLimitReverts() (gas: 389537)\n[PASS] test_buybackPoolCannotBeTheGamePool() (gas: 47444)\n[PASS] test_buybackPoolIsSetOnce() (gas: 103255)\n[PASS] test_buybackSwapsInOtherPoolAndBurns() (gas: 974940)\n[PASS] test_buyerReceivesPfwaForEthAfterFee() (gas: 465362)\n[PASS] test_buysAreRecordedPerDay() (gas: 478211)\n[PASS] test_cannotReferYourselfOrTheOneWhoReferredYou() (gas: 1047635)\n[PASS] test_diceFeeAboveCapScoresAsBuy() (gas: 558574)\n[PASS] test_diceRefundFromAnywhereGoesToBuybackReserve() (gas: 620104)\n[PASS] test_exactOutputReverts() (gas: 81719)\n[PASS] test_expiredFlipsUnblockSettlement() (gas: 922334)\n[PASS] test_flipLossComesOffExistingPoints() (gas: 1176958)\n[PASS] test_flipLossGoesNegativeAndPaysPreviousPlayer() (gas: 974405)\n[PASS] test_flipPaysDiceFeeFromPot() (gas: 548383)\n[PASS] test_flipRevealedAfterSettlementIsIgnored() (gas: 1328378)\n[PASS] test_flipScoresAsBuyWhenDiceRefuses() (gas: 640479)\n[PASS] test_flipWinDoublesPoints() (gas: 974723)\n[PASS] test_flipWinScalesWithBuySizeNotBonus() (gas: 1003012)\n[PASS] test_fullSizeFlipWinPaysTriple() (gas: 959278)\n[PASS] test_fullSizeRobinHoodMoves33Percent() (gas: 1179962)\n[PASS] test_fullSizeStealTakes40Percent() (gas: 831588)\n[PASS] test_fundPotSeedsTodayAndFutureDays() (gas: 168013)\n[PASS] test_holderBonusDoesNotRaiseStealShare() (gas: 1197032)\n[PASS] test_holderBonusForKeepingYesterdaysBuys() (gas: 1225572)\n[PASS] test_holderBonusMaxesAt125Points() (gas: 832916)\n[PASS] test_holderBonusNeedsYesterdaysPlay() (gas: 831315)\n[PASS] test_lateSettlementStillGivesSevenDaysToClaim() (gas: 820918)\n[PASS] test_negativePlayersNeverPlace() (gas: 1239262)\n[PASS] test_noHolderBonusAfterSellingYesterdaysBuys() (gas: 912559)\n[PASS] test_noHookDataIsPlainBuy() (gas: 455840)\n[PASS] test_noPrizeShareIfReferrerSkippedTheDay() (gas: 1483911)\n[PASS] test_noWelcomeBonusWithoutAReferrer() (gas: 459560)\n[PASS] test_onlyDiceCanDeliverRandomness() (gas: 31151)\n[PASS] test_onlyOneGamePool() (gas: 45863)\n[PASS] test_onlyTheOwnerCanCreateThePool() (gas: 245306)\n[PASS] test_partialWinnerMustKeepWhatTheyHeldToClaim() (gas: 1000839)\n[PASS] test_plainEthTransferLandsInTodaysPot() (gas: 66341)\n[PASS] test_pointsCapAt100PerBuy() (gas: 460410)\n[PASS] test_recentPlayersMostRecentFirst() (gas: 3575468)\n[PASS] test_referralShareComesOutOfTheRollover() (gas: 1370935)\n[PASS] test_referredPlayerGetsHolderBonusNextDay() (gas: 1196727)\n[PASS] test_referrerEarnsTenPercentPointsOnlyOnDaysTheyPlayed() (gas: 1067348)\n[PASS] test_referrerIsSetOnceAndNeverChanges() (gas: 1056028)\n[PASS] test_referrerOnlyOnTheFirstPlay() (gas: 990776)\n[PASS] test_referrerTakesFivePercentOfPrize() (gas: 1305693)\n[PASS] test_robinHoodCanPayTheMover() (gas: 1032297)\n[PASS] test_robinHoodFindsNewLeaderAfterLeaderLosesPoints() (gas: 1980670)\n[PASS] test_robinHoodMovesLeaderPointsToLowestRecent() (gas: 1180890)\n[PASS] test_scaledBpsRange() (gas: 40873)\n[PASS] test_seededPotPaysTheWinner() (gas: 797988)\n[PASS] test_sellLeavesNegativeScore() (gas: 1201382)\n[PASS] test_sellWipesPointsAndFundsPot() (gas: 769889)\n[PASS] test_settleInBatches() (gas: 1632465)\n[PASS] test_settleSplitsPotAndWinnersClaim() (gas: 2129562)\n[PASS] test_settleWaitsForPendingFlips() (gas: 1545814)\n[PASS] test_stealFromNegativePlayerTakesNothing() (gas: 2030423)\n[PASS] test_stealOnYourselfDoesNothingExtra() (gas: 656907)\n[PASS] test_stealTakes20PercentOfPreviousPlayer() (gas: 827645)\n[PASS] test_unawardedSharesRollOverWhenFewerThanThreePlayers() (gas: 716371)\n[PASS] test_unclaimedPrizesSweepAfterSevenDays() (gas: 916550)\n[PASS] test_unrevealedFlipExpiresAsPlainBuy() (gas: 704517)\n[PASS] test_welcomeBonusOnlyOnTheFirstDay() (gas: 1306614)\n[PASS] test_winnerMustHoldThatDaysBuysToClaim() (gas: 936200)\n[PASS] test_winnerWhoSoldEverythingForfeitsAtSettlement() (gas: 1253371)\n[PASS] test_winnerWhoSoldPartForfeitsThatShare() (gas: 1337127)\nSuite result: ok. 67 passed; 0 failed; 0 skipped; finished in 1.50s (49.63ms CPU time)\n\nRan 12 tests for test/SherwoodV2UnknownReign.t.sol:SherwoodV2UnknownReignTest\n[PASS] testFuzz_chunkedRescanFindsTheTrueLeader(uint256) (runs: 6, μ: 525587438, ~: 525399218)\n[PASS] test_anUnknownSpellDoesNotLeakIntoTheNextRound() (gas: 520908035)\n[PASS] test_boardOfExactlyMaxLeaderScanIsRescannedInsideTheDebitingSwap() (gas: 515121910)\n[PASS] test_debitOfTheLeaderOnABigBoardLeavesFirstPlaceUnknownUntilTheNextPlayRescans() (gas: 527690082)\n[PASS] test_deferredDiceRescanIsResolvedByASellAndCreditedBackToTheReveal() (gas: 6354619)\n[PASS] test_diceLossByTheRunningBestRestartsTheRescanAndTheSpell() (gas: 520062104)\n[PASS] test_expiredFlipOfTheLeaderRescansAndLeavesNoMarker() (gas: 5196516)\n[PASS] test_expiredFlipResumesTheRescanBeforeItCreditsTheStake() (gas: 515791727)\n[PASS] test_reignSecondsNeverOverlapAcrossRepeatedUnknownSpellsAndTheKingIsTheLongest() (gas: 535476749)\n[PASS] test_robinHoodByTheStaleCachedLeaderWaitsForTheRescanAndKeepsItsCharge() (gas: 515736965)\n[PASS] test_sellByAPlayerWithoutPointsNeitherResumesNorRestartsTheSpell() (gas: 515767484)\n[PASS] test_sellByAScoredPlayerResumesTheRescanBeforeItsOwnDebit() (gas: 516864248)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 3.98s (15.98s CPU time)\n\nRan 3 tests for test/SherwoodFork.t.sol:SherwoodForkTest\n[PASS] test_fork_buyOnLivePoolManager() (gas: 516575)\nLogs:\n  PFWA bought with 0.01 ETH: 119478\n\n[PASS] test_fork_buybackBurnsThroughHolderPool() (gas: 1845129)\nLogs:\n  PFWA burned from 0.0005 ETH buyback: 6184\n\n[PASS] test_fork_flipRequestsRealDice() (gas: 602775)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 9.79s (9.79s CPU time)\n\nRan 2 tests for test/SherwoodV2FreshBoardInvariant.t.sol:SherwoodV2FreshBoardInvariantTest\n[PASS]\nSherwoodV2FreshBoardInvariantTest invariants:\n[PASS] invariant_ethHeldEqualsEveryObligation\n[PASS] invariant_reignHolderIsTheCachedLeaderWithTheMostPoints\n[PASS] invariant_settledRoundsKeepSevenDaysToClaimAndNeverHoldPendingFlips\n SherwoodV2FreshBoardInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------------+-----------------+-------+---------+----------╮\n| Contract          | Selector        | Calls | Reverts | Discards |\n+==================================================================+\n| SherwoodV2Handler | advance         | 671   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | burn            | 694   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | buy             | 691   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | claim           | 671   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | diceFailure     | 685   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | fund            | 651   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | refund          | 657   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | resolve         | 713   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | sell            | 700   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | settleRound     | 697   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | sweep           | 688   | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | transferHolding | 674   | 0       | 0        |\n╰-------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_freshBoardStartsWithAReflectedHitAFlipAndAFullLiability() (gas: 2019302)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.42s (10.41s CPU time)\n\nRan 2 tests for test/SherwoodV2Invariant.t.sol:SherwoodV2InvariantTest\n[PASS]\nSherwoodV2InvariantTest invariants:\n[PASS] invariant_allETHHasExactlyOneLiability\n[PASS] invariant_chargeViewsAndReignsStayConsistent\n[PASS] invariant_finalWinnersMatchScoresAndReignDurations\n[PASS] invariant_pendingFlipCountersMatchLiveRequests\n[PASS] invariant_settledRanksPrizesAndScoresNeverChange\n[PASS] invariant_totalETHOutNeverExceedsRecordedETHIn\n SherwoodV2InvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------+-----------------+-------+---------+----------╮\n| Contract          | Selector        | Calls | Reverts | Discards |\n+==================================================================+\n| SherwoodV2Handler | advance         | 2021  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | burn            | 2053  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | buy             | 2070  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | claim           | 2060  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | diceFailure     | 2070  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | fund            | 2057  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | refund          | 1957  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | resolve         | 2056  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | sell            | 2031  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | settleRound     | 2106  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | sweep           | 2078  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | transferHolding | 2017  | 0       | 0        |\n╰-------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_handlerExercisesRecoveryClaimsAndSweeps() (gas: 4233327)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 49.74s (49.74s CPU time)\n\nRan 16 test suites in 49.75s (83.02s CPU time): 279 tests passed, 0 failed, 2 skipped (281 total tests)\n","passed":true},{"durationMs":89,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Sherwood._entropyCallback(uint64,address,bytes32)\",\"Sherwood.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"Sherwood.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"Sherwood.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"Sherwood.buybackAndBurn(uint256,uint256)\",\"Sherwood.claim(uint256)\",\"Sherwood.claimReferral()\",\"Sherwood.expireFlip(uint64)\",\"Sherwood.fundPot(uint256)\",\"Sherwood.receive()\",\"Sherwood.refundDiceRequest(uint64)\",\"Sherwood.setBuybackPool((address,address,uint24,int24,address))\",\"Sherwood.setOperator(address)\",\"Sherwood.setOwner(address)\",\"Sherwood.settle(uint256,uint256)\",\"Sherwood.sweepUnclaimed(uint256)\",\"Sherwood.unlockCallback(bytes)\",\"SherwoodV2._entropyCallback(uint64,address,bytes32)\",\"SherwoodV2.acceptOwner()\",\"SherwoodV2.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"SherwoodV2.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"SherwoodV2.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"SherwoodV2.buybackAndBurn(uint256,uint256)\",\"SherwoodV2.buybackAndBurnHost(uint256,uint256)\",\"SherwoodV2.claim(uint256)\",\"SherwoodV2.claimReferral()\",\"SherwoodV2.expireFlip(uint64)\",\"SherwoodV2.fundPot(uint256)\",\"SherwoodV2.receive()\",\"SherwoodV2.refundDiceRequest(uint64)\",\"SherwoodV2.setOperator(address)\",\"SherwoodV2.setOwner(address)\",\"SherwoodV2.settle(uint256,uint256)\",\"SherwoodV2.sweepUnclaimed(uint256)\",\"SherwoodV2.unlockCallback(bytes)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":247,\"AUDIT.md\":30,\"README.md\":177,\"foundry.toml\":22,\"launch.json\":19,\"script/DeploySherwoodV2.s.sol\":60,\"script/DryRunImd.s.sol\":16,\"script/SetupSherwoodV2.s.sol\":53,\"src/Sherwood.sol\":833,\"src/SherwoodV2.sol\":1325,\"src/SherwoodV2Launcher.sol\":74,\"test/SHERWOOD_V2_TESTING.md\":151,\"test/Sherwood.t.sol\":910,\"test/SherwoodFork.t.sol\":132,\"test/SherwoodV2.t.sol\":2499,\"test/SherwoodV2Accounting.t.sol\":288,\"test/SherwoodV2BuybackHook.t.sol\":90,\"test/SherwoodV2Edges.t.sol\":521,\"test/SherwoodV2Fork.t.sol\":270,\"test/SherwoodV2FreshBoardInvariant.t.sol\":109,\"test/SherwoodV2Invariant.t.sol\":190,\"test/SherwoodV2LargeBoardKing.t.sol\":241,\"test/SherwoodV2LaunchConfig.t.sol\":179,\"test/SherwoodV2Launcher.t.sol\":78,\"test/SherwoodV2LauncherFork.t.sol\":117,\"test/SherwoodV2Lifecycle.t.sol\":248,\"test/SherwoodV2UnknownReign.t.sol\":438,\"test/SherwoodV2UnknownReignKing.t.sol\":132,\"test/helpers/MockHolderHook.sol\":43,\"test/helpers/SherwoodV2Fixture.sol\":215,\"test/helpers/SherwoodV2Handler.sol\":331},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ed34a9623b5fa67867fb99ee912ff7d3c7a0cc769f476b66d73ec68e39f0939c","verifiedTreeHash":"a89b8306b93a0edeb2d7ed58d0332f96be0fc2ba","verifierVersion":"0.1.0+fb8278c5"},{"checks":[{"durationMs":140898,"exitCode":0,"name":"build","output":"Compiling 109 files with Solc 0.8.26\nSolc 0.8.26 finished in 140.36s\nCompiler run successful with warnings:\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:559:17:\n    |\n559 |                 address leader = _currentLeader(round);\n    |                 ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:763:9:\n    |\n763 |         address leader = _leader[round];\n    |         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:798:63:\n    |\n798 |     function _scan(uint256 round, bool all) internal returns (address leader) {\n    |                                                               ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:831:39:\n    |\n831 |     function _setReign(uint256 round, address leader) internal {\n    |                                       ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/SherwoodV2.sol:871:43:\n    |\n871 |     function _lowestRecent(uint256 round, address leader) internal view returns (address lowest) {\n    |                                           ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n    --> src/SherwoodV2.sol:1166:5:\n     |\n1166 |     function leader(uint256 round) external view returns (address) {\n     |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:364:17:\n    |\n364 |                 address leader = _currentLeader(day);\n    |                 ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:490:9:\n    |\n490 |         address leader = _leader[day];\n    |         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:501:60:\n    |\n501 |     function _currentLeader(uint256 day) internal returns (address leader) {\n    |                                                            ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:529:41:\n    |\n529 |     function _lowestRecent(uint256 day, address leader) internal view returns (address lowest) {\n    |                                         ^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:750:5:\n    |\n750 |     function leader(uint256 day) external view returns (address) {\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (8760): This declaration has the same name as another declaration.\n   --> src/Sherwood.sol:677:9:\n    |\n677 |         bytes memory result = poolManager.unlock(abi.encode(amount, minPfwaOut));\n    |         ^^^^^^^^^^^^^^^^^^^\nNote: The other declaration is here:\n   --> src/Sherwood.sol:764:5:\n    |\n764 |     function result(uint256 day)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n   ╭▸ src/SherwoodV2Launcher.sol:37:29\n   │\n37 │           bytes memory init = abi.encodePacked(\n   │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n38 │ ┃             type(SherwoodV2).creationCode,\n39 │ ┃             abi.encode(poolManager, token, host, hostHolderMin, dice, diceProvider, owner, genesis)\n40 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[weak-prng]: weak randomness derived from a predictable on-chain value\n    ╭▸ src/Sherwood.sol:427:30\n    │\n427 │         bytes32 userRandom = keccak256(abi.encode(player, ethIn, block.number, block.timestamp, gasleft()));\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/weak-prng\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/SherwoodV2Launcher.sol:72:14\n   │\n72 │         if (!found) revert NoSalt();\n   │              ━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[weak-prng]: weak randomness derived from a predictable on-chain value\n    ╭▸ src/SherwoodV2.sol:689:30\n    │\n689 │         bytes32 userRandom = keccak256(abi.encode(player, ethIn, block.number, block.timestamp, gasleft()));\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/weak-prng\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:213:103\n    │\n213 │     constructor(IPoolManager _poolManager, Currency _pfwa, IDiceEntropy _dice, address _diceProvider, address _owner) {\n    │                                                                                                       ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:213:80\n    │\n213 │     constructor(IPoolManager _poolManager, Currency _pfwa, IDiceEntropy _dice, address _diceProvider, address _owner) {\n    │                                                                                ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Sherwood.sol:283:13\n    │\n283 │             emit PotFunded(day, fee, false);\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/Sherwood.sol:338:21\n    │\n338 │                     emit ReferrerSet(player, referrer);\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/Sherwood.sol:445:9\n    │\n445 │         emit FlipRequested(sequence, day, player, stake);\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/Sherwood.sol:352:13\n    │\n352 │             emit Played(day, player, move, ethIn, 0, previous, 0);\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/Sherwood.sol:376:13\n    │\n376 │             emit Played(day, player, move, ethIn, scored, target, moved);\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/Sherwood.sol:383:17\n    │\n383 │                 emit ReferralPoints(day, ref, player, bonus);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:277:25\n    │\n277 │         uint256 ethIn = uint256(-params.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/Sherwood.sol:286:63\n    │\n286 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\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/Sherwood.sol:286:70\n    │\n286 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:322:58\n    │\n322 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/Sherwood.sol:314:17\n    │\n314 │                 emit PotFunded(day, fee, true);\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/Sherwood.sol:320:13\n    │\n320 │             emit PointsWiped(day, tx.origin, uint256(had));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:298:32\n    │\n298 │             uint256 declared = uint256(-params.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/Sherwood.sol:299:17\n    │\n299 │             if (uint256(int256(-delta.amount0())) + (declared * FEE_BPS) / 10_000 < declared) revert PartialFill();\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/Sherwood.sol:301:32\n    │\n301 │             if (pfwaOut > 0 && uint256(-params.amountSpecified) >= MIN_BUY) {\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/Sherwood.sol:302:52\n    │\n302 │                 bought[currentDay()][tx.origin] += uint256(int256(pfwaOut));\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/Sherwood.sol:310:20\n    │\n310 │             fee = (uint256(int256(ethOut)) * FEE_BPS) / 10_000;\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/Sherwood.sol:319:36\n    │\n319 │             _debit(day, tx.origin, uint256(had));\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/Sherwood.sol:320:46\n    │\n320 │             emit PointsWiped(day, tx.origin, uint256(had));\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/Sherwood.sol:322:44\n    │\n322 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/Sherwood.sol:322:51\n    │\n322 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/Sherwood.sol:345:26\n    │\n345 │         uint256 scored = (base * bonusBps) / 10_000;\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/Sherwood.sol:380:29\n    │\n380 │             uint256 bonus = (scored * REFERRAL_POINTS_BPS) / 10_000;\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/Sherwood.sol:376:67\n    │\n376 │             emit Played(day, player, move, ethIn, scored, target, moved);\n    │                                                                   ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:376:59\n    │\n376 │             emit Played(day, player, move, ethIn, scored, target, moved);\n    │                                                           ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:435:15\n    │\n435 │         flips[sequence] = PendingFlip({\n    │               ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:426:13\n    │\n426 │         if (diceFee > MAX_DICE_FEE || pot[day] < diceFee) return false;\n    │             ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:438:18\n    │\n438 │             day: uint64(day),\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/Sherwood.sol:439:26\n    │\n439 │             requestedAt: 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/Sherwood.sol:440:20\n    │\n440 │             stake: uint96(stake),\n    │                    ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:441:18\n    │\n441 │             win: uint96((stake * scaledBps(FLIP_WIN_BPS_MIN, FLIP_WIN_BPS_MAX, base)) / 10_000)\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Sherwood.sol:468:39\n    │\n468 │         if (f.player == address(0) || block.timestamp < f.requestedAt + FLIP_TIMEOUT) revert FlipNotExpired();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:486:48\n    │\n486 │         int256 updated = points[day][player] + int256(amount);\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/Sherwood.sol:496:32\n    │\n496 │         points[day][player] -= int256(amount);\n    │                                ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/Sherwood.sol:509:21\n    │\n509 │             if (p > best) (best, leader) = (p, players[i]);\n    │                     ━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:518:24\n    │\n518 │         return p > 0 ? uint256(p) : 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[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/Sherwood.sol:598:31\n    │\n598 │                 uint256 cut = (prize * REFERRAL_PRIZE_BPS) / 10_000;\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/Sherwood.sol:594:13\n    │\n594 │             awarded += prize;\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/Sherwood.sol:545:13\n    │\n545 │         if (block.timestamp < (day + 1) * 1 days + SETTLE_DELAY) revert DayNotOver();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/Sherwood.sol:584:31\n    │\n584 │             uint256 balance = IBalanceOf(Currency.unwrap(pfwa)).balanceOf(winner);\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:570:20\n    │\n570 │         r.cursor = uint64(end);\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/Sherwood.sol:606:23\n    │\n606 │         r.settledAt = 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/Sherwood.sol:627:17\n    │\n627 │                 amount += r.prize[i];\n    │                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Sherwood.sol:617:13\n    │\n617 │         if (block.timestamp > claimDeadline(day)) revert ClaimWindowClosed();\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/Sherwood.sol:633:9\n    │\n633 │         emit PrizeClaimed(day, msg.sender, amount);\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/Sherwood.sol:625:42\n    │\n625 │                 if (balance < r.held[i]) revert MustHoldToClaim();\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/Sherwood.sol:650:9\n    │\n650 │         emit ReferralClaimed(msg.sender, 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/Sherwood.sol:663:17\n    │\n663 │                 amount += r.prize[i];\n    │                 ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/Sherwood.sol:657:13\n    │\n657 │         if (block.timestamp <= claimDeadline(day)) revert ClaimWindowOpen();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SherwoodV2.sol:377:9\n    │\n377 │         address _owner,\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/SherwoodV2.sol:376:9\n    │\n376 │         address _diceProvider,\n    │         ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/Sherwood.sol:679:9\n    │\n679 │         emit BuybackBurned(amount, burned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/Sherwood.sol:686:66\n    │\n686 │             key, SwapParams({zeroForOne: true, amountSpecified: -int256(amount), sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1}), \"\"\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/Sherwood.sol:688:27\n    │\n688 │         uint256 ethPaid = uint256(int256(-delta.amount0()));\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/Sherwood.sol:689:27\n    │\n689 │         uint256 pfwaOut = uint256(int256(delta.amount1()));\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[unused-return]: return value of an external call is not used\n    ╭▸ src/Sherwood.sol:691:9\n    │\n691 │         poolManager.settle{value: ethPaid}();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:705:23\n    │\n705 │     function setOwner(address next) external onlyOwner {\n    │                       ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n    ╭▸ src/Sherwood.sol:710:26\n    │\n710 │     function setOperator(address next) external onlyOwner {\n    │                          ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SherwoodV2.sol:423:16\n    │\n423 │         return block.timestamp < GENESIS ? 0 : (block.timestamp - GENESIS) / ROUND_LENGTH;\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/SherwoodV2.sol:468:33\n    │\n468 │         if (ethIn >= MIN_BUY && block.timestamp >= GENESIS) _play(round, tx.origin, ethIn, hookData);\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/SherwoodV2.sol:466:13\n    │\n466 │             emit PotFunded(round, fee, false);\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/SherwoodV2.sol:848:9\n    │\n848 │         emit ReignChanged(round, leader, at);\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/SherwoodV2.sol:527:21\n    │\n527 │                     emit ReferrerSet(player, referrer);\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/SherwoodV2.sol:605:13\n    │\n605 │             emit ShieldArmed(round, player, until);\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/SherwoodV2.sol:708:9\n    │\n708 │         emit FlipRequested(sequence, round, player, stake);\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/SherwoodV2.sol:543:13\n    │\n543 │             emit Played(round, player, move, ethIn, 0, previous, 0);\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/SherwoodV2.sol:637:9\n    │\n637 │         emit Reflected(round, attacker, defender, amount, move);\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/SherwoodV2.sol:576:13\n    │\n576 │             emit Played(round, player, move, ethIn, scored, target, moved);\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/SherwoodV2.sol:583:17\n    │\n583 │                 emit ReferralPoints(round, ref, player, bonus);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:460:25\n    │\n460 │         uint256 ethIn = uint256(-params.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/SherwoodV2.sol:469:63\n    │\n469 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\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/SherwoodV2.sol:469:70\n    │\n469 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SherwoodV2.sol:508:58\n    │\n508 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/SherwoodV2.sol:485:56\n    │\n485 │             if (tokenOut > 0 && declared >= MIN_BUY && block.timestamp >= GENESIS) {\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/SherwoodV2.sol:498:17\n    │\n498 │                 emit PotFunded(round, fee, true);\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/SherwoodV2.sol:505:13\n    │\n505 │             emit PointsWiped(round, tx.origin, uint256(had));\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:481:32\n    │\n481 │             uint256 declared = uint256(-params.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/SherwoodV2.sol:482:17\n    │\n482 │             if (uint256(int256(-delta.amount0())) + (declared * FEE_BPS) / 10_000 < declared) revert PartialFill();\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/SherwoodV2.sol:486:54\n    │\n486 │                 bought[currentRound()][tx.origin] += uint256(int256(tokenOut));\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/SherwoodV2.sol:494:20\n    │\n494 │             fee = (uint256(int256(ethOut)) * FEE_BPS) / 10_000;\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/SherwoodV2.sol:504:38\n    │\n504 │             _debit(round, tx.origin, uint256(had));\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/SherwoodV2.sol:505:48\n    │\n505 │             emit PointsWiped(round, tx.origin, uint256(had));\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/SherwoodV2.sol:508:44\n    │\n508 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/SherwoodV2.sol:508:51\n    │\n508 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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/SherwoodV2.sol:536:26\n    │\n536 │         uint256 scored = (base * bonusBps) / 10_000;\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/SherwoodV2.sol:580:29\n    │\n580 │             uint256 bonus = (scored * REFERRAL_POINTS_BPS) / 10_000;\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/SherwoodV2.sol:576:69\n    │\n576 │             emit Played(round, player, move, ethIn, scored, target, moved);\n    │                                                                     ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SherwoodV2.sol:576:61\n    │\n576 │             emit Played(round, player, move, ethIn, scored, target, moved);\n    │                                                             ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:524:63\n    │\n524 │                 address referrer = word >> 160 == 0 ? address(uint160(word)) : address(0);\n    │                                                               ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' is safe 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/SherwoodV2.sol:596:20\n    │\n596 │         s.played = uint128(played + ethIn);\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/SherwoodV2.sol:620:16\n    │\n620 │         return n < cap ? n : cap;\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/SherwoodV2.sol:626:17\n    │\n626 │         return (clock > full ? clock : full) + recharge;\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/SherwoodV2.sol:642:16\n    │\n642 │         return block.timestamp < shieldUntil[player];\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SherwoodV2.sol:688:13\n    │\n688 │         if (diceFee > MAX_DICE_FEE || diceFee > (ethIn * FEE_BPS) / 10_000 || pot[round] < diceFee) return 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/SherwoodV2.sol:697:15\n    │\n697 │         flips[sequence] = PendingFlip({\n    │               ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:700:20\n    │\n700 │             round: uint64(round),\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/SherwoodV2.sol:701:26\n    │\n701 │             requestedAt: 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/SherwoodV2.sol:702:20\n    │\n702 │             stake: uint96(stake),\n    │                    ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:703:18\n    │\n703 │             win: uint96((stake * scaledBps(FLIP_WIN_BPS_MIN, FLIP_WIN_BPS_MAX, base)) / 10_000)\n    │                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint96' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SherwoodV2.sol:737:39\n    │\n737 │         if (f.player == address(0) || block.timestamp < f.requestedAt + FLIP_TIMEOUT) revert FlipNotExpired();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:759:50\n    │\n759 │         int256 updated = points[round][player] + int256(amount);\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/SherwoodV2.sol:769:34\n    │\n769 │         points[round][player] -= int256(amount);\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/SherwoodV2.sol:838:27\n    │\n838 │                 g.since = uint64(at); // points changed: the spell starts over\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/SherwoodV2.sol:847:19\n    │\n847 │         g.since = 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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SherwoodV2.sol:854:16\n    │\n854 │         return block.timestamp < end ? block.timestamp : end;\n    │                ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:860:24\n    │\n860 │         return p > 0 ? uint256(p) : 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[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/SherwoodV2.sol:979:31\n    │\n979 │                 uint256 cut = (prize * REFERRAL_PRIZE_BPS) / 10_000;\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/SherwoodV2.sol:974:13\n    │\n974 │             awarded += prize;\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/SherwoodV2.sol:894:13\n    │\n894 │         if (block.timestamp < roundEnd(round) + SETTLE_DELAY) revert RoundNotOver();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/SherwoodV2.sol:964:31\n    │\n964 │             uint256 balance = IBalanceOf(Currency.unwrap(token)).balanceOf(winner);\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SherwoodV2.sol:906:23\n    │\n906 │             g.since = uint64(end);\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/SherwoodV2.sol:931:20\n    │\n931 │         r.cursor = uint64(end_);\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/SherwoodV2.sol:941:41\n    │\n941 │             (g.holder, g.since) = (top, uint64(end));\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/SherwoodV2.sol:943:40\n    │\n943 │         (r.king, r.kingReign) = (king, uint64(kingReign));\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/SherwoodV2.sol:987:23\n    │\n987 │         r.settledAt = 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/SherwoodV2.sol:1014:17\n     │\n1014 │                 amount += r.prize[i];\n     │                 ━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/SherwoodV2.sol:1004:13\n     │\n1004 │         if (block.timestamp > claimDeadline(round)) revert ClaimWindowClosed();\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/SherwoodV2.sol:1020:9\n     │\n1020 │         emit PrizeClaimed(round, msg.sender, amount);\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/SherwoodV2.sol:1012:42\n     │\n1012 │                 if (balance < r.held[i]) revert MustHoldToClaim();\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/SherwoodV2.sol:1037:9\n     │\n1037 │         emit ReferralClaimed(msg.sender, 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/SherwoodV2.sol:1050:17\n     │\n1050 │                 amount += r.prize[i];\n     │                 ━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/SherwoodV2.sol:1044:13\n     │\n1044 │         if (block.timestamp <= claimDeadline(round)) revert ClaimWindowOpen();\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/SherwoodV2.sol:1054:9\n     │\n1054 │         emit UnclaimedSwept(round, 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/SherwoodV2.sol:1066:9\n     │\n1066 │         emit BuybackBurned(amount, burned);\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/SherwoodV2.sol:1076:9\n     │\n1076 │         emit HostBuybackBurned(amount, burned);\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n     ╭▸ src/SherwoodV2.sol:1086:53\n     │\n1086 │                 zeroForOne: true, amountSpecified: -int256(amount), sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1\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/SherwoodV2.sol:1090:27\n     │\n1090 │         uint256 ethPaid = uint256(int256(-delta.amount0()));\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/SherwoodV2.sol:1091:23\n     │\n1091 │         uint256 out = uint256(int256(delta.amount1()));\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[unused-return]: return value of an external call is not used\n     ╭▸ src/SherwoodV2.sol:1093:9\n     │\n1093 │         poolManager.settle{value: ethPaid}();\n     │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n     ╭▸ src/SherwoodV2.sol:1126:23\n     │\n1126 │     function setOwner(address next) external onlyOwner {\n     │                       ━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n     ╭▸ src/SherwoodV2.sol:1139:26\n     │\n1139 │     function setOperator(address next) external onlyOwner {\n     │                          ━━━━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n     ╭▸ src/SherwoodV2.sol:1244:16\n     │\n1244 │         return n >= cap ? 0 : clock + (n + 1) * recharge;\n     │                ━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n     ╭▸ src/SherwoodV2.sol:1270:47\n     │\n1270 │             if (_outreigns(round, a, s, best, bestReign)) (best, bestReign) = (a, s);\n     │                                               ━━━━━━━━━\n     │\n     ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\n","passed":true},{"durationMs":48947,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/SherwoodV2LauncherFork.t.sol:SherwoodV2LauncherForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 353.03µs (0.00ns CPU time)\n\nRan 1 test for test/SherwoodV2Fork.t.sol:SherwoodV2ForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 431.46µs (0.00ns CPU time)\n\nRan 1 test for test/SherwoodV2Launcher.t.sol:SherwoodV2LauncherOfflineTest\n[PASS] test_constructorWorksOnEmptyChainAndFactoryDoesNotOwnHook() (gas: 512997)\nLogs:\n  offline launcher deployment gas: 25706\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.60ms (4.47ms CPU time)\n\nRan 67 tests for test/Sherwood.t.sol:SherwoodTest\n[PASS] test_belowMinimumScoresNothingButPaysFee() (gas: 239165)\n[PASS] test_buyScoresByBuySizeAndFundsPot() (gas: 474711)\n[PASS] test_buyStoppedByPriceLimitReverts() (gas: 389537)\n[PASS] test_buybackPoolCannotBeTheGamePool() (gas: 47444)\n[PASS] test_buybackPoolIsSetOnce() (gas: 103255)\n[PASS] test_buybackSwapsInOtherPoolAndBurns() (gas: 974940)\n[PASS] test_buyerReceivesPfwaForEthAfterFee() (gas: 465362)\n[PASS] test_buysAreRecordedPerDay() (gas: 478211)\n[PASS] test_cannotReferYourselfOrTheOneWhoReferredYou() (gas: 1047635)\n[PASS] test_diceFeeAboveCapScoresAsBuy() (gas: 558574)\n[PASS] test_diceRefundFromAnywhereGoesToBuybackReserve() (gas: 620104)\n[PASS] test_exactOutputReverts() (gas: 81719)\n[PASS] test_expiredFlipsUnblockSettlement() (gas: 922334)\n[PASS] test_flipLossComesOffExistingPoints() (gas: 1176958)\n[PASS] test_flipLossGoesNegativeAndPaysPreviousPlayer() (gas: 974405)\n[PASS] test_flipPaysDiceFeeFromPot() (gas: 548383)\n[PASS] test_flipRevealedAfterSettlementIsIgnored() (gas: 1328378)\n[PASS] test_flipScoresAsBuyWhenDiceRefuses() (gas: 640479)\n[PASS] test_flipWinDoublesPoints() (gas: 974723)\n[PASS] test_flipWinScalesWithBuySizeNotBonus() (gas: 1003012)\n[PASS] test_fullSizeFlipWinPaysTriple() (gas: 959278)\n[PASS] test_fullSizeRobinHoodMoves33Percent() (gas: 1179962)\n[PASS] test_fullSizeStealTakes40Percent() (gas: 831588)\n[PASS] test_fundPotSeedsTodayAndFutureDays() (gas: 168013)\n[PASS] test_holderBonusDoesNotRaiseStealShare() (gas: 1197032)\n[PASS] test_holderBonusForKeepingYesterdaysBuys() (gas: 1225572)\n[PASS] test_holderBonusMaxesAt125Points() (gas: 832916)\n[PASS] test_holderBonusNeedsYesterdaysPlay() (gas: 831315)\n[PASS] test_lateSettlementStillGivesSevenDaysToClaim() (gas: 820918)\n[PASS] test_negativePlayersNeverPlace() (gas: 1239262)\n[PASS] test_noHolderBonusAfterSellingYesterdaysBuys() (gas: 912559)\n[PASS] test_noHookDataIsPlainBuy() (gas: 455840)\n[PASS] test_noPrizeShareIfReferrerSkippedTheDay() (gas: 1483911)\n[PASS] test_noWelcomeBonusWithoutAReferrer() (gas: 459560)\n[PASS] test_onlyDiceCanDeliverRandomness() (gas: 31151)\n[PASS] test_onlyOneGamePool() (gas: 45863)\n[PASS] test_onlyTheOwnerCanCreateThePool() (gas: 245306)\n[PASS] test_partialWinnerMustKeepWhatTheyHeldToClaim() (gas: 1000839)\n[PASS] test_plainEthTransferLandsInTodaysPot() (gas: 66341)\n[PASS] test_pointsCapAt100PerBuy() (gas: 460410)\n[PASS] test_recentPlayersMostRecentFirst() (gas: 3575468)\n[PASS] test_referralShareComesOutOfTheRollover() (gas: 1370935)\n[PASS] test_referredPlayerGetsHolderBonusNextDay() (gas: 1196727)\n[PASS] test_referrerEarnsTenPercentPointsOnlyOnDaysTheyPlayed() (gas: 1067348)\n[PASS] test_referrerIsSetOnceAndNeverChanges() (gas: 1056028)\n[PASS] test_referrerOnlyOnTheFirstPlay() (gas: 990776)\n[PASS] test_referrerTakesFivePercentOfPrize() (gas: 1305693)\n[PASS] test_robinHoodCanPayTheMover() (gas: 1032297)\n[PASS] test_robinHoodFindsNewLeaderAfterLeaderLosesPoints() (gas: 1980670)\n[PASS] test_robinHoodMovesLeaderPointsToLowestRecent() (gas: 1180890)\n[PASS] test_scaledBpsRange() (gas: 40873)\n[PASS] test_seededPotPaysTheWinner() (gas: 797988)\n[PASS] test_sellLeavesNegativeScore() (gas: 1201382)\n[PASS] test_sellWipesPointsAndFundsPot() (gas: 769889)\n[PASS] test_settleInBatches() (gas: 1632465)\n[PASS] test_settleSplitsPotAndWinnersClaim() (gas: 2129562)\n[PASS] test_settleWaitsForPendingFlips() (gas: 1545814)\n[PASS] test_stealFromNegativePlayerTakesNothing() (gas: 2030423)\n[PASS] test_stealOnYourselfDoesNothingExtra() (gas: 656907)\n[PASS] test_stealTakes20PercentOfPreviousPlayer() (gas: 827645)\n[PASS] test_unawardedSharesRollOverWhenFewerThanThreePlayers() (gas: 716371)\n[PASS] test_unclaimedPrizesSweepAfterSevenDays() (gas: 916550)\n[PASS] test_unrevealedFlipExpiresAsPlainBuy() (gas: 704517)\n[PASS] test_welcomeBonusOnlyOnTheFirstDay() (gas: 1306614)\n[PASS] test_winnerMustHoldThatDaysBuysToClaim() (gas: 936200)\n[PASS] test_winnerWhoSoldEverythingForfeitsAtSettlement() (gas: 1253371)\n[PASS] test_winnerWhoSoldPartForfeitsThatShare() (gas: 1337127)\nSuite result: ok. 67 passed; 0 failed; 0 skipped; finished in 46.49ms (43.06ms CPU time)\n\nRan 8 tests for test/SherwoodV2Lifecycle.t.sol:SherwoodV2LifecycleTest\n[PASS] testFuzz_diceOutageFallsBackWithoutConsumingFlip(uint256,bool) (runs: 1000, μ: 591261, ~: 587136)\n[PASS] test_diceFeeAtCapNeedsABuyWhoseShareCoversItAndOneWeiAboveCapFallsBack() (gas: 2214989)\n[PASS] test_eachChargeClockRechargesAtItsExactBoundary() (gas: 11519395)\n[PASS] test_expiryAndDiceRefundUseSeparateAccountingAndCannotRepeat() (gas: 943567)\n[PASS] test_multipleFlipsResolveOutOfOrderAgainstSavedPreviousPlayers() (gas: 2691413)\n[PASS] test_partialRechargeSurvivesSpendingAnotherBankedCharge() (gas: 1387295)\n[PASS] test_referralTransferFailureRollsBackAndCrossFunctionReentryIsBlocked() (gas: 2991576)\n[PASS] test_timeoutRecoveryUnblocksBatchedSettlementAtExactOpening() (gas: 2085535)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 408.16ms (423.24ms CPU time)\n\nRan 142 tests for test/SherwoodV2.t.sol:SherwoodV2Test\n[PASS] test_beforeGenesisFeesGoToRoundZeroButNothingScores() (gas: 1214659)\n[PASS] test_belowMinimumScoresNothingButPaysFee() (gas: 241633)\n[PASS] test_buyScoresByBuySizeAndFundsPot() (gas: 531812)\n[PASS] test_buyStoppedByPriceLimitReverts() (gas: 445468)\n[PASS] test_buybackAndBurnHostBurnsHostToDead() (gas: 1384585)\n[PASS] test_buybackPoolIsFixedToTheOnePercentPoolWithNoSetter() (gas: 57202)\n[PASS] test_buybackSwapsInOtherPoolAndBurns() (gas: 1088890)\n[PASS] test_buyerReceivesPfwaForEthAfterFee() (gas: 520953)\n[PASS] test_buysAreRecordedPerRound() (gas: 536247)\n[PASS] test_buysScoreInTheRoundTheyHappen() (gas: 1215723)\n[PASS] test_cannotReferYourselfOrTheOneWhoReferredYou() (gas: 1166841)\n[PASS] test_chargesBankedPastTheCapAreDropped() (gas: 922099)\n[PASS] test_chargesCarryAcrossRounds() (gas: 9167833)\n[PASS] test_claimDeadlineFromRoundEndWhenSettledOnTime() (gas: 910805)\n[PASS] test_diceFeeAboveCapScoresAsBuy() (gas: 618557)\n[PASS] test_diceRefundFromAnywhereGoesToBuybackReserve() (gas: 681031)\n[PASS] test_dirtyReferrerWordIsIgnoredNotAReasonToRevert() (gas: 945667)\n[PASS] test_exactOutputReverts() (gas: 82018)\n[PASS] test_expiredFlipsUnblockSettlement() (gas: 1061813)\n[PASS] test_flipChargesStackAcrossRounds() (gas: 3070370)\n[PASS] test_flipLossComesOffExistingPoints() (gas: 1329928)\n[PASS] test_flipLossGoesNegativeAndPaysPreviousPlayer() (gas: 1118224)\n[PASS] test_flipPaysDiceFeeFromPot() (gas: 608916)\n[PASS] test_flipRevealedAfterSettlementIsIgnored() (gas: 1610534)\n[PASS] test_flipScoresAsBuyWhenDiceFeeExceedsTheBuysPotShare() (gas: 1153876)\n[PASS] test_flipScoresAsBuyWhenDiceRefuses() (gas: 706890)\n[PASS] test_flipWinDoublesPoints() (gas: 1125586)\n[PASS] test_flipWinScalesWithBuySizeNotBonus() (gas: 1194850)\n[PASS] test_fullSizeFlipWinPaysTriple() (gas: 1110710)\n[PASS] test_fullSizeRobinHoodMoves33Percent() (gas: 1325699)\n[PASS] test_fullSizeStealTakes40Percent() (gas: 938447)\n[PASS] test_fundPotRejectsRoundsTooFarAhead() (gas: 139335)\n[PASS] test_fundPotSeedsCurrentAndFutureRounds() (gas: 171132)\n[PASS] test_gas_completingSettleBatch() (gas: 9330925)\nLogs:\n  settle, 24 players, 4 prizes (one batch): 722754\n  claim, King only: 90792\n\n[PASS] test_gas_reignUpkeep() (gas: 70231003)\nLogs:\n  buy, #1 unchanged: 357366\n  buy, #1 changes: 368397\n  leader sell with 203 players (rescan): 1239914\n\n[PASS] test_holderBonusDoesNotRaiseStealShare() (gas: 1379376)\n[PASS] test_holderBonusForKeepingLastRoundsBuys() (gas: 1384954)\n[PASS] test_holderBonusMaxesAt125Points() (gas: 969686)\n[PASS] test_holderBonusNeedsLastRoundsPlay() (gas: 969509)\n[PASS] test_holdingRuleUsesBalanceAtSettlement() (gas: 1183951)\n[PASS] test_hostBonusAtTheThreshold() (gas: 1189145)\n[PASS] test_hostBonusStacksWithTheOtherBonuses() (gas: 1859648)\n[PASS] test_hostBurnReserveAccruesSevenPercent() (gas: 1740638)\n[PASS] test_hostBuybackPoolIsFixedToTheHolderPoolWithNoSetter() (gas: 47037)\n[PASS] test_hostSameAsGameTokenTurnsHostFeaturesOff() (gas: 1428518)\n[PASS] test_hostWiring() (gas: 25917)\n[PASS] test_kingFullTieGoesToTheEarlierPlayer() (gas: 1814273)\n[PASS] test_kingMustHoldToClaim() (gas: 2492581)\n[PASS] test_kingOutsideTopThreeClaimsKingPrize() (gas: 2495661)\n[PASS] test_kingPrizeForfeitsPartly() (gas: 1640625)\n[PASS] test_kingTieGoesToMorePoints() (gas: 2348615)\n[PASS] test_kingWhoSoldEverythingGetsNothing() (gas: 2385994)\n[PASS] test_lateSettlementStillGivesSevenDaysToClaim() (gas: 1030583)\n[PASS] test_leaderChangeAfterRoundEndCountsNothing() (gas: 1648527)\n[PASS] test_leaderLostFlipCallbackFitsDiceGasLimitOnABigBoard() (gas: 70590963)\nLogs:\n  leader loss on 202 players, callback gas: 111847\n\n[PASS] test_leaderLostFlipDefersTheRescanJustPastTheBound() (gas: 5226416)\nLogs:\n  leader loss on 13 players, callback gas: 91947\n\n[PASS] test_leaderLostFlipRescansASmallBoardInsideTheCallback() (gas: 4977163)\nLogs:\n  leader loss on 12 players, callback gas: 166233\n\n[PASS] test_negativePlayersNeverPlace() (gas: 1521626)\n[PASS] test_noHolderBonusAfterSellingLastRoundsBuys() (gas: 1035634)\n[PASS] test_noHookDataIsPlainBuy() (gas: 513972)\n[PASS] test_noKingShareRollsOver() (gas: 1062431)\n[PASS] test_noPrizeShareIfReferrerSkippedTheRound() (gas: 1798104)\n[PASS] test_noWelcomeBonusWithoutAReferrer() (gas: 515571)\n[PASS] test_onlyDiceCanDeliverRandomness() (gas: 31867)\n[PASS] test_onlyOneGamePool() (gas: 47275)\n[PASS] test_onlyTheOwnerCanCreateThePool() (gas: 268974)\n[PASS] test_otherFlipOutcomesFitDiceGasLimitOnABigBoard() (gas: 69471853)\nLogs:\n  non-leader loss, callback gas: 76387\n  win taking #1, callback gas: 79333\n\n[PASS] test_partialWinnerMustKeepWhatTheyHeldToClaim() (gas: 1200847)\n[PASS] test_plainEthTransferLandsInCurrentPot() (gas: 65612)\n[PASS] test_pointsCapAt100PerBuy() (gas: 517010)\n[PASS] test_potSplitSumsToWhole() (gas: 79960)\n[PASS] test_rankAndKingClaimNeedsTheHolding() (gas: 1695010)\n[PASS] test_rankAndKingClaimedTogether() (gas: 1573586)\n[PASS] test_recentPlayersMostRecentFirst() (gas: 3905356)\n[PASS] test_reentrantWinnerGetsNothingExtra() (gas: 1400447)\n[PASS] test_referralShareComesOutOfTheRollover() (gas: 1602076)\n[PASS] test_referralWorstCaseKeepsRolloverAboveZero() (gas: 2908606)\n[PASS] test_referredPlayerGetsHolderBonusNextRound() (gas: 1373063)\n[PASS] test_referrerEarnsTenPercentPointsOnlyInRoundsTheyPlayed() (gas: 1172539)\n[PASS] test_referrerIsSetOnceAndNeverChanges() (gas: 1166502)\n[PASS] test_referrerOnlyOnTheFirstPlay() (gas: 1101710)\n[PASS] test_referrerTakesFivePercentOfKingPrize() (gas: 2715842)\n[PASS] test_referrerTakesFivePercentOfPrize() (gas: 1582730)\n[PASS] test_reflectedRobinHoodTakesTheFullCutBelowZero() (gas: 1314267)\n[PASS] test_reflectedStealTakesTheFullCutBelowZero() (gas: 1583910)\n[PASS] test_reignCanBeVacant() (gas: 1222762)\n[PASS] test_reignChangesOnFlipExpiry() (gas: 1125250)\n[PASS] test_reignChangesOnFlipLoss() (gas: 1943750)\n[PASS] test_reignChangesOnFlipWin() (gas: 1136037)\n[PASS] test_reignChangesOnReflect() (gas: 1200844)\n[PASS] test_reignChangesOnRobinHood() (gas: 1335622)\n[PASS] test_reignChangesOnSellWipe() (gas: 1176746)\n[PASS] test_reignChangesOnSteal() (gas: 952901)\n[PASS] test_reignCountsSecondsAtNumberOne() (gas: 1402252)\n[PASS] test_reignStopsAtRoundEndAndIsFinalizedAtSettlement() (gas: 1423182)\n[PASS] test_robinHoodAfterShieldExpiresLands() (gas: 1313636)\n[PASS] test_robinHoodCanPayTheMover() (gas: 1150161)\n[PASS] test_robinHoodChargesStackAndRecharge() (gas: 2406451)\n[PASS] test_robinHoodFindsNewLeaderAfterLeaderLosesPoints() (gas: 2190004)\n[PASS] test_robinHoodIntoShieldIsReflected() (gas: 1551898)\n[PASS] test_robinHoodMovesLeaderPointsToLowestRecent() (gas: 1316301)\n[PASS] test_roundBoundaries() (gas: 64775)\n[PASS] test_samePermissionsAsV1() (gas: 12910)\n[PASS] test_scaledBpsRange() (gas: 17508)\n[PASS] test_seededPotPaysTheWinner() (gas: 967070)\n[PASS] test_sellLeavesNegativeScore() (gas: 1345234)\n[PASS] test_sellWipesPointsAndFundsPot() (gas: 825215)\n[PASS] test_settleAllRemainingWithMax() (gas: 1435694)\n[PASS] test_settleCreditsTheFinalUnknownSpellToTheFinalLeader() (gas: 5941441)\n[PASS] test_settleInBatches() (gas: 1910394)\n[PASS] test_settleInBatchesSendsNothing() (gas: 1982913)\n[PASS] test_settleNeverCallsWinners() (gas: 1247355)\nLogs:\n  settle with a gas-burning winner: 367793\n\n[PASS] test_settleSplitsPotAndWinnersClaim() (gas: 2792917)\n[PASS] test_settleTimingPerRound() (gas: 1824018)\n[PASS] test_settleWaitsForPendingFlips() (gas: 1865010)\n[PASS] test_shieldChargeEarnedAtCumulativeThreshold() (gas: 1308773)\n[PASS] test_shieldChargesCapAtOne() (gas: 1500028)\n[PASS] test_shieldExpiresAfterThirtyMinutes() (gas: 979759)\n[PASS] test_shieldRearmRefreshesExpiry() (gas: 787812)\n[PASS] test_shieldScoresLikeABuyAndArmsWithTheChargeItEarns() (gas: 552536)\n[PASS] test_shieldWithoutChargeIsPlainBuy() (gas: 526853)\n[PASS] test_stealChargesStackAndRecharge() (gas: 8873349)\n[PASS] test_stealFromNegativePlayerTakesNothing() (gas: 2294954)\n[PASS] test_stealIntoShieldIsReflected() (gas: 1199188)\n[PASS] test_stealOnYourselfDoesNothingExtra() (gas: 731279)\n[PASS] test_stealTakes20PercentOfPreviousPlayer() (gas: 925943)\n[PASS] test_stealThatTakesNothingLeavesTheShieldUp() (gas: 1267621)\n[PASS] test_stealWithNoTargetUsesNoCharge() (gas: 754114)\n[PASS] test_sweepLandsInTheRoundLiveWhenSwept() (gas: 1100163)\n[PASS] test_sweepTakesRankAndKingLeftUnclaimed() (gas: 1613917)\n[PASS] test_sweepUnsettledRoundReverts() (gas: 554115)\n[PASS] test_throwawayWalletPaysTheFullCutToBreakAShield() (gas: 1631766)\n[PASS] test_unawardedSharesRollOverWhenFewerThanThreePlayers() (gas: 901283)\n[PASS] test_unclaimedKingPrizeDeadlineAndSweep() (gas: 2686439)\n[PASS] test_unclaimedPrizesSweepAfterSevenDays() (gas: 1313979)\n[PASS] test_unknownMoveIsPlainBuy() (gas: 516211)\n[PASS] test_unrevealedFlipExpiresAsPlainBuy() (gas: 797427)\n[PASS] test_walletThatRefusesEthCanClaimOnceItAccepts() (gas: 1944822)\n[PASS] test_welcomeBonusOnlyInTheFirstRound() (gas: 1468627)\n[PASS] test_winnerMustHoldThatRoundsBuysToClaim() (gas: 1134231)\n[PASS] test_winnerWhoSoldEverythingForfeitsAtSettlement() (gas: 1485651)\n[PASS] test_winnerWhoSoldPartForfeitsThatShare() (gas: 1661370)\nSuite result: ok. 142 passed; 0 failed; 0 skipped; finished in 430.90ms (317.65ms CPU time)\n\nRan 1 test for test/SherwoodV2BuybackHook.t.sol:SherwoodV2BuybackHookTest\n[PASS] testFuzz_hostBurnUsesNetDeltasIncludingTheHolderHooksFees(uint256) (runs: 1000, μ: 1032052, ~: 1032156)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 460.36ms (458.53ms CPU time)\n\nRan 10 tests for test/SherwoodV2Accounting.t.sol:SherwoodV2AccountingTest\n[PASS] testFuzz_batchedSettlementSameAsSinglePass(uint256,uint256,uint256) (runs: 1000, μ: 3434394, ~: 3373287)\n[PASS] testFuzz_buyDeltaMatchesEveryBalance(uint256) (runs: 1000, μ: 390974, ~: 537388)\n[PASS] testFuzz_sellDeltaAndRoundTripCannotCreateETH(uint256,uint256) (runs: 1000, μ: 813103, ~: 814273)\n[PASS] testFuzz_slippageRevertIsAtomicForEitherBurn(bool,uint256) (runs: 1000, μ: 526481, ~: 526533)\n[PASS] test_bothPartialBuybacksRefundOnlyTheirOwnReserve() (gas: 1981798)\n[PASS] test_claimAtExactDeadlineThenSweepCannotDoubleSpend() (gas: 1783105)\n[PASS] test_emptyBuybackLiquidityPreservesReserveAndClaims() (gas: 1689820)\n[PASS] test_oneWeiAndFeeRoundingBoundary() (gas: 513154)\n[PASS] test_partialBuyRollsBackFeeDiceRequestChargesAndReferral() (gas: 662589)\n[PASS] test_unprivilegedCallbacksAndOperatorCannotChangeOwnerOrPools() (gas: 276732)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 460.73ms (1.51s CPU time)\n\nRan 1 test for test/SherwoodV2UnknownReignKing.t.sol:SherwoodV2UnknownReignKingTest\n[PASS] test_kingOfTheHillIsTheLongestAtFirstPlaceNotTheFinalLeader() (gas: 527725566)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.33s (1.33s CPU time)\n\nRan 5 tests for test/SherwoodV2LargeBoardKing.t.sol:SherwoodV2LargeBoardKingTest\n[PASS] test_debitOfTheRunningBestRestartsTheRescan() (gas: 520773066)\n[PASS] test_kingPrizeGoesToTrueLeaderOnLargeBoard() (gas: 527641577)\n[PASS] test_rescanFinishesInOnePlayWithGasToSpare() (gas: 515431520)\nLogs:\n  1,501 cold players rescanned in one play, gas: 7478536\n\n[PASS] test_rescanResumesInChunksUnderATightGasBudget() (gas: 518436680)\nLogs:\n  resolved board, plain buy gas: 348762\n\n[PASS] test_robinHoodWaitsForTheRescanAndKeepsItsCharge() (gas: 516145728)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.46s (6.11s CPU time)\n\nRan 4 tests for test/SherwoodV2LaunchConfig.t.sol:SherwoodV2LaunchConfigTest\n[PASS] test_burnPoolsAreTheBriefsPoolsDerivedFromTheConstructor() (gas: 30244)\n[PASS] test_ownerCannotRedirectTheBurnToACapturePool() (gas: 1471834)\n[PASS] test_ownerHandoverIsTwoStep() (gas: 340263)\n[PASS] test_ownerHandoverToAWrongAddressIsHarmlessAndCancellable() (gas: 485329)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.48s (2.53ms CPU time)\n\nRan 12 tests for test/SherwoodV2UnknownReign.t.sol:SherwoodV2UnknownReignTest\n[PASS] testFuzz_chunkedRescanFindsTheTrueLeader(uint256) (runs: 6, μ: 525652677, ~: 525589483)\n[PASS] test_anUnknownSpellDoesNotLeakIntoTheNextRound() (gas: 520908035)\n[PASS] test_boardOfExactlyMaxLeaderScanIsRescannedInsideTheDebitingSwap() (gas: 515121910)\n[PASS] test_debitOfTheLeaderOnABigBoardLeavesFirstPlaceUnknownUntilTheNextPlayRescans() (gas: 527690082)\n[PASS] test_deferredDiceRescanIsResolvedByASellAndCreditedBackToTheReveal() (gas: 6354619)\n[PASS] test_diceLossByTheRunningBestRestartsTheRescanAndTheSpell() (gas: 520062104)\n[PASS] test_expiredFlipOfTheLeaderRescansAndLeavesNoMarker() (gas: 5196516)\n[PASS] test_expiredFlipResumesTheRescanBeforeItCreditsTheStake() (gas: 515791727)\n[PASS] test_reignSecondsNeverOverlapAcrossRepeatedUnknownSpellsAndTheKingIsTheLongest() (gas: 535476749)\n[PASS] test_robinHoodByTheStaleCachedLeaderWaitsForTheRescanAndKeepsItsCharge() (gas: 515736965)\n[PASS] test_sellByAPlayerWithoutPointsNeitherResumesNorRestartsTheSpell() (gas: 515767484)\n[PASS] test_sellByAScoredPlayerResumesTheRescanBeforeItsOwnDebit() (gas: 516864248)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 4.06s (15.37s CPU time)\n\nRan 3 tests for test/SherwoodFork.t.sol:SherwoodForkTest\n[PASS] test_fork_buyOnLivePoolManager() (gas: 516575)\nLogs:\n  PFWA bought with 0.01 ETH: 119478\n\n[PASS] test_fork_buybackBurnsThroughHolderPool() (gas: 1498236)\nLogs:\n  PFWA burned from 0.0005 ETH buyback: 6337\n\n[PASS] test_fork_flipRequestsRealDice() (gas: 602775)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 7.07s (6.95s CPU time)\n\nRan 2 tests for test/SherwoodV2Invariant.t.sol:SherwoodV2InvariantTest\n[PASS]\nSherwoodV2InvariantTest invariants:\n[PASS] invariant_allETHHasExactlyOneLiability\n[PASS] invariant_chargeViewsAndReignsStayConsistent\n[PASS] invariant_finalWinnersMatchScoresAndReignDurations\n[PASS] invariant_pendingFlipCountersMatchLiveRequests\n[PASS] invariant_settledRanksPrizesAndScoresNeverChange\n[PASS] invariant_totalETHOutNeverExceedsRecordedETHIn\n SherwoodV2InvariantTest invariants (runs: 256, calls: 24576, reverts: 0)\n\n╭-------------------+-----------------+-------+---------+----------╮\n| Contract          | Selector        | Calls | Reverts | Discards |\n+==================================================================+\n| SherwoodV2Handler | advance         | 2052  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | burn            | 2078  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | buy             | 2000  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | claim           | 2120  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | diceFailure     | 1996  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | fund            | 2088  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | refund          | 1976  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | resolve         | 2094  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | sell            | 1987  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | settleRound     | 2052  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | sweep           | 2093  | 0       | 0        |\n|-------------------+-----------------+-------+---------+----------|\n| SherwoodV2Handler | transferHolding | 2040  | 0       | 0        |\n╰-------------------+-----------------+-------+---------+----------╯\n\n[PASS] test_handlerExercisesRecoveryClaimsAndSweeps() (gas: 4233327)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 48.79s (48.79s CPU time)\n\nRan 14 test suites in 48.80s (66.00s CPU time): 256 tests passed, 0 failed, 2 skipped (258 total tests)\n","passed":true},{"durationMs":90,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Sherwood._entropyCallback(uint64,address,bytes32)\",\"Sherwood.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"Sherwood.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"Sherwood.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"Sherwood.buybackAndBurn(uint256,uint256)\",\"Sherwood.claim(uint256)\",\"Sherwood.claimReferral()\",\"Sherwood.expireFlip(uint64)\",\"Sherwood.fundPot(uint256)\",\"Sherwood.receive()\",\"Sherwood.refundDiceRequest(uint64)\",\"Sherwood.setBuybackPool((address,address,uint24,int24,address))\",\"Sherwood.setOperator(address)\",\"Sherwood.setOwner(address)\",\"Sherwood.settle(uint256,uint256)\",\"Sherwood.sweepUnclaimed(uint256)\",\"Sherwood.unlockCallback(bytes)\",\"SherwoodV2._entropyCallback(uint64,address,bytes32)\",\"SherwoodV2.acceptOwner()\",\"SherwoodV2.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"SherwoodV2.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"SherwoodV2.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"SherwoodV2.buybackAndBurn(uint256,uint256)\",\"SherwoodV2.buybackAndBurnHost(uint256,uint256)\",\"SherwoodV2.claim(uint256)\",\"SherwoodV2.claimReferral()\",\"SherwoodV2.expireFlip(uint64)\",\"SherwoodV2.fundPot(uint256)\",\"SherwoodV2.receive()\",\"SherwoodV2.refundDiceRequest(uint64)\",\"SherwoodV2.setOperator(address)\",\"SherwoodV2.setOwner(address)\",\"SherwoodV2.settle(uint256,uint256)\",\"SherwoodV2.sweepUnclaimed(uint256)\",\"SherwoodV2.unlockCallback(bytes)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":247,\"AUDIT.md\":30,\"README.md\":177,\"foundry.toml\":22,\"launch.json\":19,\"script/DeploySherwoodV2.s.sol\":60,\"script/DryRunImd.s.sol\":16,\"script/SetupSherwoodV2.s.sol\":53,\"src/Sherwood.sol\":833,\"src/SherwoodV2.sol\":1325,\"src/SherwoodV2Launcher.sol\":74,\"test/SHERWOOD_V2_TESTING.md\":104,\"test/Sherwood.t.sol\":910,\"test/SherwoodFork.t.sol\":132,\"test/SherwoodV2.t.sol\":2499,\"test/SherwoodV2Accounting.t.sol\":288,\"test/SherwoodV2BuybackHook.t.sol\":90,\"test/SherwoodV2Fork.t.sol\":270,\"test/SherwoodV2Invariant.t.sol\":190,\"test/SherwoodV2LargeBoardKing.t.sol\":241,\"test/SherwoodV2LaunchConfig.t.sol\":179,\"test/SherwoodV2Launcher.t.sol\":78,\"test/SherwoodV2LauncherFork.t.sol\":117,\"test/SherwoodV2Lifecycle.t.sol\":248,\"test/SherwoodV2UnknownReign.t.sol\":438,\"test/SherwoodV2UnknownReignKing.t.sol\":132,\"test/helpers/MockHolderHook.sol\":43,\"test/helpers/SherwoodV2Fixture.sol\":215,\"test/helpers/SherwoodV2Handler.sol\":331},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":9716,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-eth at src/Sherwood.sol:416: Reentrancy in Sherwood._requestFlip(uint256,address,address,uint256,uint256,uint256) (src/Sherwood.sol#416-447):\n[high/medium] reentrancy-eth at src/Sherwood.sol:327: Reentrancy in Sherwood._play(uint256,address,uint256,bytes) (src/Sherwood.sol#327-388):\n[high/medium] reentrancy-eth at src/SherwoodV2.sol:677: Reentrancy in SherwoodV2._requestFlip(uint256,address,address,uint256,uint256,uint256) (src/SherwoodV2.sol#677-710):\n[high/medium] reentrancy-eth at src/SherwoodV2.sol:513: Reentrancy in SherwoodV2._play(uint256,address,uint256,bytes) (src/SherwoodV2.sol#513-589):\n[medium/medium] divide-before-multiply at src/Sherwood.sol:327: Sherwood._play(uint256,address,uint256,bytes) (src/Sherwood.sol#327-388) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/Sherwood.sol:327: Sherwood._play(uint256,address,uint256,bytes) (src/Sherwood.sol#327-388) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/SherwoodV2.sol:513: SherwoodV2._play(uint256,address,uint256,bytes) (src/SherwoodV2.sol#513-589) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/SherwoodV2.sol:513: SherwoodV2._play(uint256,address,uint256,bytes) (src/SherwoodV2.sol#513-589) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/SherwoodV2.sol:646: SherwoodV2.welcomeBonusActive(uint256,address) (src/SherwoodV2.sol#646-648) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Sherwood.sol:327: Sherwood._play(uint256,address,uint256,bytes) (src/Sherwood.sol#327-388) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Sherwood.sol:644: Sherwood.claimReferral() (src/Sherwood.sol#644-651) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SherwoodV2.sol:593: SherwoodV2._limit(uint256,address,uint256,SherwoodV2.Move) (src/SherwoodV2.sol#593-614) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Sherwood.sol:391: Sherwood.welcomeBonusActive(uint256,address) (src/Sherwood.sol#391-393) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SherwoodV2.sol:885: SherwoodV2._outreigns(uint256,address,uint256,address,uint256) (src/SherwoodV2.sol#885-887) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SherwoodV2.sol:593: SherwoodV2._limit(uint256,address,uint256,SherwoodV2.Move) (src/SherwoodV2.sol#593-614) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Sherwood.sol:544: Sherwood.settle(uint256,uint256) (src/Sherwood.sol#544-612) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Sherwood.sol:396: Sherwood.holderBonusActive(uint256,address) (src/Sherwood.sol#396-400) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SherwoodV2.sol:651: SherwoodV2.holderBonusActive(uint256,address) (src/SherwoodV2.sol#651-655) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SherwoodV2.sol:893: SherwoodV2.settle(uint256,uint256) (src/SherwoodV2.sol#893-993) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SherwoodV2.sol:593: SherwoodV2._limit(uint256,address,uint256,SherwoodV2.Move) (src/SherwoodV2.sol#593-614) uses a dangerous strict equality:\n[medium/medium] uninitialized-local at src/Sherwood.sol:420: Sherwood._requestFlip(uint256,address,address,uint256,uint256,uint256).diceFee (src/Sherwood.sol#420) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Sherwood.sol:618: Sherwood.claim(uint256).amount (src/Sherwood.sol#618) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Sherwood.sol:506: Sherwood._currentLeader(uint256).best (src/Sherwood.sol#506) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Sherwood.sol:347: Sherwood._play(uint256,address,uint256,bytes).target (src/Sherwood.sol#347) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Sherwood.sol:576: Sherwood.settle(uint256,uint256).awarded (src/Sherwood.sol#576) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SherwoodV2.sol:1046: SherwoodV2.sweepUnclaimed(uint256).amount (src/SherwoodV2.sol#1046) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SherwoodV2.sol:492: SherwoodV2.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes).fee (src/SherwoodV2.sol#492) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SherwoodV2.sol:681: SherwoodV2._requestFlip(uint256,address,address,uint256,uint256,uint256).diceFee (src/SherwoodV2.sol#681) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Sherwood.sol:428: Sherwood._requestFlip(uint256,address,address,uint256,uint256,uint256).sequence (src/Sherwood.sol#428) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SherwoodV2.sol:1266: SherwoodV2.kingOfTheHill(uint256).bestReign (src/SherwoodV2.sol#1266) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Sherwood.sol:308: Sherwood.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes).fee (src/Sherwood.sol#308) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SherwoodV2.sol:956: SherwoodV2.settle(uint256,uint256).awarded (src/SherwoodV2.sol#956) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Sherwood.sol:348: Sherwood._play(uint256,address,uint256,bytes).moved (src/Sherwood.sol#348) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SherwoodV2.sol:539: SherwoodV2._play(uint256,address,uint256,bytes).moved (src/SherwoodV2.sol#539) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SherwoodV2.sol:538: SherwoodV2._play(uint256,address,uint256,bytes).target (src/SherwoodV2.sol#538) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Sherwood.sol:659: Sherwood.sweepUnclaimed(uint256).amount (src/Sherwood.sol#659) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SherwoodV2.sol:690: SherwoodV2._requestFlip(uint256,address,address,uint256,uint256,uint256).sequence (src/SherwoodV2.sol#690) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SherwoodV2.sol:1005: SherwoodV2.claim(uint256).amount (src/SherwoodV2.sol#1005) is a local variable never initialized\n[medium/medium] unused-return at src/Sherwood.sol:682: Sherwood.unlockCallback(bytes) (src/Sherwood.sol#682-695) ignores return value by poolManager.settle{value: ethPaid}() (src/Sherwood.sol#691)\n[medium/medium] unused-return at src/SherwoodV2.sol:1080: SherwoodV2.unlockCallback(bytes) (src/SherwoodV2.sol#1080-1101) ignores return value by poolManager.settle{value: ethPaid}() (src/SherwoodV2.sol#1093)\n[low/high] shadowing-local at src/SherwoodV2.sol:1166: SherwoodV2._play(uint256,address,uint256,bytes).leader (src/SherwoodV2.sol#559) shadows:\n[low/high] shadowing-local at src/SherwoodV2.sol:1166: SherwoodV2._lowestRecent(uint256,address).leader (src/SherwoodV2.sol#871) shadows:\n[low/high] shadowing-local at src/Sherwood.sol:750: Sherwood._credit(uint256,address,uint256).leader (src/Sherwood.sol#490) shadows:\n[low/high] shadowing-local at src/Sherwood.sol:764: Sherwood.buybackAndBurn(uint256,uint256).result (src/Sherwood.sol#677) shadows:\n[low/high] shadowing-local at src/SherwoodV2.sol:1166: SherwoodV2._setReign(uint256,address).leader (src/SherwoodV2.sol#831) shadows:\n[low/high] shadowing-local at src/Sherwood.sol:750: Sherwood._currentLeader(uint256).leader (src/Sherwood.sol#501) shadows:\n[low/high] shadowing-local at src/Sherwood.sol:750: Sherwood._play(uint256,address,uint256,bytes).leader (src/Sherwood.sol#364) shadows:\n[low/high] shadowing-local at src/SherwoodV2.sol:1166: SherwoodV2._credit(uint256,address,uint256).leader (src/SherwoodV2.sol#763) shadows:\n[low/high] shadowing-local at src/SherwoodV2.sol:1166: SherwoodV2._scan(uint256,bool).leader (src/SherwoodV2.sol#798) shadows:\n[low/high] shadowing-local at src/Sherwood.sol:750: Sherwood._lowestRecent(uint256,address).leader (src/Sherwood.sol#529) shadows:\n[low/medium] events-maths at src/Sherwood.sol:225: Sherwood.receive() (src/Sherwood.sol#225-228) should emit an event for: \n[low/medium] events-maths at src/Sherwood.sol:682: Sherwood.unlockCallback(bytes) (src/Sherwood.sol#682-695) should emit an event for: \n[low/medium] events-maths at src/SherwoodV2.sol:1080: SherwoodV2.unlockCallback(bytes) (src/SherwoodV2.sol#1080-1101) should emit an event for: \n[low/medium] events-maths at src/SherwoodV2.sol:395: SherwoodV2.receive() (src/SherwoodV2.sol#395-398) should emit an event for: \n[low/medium] missing-zero-check at src/SherwoodV2.sol:1126: SherwoodV2.setOwner(address).next (src/SherwoodV2.sol#1126) lacks a zero-check on :\n[low/medium] missing-zero-check at src/SherwoodV2.sol:376: SherwoodV2.constructor(IPoolManager,Currency,Currency,uint256,IDiceEntropy,address,address,uint256)._diceProvider (src/SherwoodV2.sol#376) lacks a zero-check on :\n[low/medium] missing-zero-check at src/SherwoodV2.sol:377: SherwoodV2.constructor(IPoolManager,Currency,Currency,uint256,IDiceEntropy,address,address,uint256)._owner (src/SherwoodV2.sol#377) lacks a zero-check on :\n[low/medium] missing-zero-check at src/Sherwood.sol:710: Sherwood.setOperator(address).next (src/Sherwood.sol#710) lacks a zero-check on :\n[low/medium] missing-zero-check at src/Sherwood.sol:213: Sherwood.constructor(IPoolManager,Currency,IDiceEntropy,address,address)._owner (src/Sherwood.sol#213) lacks a zero-check on :\n[low/medium] missing-zero-check at src/SherwoodV2.sol:1139: SherwoodV2.setOperator(address).next (src/SherwoodV2.sol#1139) lacks a zero-check on :\n[low/medium] missing-zero-check at src/Sherwood.sol:213: Sherwood.constructor(IPoolManager,Currency,IDiceEntropy,address,address)._diceProvider (src/Sherwood.sol#213) lacks a zero-check on :\n[low/medium] missing-zero-check at src/Sherwood.sol:705: Sherwood.setOwner(address).next (src/Sherwood.sol#705) lacks a zero-check on :\n[low/medium] calls-loop at src/Sherwood.sol:544: Sherwood.settle(uint256,uint256) (src/Sherwood.sol#544-612) has external calls inside a loop: balance = IBalanceOf(Currency.unwrap(pfwa)).balanceOf(winner) (src/Sherwood.sol#584)\n[low/medium] calls-loop at src/SherwoodV2.sol:893: SherwoodV2.settle(uint256,uint256) (src/SherwoodV2.sol#893-993) has external calls inside a loop: balance = IBalanceOf(Currency.unwrap(token)).balanceOf(winner) (src/SherwoodV2.sol#964)\n[low/medium] reentrancy-benign at src/Sherwood.sol:416: Reentrancy in Sherwood._requestFlip(uint256,address,address,uint256,uint256,uint256) (src/Sherwood.sol#416-447):\n[low/medium] reentrancy-benign at src/Sherwood.sol:268: Reentrancy in Sherwood.beforeSwap(address,PoolKey,SwapParams,bytes) (src/Sherwood.sol#268-287):\n[low/medium] reentrancy-benign at src/Sherwood.sol:327: Reentrancy in Sherwood._play(uint256,address,uint256,bytes) (src/Sherwood.sol#327-388):\n[low/medium] reentrancy-benign at src/SherwoodV2.sol:451: Reentrancy in SherwoodV2.beforeSwap(address,PoolKey,SwapParams,bytes) (src/SherwoodV2.sol#451-470):\n[low/medium] reentrancy-benign at src/Sherwood.sol:268: Reentrancy in Sherwood.beforeSwap(address,PoolKey,SwapParams,bytes) (src/Sherwood.sol#268-287):\n[low/medium] reentrancy-benign at src/SherwoodV2.sol:677: Reentrancy in SherwoodV2._requestFlip(uint256,address,address,uint256,uint256,uint256) (src/SherwoodV2.sol#677-710):\n[low/medium] reentrancy-benign at src/SherwoodV2.sol:473: Reentrancy in SherwoodV2.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/SherwoodV2.sol#473-509):\n[low/medium] reentrancy-benign at src/Sherwood.sol:682: Reentrancy in Sherwood.unlockCallback(bytes) (src/Sherwood.sol#682-695):\n[low/medium] reentrancy-benign at src/Sherwood.sol:290: Reentrancy in Sherwood.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/Sherwood.sol#290-323):\n[low/medium] reentrancy-benign at src/SherwoodV2.sol:513: Reentrancy in SherwoodV2._play(uint256,address,uint256,bytes) (src/SherwoodV2.sol#513-589):\n[low/medium] reentrancy-benign at src/SherwoodV2.sol:1080: Reentrancy in SherwoodV2.unlockCallback(bytes) (src/SherwoodV2.sol#1080-1101):\n[low/medium] reentrancy-benign at src/SherwoodV2.sol:451: Reentrancy in SherwoodV2.beforeSwap(address,PoolKey,SwapParams,bytes) (src/SherwoodV2.sol#451-470):\n[low/medium] reentrancy-events at src/Sherwood.sol:268: Reentrancy in Sherwood.beforeSwap(address,PoolKey,SwapParams,bytes) (src/Sherwood.sol#268-287):\n[low/medium] reentrancy-events at src/SherwoodV2.sol:1060: Reentrancy in SherwoodV2.buybackAndBurn(uint256,uint256) (src/SherwoodV2.sol#1060-1067):\n[low/medium] reentrancy-events at src/Sherwood.sol:416: Reentrancy in Sherwood._requestFlip(uint256,address,address,uint256,uint256,uint256) (src/Sherwood.sol#416-447):\n[low/medium] reentrancy-events at src/Sherwood.sol:673: Reentrancy in Sherwood.buybackAndBurn(uint256,uint256) (src/Sherwood.sol#673-680):\n[low/medium] reentrancy-events at src/SherwoodV2.sol:473: Reentrancy in SherwoodV2.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/SherwoodV2.sol#473-509):\n[low/medium] reentrancy-events at src/Sherwood.sol:290: Reentrancy in Sherwood.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/Sherwood.sol#290-323):\n[low/medium] reentrancy-events at src/Sherwood.sol:614: Reentrancy in Sherwood.claim(uint256) (src/Sherwood.sol#614-634):\n[low/medium] reentrancy-events at src/SherwoodV2.sol:451: Reentrancy in SherwoodV2.beforeSwap(address,PoolKey,SwapParams,bytes) (src/SherwoodV2.sol#451-470):\n[low/medium] reentrancy-events at src/SherwoodV2.sol:677: Reentrancy in SherwoodV2._requestFlip(uint256,address,address,uint256,uint256,uint256) (src/SherwoodV2.sol#677-710):\n[low/medium] reentrancy-events at src/SherwoodV2.sol:1070: Reentrancy in SherwoodV2.buybackAndBurnHost(uint256,uint256) (src/SherwoodV2.sol#1070-1077):\n[low/medium] reentrancy-events at src/Sherwood.sol:268: Reentrancy in Sherwood.beforeSwap(address,PoolKey,SwapParams,bytes) (src/Sherwood.sol#268-287):\n[low/medium] reentrancy-events at src/Sherwood.sol:644: Reentrancy in Sherwood.claimReferral() (src/Sherwood.sol#644-651):\n[low/medium] reentrancy-events at src/SherwoodV2.sol:451: Reentrancy in SherwoodV2.beforeSwap(address,PoolKey,SwapParams,bytes) (src/SherwoodV2.sol#451-470):\n[low/medium] reentrancy-events at src/SherwoodV2.sol:513: Reentrancy in SherwoodV2._play(uint256,address,uint256,bytes) (src/SherwoodV2.sol#513-589):\n[low/medium] reentrancy-events at src/Sherwood.sol:327: Reentrancy in Sherwood._play(uint256,address,uint256,bytes) (src/Sherwood.sol#327-388):\n[low/medium] timestamp at src/Sherwood.sol:391: Sherwood.welcomeBonusActive(uint256,address) (src/Sherwood.sol#391-393) uses timestamp for comparisons\n[low/medium] timestamp at src/SherwoodV2.sol:1242: SherwoodV2._nextCharge(uint256,uint256,uint256) (src/SherwoodV2.sol#1242-1245) uses timestamp for comparisons\n[low/medium] timestamp at src/Sherwood.sol:450: Sherwood._entropyCallback(uint64,address,bytes32) (src/Sherwood.sol#450-463) uses timestamp for comparisons\n[low/medium] timestamp at src/SherwoodV2.sol:1041: SherwoodV2.sweepUnclaimed(uint256) (src/SherwoodV2.sol#1041-1055) uses timestamp for comparisons\n[low/medium] timestamp at src/SherwoodV2.sol:422: SherwoodV2.currentRound() (src/SherwoodV2.sol#422-424) uses timestamp for comparisons\n[low/medium] timestamp at src/SherwoodV2.sol:831: SherwoodV2._setReign(uint256,address) (src/SherwoodV2.sol#831-849) uses timestamp for comparisons\n[low/medium] timestamp at src/SherwoodV2.sol:641: SherwoodV2.shieldActive(address) (src/SherwoodV2.sol#641-643) uses timestamp for comparisons\n[low/medium] timestamp at src/SherwoodV2.so","passed":true},{"durationMs":664,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/SherwoodV2Launcher.sol:37: `abi.encodePacked()` Hash Collision\n[high] eth-send-unchecked-address at src/Sherwood.sol:644: ETH transferred without address checks (2 places)\n[high] reentrancy-state-change at src/Sherwood.sol:281: Reentrancy: State change after external call (14 places)\n[high] reused-contract-name at src/Sherwood.sol:15: Contract Name Reused in Different Files (4 places)\n[high] unsafe-casting at src/SherwoodV2.sol:943: Unsafe Casting of integers\n[high] weak-randomness at src/Sherwood.sol:427: Weak Randomness (2 places)\n[low] centralization-risk at src/Sherwood.sol:705: Centralization Risk (5 places)\n[low] costly-loop at src/Sherwood.sol:555: Costly operations inside loop (8 places)\n[low] large-numeric-literal at src/Sherwood.sol:63: Large Numeric Literal (39 places)\n[low] literal-instead-of-constant at src/Sherwood.sol:278: Literal Instead of Constant (56 places)\n[low] push-zero-opcode at src/SherwoodV2Launcher.sol:2: PUSH0 Opcode\n[low] require-revert-in-loop at src/Sherwood.sol:620: Loop Contains `require`/`revert` (2 places)\n[low] state-change-without-event at src/Sherwood.sol:257: State Change Without Event (4 places)\n[low] state-no-address-check at src/Sherwood.sol:218: Address State Variable Set Without Checks (8 places)\n[low] unchecked-return at src/SherwoodV2.sol:359: Unchecked Return\n[low] unspecific-solidity-pragma at src/SherwoodV2Launcher.sol:2: Unspecific Solidity Pragma\n[low] unused-public-function at src/SherwoodV2.sol:427: Public Function Not Used Internally\n[low] unused-state-variable at src/SherwoodV2Launcher.sol:17: Unused State Variable","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"fb2918c9239910cd78c17bcd079e72fa497cf6bf50685bdc971d7ede3ef39095","verifiedTreeHash":"6bdf11844e29eede04b195ee161cfe6861cb4515","verifierVersion":"0.1.0+fb8278c5"}]}