{"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":"d236400b-4e28-4cee-b921-82dddf964f29","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"650bde08ada3507c9055b78a8a8068dfcbea7a9ead72772c588a150ea7f5ab63","dependsOn":["build_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":"0a1fc8c0d1c090decac7985e1ca717ede46a0067f61334477b85bc84d7377bca","dependsOn":["build_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":"d9ade279d518e5d82de1b40abadf2ae4482f2ca6375c4e01f8371d32cef70b2f","dependsOn":["build_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":"3e156768761a64df31f5b55ab8a5c94598b48a4c97be8236d8d203ca4b3437c5","dependsOn":["build_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":"80baea5c2d9e2b42fe0419242852e192ba83c5097e9c428dcd4d68e15ea4a0f9","dependsOn":["build_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":"07e7274666db490d7274fac35b7cd56fecb833e7e3723d91fedd47935a8c24c6","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"e9085b309a747a4b3434c8ef5f57a34aadc0a0b055c4ef60f4efd92331446aab","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"a59b9d52de04335a937717a44e95f21e5f9e89bf01b891936efa25f4f40ad3c3","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"PvP Pad v3 on Robinhood Chain (4663): launchpad where every launch is a fast Spireth game; all payments in ETH.\n\nDECISION (final): contracts only. This launch mints NO token at deployment: no token name or symbol, no pool, no distributor; all tokens (PvP included) are created later by the pad itself. No website or URL in this job; a later job.continue builds it.\n\nBASE: a fresh deployment of github.com/identity-md-launches/launch-1715-pvp-pad-v2-robinhood @cf4835d5388d5025c282a3cc59426fd730eaf88f (launch 1715, deployed, never opened). Keep everything in that repo (contracts, deploy order, constructor args, launch.json, foundry.toml, raffle, real v4-core tests, every fix in docs/AUDIT.md) except the changes below, which fix the external audit in job 5c4ec689 (report: api.imdnotdead.fun/jobs/5c4ec689-085b-4d72-8807-668b284d3222/report.md). Deploy rules still hold: one transaction under 16,777,216 gas (target <13M incl. later openPad), each runtime <24,576 bytes, constructors call nothing outside the manifest, nothing called after deployment.\n\nFIX 1, KING SETTLEMENT (High, KingOfThePad.sol:76): a bid from inside PoolManager.unlock makes every pre-crown collectPool revert AlreadyUnlocked, distribute swallows it, and the outgoing king loses its fees.\n- takeCrown and distribute revert while the PoolManager is unlocked: read v4's Lock transient slot via exttload (slot from the vendored v4-core Lock.sol).\n- Before the try, require enough gasleft() that the pre-crown settlement cannot be starved.\n- If any pre-crown collection fails, takeCrown reverts, except pools flagged broken after 3 failed collections in different blocks (skipped, retryable by anyone), so one dead pool cannot freeze the crown.\n\nFIX 2, KING FEES IN KIND (Medium, PadLiquidity.sol:310): stop selling fee tokens. collectPool sends ETH fees (gas-capped push, claimable fallback) and token fees (plain transfer) straight to the current king. Remove SELL_CHUNK, tokenStash and the fee-sale swap, so nothing from a reign is left for the next king and the protocol stops selling every coin. Before the first crown, distribute does nothing and fees keep accruing in the positions. Pre-crown settlement covers as many pools as fit a measured gas budget, at least 16.\n\nFIX 3, ROLL RESOLUTION (Medium, PadGame.sol:507): the chain runs ~10 L2 blocks/s, so the 256-block hash window is ~26 s against the 60 s cooldown and unresolved rolls expire. Keep the 60 s cooldown and the expiry penalty (it stops withholding), and make resolving pay: roll split becomes 90% curve, 7% pot, 2% PvP burn (genesis: pot), 1% resolver tip, claimable by whoever resolves that roll, directly or through upkeep; an expired roll's tip goes to the pot. Raise the per-call resolution batch to 16, gas-capped.\n\nFIX 4, DRAW SEED (Low, PadGame.sol:179): no recommit. If the commit's hashes leave the window before anyone captures the seed, the seed becomes keccak(game, commit block, entry count), so a sole caller can never fish for a fresh seed. The first entry's fee stays in the game as a draw bounty for whoever captures the seed; all other entry fees still go to the burn.\n\nFIX 5, UPKEEP GAS (Low, PvPPad.sol:248): every upkeep sub-call (upkeepStep, distribute, burnChunk) gets an explicit gas cap and runs only while gasleft() still covers that cap plus a reserve for the caller's own action; otherwise it is skipped. enter() and roll() must never revert because of another game's upkeep.\n\nFIX 6, CARRY (Low, PadGame.sol:228): carry never moves at draw completion. It stays in PvPPad; at finalize a game with >= 5 living Imps pulls from it only up to its unused fundedReleaseCap(). The king's games share and unreleased funded ETH keep their v2 rules. Document that fundCarry is permissionless.\n\nTESTS: keep the real v4-core PoolManager suite and add the audit's proofs as regressions: takeCrown from inside PoolManager.unlock reverts; a gas-starved bid reverts; the outgoing king receives its ETH and token fees in kind; a broken pool does not block bids; a player rolling every 60 s at 10 blocks/s with a resolver loses no roll to expiry; tip, pot and burn accounting; expired rolls still penalised; a lapsed seed falls back deterministically and is never re-rolled; bounty paid once; enter() and roll() succeed with their own gas estimate while other games need draw, finalize and graduate work; the audit's five-wallet carry chain cannot take carry beyond the release cap.\n\nLAUNCH.JSON: same as the repo; args are strings, addresses lowercase. foundry.toml keeps bytecode_hash = \"none\", cbor_metadata = false. Validate it. Never deploy, broadcast or call RPCs.\n\nDELIVER: Foundry project; docs/AUDIT.md mapping each audit finding to its fix and test; test report with gas; docs/VERIFY.md (robin.etherscan.io); README: an independent audit before public launch.","parentJobId":null,"planHash":"93515a5917339c965b5a98c8a26af6bf92a7b7d46eb353acc6b936a568075440","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"d236400b-4e28-4cee-b921-82dddf964f29","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1764-pvp-pad-v3-robinhood"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52598","feedbackHash":"82fb1cd19de0a4e5e46d0513623d19f89cbfb33fc5d883888122dbb7feb53c80","nodeKey":"audit_economics","submissionHash":"650bde08ada3507c9055b78a8a8068dfcbea7a9ead72772c588a150ea7f5ab63","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52207","feedbackHash":"5cefaf1461ae08f91c641b333dcf5bca1b1f3c438e6957acd4cf7cf09a16a856","nodeKey":"audit_flow","submissionHash":"0a1fc8c0d1c090decac7985e1ca717ede46a0067f61334477b85bc84d7377bca","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52552","feedbackHash":"8b600f2ed21c4259cf82a7c04fa0c9a8cb2516a68d49259cfb56d6270074bd7c","nodeKey":"audit_judge","submissionHash":"d9ade279d518e5d82de1b40abadf2ae4482f2ca6375c4e01f8371d32cef70b2f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52121","feedbackHash":"bd8c3c8f0cd8c5005fd303f9e2c3e13b3dd3bb811ae567e8a4754977c0b06f5a","nodeKey":"audit_judge","submissionHash":"0f9b22e8625791a141557c7a9b6831b105bd584169fb0b9ddd98fcbab2f30550","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52419","feedbackHash":"e0314098a1e2adcdbc173b18dfc2c7f80eb3f0547e2052f6b4dbddd8dbb6923e","nodeKey":"audit_math","submissionHash":"3e156768761a64df31f5b55ab8a5c94598b48a4c97be8236d8d203ca4b3437c5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52222","feedbackHash":"1a068e5f25374fa1d9887340ee504b1c9488f43d328610658fa1ff7f9e0b10a4","nodeKey":"audit_permissions","submissionHash":"80baea5c2d9e2b42fe0419242852e192ba83c5097e9c428dcd4d68e15ea4a0f9","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51296","feedbackHash":"fc40f20484f771650741b4888adab2bf6213d5ce7f40a573205228e055feaa4f","nodeKey":"build_contract_project","submissionHash":"5e863bb2bc1e67872cb618e36a6a0a73da47e6789ce635b5d1c100616bb82841","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52270","feedbackHash":"1d32bb357fc441df6e98d2fb96e1e72827b1cb2f226626451b31467c1e124baa","nodeKey":"build_contract_project","submissionHash":"07e7274666db490d7274fac35b7cd56fecb833e7e3723d91fedd47935a8c24c6","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51494","feedbackHash":"fd77b1df26a12daa736606f119bb21536e34f5e39b6abb2cefda68364ecfefb4","nodeKey":"manifest","submissionHash":"e9085b309a747a4b3434c8ef5f57a34aadc0a0b055c4ef60f4efd92331446aab","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51066","feedbackHash":"7e9d4fc46b78977abbabf9af6bdcd4f8b27d570a0169e61c788e9f227e447d93","nodeKey":"manifest","submissionHash":"c09b1bdaa2ff12bfeb135a422b09ded989cdb20220cd6c5e07a2a8832e898ee0","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51518","feedbackHash":"433d44375e8372e9db64a1285cdb00192b3bf124bb1f016c549a6f04bb1d65e4","nodeKey":"write_foundry_tests","submissionHash":"fd7db357054ba0345d59e8c0e315923154d54af55b3b04896fd0a556864844d8","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52396","feedbackHash":"6c7366b9c2282cf3908956d4636620e77c9060aed5b6c0dded4346ed35c21168","nodeKey":"write_foundry_tests","submissionHash":"a59b9d52de04335a937717a44e95f21e5f9e89bf01b891936efa25f4f40ad3c3","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"5ee05786c412b447596c772020c54ab37a66089ece143871eda7663d0d2971c6","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"320b2dfafbe1134d96006cd3a9e1bc4f1ff1ee4a364d85598455b50b745fc0ae","device":"f9a12c57a094ca8d","findings":[],"hash":"07e7274666db490d7274fac35b7cd56fecb833e7e3723d91fedd47935a8c24c6","nodeId":"b702c960-23bb-4d60-ab9a-8c5efd582553","outcome":"completed","summary":"Everything is green and the work is complete. Final state:\n\n**Finding 8b022036 (medium, pre-crown settlement): fixed and verified.** The reviewer's proof failed on the starting tree exactly as reported (the bidder gained 0.1 ETH of the old reign inside its own bid) and passes now. Two changes in the contracts:\n\n- `settleCrown` in `src/PadLiquidity.sol` now walks every pool from the cursor while the forwarded gas fits another collection, and reverts only if fewer than 16 pools were visited. `takeCrown` forwards all gas above its 600k reserve instead of a fixed 5M, so a bid can settle more pools by sending more gas (5M remains the minimum).\n- Each settlement closes a reign. PadLiquidity records the outgoing king per reign and stamps every pool with the reign it is settled for. A pool the walk did not reach, or that was flagged broken, keeps its old stamp, and its next collection by anyone pays that reign's king instead of the new one. The bidder can neither starve the walk nor steer the cursor to pick pools, whatever the pool count.\n\n**Finding 779d74d2 (low, fallback seed): disputed.** It reproduces as described, but the formula is the one the brief prescribes for Fix 4, the limitation was already disclosed, and the suggested replacement inputs are equally observable by the first committer. Recorded as item 30 in docs/AUDIT.md with the reasoning and the keeper mitigation.\n\n**Checks run locally:**\n\n| Check | Result |\n|---|---|\n| forge build, forge fmt --check, manifest validator | pass |\n| forge test with the verifier's fuzz seed | 181 passed, 0 failed, 15 suites |\n| Reviewer's proof (copied under test/scratch) | pass |\n| Deployment plus later openPad gas | 12,974,791 (target 13M) |\n| Largest runtime (PadGame) | 18,665 bytes |\n\nKeeping the deployment under the 13M target needed two size measures: the reign stamp is packed beside `liquidity`, and ten PadLiquidity constants that no contract or test reads became internal with unchanged values.\n\n**Tests:** new `test/CrownSettlement.t.sol` (seven tests: the cursor-steering scenario on 18 real pools, 60 real pools with a minimum-gas bid where 41 settle and the rest are later paid to the old king, 60 pools fully settled with a generous bid, the 16-pool floor revert, non-king settlement, first-crown reign, and a broken pool skipped by two crowns paid to the earliest reign). Three existing tests that asserted the old 16-pool cap or paid a retried broken pool to the new king were updated to the fixed semantics.\n\n**Docs:** README crown section and gas table, docs/AUDIT.md items 3, 21, 29 and 30, docs/TEST-REPORT.md counts, gas and sizes. The answers to both findings are in `.imd-responses.json`. foundry.toml, remappings.txt and launch.json are untouched.\n\nOne documented imprecision remains by design: fees an unreached pool earns between the crown change and its next collection also go to the earlier king, which the new king avoids by collecting promptly.","treeHash":"19896f1a3fcd8ec4e591492b2d973ae8d14b221a","usage":{"cachedInputTokens":3529242,"inputTokens":898,"model":"claude-fable-5-1","outputTokens":70348,"runtime":"claude","turns":81,"wallClockMs":2326706}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f009de0ce52c7b3a","findings":[{"citation":"resolved","description":"The manifest notes are the text published with the deployment and the only prose a verifier or site reads next to the constructor arguments. Three statements in them contradict the accepted v3 tree: (1) 'collect up to 8 pools for the outgoing king' while PadLiquidity.MAX_DISTRIBUTE_POOLS (src/PadLiquidity.sol:41) is 16 and settleCrown collects min(16, poolCount); (2) 'V2 entries cost exactly 0.001 ETH ... and all fund the burn bucket' while PadGame.enter (src/PadGame.sol:166) keeps the first entry fee as drawBounty and pays it to whoever captures the seed; (3) 'the carry pot moves into a game only when its raffle seats >= 5 Imps' while v3 (Fix 6) never moves carry at the draw and PadGame._finalize (src/PadGame.sol:572-575) pulls it only at finalization with >= 5 living Imps, up to the unused release cap. The notes also still title the launch 'PvP Pad v2'. No funds are at risk, but the published description of king settlement, entry economics and carry custody is wrong, and the task requires launch.json to be validated as describing the accepted implementation.","line":36,"path":"launch.json","reproduction":"Read launch.json line 36 and compare with the code: `grep -n MAX_DISTRIBUTE_POOLS src/PadLiquidity.sol` prints 16, not 8; `sed -n 160,170p src/PadGame.sol` shows `if (first) drawBounty = msg.value; else IPadLiquidity(liquidity).fundBurn{value: msg.value}();` so the first entry does not fund the burn; `sed -n 570,576p src/PadGame.sol` shows carry is pulled inside _finalize, and test AuditV3CarryUpkeepTest.test_fiveWalletNoRollChainNeverTakesCarry asserts `pad.carryPot()` is unchanged after a 5-seat draw completes. Expected: notes match the deployed behavior (16 pools, first entry fee is the draw bounty, carry pulled at finalize). Actual: notes state the v2 rules. tools/validate_manifest.py accepts the file because it checks only schema and length (2,356 chars), not content.","severity":"low","snippet":"Before dethroning, collect up to 8 pools for the outgoing king, isolating pool failures; a bid while PadLiquidity is locked reverts instead of skipping that payment. Funded ETH (carry, king share) is released at most min(3x roll pot, 15% of curve ETH) with >= 5 living Imps; the carry pot moves into a game only when its raffle seats >= 5 Imps","title":"launch.json notes describe v2 rules the v3 code no longer implements (8-pool settlement, all entries burn, carry moves at draw)"},{"citation":"resolved","description":"settleCrown calls _distribute(MAX_DISTRIBUTE_POOLS, true), which collects at most 16 consecutive pool indexes from distributeCursor before KingOfThePad.takeCrown overwrites `king`. Every pool outside that window keeps its accrued fees in the position; the next distribute (including the distribute(2) that takeCrown's own upkeepFor triggers a few lines later) reads IKingView(king).king(), which is now the new bidder, and pays those fees to them. The brief's Fix 2 states 'nothing from a reign is left for the next king'; the code honours that only while poolCount <= 16. docs/AUDIT.md item 21 discloses this as a limit, so it is reported for the record rather than as a defect: it is the accepted tradeoff for a bounded 5M gas settlement. Operators and the outgoing king should know that calling distribute themselves before being dethroned is the only way to realise fees in pools beyond the batch.","line":210,"path":"src/PadLiquidity.sol","reproduction":"State: genesis plus 16 more launches graduated (17 pools, indexes 0..16), distributeCursor = 0, king A crowned and 1 hour elapsed. Donate 0.1 ETH of fees to pool index 16 (any swap through its v4 pool). B calls takeCrown with 110% of A's bid: settleCrown collects indexes 0..15 only for A, distributeCursor becomes 16, king becomes B, and the trailing upkeep distribute(2) collects index 16 and pays its 0.1 ETH to B. Expected under the Fix 2 wording: A receives the fees earned during A's reign. Actual: B receives them. test/LiquidityV4.t.sol test_crownPrecollectsSixteenOfEighteenPools exercises the 16-of-18 split.","severity":"info","snippet":"        if (n > MAX_DISTRIBUTE_POOLS) n = MAX_DISTRIBUTE_POOLS;","title":"Pre-crown settlement is capped at 16 pool indexes per bid, so with 17+ graduated pools fees earned during the outgoing reign in the uncollected pools are paid to the incoming king"}],"hash":"0a1fc8c0d1c090decac7985e1ca717ede46a0067f61334477b85bc84d7377bca","nodeId":"44eb08f9-77f7-47d1-8c50-7f6e2fe0e234","outcome":"completed","summary":"The review is complete and the findings file is written. Both snippets anchor to the tree, the JSON parses, and the working tree is otherwise untouched (only the findings file, which is the deliverable).\n\n## Result\n\nThe control flow of PvP Pad v3 holds up in my area. I traced every state-changing entry point across KingOfThePad, PvPPad, PadLiquidity, PadGame, PadToken and PadHook, plus the PadLib helpers (clone, push, mulDiv, sqrt), and found no loss-of-funds or wrong-party-payment defect. The six external-audit fixes are implemented as specified, and the twelve AuditV3 regression tests pass on this tree with the 16-pool settlement measured at 4.57M gas inside the 5M stipend.\n\n**Findings written to `.imd-findings.json`** (2 findings, 43 coverage rows):\n\n1. **Low, launch.json line 36.** The manifest notes still describe v2 rules: \"collect up to 8 pools\" (code uses 16), \"all entries fund the burn bucket\" (the first entry fee is now the draw bounty), and \"carry moves into a game when its raffle seats >= 5\" (v3 pulls carry only at finalize). The validator passes because it checks schema and length only. The published description of settlement, entry economics and carry custody is wrong.\n2. **Info, PadLiquidity.sol line 210.** Pre-crown settlement covers at most 16 pool indexes, so with 17 or more pools, fees earned during the outgoing reign in the uncollected pools go to the incoming king on the next distribute. This is disclosed in AUDIT.md item 21 and matches the brief's \"at least 16\", so it is recorded for the judge rather than claimed as a defect.\n\n**What I verified and ruled out:** nested-unlock bids blocked by the exttload read on both paths; strict settlement reverts the whole bid on any unflagged failure or gas shortfall and no caller-reachable way to make a healthy pool's collection fail; in-kind payment to the king captured before the crown changes; claim locks cannot double-pay; roll split exact; expiry boundary at commit+258 matches ArbSys semantics; draw commit is single-shot with a deterministic fallback and a once-paid bounty; carry is pulled only inside finalize up to the unused cap; every upkeep sub-call is gated by cap plus the EIP-150 margin and try/caught, so enter and roll cannot revert on foreign work; one-shot binders rely on the atomic deployment, which is documented.\n\n**Static-analysis leads checked:** the mulDiv caret and divide-before-multiply are the standard OpenZeppelin algorithm, msg.value-in-loop in fundGames is correct remainder accounting, and the reentrancy flags are all behind guards or 30k gas pushes. None rose to a finding.\n\n**Not reached:** no fork of the live Robinhood PoolManager, so the deployed manager's exttload support and the 300k per-pool stipend against real chain state remain the deployer's pre-opening check, as AUDIT.md already states.","treeHash":null,"usage":{"cachedInputTokens":1369113,"inputTokens":292,"model":"claude-fable-5-1","outputTokens":59439,"runtime":"claude","turns":29,"wallClockMs":1236542}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bdd9b74dce66953d","findings":[{"citation":"resolved","description":"FIX 2 requires that nothing earned during a reign is left for the next king and that pre-crown settlement covers as many pools as fit the measured gas budget, at least 16. settleCrown() calls _distribute(MAX_DISTRIBUTE_POOLS, true) and _distribute clamps n to the constant 16 (src/PadLiquidity.sol:210) before it ever looks at gasleft(), so the 5,000,000-gas stipend forwarded by KingOfThePad.takeCrown (src/KingOfThePad.sol:76) is never used beyond 16 pools; a whole 18-pool bid measures about 2.5M gas on the real vendored PoolManager, roughly 125k per pool, so the stipend would fit about 35 pools. The uncollected pools are not merely deferred: takeCrown then sets king = msg.sender and ends with pad.upkeepFor(msg.sender) (src/KingOfThePad.sol:98), whose _upkeep runs IPadLiquidity(liquidity).distribute{gas: 750000}(2) (src/PvPPad.sol:247). That distribute reads IKingView(king).king(), which is now the bidder, and collects the next two round-robin pools, i.e. the first two the strict batch did not reach, paying every fee they accrued during the previous reign to the bidder in the bid transaction. The bidder can also call the public distribute(1..k) beforehand (it advances distributeCursor, src/PadLiquidity.sol:222) so the richest pools are the ones left outside the 16-index window, at no cost beyond paying the old king the thin pools it crosses. The old king has no claimable fallback for those pools. docs/AUDIT.md item 21 discloses 'more than 16 pools ... can pay a later king' but the constant cap is not the budget fit the brief asks for, and the diversion is bidder-triggered and bidder-chosen. Merged from audit_economics (medium), audit_permissions (low) and audit_flow (info): one root cause, the constant clamp at line 210 combined with the trailing distribute(2) after the king switch. Minimal fix preserving the design: in strict mode keep collecting while gasleft() >= COLLECT_GAS + COLLECTION_RESERVE_GAS up to poolCount (the brief's 'as many as fit'), and/or skip the liquidity distribute step in the upkeep that takeCrown itself triggers (or record the cursor settleCrown reached and let the new reign's collections start only from pools already settled).","line":210,"path":"src/PadLiquidity.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PadToken} from \"src/PadToken.sol\";\nimport {PadGame} from \"src/PadGame.sol\";\nimport {PvPPad} from \"src/PvPPad.sol\";\nimport {PadLiquidity} from \"src/PadLiquidity.sol\";\nimport {KingOfThePad} from \"src/KingOfThePad.sol\";\nimport {IPoolManager, IUnlockCallback, PoolKey} from \"src/interfaces/Interfaces.sol\";\nimport {PoolManager} from \"lib/v4-core/src/PoolManager.sol\";\nimport {IPoolManager as V4Manager} from \"lib/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey as V4Key} from \"lib/v4-core/src/types/PoolKey.sol\";\nimport {BalanceDelta} from \"lib/v4-core/src/types/BalanceDelta.sol\";\n\ncontract ArbSysStub {\n    uint256 public number = 1000;\n\n    function advance(uint256 n) external {\n        number += n;\n    }\n\n    function arbBlockNumber() external view returns (uint256) {\n        return number;\n    }\n\n    function arbBlockHash(uint256 n) external view returns (bytes32) {\n        require(n < number && n + 256 >= number, \"invalid block number\");\n        return keccak256(abi.encode(\"arb\", n));\n    }\n}\n\n/// @dev Donates ETH fees to a real v4 pool so the pad's full-range position accrues them.\ncontract Donor is IUnlockCallback {\n    IPoolManager immutable manager;\n\n    constructor(IPoolManager m) {\n        manager = m;\n    }\n\n    receive() external payable {}\n\n    function donate(PoolKey memory key, uint256 e) external {\n        manager.unlock(abi.encode(key, e));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n        (PoolKey memory key, uint256 e) = abi.decode(data, (PoolKey, uint256));\n        V4Key memory vkey = abi.decode(abi.encode(key), (V4Key));\n        V4Manager(address(manager)).donate(vkey, e, 0, \"\");\n        manager.sync(address(0));\n        manager.settle{value: e}();\n        return \"\";\n    }\n}\n\n/// @notice With more than 16 graduated pools, a bid's own trailing upkeep pays fees accrued during\n/// the outgoing king's reign to the new king, and the bidder picks which pools with a public\n/// distribute(1) call beforehand. Fails on the current code; passes once the pre-crown settlement\n/// stops leaving reign fees collectible by the next king inside the same bid.\ncontract CrownDiversionProof is Test {\n    address constant OWNER = 0x5b95A971B4583A5f011E9DA082acdD679b870D06;\n    ArbSysStub arb;\n    IPoolManager pm;\n    PvPPad pad;\n    PadLiquidity liq;\n    KingOfThePad king;\n    Donor donor;\n    address oldKing = address(0xA8);\n    address bidder = address(0xA9);\n    address roller = address(0xA0);\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        ArbSysStub impl = new ArbSysStub();\n        vm.etch(address(0x64), address(impl).code);\n        arb = ArbSysStub(address(0x64));\n        pm = IPoolManager(address(new PoolManager(OWNER)));\n        PadToken t = new PadToken();\n        PadGame g = new PadGame();\n        pad = new PvPPad(OWNER, address(t), address(g));\n        liq = new PadLiquidity(address(pm), address(pad));\n        king = new KingOfThePad(address(pad), address(liq), OWNER);\n        donor = new Donor(pm);\n        vm.deal(oldKing, 10 ether);\n        vm.deal(bidder, 10 ether);\n        vm.deal(roller, 10 ether);\n        vm.deal(address(donor), 10 ether);\n        bytes32 salt = _mineSalt();\n        vm.prank(OWNER);\n        pad.openPad(salt);\n        _playAndGraduate(PadGame(pad.gameOf(1)));\n        for (uint256 i; i < 17; ++i) {\n            _playAndGraduate(PadGame(pad.gameOf(pad.launch(\"Pool\", \"P\", \"\"))));\n        }\n        assertEq(liq.poolCount(), 18);\n    }\n\n    function test_bidTransactionMustNotPayOldReignFeesToTheBidder() public {\n        vm.prank(oldKing);\n        king.takeCrown{value: 0.01 ether}();\n        vm.warp(king.challengeOpensAt());\n        // Bidder steers the public round-robin cursor by one thin pool.\n        vm.prank(bidder);\n        liq.distribute(1);\n        uint256 c = liq.distributeCursor();\n        uint256 rich1 = (c + 16) % 18;\n        uint256 rich2 = (c + 17) % 18;\n        for (uint256 i; i < 18; ++i) {\n            bool rich = i == rich1 || i == rich2;\n            donor.donate(liq.poolKey(liq.getPool(i).token), rich ? 0.05 ether : 0.0001 ether);\n        }\n        uint256 bidBefore = bidder.balance;\n        vm.prank(bidder);\n        king.takeCrown{value: 0.011 ether}();\n        assertEq(king.king(), bidder);\n        uint256 bidderGain = bidder.balance + 0.011 ether - bidBefore;\n        emit log_named_uint(\"bidder received inside its own bid tx\", bidderGain);\n        assertEq(bidderGain, 0, \"fees accrued under the old king were paid to the new king in the bid tx\");\n    }\n\n    // ---- helpers ---------------------------------------------------------------------------------\n    function _playAndGraduate(PadGame game) internal {\n        vm.prank(roller);\n        game.enter{value: 0.001 ether}();\n        vm.warp(vm.getBlockTimestamp() + 10 minutes);\n        arb.advance(2400);\n        game.draw(32);\n        arb.advance(4);\n        while (!game.drawComplete()) game.draw(32);\n        vm.prank(roller);\n        game.roll{value: 0.002 ether}();\n        arb.advance(4);\n        while (!game.ended()) {\n            vm.warp(vm.getBlockTimestamp() + 60);\n            arb.advance(240);\n        }\n        vm.warp(vm.getBlockTimestamp() + 5);\n        arb.advance(20);\n        game.poke();\n        if (!game.finalized()) game.finalize();\n        if (!game.graduated()) game.graduate();\n    }\n\n    function _mineSalt() internal view returns (bytes32 salt) {\n        bytes32 h = liq.hookInitCodeHash();\n        bytes memory buf = abi.encodePacked(bytes1(0xff), address(liq), bytes32(0), h);\n        for (uint256 i; i < 300_000; ++i) {\n            uint256 a;\n            assembly (\"memory-safe\") {\n                mstore(add(buf, 53), i)\n                a := and(keccak256(add(buf, 32), 85), 0xffffffffffffffffffffffffffffffffffffffff)\n            }\n            if (a & 0x3FFF == 0x2000) return bytes32(i);\n        }\n        revert(\"no salt\");\n    }\n}","reproduction":"State: pad opened, genesis graduated, 17 more launches played and graduated (18 real v4 pools, test/scratch/ProofA.t.sol with the vendored PoolManager). oldKing takes the crown with 0.01 ETH; warp to challengeOpensAt(). Bidder calls liq.distribute(1) (public) and reads c = distributeCursor(); the two indexes the 16-pool settlement will not reach are (c+16)%18 and (c+17)%18. Donate 0.05 ETH of fees to each of those two pools and 0.0001 ETH to the other 16, all while oldKing is king. Bidder calls king.takeCrown{value: 0.011 ether}(). Expected (FIX 2): oldKing receives or can claim every fee accrued during its reign; the bidder receives nothing from the bid beyond the crown. Actual: oldKing receives 0.01 refund + 16 x 0.0001 = 0.0116 ETH, liq.claimable(oldKing) == 0, and the bidder's balance rises by 99999999999999998 wei (both rich pools) inside its own takeCrown call. Run: forge test --match-path test/scratch/ProofA.t.sol -> FAIL 'fees accrued under the old king were paid to the new king in the bid tx: 99999999999999998 != 0'. The second specialist proof (uniform 0.001 ETH per pool, 18 pools) also fails here: old king gets 0.025999999999999984 instead of 0.028 ETH and the bidder gets 0.002 ETH; whole-tx gas 2,540,983, far below the 5M stipend. The repository's own test_crownPrecollectsSixteenOfEighteenPools asserts collectedAfter == 2 for the new king.","severity":"medium","snippet":"        if (n > MAX_DISTRIBUTE_POOLS) n = MAX_DISTRIBUTE_POOLS;","title":"Pre-crown settlement is a constant 16-pool cap, not a gas-budget fit: with 17+ pools the outgoing king's reign fees on the uncollected pools are paid to the bidder inside its own takeCrown, and the bi"},{"citation":"resolved","description":"FIX 4 states the goal 'a sole caller can never fish for a fresh seed'. After signupEnd() the first draw() call stores drawCommitBlock = ARB.arbBlockNumber() (src/PadGame.sol:186), i.e. whatever L2 block the committer chose to send in. If no one captures the three-hash seed during blocks commit+4..commit+257 (about 25 s at ~10 L2 blocks/s), line 193 sets the seed to keccak256(abi.encode(address(this), drawCommitBlock, entrants.length)). Every input is public before the commit: the game address is fixed, entrants.length is frozen once signup ends (enter() requires block.timestamp < signupEnd(), src/PadGame.sol:162), and the commit block is the committer's choice. The committer therefore evaluates the fallback seating for candidate blocks b, b+1, b+2, ... off-chain (replicating the sparse Fisher-Yates at lines 214-232), commits in the first block whose fallback gives the seating it wants, and simply declines to capture the hash seed. It keeps the hash-seed option too: at commit+4 it can compare the hash seed against the pre-chosen fallback and capture only if the hash seed is better, so it picks the best of k+1 seeds rather than being bound to one. docs/AUDIT.md item 23 discloses the two-way choice (timely capture versus the one known fallback) but not that the fallback itself is selectable before committing. Impact is bounded: the seed decides who is seated only when entries exceed MAX_IMPS (200); below that it only orders seats, which is the last tie-break key. It also needs the pad quiet for one capture window (no other draw/poke/upkeep caller), the condition FIX 4 was written for, and anyone may commit first in an earlier block. Merged from audit_math (low) and audit_economics (low): same root cause. Minimal fix within the design: derive the fallback from data the committer cannot steer at commit time, e.g. mix in ARB.arbBlockHash of a block fixed before the commit call could be chosen, or bind the commit block to the signup-end L2 block recorded at the first post-signup call rather than the caller's current block.","line":193,"path":"src/PadGame.sol","reproduction":"State: a launch with 202 entries (201 attacker wallets plus one victim entered last), signup over, pad otherwise quiet. Attacker computes seed_b = keccak256(abi.encode(game, b, 202)) for b = cur, cur+1, ... and runs the contract's own Fisher-Yates (lines 214-232) off-chain until a b is found whose seating leaves entry #202 unseated. Calls: with ArbSys at block b, draw(1) (drawCommitBlock == b, drawCommitted == true); nobody calls draw/poke during b+4..b+257; at b+258 draw(32) repeatedly until drawComplete. Expected per the brief: a sole caller cannot fish for a favourable seed. Actual: drawSeed() == keccak256(abi.encode(game, b, 202)), impCount() == 200, impOf(victim) == 0, and the committer could still have taken the hash seed at b+4 if that had been better. Baseline chance that a given entrant is unseated under an uncontrolled seed is 2/202; under the grind it is 1 at the cost of waiting for the chosen block. Both specialists report scratch tests (test/scratch/SeedChoice.t.sol, test/scratch/Econ.t.sol::test_committerGrindsFallbackSeedByChoosingCommitBlock) that pass on this tree; the trace above follows directly from lines 186 and 193.","severity":"low","snippet":"                drawSeed = keccak256(abi.encode(address(this), drawCommitBlock, entrants.length));","title":"Lapsed-window draw seed is a pure function of the committer-chosen commit block, so the first draw() caller can pre-select the fallback seed by choosing when to commit"}],"hash":"0f9b22e8625791a141557c7a9b6831b105bd584169fb0b9ddd98fcbab2f30550","nodeId":"58dbd7bb-70da-4451-b32a-ce0ba36bf4fe","outcome":"completed","summary":"Review complete. The findings file is written and validated.\n\n**Outcome**\n\n`.imd-findings.json` holds 2 findings and a 44-row coverage record answering all 42 listed entry points plus two invariants.\n\n**Findings kept**\n\n1. **Medium, `src/PadLiquidity.sol:210`.** Pre-crown settlement clamps to a constant 16 pools before looking at gas, instead of the brief's \"as many as fit the measured budget\". With 17+ pools, the bid's own trailing upkeep runs `distribute(2)` under the new king and pays the outgoing reign's fees on the unsettled pools to the bidder. The bidder can steer the public cursor beforehand to pick which pools. Both specialist proofs fail on this tree for exactly that reason, and the stronger one is attached as proof. This merges three specialist reports (economics medium, permissions low, flow info) into one root cause.\n\n2. **Low, `src/PadGame.sol:193`.** The lapsed-window fallback seed depends only on the game address, the frozen entry count and the commit block the first caller chooses, so a sole caller can grind the commit block to pre-select seating. Bounded to launches over 200 entries on a quiet pad. Merged from audit_math and audit_economics.\n\n**Dropped**\n\n- The audit_flow note about stale v2 wording in `launch.json`: the manifest was rewritten in a later commit and now describes v3 correctly. The validator passes it.\n- The audit_economics info note that wallet-estimated transactions skip upkeep: that is the requested FIX 5 behaviour, not a defect.\n\n**Own pass**\n\nTraced the Lock transient slot against the vendored library, hook flag mask, runtime sizes (largest 18,665 bytes), reentrancy paths through the gas-capped pushes, carry release at finalize, roll split and expiry accounting, and the one-shot binders. Nothing beyond the two findings reproduced. I did not rerun the full repository suite within the time budget; only the two proofs were executed.","treeHash":null,"usage":{"cachedInputTokens":1038774,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":31980,"runtime":"claude","turns":19,"wallClockMs":938375}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c21eed2758adfc7d","findings":[],"hash":"3cdea7ba88febe8cac9916db62e2df77af10d363d2cf9e61f3d195f1018d48e8","nodeId":"b702c960-23bb-4d60-ab9a-8c5efd582553","outcome":"failed","summary":"fatal: cannot copy '/usr/share/git-core/templates/description' to '/var/lib/imd-worker/.identitymd/work/d236400b-4e28-4cee-b921-82dddf964f29/b702c960-23bb-4d60-ab9a-8c5efd582553/.git/description': Read-only file system\n","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":0,"wallClockMs":76}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7e50667f872c7f5e","findings":[{"citation":"resolved","description":"Boundary x invariant seam in the FIX 4 draw. After signupEnd() anyone may call draw(); the first call stores drawCommitBlock = ARB.arbBlockNumber() (src/PadGame.sol:186). If nobody captures the three-hash seed during blocks commit+4..commit+257 (about 25 s at the chain's ~10 L2 blocks/s), the seed becomes keccak256(game, drawCommitBlock, entrants.length). Every input of that fallback is public BEFORE the commit happens, and the committer controls drawCommitBlock simply by choosing in which block to send the first draw() call (entrants.length is frozen once signup ends). The invariant stated in the brief and docs/AUDIT.md item 23 ('a sole caller can never fish for a fresh seed', 'the fallback prevents unbounded best-of-k fresh seeds') therefore does not hold at the boundary where the pad is quiet for one capture window: the committer evaluates the fallback seating for candidate blocks b, b+1, b+2, ... off-chain, waits for a block whose fallback excludes a chosen entrant (or seats all of its own sybils), commits in that block, and then declines to capture the hash seed. It still keeps the hash-seed option: at commit+4 it can compare the hash seed against the pre-selected fallback and take whichever is better, so it chooses the best of k+1 seeds rather than being bound to one. Impact is limited to launches with more than MAX_IMPS (200) entries, where the seed decides who is seated at all; with <= 200 entries the seed only orders seats (index tie-break). It also requires that no other party (including pad upkeep from any other game's activity) calls draw() during the ~25 s window, which is exactly the quiet-pad condition FIX 4 was written for. The docs disclose a two-way choice for a sole keeper but not that the committer selects among arbitrarily many fallbacks before committing. Suggested minimal fix within the agreed design: derive the fallback from data the committer cannot steer at commit time, e.g. include the hash of a block already fixed before the commit call could be chosen (ARB.arbBlockHash(signup-end block) captured at first entry or at the first draw call), or bind the commit block to signupEnd() rather than the caller's block (the first draw() call records the L2 block at which signup ended, not the current block, when it is still within the hash window).","line":193,"path":"src/PadGame.sol","reproduction":"State: a launch with 202 entries (201 attacker wallets, 1 victim entered last), signup over, pad otherwise quiet. Steps (test/scratch/SeedChoice.t.sol, passes on this code): (1) attacker replicates PadGame._draw's sparse Fisher-Yates with seed = keccak256(abi.encode(game, b, 202)) for candidate blocks b = current, current+1, ...; in the run, block offset 216 (217 candidates, ~22 s at 10 blocks/s) is the first whose fallback leaves entry #202 (the victim) without a seat; (2) attacker calls draw(1) in that block: drawCommitBlock == b; (3) nobody calls draw during blocks b+4..b+257; (4) at b+258 the attacker calls draw(32) until drawComplete: drawSeed == keccak256(abi.encode(game, b, 202)), impCount == 200, impOf(victim) == 0. Expected per the brief: a sole caller cannot fish for a favourable seed. Actual: the committer chose the seed by choosing the commit block (and may still take the hash seed instead at b+4 if it is better). Baseline probability that this particular entrant is unseated under an uncontrolled seed is 2/202 (about 1%); under the attack it is 1 at the cost of waiting about 20 s.","severity":"low","snippet":"                drawSeed = keccak256(abi.encode(address(this), drawCommitBlock, entrants.length));","title":"Draw fallback seed is a pure function of a committer-chosen block, so the committer can pick the seating outcome before committing (best-of-k over commit blocks)"}],"hash":"3e156768761a64df31f5b55ab8a5c94598b48a4c97be8236d8d203ca4b3437c5","nodeId":"0519e354-5ad7-4631-8159-24f9c802aaaf","outcome":"completed","summary":"Review complete. The findings file is written and validated against the tree.\n\n**Outcome**\n\nThe math in PvP Pad v3 holds up under the Math Precision, Boundary and Numerical Gap checklists. I traced the bonding curve, the roll split, the finalize payout, the funded-release cap, the graduation liquidity math, the fee-collection delta decoding, the block-window boundaries and the gas floors, and found one reproducible defect, rated low.\n\n**Finding 1, low: the draw fallback seed is selectable by the committer.** The lapsed-window seed is keccak of game, commit block and entry count, and the committer picks the commit block by choosing when to send the first draw call after signup ends. All inputs are public before the commit. An attacker evaluates candidate blocks off-chain, waits for one whose fallback excludes a chosen entrant, commits there, and lets the 25-second capture window lapse. The scratch test at test/scratch/SeedChoice.t.sol does this with 202 entrants and excludes the victim after evaluating 217 candidate blocks, about 22 seconds of waiting. It still keeps the hash seed as a second option at commit+4. Impact is limited to launches with more than 200 entries on a quiet pad, which is the case FIX 4 targeted. The docs disclose a two-way choice but not pre-commit selection among many fallbacks.\n\n**What traced clean**\n\n- Curve: ceil rounding on the new reserve, the sell-out branch is consistent with the overflow-to-pot path, and raised ETH never exceeds 4 ETH.\n- Roll split is exact in wei, the 1% tip is conserved to the resolver or the pot, and expiry at commit+258 matches the ArbSys window exactly.\n- Finalize: fee caps, triangular weights, carry pull and return use the same release cap, dust goes to carry.\n- Graduation: the 512-bit mulDiv and sqrt are correct, the liquidity formulas match v4, and the 1 ppm haircut covers v4's round-up.\n- Upkeep and crown gas floors satisfy EIP-150 for their stipends.\n- Every slither and aderyn lead in my area reproduced as a false positive.\n\n**Coverage**\n\nAll 42 listed entry points have a row, plus three invariant rows. The full existing suite passes, 164 tests. Nothing outside test/scratch/ and the findings file was written.","treeHash":null,"usage":{"cachedInputTokens":1844677,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":51587,"runtime":"claude","turns":33,"wallClockMs":977982}},{"artifacts":[],"attempt":2,"bundleHash":"2a7025a759c07ee8b5e761ccd77b152316748d9d562163c76615c0f8aab23776","device":"e54711bd1fbb0d02","findings":[],"hash":"5e863bb2bc1e67872cb618e36a6a0a73da47e6789ce635b5d1c100616bb82841","nodeId":"b702c960-23bb-4d60-ab9a-8c5efd582553","outcome":"completed","summary":"Implemented all six fixes and documented them in [AUDIT.md](/root/.identitymd/work/d236400b-4e28-4cee-b921-82dddf964f29/b702c960-23bb-4d60-ab9a-8c5efd582553/docs/AUDIT.md).\n\n- **174 tests pass** with the supplied fuzz seed.\n- Build, formatting, and manifest validation pass.\n- Deployment plus later opening: **12,982,118 gas**, below 13M.\n- Gas report, verification guide, and operational responsibilities included.\n- No deployment, broadcast, or RPC calls performed.\n\nAn independent audit remains required before public launch.","treeHash":"75d149c5bf69751f3a4260920bc8f25e09db3a16","usage":{"cachedInputTokens":6923648,"inputTokens":388065,"model":"gpt-6-astra","outputTokens":52594,"runtime":"codex","turns":10,"wallClockMs":1597595}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2b170a76e3d9adca","findings":[{"citation":"resolved","description":"FIX 2 requires that nothing from a reign is left for the next king and that pre-crown settlement 'covers as many pools as fit a measured gas budget, at least 16'. `settleCrown()` calls `_distribute(MAX_DISTRIBUTE_POOLS, true)` and `_distribute` clamps `n` to a constant 16 before looking at `gasleft()`, so the batch never uses more of the 5,000,000-gas stipend than 16 pools need. Measured on the real vendored PoolManager, a whole `takeCrown` with 18 graduated pools consumes about 2.54M gas, i.e. roughly 125k per collected pool; the 5M budget would cover ~35 pools but the constant stops at 16. The uncollected pools' fees are not merely deferred: `takeCrown` sets `king = msg.sender` and then calls `pad.upkeepFor(msg.sender)`, whose `_upkeep` runs `liquidity.distribute(2)` with the NEW king as beneficiary, and the new king can immediately call `distribute(16)` for the rest. So every pool beyond the 16-pool window pays the fees earned during the outgoing reign to the incoming king, atomically with the bid. A bidder who watches `distributeCursor` and pool fee growth can time a bid to capture the largest uncollected tail. The outgoing king's only defence is to call `distribute` continuously, which the design does not require of them. The author documents this as a limit in docs/AUDIT.md #21, but the stated spec ('as many pools as fit a measured gas budget') is not what the code does: the cap is a constant, not a gas-budget fit. Minimal fix: in strict mode loop while `gasleft() >= COLLECT_GAS + COLLECTION_RESERVE_GAS` up to `count` pools (not 16), or raise MAX_DISTRIBUTE_POOLS for the strict path to the measured fit (~32) and keep 16 only for the public path; alternatively checkpoint per-pool fee growth per reign.","line":210,"path":"src/PadLiquidity.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PadToken} from \"src/PadToken.sol\";\nimport {PadGame} from \"src/PadGame.sol\";\nimport {PvPPad} from \"src/PvPPad.sol\";\nimport {PadLiquidity} from \"src/PadLiquidity.sol\";\nimport {KingOfThePad} from \"src/KingOfThePad.sol\";\nimport {IPoolManager, IUnlockCallback, PoolKey, IERC20Min} from \"src/interfaces/Interfaces.sol\";\nimport {PoolManager} from \"lib/v4-core/src/PoolManager.sol\";\nimport {IPoolManager as V4Manager} from \"lib/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey as V4Key} from \"lib/v4-core/src/types/PoolKey.sol\";\nimport {BalanceDelta} from \"lib/v4-core/src/types/BalanceDelta.sol\";\n\ncontract ArbSysStub {\n    uint256 public number = 1000;\n    function advance(uint256 n) external { number += n; }\n    function arbBlockNumber() external view returns (uint256) { return number; }\n    function arbBlockHash(uint256 n) external view returns (bytes32) {\n        require(n < number && n + 256 >= number, \"invalid block number\");\n        return keccak256(abi.encode(\"arb\", n));\n    }\n}\n\ncontract Donor is IUnlockCallback {\n    IPoolManager immutable manager;\n    constructor(IPoolManager m) { manager = m; }\n    receive() external payable {}\n    function donate(PoolKey memory key, uint256 e) external { manager.unlock(abi.encode(key, e)); }\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        (PoolKey memory key, uint256 e) = abi.decode(data, (PoolKey, uint256));\n        V4Key memory vkey = abi.decode(abi.encode(key), (V4Key));\n        V4Manager(address(manager)).donate(vkey, e, 0, \"\");\n        manager.sync(address(0));\n        manager.settle{value: e}();\n        return \"\";\n    }\n}\n\ncontract Deployer {\n    PadToken public token; PadGame public game; PvPPad public pad; PadLiquidity public liquidity; KingOfThePad public king;\n    function deployAll(address owner, address pm) external {\n        token = new PadToken(); game = new PadGame(); pad = new PvPPad(owner, address(token), address(game));\n        liquidity = new PadLiquidity(pm, address(pad)); king = new KingOfThePad(address(pad), address(liquidity), owner);\n    }\n}\n\ncontract OutgoingKingLosesTailPools is Test {\n    address constant OWNER = 0x5b95A971B4583A5f011E9DA082acdD679b870D06;\n    ArbSysStub arb; IPoolManager pm; Donor donor; PvPPad pad; PadLiquidity liq; KingOfThePad king; PadGame pvp;\n    address kingA = address(0xA8); address kingB = address(0xA9); address player = address(0xA0);\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        ArbSysStub impl = new ArbSysStub();\n        vm.etch(address(0x64), address(impl).code);\n        arb = ArbSysStub(address(0x64));\n        pm = IPoolManager(address(new PoolManager(OWNER)));\n        donor = new Donor(pm);\n        Deployer d = new Deployer();\n        d.deployAll(OWNER, address(pm));\n        pad = d.pad(); liq = d.liquidity(); king = d.king();\n        vm.deal(player, 100 ether); vm.deal(kingA, 1 ether); vm.deal(kingB, 1 ether);\n        bytes32 salt = mineSalt();\n        vm.prank(OWNER); pad.openPad(salt);\n        pvp = PadGame(pad.gameOf(1));\n        playAndGraduate(pvp);\n        require(pad.genesisGraduated(), \"pvp\");\n    }\n\n    function mineSalt() internal view returns (bytes32) {\n        bytes32 h = liq.hookInitCodeHash();\n        for (uint256 i; i < 300_000; ++i) {\n            address a = address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(liq), bytes32(i), h)))));\n            if (uint160(a) & 0x3FFF == 0x2000) return bytes32(i);\n        }\n        revert(\"no salt\");\n    }\n\n    function playAndGraduate(PadGame g) internal {\n        vm.prank(player); g.enter{value: 0.001 ether}();\n        vm.warp(block.timestamp + 10 minutes); arb.advance(2400);\n        g.draw(32); arb.advance(4);\n        while (!g.drawComplete()) g.draw(32);\n        vm.prank(player); g.roll{value: 0.002 ether}();\n        vm.warp(block.timestamp + 11 minutes); arb.advance(4400);\n        while (g.pendingCount() != 0) g.resolvePending(16);\n        g.finalize();\n        if (!g.graduated()) g.graduate();\n    }\n\n    function test_outgoingKingReceivesFeesOfAllPoolsEarnedDuringItsReign() public {\n        for (uint256 i; i < 17; ++i) {\n            PadGame g = PadGame(pad.gameOf(pad.launch(\"Pool\", \"P\", \"\")));\n            playAndGraduate(g);\n        }\n        assertEq(liq.poolCount(), 18);\n        vm.prank(kingA); king.takeCrown{value: 0.01 ether}();\n        liq.distribute(16); liq.distribute(16); // nothing owed from before the reign remains\n        vm.deal(address(donor), 1 ether);\n        for (uint256 i; i < 18; ++i) donor.donate(liq.poolKey(liq.getPool(i).token), 0.001 ether);\n        vm.warp(king.challengeOpensAt());\n        uint256 aBefore = kingA.balance; uint256 bBefore = kingB.balance;\n        vm.prank(kingB); king.takeCrown{value: 0.011 ether}();\n        uint256 aGot = kingA.balance - aBefore + liq.claimable(kingA) + king.claimable(kingA);\n        uint256 bGot = kingB.balance + 0.011 ether - bBefore + liq.claimable(kingB);\n        assertApproxEqAbs(aGot, 0.01 ether + 18 * 0.001 ether, 100, \"outgoing king must receive every pool's fees from its reign\");\n        assertEq(bGot, 0, \"new king must receive nothing earned during the previous reign\");\n    }\n}","reproduction":"State: PvP graduated, 17 more launches played out and graduated (18 pools), king A crowned with 0.01 ETH, cursor aligned, then 0.001 ETH of fees donated to each of the 18 pools (`donateFees` from test/Base.t.sol on the real PoolManager). Call: after 1 hour, B calls `takeCrown{value: 0.011 ether}()` with plenty of gas. Expected (FIX 2): A receives refund 0.01 + 18 * 0.001 = 0.028 ETH, B receives nothing from A's reign. Actual: A receives 0.025999999999999984 ETH (refund + 16 pools), B receives 0.001999999999999998 ETH of A's-reign fees inside B's own bid transaction (two `FeesCollected` events after `Crowned`, beneficiary B), and whole-tx gas was 2,540,983, far below the 5M settlement stipend. Scratch test test/scratch/Econ.t.sol::test_pools17and18FeesGoToNewKingAtomically fails on the current tree with `25999999999999984 != 28000000000000000`. The repository's own test test_crownPrecollectsSixteenOfEighteenPools asserts `collectedAfter == 2` for the new king, confirming the behaviour.","severity":"medium","snippet":"        if (n > MAX_DISTRIBUTE_POOLS) n = MAX_DISTRIBUTE_POOLS;\n        if (n > count) n = count;","title":"Pre-crown settlement hard-caps at 16 pools regardless of the 5M gas budget, so with 17+ pools the outgoing king's fees on the remaining pools are paid to the new king inside the same takeCrown transac"},{"citation":"resolved","description":"FIX 4 intends that 'a sole caller can never fish for a fresh seed'. After signup ends, `draw()` commits at whatever ArbSys block the first caller chooses (`drawCommitBlock = cur`), and once 258 blocks pass without capture the seed becomes keccak(game, commitBlock, entrants.length). `entrants.length` is frozen at signup end and the game address is known, so the fallback seed for every candidate commit block is computable in advance. A caller who is the only keeper (or who acts when nobody else bothers to capture a 0.001 ETH bounty) selects the commit block whose fallback yields the seating/order they want, commits exactly then, waits ~26 s at 10 blocks/s, and completes the draw under the pre-chosen seed. The in-window hash seed is still available to anyone for 254 blocks, so this needs no competing capturer; at ~10 L2 blocks/s and a 0.001 ETH bounty that is a realistic condition on a quiet pad. Impact is bounded: seating only matters when entries > 200 (who is excluded) and seat index is the last tie-break key, so this is low. docs/AUDIT.md #23 acknowledges choosing 'timely capture versus the one known fallback' but not that the fallback itself is selectable by grinding the commit block. Possible mitigation: derive the fallback from state the committer cannot choose (e.g. include the hash of the last in-window block captured by anyone, or a later blockhash at the time of fallback), or disallow a fallback and require a recommit by a different caller.","line":193,"path":"src/PadGame.sol","reproduction":"State: a graduated genesis, a new launch with 201 entrants (one more than MAX_IMPS = 200), signup over, ArbSys block = cur. Attacker computes, for b in [cur, cur+2000), seed_b = keccak256(abi.encode(game, b, 201)) and simulates the sparse Fisher-Yates in _draw to find which entry is left unseated; picks b where victim entry #0 is the one excluded. Calls: set ArbSys block to b, `draw(1)` (commits at b), advance 258 blocks (no one captured), `draw(32)` until complete. Expected: the seed should not be selectable by the committer. Actual: `drawSeed() == keccak256(abi.encode(game, b, 201))` and `impOf(victim) == 0` while all 200 other entrants are seated. Scratch test test/scratch/Econ.t.sol::test_committerGrindsFallbackSeedByChoosingCommitBlock passes on the current tree (demonstrates the grind succeeds).","severity":"low","snippet":"                drawSeed = keccak256(abi.encode(address(this), drawCommitBlock, entrants.length));","title":"Draw fallback seed is a pure function of the commit block, so whoever commits can grind the commit block to pre-select the lapsed-window seed"},{"citation":"resolved","description":"FIX 5 was implemented exactly as specified (skip when the cap cannot be funded), and the repository's own gas-estimate tests show a user's enter() or roll() succeeds with under 500k gas. Because every upkeep step is optional and skipped when gas is short, eth_estimateGas converges on the low success threshold, so ordinary wallet transactions will carry ~200-500k gas and `_canSpend(4_500_000)` is false on every enter/roll/launch. The practical consequence for the economics is that draw progress, roll resolution (and the 1% resolver tip), finalize and graduate are not advanced by player traffic at all; they rely on third parties calling poke/resolvePending/draw with explicit gas. This is an incentive-design observation that follows from the requested design, not a code defect; it is recorded because the tip/bounty economics in FIX 3/4 assume upkeep-driven resolution.","line":262,"path":"src/PvPPad.sol","reproduction":"Run the repository test AuditV3CarryUpkeepTest.test_ownGasEstimateEntryAndRollWithForeignDraw: own entry/roll gas limits are logged below 500,000 and the foreign game's draw is skipped (`assertFalse(foreign.drawSeeded())`). Any enter()/roll() sent at that estimate leaves `_canSpend(UPKEEP_STEP_GAS)` false (needs >= 4,671,428 gas) and performs no upkeep.","severity":"info","snippet":"    function _canSpend(uint256 cap) internal view returns (bool) {\n        return gasleft() >= cap + cap / 63 + UPKEEP_RESERVE_GAS;\n    }","title":"Upkeep subcalls need 4.6M+ gas so they never run from wallet-estimated enter()/roll() transactions; resolver tips and the draw bounty depend entirely on explicit keepers"}],"hash":"650bde08ada3507c9055b78a8a8068dfcbea7a9ead72772c588a150ea7f5ab63","nodeId":"8732087e-fa33-4440-a7be-4f0eb5228e0d","outcome":"completed","summary":"The review is complete and the findings file is in place. All three snippets match the tree, the coverage record answers all 41 listed entry points plus three invariants, and the proof test compiles self-contained and fails on the current code.\n\n**Result: one medium, one low, one informational finding, written to `.imd-findings.json`.** The existing suite of 174 tests passes, so none of this is caught by the repository's own regressions.\n\n**Medium: pre-crown settlement stops at 16 pools, not at the gas budget.** FIX 2 says settlement covers as many pools as fit the measured budget. The code clamps to a constant 16 before reading gas. With 18 real pools, a full bid used about 2.5M of its 5M stipend, yet the outgoing king got 16 pools of fees and the new king got the other two inside its own bid transaction, through the upkeep's distribute call. A bidder can time a bid to capture the uncollected tail. The attached proof test fails on this tree with the outgoing king short by exactly two pools' fees.\n\n**Low: the draw fallback seed can be chosen by grinding the commit block.** The lapsed-window seed is keccak of game, commit block and entry count, all known before commit. The committer picks the block, waits 258 blocks, and completes the draw under a pre-selected seed. The scratch test excludes an attacker-chosen entrant from a 201-entry draw. Impact is limited to seating when entries exceed 200 and to the last tie-break key.\n\n**Info: upkeep never runs at wallet-estimated gas.** Each step needs over 4.6M gas and is skipped otherwise, so gas estimators settle near 500k and player traffic never drives draws, resolution or tips. This follows from the FIX 5 design as specified and is recorded for the incentive model only.\n\n**What held in my area.** I traced the roll split, tip reservation and expiry accounting, the carry release caps and the five-wallet chain economics, king refund and split conservation, PadLiquidity and PadGame balance invariants, burn-chunk accounting, and the manager-lock and gas preconditions on bids. The sybil carry chain loses at least 19 percent of what it rolls at small raises and about 4 percent at sell-out, so it stays unprofitable. I did not reach the deployed PoolManager's lock-slot constant on Robinhood Chain, which cannot be checked without an RPC call.","treeHash":null,"usage":{"cachedInputTokens":1470915,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":53838,"runtime":"claude","turns":32,"wallClockMs":1095572}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"357c46e3781993d4","findings":[{"citation":"resolved","description":"Trust gap (access x asymmetry). takeCrown settles at most MAX_DISTRIBUTE_POOLS = 16 pools for the outgoing king (PadLiquidity._distribute, src/PadLiquidity.sol:205-224, walking the shared round-robin distributeCursor), then updates `king`, and finally calls pad.upkeepFor(msg.sender) (src/KingOfThePad.sol:98). PvPPad._upkeep runs `IPadLiquidity(liquidity).distribute{gas: UPKEEP_DISTRIBUTE_GAS}(2)` (src/PvPPad.sol:247), which reads the NEW king and collects the next two pools in the same round-robin. With more than 16 graduated pools those two pools were not reached by the pre-crown settlement, so every fee they accrued during the previous reign is paid, inside the bid transaction, to the bidder. Because distributeCursor is also advanced by the permissionless distribute(n), the bidder can first call distribute(1..k) to position the cursor so that the two (or, with more pools, the 2..N-16) richest pools are the ones left over, at no cost to itself (that pre-walk pays the old king only the thin pools it crosses). FIX 2 asks that 'nothing from a reign is left for the next king'; docs/AUDIT.md item 21 accepts that pools beyond 16 'can pay a later king', and test_crownPrecollectsSixteenOfEighteenPools asserts collectedAfter == 2, so the builder knows the trailing collection exists. What is not documented is that the diversion is active and bidder-chosen: the bidder both triggers it and selects its targets, and the old king has no claimable fallback for those pools. Minimal fix preserving the design: skip the liquidity distribute step in the upkeep that takeCrown triggers (e.g. an upkeep variant without distribute, or have settleCrown record the cursor it reached and let _upkeep's distribute start the next reign only from pools it already settled), and/or let settleCrown continue past 16 pools while gas remains, as the brief's 'as many pools as fit a measured gas budget' wording asks.","line":98,"path":"src/KingOfThePad.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PadToken} from \"src/PadToken.sol\";\nimport {PadGame} from \"src/PadGame.sol\";\nimport {PvPPad} from \"src/PvPPad.sol\";\nimport {PadLiquidity} from \"src/PadLiquidity.sol\";\nimport {KingOfThePad} from \"src/KingOfThePad.sol\";\nimport {IPoolManager, IUnlockCallback, PoolKey} from \"src/interfaces/Interfaces.sol\";\nimport {PoolManager} from \"lib/v4-core/src/PoolManager.sol\";\nimport {IPoolManager as V4Manager} from \"lib/v4-core/src/interfaces/IPoolManager.sol\";\nimport {PoolKey as V4Key} from \"lib/v4-core/src/types/PoolKey.sol\";\nimport {BalanceDelta} from \"lib/v4-core/src/types/BalanceDelta.sol\";\n\ncontract ArbSysStub {\n    uint256 public number = 1000;\n\n    function advance(uint256 n) external {\n        number += n;\n    }\n\n    function arbBlockNumber() external view returns (uint256) {\n        return number;\n    }\n\n    function arbBlockHash(uint256 n) external view returns (bytes32) {\n        require(n < number && n + 256 >= number, \"invalid block number\");\n        return keccak256(abi.encode(\"arb\", n));\n    }\n}\n\n/// @dev Donates ETH fees to a real v4 pool so the pad's full-range position accrues them.\ncontract Donor is IUnlockCallback {\n    IPoolManager immutable manager;\n\n    constructor(IPoolManager m) {\n        manager = m;\n    }\n\n    receive() external payable {}\n\n    function donate(PoolKey memory key, uint256 e) external {\n        manager.unlock(abi.encode(key, e));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n        (PoolKey memory key, uint256 e) = abi.decode(data, (PoolKey, uint256));\n        V4Key memory vkey = abi.decode(abi.encode(key), (V4Key));\n        V4Manager(address(manager)).donate(vkey, e, 0, \"\");\n        manager.sync(address(0));\n        manager.settle{value: e}();\n        return \"\";\n    }\n}\n\n/// @notice With more than 16 graduated pools, a bid's own trailing upkeep pays fees accrued during\n/// the outgoing king's reign to the new king, and the bidder picks which pools with a public\n/// distribute(1) call beforehand. Fails on the current code; passes once the pre-crown settlement\n/// stops leaving reign fees collectible by the next king inside the same bid.\ncontract CrownDiversionProof is Test {\n    address constant OWNER = 0x5b95A971B4583A5f011E9DA082acdD679b870D06;\n    ArbSysStub arb;\n    IPoolManager pm;\n    PvPPad pad;\n    PadLiquidity liq;\n    KingOfThePad king;\n    Donor donor;\n    address oldKing = address(0xA8);\n    address bidder = address(0xA9);\n    address roller = address(0xA0);\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        ArbSysStub impl = new ArbSysStub();\n        vm.etch(address(0x64), address(impl).code);\n        arb = ArbSysStub(address(0x64));\n        pm = IPoolManager(address(new PoolManager(OWNER)));\n        PadToken t = new PadToken();\n        PadGame g = new PadGame();\n        pad = new PvPPad(OWNER, address(t), address(g));\n        liq = new PadLiquidity(address(pm), address(pad));\n        king = new KingOfThePad(address(pad), address(liq), OWNER);\n        donor = new Donor(pm);\n        vm.deal(oldKing, 10 ether);\n        vm.deal(bidder, 10 ether);\n        vm.deal(roller, 10 ether);\n        vm.deal(address(donor), 10 ether);\n        bytes32 salt = _mineSalt();\n        vm.prank(OWNER);\n        pad.openPad(salt);\n        _playAndGraduate(PadGame(pad.gameOf(1)));\n        for (uint256 i; i < 17; ++i) {\n            _playAndGraduate(PadGame(pad.gameOf(pad.launch(\"Pool\", \"P\", \"\"))));\n        }\n        assertEq(liq.poolCount(), 18);\n    }\n\n    function test_bidTransactionMustNotPayOldReignFeesToTheBidder() public {\n        vm.prank(oldKing);\n        king.takeCrown{value: 0.01 ether}();\n        vm.warp(king.challengeOpensAt());\n        // Bidder steers the public round-robin cursor by one thin pool.\n        vm.prank(bidder);\n        liq.distribute(1);\n        uint256 c = liq.distributeCursor();\n        uint256 rich1 = (c + 16) % 18;\n        uint256 rich2 = (c + 17) % 18;\n        for (uint256 i; i < 18; ++i) {\n            bool rich = i == rich1 || i == rich2;\n            donor.donate(liq.poolKey(liq.getPool(i).token), rich ? 0.05 ether : 0.0001 ether);\n        }\n        uint256 bidBefore = bidder.balance;\n        vm.prank(bidder);\n        king.takeCrown{value: 0.011 ether}();\n        assertEq(king.king(), bidder);\n        uint256 bidderGain = bidder.balance + 0.011 ether - bidBefore;\n        emit log_named_uint(\"bidder received inside its own bid tx\", bidderGain);\n        assertEq(bidderGain, 0, \"fees accrued under the old king were paid to the new king in the bid tx\");\n    }\n\n    // ---- helpers ---------------------------------------------------------------------------------\n    function _playAndGraduate(PadGame game) internal {\n        vm.prank(roller);\n        game.enter{value: 0.001 ether}();\n        vm.warp(vm.getBlockTimestamp() + 10 minutes);\n        arb.advance(2400);\n        game.draw(32);\n        arb.advance(4);\n        while (!game.drawComplete()) game.draw(32);\n        vm.prank(roller);\n        game.roll{value: 0.002 ether}();\n        arb.advance(4);\n        while (!game.ended()) {\n            vm.warp(vm.getBlockTimestamp() + 60);\n            arb.advance(240);\n        }\n        vm.warp(vm.getBlockTimestamp() + 5);\n        arb.advance(20);\n        game.poke();\n        if (!game.finalized()) game.finalize();\n        if (!game.graduated()) game.graduate();\n    }\n\n    function _mineSalt() internal view returns (bytes32 salt) {\n        bytes32 h = liq.hookInitCodeHash();\n        bytes memory buf = abi.encodePacked(bytes1(0xff), address(liq), bytes32(0), h);\n        for (uint256 i; i < 300_000; ++i) {\n            uint256 a;\n            assembly (\"memory-safe\") {\n                mstore(add(buf, 53), i)\n                a := and(keccak256(add(buf, 32), 85), 0xffffffffffffffffffffffffffffffffffffffff)\n            }\n            if (a & 0x3FFF == 0x2000) return bytes32(i);\n        }\n        revert(\"no salt\");\n    }\n}","reproduction":"State: PvP graduated, 17 more launches played and graduated (18 real v4 pools). players[8] takes the crown with 0.01 ETH; wait 1 hour. Bidder calls liq.distribute(1) (public) and reads c = distributeCursor(); the two pools the 16-pool settlement will not reach are (c+16)%18 and (c+17)%18. Donate 0.05 ETH of fees to each of those two pools and 0.0001 ETH to the other 16 (all accrued while players[8] is king). Bidder calls king.takeCrown{value: 0.011 ether}(). Expected: the old king receives (or has claimable) every fee accrued during its reign; the bidder receives nothing from the bid tx beyond becoming king. Actual (test/scratch/CrownDiversion.t.sol, real v4 PoolManager): old king receives 0.01 ETH refund + 16 x 0.0001 ETH = 0.0116 ETH; bidder's balance rises by 0.1 ETH (both rich pools) inside its own takeCrown call; liq.claimable(oldKing) == 0. Run: forge test --match-path test/scratch/CrownDiversion.t.sol -> FAIL 'fees accrued under the old king were paid to the new king in the bid tx: 99999999999999998 != 0'.","severity":"low","snippet":"        pad.upkeepFor(msg.sender); // upkeep fees (finalizer) go to the bidder, not to this contract","title":"Bid transaction pays the outgoing king's accrued fees on the pools beyond the 16-pool settlement to the new king, and the bidder can choose which pools"}],"hash":"80baea5c2d9e2b42fe0419242852e192ba83c5097e9c428dcd4d68e15ea4a0f9","nodeId":"e785a355-78a7-4f74-bdfb-5224072042ff","outcome":"completed","summary":"Review complete. The findings file is in place at the repository root and validated against the tree.\n\n**Outcome.** The permission model holds across all 41 entry points except for one trust-gap defect, reported as low with a failing proof test.\n\n**Finding 1 (low), `src/KingOfThePad.sol:98`.** A bid settles at most 16 pools for the outgoing king, switches the king, then runs the pad's upkeep, which collects two more pools for the new king. With more than 16 graduated pools, those two pools' fees from the previous reign are paid to the bidder inside its own bid transaction. The bidder can also steer the shared round-robin cursor with a public `distribute` call beforehand so the richest pools are the ones left over. The scratch test on the real v4 PoolManager with 18 pools shows the bidder gaining 0.1 ETH of old-reign fees while the old king gets only the 16 thin pools and nothing parked as claimable. The builder's own test asserts the trailing collection exists and the docs accept pools beyond 16 paying a later king, so I rated it low. The proof under test/scratch fails on current code for exactly this reason.\n\n**What held.** Every privileged callee checks its exact caller. The game-only, king-only, pad-only, self-only and PoolManager-only gates are consistent across paired functions, the one-shot binders are atomic within the factory transaction as documented, the template initializers are sealed, and carry can only leave the pad through a game's own release cap. The pad, king and audit-v3 suites pass (47 tests).\n\n**Coverage record.** All 41 entry points answered, 39 `holds`, 2 `finding`, none `unreached`, plus three invariant rows.\n\n**Not reached in depth.** Economic soundness of the sybil release-cap math and the dice-resolution timing belong to other areas. I checked them only as far as the trust-gap seam required.","treeHash":null,"usage":{"cachedInputTokens":2160908,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":57978,"runtime":"claude","turns":34,"wallClockMs":1152858}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"df98a348cb33e978","findings":[],"hash":"81a73033e9051e274cc573be8ae6fbaf34d42620d331aab818e7c39574772e62","nodeId":"0294586e-f42f-4cd4-b13d-7dfc604c33cf","outcome":"failed","summary":"wrote outside the task's allowed paths: .imd-tmp/codex-bwrap-synthetic-mount-targets-1000/lock","treeHash":null,"usage":{"cachedInputTokens":1126528,"inputTokens":67195,"model":"gpt-6-astra","outputTokens":7386,"runtime":"codex","turns":6,"wallClockMs":315219}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"96ece23c63b791a1","findings":[],"hash":"8b8f21f561f832fe6b662e3f7249698721905a78eb142dbe30d80240c14ff5a8","nodeId":"0294586e-f42f-4cd4-b13d-7dfc604c33cf","outcome":"failed","summary":"the local build failed, so this was not submitted:\nforge build exited with 1:\nCompiling 89 files with Solc 0.8.26\nError: solc exited with signal: 9 (SIGKILL)\n<empty output>","treeHash":null,"usage":{"cachedInputTokens":1163645,"inputTokens":932,"model":"claude-fable-5-1","outputTokens":21305,"runtime":"claude","turns":36,"wallClockMs":1912623}},{"artifacts":[],"attempt":1,"bundleHash":"9a6928bcf4d0ae338626cb162a3f4274516d2a76b44cf3acc12a3dd30a7fc42a","device":"a11137177fc72d8b","findings":[],"hash":"a59b9d52de04335a937717a44e95f21e5f9e89bf01b891936efa25f4f40ad3c3","nodeId":"6fd0f6b5-e227-41d8-978b-299a824be25a","outcome":"completed","summary":"The revision is complete. The full suite passes again, with only two files under `test/` changed.\n\n**What was wrong.** One test from my previous round, `test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool`, failed against the current sources. After my round was accepted, another contributor changed the settlement rules (AUDIT.md item 29): a pool that a crown change skips, because it is broken or out of the bid's gas reach, now pays the king of the earliest reign it was never settled for on its next collection. My test still asserted the earlier rule, where the bidder received the broken pool's fees on retry.\n\n**What I changed.**\n- The test in `test/V3FailureEdges.t.sol` now asserts the documented semantics. The broken pool does not veto the bid, stays stamped with the outgoing reign, and its permissionless recovery pays the outgoing king both ETH and tokens in kind. The bidder receives nothing from that reign, the pool takes the new reign's stamp, and fees earned afterwards go to the new king only. It keeps its distinct failure mode, a token transfer returning false, which the other contributor's settlement tests do not cover.\n- `test/V3-CONTRIBUTOR-REPORT.md` has a revision note explaining the change, refreshed test counts, updated mapping rows for fixes 1 and 2, and current gas and runtime-size figures.\n\n**Verification.**\n\n| Check | Result |\n|---|---|\n| `forge test` with the verifier seed | 193 passed, 0 failed, 0 skipped, 20 suites |\n| V3 suites with the config's pinned seed | 12 passed |\n| `forge fmt --check` on my files | clean |\n| `tools/validate_manifest.py` | manifest valid, all runtimes under 24,576 bytes |\n\nNo new implementation defect was found, so no findings file was written. The accepted imprecision in item 29, where fees a skipped pool earns between the crown change and its next collection also reach the earlier king, is a documented design choice and is noted in the report rather than asserted either way.","treeHash":"1d8d63173b16677528b9b04791adccdad27cdb6e","usage":{"cachedInputTokens":1124435,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":14039,"runtime":"claude","turns":29,"wallClockMs":412749}},{"artifacts":[],"attempt":2,"bundleHash":"48839fbadbe7a49d7ea08c8a221fb68cdf35490596ecf6c45182336138cf7edd","device":"a9158e223bd79f25","findings":[],"hash":"c09b1bdaa2ff12bfeb135a422b09ded989cdb20220cd6c5e07a2a8832e898ee0","nodeId":"0294586e-f42f-4cd4-b13d-7dfc604c33cf","outcome":"completed","summary":"Updated [launch.json](/home/imd-worker/.identitymd/work/d236400b-4e28-4cee-b921-82dddf964f29/0294586e-f42f-4cd4-b13d-7dfc604c33cf/launch.json) with v3 notes, preserving all five contracts and constructor arguments.\n\n- Manifest and artifact validation passed.\n- `forge build` passed.\n- All 174 tests passed with the requested fuzz seed.\n- Local deployment plus later opening: 12,982,118 gas.\n\nOnly `launch.json` changed. No deployment, broadcast, or RPC calls were made.","treeHash":"6cfdb3bcdc43eaae268957a9e4de81e178521462","usage":{"cachedInputTokens":1102976,"inputTokens":66265,"model":"gpt-6-astra","outputTokens":6822,"runtime":"codex","turns":7,"wallClockMs":382919}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7eaf1cd0fb3df712","findings":[],"hash":"c2f7fe784d17bb716205ee3d99bd73557253b50cc7707bce79d505f3aea6089f","nodeId":"0294586e-f42f-4cd4-b13d-7dfc604c33cf","outcome":"failed","summary":"the local build failed, so this was not submitted:\nforge build exited with 1:\nCompiling 89 files with Solc 0.8.26\nError: solc exited with signal: 9 (SIGKILL)\n<empty output>","treeHash":null,"usage":{"cachedInputTokens":966506,"inputTokens":772,"model":"claude-fable-5-1","outputTokens":16174,"runtime":"claude","turns":26,"wallClockMs":669417}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"809ae05b6282abad","findings":[{"citation":"resolved","description":"Published manifest prose contradicts the accepted code. The claimed cap is the pre-fix rule: since revision finding 8b022036 the strict walk in src/PadLiquidity.sol:220-248 sets n = pools.length, collects every pool from distributeCursor while gasleft() >= COLLECT_GAS + COLLECTION_RESERVE_GAS, and reverts `collection gas` only when fewer than min(16, poolCount) pools were visited; takeCrown forwards every unit of gas above its 600k outer reserve (src/KingOfThePad.sol:77-81). The tree contradicts itself: README.md:136-139 states the settlement walks every pool and must reach at least 16 pools or the bid reverts; docs/TEST-REPORT.md:58 records 41 of 60 pools settled by a minimum-gas bid; the author's own tests assert 18 and 60 pools settled in one bid. Second stale sentence, same root cause: docs/VERIFY.md:66-67 still tells verifiers that launch.json.notes is `historical v2 prose`, but commit 1a805d9 replaced the notes with v3 prose, so that instruction now inverts; the notes are v3 prose carrying this one pre-fix clause. No constructor argument, custody, permission or gas ceiling is affected; only the published description of the settlement is wrong.","line":36,"path":"launch.json","reproduction":"1) Read launch.json line 36: it states the crown transition settles up to 16 pool indexes before replacing the king. 2) Run the author's regression for the fixed walk: `forge test --match-test test_extraBidGasSettlesMorePoolsInOneBid -vv` -> PASS, logging `takeCrown gas, sixty real pools fully settled: 7545395`, and asserting settled == 60; `LiquidityV4Test.test_crownPrecollectsAllEighteenPools` (test/LiquidityV4.t.sol) asserts collectedBefore == 18. Expected if the notes were accurate: at most 16 pools settle before the crown moves. Actual: every pool the bid's gas fits settles (16 is only the floor), so the notes are wrong even for a minimum-stipend bid (docs/TEST-REPORT.md:58: 41 of 60). Minimal fix: reword the clause to `walks every pool while the bid's gas fits, at least 16` and drop or update the VERIFY.md historical-v2-prose note.","severity":"low","snippet":"A crown transition requires the full 5M settlement stipend plus reserve and settles up to 16 pool indexes before replacing the king; any unflagged collection failure reverts the bid.","title":"launch.json notes still describe the pre-fix 16-pool settlement cap, which the revised crown walk no longer implements"}],"hash":"d9ade279d518e5d82de1b40abadf2ae4482f2ca6375c4e01f8371d32cef70b2f","nodeId":"58dbd7bb-70da-4451-b32a-ce0ba36bf4fe","outcome":"completed","summary":"Review complete. `.imd-findings.json` holds one new low finding plus a 42-of-42 coverage record, and both findings from my previous round are settled.\n\n**Prior finding (medium), pre-crown settlement cap: fixed.** I ran my attached proof (`Proof_8b0220368ef8.t.sol`, copied to `test/scratch/`) against the revised tree: it now passes, with the bidder receiving 0 in its own bid transaction (previously ~0.1 ETH of the outgoing king's fees). The fix is sound on inspection: `settleCrown` closes a reign into `reignKing[]`, stamps every pool with `settledReign`, walks every pool while gas fits with a min(16, poolCount) floor, and `takeCrown` forwards all gas above its 600k reserve. I traced the payee logic for every boundary (first crown, broken pools skipped by two crowns, unswept pools, pools graduated after a crown change) and found no path where stale-reign fees reach the incoming king. The author's regressions all pass, including the unlock-replay, gas-starved bid, in-kind fees, broken-pool, and cursor-steering cases.\n\n**Prior finding (low), seed fallback: accepted, dropped.** The formula is exactly what the brief prescribes for Fix 4, the limitation is disclosed in AUDIT.md #23 and #30 and in the README, and changing it would contradict the approved spec. No defect against the agreed design.\n\n**New finding (low):** `launch.json` notes still say a crown transition \"settles up to 16 pool indexes\", which was the pre-fix rule. The revised walk settles every pool the bid's gas fits (16 is only the floor); the author's own test asserts 60 pools settled in one bid, and `docs/VERIFY.md:66-67` still calls the notes \"historical v2 prose\" when they are now v3 prose. Published description only, no effect on constructor arguments, custody, or limits; a one-clause rewording fixes it.\n\nSupporting checks all green: 194/194 tests pass, runtime sizes well under 24,576 bytes (largest is `PadGame` at 18,665), deployment code-deposit 10.1M gas and combined deployment plus opening 12,974,791 under the 13M target, and the manifest validator accepts `launch.json` (schema, argument order, notes length).","treeHash":null,"usage":{"cachedInputTokens":1370752,"inputTokens":171971,"model":"claude-fable-5-1","outputTokens":75111,"runtime":"claude","turns":36,"wallClockMs":707080}},{"artifacts":[],"attempt":3,"bundleHash":"90eb089ab6834d1e36cdf972c379b4149834b8de3ffde4fb9331a4253ae513a2","device":"3a40eaafbd83a6bc","findings":[],"hash":"e9085b309a747a4b3434c8ef5f57a34aadc0a0b055c4ef60f4efd92331446aab","nodeId":"0294586e-f42f-4cd4-b13d-7dfc604c33cf","outcome":"completed","summary":"The manifest is complete and verified. No change to launch.json was needed.\n\n**What the rejection was.** The previous attempt failed because the verifier's solc process was SIGKILLed while compiling, not because of anything in the tree. The same build completed here in 5 minutes 15 seconds with peak memory just over 4 GB. That is the cost of via_ir compilation of the vendored v4-core PoolManager plus the test suite, and the verifier's container apparently has less memory than that. The compiler settings live in foundry.toml, which this task may not touch, so the only remedy on this side is to resubmit an unchanged, verified manifest.\n\n**What I verified.**\n- `launch.json` names the five accepted applications in constructor dependency order: PadToken, PadGame, PvPPad, PadLiquidity, KingOfThePad. Arguments are strings, addresses lowercase, owner is `$owner`, and the stated dev recipient and PoolManager address match the accepted source, README and VERIFY.md.\n- The offline validator in tools/validate_manifest.py passes against the built artifacts. All five runtimes are under the EIP-170 limit, constructors are nonpayable and take only address words, and no forbidden opcodes appear.\n- Notes are 3,078 characters, under the 4,000 cap.\n\n| Check | Result |\n|---|---|\n| forge build | ok, 5m15s, peak RSS 4.07 GB |\n| forge test with verifier fuzz seed | 181 passed, 0 failed |\n| validate_manifest.py | valid, total runtime 50,611 bytes |\n\n**Working tree.** Clean. Only the ignored out/ and cache/ directories were produced, and no file outside launch.json was changed.","treeHash":"2bc139cec843c8ce534b53b63c1512beb20a7e9b","usage":{"cachedInputTokens":307206,"inputTokens":226,"model":"claude-fable-5-1","outputTokens":4264,"runtime":"claude","turns":11,"wallClockMs":443235}},{"artifacts":[],"attempt":1,"bundleHash":"61cdccbccdace9e8b4db4bdb76efc3c6f58a18d4e504608b9580e2612bcc6b6c","device":"12fbd676b2122512","findings":[],"hash":"fd7db357054ba0345d59e8c0e315923154d54af55b3b04896fd0a556864844d8","nodeId":"6fd0f6b5-e227-41d8-978b-299a824be25a","outcome":"completed","summary":"Added regression tests, fuzz properties, and two invariant campaigns under `test/`.\n\nVerified: **186 tests passed**, `forge build` passed, and manifest validation passed. New invariants exercised 20,480 randomized calls.\n\n[Coverage and gas report](/home/imd-worker/.identitymd/work/d236400b-4e28-4cee-b921-82dddf964f29/6fd0f6b5-e227-41d8-978b-299a824be25a/test/V3-CONTRIBUTOR-REPORT.md)","treeHash":"fda9888dc577e3306825ab39ec8bbdcc91845a1b","usage":{"cachedInputTokens":5153920,"inputTokens":330160,"model":"gpt-6-astra","outputTokens":43611,"runtime":"codex","turns":10,"wallClockMs":1256799}}],"verification":[{"checks":[{"durationMs":98327,"exitCode":0,"name":"build","output":"Compiling 89 files with Solc 0.8.26\nSolc 0.8.26 finished in 98.23s\nCompiler run successful!\n","passed":true},{"durationMs":2421,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 2973687)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 9933516)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 18953601)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6035567)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1919538)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 16.75ms (17.54ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1015396)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 242733)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 8761258)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1070068)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 899356)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 843472)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9143872)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 572103)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 8973237)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1011216)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 992801)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3755319)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 33019)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 164796)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 31.43ms (22.29ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 60558816)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12188501\n  Later openPad including hook and genesis gas: 786290\n  Combined manifest and later opening gas: 12974791\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 72.15ms (71.98ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 50594258)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5229328)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 978524)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 178613\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1008547)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1008885)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 49863222)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 338.75ms (404.07ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2606743)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 6482752)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 405347)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1150368)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2377533)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 9831139)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4698427\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1889356)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 419.30ms (84.14ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 8933059, ~: 8933172)\nLogs:\n  Bound result 18388529315714645403\n  Bound result 1770311666190782377\n  Bound result 3375\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 9231485, ~: 9231558)\nLogs:\n  Bound result 12399921930435212306\n  Bound result 46393892585148245874\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 12757401, ~: 12237005)\nLogs:\n  Bound result 1\n  Bound result 902397712997\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 8804491, ~: 8804527)\nLogs:\n  Bound result 10000000000000002\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 5699860, ~: 5092424)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 118446943263843349\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37323, ~: 37327)\nLogs:\n  Bound result 393528593821441371459641979\n  Bound result 1815196737906823897\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21445, ~: 21043)\nLogs:\n  Bound result 37119460328768806344\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 37810, ~: 38002)\nLogs:\n  Bound result 2607964262283\n  Bound result 166716377717618149\n  Bound result 3085261407512841097\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 9149182, ~: 10615813)\nLogs:\n  Bound result 1\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 476.85ms (2.81s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35222)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 12107701)\nLogs:\n  takeCrown gas, eighteen real pools: 2730025\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 8837579)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 14622889)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 9512888)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 8508631)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 1832278)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 3570582)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 9213970)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 875.88ms (829.78ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 89176270, ~: 87106966)\nLogs:\n  Bound result 228\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2617434)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 11513406)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 69883800)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4697256)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52035321)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 884.19ms (986.03ms CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6064112)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2290732)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 18981048)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7545395\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 687376)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 456447)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 22825729)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 41\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 5928561)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 961.94ms (2.02s CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2046372)\n[PASS] test_claimableWinner() (gas: 2783903)\n[PASS] test_conservationOfEth() (gas: 5728942)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 42648)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2353150)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2422728)\n[PASS] test_deathAndAllDeadEnd() (gas: 1916375)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1599750)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2495264)\n[PASS] test_failedPushBecomesClaimable() (gas: 1513511)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5254373)\n[PASS] test_finalizeRanksAndPays() (gas: 4614029)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1730760)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 113393829)\n[PASS] test_finalizerFeeCapped() (gas: 12163201)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1775562)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 368289)\n[PASS] test_fundPotOnlyPad() (gas: 44052)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 19540408)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3517113)\n[PASS] test_graduateOnlyFromGame() (gas: 71095)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 7750773)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1499725)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4082380)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9174715)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7149117)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2322852)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1923163)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1854360)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1757327)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1449820)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1381889)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3072782)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1537475)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 2700852)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 2.21s (179.00ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 13097945)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 19033852)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16767)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 9351495)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 10234211)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 1695782)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 10538154)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922540\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 9006482)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 8942886)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.21s (109.03ms CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 19408367, ~: 13650949)\nLogs:\n  Bound result 89\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116336029)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2655494\n  5000-entry draw total gas: 16172036\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54121915)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 411762)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 618152)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8249368)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1202721)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 4955327)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 652478)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 698940)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 50771590)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 524318)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 51346048)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 95765182)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1888788)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.26s (5.09s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 3370767)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 4114264)\n[PASS] test_claimNothingReverts() (gas: 1175276)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9679)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 9172750)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 12315850)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 18438929)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 2578827)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 3501246)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 5041313)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 119099243)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 3802274\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 28932873)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 15653580)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 12605400)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 2450520)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 3315862)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 1081887)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9202)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 2482645)\n[PASS] test_launchViewsRejectIdZero() (gas: 33161)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 2698420)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 9515698)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 9059312)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 8364571)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78234)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 993325)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 1033031)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 8807465)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 9466045)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 9701996)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 3866186)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 2760141)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 8452006)\n[PASS] test_singleLivingImpTakesEverything() (gas: 5046311)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 2446482)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 8496697)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 2.26s (225.93ms CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107198)\n[PASS] test_bindingsAreOneShot() (gas: 87834)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 10878651)\n[PASS] test_closedPadRevertsEverything() (gas: 103810)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 693079)\n[PASS] test_deployGasUnderBudget() (gas: 19924)\n[PASS] test_deployHookOnlyByPad() (gas: 30977)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 11965822)\n[PASS] test_fundGamesOnlyKing() (gas: 39635)\n[PASS] test_hookRejectsForeignInitialize() (gas: 1122360)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 9130196)\n[PASS] test_launchValidatesStrings() (gas: 8436843)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 992662)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 1023905)\n[PASS] test_openPadOnlyOnce() (gas: 1064834)\n[PASS] test_openPadRejectsBadSalt() (gas: 213408)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 280598)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 1414126)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 32747688)\n[PASS] test_templatesCannotBeInitialized() (gas: 1163447)\n[PASS] test_upkeepForOnlyGames() (gas: 1210455)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.26s (87.62ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_curveNeverUnderchargesAndNeverOversells\n[PASS] invariant_fundedPotIsPartOfPotAndClearedByFinalize\n[PASS] invariant_gameBalanceEqualsObligations\n[PASS] invariant_genesisGatesLaunchesAndKing\n[PASS] invariant_impsAndRollsBounded\n[PASS] invariant_kingHoldsOnlyClaimables\n[PASS] invariant_liquidityBalanceEqualsObligations\n[PASS] invariant_padHoldsOnlyCarryPot\n[PASS] invariant_systemEthConserved\n[PASS] invariant_tokenSupplyFixedAndFullyAccounted\n[PASS] invariant_tokenUnlockedOnlyBySuccessfulGraduation\n InvariantTest invariants (runs: 40, calls: 2400, reverts: 0)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 101   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 107   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 134   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 96    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 110   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 215   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 192   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 0\n  Bound result 489999999999999993\n  Bound result 489999999999999993\n  Bound result 400000\n  Bound result 1\n  Bound result 3000\n  Bound result 2995000000000000096\n  Bound result 0\n  Bound result 2995000000000000021\n  Bound result 2995000000000014331\n  Bound result 61\n  Bound result 16384\n  Bound result 13403\n  Bound result 63\n  Bound result 40\n  Bound result 1306165815548362784\n  Bound result 4\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 257\n  Bound result 58\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.31s (2.30s CPU time)\n\nRan 15 test suites in 2.31s (17.58s CPU time): 181 tests passed, 0 failed, 0 skipped (181 total tests)\n","passed":true},{"durationMs":62,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.transfer(address,uint256)\",\"PadToken.transferFrom(address,address,uint256)\",\"PadToken.unlock()\",\"PvPPad.bindLiquidity()\",\"PvPPad.fundCarry()\",\"PvPPad.fundGames()\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.restartGenesis()\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"README.md\":209,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT.md\":311,\"docs/TEST-REPORT.md\":123,\"docs/VERIFY.md\":78,\"foundry.toml\":22,\"launch.json\":37,\"remappings.txt\":2,\"src/KingOfThePad.sol\":127,\"src/PadGame.sol\":682,\"src/PadHook.sol\":24,\"src/PadLiquidity.sol\":432,\"src/PadToken.sol\":86,\"src/PvPPad.sol\":306,\"src/interfaces/Interfaces.sol\":110,\"src/libs/PadLib.sol\":108,\"test/Adversarial.t.sol\":796,\"test/AtomicDeployment.t.sol\":101,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":211,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":761,\"test/Invariants.t.sol\":576,\"test/King.t.sol\":314,\"test/LiquidityV4.t.sol\":248,\"test/Pad.t.sol\":299,\"test/Raffle.t.sol\":408,\"test/RaffleEdges.t.sol\":273,\"test/RealV4.sol\":79,\"test/Revision.t.sol\":263,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":58},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":6131,"exitCode":0,"name":"slither","output":"[high/medium] incorrect-exp at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[high/medium] msg-value-loop at src/PvPPad.sol:187: PvPPad.fundGames() (src/PvPPad.sol#187-217) use msg.value in a loop: share = msg.value - sent (src/PvPPad.sol#212)\n[high/medium] msg-value-loop at src/PvPPad.sol:187: PvPPad.fundGames() (src/PvPPad.sol#187-217) use msg.value in a loop: share = msg.value * pots[i_scope_0] / total (src/PvPPad.sol#211)\n[high/medium] msg-value-loop at src/PvPPad.sol:187: PvPPad.fundGames() (src/PvPPad.sol#187-217) use msg.value in a loop: share = msg.value / count (src/PvPPad.sol#211)\n[high/medium] reentrancy-eth at src/PadLiquidity.sol:343: Reentrancy in PadLiquidity.claim() (src/PadLiquidity.sol#343-353):\n[high/medium] reentrancy-eth at src/PadGame.sol:243: Reentrancy in PadGame.roll() (src/PadGame.sol#243-278):\n[high/medium] reentrancy-eth at src/PadGame.sol:305: Reentrancy in PadGame.upkeepStep(address) (src/PadGame.sol#305-317):\n[high/medium] reentrancy-eth at src/KingOfThePad.sol:60: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#60-103):\n[high/high] uninitialized-state at src/PadGame.sol:156: PadGame.entrants (src/PadGame.sol#98) is never initialized. It is used in:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/PadGame.sol:558: PadGame._finalize(address) (src/PadGame.sol#558-625) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/PvPPad.sol:273: PvPPad.genesisFailed() (src/PvPPad.sol#273-276) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:558: PadGame._finalize(address) (src/PadGame.sol#558-625) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:267: PvPPad.genesisGraduated() (src/PvPPad.sol#267-271) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:365: PadGame.bellRang() (src/PadGame.sol#365-367) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:220: Reentrancy in PadLiquidity._distribute(uint256,bool) (src/PadLiquidity.sol#220-248):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:163: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#163-193):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:311: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#311-324):\n[medium/medium] reentrancy-no-eth at src/KingOfThePad.sol:60: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#60-103):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:233: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#233-254):\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:558: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#558-625):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:261: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#261-283):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:287: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#287-301):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:95: Reentrancy in PvPPad.restartGenesis() (src/PvPPad.sol#95-102):\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:225: PadLiquidity._distribute(uint256,bool).floor (src/PadLiquidity.sol#225) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:209: PvPPad.fundGames().sent (src/PvPPad.sol#209) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:600: PadGame._finalize(address).paid (src/PadGame.sol#600) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:609: PadGame._finalize(address).sent (src/PadGame.sol#609) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:590: PadGame._finalize(address).returned (src/PadGame.sol#590) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:516: PadGame._resolveRoll(uint256,address).d (src/PadGame.sol#516) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:193: PvPPad.fundGames().count (src/PvPPad.sol#193) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:564: PadGame._finalize(address).living (src/PadGame.sol#564) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:517: PadGame._resolveRoll(uint256,address).expired (src/PadGame.sol#517) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:194: PvPPad.fundGames().total (src/PvPPad.sol#194) is a local variable never initialized\n[medium/medium] unused-return at src/PadLiquidity.sol:163: PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#163-193) ignores return value by poolManager.initialize(key,sqrtP) (src/PadLiquidity.sol#182)\n[medium/medium] unused-return at src/PadLiquidity.sol:406: PadLiquidity._settleToken(address,uint256) (src/PadLiquidity.sol#406-411) ignores return value by poolManager.settle() (src/PadLiquidity.sol#410)\n[medium/medium] unused-return at src/PadGame.sol:156: PadGame.enter() (src/PadGame.sol#156-170) ignores return value by entrants.push(msg.sender) (src/PadGame.sol#163)\n[medium/medium] unused-return at src/PadGame.sol:243: PadGame.roll() (src/PadGame.sol#243-278) ignores return value by rolls.push(Roll(uint32(idx - 1),imp.nonce,uint64(ARB.arbBlockNumber()),false,false,0)) (src/PadGame.sol#266)\n[medium/medium] unused-return at src/PadLiquidity.sol:356: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#356-396) ignores return value by (None,fees) = poolManager.modifyLiquidity(key_scope_0,ModifyLiquidityParams(MIN_TICK,MAX_TICK,0,0),) (src/PadLiquidity.sol#375)\n[medium/medium] unused-return at src/PadLiquidity.sol:398: PadLiquidity._settleEth(uint256) (src/PadLiquidity.sol#398-404) ignores return value by poolManager.settle{value: amount}() (src/PadLiquidity.sol#403)\n[medium/medium] unused-return at src/PadGame.sol:181: PadGame._draw(uint256,address) (src/PadGame.sol#181-240) ignores return value by imps.push(Imp(who,0,0,0,0,0,0)) (src/PadGame.sol#229)\n[medium/medium] unused-return at src/PadLiquidity.sol:356: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#356-396) ignores return value by (delta,None) = poolManager.modifyLiquidity(key,ModifyLiquidityParams(MIN_TICK,MAX_TICK,int256(l),0),) (src/PadLiquidity.sol#362-363)\n[low/medium] missing-zero-check at src/PadGame.sol:144: PadGame.initialize(uint256,address,address,bool).liquidity_ (src/PadGame.sol#144) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadLiquidity.sol:137: PadLiquidity.deployHook(bytes32).h (src/PadLiquidity.sol#137) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadHook.sol:14: PadHook.constructor(address,address).liquidity_ (src/PadHook.sol#14) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadToken.sol:33: PadToken.initialize(string,string,address,address).game_ (src/PadToken.sol#33) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadHook.sol:14: PadHook.constructor(address,address).poolManager_ (src/PadHook.sol#14) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadToken.sol:33: PadToken.initialize(string,string,address,address).liquidity_ (src/PadToken.sol#33) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadGame.sol:144: PadGame.initialize(uint256,address,address,bool).token_ (src/PadGame.sol#144) lacks a zero-check on :\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#512)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#523)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#524)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#525)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#512)\n[low/medium] calls-loop at src/PadLiquidity.sol:261: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#261-283) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#274)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#525)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#525)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#512)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#525)\n[low/medium] calls-loop at src/PvPPad.sol:187: PvPPad.fundGames() (src/PvPPad.sol#187-217) has external calls inside a loop: (live,p) = IPadGame(game).isLiveForKing() (src/PvPPad.sol#197)\n[low/medium] calls-loop at src/PadLiquidity.sol:261: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#261-283) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#274)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#524)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#524)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#512)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#523)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#523)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#523)\n[low/medium] calls-loop at src/PadLiquidity.sol:261: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#261-283) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,payee) (src/PadLiquidity.sol#265-282)\n[low/medium] calls-loop at src/PvPPad.sol:187: PvPPad.fundGames() (src/PvPPad.sol#187-217) has external calls inside a loop: IPadGame(games[i_scope_0]).fundPot{value: share}() (src/PvPPad.sol#214)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#524)\n[low/medium] calls-loop at src/PadLiquidity.sol:261: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#261-283) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,payee) (src/PadLiquidity.sol#265-282)\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:163: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#163-193):\n[low/medium] reentrancy-benign at src/PadGame.sol:243: Reentrancy in PadGame.roll() (src/PadGame.sol#243-278):\n[low/medium] reentrancy-benign at src/PvPPad.sol:108: Reentrancy in PvPPad.openPad(bytes32) (src/PvPPad.sol#108-119):\n[low/medium] reentrancy-benign at src/PvPPad.sol:233: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#233-254):\n[low/medium] reentrancy-benign at src/PvPPad.sol:108: Reentrancy in PvPPad.openPad(bytes32) (src/PvPPad.sol#108-119):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:163: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#163-193):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:311: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#311-324):\n[low/medium] reentrancy-benign at src/KingOfThePad.sol:60: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#60-103):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:287: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#287-301):\n[low/medium] reentrancy-benign at src/PadGame.sol:558: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#558-625):\n[low/medium] reentrancy-events at src/PvPPad.sol:108: Reentrancy in PvPPad.openPad(bytes32) (src/PvPPad.sol#108-119):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:287: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#287-301):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:311: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#311-324):\n[low/medium] reentrancy-events at src/KingOfThePad.sol:111: Reentrancy in KingOfThePad.claim() (src/KingOfThePad.sol#111-118):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:261: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#261-283):\n[low/medium] reentrancy-events at src/PadGame.sol:558: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#558-625):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:343: Reentrancy in PadLiquidity.claim() (src/PadLiqui","passed":true},{"durationMs":340,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PadLiquidity.sol:147: `abi.encodePacked()` Hash Collision\n[high] contract-locks-ether at src/PvPPad.sol:9: Contract locks Ether without a withdraw function\n[high] eth-send-unchecked-address at src/KingOfThePad.sol:111: ETH transferred without address checks (3 places)\n[high] incorrect-caret-operator at src/libs/PadLib.sol:51: Incorrect use of caret operator\n[high] msg-value-in-loop at src/PvPPad.sol:210: Loop contains `msg.value`\n[high] reentrancy-state-change at src/KingOfThePad.sol:61: Reentrancy: State change after external call (21 places)\n[high] unsafe-casting at src/PadLiquidity.sol:266: Unsafe Casting of integers (2 places)\n[low] costly-loop at src/PadGame.sol:214: Costly operations inside loop (4 places)\n[low] large-numeric-literal at src/KingOfThePad.sol:17: Large Numeric Literal (21 places)\n[low] literal-instead-of-constant at src/KingOfThePad.sol:71: Literal Instead of Constant (42 places)\n[low] missing-inheritance at src/KingOfThePad.sol:14: Missing Inheritance (4 places)\n[low] require-revert-in-loop at src/PadLiquidity.sol:236: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/PvPPad.sol:222: State Change Without Event (2 places)\n[low] state-no-address-check at src/PadGame.sol:148: Address State Variable Set Without Checks (4 places)\n[low] unchecked-return at src/PadGame.sol:312: Unchecked Return (4 places)\n[low] uninitialized-local-variable at src/PadGame.sol:214: Uninitialized Local Variable (6 places)\n[low] unsafe-erc20-operation at src/PadGame.sol:274: Unsafe ERC20 Operation (6 places)\n[low] unused-public-function at src/PadGame.sol:365: Public Function Not Used Internally (3 places)","passed":true},{"durationMs":16302,"exitCode":0,"name":"proof 8b0220368ef8","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 15.71s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-93df88ac/Proof_8b0220368ef8.t.sol:CrownDiversionProof\n[PASS] test_bidTransactionMustNotPayOldReignFeesToTheBidder() (gas: 5303488)\nLogs:\n  bidder received inside its own bid tx: 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 26.85ms (2.57ms CPU time)\n\nRan 1 test suite in 27.83ms (26.85ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"07e7274666db490d7274fac35b7cd56fecb833e7e3723d91fedd47935a8c24c6","verifiedTreeHash":"19896f1a3fcd8ec4e591492b2d973ae8d14b221a","verifierVersion":"0.1.0+aca6c688"},{"checks":[{"durationMs":190580,"exitCode":0,"name":"build","output":"Compiling 88 files with Solc 0.8.26\nSolc 0.8.26 finished in 190.37s\nCompiler run successful!\n","passed":true},{"durationMs":5426,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 23067120)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12195652\n  Later openPad including hook and genesis gas: 786466\n  Combined manifest and later opening gas: 12982118\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 43.40ms (43.06ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1017659)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 244075)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 8762328)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1028080)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 891417)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 839783)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9147403)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 569344)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 8979305)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 967242)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 993664)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3754526)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 33151)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 165025)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 168.00ms (58.07ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2423092)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 6364780)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 405479)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1143183)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2291231)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 9688316)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4568783\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1843020)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 585.31ms (174.64ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 50037839)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5233637)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 978788)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 178613\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1008811)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1009149)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 49931611)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 654.40ms (926.85ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2047667)\n[PASS] test_claimableWinner() (gas: 2785713)\n[PASS] test_conservationOfEth() (gas: 5733302)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 42648)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2354498)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2424142)\n[PASS] test_deathAndAllDeadEnd() (gas: 1917333)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1600444)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2496962)\n[PASS] test_failedPushBecomesClaimable() (gas: 1514282)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5258684)\n[PASS] test_finalizeRanksAndPays() (gas: 4617959)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1731558)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 113512067)\n[PASS] test_finalizerFeeCapped() (gas: 12173655)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1776360)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 368518)\n[PASS] test_fundPotOnlyPad() (gas: 44052)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 19548931)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3519230)\n[PASS] test_graduateOnlyFromGame() (gas: 71139)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 7754161)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1500642)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4084773)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9179664)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7155753)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2324120)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1923961)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1855414)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1758125)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1450565)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1382458)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3074780)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1538044)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 2700622)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 656.75ms (347.14ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 13104561)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 19031583)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 17009)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 9347793)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 10157572)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 1696495)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 10540451)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922540\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 9010208)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 8942947)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 687.09ms (184.26ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 8933108, ~: 8933190)\nLogs:\n  Bound result 15921185192148548027\n  Bound result 471\n  Bound result 56\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 9192533, ~: 9192611)\nLogs:\n  Bound result 16079432639071641108\n  Bound result 47366815410138068573\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 13318424, ~: 12246479)\nLogs:\n  Bound result 1\n  Bound result 902397712997\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 8804910, ~: 8804941)\nLogs:\n  Bound result 49990000000002097153\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 6028866, ~: 6056352)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 118446943263843349\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37322, ~: 37327)\nLogs:\n  Bound result 754867752364142765183308335\n  Bound result 686902517736954864\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21447, ~: 21043)\nLogs:\n  Bound result 3135424969\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 37838, ~: 38039)\nLogs:\n  Bound result 796247245874660579182381030\n  Bound result 2622886383225522990\n  Bound result 2718229471666940625\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 9161229, ~: 10620900)\nLogs:\n  Bound result 1\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 804.90ms (4.06s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35398)\n[PASS] test_crownPrecollectsSixteenOfEighteenPools() (gas: 11843844)\nLogs:\n  takeCrown gas, eighteen real pools: 2544969\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 8837766)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 14547104)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 9473475)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 8512877)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 1831417)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 3570825)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 9210109)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.28s (1.55s CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 86999136, ~: 83351627)\nLogs:\n  Bound result 228\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2618477)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 11454827)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 69984422)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4699862)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52102550)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.64s (1.82s CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 2975432)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 9938537)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 18972132)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6039279)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1921851)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 4.12s (23.80ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_curveNeverUnderchargesAndNeverOversells\n[PASS] invariant_fundedPotIsPartOfPotAndClearedByFinalize\n[PASS] invariant_gameBalanceEqualsObligations\n[PASS] invariant_genesisGatesLaunchesAndKing\n[PASS] invariant_impsAndRollsBounded\n[PASS] invariant_kingHoldsOnlyClaimables\n[PASS] invariant_liquidityBalanceEqualsObligations\n[PASS] invariant_padHoldsOnlyCarryPot\n[PASS] invariant_systemEthConserved\n[PASS] invariant_tokenSupplyFixedAndFullyAccounted\n[PASS] invariant_tokenUnlockedOnlyBySuccessfulGraduation\n InvariantTest invariants (runs: 40, calls: 2400, reverts: 0)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 101   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 107   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 134   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 96    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 110   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 215   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 192   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 8\n  Bound result 0\n  Bound result 10000000000\n  Bound result 10000000000\n  Bound result 100000000000000000\n  Bound result 0\n  Bound result 60\n  Bound result 2995000000000002990\n  Bound result 0\n  Bound result 2995000000000000091\n  Bound result 2995000000000017750\n  Bound result 68621649964679874\n  Bound result 10\n  Bound result 16282\n  Bound result 640\n  Bound result 265\n  Bound result 1306165815548362784\n  Bound result 4\n  Bound result 0\n  Bound result 100\n  Bound result 0\n  Bound result 720\n  Bound result 157\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.36s (4.34s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 18753509, ~: 15934251)\nLogs:\n  Bound result 89\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116336205)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2655494\n  5000-entry draw total gas: 16172036\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54190876)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 411991)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 619187)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8253556)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1202721)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 4958435)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 653042)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 699169)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 50838819)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 524318)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 51413563)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 95848826)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1890872)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 5.21s (10.51s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 3372329)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 4116618)\n[PASS] test_claimNothingReverts() (gas: 1175848)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9679)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 9133278)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 12325368)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 18429233)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 2579826)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 3503289)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 5044106)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 119212565)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 3802560\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 28953202)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 15658936)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 12609383)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 2451462)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 3317424)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 1082371)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9202)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 2483644)\n[PASS] test_launchViewsRejectIdZero() (gas: 33161)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 2699419)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 9520044)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 9063038)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 8370405)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78234)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 993809)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 1033691)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 8807905)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 9462493)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 9659398)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 3867977)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 2761368)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 8455446)\n[PASS] test_singleLivingImpTakesEverything() (gas: 5049242)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 2447423)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 8500401)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 5.21s (508.64ms CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107374)\n[PASS] test_bindingsAreOneShot() (gas: 87900)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 10884003)\n[PASS] test_closedPadRevertsEverything() (gas: 103810)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 693387)\n[PASS] test_deployGasUnderBudget() (gas: 19924)\n[PASS] test_deployHookOnlyByPad() (gas: 31153)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 11967724)\n[PASS] test_fundGamesOnlyKing() (gas: 39635)\n[PASS] test_hookRejectsForeignInitialize() (gas: 1122844)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 9133926)\n[PASS] test_launchValidatesStrings() (gas: 8440287)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 993146)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 1024697)\n[PASS] test_openPadOnlyOnce() (gas: 1065318)\n[PASS] test_openPadRejectsBadSalt() (gas: 213760)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 280906)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 1414839)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 32693965)\n[PASS] test_templatesCannotBeInitialized() (gas: 1163931)\n[PASS] test_upkeepForOnlyGames() (gas: 1211168)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 5.21s (169.79ms CPU time)\n\nRan 14 test suites in 5.22s (30.61s CPU time): 174 tests passed, 0 failed, 0 skipped (174 total tests)\n","passed":true},{"durationMs":116,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.transfer(address,uint256)\",\"PadToken.transferFrom(address,address,uint256)\",\"PadToken.unlock()\",\"PvPPad.bindLiquidity()\",\"PvPPad.fundCarry()\",\"PvPPad.fundGames()\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.restartGenesis()\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"README.md\":198,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT.md\":268,\"docs/TEST-REPORT.md\":118,\"docs/VERIFY.md\":78,\"foundry.toml\":22,\"launch.json\":37,\"remappings.txt\":2,\"src/KingOfThePad.sol\":122,\"src/PadGame.sol\":682,\"src/PadHook.sol\":24,\"src/PadLiquidity.sol\":403,\"src/PadToken.sol\":86,\"src/PvPPad.sol\":306,\"src/interfaces/Interfaces.sol\":110,\"src/libs/PadLib.sol\":108,\"test/Adversarial.t.sol\":796,\"test/AtomicDeployment.t.sol\":101,\"test/AuditV3.t.sol\":395,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":211,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":761,\"test/Invariants.t.sol\":576,\"test/King.t.sol\":314,\"test/LiquidityV4.t.sol\":244,\"test/Pad.t.sol\":299,\"test/Raffle.t.sol\":408,\"test/RaffleEdges.t.sol\":273,\"test/RealV4.sol\":79,\"test/Revision.t.sol\":263,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":58},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":12249,"exitCode":0,"name":"slither","output":"[high/medium] incorrect-exp at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[high/medium] msg-value-loop at src/PvPPad.sol:187: PvPPad.fundGames() (src/PvPPad.sol#187-217) use msg.value in a loop: share = msg.value - sent (src/PvPPad.sol#212)\n[high/medium] msg-value-loop at src/PvPPad.sol:187: PvPPad.fundGames() (src/PvPPad.sol#187-217) use msg.value in a loop: share = msg.value * pots[i_scope_0] / total (src/PvPPad.sol#211)\n[high/medium] msg-value-loop at src/PvPPad.sol:187: PvPPad.fundGames() (src/PvPPad.sol#187-217) use msg.value in a loop: share = msg.value / count (src/PvPPad.sol#211)\n[high/medium] reentrancy-eth at src/PadGame.sol:243: Reentrancy in PadGame.roll() (src/PadGame.sol#243-278):\n[high/medium] reentrancy-eth at src/PadGame.sol:305: Reentrancy in PadGame.upkeepStep(address) (src/PadGame.sol#305-317):\n[high/medium] reentrancy-eth at src/KingOfThePad.sol:58: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#58-99):\n[high/medium] reentrancy-eth at src/PadLiquidity.sol:314: Reentrancy in PadLiquidity.claim() (src/PadLiquidity.sol#314-324):\n[high/high] uninitialized-state at src/PadGame.sol:156: PadGame.entrants (src/PadGame.sol#98) is never initialized. It is used in:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/PadGame.sol:558: PadGame._finalize(address) (src/PadGame.sol#558-625) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:27: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#27-60) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/PvPPad.sol:273: PvPPad.genesisFailed() (src/PvPPad.sol#273-276) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:558: PadGame._finalize(address) (src/PadGame.sol#558-625) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:267: PvPPad.genesisGraduated() (src/PvPPad.sol#267-271) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:365: PadGame.bellRang() (src/PadGame.sol#365-367) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:205: Reentrancy in PadLiquidity._distribute(uint256,bool) (src/PadLiquidity.sol#205-224):\n[medium/medium] reentrancy-no-eth at src/KingOfThePad.sol:58: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#58-99):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:233: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#233-254):\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:558: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#558-625):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:235: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#235-254):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:282: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#282-295):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:151: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#151-181):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:258: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#258-272):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:95: Reentrancy in PvPPad.restartGenesis() (src/PvPPad.sol#95-102):\n[medium/medium] uninitialized-local at src/PvPPad.sol:209: PvPPad.fundGames().sent (src/PvPPad.sol#209) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:600: PadGame._finalize(address).paid (src/PadGame.sol#600) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:609: PadGame._finalize(address).sent (src/PadGame.sol#609) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:590: PadGame._finalize(address).returned (src/PadGame.sol#590) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:516: PadGame._resolveRoll(uint256,address).d (src/PadGame.sol#516) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:193: PvPPad.fundGames().count (src/PvPPad.sol#193) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:564: PadGame._finalize(address).living (src/PadGame.sol#564) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:517: PadGame._resolveRoll(uint256,address).expired (src/PadGame.sol#517) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:194: PvPPad.fundGames().total (src/PvPPad.sol#194) is a local variable never initialized\n[medium/medium] unused-return at src/PadGame.sol:156: PadGame.enter() (src/PadGame.sol#156-170) ignores return value by entrants.push(msg.sender) (src/PadGame.sol#163)\n[medium/medium] unused-return at src/PadGame.sol:243: PadGame.roll() (src/PadGame.sol#243-278) ignores return value by rolls.push(Roll(uint32(idx - 1),imp.nonce,uint64(ARB.arbBlockNumber()),false,false,0)) (src/PadGame.sol#266)\n[medium/medium] unused-return at src/PadLiquidity.sol:327: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#327-367) ignores return value by (delta,None) = poolManager.modifyLiquidity(key,ModifyLiquidityParams(MIN_TICK,MAX_TICK,int256(l),0),) (src/PadLiquidity.sol#333-334)\n[medium/medium] unused-return at src/PadLiquidity.sol:369: PadLiquidity._settleEth(uint256) (src/PadLiquidity.sol#369-375) ignores return value by poolManager.settle{value: amount}() (src/PadLiquidity.sol#374)\n[medium/medium] unused-return at src/PadLiquidity.sol:377: PadLiquidity._settleToken(address,uint256) (src/PadLiquidity.sol#377-382) ignores return value by poolManager.settle() (src/PadLiquidity.sol#381)\n[medium/medium] unused-return at src/PadGame.sol:181: PadGame._draw(uint256,address) (src/PadGame.sol#181-240) ignores return value by imps.push(Imp(who,0,0,0,0,0,0)) (src/PadGame.sol#229)\n[medium/medium] unused-return at src/PadLiquidity.sol:151: PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#151-181) ignores return value by poolManager.initialize(key,sqrtP) (src/PadLiquidity.sol#170)\n[medium/medium] unused-return at src/PadLiquidity.sol:327: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#327-367) ignores return value by (None,fees) = poolManager.modifyLiquidity(key_scope_0,ModifyLiquidityParams(MIN_TICK,MAX_TICK,0,0),) (src/PadLiquidity.sol#346)\n[low/medium] missing-zero-check at src/PadGame.sol:144: PadGame.initialize(uint256,address,address,bool).liquidity_ (src/PadGame.sol#144) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadHook.sol:14: PadHook.constructor(address,address).liquidity_ (src/PadHook.sol#14) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadLiquidity.sol:125: PadLiquidity.deployHook(bytes32).h (src/PadLiquidity.sol#125) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadToken.sol:33: PadToken.initialize(string,string,address,address).game_ (src/PadToken.sol#33) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadHook.sol:14: PadHook.constructor(address,address).poolManager_ (src/PadHook.sol#14) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadToken.sol:33: PadToken.initialize(string,string,address,address).liquidity_ (src/PadToken.sol#33) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadGame.sol:144: PadGame.initialize(uint256,address,address,bool).token_ (src/PadGame.sol#144) lacks a zero-check on :\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#512)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#523)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#524)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#525)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#512)\n[low/medium] calls-loop at src/PadLiquidity.sol:235: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#235-254) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#245)\n[low/medium] calls-loop at src/PadLiquidity.sol:235: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#235-254) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,k) (src/PadLiquidity.sol#237-253)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#525)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#525)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#512)\n[low/medium] calls-loop at src/PadLiquidity.sol:235: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#235-254) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#245)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#525)\n[low/medium] calls-loop at src/PvPPad.sol:187: PvPPad.fundGames() (src/PvPPad.sol#187-217) has external calls inside a loop: (live,p) = IPadGame(game).isLiveForKing() (src/PvPPad.sol#197)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#524)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#524)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#512)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#523)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#523)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#523)\n[low/medium] calls-loop at src/PvPPad.sol:187: PvPPad.fundGames() (src/PvPPad.sol#187-217) has external calls inside a loop: IPadGame(games[i_scope_0]).fundPot{value: share}() (src/PvPPad.sol#214)\n[low/medium] calls-loop at src/PadLiquidity.sol:235: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#235-254) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,k) (src/PadLiquidity.sol#237-253)\n[low/medium] calls-loop at src/PadGame.sol:509: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#509-556) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#524)\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:258: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#258-272):\n[low/medium] reentrancy-benign at src/PadGame.sol:243: Reentrancy in PadGame.roll() (src/PadGame.sol#243-278):\n[low/medium] reentrancy-benign at src/PvPPad.sol:108: Reentrancy in PvPPad.openPad(bytes32) (src/PvPPad.sol#108-119):\n[low/medium] reentrancy-benign at src/PvPPad.sol:233: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#233-254):\n[low/medium] reentrancy-benign at src/KingOfThePad.sol:58: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#58-99):\n[low/medium] reentrancy-benign at src/PvPPad.sol:108: Reentrancy in PvPPad.openPad(bytes32) (src/PvPPad.sol#108-119):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:151: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#151-181):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:151: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#151-181):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:282: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#282-295):\n[low/medium] reentrancy-benign at src/PadGame.sol:558: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#558-625):\n[low/medium] reentrancy-events at src/PvPPad.sol:108: Reentrancy in PvPPad.openPad(bytes32) (src/PvPPad.sol#108-119):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:258: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#258-272):\n[low/medium] reentrancy-events at src/KingOfThePad.sol:58: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#58-99):\n[low/medium] reentrancy-events at src/KingOfThePad.sol:106: Reentrancy in KingOfThePad.claim() (src/KingOfThePad.sol#106-113):\n[low/medium] reentrancy-events at src/PadGame.sol:558: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#558-625):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:235: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#235-254):\n[low/medium] reentrancy-events at src/PvPPad.sol:142: Reentrancy in PvPPad._create(string,string,string,address,bool) (src/PvPPad.sol#142-154):\n[low/medium] reentrancy-events at src/PadGame.sol:667: Reentrancy in PadGame._graduate() (src/PadGame.sol#667-681):\n[low/medium] reentrancy-events at src","passed":true},{"durationMs":790,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PadLiquidity.sol:135: `abi.encodePacked()` Hash Collision\n[high] contract-locks-ether at src/PvPPad.sol:9: Contract locks Ether without a withdraw function\n[high] eth-send-unchecked-address at src/KingOfThePad.sol:106: ETH transferred without address checks (3 places)\n[high] incorrect-caret-operator at src/libs/PadLib.sol:51: Incorrect use of caret operator\n[high] msg-value-in-loop at src/PvPPad.sol:210: Loop contains `msg.value`\n[high] reentrancy-state-change at src/KingOfThePad.sol:59: Reentrancy: State change after external call (21 places)\n[high] unsafe-casting at src/PadLiquidity.sol:247: Unsafe Casting of integers\n[low] costly-loop at src/PadGame.sol:214: Costly operations inside loop (4 places)\n[low] large-numeric-literal at src/KingOfThePad.sol:15: Large Numeric Literal (21 places)\n[low] literal-instead-of-constant at src/KingOfThePad.sol:69: Literal Instead of Constant (42 places)\n[low] missing-inheritance at src/KingOfThePad.sol:14: Missing Inheritance (4 places)\n[low] require-revert-in-loop at src/PadLiquidity.sol:212: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/PvPPad.sol:222: State Change Without Event (2 places)\n[low] state-no-address-check at src/PadGame.sol:148: Address State Variable Set Without Checks (4 places)\n[low] unchecked-return at src/PadGame.sol:312: Unchecked Return (4 places)\n[low] uninitialized-local-variable at src/PadGame.sol:214: Uninitialized Local Variable (6 places)\n[low] unsafe-erc20-operation at src/PadGame.sol:274: Unsafe ERC20 Operation (6 places)\n[low] unused-public-function at src/PadGame.sol:365: Public Function Not Used Internally (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5e863bb2bc1e67872cb618e36a6a0a73da47e6789ce635b5d1c100616bb82841","verifiedTreeHash":"75d149c5bf69751f3a4260920bc8f25e09db3a16","verifierVersion":"0.1.0+5e560cc8"},{"checks":[{"durationMs":144435,"exitCode":0,"name":"build","output":"Compiling 94 files with Solc 0.8.26\nSolc 0.8.26 finished in 144.32s\nCompiler run successful!\n","passed":true},{"durationMs":5651,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/V3FailureEdges.t.sol:V3PoolFailureEdgesTest\n[PASS] test_onlyCrownMayRequestStrictSettlementAndIndexErrorsDoNotChangeHealth() (gas: 169116)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 778846)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3555883)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1356149)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 8.13ms (2.80ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 2973687)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 9933516)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 18953601)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6035567)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1919538)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 24.00ms (21.01ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 60558816)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12188501\n  Later openPad including hook and genesis gas: 786290\n  Combined manifest and later opening gas: 12974791\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 70.63ms (70.39ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2046372)\n[PASS] test_claimableWinner() (gas: 2783903)\n[PASS] test_conservationOfEth() (gas: 5728942)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 42648)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2353150)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2422728)\n[PASS] test_deathAndAllDeadEnd() (gas: 1916375)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1599750)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2495264)\n[PASS] test_failedPushBecomesClaimable() (gas: 1513511)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5254373)\n[PASS] test_finalizeRanksAndPays() (gas: 4614029)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1730760)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 113393829)\n[PASS] test_finalizerFeeCapped() (gas: 12163201)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1775562)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 368289)\n[PASS] test_fundPotOnlyPad() (gas: 44052)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 19540408)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3517113)\n[PASS] test_graduateOnlyFromGame() (gas: 71095)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 7750773)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1499725)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4082380)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9174715)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7149117)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2322852)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1923163)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1854360)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1757327)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1449820)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1381889)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3072782)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1537475)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 2700852)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 135.09ms (170.90ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2606743)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 6482752)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 405347)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1150368)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2377533)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 9831139)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4698427\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1889356)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 226.79ms (121.35ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 10143219, ~: 10887889)\nLogs:\n  Bound result 5\n  Bound result 18446943263843348\n  Bound result 990000075525495642\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 397.47ms (390.17ms CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1699346, ~: 1708202)\nLogs:\n  Bound result 235\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2053641)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 40862596)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3659243)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1353887\n  roll with both liquidity upkeep stipends exhausted: 1428277\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 2775583)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 507.07ms (535.44ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 50594258)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5229328)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 978524)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 178613\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1008547)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1008885)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 49863222)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 541.28ms (523.22ms CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 3370767)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 4114264)\n[PASS] test_claimNothingReverts() (gas: 1175276)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9679)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 9172750)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 12315850)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 18438929)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 2578827)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 3501246)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 5041313)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 119099243)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 3802274\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 28932873)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 15653580)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 12605400)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 2450520)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 3315862)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 1081887)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9202)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 2482645)\n[PASS] test_launchViewsRejectIdZero() (gas: 33161)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 2698420)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 9515698)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 9059312)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 8364571)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78234)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 993325)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 1033031)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 8807465)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 9466045)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 9701996)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 3866186)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 2760141)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 8452006)\n[PASS] test_singleLivingImpTakesEverything() (gas: 5046311)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 2446482)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 8496697)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 541.60ms (242.60ms CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35222)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 12107701)\nLogs:\n  takeCrown gas, eighteen real pools: 2730025\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 8837579)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 14622889)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 9512888)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 8508631)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 1832278)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 3570582)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 9213970)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 771.01ms (990.87ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1015396)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 242733)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 8761258)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1070068)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 899356)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 843472)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9143872)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 572103)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 8973237)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1011216)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 992801)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3755319)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 33019)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 164796)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 1.10s (21.90ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 13097945)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 19033852)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16767)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 9351495)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 10234211)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 1695782)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 10538154)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922540\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 9006482)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 8942886)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.10s (111.16ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 8933077, ~: 8933172)\nLogs:\n  Bound result 19990000000074881070\n  Bound result 1500\n  Bound result 2352\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 9231475, ~: 9231558)\nLogs:\n  Bound result 11108645357844086413\n  Bound result 47780490106371512770\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 12640236, ~: 12237890)\nLogs:\n  Bound result 1\n  Bound result 902397712997\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 8804482, ~: 8804527)\nLogs:\n  Bound result 49990000000000002143\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 5666527, ~: 5316593)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 118446943263843349\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37318, ~: 37327)\nLogs:\n  Bound result 393528593821441371459641979\n  Bound result 1815196737906823897\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21444, ~: 21043)\nLogs:\n  Bound result 3135424969\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 37798, ~: 38039)\nLogs:\n  Bound result 796247245874660579182381030\n  Bound result 2622886383225522990\n  Bound result 2718229471666940625\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 9113074, ~: 10615813)\nLogs:\n  Bound result 1\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.10s (3.04s CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 88406159, ~: 88400763)\nLogs:\n  Bound result 228\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2617434)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 11513406)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 69883800)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4697256)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52035321)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.18s (1.14s CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6064112)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2290732)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 18981048)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7545395\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 687376)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 456447)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 22825729)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 41\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 5928561)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.18s (2.34s CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_curveNeverUnderchargesAndNeverOversells\n[PASS] invariant_fundedPotIsPartOfPotAndClearedByFinalize\n[PASS] invariant_gameBalanceEqualsObligations\n[PASS] invariant_genesisGatesLaunchesAndKing\n[PASS] invariant_impsAndRollsBounded\n[PASS] invariant_kingHoldsOnlyClaimables\n[PASS] invariant_liquidityBalanceEqualsObligations\n[PASS] invariant_padHoldsOnlyCarryPot\n[PASS] invariant_systemEthConserved\n[PASS] invariant_tokenSupplyFixedAndFullyAccounted\n[PASS] invariant_tokenUnlockedOnlyBySuccessfulGraduation\n InvariantTest invariants (runs: 40, calls: 2400, reverts: 0)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 101   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 107   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 134   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 96    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 110   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 215   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 192   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 0\n  Bound result 244\n  Bound result 244\n  Bound result 21000\n  Bound result 0\n  Bound result 1000000000000000\n  Bound result 2995000000000000207\n  Bound result 0\n  Bound result 2995001099511627776\n  Bound result 2995000000000014331\n  Bound result 500000000000000000\n  Bound result 13\n  Bound result 13403\n  Bound result 100\n  Bound result 237\n  Bound result 1306165815548362784\n  Bound result 3\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 49\n  Bound result 88\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.48s (2.47s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107198)\n[PASS] test_bindingsAreOneShot() (gas: 87834)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 10878651)\n[PASS] test_closedPadRevertsEverything() (gas: 103810)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 693079)\n[PASS] test_deployGasUnderBudget() (gas: 19924)\n[PASS] test_deployHookOnlyByPad() (gas: 30977)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 11965822)\n[PASS] test_fundGamesOnlyKing() (gas: 39635)\n[PASS] test_hookRejectsForeignInitialize() (gas: 1122360)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 9130196)\n[PASS] test_launchValidatesStrings() (gas: 8436843)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 992662)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 1023905)\n[PASS] test_openPadOnlyOnce() (gas: 1064834)\n[PASS] test_openPadRejectsBadSalt() (gas: 213408)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 280598)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 1414126)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 32747688)\n[PASS] test_templatesCannotBeInitialized() (gas: 1163447)\n[PASS] test_upkeepForOnlyGames() (gas: 1210455)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.49s (91.04ms CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 19196571, ~: 14080939)\nLogs:\n  Bound result 89\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116336029)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2655494\n  5000-entry draw total gas: 16172036\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54121915)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 411762)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 618152)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8249368)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1202721)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 4955327)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 652478)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 698940)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 50771590)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 524318)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 51346048)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 95765182)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1888788)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.50s (5.69s CPU time)\n\nRan 1 test for test/V3KingFeesInvariant.t.sol:V3KingFeesInvariantTest\n[PASS]\nV3KingFeesInvariantTest invariants:\n[PASS] invariant_eachReignKeepsItsETHAndTokensIncludingRejectedPayments\n[PASS] invariant_realV4FeesAndBidsConserveETH\n V3KingFeesInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+------------+-------+---------+----------╮\n| Contract             | Selector   | Calls | Reverts | Discards |\n+================================================================+\n| KingFeeLedgerHandler | bid        | 1655  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1667  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1628  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1650  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1592  | 0       | 0        |\n╰----------------------+------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 1000000000000000\n  Bound result 100000000000000000000\n  Bound result 16\n  Bound result 0\n  Bound result 500000\n  Bound result 5400864\n  Bound result 5410801\n  Bound result 100000\n  Bound result 3738\n  Bound result 13373\n  Bound result 216\n  Bound result 5445057\n  Bound result 10000\n  Bound result 5160\n  Bound result 2\n  Bound result 12\n  Bound result 34158675861195\n  Bound result 96211731843932421853183\n  Bound result 9600\n  Bound result 600000\n  Bound result 11184\n  Bound result 15\n  Bound result 5406865\n  Bound result 580580167024737\n  Bound result 40316966099635974604155\n  Bound result 5404533\n  Bound result 2850249519\n  Bound result 265321217126998\n  Bound result 44743213193967589937429\n  Bound result 6861\n  Bound result 5408987\n  Bound result 2387318\n  Bound result 2097152\n  Bound result 2329\n  Bound result 21\n  Bound result 13625\n  Bound result 12000000\n  Bound result 2387464\n  Bound result 2936387\n  Bound result 99999999960101\n  Bound result 40960\n  Bound result 13\n  Bound result 99999999999721\n  Bound result 21000\n  Bound result 30\n  Bound result 99999999999998\n  Bound result 80104107073339\n  Bound result 99999999999721\n  Bound result 59\n  Bound result 12465\n  Bound result 2356\n  Bound result 5400062\n  Bound result 10\n  Bound result 5401536\n  Bound result 64\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.47s (3.46s CPU time)\n\nRan 1 test for test/V3ResolverInvariant.t.sol:V3ResolverInvariantTest\n[PASS]\nV3ResolverInvariantTest invariants:\n[PASS] invariant_eachTipIsPendingExpiredOrOwedToItsActualResolver\n[PASS] invariant_paidETHAndTokensRemainFullyAccounted\n V3ResolverInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭-----------------------+----------+-------+---------+----------╮\n| Contract              | Selector | Calls | Reverts | Discards |\n+===============================================================+\n| ResolverLedgerHandler | advance  | 3137  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3062  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3067  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3022  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 24\n  Bound result 42\n  Bound result 30\n  Bound result 28\n  Bound result 14\n  Bound result 17\n  Bound result 41\n  Bound result 74\n  Bound result 72\n  Bound result 27\n  Bound result 3\n  Bound result 0\n  Bound result 30\n  Bound result 9\n  Bound result 3\n  Bound result 11\n  Bound result 47\n  Bound result 15\n  Bound result 29\n  Bound result 2\n  Bound result 4\n  Bound result 0\n  Bound result 30\n  Bound result 57\n  Bound result 67\n  Bound result 27\n  Bound result 12\n  Bound result 82\n  Bound result 73\n  Bound result 17\n  Bound result 1\n  Bound result 84\n  Bound result 5\n  Bound result 3\n  Bound result 64\n  Bound result 25\n  Bound result 73\n  Bound result 80\n  Bound result 51\n  Bound result 20\n  Bound result 7\n  Bound result 60\n  Bound result 25\n  Bound result 15\n  Bound result 11\n  Bound result 89\n  Bound result 8\n  Bound result 20\n  Bound result 52\n  Bound result 3\n  Bound result 5\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.52s (5.51s CPU time)\n\nRan 20 test suites in 5.53s (25.33s CPU time): 193 tests passed, 0 failed, 0 skipped (193 total tests)\n","passed":true},{"durationMs":91,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.transfer(address,uint256)\",\"PadToken.transferFrom(address,address,uint256)\",\"PadToken.unlock()\",\"PvPPad.bindLiquidity()\",\"PvPPad.fundCarry()\",\"PvPPad.fundGames()\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.restartGenesis()\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"README.md\":209,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT.md\":311,\"docs/TEST-REPORT.md\":123,\"docs/VERIFY.md\":78,\"foundry.toml\":22,\"launch.json\":37,\"remappings.txt\":2,\"src/KingOfThePad.sol\":127,\"src/PadGame.sol\":682,\"src/PadHook.sol\":24,\"src/PadLiquidity.sol\":432,\"src/PadToken.sol\":86,\"src/PvPPad.sol\":306,\"src/interfaces/Interfaces.sol\":110,\"src/libs/PadLib.sol\":108,\"test/Adversarial.t.sol\":796,\"test/AtomicDeployment.t.sol\":101,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":211,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":761,\"test/Invariants.t.sol\":576,\"test/King.t.sol\":314,\"test/LiquidityV4.t.sol\":248,\"test/Pad.t.sol\":299,\"test/Raffle.t.sol\":408,\"test/RaffleEdges.t.sol\":273,\"test/RealV4.sol\":79,\"test/Revision.t.sol\":263,\"test/V3-CONTRIBUTOR-REPORT.md\":126,\"test/V3AccountingActors.sol\":18,\"test/V3CarryProperties.t.sol\":130,\"test/V3FailureEdges.t.sol\":354,\"test/V3KingFeesInvariant.t.sol\":250,\"test/V3ResolverInvariant.t.sol\":208,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":58},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a59b9d52de04335a937717a44e95f21e5f9e89bf01b891936efa25f4f40ad3c3","verifiedTreeHash":"1d8d63173b16677528b9b04791adccdad27cdb6e","verifierVersion":"0.1.0+aca6c688"},{"checks":[{"durationMs":96549,"exitCode":0,"name":"build","output":"Compiling 88 files with Solc 0.8.26\nSolc 0.8.26 finished in 96.45s\nCompiler run successful!\n","passed":true},{"durationMs":2273,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 2975432)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 9938537)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 18972132)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6039279)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1921851)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 20.15ms (17.93ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 23067120)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12195652\n  Later openPad including hook and genesis gas: 786466\n  Combined manifest and later opening gas: 12982118\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 36.04ms (35.87ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1017659)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 244075)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 8762328)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1028080)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 891417)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 839783)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9147403)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 569344)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 8979305)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 967242)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 993664)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3754526)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 33151)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 165025)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 41.88ms (30.55ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2423092)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 6364780)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 405479)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1143183)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2291231)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 9688316)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4568783\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1843020)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 89.05ms (83.43ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 50037839)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5233637)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 978788)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 178613\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1008811)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1009149)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 49931611)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 201.71ms (408.90ms CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 3372329)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 4116618)\n[PASS] test_claimNothingReverts() (gas: 1175848)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9679)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 9133278)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 12325368)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 18429233)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 2579826)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 3503289)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 5044106)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 119212565)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 3802560\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 28953202)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 15658936)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 12609383)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 2451462)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 3317424)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 1082371)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9202)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 2483644)\n[PASS] test_launchViewsRejectIdZero() (gas: 33161)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 2699419)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 9520044)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 9063038)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 8370405)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78234)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 993809)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 1033691)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 8807905)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 9462493)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 9659398)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 3867977)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 2761368)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 8455446)\n[PASS] test_singleLivingImpTakesEverything() (gas: 5049242)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 2447423)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 8500401)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 321.41ms (240.51ms CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107374)\n[PASS] test_bindingsAreOneShot() (gas: 87900)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 10884003)\n[PASS] test_closedPadRevertsEverything() (gas: 103810)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 693387)\n[PASS] test_deployGasUnderBudget() (gas: 19924)\n[PASS] test_deployHookOnlyByPad() (gas: 31153)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 11967724)\n[PASS] test_fundGamesOnlyKing() (gas: 39635)\n[PASS] test_hookRejectsForeignInitialize() (gas: 1122844)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 9133926)\n[PASS] test_launchValidatesStrings() (gas: 8440287)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 993146)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 1024697)\n[PASS] test_openPadOnlyOnce() (gas: 1065318)\n[PASS] test_openPadRejectsBadSalt() (gas: 213760)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 280906)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 1414839)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 32693965)\n[PASS] test_templatesCannotBeInitialized() (gas: 1163931)\n[PASS] test_upkeepForOnlyGames() (gas: 1211168)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 333.32ms (85.70ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 86999136, ~: 83351627)\nLogs:\n  Bound result 228\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2618477)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 11454827)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 69984422)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4699862)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52102550)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 797.73ms (871.44ms CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35398)\n[PASS] test_crownPrecollectsSixteenOfEighteenPools() (gas: 11843844)\nLogs:\n  takeCrown gas, eighteen real pools: 2544969\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 8837766)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 14547104)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 9473475)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 8512877)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 1831417)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 3570825)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 9210109)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.14s (803.59ms CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_curveNeverUnderchargesAndNeverOversells\n[PASS] invariant_fundedPotIsPartOfPotAndClearedByFinalize\n[PASS] invariant_gameBalanceEqualsObligations\n[PASS] invariant_genesisGatesLaunchesAndKing\n[PASS] invariant_impsAndRollsBounded\n[PASS] invariant_kingHoldsOnlyClaimables\n[PASS] invariant_liquidityBalanceEqualsObligations\n[PASS] invariant_padHoldsOnlyCarryPot\n[PASS] invariant_systemEthConserved\n[PASS] invariant_tokenSupplyFixedAndFullyAccounted\n[PASS] invariant_tokenUnlockedOnlyBySuccessfulGraduation\n InvariantTest invariants (runs: 40, calls: 2400, reverts: 0)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 101   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 107   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 134   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 96    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 110   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 215   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 192   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 8\n  Bound result 0\n  Bound result 10000000000\n  Bound result 10000000000\n  Bound result 100000000000000000\n  Bound result 0\n  Bound result 60\n  Bound result 2995000000000002990\n  Bound result 0\n  Bound result 2995000000000000091\n  Bound result 2995000000000017750\n  Bound result 68621649964679874\n  Bound result 10\n  Bound result 16282\n  Bound result 640\n  Bound result 265\n  Bound result 1306165815548362784\n  Bound result 4\n  Bound result 0\n  Bound result 100\n  Bound result 0\n  Bound result 720\n  Bound result 157\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.14s (2.13s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 18753509, ~: 15934251)\nLogs:\n  Bound result 89\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116336205)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2655494\n  5000-entry draw total gas: 16172036\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54190876)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 411991)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 619187)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8253556)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1202721)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 4958435)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 653042)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 699169)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 50838819)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 524318)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 51413563)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 95848826)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1890872)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.16s (4.80s CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2047667)\n[PASS] test_claimableWinner() (gas: 2785713)\n[PASS] test_conservationOfEth() (gas: 5733302)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 42648)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2354498)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2424142)\n[PASS] test_deathAndAllDeadEnd() (gas: 1917333)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1600444)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2496962)\n[PASS] test_failedPushBecomesClaimable() (gas: 1514282)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5258684)\n[PASS] test_finalizeRanksAndPays() (gas: 4617959)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1731558)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 113512067)\n[PASS] test_finalizerFeeCapped() (gas: 12173655)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1776360)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 368518)\n[PASS] test_fundPotOnlyPad() (gas: 44052)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 19548931)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3519230)\n[PASS] test_graduateOnlyFromGame() (gas: 71139)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 7754161)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1500642)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4084773)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9179664)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7155753)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2324120)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1923961)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1855414)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1758125)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1450565)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1382458)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3074780)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1538044)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 2700622)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 2.16s (166.32ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 13104561)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 19031583)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 17009)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 9347793)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 10157572)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 1696495)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 10540451)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922540\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 9010208)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 8942947)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.16s (157.83ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 8933108, ~: 8933190)\nLogs:\n  Bound result 19990000000000012505\n  Bound result 2123999374459958580\n  Bound result 2400\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 9192533, ~: 9192611)\nLogs:\n  Bound result 19990000000000001535\n  Bound result 38011000000258156829\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 13318424, ~: 12246479)\nLogs:\n  Bound result 1\n  Bound result 902397712997\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 8804910, ~: 8804941)\nLogs:\n  Bound result 49990000000000002683\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 6028866, ~: 6056352)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 118446943263843349\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37322, ~: 37327)\nLogs:\n  Bound result 3016\n  Bound result 20571\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21447, ~: 21043)\nLogs:\n  Bound result 37119460328768806344\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 37838, ~: 38039)\nLogs:\n  Bound result 796247245874660579182381030\n  Bound result 2622886383225522990\n  Bound result 2718229471666940625\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 9161229, ~: 10620900)\nLogs:\n  Bound result 1\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.16s (6.40s CPU time)\n\nRan 14 test suites in 2.17s (14.77s CPU time): 174 tests passed, 0 failed, 0 skipped (174 total tests)\n","passed":true},{"durationMs":77,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.transfer(address,uint256)\",\"PadToken.transferFrom(address,address,uint256)\",\"PadToken.unlock()\",\"PvPPad.bindLiquidity()\",\"PvPPad.fundCarry()\",\"PvPPad.fundGames()\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.restartGenesis()\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"README.md\":198,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT.md\":268,\"docs/TEST-REPORT.md\":118,\"docs/VERIFY.md\":78,\"foundry.toml\":22,\"launch.json\":37,\"remappings.txt\":2,\"src/KingOfThePad.sol\":122,\"src/PadGame.sol\":682,\"src/PadHook.sol\":24,\"src/PadLiquidity.sol\":403,\"src/PadToken.sol\":86,\"src/PvPPad.sol\":306,\"src/interfaces/Interfaces.sol\":110,\"src/libs/PadLib.sol\":108,\"test/Adversarial.t.sol\":796,\"test/AtomicDeployment.t.sol\":101,\"test/AuditV3.t.sol\":395,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":211,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":761,\"test/Invariants.t.sol\":576,\"test/King.t.sol\":314,\"test/LiquidityV4.t.sol\":244,\"test/Pad.t.sol\":299,\"test/Raffle.t.sol\":408,\"test/RaffleEdges.t.sol\":273,\"test/RealV4.sol\":79,\"test/Revision.t.sol\":263,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":58},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c09b1bdaa2ff12bfeb135a422b09ded989cdb20220cd6c5e07a2a8832e898ee0","verifiedTreeHash":"6cfdb3bcdc43eaae268957a9e4de81e178521462","verifierVersion":"0.1.0+d1681b55"},{"checks":[{"durationMs":115349,"exitCode":0,"name":"build","output":"Compiling 89 files with Solc 0.8.26\nSolc 0.8.26 finished in 115.24s\nCompiler run successful!\n","passed":true},{"durationMs":2656,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 2973687)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 9933516)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 18953601)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6035567)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1919538)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 27.28ms (22.80ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1015396)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 242733)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 8761258)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1070068)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 899356)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 843472)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9143872)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 572103)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 8973237)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1011216)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 992801)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3755319)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 33019)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 164796)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 31.85ms (35.60ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 60558816)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12188501\n  Later openPad including hook and genesis gas: 786290\n  Combined manifest and later opening gas: 12974791\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 92.53ms (92.37ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2606743)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 6482752)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 405347)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1150368)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2377533)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 9831139)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4698427\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1889356)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 124.30ms (119.80ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 13097945)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 19033852)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16767)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 9351495)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 10234211)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 1695782)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 10538154)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922540\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 9006482)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 8942886)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 136.32ms (160.29ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 50594258)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5229328)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 978524)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 178613\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1008547)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1008885)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 49863222)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 439.92ms (441.63ms CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 3370767)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 4114264)\n[PASS] test_claimNothingReverts() (gas: 1175276)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9679)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 9172750)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 12315850)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 18438929)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 2578827)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 3501246)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 5041313)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 119099243)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 3802274\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 28932873)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 15653580)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 12605400)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 2450520)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 3315862)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 1081887)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9202)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 2482645)\n[PASS] test_launchViewsRejectIdZero() (gas: 33161)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 2698420)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 9515698)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 9059312)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 8364571)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78234)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 993325)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 1033031)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 8807465)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 9466045)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 9701996)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 3866186)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 2760141)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 8452006)\n[PASS] test_singleLivingImpTakesEverything() (gas: 5046311)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 2446482)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 8496697)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 440.09ms (271.48ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 8933059, ~: 8933172)\nLogs:\n  Bound result 15921185192148548027\n  Bound result 471\n  Bound result 56\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 9231485, ~: 9231558)\nLogs:\n  Bound result 11108645357844086413\n  Bound result 47780490106371512770\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 12757401, ~: 12237005)\nLogs:\n  Bound result 1\n  Bound result 902397712997\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 8804491, ~: 8804527)\nLogs:\n  Bound result 49990000000000002143\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 5699860, ~: 5092424)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 118446943263843349\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37323, ~: 37327)\nLogs:\n  Bound result 393528593821441371459641979\n  Bound result 1815196737906823897\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21445, ~: 21043)\nLogs:\n  Bound result 3135424969\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 37810, ~: 38002)\nLogs:\n  Bound result 796247245874660579182381030\n  Bound result 2622886383225522990\n  Bound result 2718229471666940625\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 9149182, ~: 10615813)\nLogs:\n  Bound result 1\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 498.02ms (2.55s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35222)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 12107701)\nLogs:\n  takeCrown gas, eighteen real pools: 2730025\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 8837579)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 14622889)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 9512888)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 8508631)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 1832278)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 3570582)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 9213970)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 733.15ms (886.25ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 89176270, ~: 87106966)\nLogs:\n  Bound result 228\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2617434)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 11513406)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 69883800)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4697256)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52035321)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 936.74ms (1.01s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107198)\n[PASS] test_bindingsAreOneShot() (gas: 87834)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 10878651)\n[PASS] test_closedPadRevertsEverything() (gas: 103810)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 693079)\n[PASS] test_deployGasUnderBudget() (gas: 19924)\n[PASS] test_deployHookOnlyByPad() (gas: 30977)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 11965822)\n[PASS] test_fundGamesOnlyKing() (gas: 39635)\n[PASS] test_hookRejectsForeignInitialize() (gas: 1122360)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 9130196)\n[PASS] test_launchValidatesStrings() (gas: 8436843)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 992662)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 1023905)\n[PASS] test_openPadOnlyOnce() (gas: 1064834)\n[PASS] test_openPadRejectsBadSalt() (gas: 213408)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 280598)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 1414126)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 32747688)\n[PASS] test_templatesCannotBeInitialized() (gas: 1163447)\n[PASS] test_upkeepForOnlyGames() (gas: 1210455)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 1.07s (105.82ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2046372)\n[PASS] test_claimableWinner() (gas: 2783903)\n[PASS] test_conservationOfEth() (gas: 5728942)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 42648)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2353150)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2422728)\n[PASS] test_deathAndAllDeadEnd() (gas: 1916375)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1599750)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2495264)\n[PASS] test_failedPushBecomesClaimable() (gas: 1513511)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5254373)\n[PASS] test_finalizeRanksAndPays() (gas: 4614029)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1730760)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 113393829)\n[PASS] test_finalizerFeeCapped() (gas: 12163201)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1775562)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 368289)\n[PASS] test_fundPotOnlyPad() (gas: 44052)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 19540408)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3517113)\n[PASS] test_graduateOnlyFromGame() (gas: 71095)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 7750773)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1499725)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4082380)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9174715)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7149117)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2322852)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1923163)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1854360)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1757327)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1449820)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1381889)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3072782)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1537475)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 2700852)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 1.07s (187.69ms CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6064112)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2290732)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 18981048)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7545395\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 687376)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 456447)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 22825729)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 41\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 5928561)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.07s (2.34s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 19408367, ~: 13650949)\nLogs:\n  Bound result 89\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116336029)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2655494\n  5000-entry draw total gas: 16172036\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54121915)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 411762)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 618152)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8249368)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1202721)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 4955327)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 652478)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 698940)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 50771590)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 524318)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 51346048)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 95765182)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1888788)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.46s (5.50s CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_curveNeverUnderchargesAndNeverOversells\n[PASS] invariant_fundedPotIsPartOfPotAndClearedByFinalize\n[PASS] invariant_gameBalanceEqualsObligations\n[PASS] invariant_genesisGatesLaunchesAndKing\n[PASS] invariant_impsAndRollsBounded\n[PASS] invariant_kingHoldsOnlyClaimables\n[PASS] invariant_liquidityBalanceEqualsObligations\n[PASS] invariant_padHoldsOnlyCarryPot\n[PASS] invariant_systemEthConserved\n[PASS] invariant_tokenSupplyFixedAndFullyAccounted\n[PASS] invariant_tokenUnlockedOnlyBySuccessfulGraduation\n InvariantTest invariants (runs: 40, calls: 2400, reverts: 0)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 101   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 107   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 134   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 96    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 110   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 215   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 192   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10\n  Bound result 0\n  Bound result 489999999999999993\n  Bound result 489999999999999993\n  Bound result 400000\n  Bound result 1\n  Bound result 3000\n  Bound result 2995000000000000096\n  Bound result 0\n  Bound result 2995000000000000021\n  Bound result 2995000000000014331\n  Bound result 61\n  Bound result 16384\n  Bound result 13403\n  Bound result 63\n  Bound result 40\n  Bound result 1306165815548362784\n  Bound result 4\n  Bound result 0\n  Bound result 6\n  Bound result 0\n  Bound result 257\n  Bound result 58\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.54s (2.53s CPU time)\n\nRan 15 test suites in 2.55s (11.67s CPU time): 181 tests passed, 0 failed, 0 skipped (181 total tests)\n","passed":true},{"durationMs":78,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.transfer(address,uint256)\",\"PadToken.transferFrom(address,address,uint256)\",\"PadToken.unlock()\",\"PvPPad.bindLiquidity()\",\"PvPPad.fundCarry()\",\"PvPPad.fundGames()\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.restartGenesis()\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"README.md\":209,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT.md\":311,\"docs/TEST-REPORT.md\":123,\"docs/VERIFY.md\":78,\"foundry.toml\":22,\"launch.json\":37,\"remappings.txt\":2,\"src/KingOfThePad.sol\":127,\"src/PadGame.sol\":682,\"src/PadHook.sol\":24,\"src/PadLiquidity.sol\":432,\"src/PadToken.sol\":86,\"src/PvPPad.sol\":306,\"src/interfaces/Interfaces.sol\":110,\"src/libs/PadLib.sol\":108,\"test/Adversarial.t.sol\":796,\"test/AtomicDeployment.t.sol\":101,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":211,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":761,\"test/Invariants.t.sol\":576,\"test/King.t.sol\":314,\"test/LiquidityV4.t.sol\":248,\"test/Pad.t.sol\":299,\"test/Raffle.t.sol\":408,\"test/RaffleEdges.t.sol\":273,\"test/RealV4.sol\":79,\"test/Revision.t.sol\":263,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":58},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e9085b309a747a4b3434c8ef5f57a34aadc0a0b055c4ef60f4efd92331446aab","verifiedTreeHash":"2bc139cec843c8ce534b53b63c1512beb20a7e9b","verifierVersion":"0.1.0+aca6c688"},{"checks":[{"durationMs":117293,"exitCode":0,"name":"build","output":"Compiling 93 files with Solc 0.8.26\nSolc 0.8.26 finished in 117.19s\nCompiler run successful!\n","passed":true},{"durationMs":5063,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/V3FailureEdges.t.sol:V3PoolFailureEdgesTest\n[PASS] test_onlyCrownMayRequestStrictSettlementAndIndexErrorsDoNotChangeHealth() (gas: 169115)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 774570)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 2923944)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1297122)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 15.76ms (2.58ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 23067120)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12195652\n  Later openPad including hook and genesis gas: 786466\n  Combined manifest and later opening gas: 12982118\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 16.89ms (16.76ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2423092)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 6364780)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 405479)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1143183)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2291231)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 9688316)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4568783\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1843020)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 200.80ms (84.88ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 50037839)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5233637)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 978788)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 178613\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1008811)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1009149)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 183203\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 49931611)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 200.98ms (409.87ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 10667956, ~: 10882650)\nLogs:\n  Bound result 2\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 314.89ms (308.24ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2047667)\n[PASS] test_claimableWinner() (gas: 2785713)\n[PASS] test_conservationOfEth() (gas: 5733302)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 42648)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2354498)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2424142)\n[PASS] test_deathAndAllDeadEnd() (gas: 1917333)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1600444)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2496962)\n[PASS] test_failedPushBecomesClaimable() (gas: 1514282)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5258684)\n[PASS] test_finalizeRanksAndPays() (gas: 4617959)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1731558)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 113512067)\n[PASS] test_finalizerFeeCapped() (gas: 12173655)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1776360)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 368518)\n[PASS] test_fundPotOnlyPad() (gas: 44052)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 19548931)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3519230)\n[PASS] test_graduateOnlyFromGame() (gas: 71139)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 7754161)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1500642)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4084773)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9179664)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7155753)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2324120)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1923961)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1855414)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1758125)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1450565)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1382458)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3074780)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1538044)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 2700622)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 430.05ms (148.26ms CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 3372329)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 4116618)\n[PASS] test_claimNothingReverts() (gas: 1175848)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9679)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 9133278)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 12325368)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 18429233)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 2579826)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 3503289)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 5044106)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 119212565)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 3802560\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 28953202)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 15658936)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 12609383)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 2451462)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 3317424)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 1082371)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9202)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 2483644)\n[PASS] test_launchViewsRejectIdZero() (gas: 33161)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 2699419)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 9520044)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 9063038)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 8370405)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78234)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 993809)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 1033691)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 8807905)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 9462493)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 9659398)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 3867977)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 2761368)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 8455446)\n[PASS] test_singleLivingImpTakesEverything() (gas: 5049242)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 2447423)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 8500401)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 461.14ms (237.25ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1017659)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 244075)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 8762328)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1028080)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 891417)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 839783)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9147403)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 569344)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 8979305)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 967242)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 993664)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3754526)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 33151)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 165025)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 461.48ms (21.25ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 8933101, ~: 8933190)\nLogs:\n  Bound result 18388529315714645403\n  Bound result 1770311666190782377\n  Bound result 3375\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 9192550, ~: 9192611)\nLogs:\n  Bound result 19990000000000001535\n  Bound result 38011000000258156829\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 13199583, ~: 12247364)\nLogs:\n  Bound result 1\n  Bound result 902397712997\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 8804901, ~: 8804941)\nLogs:\n  Bound result 49990000000000000245\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 6041328, ~: 5924329)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 118446943263843349\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37321, ~: 37327)\nLogs:\n  Bound result 393528593821441371459641979\n  Bound result 1815196737906823897\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21450, ~: 21043)\nLogs:\n  Bound result 3135424969\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 37830, ~: 38039)\nLogs:\n  Bound result 796247245874660579182381030\n  Bound result 2622886383225522990\n  Bound result 2718229471666940625\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 9125086, ~: 10620900)\nLogs:\n  Bound result 1\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 461.48ms (2.48s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1699820, ~: 1708718)\nLogs:\n  Bound result 90\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2055210)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 40902186)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3659230)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1353887\n  roll with both liquidity upkeep stipends exhausted: 1428275\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 2774911)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 461.56ms (483.43ms CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35398)\n[PASS] test_crownPrecollectsSixteenOfEighteenPools() (gas: 11843844)\nLogs:\n  takeCrown gas, eighteen real pools: 2544969\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 8837766)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 14547104)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 9473475)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 8512877)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 1831417)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 3570825)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 9210109)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 746.96ms (880.73ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 86215852, ~: 85055860)\nLogs:\n  Bound result 228\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2618477)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 11454827)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 69984422)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4699862)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52102550)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 857.02ms (930.13ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 2975432)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 9938537)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 18972132)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6039279)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1921851)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.24s (30.63ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 13104561)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 19031583)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 17009)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 9347793)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 10157572)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 1696495)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 10540451)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922540\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 9010208)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 8942947)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.24s (130.99ms CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107374)\n[PASS] test_bindingsAreOneShot() (gas: 87900)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 10884003)\n[PASS] test_closedPadRevertsEverything() (gas: 103810)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 693387)\n[PASS] test_deployGasUnderBudget() (gas: 19924)\n[PASS] test_deployHookOnlyByPad() (gas: 31153)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 11967724)\n[PASS] test_fundGamesOnlyKing() (gas: 39635)\n[PASS] test_hookRejectsForeignInitialize() (gas: 1122844)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 9133926)\n[PASS] test_launchValidatesStrings() (gas: 8440287)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 993146)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 1024697)\n[PASS] test_openPadOnlyOnce() (gas: 1065318)\n[PASS] test_openPadRejectsBadSalt() (gas: 213760)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 280906)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 1414839)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 32693965)\n[PASS] test_templatesCannotBeInitialized() (gas: 1163931)\n[PASS] test_upkeepForOnlyGames() (gas: 1211168)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.24s (109.13ms CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 18541468, ~: 15934251)\nLogs:\n  Bound result 89\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116336205)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2655494\n  5000-entry draw total gas: 16172036\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54190876)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 411991)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 619187)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8253556)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1202721)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 4958435)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 653042)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 699169)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 50838819)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 524318)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 51413563)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 95848826)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1890872)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.27s (5.12s CPU time)\n\nRan 1 test for test/Invariants.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_curveNeverUnderchargesAndNeverOversells\n[PASS] invariant_fundedPotIsPartOfPotAndClearedByFinalize\n[PASS] invariant_gameBalanceEqualsObligations\n[PASS] invariant_genesisGatesLaunchesAndKing\n[PASS] invariant_impsAndRollsBounded\n[PASS] invariant_kingHoldsOnlyClaimables\n[PASS] invariant_liquidityBalanceEqualsObligations\n[PASS] invariant_padHoldsOnlyCarryPot\n[PASS] invariant_systemEthConserved\n[PASS] invariant_tokenSupplyFixedAndFullyAccounted\n[PASS] invariant_tokenUnlockedOnlyBySuccessfulGraduation\n InvariantTest invariants (runs: 40, calls: 2400, reverts: 0)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 101   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 107   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 134   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 96    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 110   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 93    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 215   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 106   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 192   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 8\n  Bound result 0\n  Bound result 1048576\n  Bound result 1048576\n  Bound result 9999999999999999\n  Bound result 1\n  Bound result 600\n  Bound result 2995000000017000001\n  Bound result 0\n  Bound result 2995000000000000008\n  Bound result 2995000000000017750\n  Bound result 499999999999999981\n  Bound result 16383\n  Bound result 16282\n  Bound result 63\n  Bound result 251\n  Bound result 1306165815548362784\n  Bound result 4\n  Bound result 0\n  Bound result 100\n  Bound result 0\n  Bound result 30\n  Bound result 157\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.29s (2.28s CPU time)\n\nRan 1 test for test/V3KingFeesInvariant.t.sol:V3KingFeesInvariantTest\n[PASS]\nV3KingFeesInvariantTest invariants:\n[PASS] invariant_eachReignKeepsItsETHAndTokensIncludingRejectedPayments\n[PASS] invariant_realV4FeesAndBidsConserveETH\n V3KingFeesInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+------------+-------+---------+----------╮\n| Contract             | Selector   | Calls | Reverts | Discards |\n+================================================================+\n| KingFeeLedgerHandler | bid        | 1655  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1667  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1628  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1650  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1592  | 0       | 0        |\n╰----------------------+------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 1000000000000000\n  Bound result 100000000000000000000\n  Bound result 16\n  Bound result 0\n  Bound result 500000\n  Bound result 5401588\n  Bound result 5401000\n  Bound result 100000\n  Bound result 3980\n  Bound result 13045\n  Bound result 11000000000000000\n  Bound result 1237123\n  Bound result 600000\n  Bound result 7173\n  Bound result 3\n  Bound result 50000\n  Bound result 34158675861195\n  Bound result 5859172934242450402922\n  Bound result 6000\n  Bound result 11000\n  Bound result 11680\n  Bound result 15\n  Bound result 5412504\n  Bound result 580580167024737\n  Bound result 5132415574547071058148\n  Bound result 5404552\n  Bound result 11340\n  Bound result 265321217126998\n  Bound result 44743213193967589937429\n  Bound result 6723\n  Bound result 5408743\n  Bound result 2387318\n  Bound result 999999999999990\n  Bound result 1491\n  Bound result 0\n  Bound result 13014\n  Bound result 1180000000000000\n  Bound result 2387464\n  Bound result 2936387\n  Bound result 99999999999791\n  Bound result 50000\n  Bound result 5\n  Bound result 2989\n  Bound result 99999999999900\n  Bound result 31\n  Bound result 99999999999998\n  Bound result 10627\n  Bound result 2989\n  Bound result 36\n  Bound result 11370\n  Bound result 1488664714\n  Bound result 1799667\n  Bound result 8\n  Bound result 5402377\n  Bound result 64\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.17s (3.16s CPU time)\n\nRan 1 test for test/V3ResolverInvariant.t.sol:V3ResolverInvariantTest\n[PASS]\nV3ResolverInvariantTest invariants:\n[PASS] invariant_eachTipIsPendingExpiredOrOwedToItsActualResolver\n[PASS] invariant_paidETHAndTokensRemainFullyAccounted\n V3ResolverInvariantTest invariants (runs: 128, calls: 12288, reverts: 0)\n\n╭-----------------------+----------+-------+---------+----------╮\n| Contract              | Selector | Calls | Reverts | Discards |\n+===============================================================+\n| ResolverLedgerHandler | advance  | 3137  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3062  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3067  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3022  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 12\n  Bound result 71\n  Bound result 30\n  Bound result 28\n  Bound result 14\n  Bound result 10\n  Bound result 13\n  Bound result 74\n  Bound result 72\n  Bound result 25\n  Bound result 14\n  Bound result 24\n  Bound result 12\n  Bound result 9\n  Bound result 9\n  Bound result 32\n  Bound result 38\n  Bound result 4\n  Bound result 29\n  Bound result 2\n  Bound result 1\n  Bound result 20\n  Bound result 24\n  Bound result 77\n  Bound result 67\n  Bound result 2\n  Bound result 12\n  Bound result 35\n  Bound result 10\n  Bound result 44\n  Bound result 9\n  Bound result 57\n  Bound result 61\n  Bound result 68\n  Bound result 37\n  Bound result 26\n  Bound result 18\n  Bound result 82\n  Bound result 51\n  Bound result 20\n  Bound result 5\n  Bound result 41\n  Bound result 25\n  Bound result 73\n  Bound result 82\n  Bound result 89\n  Bound result 14\n  Bound result 73\n  Bound result 35\n  Bound result 7\n  Bound result 27\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.94s (4.93s CPU time)\n\nRan 19 test suites in 4.95s (24.02s CPU time): 186 tests passed, 0 failed, 0 skipped (186 total tests)\n","passed":true},{"durationMs":85,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.transfer(address,uint256)\",\"PadToken.transferFrom(address,address,uint256)\",\"PadToken.unlock()\",\"PvPPad.bindLiquidity()\",\"PvPPad.fundCarry()\",\"PvPPad.fundGames()\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.restartGenesis()\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"README.md\":198,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT.md\":268,\"docs/TEST-REPORT.md\":118,\"docs/VERIFY.md\":78,\"foundry.toml\":22,\"launch.json\":37,\"remappings.txt\":2,\"src/KingOfThePad.sol\":122,\"src/PadGame.sol\":682,\"src/PadHook.sol\":24,\"src/PadLiquidity.sol\":403,\"src/PadToken.sol\":86,\"src/PvPPad.sol\":306,\"src/interfaces/Interfaces.sol\":110,\"src/libs/PadLib.sol\":108,\"test/Adversarial.t.sol\":796,\"test/AtomicDeployment.t.sol\":101,\"test/AuditV3.t.sol\":395,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":211,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":761,\"test/Invariants.t.sol\":576,\"test/King.t.sol\":314,\"test/LiquidityV4.t.sol\":244,\"test/Pad.t.sol\":299,\"test/Raffle.t.sol\":408,\"test/RaffleEdges.t.sol\":273,\"test/RealV4.sol\":79,\"test/Revision.t.sol\":263,\"test/V3-CONTRIBUTOR-REPORT.md\":114,\"test/V3AccountingActors.sol\":18,\"test/V3CarryProperties.t.sol\":130,\"test/V3FailureEdges.t.sol\":330,\"test/V3KingFeesInvariant.t.sol\":250,\"test/V3ResolverInvariant.t.sol\":208,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":58},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"fd7db357054ba0345d59e8c0e315923154d54af55b3b04896fd0a556864844d8","verifiedTreeHash":"fda9888dc577e3306825ab39ec8bbdcc91845a1b","verifierVersion":"0.1.0+aca6c688"}]}