{"assessments":[],"deployments":[{"attestationHash":"6ae22a3ac554f654f5ed0ff64236547d05e8a0455b482727ea349a1f36a16256","chainId":4663,"contracts":[{"address":"0x246a338d0a260c3e2f4afa61929106005392b3a5","blockNumber":89506351,"name":"PadLiquidity","role":"other","txHash":"0xc073520f11286b6d175db341c593807589671c1cdb9fa67f4d66066f29b97ab8"},{"address":"0xb2c3ad3a9401d406a35fcf6ca81b3f80c952a16c","blockNumber":89506351,"name":"PvPPad","role":"other","txHash":"0xc073520f11286b6d175db341c593807589671c1cdb9fa67f4d66066f29b97ab8"},{"address":"0xfb8c41e138bc6910a56874e3cb3d5e32994d66b0","blockNumber":89506351,"name":"KingOfThePad","role":"other","txHash":"0xc073520f11286b6d175db341c593807589671c1cdb9fa67f4d66066f29b97ab8"},{"address":"0xa22b06bce25f0fc181b1df1350723c5e97d3d38d","blockNumber":89506351,"name":"PadToken","role":"other","txHash":"0xc073520f11286b6d175db341c593807589671c1cdb9fa67f4d66066f29b97ab8"},{"address":"0x2c2b4cc0cf0065ac29482b4437fa06d227c4d05d","blockNumber":89506351,"name":"PadGame","role":"other","txHash":"0xc073520f11286b6d175db341c593807589671c1cdb9fa67f4d66066f29b97ab8"}],"id":"0c53a56c-0a94-46a6-9c03-f9bcae43ddb7","manifestHash":"45108cbfe44a71f62d7c22dcd9bf31b6d257a06ec35113de7ee6598d0975a7d5","status":"live"}],"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":"bf3fe37c-172e-4c22-aef8-885d9e39a1eb","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"728519b353237589d53b89f88ba779060642f51afe5580c042f1602765fa5503","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"8ed991613864927d7cd576cffac0aef67d26ea08b03b227beb4cb4d5fd6892fb","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"06547d7bf79760174216ee8498d056f50f636abfdebc8d19b733708e4bddb7ce","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"8b3baac90e37beb9a8d82ef4b583286433c7b79354d6cdadb6d41cb58b48e8f3","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":"6b7d8f25cda7cb20cc5a3da6bd8ee3d11d031d8860d66fe4ee092d6233b8bdea","dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"5f48e4c9972b7e62ec16371107e42a180ccabf9bf1536560ba7490ff8e8b128c","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"13929dd0ecbead8550283945213c176770c1f9903d66e80926c5e1d28741e08a","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"907e74a398e8d22f248b7b3585ac34a3663865ee28c0edc9a846ad4d8f5ab516","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"860c180315a4ebad82a7ed7827eff14c54157728de698bbf7d1a844dc91f8dfc","dependsOn":["adapt_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 entirely in IMD, 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-1832-donotbuy @a9a48cb4b458f35160da7ec0693e4b422be684ca (launch 1832, parked, never deployed). It was parked because its ETH-to-IMD conversion could be stalled through the public anchor; this redo removes conversion entirely. Keep everything else there (raffle, tips, bail-out, king settlement and reign stamps, upkeep gas caps, carry rules, coin/IMD graduation for both currency orders, 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, no linked libraries, constructors take only static args and call nothing outside the manifest, nothing called after deployment.\n\nIMD: 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, 18 decimals, a bridged token with unverified source; transfers are enabled and contracts already pull it with transferFrom. Use safe calls that accept an empty return, check the amount actually received on every pull (revert if short) and keep internal accounting: ledgers credit only IMD actually received, never balanceOf.\n\nCHANGE 1, EVERYTHING IN IMD. Remove all ETH: no payable function, no receive or fallback; the contracts never hold ETH. Delete conversion, escrow, anchor, observeMarket, the 24 h fallbacks, the native coin/ETH path, the IMD/ETH key and the converting status. Entries, rolls, curve, pot, tips, draw bounty, bail-outs, finalizer fee, carry, king bids, refunds, dev share and burns all move IMD. After finalize, graduate() seeds the coin/IMD pool directly with the curve's IMD at the final curve price, as v3 did with ETH (fee 10000, tickSpacing 200, PadHook, full range, LP owned forever, IMD dust donated as now, excess coins to dEaD, token unlocked in that tx).\n- Players approve only PvPPad. PvPPad.pull(from, amount) is callable only by its own game clones and KingOfThePad, which always pass their own msg.sender as from; it moves IMD from that wallet to the calling contract. Public donations (fundCarry, burn) pull from msg.sender.\n- Payouts are plain transfers; one that fails becomes claimable and never blocks a batch.\n- Prices, with unit starting at 1 IMD: entry 0.5 unit; roll 1 unit (90% curve, 7% pot, 2% PvP burn, 1% resolver tip); curve virtual reserve 400 units against 1e9 virtual coins, 800M on the curve, sold out at 1,600 units raised; finalizer 0.5% of pot, max 2 units; king first bid at least 4 units, then +10% as now; burn at most 8 units per 10 min.\n- PvPPad.owner may setUnit(u) with 0.1 IMD <= u <= 10 IMD, so prices can follow the IMD price. Each game copies unit at creation and never changes; the king minimum and the burn cap use the current unit. Event on every change.\n\nCHANGE 2, BURN. burnChunk buys PvP with bucket IMD through the PvP/IMD pool in one hop, with the existing 1% price limit and partial fills (unspent IMD stays in the bucket); bought PvP goes to dEaD.\n\nCHANGE 3, LATE BAIL-OUT. A seat that bails while alive still counts toward FUNDED_MIN_LIVING (never toward rank, bell, payout or king eligibility), so a low seat cannot cancel the funded release by bailing just before the end. Re-derive AUDIT.md #13 with this rule and IMD amounts and show a sole-buyer sybil still loses.\n\nTESTS on the real v4-core PoolManager with a mock IMD (plus a variant with no bool return): full games paid in IMD; pull cannot take from any wallet but the caller's, and only games and the king can call it; sending ETH to any contract reverts; graduation price equivalence, unlock and both currency orders; one-hop burn with price limit and partial fill; king bids, refunds and fees in kind (IMD and coins); bail-out in profit, at a loss and below minOut; the late bail-out keeps the release; an all-bailed game fails cleanly; setUnit bounds, owner-only, and running games keep their prices; IMD and coin conservation invariants; every v3 regression still passes.\n\nLAUNCH.JSON: like the repo, with PadLiquidity(poolManager, pad, imd) and no pool-id arg; owner and dev both $owner; 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 this version, including the IMD dependency (if IMD transfers ever stopped, the pad's IMD would wait); test report with gas; docs/VERIFY.md (robin.etherscan.io); README: legal review and an independent audit before public launch.\n\nToken name: nobuy","parentJobId":null,"planHash":"ef272d0e4e724c2fd3e052ac9484e4f54d6152ed999b8ddf726485ff1063d63a","previousHash":"d19cd0cd815260ee027762a71c338d9563da9fe143b065bf606cb0a1a8cb979e","projectId":"bf3fe37c-172e-4c22-aef8-885d9e39a1eb","publication":{"commit":"8565924dc0f3d47164cd6eb254e4538517eb84a2","deliveredAt":"2026-10-15T20:17:48.130Z","repoUrl":"https://github.com/identity-md-launches/launch-1870-nobuy"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"751a44c534e5a5da138e0836e1127c2e0868d2fe7eec29e8cdd2ca392b9a7fba","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e0f64c10e30e33e2","findings":[],"hash":"06547d7bf79760174216ee8498d056f50f636abfdebc8d19b733708e4bddb7ce","nodeId":"32ba814a-74ae-4497-b007-a0edadd3c833","outcome":"completed","summary":"I found no defect I could back with a concrete failing input, so `.imd-findings.json` has an empty findings list. It also has coverage rows for all 47 listed entry points plus 2 invariant checks, every one marked `holds`. No source files were changed.\n\n**What I covered:** I read all of `src/` in full: `PvPPad`, `PadGame`, `PadLiquidity`, `KingOfThePad`, `PadToken`, `PadHook`, `PadLib` and the interfaces. I traced each listed entry point through the Execution Trace, Periphery and First Principles guides. The existing suite passes: 225 tests in 24 suites, 0 failing.\n\nPoints I checked and found sound:\n- **Who can pull IMD:** `PvPPad.pull` accepts calls only from game clones and `KingOfThePad`, and each of those passes its own `msg.sender` as the payer (`enter`, `roll`, `takeCrown`). Every pull checks the amount actually received. Donations (`fundCarry`, `burn`) pull from the sender, and ledgers count only IMD received.\n- **Finalize ordering:** `_finalize` takes carry before setting `finalized`, so `fundPot` still succeeds. The funded-release check (`living != 0 && living + bailedAliveCount >= 5`) agrees with the \"returned\" branch. The finalizer fee is capped at the lowest of 0.5% of the pot, 2 units and roll income. Rounding dust goes to carry.\n- **Late bail-out:** a seat that bails while alive counts only toward the five-seat minimum. It is kept out of rank, bell, payout and king eligibility. When the last coins are sold back, `imdRaised` returns to exactly 0, so an all-bailed game fails cleanly instead of jamming graduation.\n- **Graduation:** pools seed at the final curve price with both currency orders handled, IMD dust donated, excess coins sent to dEaD and the token unlocked in the same transaction. The hook blocks anyone else from initializing the pool first.\n- **Burn and king fees:** the burn buys in one hop with the 1% limit and puts unspent IMD back in the bucket. The ArbSys block-hash window bounds match the precompile's range. King settlement by reign checks out.\n- **AUDIT.md #13:** I re-derived it independently. Dumping every coin recovers at most e(R+e)/(2R+e). At least e/6 stays in the pool, which is more than the 0.15e maximum release for any e ≤ 4R. Counting alive bails does not raise that cap.\n\n**Leads I dropped:**\n- **Zero-coin bail-outs:** seats that never rolled can bail for free and still count toward the five-seat minimum. The brief allows this, and it doesn't change the loss bound above.\n- **Predictable draw seed:** if no one calls `draw` within 257 blocks, the fallback seed can be predicted. Only the committer could exploit it, and the draw bounty gives everyone else a reason to seed first, so I couldn't show a working attack.\n- **Fees that span several reigns:** a pool collected late pays all its fees to the king of the reign it was last settled for. This is documented behaviour inherited from the base.\n- **Static-analysis leads:** the slither and aderyn lines turned out to be the intended `mulDiv` XOR, guarded reentrancy and deliberate unused returns.\n\n**Not verified:** the real IMD token's transfer gas against the 40k cap on payouts. If IMD needs more than that, payouts become claimable rather than pushed; no funds are lost. I did not stress-test the `upkeepStep` 4.5M gas cap against a 200-seat finalize; if it runs short, the public `finalize()` still works.","treeHash":null,"usage":{"cachedInputTokens":1012336,"inputTokens":24,"model":"claude-opus-5-5","outputTokens":32005,"runtime":"claude","turns":13,"wallClockMs":689752}},{"artifacts":[],"attempt":1,"bundleHash":"c479df8ddda33e0bb1af3b8c23f76ae3744f541406f1947613ed8d6da70c0884","device":"b29f0968f2df07a0","findings":[],"hash":"123a65b1bc4555ea1641ade9bd9d32b12c83ce03e15348805caef1b2ea0069af","nodeId":"2d191777-d703-459b-a0e4-5df1c2fe6fd1","outcome":"completed","summary":"Implemented the contracts-only IMD adaptation, including direct coin/IMD graduation, one-hop burns, claimable failed payouts, unit pricing, and late-bail funding protection.\n\n- `forge build` passes.\n- All **225 tests pass under both fuzz seeds**.\n- Manifest validates; combined deployment/opening gas: **12,917,377**.\n\nUpdated [ADAPTATION.md](ADAPTATION.md), audit, verification guide, and [test report](docs/TEST-REPORT.md). No deployment or RPC calls performed.","treeHash":"8552b14d5b9218215956d6e958b8a7609f05ac76","usage":{"cachedInputTokens":10759424,"inputTokens":305552,"model":"gpt-6-astra","outputTokens":63093,"runtime":"codex","turns":10,"wallClockMs":2408634}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fba19b641cdd6f27","findings":[{"citation":"resolved","description":"Documented privileged power, recorded as the Pashov adapter asks, not as a permission bypass. The owner (the launch wallet 0x5b95a971b4583a5f011e9da082acdd679b870d06, also `dev` in KingOfThePad) may move `unit` anywhere in [0.1, 10] IMD at any time. Running games are unaffected (PadGame.initialize snapshots `unit` once, PadGame.sol:182), so there is no in-flight value redirection: entry/roll/bail/finalizer prices of an open game never change. The only live surfaces reading the current unit are PadLiquidity.burnChunk (cap = 8 * unit per 10 min, PadLiquidity.sol:361) and KingOfThePad.minBid (first bid only, KingOfThePad.sol:129). The same owner receives 25% of every crown bid's `extra` as dev share (KingOfThePad.sol:103-107). All of this matches the brief ('owner may setUnit', 'owner and dev both $owner'); I traced setUnit, burnChunk and minBid and found no unprivileged amplifier (no race, no retroactive sweep of credited value, no asymmetric formula), so this is reported only so the judge has the privileged surface in one place.","line":94,"path":"src/PvPPad.sol","reproduction":"State: pad open, PvP graduated, burnBucket = 100 IMD, 10 minutes since lastBurnAt. Owner calls pad.setUnit(10 ether) (emits UnitChanged(1e18, 10e18)). Expected and actual: the next burnChunk spends up to 80 IMD instead of 8; the next launch's PadGame copies unit = 10 IMD (roll 10 IMD, entry 5 IMD) while every already-created game keeps its snapshot; if no king exists yet, minBid becomes 40 IMD. Non-owner calling setUnit reverts PadNotOwner; setUnit(0.1 ether - 1) and setUnit(10 ether + 1) revert PadAmount (confirmed by test/IMDPad.t.sol:17-26 passing on this tree).","severity":"info","snippet":"    function setUnit(uint256 u) external {\n        if (msg.sender != owner) revert PadErrors.PadNotOwner();\n        if (u < 0.1 ether || u > 10 ether) revert PadErrors.PadAmount();\n        emit UnitChanged(unit, u);\n        unit = u;\n    }","title":"Trust assumption (not a defect): owner controls unit within 100x and is also the dev fee recipient"}],"hash":"13929dd0ecbead8550283945213c176770c1f9903d66e80926c5e1d28741e08a","nodeId":"b6286433-a770-4d92-acd0-4fe4c9aa5893","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written and validated. No tracked file was changed.\n\n**Outcome: no permission bypass found.** I traced every one of the 47 ABI entry points against the Access Control, Trust Gap and Asymmetry guides and the access model holds as the brief specifies.\n\n**What I verified in depth**\n\n- `PvPPad.pull` is reachable only by registered game clones and the king contract, and every caller passes its own `msg.sender`. The template, PadLiquidity and outsiders are rejected. The suite's test for this passes on this tree.\n- Approvals form a closed graph. Players approve only the pad. The pad approves each clone, clones approve pad and liquidity, the king approves pad and liquidity. Every `pullExact` pulls from the restricted caller itself, so no holder of an allowance can be made to spend it on someone else's behalf.\n- One-shot bindings, sealed templates, hook-only pool initialization, game-only `reclaim`, liquidity-only `unlock`, and the `_onlySelf` and `_onlyManager` callback gates all hold. The v4 PoolManager only calls back its own unlock caller, so `unlockCallback` data always originates from PadLiquidity.\n- Reign stamps pay the correct king. `settleCrown` records the outgoing king and bumps the reign before KingOfThePad rewrites `king`, and unreached pools keep their old stamp. The crown settlement tests confirm this.\n- Late bail-out counts only toward the five-seat threshold and never toward rank, bell, king weight or payout. The all-bailed path unwinds the curve to exactly zero and fails cleanly. The bail and sybil tests pass.\n- `setUnit` cannot redirect in-flight value since games snapshot the unit. Only the burn cap and the first-bid minimum read the live value.\n\n**Reported**\n\nOne `info` entry documents the owner's privileged surface as a trust assumption, as the Pashov adapter asks: unit control within 0.1 to 10 IMD and the dev share of crown bids. It is explicitly marked as by design, with the concrete state change it produces.\n\n**Not verifiable offline**\n\nThe PoolManager address in launch.json is inherited configuration. No chain table was supplied, so I could not confirm it. The manifest shape itself matches the constructors and the brief.\n\n**Coverage record**\n\nAll 47 entry points have a row, plus three invariant rows. All are `holds` except `setUnit`, which points to the info entry.","treeHash":null,"usage":{"cachedInputTokens":1540002,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":49131,"runtime":"claude","turns":29,"wallClockMs":1312175}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1f9cb1750ebf47ed","findings":[{"citation":"resolved","description":"Every IMD payout (rank prizes, bell share, finalizer fee, draw bounty, bail-out payout in PadGame._pay; king refund and dev share in KingOfThePad.takeCrown; king fees in PadLiquidity._pay) is attempted through PadLib.push with a hard 40,000-gas stipend and is booked as claimable when the call fails. IMD (0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127) is a bridged token with unverified source; on an Arbitrum-stack chain the standard bridged token is an OpenZeppelin-v4-shaped ERC20Upgradeable behind a ClonableBeaconProxy (beacon SLOAD, STATICCALL implementation(), DELEGATECALL). Measured on this tree (forge 1.8.3, cancun, test/scratch/PushGasBeacon.t.sol and PushGasOZ4.t.sol): the smallest stipend that lands such a transfer to a recipient with a zero balance is 39,921 gas for a minimal OZ-v5 shape and 39,950 gas for the OZ-v4 shape, i.e. 50-80 gas under the cap. The live bytecode (different compiler, optimizer settings, any extra check such as a pause flag, blocklist or hook) is not in front of us, and a single extra cold SLOAD (2,100 gas) in the transfer path pushes it over. When it is over, no push to a first-time IMD recipient ever succeeds: every winner, bell ringer, finalizer, bailing player, outgoing king and the dev get Paid(to, amount, false) and must send a second claim() transaction. Funds are never lost (claim() forwards all gas), so this is a broken 'payouts are plain transfers' guarantee for the common case rather than theft; it is rated medium because the margin is effectively zero and it cannot be ruled out offline. The project's own PadToken clone push to a fresh holder was measured at 37,677 gas by the math specialist, so the coin path has about 2.3k of margin. Merged from audit_economics (c1d7b370, info) and audit_math (e2b85c79, low): same root cause. Minimal fix preserving the design: raise PUSH_GAS to e.g. 80,000-100,000 (it only bounds a hostile recipient's work; returndata is already capped at 32 bytes) and, before opening, measure one IMD transfer to a zero-balance address on robin.etherscan.io and record it in docs/AUDIT.md #38.","line":10,"path":"src/libs/PadLib.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PadLib} from \"src/libs/PadLib.sol\";\n\n/// @dev OpenZeppelin v4 ERC20Upgradeable transfer shape (the base of Arbitrum-stack bridged\n/// StandardArbERC20) with one extra storage read in the transfer path (a pause flag), behind a\n/// ClonableBeaconProxy-shaped proxy. Measured: the plain OZ4 shape needs 39,950 gas to a fresh\n/// holder; this one needs about 42,100, so PadLib.push (40,000 stipend) never lands it.\ncontract PausableOZ4 {\n    uint8 private _initialized;\n    bool private _initializing;\n    uint256[50] private __gap0;\n    mapping(address => uint256) private _balances;\n    mapping(address => mapping(address => uint256)) private _allowances;\n    uint256 private _totalSupply;\n    bool private _paused;\n\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    function mint(address to, uint256 a) external {\n        _totalSupply += a;\n        _balances[to] += a;\n        emit Transfer(address(0), to, a);\n    }\n\n    function balanceOf(address a) external view returns (uint256) {\n        return _balances[a];\n    }\n\n    function transfer(address to, uint256 amount) public returns (bool) {\n        _transfer(msg.sender, to, amount);\n        return true;\n    }\n\n    function _transfer(address from, address to, uint256 amount) internal {\n        require(from != address(0), \"ERC20: transfer from the zero address\");\n        require(to != address(0), \"ERC20: transfer to the zero address\");\n        require(!_paused, \"paused\");\n        uint256 fromBalance = _balances[from];\n        require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n        unchecked {\n            _balances[from] = fromBalance - amount;\n            _balances[to] += amount;\n        }\n        emit Transfer(from, to, amount);\n    }\n}\n\ncontract Beacon {\n    address public implementation;\n\n    constructor(address i) {\n        implementation = i;\n    }\n}\n\ncontract BeaconProxy {\n    address internal beacon;\n\n    constructor(address b) {\n        beacon = b;\n    }\n\n    fallback() external payable {\n        address impl = Beacon(beacon).implementation();\n        assembly {\n            calldatacopy(0, 0, calldatasize())\n            let ok := delegatecall(gas(), impl, 0, calldatasize(), 0, 0)\n            returndatacopy(0, 0, returndatasize())\n            switch ok\n            case 0 { revert(0, returndatasize()) }\n            default { return(0, returndatasize()) }\n        }\n    }\n}\n\ncontract Payer {\n    function push(address token, address to, uint256 amount) external returns (bool) {\n        return PadLib.push(token, to, amount);\n    }\n\n    function needed(address token, address to, uint256 amount) external returns (uint256 used) {\n        uint256 g = gasleft();\n        PadLib.tokenCall(token, abi.encodeWithSelector(0xa9059cbb, to, amount), gasleft());\n        used = g - gasleft();\n    }\n}\n\ncontract PushStipendProofTest is Test {\n    function test_pushLandsForBridgedTokenShapeWithOneExtraStorageRead() public {\n        PausableOZ4 impl = new PausableOZ4();\n        Beacon beacon = new Beacon(address(impl));\n        PausableOZ4 token = PausableOZ4(address(new BeaconProxy(address(beacon))));\n        Payer payer = new Payer();\n        token.mint(address(payer), 10 ether);\n\n        uint256 used = payer.needed(address(token), address(0xCAFE), 1 ether);\n        emit log_named_uint(\"transfer to fresh holder, gas including call overhead\", used);\n\n        // A fresh winner (zero IMD balance) must receive a plain transfer; it parks instead.\n        bool landed = payer.push(address(token), address(0xF00D), 1 ether);\n        assertTrue(landed, \"PUSH_GAS = 40_000 parks every first-time payout for this token shape\");\n    }\n}","reproduction":"State: an OZ-v4-shaped ERC20 behind a beacon proxy whose _transfer reads one extra storage slot (a pause flag), the shape of a bridged token with any added check; recipient 0xF00D has a zero balance. Call PadLib.push(token, 0xF00D, 1e18) from a contract holding the token (exactly what PadGame._pay, KingOfThePad.takeCrown and PadLiquidity._pay do). Expected per the brief: the transfer lands and Paid(to, amount, true). Actual: the callee runs out of gas inside the 40,000 stipend (the unbounded call costs 44,735 gas including call overhead, about 42,100 inside the callee), push returns false and the amount is parked in claimable. Run: forge test --match-path test/scratch/PushStipendProof.t.sol -> FAIL 'PUSH_GAS = 40_000 parks every first-time payout for this token shape'. Headroom measurement without the extra read: forge test --match-contract PushGasHeadroomTest -vv prints 39921; --match-path test/scratch/PushGasOZ4.t.sol -vv prints 39950 against the cap of 40000.","severity":"medium","snippet":"    uint256 internal constant PUSH_GAS = 40_000;","title":"PUSH_GAS = 40,000 leaves about 50 gas over a beacon-proxied bridged ERC20 transfer to a fresh holder; any heavier IMD transfer path parks every first-time payout as a claim"},{"citation":"resolved","description":"The implementation follows the brief's wording literally: a seat that bails while alive is counted toward FUNDED_MIN_LIVING (bailedAliveCount), and a seat that is dead when it bails is not. Reproduced the economics specialist's scenario (ad99ff3a): with five seats, the fifth stops rolling at minute 36, is dead from minute 46, bails at minute 48 and receives exactly the alive-bail payout (cost + profit/2), bailedAliveCount stays 0, living at end is 4, and _finalize (line 679 'if (living + bailedAliveCount < FUNDED_MIN_LIVING)') returns all funded IMD to carry: 4.253 IMD withheld from four survivors in the proof (15% of the net curve IMD left after the bail). Recalibrated to low rather than the reported medium: the lever is not the bail but idling. The same seat that simply stops rolling and never bails produces the identical outcome (a dead seat never counted as living in v3 either), so bailOut adds no cancellation power beyond what the pre-existing living rule already allows, and the brief's guarantee as written ('cannot cancel the funded release by bailing') holds. No funds are lost or misdirected; the funded carry stays in the pad for later games. Whether a dead bail should also qualify is a design decision for the author: counting every erased seat (any bail, alive or dead) does not widen the sole-buyer sybil bound in AUDIT.md #13, because living == 0 still returns all funded IMD and alive bails at play start already give the same count. If the current rule is kept, AUDIT.md #13 should state plainly that an idle (dead) seat, bailed or not, still lowers the qualification count, and the existing test that lets a dead seat bail should assert the release outcome.","line":328,"path":"src/PadGame.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\";\n\n/// @dev Minimal standard ERC20 standing in for IMD (etched at the IMD address).\ncontract ScratchIMD {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 a) external {\n        balanceOf[to] += a;\n    }\n\n    function approve(address s, uint256 a) external returns (bool) {\n        allowance[msg.sender][s] = a;\n        return true;\n    }\n\n    function transfer(address to, uint256 a) external returns (bool) {\n        _move(msg.sender, to, a);\n        return true;\n    }\n\n    function transferFrom(address f, address t, uint256 a) external returns (bool) {\n        uint256 al = allowance[f][msg.sender];\n        require(al >= a, \"allowance\");\n        if (al != type(uint256).max) allowance[f][msg.sender] = al - a;\n        _move(f, t, a);\n        return true;\n    }\n\n    function _move(address f, address t, uint256 a) internal {\n        require(balanceOf[f] >= a, \"balance\");\n        balanceOf[f] -= a;\n        balanceOf[t] += a;\n    }\n}\n\n/// @dev ArbSys stand-in etched at 0x64.\ncontract ScratchArbSys {\n    uint256 public n;\n\n    function set(uint256 v) external {\n        n = v;\n    }\n\n    function advance(uint256 d) external {\n        n += d;\n    }\n\n    function arbBlockNumber() external view returns (uint256) {\n        return n;\n    }\n\n    function arbBlockHash(uint256 b) external view returns (bytes32) {\n        return keccak256(abi.encode(b));\n    }\n}\n\n/// @notice CHANGE 3 says a low seat must not be able to cancel the funded release by bailing out\n/// late. A seat that lets itself die (no roll for 10 minutes) and then bails gets the very same\n/// bail-out payout but is not counted in `bailedAliveCount`, so the fifth qualifying seat\n/// disappears and the whole funded carry is withheld from the four honest survivors.\ncontract DeadBailBypassTest is Test {\n    address constant IMD = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    address constant OWNER = 0x5b95A971B4583A5f011E9DA082acdD679b870D06;\n    address constant ARB_ADDR = address(0x64);\n\n    ScratchArbSys arb;\n    ScratchIMD imd;\n    PvPPad pad;\n    PadLiquidity liq;\n    KingOfThePad king;\n    PadGame pvp;\n    address[5] players;\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        vm.etch(ARB_ADDR, address(new ScratchArbSys()).code);\n        arb = ScratchArbSys(ARB_ADDR);\n        arb.set(1000);\n        vm.etch(IMD, address(new ScratchIMD()).code);\n        imd = ScratchIMD(IMD);\n\n        PadToken tokenTemplate = new PadToken();\n        PadGame gameTemplate = new PadGame();\n        pad = new PvPPad(OWNER, address(tokenTemplate), address(gameTemplate));\n        // No pool is touched in this scenario; the manager address only has to be non-zero.\n        liq = new PadLiquidity(address(0xBEEF), address(pad), IMD);\n        king = new KingOfThePad(address(pad), address(liq), OWNER);\n\n        imd.mint(address(this), 10_000 ether);\n        imd.approve(address(pad), type(uint256).max);\n        for (uint256 i; i < 5; ++i) {\n            players[i] = address(uint160(0xA000 + i));\n            imd.mint(players[i], 1_000 ether);\n            vm.prank(players[i]);\n            imd.approve(address(pad), type(uint256).max);\n        }\n\n        bytes32 salt = _mineSalt();\n        vm.prank(OWNER);\n        pad.openPad(salt);\n        pvp = PadGame(pad.gameOf(1));\n    }\n\n    function _mineSalt() internal view returns (bytes32 salt) {\n        bytes32 h = liq.hookInitCodeHash();\n        bytes memory buf = abi.encodePacked(bytes1(0xff), address(liq), bytes32(0), h);\n        for (uint256 i; i < 200_000; ++i) {\n            uint256 a;\n            assembly (\"memory-safe\") {\n                mstore(add(buf, 53), i)\n                a := and(keccak256(add(buf, 32), 85), 0xffffffffffffffffffffffffffffffffffffffff)\n            }\n            if (a & 0x3FFF == 0x2000) return bytes32(i);\n        }\n        revert(\"no salt\");\n    }\n\n    function _rollAll(uint256 count) internal {\n        for (uint256 i; i < count; ++i) {\n            vm.prank(players[i]);\n            pvp.roll();\n        }\n        arb.advance(4);\n        pvp.resolvePending(16);\n    }\n\n    function test_deadSeatBailCancelsFundedReleaseDespiteChange3() public {\n        for (uint256 i; i < 5; ++i) {\n            vm.prank(players[i]);\n            pvp.enter();\n        }\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        uint256 start = pvp.playStart();\n\n        // Every seat rolls each six minutes up to minute 36; the fifth seat then stops rolling.\n        for (uint256 r; r <= 6; ++r) {\n            vm.warp(start + r * 6 minutes);\n            arb.advance(300);\n            _rollAll(5);\n        }\n        vm.warp(start + 42 minutes);\n        arb.advance(300);\n        _rollAll(4);\n\n        pad.fundCarry(400 ether);\n        uint256 carryBefore = pad.carryPot();\n\n        // Minute 48: the fifth seat is dead (last roll at minute 36) but may still bail out, at the\n        // same payout an alive bail would get. It is not counted as a qualifying seat.\n        vm.warp(start + 48 minutes);\n        address lowSeat = players[4];\n        assertFalse(pvp.isAlive(pvp.impOf(lowSeat) - 1), \"seat is dead at bail time\");\n        uint256 coins = PadToken(pad.tokenOf(1)).balanceOf(lowSeat);\n        uint256 value = pvp.quoteSell(coins);\n        uint256 cost = pvp.curveSpent(lowSeat);\n        uint256 expectedPayout = value >= cost ? cost + (value - cost) / 2 : value * 90 / 100;\n        uint256 balBefore = imd.balanceOf(lowSeat);\n        vm.prank(lowSeat);\n        pvp.bailOut(0);\n        assertEq(imd.balanceOf(lowSeat) - balBefore, expectedPayout, \"dead bail pays exactly like an alive bail\");\n\n        // The bail lowered net curve IMD, so read the cap the finalizer will use after it.\n        uint256 cap = pvp.fundedReleaseCap();\n        assertGt(cap, 0, \"funded release is affordable\");\n\n        vm.warp(pvp.hardEnd() + 1);\n        arb.advance(300);\n        pvp.finalize();\n        assertEq(pvp.livingAtEnd(), 4, \"four honest survivors\");\n\n        // Expected under CHANGE 3's guarantee: a seat that bails late cannot cancel the funded\n        // release, so the carry pot is drawn down by the release cap. Actual: nothing is released.\n        // (the pad's carry only ever grows here, by rounding dust, so the comparison is done on sums)\n        assertApproxEqAbs(pad.carryPot() + cap, carryBefore, 2, \"funded release must survive a late bail-out\");\n    }\n}","reproduction":"Five wallets enter the genesis game (0.5 IMD each), draw completes at playStart. Rounds at minutes 0,6,12,...,36: all five roll (1 IMD each) and resolve. Minute 42: only seats 0-3 roll. Anyone funds carry with 400 IMD. Minute 48: seat 4 (last roll at 36, dead since 46) calls bailOut(0): receives cost + (value - cost)/2 IMD, bailedAliveCount stays 0. fundedReleaseCap() read after the bail = 4.253385877459452455 IMD (15% of the reduced net curve IMD binds). At hardEnd + 1, finalize(): livingAtEnd = 4, living + bailedAliveCount = 4 < 5, no takeCarry, carryPot = 400 IMD + 1 wei dust. Expected under the specialist's reading of CHANGE 3: carryPot drops by 4.253 IMD and the four survivors share it. Actual: nothing released. Same outcome if seat 4 never bails at all. Had seat 4 bailed at minute 42 while alive, bailedAliveCount = 1 and the release is paid. Run: forge test --match-path test/scratch/DeadBailBypass.t.sol -> FAIL 'funded release must survive a late bail-out: 404253385877459452455 !~= 400000000000000000000'. The same test passes against a copy of PadGame whose bailOut counts every bail (verified locally); the specialist's original proof read the cap before the bail and would keep failing after that fix, so the cap read was moved after the bail.","severity":"low","snippet":"        if (_lastActivity(imps[impOf[msg.sender] - 1]) + DEATH > block.timestamp) ++bailedAliveCount;","title":"CHANGE 3 only counts a bail taken while alive; a low seat still removes itself from the FUNDED_MIN_LIVING count at no cost by going idle for 10 minutes (bailing dead afterwards pays the same)"},{"citation":"resolved","description":"Documented privileged power, not a defect (merged from audit_permissions 93e72c99). The launch owner ($owner, also KingOfThePad.dev receiving 25% of every crown bid's extra) may set unit anywhere in 0.1-10 IMD. PadGame.initialize snapshots unit once (PadGame.sol:182), so entry, roll, bail, finalizer and curve prices of an existing game never change. Live surfaces reading the current unit: PadLiquidity.burnChunk cap (8 * unit per 10 minutes, PadLiquidity.sol:361) and KingOfThePad.minBid for the first bid only (KingOfThePad.sol:129). Traced setUnit, burnChunk and minBid: no unprivileged amplifier, no retroactive sweep, bounds inclusive, UnitChanged emitted on every change, non-owner reverts PadNotOwner. Matches the brief.","line":94,"path":"src/PvPPad.sol","reproduction":"State: pad open, PvP graduated, burnBucket = 100 IMD, 10 minutes since lastBurnAt. Owner calls setUnit(10 ether): emits UnitChanged(1e18, 10e18). Expected and actual: next burnChunk spends up to 80 IMD instead of 8; the next launch's game copies unit = 10 IMD; every existing game keeps its snapshot; with no king yet, minBid() = 40 IMD. Non-owner setUnit reverts PadNotOwner; setUnit(0.1 ether - 1) and setUnit(10 ether + 1) revert PadAmount (test/IMDPad.t.sol passes on this tree).","severity":"info","snippet":"    function setUnit(uint256 u) external {","title":"Trust assumption: the owner (also dev fee recipient) moves unit within [0.1, 10] IMD at any time; running games are unaffected, burn cap and first king bid follow the current unit"},{"citation":"resolved","description":"launch.json passes 0x8366a39cc670b4001a1121b8f6a443a643e40951 as PadLiquidity's poolManager, inherited from launch 1832 and documented as 'configuration, not evidence of live verification'. No RPC is allowed here, so it could not be checked. PadLiquidity.graduate calls poolManager.initialize/unlock; PadGame._graduate reverts (and rolls back graduated = true) if that call fails, so a wrong address leaves every game stuck at finalized: players' prizes are paid (finalize precedes graduation) but the curve IMD and remaining coins never reach a pool and have no other exit, and KingOfThePad never opens (genesisGraduated stays false). Not a code defect; recorded so the deployment service verifies the address (cast code on 4663 and a read such as extsload/owner) before the launch transaction. Schema, argument order, $owner for both owner and dev, lowercase addresses and 'no pool-id arg' were checked against the compiled ABIs with tools/validate_manifest.py: valid, 53,529 runtime bytes total.","line":205,"path":"src/PadLiquidity.sol","reproduction":"Deploy with poolManager = an address without PoolManager code (e.g. 0xBEEF as the specialist's scratch test does). Run a full game to finalize, then graduate(): expected a coin/IMD pool seeded at the final curve price; actual revert in PadLiquidity.graduate at poolManager.initialize, PadGame.graduated reverts to false, imdRaised IMD and the coin balance remain in the game forever and genesisGraduated() stays false.","severity":"info","snippet":"        poolManager.initialize(key, sqrtP);","title":"Open item: the PoolManager address in launch.json is inherited configuration; if it is not the live v4 PoolManager on chain 4663 every graduate() reverts and curve IMD stays in finalized games"}],"hash":"236428389511056374dc582f716de2bb10dec87549892e6a1b2b98a65753dc71","nodeId":"3d17391b-ef57-4603-be2a-b546af56c16d","outcome":"completed","summary":"Review complete. The findings file `.imd-findings.json` is written with 4 findings and a 50-row coverage record (all 47 entry points plus three invariant rows). The tree is otherwise untouched; `test/scratch/` holds only my proof runs.\n\n**Outcome: no critical or high defect. One medium, one low, two informational.**\n\n- **Medium, push stipend has no headroom** (`src/libs/PadLib.sol:10`). Every IMD payout is attempted with a hard 40,000 gas stipend and parks as a claim on failure. I measured the smallest stipend that lands a transfer to a zero-balance recipient through a beacon-proxied ERC20, the shape of an Arbitrum-stack bridged token: 39,921 for a minimal OZ-v5 shape and 39,950 for the OZ-v4 shape. That is 50 to 80 gas under the cap. One extra storage read in the live token's transfer path means every first-time winner, bailing player, outgoing king and the dev must send a second claim transaction. No funds are lost. Both specialist reports on this (economics info, math low) are merged here. Proof attached: fails now, passes with the stipend raised to 80k.\n- **Low, late bail-out rule** (`src/PadGame.sol:328`). The economics specialist's scenario reproduces: a seat that idles 10 minutes then bails is not counted, and the funded release is withheld from four survivors. I downgraded it from medium because the lever is idling, not bailing. A dead seat that never bails produces the identical outcome, so the brief's literal guarantee holds and no funds are misdirected. I corrected the specialist's proof, which read the release cap before the bail and would have kept failing after any fix, and confirmed it passes against a one-line fixed copy.\n- **Info, owner unit power** is recorded as a trust assumption, as the permissions specialist asked.\n- **Info, PoolManager address** in the manifest cannot be verified offline. If it is wrong, every graduation reverts and curve IMD stays in finalized games. The manifest itself validates against the compiled ABIs.\n\nVerification done: all 268 project tests pass on this tree (run in two halves because one run exceeds ten minutes). Runtime sizes are all under 24,576 bytes, with the largest at 19,928. The static-analysis leads were checked and none reproduced as a defect. Slither's exponent, divide-before-multiply and reentrancy lines point at the standard 512-bit mulDiv and at guarded or bounded calls.","treeHash":null,"usage":{"cachedInputTokens":2066268,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":50166,"runtime":"claude","turns":30,"wallClockMs":1576048}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e764f15311426447","findings":[{"citation":"resolved","description":"Boundary (Boundary agent, step 2: non-standard token). Every payout in the system (PadGame._pay for prizes, bail-outs, draw bounty and finalizer fee; PadLiquidity._pay for king fees in kind; KingOfThePad.takeCrown for refunds and the dev share) goes through PadLib.push, which forwards at most 40,000 gas and, on failure, books the amount as claimable instead. The calling code assumes a plain IMD or coin transfer fits in 40k. Measured on this tree (scratch test, forge 1.8.5, cancun): a PadToken EIP-1167 clone transfer to a recipient with a zero balance costs 37,677 gas inside push and 20,577 to an existing holder, so the project's own coin fits with about 2.3k to spare. IMD (0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127) is a bridged token with unverified source; Arbitrum-Orbit standard bridged tokens are StandardArbERC20 behind a ClonableBeaconProxy, whose transfer adds a beacon STATICCALL plus two cold SLOADs and a DELEGATECALL (about 7-8k) on top of the ~30k of a fresh-recipient ERC20 transfer, i.e. right at or above the cap. If the live token's transfer to a zero-balance holder costs more than 40,000 gas, no push to a first-time IMD recipient ever succeeds: every prize, refund, bail-out and fee is parked in claimable and the user must send a second transaction (and pay gas twice). Funds are never lost (claim() uses gasleft()), and this is the documented fallback for a hostile receiver, but it was not meant to be the normal path. The project's tests cannot show this because TestIMD/NoReturnIMD are plain storage tokens (about 25k per transfer). Suggested fix without changing behaviour: raise PUSH_GAS to e.g. 60,000-80,000 (still bounded, still returndata-capped) or verify the live token's transfer gas before launch and record the measured figure in docs/AUDIT.md.","line":10,"path":"src/libs/PadLib.sol","reproduction":"State: any game after finalize() with a winner that has never held IMD (balance slot zero). Make IMD a beacon-proxied ERC20 whose transfer to a zero-balance holder costs 40,001+ gas (e.g. OpenZeppelin BeaconProxy over ERC20Upgradeable: measured class of cost ~40k). Call PadGame.finalize(). Expected: Paid(to, amount, true) and the winner's IMD balance rises. Actual: PadLib.tokenCall runs out of gas inside the 40k stipend, push returns false, Paid(to, amount, false) is emitted and claimable[to] += amount for every winner, the bell ringer and the finalizer; the same happens in KingOfThePad.takeCrown for the previous king's refund and in PadLiquidity.collectPool for the king's IMD fees. Measured on this tree for comparison: PadToken clone push to fresh holder = 37,677 gas (test/scratch/PushGas.t.sol, removed after the run).","severity":"low","snippet":"    uint256 internal constant PUSH_GAS = 40_000;","title":"PUSH_GAS = 40,000 leaves ~2.3k headroom for the project's own clone and may be below the cost of the bridged IMD transfer, turning every first-time payout into a claimable"}],"hash":"5f48e4c9972b7e62ec16371107e42a180ccabf9bf1536560ba7490ff8e8b128c","nodeId":"7d715526-045b-45d3-9837-92a7d9524f4f","outcome":"completed","summary":"The review is complete and recorded in `.imd-findings.json`. The tree is otherwise untouched: scratch tests were removed and `git status` shows only the findings file.\n\n**Outcome.** No reachable math defect in the assigned area. One low-severity boundary finding is reported, plus a coverage record answering all 47 listed entry points and three checked invariants.\n\n**What I verified**\n\n- **Bonding curve.** Buys and sells both use ceiling division, so the virtual product never drops below K and the curve's rounding slack is under 1 wei of IMD. The sold-out branch divides exactly: K over the post-curve virtual stock is exactly 2,000 units, so raised IMD is capped at and lands on exactly 1,600 units. Reserve is zero only when every sold coin has been bailed, so the failed-genesis path is exact.\n- **Graduation on the real PoolManager.** I drove PadLiquidity.graduate directly with net reserves from 1 wei to 16,000 IMD in both currency orders, with a 64-run fuzz in between. The liquidity choice never owes more than the supplied amounts, the IMD remainder is donated, excess coins burn, and the token unlocks.\n- **Finalize split, fees and caps.** Finalizer fee, rank weights, bell share, funded release cap and carry remainder all sum exactly. Sort-key bit fields do not overlap. Hash-window boundaries match ArbSys's 256-block validity exactly.\n- **AUDIT.md #13.** Re-derived the sole-buyer argument: retained pool IMD is at least e/6 against a 0.15e release, a margin of e/60. Burn IMD flowing back into the genesis pool recovers less than the burn cost the derivation already waives, so the loss bound holds.\n- **Static-analysis leads.** The caret in mulDiv is the standard Newton seed, the strict equalities are exact by construction, and divide-before-multiply in finalize is integer-exact.\n\n**The finding (low).** Every payout uses a 40,000 gas push and falls back to claimable on failure. A PadToken clone transfer to a first-time holder measures 37,677 gas, so the project's own coin fits with little headroom. IMD is an unverified bridged token. If it is a beacon-proxied standard bridged ERC20, its transfer to a zero-balance holder sits at or above the cap, which would park every first-time prize, refund and fee in claimable. No funds are lost, but it should be measured against the live token before launch or the cap raised.\n\n**Not reached.** Reign and settlement ordering, access control and the launch manifest were outside my area and only touched where they intersect the arithmetic.","treeHash":null,"usage":{"cachedInputTokens":1439894,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":54693,"runtime":"claude","turns":30,"wallClockMs":1301909}},{"artifacts":[],"attempt":1,"bundleHash":"362958dc9705f62cc1765e165a926cf757ad5107a061b3ad2f5462f33ff83a8f","device":"4f64b8f2c68244fd","findings":[],"hash":"614fc1d54a92d7099cc1a72581cdf9b79989074b3e88a54842762e0a7dc76350","nodeId":"c84aad2d-38aa-4135-98c9-ad978993068e","outcome":"completed","summary":"Added 20 tests and two stateful invariant suites, entirely under `test/`.\n\n- Build passed; **247 tests passed**, none failed or skipped.\n- Launch checker passed.\n- Combined deployment/open gas: **12,917,377**.\n- Slither completed with warnings, including two reviewed high-severity items.\n\nDetails: [test report](/home/imd/.identitymd/work/bf3fe37c-172e-4c22-aef8-885d9e39a1eb/c84aad2d-38aa-4135-98c9-ad978993068e/test/IMD-INDEPENDENT-TEST-REPORT.md).","treeHash":"db22902eb9975a98d76292acd00ff10e6802f051","usage":{"cachedInputTokens":9970944,"inputTokens":174289,"model":"gpt-6-astra","outputTokens":42356,"runtime":"codex","turns":23,"wallClockMs":2099858}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f3b611cf8afb513f","findings":[],"hash":"6b7d8f25cda7cb20cc5a3da6bd8ee3d11d031d8860d66fe4ee092d6233b8bdea","nodeId":"3d17391b-ef57-4603-be2a-b546af56c16d","outcome":"completed","summary":"Review complete. The findings file holds zero outstanding defects and 52 coverage rows (all 47 entry points plus the four settlements and the deployment-rule check).\n\n**Settlement of the prior round**\n\n- **PUSH_GAS (medium, eda71ad0): fixed.** PadLib.PUSH_GAS is now 100k. My proof passes against the revised code. The beacon-proxied transfer with an extra cold read lands at 44,735 gas, and the author's PushStipend test shows 2x headroom with two extra reads. The nested budgets moved consistently. I traced the crown path: the bid check forwards at least 7.11M to settleCrown, and sixteen worst-case collections at about 420k each use 6.72M, so the sixteen-pool floor still holds. The upkeep distribute(2) at 950k keeps the same second-pool margin it had before. The docs record the change and the live IMD transfer measurement step.\n- **Dead-at-bail seat (low, 71256782): dropped.** The specialist proof still reproduces the behaviour, but it is the brief's literal rule and the lever is idling, not bailing. The author documented it in AUDIT.md #13 and added a passing test asserting the outcome.\n- **setUnit trust assumption and PoolManager address (info): closed as documented.** No code defect in either. The validator passes on the current manifest and VERIFY.md now carries the pre-opening PoolManager check.\n\n**Verification run**\n\n| Check | Result |\n|---|---|\n| Full suite | 258 passed, 0 failed |\n| Manifest validator | valid, 53,532 runtime bytes |\n| Deployment gas incl. openPad | 12,918,001 |\n\nNo new defects were found. The revision changed only constants, their tests and documentation, and every changed line was read as new code.","treeHash":null,"usage":{"cachedInputTokens":1872832,"inputTokens":612,"model":"claude-fable-5-1","outputTokens":20906,"runtime":"claude","turns":21,"wallClockMs":1274390}},{"artifacts":[],"attempt":1,"bundleHash":"38ec54915ea5b6881a9b22ebf2d1de4f34e505d145af4af48175d6b298dc344d","device":"03f15d1296244279","findings":[],"hash":"728519b353237589d53b89f88ba779060642f51afe5580c042f1602765fa5503","nodeId":"2d191777-d703-459b-a0e4-5df1c2fe6fd1","outcome":"completed","summary":"Done. The revision is complete and verified.\n\n**Reproduced and fixed (held proof):** the 40k payout stipend. The reviewer's proof failed on the starting tree (a beacon-proxied OpenZeppelin-v4 transfer with one extra storage read to a fresh holder needs 44,735 gas) and passes now.\n\n- `PadLib.PUSH_GAS` is raised from 40k to 100k in `src/libs/PadLib.sol`, giving more than 2x headroom over the measured transfer. It still only bounds a hostile recipient or token, and a failed push is still a claim.\n- Raising the stipend alone broke one existing test: a gas-eating king could exhaust the 300k pool-collection cap and veto a crown bid. So the budgets that nest two pushes moved with it: collection cap 300k to 400k, crown minimum settlement stipend 5M to 7M (sixteen pools still fit the floor; a bid needs about 7.72M gas), optional upkeep distribution 750k to 950k (two pools still settle per step). Five tests that hard-coded the old bid gas were updated.\n- New `test/PushStipend.t.sol` measures the proxied shape, checks the push lands with headroom, pays an existing holder, and bounds an endless callback to the stipend.\n\n**Advisories:** the dead-bail report is disputed, with no behaviour change. A seat dead for ten minutes never counted, bailed or not, so bailing dead removes nothing; the brief's CHANGE 3 covers the alive bail only. I added a test asserting that outcome and spelled the rule out in AUDIT.md #13. The setUnit trust assumption and the PoolManager address are not code defects; VERIFY.md and AUDIT.md #38 now carry two concrete pre-opening checks on robin.etherscan.io: confirm the PoolManager has v4 code, and measure one live IMD transfer to a zero-balance address against the 100k cap.\n\n**Checks:** `forge build` passes. The full suite passes with the pinned seed.\n\n| Result | Value |\n|---|---|\n| Tests passed | 230 delivered (232 with scratch), 0 failed |\n| Manifest | valid, 53,532 runtime bytes |\n| Deploy plus later opening | 12,918,001 gas, under the 13M target |\n\nDocs updated: AUDIT.md (#3, #11, #13, #21, #38, new #39), ADAPTATION.md, README, TEST-REPORT.md figures, VERIFY.md. All four findings are answered in `.imd-responses.json`. Protected files (foundry.toml, launch.json, remappings, lib) are untouched.","treeHash":"807969fe83c21ecdb9526c7cb382ecd95163bb13","usage":{"cachedInputTokens":1633145,"inputTokens":326,"model":"claude-fable-5-1","outputTokens":7029,"runtime":"claude","turns":12,"wallClockMs":2029590}},{"artifacts":[],"attempt":1,"bundleHash":"2c9ffc7d43cb480f9c22611ed53be88752da73ba0a9a29dd78a0d93c9eab20ab","device":"63274cc86a9400de","findings":[],"hash":"860c180315a4ebad82a7ed7827eff14c54157728de698bbf7d1a844dc91f8dfc","nodeId":"c84aad2d-38aa-4135-98c9-ad978993068e","outcome":"completed","summary":"The revision is complete and verified. No new findings file was warranted.\n\n**What changed since my last round.** No reviewer findings were attached to this brief. The implementer's later commit raised the payout stipend from 40k to 100k gas and the budgets that nest it: collection 400k, crown settlement floor 7M, optional upkeep distribution 950k. My previous five test files and mock still pass unchanged on that tree.\n\n**What I added.** One new file, `test/IMDBudgetRevision.t.sol`, attacks the new budgets from the recipient's side using a payee whose IMD receipt callback burns a chosen or endless amount of gas:\n\n- **Stipend fuzz, 256 cases.** A push never costs more than its stipend plus call overhead, parks instead of reverting, lands for modest receipt work and is parked past the stipend. Zero amount makes no token call.\n- **Single-seat game.** The only winner eats its push. The prize is parked, the claim reverts while the recipient is hostile, and lands once it behaves. The game stays backed.\n- **Least crown gas.** A binary search over state snapshots finds the smallest outer gas a bid can carry with sixteen real pools, both currencies, and an outgoing king eating every IMD push. One unit less fails whole with no state change. The least amount settles all sixteen pools with zero failures. A 7.6M bid reverts with the gas error before collecting anything.\n- **Optional upkeep.** Exactly two pools settle per step with both IMD pushes eaten, the third on the next step, and the parked IMD is claimable afterwards.\n- **200-seat finalize.** All 100 ranked winners eat their push.\n\n**Results with the verifier's fuzz seed.**\n\n| Check | Result |\n| --- | --- |\n| `forge test`, 32 suites | 258 passed, 0 failed, 0 skipped |\n| Least gas a crown bid can carry under hostile recipients | 7,771,501 |\n| Direct finalize, 200 seats, all 100 pushes eaten | 15,341,120 |\n\n**Two observations, recorded in `test/IMD-INDEPENDENT-TEST-REPORT.md`, neither a contract defect.** The README says a bid must carry about 7.72M gas, but the measured floor with hostile recipients is 7.77M, so wallets should be told 7.8M. The hostile 200-seat finalize sits 1.4M under the 16,777,216 single-transaction ceiling. That shape requires an IMD token that calls recipients on transfer, which the beacon-proxied OpenZeppelin-v4 token the implementer measured does not do, so I flagged it as the first thing to re-measure if the live token ever gains a receiver hook.\n\n**Not done.** No commit was made, matching the prior round where the harness committed. Nothing outside `test/` was touched.","treeHash":"36e33dea15ce58e5d34f1c58eea70c51fb54b46d","usage":{"cachedInputTokens":2546959,"inputTokens":836,"model":"claude-fable-5-1","outputTokens":46547,"runtime":"claude","turns":53,"wallClockMs":1496335}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e02bec63aa9dcaa5","findings":[{"citation":"resolved","description":"`_finalize` counts `living` as non-erased seats alive at `end` (line 656 skips `erased[imp.owner]`). A seat that is alive and ranked low can call `bailOut(0)` a few seconds before the hard end: it is erased, `living` drops from 5 to 4, the carry pull at line 663 is skipped and, at line 685, any king funding already in `fundedPot` is returned to the carry pot. The top-ranked seats lose the whole funded prize; the bailer only pays the 10% bail tax (or keeps cost plus half its profit when in profit). The brief's CHANGE 3 fixes this (a seat that bails while alive still counts toward FUNDED_MIN_LIVING, never toward rank, bell, payout or king eligibility); on the code as it arrived the cancellation is live. The same `living` value feeds `livingAtEnd` and the `returned = funded` branch, so king-funded ETH is also clawed back to carry by one late bail. Note the existing suite encodes the cancellation as expected behaviour: test/V4Pad.t.sol:240 asserts 'four living cannot release funding' after an alive seat bailed; that assertion must change with the rule. No test covers a bail by an alive seat with five other seats alive at the end.","line":661,"path":"src/PadGame.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\";\n\n/// @dev Stand-in for the ArbSys precompile (0x64), as the project's own tests use.\ncontract ScratchArbSys {\n    uint256 public number = 1000;\n\n    function advance(uint256 n) external {\n        number += n;\n    }\n\n    function arbBlockNumber() external view returns (uint256) {\n        return number;\n    }\n\n    function arbBlockHash(uint256 n) external view returns (bytes32) {\n        require(n < number && n + 256 >= number, \"invalid block number\");\n        return keccak256(abi.encode(\"arb\", n));\n    }\n}\n\n/// @notice Finding: a seat that bails out while alive, just before the end, drops `living` below\n/// FUNDED_MIN_LIVING in `_finalize`, so the funded release (carry) that five living seats earned is\n/// never pulled. Expected (CHANGE 3 rule): a seat that bails while alive still counts toward\n/// FUNDED_MIN_LIVING, so the carry release is paid. Actual: carryPot is untouched.\ncontract LateBailCancelsFundedReleaseTest is Test {\n    address constant IMD = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    address constant OWNER = 0x5b95A971B4583A5f011E9DA082acdD679b870D06;\n    bytes32 constant IMD_ETH_ID = 0xd2fc01ee6f8400b6b4ea3b341a188568f2bd6c72b07b96741a82396fa6eb8f02;\n\n    ScratchArbSys arb;\n    PvPPad pad;\n    PadLiquidity liq;\n    PadGame game;\n    address[5] players;\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        ScratchArbSys impl = new ScratchArbSys();\n        vm.etch(address(0x64), address(impl).code);\n        arb = ScratchArbSys(address(0x64));\n        address pm = deployCode(\"PoolManager.sol:PoolManager\", abi.encode(OWNER));\n        PadToken tokenTemplate = new PadToken();\n        PadGame gameTemplate = new PadGame();\n        pad = new PvPPad(OWNER, address(tokenTemplate), address(gameTemplate));\n        liq = new PadLiquidity(pm, address(pad), IMD, IMD_ETH_ID);\n        new KingOfThePad(address(pad), address(liq), OWNER);\n        bytes32 salt = _mineSalt();\n        vm.prank(OWNER);\n        pad.openPad(salt);\n        game = PadGame(pad.gameOf(1));\n        for (uint256 i; i < 5; ++i) {\n            players[i] = address(uint160(0xB000 + i));\n            vm.deal(players[i], 1 ether);\n        }\n    }\n\n    function _mineSalt() internal view returns (bytes32) {\n        bytes32 h = liq.hookInitCodeHash();\n        for (uint256 i; i < 300_000; ++i) {\n            address a = address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(liq), bytes32(i), h)))));\n            if (uint160(a) & 0x3FFF == 0x2000) return bytes32(i);\n        }\n        revert(\"no salt\");\n    }\n\n    function _advance(uint256 secs) internal {\n        vm.warp(vm.getBlockTimestamp() + secs);\n        arb.advance(secs * 4);\n    }\n\n    function test_lateBailOutByLivingSeatCancelsFundedRelease() public {\n        // Five entries, one signup, a committed and completed draw.\n        for (uint256 i; i < 5; ++i) {\n            vm.prank(players[i]);\n            game.enter{value: 0.001 ether}();\n        }\n        _advance(10 minutes);\n        game.draw(32);\n        _advance(2);\n        while (!game.drawComplete()) game.draw(32);\n        assertEq(game.impCount(), 5);\n        uint256 playStart = game.playStart();\n\n        // Carry available for the funded release at the end.\n        pad.fundCarry{value: 1 ether}();\n        assertEq(pad.carryPot(), 1 ether);\n\n        // Eight rounds of rolls, six minutes apart: every seat stays alive through the hard end.\n        for (uint256 r; r < 8; ++r) {\n            for (uint256 i; i < 5; ++i) {\n                vm.prank(players[i]);\n                game.roll{value: 0.002 ether}();\n            }\n            _advance(6 minutes);\n        }\n        // Now at playStart + 48 min: everyone is alive (last roll at +42), the game is not over.\n        assertEq(vm.getBlockTimestamp(), playStart + 48 minutes);\n        assertFalse(game.ended());\n        uint256 earned = game.rollPot();\n        assertGt(earned, 0);\n\n        // The release that five living seats earn: min(3 * rollPot, 15% of net curve ETH) > 0.\n        // One alive seat bails out four minutes before the hard end.\n        vm.prank(players[4]);\n        game.bailOut(0);\n        assertTrue(game.erased(players[4]));\n        assertFalse(game.ended(), \"bail must not end the game\");\n        uint256 cap = game.fundedReleaseCap();\n        assertGt(cap, 0, \"a positive funded allowance exists\");\n\n        // Hard end reached; resolve and finalize.\n        _advance(3 minutes);\n        game.poke();\n        assertTrue(game.finalized(), \"finalized\");\n\n        // Four non-erased seats were alive at the end; the bailed seat was alive when it bailed.\n        assertEq(game.livingAtEnd(), 4);\n        // Expected under the late-bail-out rule: the funded allowance was pulled from the carry pot.\n        // Actual on this code: nothing was pulled (carryPot only grew by rounding dust).\n        assertLt(pad.carryPot(), 1 ether - cap / 2, \"funded release was cancelled by the late bail-out\");\n    }\n}","reproduction":"Genesis game, 5 entrants seated, pad.fundCarry{value: 1 ether}(). Each seat rolls 8 times, 6 minutes apart (last roll at playStart+42 min), so all five are alive at the hard end (playStart+50 min). rollPot > 0 and fundedReleaseCap() ~ 0.0085 ETH. At playStart+48 min, player[4] (alive) calls bailOut(0): erased, game not ended. At playStart+51 min poke() finalizes: livingAtEnd == 4. Expected: takeCarry pulls ~0.0085 ETH (carryPot < 1 ether). Actual: carryPot == 1 ether + 1 wei dust, nothing was released. See test/scratch/LateBailCancelsFundedRelease.t.sol: FAIL 'funded release was cancelled by the late bail-out: 1000000000000000001 >= 995733515840195830'.","severity":"medium","snippet":"        if (living >= FUNDED_MIN_LIVING) {\n            uint256 available = _releaseCap(pot - fundedPot - bailPot);\n            if (available > fundedPot) IPvPPad(pad).takeCarry(launchId, available - fundedPot);\n        }","title":"A living seat that bails out just before the end cancels the funded release for everyone else"},{"citation":"resolved","description":"convertChunk never sells below `anchor() * 0.99` (sqrt), and `observeMarket()` (line 244) is public and only ever raises the anchor to the current IMD/ETH spot. Anyone can buy IMD on the venue (raising the spot), call observeMarket in the same transaction, and sell back: the anchor is now above the real market and decays only 0.5% sqrt per hour, so every chunk returns at line 286 with ConversionStalled while the venue sits below the band. Repeating the push each hour (0.5 ETH per hour on the 68 ETH-deep venue in the project's own test) holds the stall for the whole 24 h stall window. canGraduate (line 337) then opens the fallback: graduate() seeds a coin/ETH pool when no IMD was converted (line 361) or sends the unconverted ETH to the carry pot (line 371) when some was. The curve's ETH never becomes the coin/IMD liquidity the launch promises; the attacker's cost is the venue fee on its own position (about 1% of ~15 ETH of volume) plus temporary price exposure. A genuine market drop of more than roughly 2% plus 1% per hour has the same effect without any attacker. This is the reason launch 1832 was parked; the brief's CHANGE 1 removes conversion, the anchor, observeMarket and the fallbacks entirely, and this finding is the concrete failing state the adapter must delete rather than patch.","line":286,"path":"src/PadLiquidity.sol","reproduction":"State: PvP finalized with ethRaised > 0 (one roll suffices), IMD/ETH venue at spot S, anchor == S after the finalize upkeep. Attacker: V4Router.trade(imdEthKey, zeroForOne=true, 3 ether) pushes sqrt spot about 4% under S; liq.observeMarket() (or any pad touch) stamps nothing lower. Then pvp.prepareConversion(); liq.convertChunk(pvp) -> emits ConversionStalled, conversions[pvp].remainingEth unchanged, lastAttempt == 0. Every hour for 24 h: if spot >= anchor*0.99 trade 0.5 ether more, convertChunk again -> still stalled, imdReceived == 0. After 24 h canGraduate(pvp) == true; pvp.graduate() -> imdPool[pvpToken] == false, pool key currency0 == address(0) (coin/ETH pool), not coin/IMD. Expected: the game's ETH converts to IMD at the market price and seeds coin/IMD. Actual: the project's own test test/V4Edges.t.sol:618 (test_heldStallForTwentyFourHoursGraduatesNativeWhenNoIMDWasEverConverted) shows exactly this sequence succeeding for the pusher, and with a partial conversion the ETH remainder goes to pad.carryPot via line 371 instead of the pool.","severity":"medium","snippet":"        if (limit >= spot) {\n            emit ConversionStalled(game);\n            return;","title":"Public anchor lets anyone stall ETH-to-IMD conversion; after 24 h the game's ETH is diverted to carry or a coin/ETH pool instead of the coin/IMD pool"},{"citation":"resolved","description":"collectPool pushes the quote-side fees of an IMD pool to the payee with a plain transfer and reverts on false or revert. IMD is a bridged token with unverified source. If a transfer to the payee fails (payee refused by the token, token paused, or a transfer that returns false), _collect records a failure and, in strict mode (line 452), settleCrown reverts, so takeCrown reverts for every bidder until three non-strict distribute calls in distinct L2 blocks flag the pool as broken; a broken pool is then skipped forever unless retryPool succeeds, and its fees stay in the position. ETH fees on the native path already fall back to claimable (line 517-518); IMD fees do not. The brief requires that a payout which fails becomes claimable and never blocks a batch, so the adapter should apply the same claimable fallback to IMD (and coin) fees in kind.","line":512,"path":"src/PadLiquidity.sol","reproduction":"Deploy with a mock IMD whose transfer(to, amount) returns false when to == K (the king payee), graduate PvP into a coin/IMD pool, donate 1 IMD of fees to the pool, crown K via takeCrown, then a second bidder calls takeCrown{value: 0.011 ether} after 1 hour with 6M gas: liquidity.settleCrown -> _collect -> collectPool reverts PadIMDFees -> ok == false -> revert PadPoolCollectionFailed; the bid cannot be placed. Expected: the fee is parked as claimable for K and the bid proceeds. Actual: the crown is frozen until distribute(1) is called in three distinct L2 blocks to mark the pool broken.","severity":"low","snippet":"            if (q != 0) if (!(_transfer(imd, k, q))) revert PadErrors.PadIMDFees();","title":"IMD fee transfer that fails reverts the whole pool collection and, in settleCrown, the crown bid"},{"citation":"resolved","description":"As arrived, the contracts accept and hold ETH at: PadGame.enter/roll/fundPot/claim and PadGame._pay (push), PvPPad.fundCarry/fundGames/takeCarry, KingOfThePad.takeCrown/claim (MIN_BID 0.01 ether at KingOfThePad.sol:20), PadLiquidity.receive (line 183, PoolManager only), fundBurn, startConversion, graduate (payable), claim, and the ETH-denominated constants ROLL_PRICE/ENTRY_PRICE/VETH/FINALIZER_MAX (PadGame.sol:18-36) and BURN_MAX (PadLiquidity.sol:52). None of these implement the IMD design: there is no PvPPad.pull, no setUnit/unit, no IMD received-amount check, and the token's dust is credited from msg.value rather than from IMD actually received. launch.json is also the ETH version: PadLiquidity takes four constructor words including the IMD/ETH pool id (verified: keccak256(abi.encode(PoolKey(0, imd, 10000, 100, 0))) == 0xd2fc01ee...8f02), while the brief specifies PadLiquidity(poolManager, pad, imd). The manifest otherwise validates (3 keys, notes 3668 chars, 5 unique names, arguments in declaration order, owner and dev both $owner). Listed so the adapter's removal is complete; a leftover payable surface would fail the brief's 'sending ETH to any contract reverts' test.","line":166,"path":"src/PadGame.sol","reproduction":"vm.deal(p, 1 ether); vm.prank(p); game.enter{value: 0.001 ether}() succeeds and game.drawBounty() == 0.001 ether; vm.prank(p); game.roll{value: 0.002 ether}() succeeds. Expected in the IMD design: both revert (no payable function) and the same calls move IMD through PvPPad.pull(p, amount) from p's approval to the pad. Also KingOfThePad.takeCrown{value: 0.01 ether}() succeeds after PvP graduates where the brief wants a 4-unit IMD bid with no ETH.","severity":"low","snippet":"    function enter() external payable guard {\n        _requireOpen();\n        if (!(msg.value == ENTRY_PRICE)) revert PadErrors.PadEntryPrice();","title":"Every value path is native ETH and ETH-denominated constants; CHANGE 1 inventory for the adapter"},{"citation":"resolved","description":"The launch reference lists proxies, initializers and post-deployment configuration as items to flag. Here: every launch token and game is an EIP-1167 minimal proxy (the proxy runtime, not any application runtime, contains DELEGATECALL; the application runtimes carry the proxy bytes only as PUSH data and pass the protected opcode scan), PadToken.initialize (PadToken.sol:35) and PadGame.initialize (PadGame.sol:154) are one-shot initializers, the templates are sealed in their constructors, and PadHook is created by CREATE2 inside openPad (PvPPad.sol:114) after deployment rather than in the manifest. The brief explicitly keeps all of this (no token at deployment, pad creates every token later), the clones are created and initialized in the same _create call so no un-initialized clone is ever reachable, and openPad is owner-only for 30 days then permissionless with the hook address flag-checked. Not a defect against the agreed design; recorded so the adapter and the later panel see the trust assumptions: whoever calls openPad after 30 days chooses the salt (no economic parameter depends on it), and the owner is the genesis creator.","line":152,"path":"src/PvPPad.sol","reproduction":"PadToken(tokenTemplate).initialize('x','y',a,b) reverts PadInitialized; PadGame(gameTemplate).initialize(1,a,b,false) reverts PadInitialized; after openPad, PadToken(pad.tokenOf(1)).initialize(...) reverts PadInitialized. vm.warp(deployedAt + 30 days); vm.prank(anyone); pad.openPad(minedSalt) succeeds and creates genesis with creator == owner; a salt whose address lacks exactly bit 13 reverts PadHookFlags.","severity":"info","snippet":"        address token = PadLib.clone(tokenTemplate);\n        address game = PadLib.clone(gameTemplate);","title":"Launch-policy inventory: EIP-1167 clones with initializers and a hook deployed after launch by openPad (by design, guarded)"}],"hash":"8b3baac90e37beb9a8d82ef4b583286433c7b79354d6cdadb6d41cb58b48e8f3","nodeId":"1b90dc90-cf31-4814-825c-1fd44f507371","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json` with five substantiated entries, and the one proof test was run and fails on the current code for the stated reason.\n\n**What I read**\n- In full: all six application sources (PvPPad, PadGame, PadLiquidity, KingOfThePad, PadToken, PadHook), the interfaces and PadLib, launch.json, foundry.toml, docs/AUDIT.md item 13, the two protected tests, the test harness (Base, RealV4, Mocks) and the bail-out and anchor tests in V4Pad and V4Edges.\n- Not reached: the remaining test files beyond grep, and lib/v4-core, which is the pinned dependency.\n- Checks run: the project compiles, the repo manifest validator passes, and the IMD/ETH pool id in launch.json equals the keccak of the reconstructed key.\n\n**Findings, most severe first**\n- **Medium, with proof.** A living seat that bails out just before the end drops `living` below five in `_finalize`, so the carry release is never pulled and any king funding is clawed back to carry. The scratch test plays five seats to the hard end, bails one at minute 48, and shows the carry pot untouched. The existing test at V4Pad.t.sol:240 asserts this cancellation as intended, so the adapter must change it along with CHANGE 3.\n- **Medium.** Anyone can push the IMD/ETH spot and stamp the public anchor, stalling conversion for the whole 24 hour window. The game's ETH then seeds a coin/ETH pool or goes to carry instead of the coin/IMD pool. The project's own test at V4Edges.t.sol:618 demonstrates the attacker sequence. This is the parking reason; CHANGE 1 deletes the mechanism.\n- **Low.** An IMD fee transfer that fails reverts the whole pool collection, and under settleCrown reverts the crown bid until three failures flag the pool. ETH fees already fall back to claimable; IMD and coin fees do not.\n- **Low.** Inventory of every payable surface and ETH-denominated constant the IMD redesign must remove, including the four-argument PadLiquidity constructor in launch.json.\n- **Info.** Clones with one-shot initializers and the hook created by openPad after deployment, recorded as guarded design choices for the later panel.\n\n**Coverage limits**\nThe retained raffle, roll resolution, ranking sort, king refund chain, reign stamping, graduation liquidity math and burn netting were traced by reading and against the existing real-core tests, not re-proven with new tests. No further defect reproduced within the time budget. Nothing in the repository was modified; the findings file and the scratch test are both ignored by git.","treeHash":null,"usage":{"cachedInputTokens":1986907,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":51453,"runtime":"claude","turns":37,"wallClockMs":1143733}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c35be49d2f8f8def","findings":[{"citation":"resolved","description":"The brief's CHANGE 3 guarantee is that 'a low seat cannot cancel the funded release by bailing just before the end'. The implementation only counts a bail toward FUNDED_MIN_LIVING when the seat is alive at the moment of the bail (PadGame.sol:328). bailOut() itself is allowed for a dead seat (no roll for DEATH = 10 minutes) with exactly the same payout formula (cost + profit/2, or 90% of value), so a low-ranked seat that would not be paid anyway simply stops rolling, waits ten minutes, and then bails. It recovers the same IMD it would have recovered by bailing while alive, but bailedAliveCount stays 0, and _finalize (PadGame.sol:679 'if (living + bailedAliveCount < FUNDED_MIN_LIVING)') returns the whole funded amount to the carry instead of paying the release cap to the four honest survivors. The attacker needs the game to run on for ten minutes after its last roll, which is routine when other seats keep rolling toward hardEnd (50 minutes). The qualification count is therefore still controlled by the lowest seat, which is what CHANGE 3 was meant to remove. Impact: the funded release (min(3*rollPot, 15% of net curve IMD), e.g. 5.265 IMD in the proof with ~35 IMD raised, up to 240 IMD at sell-out with unit = 1 IMD) is withheld from the survivors and parked in the carry pot; no funds are stolen, so this is a broken guarantee / griefing rather than theft. The existing suite only asserts that a dead seat MAY bail (V4Pad.t.sol test_deadWalletMayBailWhileAnotherLives...) and never checks the release outcome of a dead bail; AUDIT.md #13 documents 'A dead-at-bail seat adds nothing to the qualification count' as if it were harmless. A minimal fix that keeps the agreed design: count any erased seat that was ever seated toward FUNDED_MIN_LIVING when it bails (bailOut is the only cancellation lever that returns money), or count a bail as qualifying when the seat was alive at any time during play (it always was, since every seat starts alive at playStart). Ranking, bell, payout and king eligibility must stay unchanged.","line":328,"path":"src/PadGame.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\";\n\n/// @dev Minimal standard ERC20 standing in for IMD (etched at the IMD address).\ncontract ScratchIMD {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 a) external {\n        balanceOf[to] += a;\n    }\n\n    function approve(address s, uint256 a) external returns (bool) {\n        allowance[msg.sender][s] = a;\n        return true;\n    }\n\n    function transfer(address to, uint256 a) external returns (bool) {\n        _move(msg.sender, to, a);\n        return true;\n    }\n\n    function transferFrom(address f, address t, uint256 a) external returns (bool) {\n        uint256 al = allowance[f][msg.sender];\n        require(al >= a, \"allowance\");\n        if (al != type(uint256).max) allowance[f][msg.sender] = al - a;\n        _move(f, t, a);\n        return true;\n    }\n\n    function _move(address f, address t, uint256 a) internal {\n        require(balanceOf[f] >= a, \"balance\");\n        balanceOf[f] -= a;\n        balanceOf[t] += a;\n    }\n}\n\n/// @dev ArbSys stand-in etched at 0x64.\ncontract ScratchArbSys {\n    uint256 public n;\n\n    function set(uint256 v) external {\n        n = v;\n    }\n\n    function advance(uint256 d) external {\n        n += d;\n    }\n\n    function arbBlockNumber() external view returns (uint256) {\n        return n;\n    }\n\n    function arbBlockHash(uint256 b) external view returns (bytes32) {\n        return keccak256(abi.encode(b));\n    }\n}\n\n/// @notice CHANGE 3 says a low seat must not be able to cancel the funded release by bailing out\n/// late. A seat that lets itself die (no roll for 10 minutes) and then bails gets the very same\n/// bail-out payout but is not counted in `bailedAliveCount`, so the fifth qualifying seat\n/// disappears and the whole funded carry is withheld from the four honest survivors.\ncontract DeadBailBypassTest is Test {\n    address constant IMD = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    address constant OWNER = 0x5b95A971B4583A5f011E9DA082acdD679b870D06;\n    address constant ARB_ADDR = address(0x64);\n\n    ScratchArbSys arb;\n    ScratchIMD imd;\n    PvPPad pad;\n    PadLiquidity liq;\n    KingOfThePad king;\n    PadGame pvp;\n    address[5] players;\n\n    function setUp() public {\n        vm.warp(1_800_000_000);\n        vm.etch(ARB_ADDR, address(new ScratchArbSys()).code);\n        arb = ScratchArbSys(ARB_ADDR);\n        arb.set(1000);\n        vm.etch(IMD, address(new ScratchIMD()).code);\n        imd = ScratchIMD(IMD);\n\n        PadToken tokenTemplate = new PadToken();\n        PadGame gameTemplate = new PadGame();\n        pad = new PvPPad(OWNER, address(tokenTemplate), address(gameTemplate));\n        // No pool is touched in this scenario; the manager address only has to be non-zero.\n        liq = new PadLiquidity(address(0xBEEF), address(pad), IMD);\n        king = new KingOfThePad(address(pad), address(liq), OWNER);\n\n        imd.mint(address(this), 10_000 ether);\n        imd.approve(address(pad), type(uint256).max);\n        for (uint256 i; i < 5; ++i) {\n            players[i] = address(uint160(0xA000 + i));\n            imd.mint(players[i], 1_000 ether);\n            vm.prank(players[i]);\n            imd.approve(address(pad), type(uint256).max);\n        }\n\n        bytes32 salt = _mineSalt();\n        vm.prank(OWNER);\n        pad.openPad(salt);\n        pvp = PadGame(pad.gameOf(1));\n    }\n\n    function _mineSalt() internal view returns (bytes32 salt) {\n        bytes32 h = liq.hookInitCodeHash();\n        bytes memory buf = abi.encodePacked(bytes1(0xff), address(liq), bytes32(0), h);\n        for (uint256 i; i < 200_000; ++i) {\n            uint256 a;\n            assembly (\"memory-safe\") {\n                mstore(add(buf, 53), i)\n                a := and(keccak256(add(buf, 32), 85), 0xffffffffffffffffffffffffffffffffffffffff)\n            }\n            if (a & 0x3FFF == 0x2000) return bytes32(i);\n        }\n        revert(\"no salt\");\n    }\n\n    function _rollAll(uint256 count) internal {\n        for (uint256 i; i < count; ++i) {\n            vm.prank(players[i]);\n            pvp.roll();\n        }\n        arb.advance(4);\n        pvp.resolvePending(16);\n    }\n\n    function test_deadSeatBailCancelsFundedReleaseDespiteChange3() public {\n        for (uint256 i; i < 5; ++i) {\n            vm.prank(players[i]);\n            pvp.enter();\n        }\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        uint256 start = pvp.playStart();\n\n        // Every seat rolls each six minutes up to minute 36; the fifth seat then stops rolling.\n        for (uint256 r; r <= 6; ++r) {\n            vm.warp(start + r * 6 minutes);\n            arb.advance(300);\n            _rollAll(5);\n        }\n        vm.warp(start + 42 minutes);\n        arb.advance(300);\n        _rollAll(4);\n\n        pad.fundCarry(400 ether);\n        uint256 carryBefore = pad.carryPot();\n        uint256 cap = pvp.fundedReleaseCap();\n        assertGt(cap, 0, \"funded release is affordable\");\n\n        // Minute 48: the fifth seat is dead (last roll at minute 36) but may still bail out, at the\n        // same payout an alive bail would get. It is not counted as a qualifying seat.\n        vm.warp(start + 48 minutes);\n        address lowSeat = players[4];\n        assertFalse(pvp.isAlive(pvp.impOf(lowSeat) - 1), \"seat is dead at bail time\");\n        uint256 coins = PadToken(pad.tokenOf(1)).balanceOf(lowSeat);\n        uint256 value = pvp.quoteSell(coins);\n        uint256 cost = pvp.curveSpent(lowSeat);\n        uint256 expectedPayout = value >= cost ? cost + (value - cost) / 2 : value * 90 / 100;\n        uint256 balBefore = imd.balanceOf(lowSeat);\n        vm.prank(lowSeat);\n        pvp.bailOut(0);\n        assertEq(imd.balanceOf(lowSeat) - balBefore, expectedPayout, \"dead bail pays exactly like an alive bail\");\n\n        vm.warp(pvp.hardEnd() + 1);\n        arb.advance(300);\n        pvp.finalize();\n        assertEq(pvp.livingAtEnd(), 4, \"four honest survivors\");\n\n        // Expected under CHANGE 3's guarantee: a seat that bails late cannot cancel the funded\n        // release, so the carry pot is drawn down by the release cap. Actual: nothing is released.\n        // (the pad's carry only ever grows here, by rounding dust, so the comparison is done on sums)\n        assertApproxEqAbs(pad.carryPot() + cap, carryBefore, 2, \"funded release must survive a late bail-out\");\n    }\n}","reproduction":"Five wallets enter the genesis game; draw completes at playStart. Rounds at minutes 0,6,...,36: all five roll and resolve. Minute 42: only seats 0-3 roll. Minute 48: seat 4 (last roll at 36, so dead since 46) calls bailOut(0): it receives cost + (value - cost)/2 IMD (identical to an alive bail) and bailedAliveCount stays 0. Anyone funds carry with 400 IMD; fundedReleaseCap() is 5.265 IMD. At hardEnd + 1 finalize(): livingAtEnd = 4, living + bailedAliveCount = 4 < 5, so no takeCarry and carryPot stays 400 IMD (+1 wei dust). Expected under the brief: the late bail cannot cancel the release, so carryPot drops by ~5.265 IMD and the four survivors share it. Had the same seat bailed at minute 42 while alive, bailedAliveCount would be 1 and the release would be paid; the two paths cost the attacker the same. Proof: forge test --match-path test/scratch/DeadBailBypass.t.sol fails with 'funded release must survive a late bail-out: 405265000000000000001 !~= 400000000000000000000'.","severity":"medium","snippet":"        if (_lastActivity(imps[impOf[msg.sender] - 1]) + DEATH > block.timestamp) ++bailedAliveCount;","title":"CHANGE 3 late bail-out rule is bypassed by bailing after death: a low seat still cancels the funded release at no extra cost"},{"citation":"resolved","description":"Every payout (rank prizes, bell share, finalizer fee, draw bounty, bail-out payout, king refund, dev share, pool fees) goes through PadLib.push with a hard 40,000 gas stipend; a failed push becomes a claim. IMD is a bridged token with unverified source. If it is the usual Arbitrum-stack gateway token (StandardArbERC20 behind a ClonableBeaconProxy), a transfer costs roughly: beacon SLOAD 2,100 + STATICCALL to the beacon 2,600 + beacon implementation SLOAD 2,100 + DELEGATECALL 2,600 + sender balance SLOAD/SSTORE 2,100+2,900 + recipient balance SLOAD/SSTORE 2,100+20,000 (zero balance) + Transfer log ~1,900 + ABI/memory overhead ~1,500, about 40k, and any extra check (pause flag, hook) pushes it over. A recipient with a zero IMD balance (the common case for a first-time winner) would then always fall to the claim path, i.e. 'plain transfers' would never land and every winner would need a second claim() transaction. Funds are never lost: claim() uses full gas. This is reported as information because the live token's bytecode could not be read (no RPC allowed) and the mock IMD in the suite is a plain contract that fits easily; the author should measure one IMD transfer to a zero-balance recipient on robin.etherscan.io and raise PUSH_GAS (e.g. to 60k-100k; the stipend only bounds a malicious recipient's work, it does not need to be tight) if it is near or above 40k.","line":10,"path":"src/libs/PadLib.sol","reproduction":"Not reproducible against the tree with the supplied mock: TestIMD.transfer fits in ~30k gas so pushes succeed. The failing state is the live IMD at 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127 costing more than 40,000 gas for transfer(to, amount) when balanceOf(to) == 0; then _pay (PadGame.sol:786 'bool ok = PadLib.push(imd, to, amount);') returns ok == false for every such recipient and credits claimable instead. Verify by measuring eth_estimateGas of an IMD transfer to a fresh address on the explorer; if the inner call exceeds 40k, every first-time payout parks.","severity":"info","snippet":"    uint256 internal constant PUSH_GAS = 40_000;","title":"40k-gas push may be below a beacon-proxied bridged ERC20 transfer to a fresh recipient, parking every payout as a claim"}],"hash":"8ed991613864927d7cd576cffac0aef67d26ea08b03b227beb4cb4d5fd6892fb","nodeId":"10ba82db-31a9-48d1-b9c3-ba41e35864ec","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. No source files were changed; only the findings file and the scratch proof test exist outside the tree.\n\n**Outcome**\n\n- **One medium finding, with a failing proof test.** The CHANGE 3 rule (\"a seat that bails while alive still counts toward FUNDED_MIN_LIVING\") only counts a bail when the seat is alive at that instant (`src/PadGame.sol:328`). A dead seat may still bail with the identical payout, so a low seat stops rolling, waits ten minutes, bails, and the four honest survivors lose the funded release. The proof at `test/scratch/DeadBailBypass.t.sol` fails on this tree with the carry pot untouched instead of drawn down by the 5.265 IMD cap. No funds are stolen, so it is a broken guarantee rather than theft.\n- **One informational note.** The 40k gas push stipend may be below a beacon-proxied bridged ERC20 transfer to a zero-balance recipient, which would park every first-time payout as a claim. Funds stay claimable, and the live token could not be measured without an RPC call, so it is marked info and unverified.\n\n**What held under the Economic Security, Invariant and Flow Gap guides**\n\n- The sole-buyer sybil bound in AUDIT.md #13 re-derives correctly for any net reserve after bail-outs: retained LP is at least one sixth of the net curve IMD while the funded release is at most 15% of it, and bail taxes are excluded from roll income and king weights.\n- IMD conservation holds per game through enter, roll, bail-out, finalize and graduation, with unsolicited transfers ignored. The king contract holds nothing but parked claims after each bid.\n- Graduation prices both currency orders at the final curve price, the one-hop burn's 1% price limit plus the pool's 1% fee makes sandwiching an 8-unit chunk unprofitable, and the funds guards never nest on any reachable path.\n- The existing suite passes in full (225 tests). Its gap is that it only asserts a dead seat may bail and never checks the funded-release outcome of that bail.\n\n**Coverage**: all 46 listed entry points have a row, 44 holds and 2 pointing at the finding, plus three invariant rows.","treeHash":null,"usage":{"cachedInputTokens":2476556,"inputTokens":452,"model":"claude-fable-5-1","outputTokens":54735,"runtime":"claude","turns":32,"wallClockMs":1225979}},{"artifacts":[],"attempt":1,"bundleHash":"6c48c3f735fe90c42501761872fb87a37b8a4c9342b54b932ea28ab91a978d0c","device":"644eb561f6d70a85","findings":[],"hash":"907e74a398e8d22f248b7b3585ac34a3663865ee28c0edc9a846ad4d8f5ab516","nodeId":"c8090e6c-6ede-4ae0-aea8-276cb644b5a9","outcome":"completed","summary":"The manifest is verified and needs no change this round. The working tree is clean.\n\n**Outcome.** The accepted launch.json already matches the accepted implementation and the brief. No findings were attached to this revision, and my checks surfaced nothing to fix, so I left the file as it was.\n\n**What I verified**\n- Constructors in source match the manifest exactly: PadToken and PadGame take no arguments, PvPPad takes owner, token template and game template, PadLiquidity takes poolManager, pad and IMD with no pool-id, and KingOfThePad takes pad, liquidity and dev.\n- Owner and dev both resolve to $owner. Addresses are lowercase strings. Contracts are listed in constructor dependency order, with only backward references.\n- The file has exactly kind, contracts and notes, and the notes are under the 4,000 character limit.\n- The repository's own validator passes against fresh build artifacts. All five runtimes sit under the 24,576 byte limit, and foundry.toml still has bytecode_hash none and cbor_metadata false.\n- The full Foundry suite passes with the verifier's fuzz seed.\n\n| Check | Result |\n|---|---|\n| forge build | ok |\n| tools/validate_manifest.py launch.json | valid, 53,532 bytes runtime total |\n| forge test (229 tests, 25 suites) | 229 passed, 0 failed |\n\n**Caveat.** The PoolManager address in the manifest is the one inherited from the base repository's README. It cannot be confirmed against the chain here, since this job makes no RPC calls. docs/AUDIT.md already records that as a deployment-time check.","treeHash":"b9dc6311e51e51eb75652fcf9033abeac7fd2eca","usage":{"cachedInputTokens":261918,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":3259,"runtime":"claude","turns":7,"wallClockMs":240195}},{"artifacts":[],"attempt":1,"bundleHash":"ab065eaf53e66e049988fff000672d28d5ebb05f55c9d37e78798d9d3721a9b9","device":"c1fc321231608a52","findings":[],"hash":"f1734b88b36e813eae6bd665981a8f371623d5be7cb7ece53bdf543a7e68d0fa","nodeId":"c8090e6c-6ede-4ae0-aea8-276cb644b5a9","outcome":"completed","summary":"Updated only [launch.json](/home/seat/.identitymd/work/bf3fe37c-172e-4c22-aef8-885d9e39a1eb/c8090e6c-6ede-4ae0-aea8-276cb644b5a9/launch.json), clarifying deployment notes while preserving the correct constructors and dependencies.\n\n- Schema and compiled ABI validation passed.\n- `forge build` passed with existing warnings.\n- All 225 tests passed with both seeds.\n- Deployment rehearsal: 12,016,891 gas; including later opening: 12,917,377.\n\nNo deployment, broadcast, or RPC calls performed.","treeHash":"104ef3fcfebe87ca21f8836e7687a1929f873226","usage":{"cachedInputTokens":1039360,"inputTokens":60723,"model":"gpt-6-astra","outputTokens":6731,"runtime":"codex","turns":6,"wallClockMs":409054}}],"verification":[{"checks":[{"durationMs":154992,"exitCode":0,"name":"build","output":"Compiling 100 files with Solc 0.8.26\nSolc 0.8.26 finished in 154.87s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Adversarial.t.sol:28:28:\n   |\n28 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/AuditV3.t.sol:49:28:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/AuditV3CarryUpkeep.t.sol:137:9:\n    |\n137 |         uint256 value = entry ? 0.5 ether : 1 ether;\n    |         ^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Revision.t.sol:41:28:\n   |\n41 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/AuditV3.t.sol:49:5:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":7371,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 44828779)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12016891\n  Later openPad including hook and genesis gas: 900486\n  Combined manifest and later opening gas: 12917377\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 41.95ms (41.71ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1342703)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 393876)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 9666347)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1339668)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 1153081)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 1071330)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 10854492)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 723699)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 10447550)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1392177)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1270347)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 4504307)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35045)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168248)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 54.65ms (17.76ms CPU time)\n\nRan 4 tests for test/V3FailureEdges.t.sol:V3PoolFailureEdgesTest\n[PASS] test_onlyCrownMayRequestStrictSettlementAndIndexErrorsDoNotChangeHealth() (gas: 171273)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 878449)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3205352)\n[PASS] test_tokenTransferFailureBecomesClaimableWithoutBlockingCollection() (gas: 1264954)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 60.90ms (4.29ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3345795)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 11681268)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 27171590)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 7001986)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 2253736)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 72.06ms (26.76ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 3025284)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7420334)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 548269)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1414570)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2835745)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 11214900)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4907515\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 2424129)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 221.96ms (161.66ms CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 7311785)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2949438)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 22362684)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7572195\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 919915)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 594283)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 26398958)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 41\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6943528)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.31s (2.62s CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 126913586, ~: 120686550)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 3030298)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 13795077)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 117124311)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 5614896)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 84129703)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.01s (2.11s 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: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 0\n  Bound result 1198000000000002097153\n  Bound result 0\n  Bound result 59\n  Bound result 14\n  Bound result 0\n  Bound result 160\n  Bound result 204\n  Bound result 0\n  Bound result 2\n  Bound result 39999999999999999998\n  Bound result 7\n  Bound result 453\n  Bound result 272\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 240\n  Bound result 248\n  Bound result 301\n  Bound result 40\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.25s (3.22s CPU time)\n\nRan 8 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 11903996, ~: 10729805)\nLogs:\n  Bound result 3\n\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5570999)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3292618)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3631050)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3550412)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 5649207)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6831)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 2221956)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 3.47s (1.35s CPU time)\n\nRan 15 tests for test/IMDPad.t.sol:IMDPadTest\n[PASS] testFuzz_unitPricesAndRoundingConserveIMD(uint256) (runs: 64, μ: 10180430, ~: 10180435)\nLogs:\n  Bound result 9900000000000000177\n\n[PASS] test_bothCurrencyOrdersPriceEquivalenceAndPartialFillBurn() (gas: 26573453)\n[PASS] test_currentUnitCapsAFullFillBurn() (gas: 17275351)\n[PASS] test_everyApplicationTemplateCloneAndHookRejectsETH() (gas: 8317214)\n[PASS] test_failedIMDAndCoinPayoutsCannotBlockCrownOrBatch() (gas: 18623404)\n[PASS] test_lateAliveBailKeepsCarryReleaseWithFourRankableSeats() (gas: 25527098)\n[PASS] test_lateAliveBailWithFiveOtherSurvivors() (gas: 28494150)\n[PASS] test_lateBailCannotClawBackExistingKingFunding() (gas: 25494137)\n[PASS] test_noReturnIMDFullGameGraduationBurnKingAndClaims() (gas: 18742659)\n[PASS] test_pullOnlyTrustedCallersAndEndpointsAlwaysChargeTheirCaller() (gas: 8677682)\n[PASS] test_shortPoolReceiptDoesNotCreateFeeCredits() (gas: 17804855)\n[PASS] test_shortPullsRevertAtomicallyAndDonationsDoNotCreateCredits() (gas: 8989625)\n[PASS] test_soleBuyerSybilWithAliveBailAndFourSurvivorsStillLoses() (gas: 27194382)\nLogs:\n  Sybil loss in IMD wei: 12160243613483469790\n\n[PASS] test_unitBoundsOwnerEventAndSnapshot() (gas: 14402188)\n[PASS] test_unsolicitedIMDDoesNotAlterGraduationPriceOrCredit() (gas: 11771937)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 3.68s (1.97s CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 12364000, ~: 11112531)\nLogs:\n  Bound result 2\n  Bound result 205\n  Bound result 396000000000416015835\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.00s (3.95s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10679178)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11665018)\n[PASS] test_claimNothingReverts() (gas: 8144324)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 17755850)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 21987305)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 28601567)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9766218)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10832348)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 12662800)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 176168064)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4394041\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 41872550)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 25374260)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 21931014)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9687188)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10626580)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 8050665)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9670851)\n[PASS] test_launchViewsRejectIdZero() (gas: 33276)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9879940)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 18076339)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 17516004)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 16989924)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78166)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7962107)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 8003968)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396016)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 18161673)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 18509553)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 11399595)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9951481)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 16774801)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12771940)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9605503)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 16824764)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 4.00s (1.20s CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 22333459)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 29544471)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16802)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 18078435)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 19213763)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8738142)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 19367113)\nLogs:\n  curve ETH raised: 220500000000000000000\n  sybil net outlay before the dump: 199225000000000000001\n  dump proceeds: 133542968727184882968\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 17507213)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 17398725)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.11s (422.53ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2300263)\n[PASS] test_claimableWinner() (gas: 3309803)\n[PASS] test_conservationOfEth() (gas: 6924552)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 59327)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2695222)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2871215)\n[PASS] test_deathAndAllDeadEnd() (gas: 2226004)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1876939)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2826620)\n[PASS] test_failedPushBecomesClaimable() (gas: 2005991)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 6232160)\n[PASS] test_finalizeRanksAndPays() (gas: 5478374)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 2030055)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 163416219)\n[PASS] test_finalizerFeeCapped() (gas: 15337393)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 2204262)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 425742)\n[PASS] test_fundPotOnlyPad() (gas: 104086)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 25079091)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 4293835)\n[PASS] test_graduateOnlyFromGame() (gas: 132984)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 9125070)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1607320)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4864659)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 10832860)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 8615953)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2680143)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 2482484)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 2079431)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 2041855)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1664198)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1596836)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3556029)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1750024)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3086479)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 4.11s (193.70ms CPU time)\n\nRan 1 test for test/V4BailIMDInvariant.t.sol:V4BailIMDInvariantTest\n[PASS]\nV4BailIMDInvariantTest 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 V4BailIMDInvariantTest invariants (runs: 40, calls: 2400, reverts: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 16\n  Bound result 16\n  Bound result 16\n  Bound result 100000000000000000000\n  Bound result 2\n  Bound result 0\n  Bound result 1198000000000002097153\n  Bound result 50500000000000000000\n  Bound result 59\n  Bound result 14\n  Bound result 9814\n  Bound result 160\n  Bound result 204\n  Bound result 0\n  Bound result 2\n  Bound result 39999999999999999998\n  Bound result 4\n  Bound result 430\n  Bound result 272\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 240\n  Bound result 62\n  Bound result 467\n  Bound result 40\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.12s (4.05s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35216)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 20479007)\nLogs:\n  takeCrown gas, eighteen real pools: 2828401\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 17294506)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 23988494)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 18167302)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 16864597)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8886614)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10915685)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 17728318)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.15s (1.87s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107427)\n[PASS] test_bindingsAreOneShot() (gas: 87718)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 19716214)\n[PASS] test_closedPadRevertsEverything() (gas: 97341)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 689643)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33037)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 20930365)\n[PASS] test_fundGamesOnlyKing() (gas: 121439)\n[PASS] test_hookRejectsForeignInitialize() (gas: 8091115)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 17578703)\n[PASS] test_launchValidatesStrings() (gas: 16759202)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7961415)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7994869)\n[PASS] test_openPadOnlyOnce() (gas: 8033632)\n[PASS] test_openPadRejectsBadSalt() (gas: 203270)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135025)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8439657)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37365487)\n[PASS] test_templatesCannotBeInitialized() (gas: 8132248)\n[PASS] test_upkeepForOnlyGames() (gas: 8182632)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 4.53s (512.62ms 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 500000000000000000\n  Bound result 40000000000000000000000\n  Bound result 16\n  Bound result 0\n  Bound result 500000\n  Bound result 3618791\n  Bound result 5275559\n  Bound result 4854\n  Bound result 5400201\n  Bound result 6080\n  Bound result 1048576\n  Bound result 4733\n  Bound result 24\n  Bound result 600000\n  Bound result 40640000000000000000\n  Bound result 5465536\n  Bound result 1058760442193818\n  Bound result 5410467\n  Bound result 1966500\n  Bound result 5411742\n  Bound result 11802\n  Bound result 12525\n  Bound result 5412299\n  Bound result 2197979\n  Bound result 5\n  Bound result 10133\n  Bound result 716782\n  Bound result 4424555\n  Bound result 5401904\n  Bound result 3197263883\n  Bound result 7\n  Bound result 7477639625207\n  Bound result 60289588469921344040983\n  Bound result 15807\n  Bound result 6782\n  Bound result 9177\n  Bound result 4948492\n  Bound result 638212886\n  Bound result 33\n  Bound result 415154087980144090\n  Bound result 80229752778653436787973\n  Bound result 27\n  Bound result 39999999999995001\n  Bound result 11475\n  Bound result 1507695\n  Bound result 5000000\n  Bound result 1414\n  Bound result 5400025\n  Bound result 29999999999999999\n  Bound result 18355023563429206\n  Bound result 5400201\n  Bound result 31\n  Bound result 39998999999997891\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.61s (4.56s CPU time)\n\nRan 8 tests for test/V4Edges.t.sol:V4EdgesTest\n[PASS] testFuzz_bailPayoutFormulaAndCurveLedger(uint8,uint8,uint96) (runs: 256, μ: 5767790, ~: 5252383)\nLogs:\n  Bound result 4\n  Bound result 683893554526737891\n\n[PASS] test_bailOutRefusedAfterBellAndAfterHardEnd() (gas: 2638387)\n[PASS] test_bailOutRefusedAtHardEndEvenWithLiveActivity() (gas: 6115406)\n[PASS] test_erasedSeatOneBelowCapNeverRingsTheBell() (gas: 2739935)\n[PASS] test_everySeatBailingOutEndsTheGameAtOnceAndFailsGraduation() (gas: 4391860)\n[PASS] test_expiredPendingRollOfErasedSeatPaysTipToPotWithNoEffect() (gas: 2983587)\n[PASS] test_kingSplitIgnoresGameWithErasedSeatBelowFive() (gas: 5919917)\n[PASS] test_seatedWalletWithoutCoinsBailsForZeroAndMinOutOneReverts() (gas: 3016130)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 4.64s (4.60s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1922815, ~: 1931828)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2501825)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 54734246)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3888100)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1419318\n  roll with both liquidity upkeep stipends exhausted: 1552826\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3279258)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 4.64s (2.51s CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 17528799, ~: 17528719)\nLogs:\n  Bound result 7996000000000000011414\n  Bound result 4710798004168108077668\n  Bound result 1361\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 17963187, ~: 17963264)\nLogs:\n  Bound result 6272996531674916266090\n  Bound result 17109503815157592107302\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 20725526, ~: 19700240)\nLogs:\n  Bound result 3\n  Bound result 1164685330982380889835\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 17345834, ~: 17345875)\nLogs:\n  Bound result 4000000000000000001\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 13725157, ~: 12748194)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 1123454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 8048053, ~: 8048287)\nLogs:\n  Bound result 348370641196807289561085429\n  Bound result 1215007428778038311813\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 8027188, ~: 8026699)\nLogs:\n  Bound result 52636146301966783620\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 8049002, ~: 8049101)\nLogs:\n  Bound result 11530322463945308858\n  Bound result 762546\n  Bound result 932449631543341630043\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 16282797, ~: 14671085)\nLogs:\n  Bound result 11\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.64s (30.52s CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 58790917)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 6259637)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 102348)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 266738\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 103864)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 104193)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 77565819)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 4.64s (652.67ms 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 30\n  Bound result 80\n  Bound result 12\n  Bound result 82\n  Bound result 16\n  Bound result 74\n  Bound result 21\n  Bound result 10\n  Bound result 22\n  Bound result 30\n  Bound result 89\n  Bound result 14\n  Bound result 21\n  Bound result 74\n  Bound result 1\n  Bound result 37\n  Bound result 28\n  Bound result 24\n  Bound result 79\n  Bound result 41\n  Bound result 89\n  Bound result 8\n  Bound result 18\n  Bound result 15\n  Bound result 50\n  Bound result 82\n  Bound result 17\n  Bound result 12\n  Bound result 5\n  Bound result 60\n  Bound result 10\n  Bound result 4\n  Bound result 51\n  Bound result 14\n  Bound result 17\n  Bound result 49\n  Bound result 51\n  Bound result 18\n  Bound result 58\n  Bound result 11\n  Bound result 1\n  Bound result 76\n  Bound result 5\n  Bound result 15\n  Bound result 16\n  Bound result 69\n  Bound result 43\n  Bound result 35\n  Bound result 30\n  Bound result 5\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.06s (6.01s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 34494681, ~: 27850051)\nLogs:\n  Bound result 193\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 117419314)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2688595\n  5000-entry draw total gas: 16272475\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 86617813)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 578198)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 791204)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 9787606)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1693003)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5732752)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 941892)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 876998)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 82455613)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526729)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 83272421)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 135380744)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 2624002)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 7.22s (12.08s CPU time)\n\nRan 24 test suites in 7.22s (79.61s CPU time): 225 tests passed, 0 failed, 0 skipped (225 total tests)\n","passed":true},{"durationMs":77,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown(uint256)\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot(uint256)\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim(address)\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.creditBurn(address,uint256)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn(uint256)\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256)\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"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.burn(uint256)\",\"PvPPad.fundCarry(uint256)\",\"PvPPad.fundGames(uint256)\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.pull(address,uint256)\",\"PvPPad.restartGenesis()\",\"PvPPad.setUnit(uint256)\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":47,\"README.md\":166,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT-V4-ETH-HISTORY.md\":476,\"docs/AUDIT.md\":197,\"docs/TEST-REPORT.md\":135,\"docs/VERIFY.md\":52,\"foundry.toml\":22,\"launch.json\":38,\"remappings.txt\":2,\"src/KingOfThePad.sol\":139,\"src/PadGame.sol\":806,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":507,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":353,\"src/interfaces/Interfaces.sol\":128,\"src/interfaces/PadErrors.sol\":79,\"src/libs/PadLib.sol\":149,\"test/Adversarial.t.sol\":802,\"test/AtomicDeployment.t.sol\":124,\"test/AuditV3.t.sol\":406,\"test/AuditV3CarryUpkeep.t.sol\":192,\"test/Base.t.sol\":224,\"test/CrownSettlement.t.sol\":253,\"test/Fuzz.t.sol\":290,\"test/Game.t.sol\":762,\"test/IMDPad.t.sol\":401,\"test/Invariants.t.sol\":608,\"test/King.t.sol\":316,\"test/LiquidityV4.t.sol\":252,\"test/Pad.t.sol\":300,\"test/Raffle.t.sol\":425,\"test/RaffleEdges.t.sol\":274,\"test/RealV4.sol\":95,\"test/Revision.t.sol\":265,\"test/V3-CONTRIBUTOR-REPORT.md\":129,\"test/V3AccountingActors.sol\":22,\"test/V3CarryProperties.t.sol\":131,\"test/V3FailureEdges.t.sol\":356,\"test/V3KingFeesInvariant.t.sol\":254,\"test/V3ResolverInvariant.t.sol\":216,\"test/V4-CONTRIBUTOR-REPORT.md\":43,\"test/V4BailIMDInvariant.t.sol\":36,\"test/V4Edges.t.sol\":271,\"test/V4Pad.t.sol\":298,\"test/mocks/IMD.sol\":113,\"test/mocks/Mocks.sol\":37,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":6488,"exitCode":0,"name":"slither","output":"[high/medium] incorrect-exp at src/libs/PadLib.sol:58: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#58-91) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[high/medium] reentrancy-balance at src/PadLiquidity.sol:473: Reentrancy in PadLiquidity._takeFees(address,uint256) (src/PadLiquidity.sol#473-479):\n[medium/medium] divide-before-multiply at src/PadGame.sol:644: PadGame._finalize(address) (src/PadGame.sol#644-713) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:58: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#58-91) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:58: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#58-91) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:58: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#58-91) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:58: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#58-91) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:58: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#58-91) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:58: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#58-91) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:58: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#58-91) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:58: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#58-91) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/PadGame.sol:644: PadGame._finalize(address) (src/PadGame.sol#644-713) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:539: PadGame.quote(uint256) (src/PadGame.sol#539-552) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:555: PadGame.quoteSell(uint256) (src/PadGame.sol#555-563) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:316: PvPPad.genesisFailed() (src/PvPPad.sol#316-319) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:436: PadGame.bellRang() (src/PadGame.sol#436-438) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:310: PvPPad.genesisGraduated() (src/PvPPad.sol#310-314) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:784: PadGame._pay(address,uint256) (src/PadGame.sol#784-789) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:376: Reentrancy in PadGame.upkeepStep(address) (src/PadGame.sol#376-388):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:134: Reentrancy in PvPPad.restartGenesis() (src/PvPPad.sol#134-141):\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:277: Reentrancy in PadGame.roll() (src/PadGame.sol#277-313):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:286: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:245: Reentrancy in PadLiquidity._distribute(uint256,bool) (src/PadLiquidity.sol#245-273):\n[medium/medium] reentrancy-no-eth at src/KingOfThePad.sol:61: Reentrancy in KingOfThePad.takeCrown(uint256) (src/KingOfThePad.sol#61-112):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:276: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#276-297):\n[medium/medium] reentrancy-no-eth at src/KingOfThePad.sol:61: Reentrancy in KingOfThePad.takeCrown(uint256) (src/KingOfThePad.sol#61-112):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:356: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#356-370):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:316: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#316-330):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:179: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256) (src/PadLiquidity.sol#179-216):\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:644: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#644-713):\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:250: PadLiquidity._distribute(uint256,bool).floor (src/PadLiquidity.sol#250) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:235: PvPPad.fundGames(uint256).count (src/PvPPad.sol#235) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:688: PadGame._finalize(address).paid (src/PadGame.sol#688) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:336: PadGame.bailOut(uint256).latest (src/PadGame.sol#336) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:251: PvPPad.fundGames(uint256).sent (src/PvPPad.sol#251) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:697: PadGame._finalize(address).sent (src/PadGame.sol#697) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:678: PadGame._finalize(address).returned (src/PadGame.sol#678) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:601: PadGame._resolveRoll(uint256,address).d (src/PadGame.sol#601) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:650: PadGame._finalize(address).living (src/PadGame.sol#650) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:602: PadGame._resolveRoll(uint256,address).expired (src/PadGame.sol#602) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:236: PvPPad.fundGames(uint256).total (src/PvPPad.sol#236) is a local variable never initialized\n[medium/medium] unused-return at src/PadLiquidity.sol:408: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#408-455) ignores return value by poolManager.donate(key,max0 - owe0,0,) (src/PadLiquidity.sol#425)\n[medium/medium] unused-return at src/PadLiquidity.sol:408: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#408-455) ignores return value by poolManager.donate(key,0,max1 - owe1,) (src/PadLiquidity.sol#428)\n[medium/medium] unused-return at src/PadLiquidity.sol:408: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#408-455) ignores return value by (None,fees) = poolManager.modifyLiquidity(key_scope_0,ModifyLiquidityParams(MIN_TICK,MAX_TICK,0,0),) (src/PadLiquidity.sol#437)\n[medium/medium] unused-return at src/PadLiquidity.sol:408: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#408-455) ignores return value by (delta,None) = poolManager.modifyLiquidity(key,ModifyLiquidityParams(MIN_TICK,MAX_TICK,int256(l),0),) (src/PadLiquidity.sol#414-415)\n[medium/medium] unused-return at src/PadLiquidity.sol:179: PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256) (src/PadLiquidity.sol#179-216) ignores return value by poolManager.initialize(key,sqrtP) (src/PadLiquidity.sol#205)\n[low/medium] missing-zero-check at src/PadGame.sol:174: PadGame.initialize(uint256,address,address,bool).liquidity_ (src/PadGame.sol#174) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadLiquidity.sol:137: PadLiquidity.deployHook(bytes32).h (src/PadLiquidity.sol#137) lacks a zero-check on :\n[low/medium] missing-zero-check at src/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/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] missing-zero-check at src/PadGame.sol:174: PadGame.initialize(uint256,address,address,bool).token_ (src/PadGame.sol#174) lacks a zero-check on :\n[low/medium] calls-loop at src/PvPPad.sol:228: PvPPad.fundGames(uint256) (src/PvPPad.sol#228-259) has external calls inside a loop: (live,p) = IPadGame(game).isLiveForKing() (src/PvPPad.sol#239)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#609)\n[low/medium] calls-loop at src/PadLiquidity.sol:286: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#299)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#610)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#608)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#609)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#608)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#608)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#597)\n[low/medium] calls-loop at src/PvPPad.sol:228: PvPPad.fundGames(uint256) (src/PvPPad.sol#228-259) has external calls inside a loop: IPadGame(games[i_scope_0]).fundPot(share) (src/PvPPad.sol#256)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#597)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#609)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#597)\n[low/medium] calls-loop at src/PadLiquidity.sol:286: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#299)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#609)\n[low/medium] calls-loop at src/PadLiquidity.sol:286: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,payee) (src/PadLiquidity.sol#290-307)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#610)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#597)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#610)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#610)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#608)\n[low/medium] calls-loop at src/PadLiquidity.sol:286: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,payee) (src/PadLiquidity.sol#290-307)\n[low/medium] reentrancy-benign at src/PadGame.sol:190: Reentrancy in PadGame.enter() (src/PadGame.sol#190-204):\n[low/medium] reentrancy-benign at src/PadGame.sol:644: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#644-713):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:316: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#316-330):\n[low/medium] reentrancy-benign at src/PadGame.sol:277: Reentrancy in PadGame.roll() (src/PadGame.sol#277-313):\n[low/medium] reentrancy-benign at src/PadGame.sol:317: Reentrancy in PadGame.bailOut(uint256) (src/PadGame.sol#317-349):\n[low/medium] reentrancy-benign at src/KingOfThePad.sol:61: Reentrancy in KingOfThePad.takeCrown(uint256) (src/KingOfThePad.sol#61-112):\n[low/medium] reentrancy-benign at src/PvPPad.sol:147: Reentrancy in PvPPad.openPad(bytes32) (src/PvPPad.sol#147-158):\n[low/medium] reentrancy-benign at src/PvPPad.sol:276: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#276-297):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:179: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256) (src/PadLiquidity.sol#179-216):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:356: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#356-370):\n[low/medium] reentrancy-benign at src/PadGame.sol:277: Reentrancy in PadGame.roll() (src/PadGame.sol#277-313):\n[low/medium] reentrancy-benign at src/PvPPad.sol:147: Reentrancy in PvPPad.openPad(bytes32) (src/PvPPad.sol#147-158):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:356: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#356-370):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:286: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308):\n[low/medium] reentrancy-events at src/PadGame.sol:644: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#644-713):\n[low/medium] reentrancy-events at src/PvPPad.sol:214: Reentrancy in PvPPad.takeCarry(uint256,uint256) (src/PvPPad.sol#214-221):\n[low/medium] reentrancy-events at src/PadGame.sol:277: Reentrancy in PadGame.roll() (src/PadGame.sol#277-313):\n[low/medium] reentrancy-events at src/PadGame.sol:190: Reentrancy in PadGame.enter() (src/PadGame.sol#190-204):\n[low/medium] reentrancy-events at src/PadGame.sol:644: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#644-713):\n[low/medium] reentrancy-events at src/KingOfThePad.sol:61: Reentrancy in KingOfThePad.takeCrown(uint256) (src/KingOfThePad.sol#61-112):\n[low/medium] reentrancy-events at src/PvPPad.sol:228: Reentrancy in PvPPad.fundGames(uint256) (src/PvPPad.sol#228-259):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:179: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint","passed":true},{"durationMs":495,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PadLiquidity.sol:147: `abi.encodePacked()` Hash Collision\n[high] incorrect-caret-operator at src/libs/PadLib.sol:82: Incorrect use of caret operator\n[high] reentrancy-state-change at src/KingOfThePad.sol:62: Reentrancy: State change after external call (21 places)\n[high] unsafe-casting at src/PadLiquidity.sol:291: Unsafe Casting of integers (2 places)\n[low] costly-loop at src/PadGame.sol:248: Costly operations inside loop (4 places)\n[low] large-numeric-literal at src/KingOfThePad.sol:19: Large Numeric Literal (21 places)\n[low] literal-instead-of-constant at src/KingOfThePad.sol:72: Literal Instead of Constant (55 places)\n[low] missing-inheritance at src/KingOfThePad.sol:16: Missing Inheritance (4 places)\n[low] require-revert-in-loop at src/PadLiquidity.sol:261: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/PvPPad.sol:103: State Change Without Event (4 places)\n[low] state-no-address-check at src/PadGame.sol:178: Address State Variable Set Without Checks (4 places)\n[low] state-variable-could-be-immutable at src/PadLiquidity.sol:76: State Variable Could Be Immutable (3 places)\n[low] storage-array-length-not-cached at src/PadGame.sol:337: Storage Array Length not Cached\n[low] unchecked-return at src/PadGame.sol:383: Unchecked Return (5 places)\n[low] uninitialized-local-variable at src/PadGame.sol:248: Uninitialized Local Variable (7 places)\n[low] unsafe-erc20-operation at src/KingOfThePad.sol:88: Unsafe ERC20 Operation (13 places)\n[low] unused-error at src/interfaces/PadErrors.sol:14: Unused Error (3 places)\n[low] unused-public-function at src/PadGame.sol:436: Public Function Not Used Internally (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"123a65b1bc4555ea1641ade9bd9d32b12c83ce03e15348805caef1b2ea0069af","verifiedTreeHash":"8552b14d5b9218215956d6e958b8a7609f05ac76","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":221141,"exitCode":0,"name":"build","output":"Compiling 106 files with Solc 0.8.26\nSolc 0.8.26 finished in 220.96s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Adversarial.t.sol:28:28:\n   |\n28 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/AuditV3.t.sol:49:28:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/AuditV3CarryUpkeep.t.sol:137:9:\n    |\n137 |         uint256 value = entry ? 0.5 ether : 1 ether;\n    |         ^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Revision.t.sol:41:28:\n   |\n41 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/AuditV3.t.sol:49:5:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":11814,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/IMDMathProperties.t.sol:IMDMathPropertiesTest\n[PASS] testFuzz_mulDivSatisfiesExactFloorInequalities(uint256,uint256,uint256) (runs: 1000, μ: 11200, ~: 11250)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129637240\n\n[PASS] test_mulDivFullWidthAndZeroBoundaries() (gas: 35919)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 12.11ms (12.22ms CPU time)\n\nRan 4 tests for test/V3FailureEdges.t.sol:V3PoolFailureEdgesTest\n[PASS] test_onlyCrownMayRequestStrictSettlementAndIndexErrorsDoNotChangeHealth() (gas: 171273)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 878449)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3205352)\n[PASS] test_tokenTransferFailureBecomesClaimableWithoutBlockingCollection() (gas: 1264954)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 33.01ms (3.11ms CPU time)\n\nRan 7 tests for test/IMDAuthorityAndBail.t.sol:IMDAuthorityAndBailTest\n[PASS] test_aliveBailAtOneSecondBeforeDeathQualifiesExactlyOnce() (gas: 2887615)\n[PASS] test_bailAfterDeathDoesNotQualify() (gas: 2865392)\n[PASS] test_bailAtExactDeathDoesNotQualify() (gas: 2865502)\n[PASS] test_extraCalldataCannotSelectVictimForEntryRollOrDonations() (gas: 2409370)\n[PASS] test_extraCalldataCannotSelectVictimForKingBid() (gas: 9453515)\n[PASS] test_sixAliveBailsCannotPullCarryWhenNoRankableRecipientRemains() (gas: 7295139)\n[PASS] test_unregisteredCopyOfGameCannotPullEvenWithVictimApproval() (gas: 160352)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 38.05ms (12.08ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1342703)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 393876)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 9666347)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1339668)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 1153081)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 1071330)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 10854492)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 723699)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 10447550)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1392177)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1270347)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 4504307)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35045)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168248)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 50.05ms (19.00ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3345795)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 11681268)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 27171590)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 7001986)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 2253736)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 50.47ms (21.76ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 44828779)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12016891\n  Later openPad including hook and genesis gas: 900486\n  Combined manifest and later opening gas: 12917377\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 84.33ms (84.15ms CPU time)\n\nRan 2 tests for test/IMDBurnOrders.t.sol:IMDBurnOrdersTest\n[PASS] test_coinFirstBurnIsOneHopAndPartialFillRespectsLimit() (gas: 21363006)\n[PASS] test_imdFirstBurnIsOneHopAndPartialFillRespectsLimit() (gas: 17333562)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 94.76ms (91.38ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2300263)\n[PASS] test_claimableWinner() (gas: 3309803)\n[PASS] test_conservationOfEth() (gas: 6924552)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 59327)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2695222)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2871215)\n[PASS] test_deathAndAllDeadEnd() (gas: 2226004)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1876939)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2826620)\n[PASS] test_failedPushBecomesClaimable() (gas: 2005991)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 6232160)\n[PASS] test_finalizeRanksAndPays() (gas: 5478374)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 2030055)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 163416219)\n[PASS] test_finalizerFeeCapped() (gas: 15337393)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 2204262)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 425742)\n[PASS] test_fundPotOnlyPad() (gas: 104086)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 25079091)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 4293835)\n[PASS] test_graduateOnlyFromGame() (gas: 132984)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 9125070)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1607320)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4864659)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 10832860)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 8615953)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2680143)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 2482484)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 2079431)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 2041855)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1664198)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1596836)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3556029)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1750024)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3086479)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 177.97ms (200.77ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 3025284)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7420334)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 548269)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1414570)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2835745)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 11214900)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4907515\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 2424129)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 201.60ms (159.21ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 22333459)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 29544471)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16802)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 18078435)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 19213763)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8738142)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 19367113)\nLogs:\n  curve ETH raised: 220500000000000000000\n  sybil net outlay before the dump: 199225000000000000001\n  dump proceeds: 133542968727184882968\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 17507213)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 17398725)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 369.88ms (366.78ms CPU time)\n\nRan 9 tests for test/IMDAtomicity.t.sol:IMDAtomicityTest\n[PASS] testFuzz_badPullReturnOrReceiptRollsBackFiniteAllowance(uint8,uint8) (runs: 128, μ: 3398486, ~: 3349972)\nLogs:\n  Bound result 3\n\n[PASS] test_failedBurnSettlementRestoresBucketTimestampAndPoolPrice() (gas: 12238996)\n[PASS] test_rollInnerBurnShortReceiptRollsBackCoinsCurveNonceAndAllowance() (gas: 5572463)\n[PASS] test_secondEntryInnerBurnShortReceiptRevertsEntireEntry() (gas: 3958440)\n[PASS] test_shortCarryPullCannotPartiallyFinalizeOrPayWinners() (gas: 17097666)\n[PASS] test_shortGraduationPullPreservesLockedCoinsAndPoolAbsence() (gas: 8424535)\n[PASS] test_shortKingBurnPullRevertsRefundAndReignSettlement() (gas: 13942863)\n[PASS] test_shortKingGamesPullRevertsRefundAndReignSettlement() (gas: 13901883)\n[PASS] test_shortManagerSettlementRollsBackPoolInitializationAndUnlock() (gas: 8701301)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 373.07ms (371.61ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 58790917)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 6259637)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 102348)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 266738\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 103864)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 104193)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 77565819)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 639.37ms (626.26ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 12244354, ~: 11999989)\nLogs:\n  Bound result 0\n  Bound result 3454570121562495996\n  Bound result 292631546637321764959\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 778.80ms (744.50ms CPU time)\n\nRan 8 tests for test/V4Edges.t.sol:V4EdgesTest\n[PASS] testFuzz_bailPayoutFormulaAndCurveLedger(uint8,uint8,uint96) (runs: 256, μ: 5762205, ~: 5252377)\nLogs:\n  Bound result 4\n  Bound result 683893554526737891\n\n[PASS] test_bailOutRefusedAfterBellAndAfterHardEnd() (gas: 2638387)\n[PASS] test_bailOutRefusedAtHardEndEvenWithLiveActivity() (gas: 6115406)\n[PASS] test_erasedSeatOneBelowCapNeverRingsTheBell() (gas: 2739935)\n[PASS] test_everySeatBailingOutEndsTheGameAtOnceAndFailsGraduation() (gas: 4391860)\n[PASS] test_expiredPendingRollOfErasedSeatPaysTipToPotWithNoEffect() (gas: 2983587)\n[PASS] test_kingSplitIgnoresGameWithErasedSeatBelowFive() (gas: 5919917)\n[PASS] test_seatedWalletWithoutCoinsBailsForZeroAndMinOutOneReverts() (gas: 3016130)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 879.72ms (865.50ms CPU time)\n\nRan 8 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 11939777, ~: 10411634)\nLogs:\n  Bound result 3\n\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5570999)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3292618)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3631050)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3550412)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 5649207)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6831)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 2221956)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 1.71s (1.69s CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 127822837, ~: 120686550)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 3030298)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 13795077)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 117124311)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 5614896)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 84129703)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.33s (2.45s 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: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 0\n  Bound result 107999999999916527546\n  Bound result 0\n  Bound result 1191936\n  Bound result 14\n  Bound result 0\n  Bound result 15\n  Bound result 52\n  Bound result 3\n  Bound result 0\n  Bound result 299\n  Bound result 7\n  Bound result 453\n  Bound result 50\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 240\n  Bound result 248\n  Bound result 302\n  Bound result 250\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.83s (3.79s CPU time)\n\nRan 1 test for test/V4BailIMDInvariant.t.sol:V4BailIMDInvariantTest\n[PASS]\nV4BailIMDInvariantTest 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 V4BailIMDInvariantTest invariants (runs: 40, calls: 2400, reverts: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 16\n  Bound result 16\n  Bound result 16\n  Bound result 100000000000000000000\n  Bound result 2\n  Bound result 0\n  Bound result 107999999999916527546\n  Bound result 2092153820047721328744199\n  Bound result 1191936\n  Bound result 14\n  Bound result 9998\n  Bound result 15\n  Bound result 52\n  Bound result 3\n  Bound result 0\n  Bound result 299\n  Bound result 7\n  Bound result 482\n  Bound result 50\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 240\n  Bound result 62\n  Bound result 710\n  Bound result 250\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.28s (4.24s CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 7311785)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2949438)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 22362684)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7572195\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 919915)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 594283)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 26398958)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 41\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6943528)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 4.83s (2.66s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10679178)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11665018)\n[PASS] test_claimNothingReverts() (gas: 8144324)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 17755850)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 21987305)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 28601567)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9766218)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10832348)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 12662800)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 176168064)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4394041\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 41872550)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 25374260)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 21931014)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9687188)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10626580)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 8050665)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9670851)\n[PASS] test_launchViewsRejectIdZero() (gas: 33276)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9879940)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 18076339)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 17516004)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 16989924)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78166)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7962107)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 8003968)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396016)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 18161673)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 18509553)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 11399595)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9951481)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 16774801)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12771940)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9605503)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 16824764)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 5.29s (1.18s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35216)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 20479007)\nLogs:\n  takeCrown gas, eighteen real pools: 2828401\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 17294506)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 23988494)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 18167302)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 16864597)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8886614)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10915685)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 17728318)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 5.29s (1.64s 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 500000000000000000\n  Bound result 40000000000000000000000\n  Bound result 16\n  Bound result 0\n  Bound result 500000\n  Bound result 999815\n  Bound result 5275559\n  Bound result 4854\n  Bound result 200000\n  Bound result 6080\n  Bound result 2989\n  Bound result 24731333174048255\n  Bound result 2\n  Bound result 10000\n  Bound result 2800000\n  Bound result 5465536\n  Bound result 1058760442193818\n  Bound result 5411496\n  Bound result 1417494\n  Bound result 5411882\n  Bound result 13081\n  Bound result 12424\n  Bound result 1599998\n  Bound result 5400193\n  Bound result 400\n  Bound result 8962\n  Bound result 716782\n  Bound result 5400012\n  Bound result 5401783\n  Bound result 4635\n  Bound result 8\n  Bound result 7477639625207\n  Bound result 71104006707057740703578\n  Bound result 15829\n  Bound result 14016\n  Bound result 9175\n  Bound result 5405401\n  Bound result 47683\n  Bound result 388000000000000000000\n  Bound result 415154087980144090\n  Bound result 51424371572342402001277\n  Bound result 6\n  Bound result 19999999999999978\n  Bound result 11486\n  Bound result 1507695\n  Bound result 3600\n  Bound result 1934\n  Bound result 459253\n  Bound result 39999999999999951\n  Bound result 18355023563429206\n  Bound result 5400051\n  Bound result 31\n  Bound result 39999999999999756\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.69s (5.63s CPU time)\n\nRan 15 tests for test/IMDPad.t.sol:IMDPadTest\n[PASS] testFuzz_unitPricesAndRoundingConserveIMD(uint256) (runs: 64, μ: 10180439, ~: 10180445)\nLogs:\n  Bound result 9900000000000000577\n\n[PASS] test_bothCurrencyOrdersPriceEquivalenceAndPartialFillBurn() (gas: 26573453)\n[PASS] test_currentUnitCapsAFullFillBurn() (gas: 17275351)\n[PASS] test_everyApplicationTemplateCloneAndHookRejectsETH() (gas: 8317214)\n[PASS] test_failedIMDAndCoinPayoutsCannotBlockCrownOrBatch() (gas: 18623404)\n[PASS] test_lateAliveBailKeepsCarryReleaseWithFourRankableSeats() (gas: 25527098)\n[PASS] test_lateAliveBailWithFiveOtherSurvivors() (gas: 28494150)\n[PASS] test_lateBailCannotClawBackExistingKingFunding() (gas: 25494137)\n[PASS] test_noReturnIMDFullGameGraduationBurnKingAndClaims() (gas: 18742659)\n[PASS] test_pullOnlyTrustedCallersAndEndpointsAlwaysChargeTheirCaller() (gas: 8677682)\n[PASS] test_shortPoolReceiptDoesNotCreateFeeCredits() (gas: 17804855)\n[PASS] test_shortPullsRevertAtomicallyAndDonationsDoNotCreateCredits() (gas: 8989625)\n[PASS] test_soleBuyerSybilWithAliveBailAndFourSurvivorsStillLoses() (gas: 27194382)\nLogs:\n  Sybil loss in IMD wei: 12160243613483469790\n\n[PASS] test_unitBoundsOwnerEventAndSnapshot() (gas: 14402188)\n[PASS] test_unsolicitedIMDDoesNotAlterGraduationPriceOrCredit() (gas: 11771937)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 5.73s (2.45s CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 17528802, ~: 17528716)\nLogs:\n  Bound result 7996000000000000011414\n  Bound result 4710798004168108077668\n  Bound result 1361\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 17963206, ~: 17963253)\nLogs:\n  Bound result 6272996531674916266090\n  Bound result 17099703815157592107601\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 21246627, ~: 19700348)\nLogs:\n  Bound result 3\n  Bound result 1164685330982380889835\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 17345844, ~: 17345875)\nLogs:\n  Bound result 19996000000000000000251\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 13662053, ~: 13145996)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 1123454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 8048054, ~: 8048287)\nLogs:\n  Bound result 348370641196807289561085429\n  Bound result 1215007428778038311813\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 8027191, ~: 8026699)\nLogs:\n  Bound result 28516766246428035999359\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 8049027, ~: 8049101)\nLogs:\n  Bound result 404284521931462223\n  Bound result 198058407257799441046\n  Bound result 1801941592742261523603\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 16298299, ~: 14671085)\nLogs:\n  Bound result 9\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 5.73s (38.32s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1922896, ~: 1931828)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2501825)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 54734246)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3888100)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1419318\n  roll with both liquidity upkeep stipends exhausted: 1552826\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3279258)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 5.73s (5.77s 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 30\n  Bound result 78\n  Bound result 12\n  Bound result 71\n  Bound result 83\n  Bound result 77\n  Bound result 21\n  Bound result 26\n  Bound result 2\n  Bound result 31\n  Bound result 89\n  Bound result 61\n  Bound result 24\n  Bound result 76\n  Bound result 31\n  Bound result 37\n  Bound result 28\n  Bound result 30\n  Bound result 79\n  Bound result 27\n  Bound result 89\n  Bound result 8\n  Bound result 31\n  Bound result 15\n  Bound result 50\n  Bound result 17\n  Bound result 4\n  Bound result 12\n  Bound result 1\n  Bound result 23\n  Bound result 2\n  Bound result 34\n  Bound result 80\n  Bound result 7\n  Bound result 7\n  Bound result 50\n  Bound result 38\n  Bound result 18\n  Bound result 25\n  Bound result 67\n  Bound result 22\n  Bound result 76\n  Bound result 24\n  Bound result 9\n  Bound result 16\n  Bound result 30\n  Bound result 43\n  Bound result 35\n  Bound result 1\n  Bound result 73\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 7.49s (7.45s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107427)\n[PASS] test_bindingsAreOneShot() (gas: 87718)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 19716214)\n[PASS] test_closedPadRevertsEverything() (gas: 97341)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 689643)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33037)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 20930365)\n[PASS] test_fundGamesOnlyKing() (gas: 121439)\n[PASS] test_hookRejectsForeignInitialize() (gas: 8091115)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 17578703)\n[PASS] test_launchValidatesStrings() (gas: 16759202)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7961415)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7994869)\n[PASS] test_openPadOnlyOnce() (gas: 8033632)\n[PASS] test_openPadRejectsBadSalt() (gas: 203270)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135025)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8439657)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37365487)\n[PASS] test_templatesCannotBeInitialized() (gas: 8132248)\n[PASS] test_upkeepForOnlyGames() (gas: 8182632)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 8.49s (581.62ms CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 31577644, ~: 23686050)\nLogs:\n  Bound result 58\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 117419314)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2688595\n  5000-entry draw total gas: 16272475\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 86617813)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 578198)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 791204)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 9787606)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1693003)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5732752)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 941892)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 876998)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 82455613)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526729)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 83272421)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 135380744)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 2624002)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 8.49s (13.46s CPU time)\n\nRan 1 test for test/IMDCustodyInvariant.t.sol:IMDCustodyInvariantTest\n[PASS]\nIMDCustodyInvariantTest invariants:\n[PASS] invariant_IMDAndEveryCoinAreConserved\n[PASS] invariant_eachCustodianBacksItsOwnDebtsAndSurplus\n[PASS] invariant_unitsLocksAndTerminalStatesStayConsistent\n IMDCustodyInvariantTest invariants (runs: 96, calls: 6912, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| IMDCustodyHandler | bail           | 561   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | burnAndCollect | 533   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | claim          | 561   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | createGame     | 578   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | crownBid       | 563   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | donate         | 639   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | finish         | 584   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | fund           | 593   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | roll           | 578   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | setUnit        | 554   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | tick           | 600   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | trade          | 568   | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 11\n  Bound result 11\n  Bound result 11\n  Bound result 11\n  Bound result 10000000000000000\n  Bound result 100000000000000000000\n  Bound result 2000000000000000000\n  Bound result 91\n  Bound result 260\n  Bound result 470000000000000000\n  Bound result 200000000000000000000\n  Bound result 73\n  Bound result 0\n  Bound result 9900000000000018781\n  Bound result 66\n  Bound result 76\n  Bound result 10\n  Bound result 2943\n  Bound result 1871\n  Bound result 568678435\n  Bound result 58\n  Bound result 25\n  Bound result 4\n  Bound result 38\n  Bound result 17\n  Bound result 1066130786\n  Bound result 6863761254058193125\n  Bound result 8\n  Bound result 122\n  Bound result 7\n  Bound result 9900000003668213702\n  Bound result 77\n  Bound result 87\n  Bound result 9900000000000010001\n  Bound result 499999999999999167\n  Bound result 88\n  Bound result 167\n  Bound result 416\n  Bound result 3393328922\n  Bound result 5000000\n  Bound result 9900000000000001539\n  Bound result 9900000000000017456\n  Bound result 1999999999999999940\n  Bound result 2\n  Bound result 34\n  Bound result 177\n  Bound result 91\n  Bound result 95\n  Bound result 5731\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 11.64s (11.57s CPU time)\n\nRan 1 test for test/IMDCustodyInvariant.t.sol:IMDNoReturnCustodyInvariantTest\n[PASS]\nIMDNoReturnCustodyInvariantTest invariants:\n[PASS] invariant_IMDAndEveryCoinAreConserved\n[PASS] invariant_eachCustodianBacksItsOwnDebtsAndSurplus\n[PASS] invariant_unitsLocksAndTerminalStatesStayConsistent\n IMDNoReturnCustodyInvariantTest invariants (runs: 96, calls: 6912, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| IMDCustodyHandler | bail           | 561   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | burnAndCollect | 533   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | claim          | 561   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | createGame     | 578   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | crownBid       | 563   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | donate         | 639   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | finish         | 584   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | fund           | 593   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | roll           | 578   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | setUnit        | 554   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | tick           | 600   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | trade          | 568   | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 11\n  Bound result 11\n  Bound result 11\n  Bound result 11\n  Bound result 10000000000000000\n  Bound result 100000000000000000000\n  Bound result 2000000000000000000\n  Bound result 91\n  Bound result 260\n  Bound result 470000000000000000\n  Bound result 200000000000000000000\n  Bound result 73\n  Bound result 0\n  Bound result 9900000000000017183\n  Bound result 66\n  Bound result 76\n  Bound result 244\n  Bound result 17673\n  Bound result 1858\n  Bound result 8765\n  Bound result 58\n  Bound result 25\n  Bound result 4\n  Bound result 107\n  Bound result 17\n  Bound result 903871335\n  Bound result 9900000000000003199\n  Bound result 8\n  Bound result 122\n  Bound result 7\n  Bound result 9900000000000016987\n  Bound result 77\n  Bound result 87\n  Bound result 9900000000000010001\n  Bound result 499999999999999167\n  Bound result 88\n  Bound result 187\n  Bound result 4122236691\n  Bound result 1823\n  Bound result 5000000\n  Bound result 8240956896892313229\n  Bound result 9900000000000018300\n  Bound result 1999999999999999940\n  Bound result 2\n  Bound result 64\n  Bound result 136\n  Bound result 47\n  Bound result 95\n  Bound result 17188\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 11.65s (11.61s CPU time)\n\nRan 30 test suites in 11.65s (101.98s CPU time): 247 tests passed, 0 failed, 0 skipped (247 total tests)\n","passed":true},{"durationMs":105,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown(uint256)\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot(uint256)\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim(address)\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.creditBurn(address,uint256)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn(uint256)\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256)\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"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.burn(uint256)\",\"PvPPad.fundCarry(uint256)\",\"PvPPad.fundGames(uint256)\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.pull(address,uint256)\",\"PvPPad.restartGenesis()\",\"PvPPad.setUnit(uint256)\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":47,\"README.md\":166,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT-V4-ETH-HISTORY.md\":476,\"docs/AUDIT.md\":197,\"docs/TEST-REPORT.md\":135,\"docs/VERIFY.md\":52,\"foundry.toml\":22,\"launch.json\":38,\"remappings.txt\":2,\"src/KingOfThePad.sol\":139,\"src/PadGame.sol\":806,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":507,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":353,\"src/interfaces/Interfaces.sol\":128,\"src/interfaces/PadErrors.sol\":79,\"src/libs/PadLib.sol\":149,\"test/Adversarial.t.sol\":802,\"test/AtomicDeployment.t.sol\":124,\"test/AuditV3.t.sol\":406,\"test/AuditV3CarryUpkeep.t.sol\":192,\"test/Base.t.sol\":224,\"test/CrownSettlement.t.sol\":253,\"test/Fuzz.t.sol\":290,\"test/Game.t.sol\":762,\"test/IMD-INDEPENDENT-TEST-REPORT.md\":108,\"test/IMDAtomicity.t.sol\":246,\"test/IMDAuthorityAndBail.t.sol\":168,\"test/IMDBurnOrders.t.sol\":86,\"test/IMDCustodyInvariant.t.sol\":418,\"test/IMDMathProperties.t.sol\":53,\"test/IMDPad.t.sol\":401,\"test/Invariants.t.sol\":608,\"test/King.t.sol\":316,\"test/LiquidityV4.t.sol\":252,\"test/Pad.t.sol\":300,\"test/Raffle.t.sol\":425,\"test/RaffleEdges.t.sol\":274,\"test/RealV4.sol\":95,\"test/Revision.t.sol\":265,\"test/V3-CONTRIBUTOR-REPORT.md\":129,\"test/V3AccountingActors.sol\":22,\"test/V3CarryProperties.t.sol\":131,\"test/V3FailureEdges.t.sol\":356,\"test/V3KingFeesInvariant.t.sol\":254,\"test/V3ResolverInvariant.t.sol\":216,\"test/V4-CONTRIBUTOR-REPORT.md\":43,\"test/V4BailIMDInvariant.t.sol\":36,\"test/V4Edges.t.sol\":271,\"test/V4Pad.t.sol\":298,\"test/mocks/IMD.sol\":113,\"test/mocks/Mocks.sol\":37,\"test/mocks/RoutedIMD.sol\":94,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"614fc1d54a92d7099cc1a72581cdf9b79989074b3e88a54842762e0a7dc76350","verifiedTreeHash":"db22902eb9975a98d76292acd00ff10e6802f051","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":171952,"exitCode":0,"name":"build","output":"Compiling 101 files with Solc 0.8.26\nSolc 0.8.26 finished in 171.84s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Adversarial.t.sol:28:28:\n   |\n28 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/AuditV3.t.sol:49:28:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/AuditV3CarryUpkeep.t.sol:137:9:\n    |\n137 |         uint256 value = entry ? 0.5 ether : 1 ether;\n    |         ^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Revision.t.sol:41:28:\n   |\n41 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/AuditV3.t.sol:49:5:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":7438,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/PushStipend.t.sol:PushStipendTest\n[PASS] test_pushLandsForBeaconProxiedTokenWithExtraChecksAndKeepsHalfTheStipendSpare() (gas: 175133)\nLogs:\n  beacon-proxied OZ4 transfer with two extra reads, fresh holder, gas: 49127\n\n[PASS] test_pushStillBoundsAGasEatingRecipientToTheStipend() (gas: 468389)\n[PASS] test_pushToAnExistingHolderLandsToo() (gas: 144694)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 903.21µs (519.77µs CPU time)\n\nRan 4 tests for test/V3FailureEdges.t.sol:V3PoolFailureEdgesTest\n[PASS] test_onlyCrownMayRequestStrictSettlementAndIndexErrorsDoNotChangeHealth() (gas: 171273)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 878449)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3205352)\n[PASS] test_tokenTransferFailureBecomesClaimableWithoutBlockingCollection() (gas: 1264954)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 28.90ms (3.04ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 122303949)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12017515\n  Later openPad including hook and genesis gas: 900486\n  Combined manifest and later opening gas: 12918001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 73.62ms (73.43ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3345795)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 11681268)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 27171590)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 7001986)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 2253736)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 150.15ms (20.32ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 3025284)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7420334)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 548269)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1414570)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2835745)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 12337097)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 5911586\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 2424129)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 202.43ms (160.38ms CPU time)\n\nRan 8 tests for test/V4Edges.t.sol:V4EdgesTest\n[PASS] testFuzz_bailPayoutFormulaAndCurveLedger(uint8,uint8,uint96) (runs: 256, μ: 5769467, ~: 5252841)\nLogs:\n  Bound result 1\n  Bound result 15170\n\n[PASS] test_bailOutRefusedAfterBellAndAfterHardEnd() (gas: 2638387)\n[PASS] test_bailOutRefusedAtHardEndEvenWithLiveActivity() (gas: 6115406)\n[PASS] test_erasedSeatOneBelowCapNeverRingsTheBell() (gas: 2739935)\n[PASS] test_everySeatBailingOutEndsTheGameAtOnceAndFailsGraduation() (gas: 4391860)\n[PASS] test_expiredPendingRollOfErasedSeatPaysTipToPotWithNoEffect() (gas: 2983587)\n[PASS] test_kingSplitIgnoresGameWithErasedSeatBelowFive() (gas: 5919917)\n[PASS] test_seatedWalletWithoutCoinsBailsForZeroAndMinOutOneReverts() (gas: 3016130)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 384.64ms (361.54ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1342703)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 393876)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 9666347)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1339668)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 1153081)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 1071330)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 10854564)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 723699)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 10447550)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1392177)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1270347)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 4504294)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35045)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168248)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 386.97ms (27.57ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 12673661, ~: 12904985)\nLogs:\n  Bound result 0\n  Bound result 3454570121562495996\n  Bound result 292631546637321764959\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 620.04ms (590.99ms CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 7311785)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2949438)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 22362684)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7572195\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 919915)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 594283)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 27861371)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 58\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6943528)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.55s (2.70s CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 128859661, ~: 123527356)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 3030259)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 13795094)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 117124311)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 5614896)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 84129703)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.09s (2.22s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1923180, ~: 1931828)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2501825)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 54734246)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 4288100)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1619318\n  roll with both liquidity upkeep stipends exhausted: 1752826\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3279258)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.33s (2.33s 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: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 0\n  Bound result 7999999999999999990\n  Bound result 0\n  Bound result 9000000000000000000\n  Bound result 14\n  Bound result 0\n  Bound result 160\n  Bound result 142\n  Bound result 0\n  Bound result 3\n  Bound result 9800000000000000000\n  Bound result 8\n  Bound result 453\n  Bound result 66\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 80\n  Bound result 248\n  Bound result 35\n  Bound result 40\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.03s (3.00s CPU time)\n\nRan 1 test for test/V4BailIMDInvariant.t.sol:V4BailIMDInvariantTest\n[PASS]\nV4BailIMDInvariantTest 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 V4BailIMDInvariantTest invariants (runs: 40, calls: 2400, reverts: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 16\n  Bound result 16\n  Bound result 16\n  Bound result 100000000000000000000\n  Bound result 2\n  Bound result 0\n  Bound result 7999999999999999990\n  Bound result 999000000000000000000\n  Bound result 9000000000000000000\n  Bound result 14\n  Bound result 0\n  Bound result 160\n  Bound result 142\n  Bound result 0\n  Bound result 3\n  Bound result 9800000000000000000\n  Bound result 1\n  Bound result 640\n  Bound result 66\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 80\n  Bound result 63\n  Bound result 664\n  Bound result 40\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.67s (3.63s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107427)\n[PASS] test_bindingsAreOneShot() (gas: 87718)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 19716210)\n[PASS] test_closedPadRevertsEverything() (gas: 97341)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 689643)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33037)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 20930421)\n[PASS] test_fundGamesOnlyKing() (gas: 121439)\n[PASS] test_hookRejectsForeignInitialize() (gas: 8091115)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 17578699)\n[PASS] test_launchValidatesStrings() (gas: 16759198)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7961415)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7994869)\n[PASS] test_openPadOnlyOnce() (gas: 8033632)\n[PASS] test_openPadRejectsBadSalt() (gas: 203270)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135025)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8439657)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37365487)\n[PASS] test_templatesCannotBeInitialized() (gas: 8132248)\n[PASS] test_upkeepForOnlyGames() (gas: 8182632)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 4.25s (400.89ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 58790917)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 6259637)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 102348)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 266738\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 103864)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 104193)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 77565819)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 4.25s (646.54ms CPU time)\n\nRan 16 tests for test/IMDPad.t.sol:IMDPadTest\n[PASS] testFuzz_unitPricesAndRoundingConserveIMD(uint256) (runs: 64, μ: 10180435, ~: 10180440)\nLogs:\n  Bound result 9900000000000023001\n\n[PASS] test_bothCurrencyOrdersPriceEquivalenceAndPartialFillBurn() (gas: 26573500)\n[PASS] test_currentUnitCapsAFullFillBurn() (gas: 17275376)\n[PASS] test_deadSeatBailDoesNotQualifyFundingAnyMoreThanIdlingDid() (gas: 25108804)\n[PASS] test_everyApplicationTemplateCloneAndHookRejectsETH() (gas: 8317214)\n[PASS] test_failedIMDAndCoinPayoutsCannotBlockCrownOrBatch() (gas: 18623451)\n[PASS] test_lateAliveBailKeepsCarryReleaseWithFourRankableSeats() (gas: 25527008)\n[PASS] test_lateAliveBailWithFiveOtherSurvivors() (gas: 28494060)\n[PASS] test_lateBailCannotClawBackExistingKingFunding() (gas: 25494167)\n[PASS] test_noReturnIMDFullGameGraduationBurnKingAndClaims() (gas: 18742706)\n[PASS] test_pullOnlyTrustedCallersAndEndpointsAlwaysChargeTheirCaller() (gas: 8677682)\n[PASS] test_shortPoolReceiptDoesNotCreateFeeCredits() (gas: 17804880)\n[PASS] test_shortPullsRevertAtomicallyAndDonationsDoNotCreateCredits() (gas: 8989647)\n[PASS] test_soleBuyerSybilWithAliveBailAndFourSurvivorsStillLoses() (gas: 27194382)\nLogs:\n  Sybil loss in IMD wei: 12160243613483469790\n\n[PASS] test_unitBoundsOwnerEventAndSnapshot() (gas: 14402188)\n[PASS] test_unsolicitedIMDDoesNotAlterGraduationPriceOrCredit() (gas: 11771937)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 4.34s (2.00s CPU time)\n\nRan 8 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 12395115, ~: 10888859)\nLogs:\n  Bound result 3\n\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5570999)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3292618)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3631050)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3550412)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 5649207)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6831)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 2221956)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 4.35s (1.48s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10679178)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11665018)\n[PASS] test_claimNothingReverts() (gas: 8144324)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 17755850)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 21987305)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 28601567)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9766218)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10832348)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 12662800)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 176168064)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4394041\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 41872550)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 25374260)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 21931014)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9687188)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10626580)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 8050665)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9670851)\n[PASS] test_launchViewsRejectIdZero() (gas: 33276)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9879940)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 18076339)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 17516004)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 16989906)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78166)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7962107)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 8003968)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396016)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 18161673)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 18509553)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 11411881)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9951481)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 16774801)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12772040)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9605503)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 16824764)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 4.35s (1.05s CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 22333804)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 29544842)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16802)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 18078806)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 19214134)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8738142)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 19367453)\nLogs:\n  curve ETH raised: 220500000000000000000\n  sybil net outlay before the dump: 199225000000000000001\n  dump proceeds: 133542968727184882968\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 17507584)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 17399096)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.40s (355.73ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2300263)\n[PASS] test_claimableWinner() (gas: 3309803)\n[PASS] test_conservationOfEth() (gas: 6924624)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 59327)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2695222)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2871215)\n[PASS] test_deathAndAllDeadEnd() (gas: 2226004)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1876939)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2826620)\n[PASS] test_failedPushBecomesClaimable() (gas: 2006020)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 6232285)\n[PASS] test_finalizeRanksAndPays() (gas: 5478374)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 2030055)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 163416219)\n[PASS] test_finalizerFeeCapped() (gas: 15337393)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 2204222)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 425742)\n[PASS] test_fundPotOnlyPad() (gas: 104086)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 25079091)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 4293835)\n[PASS] test_graduateOnlyFromGame() (gas: 132984)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 9125070)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1607320)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4864659)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 10832860)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 8615953)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2680143)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 2482484)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 2079431)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 2041855)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1664198)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1596836)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3555965)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1750024)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3086479)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 4.40s (202.09ms CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35216)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 20479003)\nLogs:\n  takeCrown gas, eighteen real pools: 2828401\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 17294502)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 23988490)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 18167298)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 16864593)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8886614)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10915684)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 17728314)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.40s (1.81s CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 17528607, ~: 17528531)\nLogs:\n  Bound result 6478964879916809288141\n  Bound result 0\n  Bound result 137\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 17963001, ~: 17963080)\nLogs:\n  Bound result 5182816889607460915284\n  Bound result 10584601584914418058667\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 20799849, ~: 17320030)\nLogs:\n  Bound result 3\n  Bound result 1164685330982380889835\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 17345677, ~: 17345702)\nLogs:\n  Bound result 5277882960653981072952\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 13465176, ~: 12310085)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 1123454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 8048059, ~: 8048287)\nLogs:\n  Bound result 200000000000000000000\n  Bound result 1999999999999999600001\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 8027187, ~: 8026699)\nLogs:\n  Bound result 5409763843970647887531\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 8049020, ~: 8049101)\nLogs:\n  Bound result 404284521931462223\n  Bound result 198058407257799441046\n  Bound result 1801941592742261523603\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 16341433, ~: 15392610)\nLogs:\n  Bound result 11\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.40s (27.97s 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 500000000000000000\n  Bound result 40000000000000000000000\n  Bound result 16\n  Bound result 0\n  Bound result 500000\n  Bound result 592867\n  Bound result 5275559\n  Bound result 6640\n  Bound result 5400051\n  Bound result 6028\n  Bound result 48879\n  Bound result 6519\n  Bound result 30\n  Bound result 600000\n  Bound result 30000000000000000000\n  Bound result 5465536\n  Bound result 1058760442193818\n  Bound result 5411518\n  Bound result 5400256\n  Bound result 5411880\n  Bound result 13109\n  Bound result 12354\n  Bound result 5412213\n  Bound result 2197979\n  Bound result 1500\n  Bound result 10194\n  Bound result 716782\n  Bound result 2964335\n  Bound result 5401905\n  Bound result 4634\n  Bound result 7\n  Bound result 7477639625207\n  Bound result 69601514769409742621282\n  Bound result 15777\n  Bound result 16409\n  Bound result 9175\n  Bound result 5286690\n  Bound result 47683\n  Bound result 800000000000000000000\n  Bound result 415154087980144090\n  Bound result 86691127585762788075851\n  Bound result 4\n  Bound result 39999999999950001\n  Bound result 32777374055316348\n  Bound result 1507695\n  Bound result 3600\n  Bound result 2136\n  Bound result 4856791\n  Bound result 33\n  Bound result 18355023563429206\n  Bound result 5400201\n  Bound result 31\n  Bound result 39999999999989001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.65s (4.62s 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 28\n  Bound result 5\n  Bound result 12\n  Bound result 90\n  Bound result 82\n  Bound result 12\n  Bound result 21\n  Bound result 10\n  Bound result 2\n  Bound result 12\n  Bound result 90\n  Bound result 55\n  Bound result 9\n  Bound result 19\n  Bound result 32\n  Bound result 37\n  Bound result 28\n  Bound result 28\n  Bound result 79\n  Bound result 11\n  Bound result 89\n  Bound result 8\n  Bound result 18\n  Bound result 15\n  Bound result 50\n  Bound result 73\n  Bound result 20\n  Bound result 12\n  Bound result 1\n  Bound result 21\n  Bound result 29\n  Bound result 33\n  Bound result 80\n  Bound result 0\n  Bound result 18\n  Bound result 89\n  Bound result 25\n  Bound result 18\n  Bound result 58\n  Bound result 11\n  Bound result 21\n  Bound result 76\n  Bound result 17\n  Bound result 59\n  Bound result 16\n  Bound result 68\n  Bound result 43\n  Bound result 35\n  Bound result 7\n  Bound result 28\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.26s (6.20s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 28846416, ~: 25050287)\nLogs:\n  Bound result 58\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 117419314)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2688595\n  5000-entry draw total gas: 16272475\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 86617813)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 578198)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 791204)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 9787606)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1693003)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5732752)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 941892)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 876998)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 82455613)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526729)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 83272421)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 135380744)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 2624002)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 7.31s (10.86s CPU time)\n\nRan 25 test suites in 7.32s (71.87s CPU time): 229 tests passed, 0 failed, 0 skipped (229 total tests)\n","passed":true},{"durationMs":83,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown(uint256)\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot(uint256)\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim(address)\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.creditBurn(address,uint256)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn(uint256)\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256)\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"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.burn(uint256)\",\"PvPPad.fundCarry(uint256)\",\"PvPPad.fundGames(uint256)\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.pull(address,uint256)\",\"PvPPad.restartGenesis()\",\"PvPPad.setUnit(uint256)\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":50,\"README.md\":168,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT-V4-ETH-HISTORY.md\":476,\"docs/AUDIT.md\":220,\"docs/TEST-REPORT.md\":138,\"docs/VERIFY.md\":55,\"foundry.toml\":22,\"launch.json\":38,\"remappings.txt\":2,\"src/KingOfThePad.sol\":139,\"src/PadGame.sol\":806,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":507,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":353,\"src/interfaces/Interfaces.sol\":128,\"src/interfaces/PadErrors.sol\":79,\"src/libs/PadLib.sol\":153,\"test/Adversarial.t.sol\":802,\"test/AtomicDeployment.t.sol\":124,\"test/AuditV3.t.sol\":406,\"test/AuditV3CarryUpkeep.t.sol\":192,\"test/Base.t.sol\":224,\"test/CrownSettlement.t.sol\":253,\"test/Fuzz.t.sol\":290,\"test/Game.t.sol\":762,\"test/IMDPad.t.sol\":437,\"test/Invariants.t.sol\":608,\"test/King.t.sol\":316,\"test/LiquidityV4.t.sol\":252,\"test/Pad.t.sol\":300,\"test/PushStipend.t.sol\":159,\"test/Raffle.t.sol\":425,\"test/RaffleEdges.t.sol\":274,\"test/RealV4.sol\":95,\"test/Revision.t.sol\":265,\"test/V3-CONTRIBUTOR-REPORT.md\":129,\"test/V3AccountingActors.sol\":22,\"test/V3CarryProperties.t.sol\":131,\"test/V3FailureEdges.t.sol\":356,\"test/V3KingFeesInvariant.t.sol\":254,\"test/V3ResolverInvariant.t.sol\":216,\"test/V4-CONTRIBUTOR-REPORT.md\":43,\"test/V4BailIMDInvariant.t.sol\":36,\"test/V4Edges.t.sol\":271,\"test/V4Pad.t.sol\":298,\"test/mocks/IMD.sol\":113,\"test/mocks/Mocks.sol\":37,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":6920,"exitCode":0,"name":"slither","output":"[high/medium] incorrect-exp at src/libs/PadLib.sol:62: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#62-95) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[high/medium] reentrancy-balance at src/PadLiquidity.sol:473: Reentrancy in PadLiquidity._takeFees(address,uint256) (src/PadLiquidity.sol#473-479):\n[medium/medium] divide-before-multiply at src/PadGame.sol:644: PadGame._finalize(address) (src/PadGame.sol#644-713) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:62: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#62-95) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:62: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#62-95) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:62: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#62-95) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:62: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#62-95) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:62: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#62-95) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:62: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#62-95) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:62: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#62-95) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/libs/PadLib.sol:62: PadLib.mulDiv(uint256,uint256,uint256) (src/libs/PadLib.sol#62-95) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/PadGame.sol:644: PadGame._finalize(address) (src/PadGame.sol#644-713) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:539: PadGame.quote(uint256) (src/PadGame.sol#539-552) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:555: PadGame.quoteSell(uint256) (src/PadGame.sol#555-563) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:316: PvPPad.genesisFailed() (src/PvPPad.sol#316-319) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:436: PadGame.bellRang() (src/PadGame.sol#436-438) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PvPPad.sol:310: PvPPad.genesisGraduated() (src/PvPPad.sol#310-314) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PadGame.sol:784: PadGame._pay(address,uint256) (src/PadGame.sol#784-789) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:376: Reentrancy in PadGame.upkeepStep(address) (src/PadGame.sol#376-388):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:134: Reentrancy in PvPPad.restartGenesis() (src/PvPPad.sol#134-141):\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:277: Reentrancy in PadGame.roll() (src/PadGame.sol#277-313):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:286: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:245: Reentrancy in PadLiquidity._distribute(uint256,bool) (src/PadLiquidity.sol#245-273):\n[medium/medium] reentrancy-no-eth at src/KingOfThePad.sol:61: Reentrancy in KingOfThePad.takeCrown(uint256) (src/KingOfThePad.sol#61-112):\n[medium/medium] reentrancy-no-eth at src/PvPPad.sol:276: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#276-297):\n[medium/medium] reentrancy-no-eth at src/KingOfThePad.sol:61: Reentrancy in KingOfThePad.takeCrown(uint256) (src/KingOfThePad.sol#61-112):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:356: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#356-370):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:316: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#316-330):\n[medium/medium] reentrancy-no-eth at src/PadLiquidity.sol:179: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256) (src/PadLiquidity.sol#179-216):\n[medium/medium] reentrancy-no-eth at src/PadGame.sol:644: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#644-713):\n[medium/medium] uninitialized-local at src/PadLiquidity.sol:250: PadLiquidity._distribute(uint256,bool).floor (src/PadLiquidity.sol#250) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:235: PvPPad.fundGames(uint256).count (src/PvPPad.sol#235) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:688: PadGame._finalize(address).paid (src/PadGame.sol#688) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:336: PadGame.bailOut(uint256).latest (src/PadGame.sol#336) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:251: PvPPad.fundGames(uint256).sent (src/PvPPad.sol#251) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:697: PadGame._finalize(address).sent (src/PadGame.sol#697) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:678: PadGame._finalize(address).returned (src/PadGame.sol#678) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:601: PadGame._resolveRoll(uint256,address).d (src/PadGame.sol#601) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:650: PadGame._finalize(address).living (src/PadGame.sol#650) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PadGame.sol:602: PadGame._resolveRoll(uint256,address).expired (src/PadGame.sol#602) is a local variable never initialized\n[medium/medium] uninitialized-local at src/PvPPad.sol:236: PvPPad.fundGames(uint256).total (src/PvPPad.sol#236) is a local variable never initialized\n[medium/medium] unused-return at src/PadLiquidity.sol:408: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#408-455) ignores return value by poolManager.donate(key,max0 - owe0,0,) (src/PadLiquidity.sol#425)\n[medium/medium] unused-return at src/PadLiquidity.sol:408: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#408-455) ignores return value by poolManager.donate(key,0,max1 - owe1,) (src/PadLiquidity.sol#428)\n[medium/medium] unused-return at src/PadLiquidity.sol:408: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#408-455) ignores return value by (None,fees) = poolManager.modifyLiquidity(key_scope_0,ModifyLiquidityParams(MIN_TICK,MAX_TICK,0,0),) (src/PadLiquidity.sol#437)\n[medium/medium] unused-return at src/PadLiquidity.sol:408: PadLiquidity.unlockCallback(bytes) (src/PadLiquidity.sol#408-455) ignores return value by (delta,None) = poolManager.modifyLiquidity(key,ModifyLiquidityParams(MIN_TICK,MAX_TICK,int256(l),0),) (src/PadLiquidity.sol#414-415)\n[medium/medium] unused-return at src/PadLiquidity.sol:179: PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256) (src/PadLiquidity.sol#179-216) ignores return value by poolManager.initialize(key,sqrtP) (src/PadLiquidity.sol#205)\n[low/medium] missing-zero-check at src/PadGame.sol:174: PadGame.initialize(uint256,address,address,bool).liquidity_ (src/PadGame.sol#174) lacks a zero-check on :\n[low/medium] missing-zero-check at src/PadLiquidity.sol:137: PadLiquidity.deployHook(bytes32).h (src/PadLiquidity.sol#137) lacks a zero-check on :\n[low/medium] missing-zero-check at src/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/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] missing-zero-check at src/PadGame.sol:174: PadGame.initialize(uint256,address,address,bool).token_ (src/PadGame.sol#174) lacks a zero-check on :\n[low/medium] calls-loop at src/PvPPad.sol:228: PvPPad.fundGames(uint256) (src/PvPPad.sol#228-259) has external calls inside a loop: (live,p) = IPadGame(game).isLiveForKing() (src/PvPPad.sol#239)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#609)\n[low/medium] calls-loop at src/PadLiquidity.sol:286: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#299)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#610)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#608)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#609)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#608)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#608)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#597)\n[low/medium] calls-loop at src/PvPPad.sol:228: PvPPad.fundGames(uint256) (src/PvPPad.sol#228-259) has external calls inside a loop: IPadGame(games[i_scope_0]).fundPot(share) (src/PvPPad.sol#256)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#597)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#609)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#597)\n[low/medium] calls-loop at src/PadLiquidity.sol:286: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308) has external calls inside a loop: current = IArbSys(address(0x64)).arbBlockNumber() (src/PadLiquidity.sol#299)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h2 = ARB.arbBlockHash(commit + 2) (src/PadGame.sol#609)\n[low/medium] calls-loop at src/PadLiquidity.sol:286: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,payee) (src/PadLiquidity.sol#290-307)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#610)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: cur = ARB.arbBlockNumber() (src/PadGame.sol#597)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#610)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h3 = ARB.arbBlockHash(commit + 3) (src/PadGame.sol#610)\n[low/medium] calls-loop at src/PadGame.sol:594: PadGame._resolveRoll(uint256,address) (src/PadGame.sol#594-642) has external calls inside a loop: h1 = ARB.arbBlockHash(commit + 1) (src/PadGame.sol#608)\n[low/medium] calls-loop at src/PadLiquidity.sol:286: PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308) has external calls inside a loop: this.collectPool{gas: COLLECT_GAS}(idx,payee) (src/PadLiquidity.sol#290-307)\n[low/medium] reentrancy-benign at src/PadGame.sol:190: Reentrancy in PadGame.enter() (src/PadGame.sol#190-204):\n[low/medium] reentrancy-benign at src/PadGame.sol:644: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#644-713):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:316: Reentrancy in PadLiquidity.collectPool(uint256,address) (src/PadLiquidity.sol#316-330):\n[low/medium] reentrancy-benign at src/PadGame.sol:277: Reentrancy in PadGame.roll() (src/PadGame.sol#277-313):\n[low/medium] reentrancy-benign at src/PadGame.sol:317: Reentrancy in PadGame.bailOut(uint256) (src/PadGame.sol#317-349):\n[low/medium] reentrancy-benign at src/KingOfThePad.sol:61: Reentrancy in KingOfThePad.takeCrown(uint256) (src/KingOfThePad.sol#61-112):\n[low/medium] reentrancy-benign at src/PvPPad.sol:147: Reentrancy in PvPPad.openPad(bytes32) (src/PvPPad.sol#147-158):\n[low/medium] reentrancy-benign at src/PvPPad.sol:276: Reentrancy in PvPPad._upkeep(address) (src/PvPPad.sol#276-297):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:179: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256) (src/PadLiquidity.sol#179-216):\n[low/medium] reentrancy-benign at src/PadLiquidity.sol:356: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#356-370):\n[low/medium] reentrancy-benign at src/PadGame.sol:277: Reentrancy in PadGame.roll() (src/PadGame.sol#277-313):\n[low/medium] reentrancy-benign at src/PvPPad.sol:147: Reentrancy in PvPPad.openPad(bytes32) (src/PvPPad.sol#147-158):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:356: Reentrancy in PadLiquidity.burnChunk() (src/PadLiquidity.sol#356-370):\n[low/medium] reentrancy-events at src/PadGame.sol:644: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#644-713):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:286: Reentrancy in PadLiquidity._collect(uint256,address) (src/PadLiquidity.sol#286-308):\n[low/medium] reentrancy-events at src/PvPPad.sol:214: Reentrancy in PvPPad.takeCarry(uint256,uint256) (src/PvPPad.sol#214-221):\n[low/medium] reentrancy-events at src/PadGame.sol:277: Reentrancy in PadGame.roll() (src/PadGame.sol#277-313):\n[low/medium] reentrancy-events at src/PadGame.sol:190: Reentrancy in PadGame.enter() (src/PadGame.sol#190-204):\n[low/medium] reentrancy-events at src/PadGame.sol:644: Reentrancy in PadGame._finalize(address) (src/PadGame.sol#644-713):\n[low/medium] reentrancy-events at src/KingOfThePad.sol:61: Reentrancy in KingOfThePad.takeCrown(uint256) (src/KingOfThePad.sol#61-112):\n[low/medium] reentrancy-events at src/PvPPad.sol:228: Reentrancy in PvPPad.fundGames(uint256) (src/PvPPad.sol#228-259):\n[low/medium] reentrancy-events at src/PadLiquidity.sol:179: Reentrancy in PadLiquidity.graduate(uint256,address,uint256,uint","passed":true},{"durationMs":520,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PadLiquidity.sol:147: `abi.encodePacked()` Hash Collision\n[high] incorrect-caret-operator at src/libs/PadLib.sol:86: Incorrect use of caret operator\n[high] reentrancy-state-change at src/KingOfThePad.sol:62: Reentrancy: State change after external call (21 places)\n[high] unsafe-casting at src/PadLiquidity.sol:291: Unsafe Casting of integers (2 places)\n[low] costly-loop at src/PadGame.sol:248: Costly operations inside loop (4 places)\n[low] large-numeric-literal at src/KingOfThePad.sol:19: Large Numeric Literal (21 places)\n[low] literal-instead-of-constant at src/KingOfThePad.sol:72: Literal Instead of Constant (55 places)\n[low] missing-inheritance at src/KingOfThePad.sol:16: Missing Inheritance (4 places)\n[low] require-revert-in-loop at src/PadLiquidity.sol:261: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/PvPPad.sol:103: State Change Without Event (4 places)\n[low] state-no-address-check at src/PadGame.sol:178: Address State Variable Set Without Checks (4 places)\n[low] state-variable-could-be-immutable at src/PadLiquidity.sol:76: State Variable Could Be Immutable (3 places)\n[low] storage-array-length-not-cached at src/PadGame.sol:337: Storage Array Length not Cached\n[low] unchecked-return at src/PadGame.sol:383: Unchecked Return (5 places)\n[low] uninitialized-local-variable at src/PadGame.sol:248: Uninitialized Local Variable (7 places)\n[low] unsafe-erc20-operation at src/KingOfThePad.sol:88: Unsafe ERC20 Operation (13 places)\n[low] unused-error at src/interfaces/PadErrors.sol:14: Unused Error (3 places)\n[low] unused-public-function at src/PadGame.sol:436: Public Function Not Used Internally (3 places)","passed":true},{"durationMs":9377,"exitCode":0,"name":"proof eda71ad0cb97","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.73s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-57f319e6/Proof_eda71ad0cb97.t.sol:PushStipendProofTest\n[PASS] test_pushLandsForBridgedTokenShapeWithOneExtraStorageRead() (gas: 951616)\nLogs:\n  transfer to fresh holder, gas including call overhead: 44735\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 305.40µs (179.91µs CPU time)\n\nRan 1 test suite in 5.50ms (305.40µs 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":"728519b353237589d53b89f88ba779060642f51afe5580c042f1602765fa5503","verifiedTreeHash":"807969fe83c21ecdb9526c7cb382ecd95163bb13","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":212440,"exitCode":0,"name":"build","output":"Compiling 108 files with Solc 0.8.26\nSolc 0.8.26 finished in 212.30s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Adversarial.t.sol:28:28:\n   |\n28 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/AuditV3.t.sol:49:28:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/AuditV3CarryUpkeep.t.sol:137:9:\n    |\n137 |         uint256 value = entry ? 0.5 ether : 1 ether;\n    |         ^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Revision.t.sol:41:28:\n   |\n41 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/AuditV3.t.sol:49:5:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":10595,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/PushStipend.t.sol:PushStipendTest\n[PASS] test_pushLandsForBeaconProxiedTokenWithExtraChecksAndKeepsHalfTheStipendSpare() (gas: 175133)\nLogs:\n  beacon-proxied OZ4 transfer with two extra reads, fresh holder, gas: 49127\n\n[PASS] test_pushStillBoundsAGasEatingRecipientToTheStipend() (gas: 468389)\n[PASS] test_pushToAnExistingHolderLandsToo() (gas: 144694)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 744.39µs (470.22µs CPU time)\n\nRan 2 tests for test/IMDMathProperties.t.sol:IMDMathPropertiesTest\n[PASS] testFuzz_mulDivSatisfiesExactFloorInequalities(uint256,uint256,uint256) (runs: 1000, μ: 11205, ~: 11250)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457584007913129637240\n\n[PASS] test_mulDivFullWidthAndZeroBoundaries() (gas: 35919)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 13.34ms (13.37ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1342703)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 393876)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 9666347)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1339668)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 1153081)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 1071330)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 10854564)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 723699)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 10447550)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1392177)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1270347)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 4504294)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35045)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168248)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 48.78ms (19.95ms CPU time)\n\nRan 4 tests for test/V3FailureEdges.t.sol:V3PoolFailureEdgesTest\n[PASS] test_onlyCrownMayRequestStrictSettlementAndIndexErrorsDoNotChangeHealth() (gas: 171273)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 878449)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3205352)\n[PASS] test_tokenTransferFailureBecomesClaimableWithoutBlockingCollection() (gas: 1264954)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 57.28ms (4.12ms CPU time)\n\nRan 7 tests for test/IMDAuthorityAndBail.t.sol:IMDAuthorityAndBailTest\n[PASS] test_aliveBailAtOneSecondBeforeDeathQualifiesExactlyOnce() (gas: 2887615)\n[PASS] test_bailAfterDeathDoesNotQualify() (gas: 2865392)\n[PASS] test_bailAtExactDeathDoesNotQualify() (gas: 2865502)\n[PASS] test_extraCalldataCannotSelectVictimForEntryRollOrDonations() (gas: 2409370)\n[PASS] test_extraCalldataCannotSelectVictimForKingBid() (gas: 9453515)\n[PASS] test_sixAliveBailsCannotPullCarryWhenNoRankableRecipientRemains() (gas: 7295139)\n[PASS] test_unregisteredCopyOfGameCannotPullEvenWithVictimApproval() (gas: 160352)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 69.48ms (21.24ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 122303949)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12017515\n  Later openPad including hook and genesis gas: 900486\n  Combined manifest and later opening gas: 12918001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 70.39ms (70.21ms CPU time)\n\nRan 2 tests for test/IMDBurnOrders.t.sol:IMDBurnOrdersTest\n[PASS] test_coinFirstBurnIsOneHopAndPartialFillRespectsLimit() (gas: 21363006)\n[PASS] test_imdFirstBurnIsOneHopAndPartialFillRespectsLimit() (gas: 17333562)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 81.39ms (77.73ms CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3345795)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 11681268)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 27171590)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 7001986)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 2253736)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 90.99ms (32.52ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 3025284)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7420334)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 548269)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1414570)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2835745)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 12337097)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 5911586\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 2424129)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 143.29ms (99.96ms CPU time)\n\nRan 9 tests for test/IMDAtomicity.t.sol:IMDAtomicityTest\n[PASS] testFuzz_badPullReturnOrReceiptRollsBackFiniteAllowance(uint8,uint8) (runs: 128, μ: 3401020, ~: 3349972)\nLogs:\n  Bound result 3\n\n[PASS] test_failedBurnSettlementRestoresBucketTimestampAndPoolPrice() (gas: 12238996)\n[PASS] test_rollInnerBurnShortReceiptRollsBackCoinsCurveNonceAndAllowance() (gas: 5572463)\n[PASS] test_secondEntryInnerBurnShortReceiptRevertsEntireEntry() (gas: 3958440)\n[PASS] test_shortCarryPullCannotPartiallyFinalizeOrPayWinners() (gas: 17097666)\n[PASS] test_shortGraduationPullPreservesLockedCoinsAndPoolAbsence() (gas: 8424535)\n[PASS] test_shortKingBurnPullRevertsRefundAndReignSettlement() (gas: 13942863)\n[PASS] test_shortKingGamesPullRevertsRefundAndReignSettlement() (gas: 13901883)\n[PASS] test_shortManagerSettlementRollsBackPoolInitializationAndUnlock() (gas: 8701301)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 240.56ms (247.77ms CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2300263)\n[PASS] test_claimableWinner() (gas: 3309803)\n[PASS] test_conservationOfEth() (gas: 6924624)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 59327)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2695222)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2871215)\n[PASS] test_deathAndAllDeadEnd() (gas: 2226004)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1876939)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2826620)\n[PASS] test_failedPushBecomesClaimable() (gas: 2006020)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 6232285)\n[PASS] test_finalizeRanksAndPays() (gas: 5478374)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 2030055)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 163416219)\n[PASS] test_finalizerFeeCapped() (gas: 15337393)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 2204222)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 425742)\n[PASS] test_fundPotOnlyPad() (gas: 104086)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 25079091)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 4293835)\n[PASS] test_graduateOnlyFromGame() (gas: 132984)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 9125070)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1607320)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4864659)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 10832860)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 8615953)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2680143)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 2482484)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 2079431)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 2041855)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1664198)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1596836)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3555965)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1750024)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3086479)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 337.33ms (163.59ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 58790917)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 6259637)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 102348)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 266738\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 103864)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 104193)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 77565819)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 503.71ms (547.90ms CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10679178)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11665018)\n[PASS] test_claimNothingReverts() (gas: 8144324)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 17755850)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 21987305)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 28601567)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9766218)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10832348)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 12662800)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 176168064)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4394041\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 41872550)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 25374260)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 21931014)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9687188)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10626580)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 8050665)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9670851)\n[PASS] test_launchViewsRejectIdZero() (gas: 33276)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9879940)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 18076339)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 17516004)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 16989906)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78166)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7962107)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 8003968)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396016)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 18161673)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 18509553)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 11411881)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9951481)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 16774801)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12772040)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9605503)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 16824764)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 744.35ms (998.80ms CPU time)\n\nRan 8 tests for test/V4Edges.t.sol:V4EdgesTest\n[PASS] testFuzz_bailPayoutFormulaAndCurveLedger(uint8,uint8,uint96) (runs: 256, μ: 5763848, ~: 5252622)\nLogs:\n  Bound result 4\n  Bound result 683893554526737891\n\n[PASS] test_bailOutRefusedAfterBellAndAfterHardEnd() (gas: 2638387)\n[PASS] test_bailOutRefusedAtHardEndEvenWithLiveActivity() (gas: 6115406)\n[PASS] test_erasedSeatOneBelowCapNeverRingsTheBell() (gas: 2739935)\n[PASS] test_everySeatBailingOutEndsTheGameAtOnceAndFailsGraduation() (gas: 4391860)\n[PASS] test_expiredPendingRollOfErasedSeatPaysTipToPotWithNoEffect() (gas: 2983587)\n[PASS] test_kingSplitIgnoresGameWithErasedSeatBelowFive() (gas: 5919917)\n[PASS] test_seatedWalletWithoutCoinsBailsForZeroAndMinOutOneReverts() (gas: 3016130)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 750.61ms (650.74ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 22333804)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 29544842)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16802)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 18078806)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 19214134)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8738142)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 19367453)\nLogs:\n  curve ETH raised: 220500000000000000000\n  sybil net outlay before the dump: 199225000000000000001\n  dump proceeds: 133542968727184882968\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 17507584)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 17399096)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.50s (371.09ms CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 128565258, ~: 120452603)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 3030259)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 13795094)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 117124311)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 5614896)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 84129703)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.15s (2.25s CPU time)\n\nRan 8 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 12430896, ~: 10888877)\nLogs:\n  Bound result 3\n\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5570999)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3292618)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3631050)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3550412)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 5649207)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6831)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 2221956)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 2.34s (1.57s 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: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 0\n  Bound result 16000000000000000000\n  Bound result 0\n  Bound result 9990144\n  Bound result 14\n  Bound result 0\n  Bound result 15\n  Bound result 216\n  Bound result 3\n  Bound result 2\n  Bound result 999\n  Bound result 8\n  Bound result 9\n  Bound result 165\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 240\n  Bound result 250\n  Bound result 316\n  Bound result 234\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.32s (3.27s CPU time)\n\nRan 1 test for test/V4BailIMDInvariant.t.sol:V4BailIMDInvariantTest\n[PASS]\nV4BailIMDInvariantTest 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 V4BailIMDInvariantTest invariants (runs: 40, calls: 2400, reverts: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 16\n  Bound result 16\n  Bound result 16\n  Bound result 100000000000000000000\n  Bound result 2\n  Bound result 0\n  Bound result 16000000000000000000\n  Bound result 2092153820047721328744199\n  Bound result 9990144\n  Bound result 14\n  Bound result 0\n  Bound result 15\n  Bound result 216\n  Bound result 3\n  Bound result 2\n  Bound result 999\n  Bound result 8\n  Bound result 685\n  Bound result 165\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 216\n  Bound result 0\n  Bound result 240\n  Bound result 150\n  Bound result 38\n  Bound result 234\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.82s (3.78s CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 7311785)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2949438)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 22362684)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7572195\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 919915)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 594283)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 27861371)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 58\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6943528)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 4.20s (2.54s CPU time)\n\nRan 7 tests for test/IMDBudgetRevision.t.sol:IMDBudgetRevisionTest\n[PASS] testFuzz_pushBoundsRecipientWorkAndParksInsteadOfReverting(uint32) (runs: 256, μ: 679276, ~: 663155)\nLogs:\n  Bound result 32\n\n[PASS] test_bidBelowTheSettlementFloorRevertsWithTheGasErrorNotMidway() (gas: 185882)\n[PASS] test_eatenRankPayoutIsParkedAndClaimableOnceTheRecipientBehaves() (gas: 277968415)\n[PASS] test_endlessRecipientCostsExactlyOneStipendAndZeroAmountCostsNoCall() (gas: 723025)\n[PASS] test_leastBidGasSettlesSixteenPoolsWhenTheOutgoingKingEatsEveryPush() (gas: 83907987)\nLogs:\n  least outer gas for a bid that settles sixteen pools: 7771501\n\n[PASS] test_optionalUpkeepStillSettlesTwoPoolsWhenBothCollectionsEatTheirIMDPush() (gas: 29691357)\n[PASS] test_twoHundredSeatFinalizeWithEveryRankPushEatenFitsTheBlock() (gas: 26648342)\nLogs:\n  finalize gas, 200 living seats, every rank push eaten: 15341137\n\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 4.40s (1.70s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35216)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 20479003)\nLogs:\n  takeCrown gas, eighteen real pools: 2828401\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 17294502)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 23988490)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 18167298)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 16864593)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8886614)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10915684)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 17728314)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.80s (1.61s CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 12302429, ~: 12890817)\nLogs:\n  Bound result 5\n  Bound result 61453\n  Bound result 396000000000000007041\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.81s (4.78s CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107427)\n[PASS] test_bindingsAreOneShot() (gas: 87718)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 19716210)\n[PASS] test_closedPadRevertsEverything() (gas: 97341)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 689643)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33037)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 20930421)\n[PASS] test_fundGamesOnlyKing() (gas: 121439)\n[PASS] test_hookRejectsForeignInitialize() (gas: 8091115)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 17578699)\n[PASS] test_launchValidatesStrings() (gas: 16759198)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7961415)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7994869)\n[PASS] test_openPadOnlyOnce() (gas: 8033632)\n[PASS] test_openPadRejectsBadSalt() (gas: 203270)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135025)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8439657)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37365487)\n[PASS] test_templatesCannotBeInitialized() (gas: 8132248)\n[PASS] test_upkeepForOnlyGames() (gas: 8182632)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 4.92s (361.45ms CPU time)\n\nRan 16 tests for test/IMDPad.t.sol:IMDPadTest\n[PASS] testFuzz_unitPricesAndRoundingConserveIMD(uint256) (runs: 64, μ: 10180438, ~: 10180445)\nLogs:\n  Bound result 9900000000000000016\n\n[PASS] test_bothCurrencyOrdersPriceEquivalenceAndPartialFillBurn() (gas: 26573500)\n[PASS] test_currentUnitCapsAFullFillBurn() (gas: 17275376)\n[PASS] test_deadSeatBailDoesNotQualifyFundingAnyMoreThanIdlingDid() (gas: 25108804)\n[PASS] test_everyApplicationTemplateCloneAndHookRejectsETH() (gas: 8317214)\n[PASS] test_failedIMDAndCoinPayoutsCannotBlockCrownOrBatch() (gas: 18623451)\n[PASS] test_lateAliveBailKeepsCarryReleaseWithFourRankableSeats() (gas: 25527008)\n[PASS] test_lateAliveBailWithFiveOtherSurvivors() (gas: 28494060)\n[PASS] test_lateBailCannotClawBackExistingKingFunding() (gas: 25494167)\n[PASS] test_noReturnIMDFullGameGraduationBurnKingAndClaims() (gas: 18742706)\n[PASS] test_pullOnlyTrustedCallersAndEndpointsAlwaysChargeTheirCaller() (gas: 8677682)\n[PASS] test_shortPoolReceiptDoesNotCreateFeeCredits() (gas: 17804880)\n[PASS] test_shortPullsRevertAtomicallyAndDonationsDoNotCreateCredits() (gas: 8989647)\n[PASS] test_soleBuyerSybilWithAliveBailAndFourSurvivorsStillLoses() (gas: 27194382)\nLogs:\n  Sybil loss in IMD wei: 12160243613483469790\n\n[PASS] test_unitBoundsOwnerEventAndSnapshot() (gas: 14402188)\n[PASS] test_unsolicitedIMDDoesNotAlterGraduationPriceOrCredit() (gas: 11771937)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 4.92s (2.08s CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 17528577, ~: 17528531)\nLogs:\n  Bound result 4087171348302965476023\n  Bound result 26856\n  Bound result 1651\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 17963039, ~: 17963091)\nLogs:\n  Bound result 7996000000000000002193\n  Bound result 15204399999999999998588\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 21321672, ~: 17320102)\nLogs:\n  Bound result 3\n  Bound result 1164685330982380889835\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 17345669, ~: 17345702)\nLogs:\n  Bound result 5277882960653981072952\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 13414160, ~: 11969065)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 1123454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 8048061, ~: 8048287)\nLogs:\n  Bound result 16331\n  Bound result 8597\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 8027191, ~: 8026699)\nLogs:\n  Bound result 34887259606489863546174\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 8049035, ~: 8049101)\nLogs:\n  Bound result 404284521931462223\n  Bound result 198058407257799441046\n  Bound result 1801941592742261523603\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 16356935, ~: 15024013)\nLogs:\n  Bound result 9\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.92s (30.22s 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 500000000000000000\n  Bound result 40000000000000000000000\n  Bound result 16\n  Bound result 0\n  Bound result 500000\n  Bound result 528669\n  Bound result 5275559\n  Bound result 6640\n  Bound result 2620984\n  Bound result 6028\n  Bound result 51966\n  Bound result 6519\n  Bound result 2\n  Bound result 63\n  Bound result 24000000000000000000000\n  Bound result 5465536\n  Bound result 1058760442193818\n  Bound result 5410447\n  Bound result 2127945\n  Bound result 5411854\n  Bound result 12966\n  Bound result 12437\n  Bound result 3599998\n  Bound result 1599999\n  Bound result 6\n  Bound result 8963\n  Bound result 716782\n  Bound result 5400161\n  Bound result 4192723\n  Bound result 4697\n  Bound result 15\n  Bound result 7477639625207\n  Bound result 69724145386735718841498\n  Bound result 15834\n  Bound result 14014\n  Bound result 8562\n  Bound result 1067764\n  Bound result 874\n  Bound result 7800000\n  Bound result 415154087980144090\n  Bound result 82882052170174673799431\n  Bound result 5\n  Bound result 39999999999999266\n  Bound result 11484\n  Bound result 1507695\n  Bound result 11000\n  Bound result 1934\n  Bound result 459253\n  Bound result 40000000000000000\n  Bound result 18355023563429206\n  Bound result 3276230\n  Bound result 31\n  Bound result 39999999999999971\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.15s (5.09s 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 28\n  Bound result 0\n  Bound result 11\n  Bound result 61\n  Bound result 83\n  Bound result 5\n  Bound result 21\n  Bound result 6\n  Bound result 1\n  Bound result 1\n  Bound result 40\n  Bound result 48\n  Bound result 9\n  Bound result 37\n  Bound result 5\n  Bound result 64\n  Bound result 28\n  Bound result 30\n  Bound result 3\n  Bound result 3\n  Bound result 89\n  Bound result 8\n  Bound result 30\n  Bound result 15\n  Bound result 50\n  Bound result 47\n  Bound result 8\n  Bound result 12\n  Bound result 1\n  Bound result 0\n  Bound result 8\n  Bound result 35\n  Bound result 37\n  Bound result 24\n  Bound result 17\n  Bound result 9\n  Bound result 24\n  Bound result 18\n  Bound result 25\n  Bound result 11\n  Bound result 14\n  Bound result 76\n  Bound result 26\n  Bound result 2\n  Bound result 16\n  Bound result 84\n  Bound result 43\n  Bound result 35\n  Bound result 1\n  Bound result 31\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.46s (6.42s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1923274, ~: 1931828)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2501825)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 54734246)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 4288100)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1619318\n  roll with both liquidity upkeep stipends exhausted: 1752826\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3279258)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.36s (7.38s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 32497562, ~: 27245614)\nLogs:\n  Bound result 9\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 117419314)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2688595\n  5000-entry draw total gas: 16272475\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 86617813)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 578198)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 791204)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 9787606)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1693003)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5732752)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 941892)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 876998)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 82455613)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526729)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 83272421)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 135380744)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 2624002)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 7.36s (11.36s CPU time)\n\nRan 1 test for test/IMDCustodyInvariant.t.sol:IMDCustodyInvariantTest\n[PASS]\nIMDCustodyInvariantTest invariants:\n[PASS] invariant_IMDAndEveryCoinAreConserved\n[PASS] invariant_eachCustodianBacksItsOwnDebtsAndSurplus\n[PASS] invariant_unitsLocksAndTerminalStatesStayConsistent\n IMDCustodyInvariantTest invariants (runs: 96, calls: 6912, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| IMDCustodyHandler | bail           | 561   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | burnAndCollect | 533   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | claim          | 561   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | createGame     | 578   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | crownBid       | 563   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | donate         | 639   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | finish         | 584   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | fund           | 593   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | roll           | 578   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | setUnit        | 554   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | tick           | 600   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | trade          | 568   | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 11\n  Bound result 11\n  Bound result 11\n  Bound result 11\n  Bound result 10000000000000000\n  Bound result 100000000000000000000\n  Bound result 2000000000000000000\n  Bound result 91\n  Bound result 260\n  Bound result 9911000000000000001\n  Bound result 970000000000000000\n  Bound result 73\n  Bound result 0\n  Bound result 9900000000000017210\n  Bound result 66\n  Bound result 12\n  Bound result 233\n  Bound result 2943\n  Bound result 1871\n  Bound result 9038\n  Bound result 62\n  Bound result 143\n  Bound result 32\n  Bound result 42\n  Bound result 5000\n  Bound result 7386\n  Bound result 9900000000000002588\n  Bound result 72\n  Bound result 253\n  Bound result 80\n  Bound result 9900000000000019279\n  Bound result 77\n  Bound result 87\n  Bound result 9900000000000000064\n  Bound result 3000000\n  Bound result 16\n  Bound result 121\n  Bound result 4219870996\n  Bound result 478\n  Bound result 3600\n  Bound result 8240956896892313231\n  Bound result 9900000000000018271\n  Bound result 840000000000000000\n  Bound result 2\n  Bound result 87\n  Bound result 180\n  Bound result 80\n  Bound result 242\n  Bound result 17189\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.05s (10.01s CPU time)\n\nRan 1 test for test/IMDCustodyInvariant.t.sol:IMDNoReturnCustodyInvariantTest\n[PASS]\nIMDNoReturnCustodyInvariantTest invariants:\n[PASS] invariant_IMDAndEveryCoinAreConserved\n[PASS] invariant_eachCustodianBacksItsOwnDebtsAndSurplus\n[PASS] invariant_unitsLocksAndTerminalStatesStayConsistent\n IMDNoReturnCustodyInvariantTest invariants (runs: 96, calls: 6912, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| IMDCustodyHandler | bail           | 561   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | burnAndCollect | 533   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | claim          | 561   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | createGame     | 578   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | crownBid       | 563   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | donate         | 639   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | finish         | 584   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | fund           | 593   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | roll           | 578   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | setUnit        | 554   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | tick           | 600   | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| IMDCustodyHandler | trade          | 568   | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 11\n  Bound result 11\n  Bound result 11\n  Bound result 11\n  Bound result 10000000000000000\n  Bound result 100000000000000000000\n  Bound result 2000000000000000000\n  Bound result 91\n  Bound result 260\n  Bound result 9911000000000000001\n  Bound result 970000000000000000\n  Bound result 73\n  Bound result 0\n  Bound result 9900000000000017183\n  Bound result 66\n  Bound result 12\n  Bound result 244\n  Bound result 2626\n  Bound result 1858\n  Bound result 8868\n  Bound result 63\n  Bound result 143\n  Bound result 32\n  Bound result 73\n  Bound result 5000\n  Bound result 7494\n  Bound result 9900000000000003142\n  Bound result 72\n  Bound result 253\n  Bound result 80\n  Bound result 8176802336277457359\n  Bound result 77\n  Bound result 87\n  Bound result 9900000000000000064\n  Bound result 3000000\n  Bound result 16\n  Bound result 200\n  Bound result 519\n  Bound result 2040\n  Bound result 3600\n  Bound result 8240956896892313229\n  Bound result 9900000000000018301\n  Bound result 840000000000000000\n  Bound result 2\n  Bound result 20\n  Bound result 226\n  Bound result 11\n  Bound result 242\n  Bound result 17188\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 10.43s (10.39s CPU time)\n\nRan 32 test suites in 10.44s (96.05s CPU time): 258 tests passed, 0 failed, 0 skipped (258 total tests)\n","passed":true},{"durationMs":127,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown(uint256)\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot(uint256)\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim(address)\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.creditBurn(address,uint256)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn(uint256)\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256)\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"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.burn(uint256)\",\"PvPPad.fundCarry(uint256)\",\"PvPPad.fundGames(uint256)\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.pull(address,uint256)\",\"PvPPad.restartGenesis()\",\"PvPPad.setUnit(uint256)\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":50,\"README.md\":168,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT-V4-ETH-HISTORY.md\":476,\"docs/AUDIT.md\":220,\"docs/TEST-REPORT.md\":138,\"docs/VERIFY.md\":55,\"foundry.toml\":22,\"launch.json\":38,\"remappings.txt\":2,\"src/KingOfThePad.sol\":139,\"src/PadGame.sol\":806,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":507,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":353,\"src/interfaces/Interfaces.sol\":128,\"src/interfaces/PadErrors.sol\":79,\"src/libs/PadLib.sol\":153,\"test/Adversarial.t.sol\":802,\"test/AtomicDeployment.t.sol\":124,\"test/AuditV3.t.sol\":406,\"test/AuditV3CarryUpkeep.t.sol\":192,\"test/Base.t.sol\":224,\"test/CrownSettlement.t.sol\":253,\"test/Fuzz.t.sol\":290,\"test/Game.t.sol\":762,\"test/IMD-INDEPENDENT-TEST-REPORT.md\":144,\"test/IMDAtomicity.t.sol\":246,\"test/IMDAuthorityAndBail.t.sol\":168,\"test/IMDBudgetRevision.t.sol\":316,\"test/IMDBurnOrders.t.sol\":86,\"test/IMDCustodyInvariant.t.sol\":418,\"test/IMDMathProperties.t.sol\":53,\"test/IMDPad.t.sol\":437,\"test/Invariants.t.sol\":608,\"test/King.t.sol\":316,\"test/LiquidityV4.t.sol\":252,\"test/Pad.t.sol\":300,\"test/PushStipend.t.sol\":159,\"test/Raffle.t.sol\":425,\"test/RaffleEdges.t.sol\":274,\"test/RealV4.sol\":95,\"test/Revision.t.sol\":265,\"test/V3-CONTRIBUTOR-REPORT.md\":129,\"test/V3AccountingActors.sol\":22,\"test/V3CarryProperties.t.sol\":131,\"test/V3FailureEdges.t.sol\":356,\"test/V3KingFeesInvariant.t.sol\":254,\"test/V3ResolverInvariant.t.sol\":216,\"test/V4-CONTRIBUTOR-REPORT.md\":43,\"test/V4BailIMDInvariant.t.sol\":36,\"test/V4Edges.t.sol\":271,\"test/V4Pad.t.sol\":298,\"test/mocks/IMD.sol\":113,\"test/mocks/Mocks.sol\":37,\"test/mocks/RoutedIMD.sol\":94,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"860c180315a4ebad82a7ed7827eff14c54157728de698bbf7d1a844dc91f8dfc","verifiedTreeHash":"36e33dea15ce58e5d34f1c58eea70c51fb54b46d","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":157582,"exitCode":0,"name":"build","output":"Compiling 101 files with Solc 0.8.26\nSolc 0.8.26 finished in 157.45s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Adversarial.t.sol:28:28:\n   |\n28 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/AuditV3.t.sol:49:28:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/AuditV3CarryUpkeep.t.sol:137:9:\n    |\n137 |         uint256 value = entry ? 0.5 ether : 1 ether;\n    |         ^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Revision.t.sol:41:28:\n   |\n41 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/AuditV3.t.sol:49:5:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":7864,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/PushStipend.t.sol:PushStipendTest\n[PASS] test_pushLandsForBeaconProxiedTokenWithExtraChecksAndKeepsHalfTheStipendSpare() (gas: 175133)\nLogs:\n  beacon-proxied OZ4 transfer with two extra reads, fresh holder, gas: 49127\n\n[PASS] test_pushStillBoundsAGasEatingRecipientToTheStipend() (gas: 468389)\n[PASS] test_pushToAnExistingHolderLandsToo() (gas: 144694)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.37ms (619.20µs CPU time)\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3345795)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 11681268)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 27171590)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 7001986)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 2253736)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 43.98ms (18.46ms CPU time)\n\nRan 4 tests for test/V3FailureEdges.t.sol:V3PoolFailureEdgesTest\n[PASS] test_onlyCrownMayRequestStrictSettlementAndIndexErrorsDoNotChangeHealth() (gas: 171273)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 878449)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3205352)\n[PASS] test_tokenTransferFailureBecomesClaimableWithoutBlockingCollection() (gas: 1264954)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 47.42ms (2.93ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1342703)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 393876)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 9666347)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1339668)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 1153081)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 1071330)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 10854564)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 723699)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 10447550)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1392177)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1270347)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 4504294)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35045)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168248)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 51.83ms (17.64ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 122303949)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12017515\n  Later openPad including hook and genesis gas: 900486\n  Combined manifest and later opening gas: 12918001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 118.17ms (117.99ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 22333804)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 29544842)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16802)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 18078806)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 19214134)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8738142)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 19367453)\nLogs:\n  curve ETH raised: 220500000000000000000\n  sybil net outlay before the dump: 199225000000000000001\n  dump proceeds: 133542968727184882968\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 17507584)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 17399096)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 297.94ms (344.98ms CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107427)\n[PASS] test_bindingsAreOneShot() (gas: 87718)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 19716210)\n[PASS] test_closedPadRevertsEverything() (gas: 97341)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 689643)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33037)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 20930421)\n[PASS] test_fundGamesOnlyKing() (gas: 121439)\n[PASS] test_hookRejectsForeignInitialize() (gas: 8091115)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 17578699)\n[PASS] test_launchValidatesStrings() (gas: 16759198)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7961415)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7994869)\n[PASS] test_openPadOnlyOnce() (gas: 8033632)\n[PASS] test_openPadRejectsBadSalt() (gas: 203270)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135025)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8439657)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37365487)\n[PASS] test_templatesCannotBeInitialized() (gas: 8132248)\n[PASS] test_upkeepForOnlyGames() (gas: 8182632)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 464.91ms (461.14ms CPU time)\n\nRan 8 tests for test/V4Edges.t.sol:V4EdgesTest\n[PASS] testFuzz_bailPayoutFormulaAndCurveLedger(uint8,uint8,uint96) (runs: 256, μ: 5769467, ~: 5252841)\nLogs:\n  Bound result 4\n  Bound result 683893554526737891\n\n[PASS] test_bailOutRefusedAfterBellAndAfterHardEnd() (gas: 2638387)\n[PASS] test_bailOutRefusedAtHardEndEvenWithLiveActivity() (gas: 6115406)\n[PASS] test_erasedSeatOneBelowCapNeverRingsTheBell() (gas: 2739935)\n[PASS] test_everySeatBailingOutEndsTheGameAtOnceAndFailsGraduation() (gas: 4391860)\n[PASS] test_expiredPendingRollOfErasedSeatPaysTipToPotWithNoEffect() (gas: 2983587)\n[PASS] test_kingSplitIgnoresGameWithErasedSeatBelowFive() (gas: 5919917)\n[PASS] test_seatedWalletWithoutCoinsBailsForZeroAndMinOutOneReverts() (gas: 3016130)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 788.83ms (753.32ms CPU time)\n\nRan 16 tests for test/IMDPad.t.sol:IMDPadTest\n[PASS] testFuzz_unitPricesAndRoundingConserveIMD(uint256) (runs: 64, μ: 10180435, ~: 10180440)\nLogs:\n  Bound result 9900000000000023001\n\n[PASS] test_bothCurrencyOrdersPriceEquivalenceAndPartialFillBurn() (gas: 26573500)\n[PASS] test_currentUnitCapsAFullFillBurn() (gas: 17275376)\n[PASS] test_deadSeatBailDoesNotQualifyFundingAnyMoreThanIdlingDid() (gas: 25108804)\n[PASS] test_everyApplicationTemplateCloneAndHookRejectsETH() (gas: 8317214)\n[PASS] test_failedIMDAndCoinPayoutsCannotBlockCrownOrBatch() (gas: 18623451)\n[PASS] test_lateAliveBailKeepsCarryReleaseWithFourRankableSeats() (gas: 25527008)\n[PASS] test_lateAliveBailWithFiveOtherSurvivors() (gas: 28494060)\n[PASS] test_lateBailCannotClawBackExistingKingFunding() (gas: 25494167)\n[PASS] test_noReturnIMDFullGameGraduationBurnKingAndClaims() (gas: 18742706)\n[PASS] test_pullOnlyTrustedCallersAndEndpointsAlwaysChargeTheirCaller() (gas: 8677682)\n[PASS] test_shortPoolReceiptDoesNotCreateFeeCredits() (gas: 17804880)\n[PASS] test_shortPullsRevertAtomicallyAndDonationsDoNotCreateCredits() (gas: 8989647)\n[PASS] test_soleBuyerSybilWithAliveBailAndFourSurvivorsStillLoses() (gas: 27194382)\nLogs:\n  Sybil loss in IMD wei: 12160243613483469790\n\n[PASS] test_unitBoundsOwnerEventAndSnapshot() (gas: 14402188)\n[PASS] test_unsolicitedIMDDoesNotAlterGraduationPriceOrCredit() (gas: 11771937)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 1.35s (1.83s CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 128859661, ~: 123527356)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 3030259)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 13795094)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 117124311)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 5614896)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 84129703)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.97s (2.08s 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: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 0\n  Bound result 7999999999999999990\n  Bound result 0\n  Bound result 9000000000000000000\n  Bound result 14\n  Bound result 0\n  Bound result 160\n  Bound result 142\n  Bound result 0\n  Bound result 3\n  Bound result 9800000000000000000\n  Bound result 8\n  Bound result 453\n  Bound result 66\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 80\n  Bound result 248\n  Bound result 35\n  Bound result 40\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.85s (2.80s CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 7311785)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2949438)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 22362684)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7572195\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 919915)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 594283)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 27861371)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 58\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6943528)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.86s (2.26s CPU time)\n\nRan 1 test for test/V4BailIMDInvariant.t.sol:V4BailIMDInvariantTest\n[PASS]\nV4BailIMDInvariantTest 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 V4BailIMDInvariantTest invariants (runs: 40, calls: 2400, reverts: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 16\n  Bound result 16\n  Bound result 16\n  Bound result 100000000000000000000\n  Bound result 2\n  Bound result 0\n  Bound result 7999999999999999990\n  Bound result 999000000000000000000\n  Bound result 9000000000000000000\n  Bound result 14\n  Bound result 0\n  Bound result 160\n  Bound result 142\n  Bound result 0\n  Bound result 3\n  Bound result 9800000000000000000\n  Bound result 1\n  Bound result 640\n  Bound result 66\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 80\n  Bound result 63\n  Bound result 664\n  Bound result 40\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.74s (3.71s CPU time)\n\nRan 8 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 12395115, ~: 10888859)\nLogs:\n  Bound result 3\n\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5570999)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3292618)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3631050)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3550412)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 5649207)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6831)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 2221956)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 3.84s (1.39s CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 58790917)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 6259637)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 102348)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 266738\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 103864)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 104193)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 77565819)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 3.94s (561.59ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 12673661, ~: 12904985)\nLogs:\n  Bound result 3\n  Bound result 1048576\n  Bound result 396000000000000007041\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.15s (4.12s 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 500000000000000000\n  Bound result 40000000000000000000000\n  Bound result 16\n  Bound result 0\n  Bound result 500000\n  Bound result 592867\n  Bound result 5275559\n  Bound result 6640\n  Bound result 5400051\n  Bound result 6028\n  Bound result 48879\n  Bound result 6519\n  Bound result 30\n  Bound result 600000\n  Bound result 30000000000000000000\n  Bound result 5465536\n  Bound result 1058760442193818\n  Bound result 5411518\n  Bound result 5400256\n  Bound result 5411880\n  Bound result 13109\n  Bound result 12354\n  Bound result 5412213\n  Bound result 2197979\n  Bound result 1500\n  Bound result 10194\n  Bound result 716782\n  Bound result 2964335\n  Bound result 5401905\n  Bound result 4634\n  Bound result 7\n  Bound result 7477639625207\n  Bound result 69601514769409742621282\n  Bound result 15777\n  Bound result 16409\n  Bound result 9175\n  Bound result 5286690\n  Bound result 47683\n  Bound result 800000000000000000000\n  Bound result 415154087980144090\n  Bound result 86691127585762788075851\n  Bound result 15\n  Bound result 39999999999950001\n  Bound result 32777374055316348\n  Bound result 1507695\n  Bound result 3600\n  Bound result 2136\n  Bound result 4856791\n  Bound result 33\n  Bound result 18355023563429206\n  Bound result 5400201\n  Bound result 31\n  Bound result 39999999999989001\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.20s (4.17s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1923180, ~: 1931828)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2501825)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 54734246)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 4288100)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1619318\n  roll with both liquidity upkeep stipends exhausted: 1752826\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3279258)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 4.34s (4.34s CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2300263)\n[PASS] test_claimableWinner() (gas: 3309803)\n[PASS] test_conservationOfEth() (gas: 6924624)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 59327)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2695222)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2871215)\n[PASS] test_deathAndAllDeadEnd() (gas: 2226004)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1876939)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2826620)\n[PASS] test_failedPushBecomesClaimable() (gas: 2006020)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 6232285)\n[PASS] test_finalizeRanksAndPays() (gas: 5478374)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 2030055)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 163416219)\n[PASS] test_finalizerFeeCapped() (gas: 15337393)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 2204222)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 425742)\n[PASS] test_fundPotOnlyPad() (gas: 104086)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 25079091)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 4293835)\n[PASS] test_graduateOnlyFromGame() (gas: 132984)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 9125070)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1607320)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4864659)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 10832860)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 8615953)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2680143)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 2482484)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 2079431)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 2041855)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1664198)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1596836)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3555965)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1750024)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3086479)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 4.48s (233.59ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 3025284)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7420334)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 548269)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1414570)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2835745)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 12337097)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 5911586\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 2424129)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 4.49s (97.17ms CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 17528607, ~: 17528531)\nLogs:\n  Bound result 4087171348302965476023\n  Bound result 26856\n  Bound result 1651\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 17963001, ~: 17963080)\nLogs:\n  Bound result 7996000000000000002193\n  Bound result 15214199999999999997589\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 20799849, ~: 17320030)\nLogs:\n  Bound result 3\n  Bound result 1164685330982380889835\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 17345677, ~: 17345702)\nLogs:\n  Bound result 19996000000001000000000\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 13465176, ~: 12310085)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 1123454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 8048059, ~: 8048287)\nLogs:\n  Bound result 200000000000000000000\n  Bound result 1999999999999999600001\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 8027187, ~: 8026699)\nLogs:\n  Bound result 39999999999999999999998\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 8049020, ~: 8049101)\nLogs:\n  Bound result 11530322463945308858\n  Bound result 762546\n  Bound result 932449631543341630043\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 16341433, ~: 15392610)\nLogs:\n  Bound result 11\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.49s (29.50s CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10679178)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11665018)\n[PASS] test_claimNothingReverts() (gas: 8144324)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 17755850)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 21987305)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 28601567)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9766218)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10832348)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 12662800)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 176168064)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4394041\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 41872550)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 25374260)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 21931014)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9687188)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10626580)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 8050665)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9670851)\n[PASS] test_launchViewsRejectIdZero() (gas: 33276)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9879940)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 18076339)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 17516004)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 16989906)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78166)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7962107)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 8003968)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396016)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 18161673)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 18509553)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 11411881)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9951481)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 16774801)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12772040)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9605503)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 16824764)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 4.49s (1.26s 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 28\n  Bound result 5\n  Bound result 12\n  Bound result 90\n  Bound result 82\n  Bound result 12\n  Bound result 21\n  Bound result 10\n  Bound result 2\n  Bound result 12\n  Bound result 51\n  Bound result 55\n  Bound result 9\n  Bound result 19\n  Bound result 32\n  Bound result 37\n  Bound result 28\n  Bound result 28\n  Bound result 79\n  Bound result 11\n  Bound result 89\n  Bound result 8\n  Bound result 18\n  Bound result 15\n  Bound result 50\n  Bound result 73\n  Bound result 20\n  Bound result 12\n  Bound result 1\n  Bound result 47\n  Bound result 29\n  Bound result 32\n  Bound result 80\n  Bound result 0\n  Bound result 11\n  Bound result 44\n  Bound result 58\n  Bound result 18\n  Bound result 25\n  Bound result 89\n  Bound result 21\n  Bound result 76\n  Bound result 24\n  Bound result 59\n  Bound result 16\n  Bound result 68\n  Bound result 43\n  Bound result 35\n  Bound result 7\n  Bound result 49\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.64s (6.59s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35216)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 20479003)\nLogs:\n  takeCrown gas, eighteen real pools: 2828401\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 17294502)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 23988490)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 18167298)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 16864593)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8886614)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10915684)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 17728314)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 7.71s (1.40s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 28846416, ~: 25050287)\nLogs:\n  Bound result 58\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 117419314)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2688595\n  5000-entry draw total gas: 16272475\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 86617813)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 578198)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 791204)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 9787606)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1693003)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5732752)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 941892)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 876998)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 82455613)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526729)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 83272421)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 135380744)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 2624002)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 7.71s (11.93s CPU time)\n\nRan 25 test suites in 7.72s (75.05s CPU time): 229 tests passed, 0 failed, 0 skipped (229 total tests)\n","passed":true},{"durationMs":81,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown(uint256)\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot(uint256)\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim(address)\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.creditBurn(address,uint256)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn(uint256)\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256)\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"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.burn(uint256)\",\"PvPPad.fundCarry(uint256)\",\"PvPPad.fundGames(uint256)\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.pull(address,uint256)\",\"PvPPad.restartGenesis()\",\"PvPPad.setUnit(uint256)\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":50,\"README.md\":168,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT-V4-ETH-HISTORY.md\":476,\"docs/AUDIT.md\":220,\"docs/TEST-REPORT.md\":138,\"docs/VERIFY.md\":55,\"foundry.toml\":22,\"launch.json\":38,\"remappings.txt\":2,\"src/KingOfThePad.sol\":139,\"src/PadGame.sol\":806,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":507,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":353,\"src/interfaces/Interfaces.sol\":128,\"src/interfaces/PadErrors.sol\":79,\"src/libs/PadLib.sol\":153,\"test/Adversarial.t.sol\":802,\"test/AtomicDeployment.t.sol\":124,\"test/AuditV3.t.sol\":406,\"test/AuditV3CarryUpkeep.t.sol\":192,\"test/Base.t.sol\":224,\"test/CrownSettlement.t.sol\":253,\"test/Fuzz.t.sol\":290,\"test/Game.t.sol\":762,\"test/IMDPad.t.sol\":437,\"test/Invariants.t.sol\":608,\"test/King.t.sol\":316,\"test/LiquidityV4.t.sol\":252,\"test/Pad.t.sol\":300,\"test/PushStipend.t.sol\":159,\"test/Raffle.t.sol\":425,\"test/RaffleEdges.t.sol\":274,\"test/RealV4.sol\":95,\"test/Revision.t.sol\":265,\"test/V3-CONTRIBUTOR-REPORT.md\":129,\"test/V3AccountingActors.sol\":22,\"test/V3CarryProperties.t.sol\":131,\"test/V3FailureEdges.t.sol\":356,\"test/V3KingFeesInvariant.t.sol\":254,\"test/V3ResolverInvariant.t.sol\":216,\"test/V4-CONTRIBUTOR-REPORT.md\":43,\"test/V4BailIMDInvariant.t.sol\":36,\"test/V4Edges.t.sol\":271,\"test/V4Pad.t.sol\":298,\"test/mocks/IMD.sol\":113,\"test/mocks/Mocks.sol\":37,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"907e74a398e8d22f248b7b3585ac34a3663865ee28c0edc9a846ad4d8f5ab516","verifiedTreeHash":"b9dc6311e51e51eb75652fcf9033abeac7fd2eca","verifierVersion":"0.1.0+8fbf00a5"},{"checks":[{"durationMs":197052,"exitCode":0,"name":"build","output":"Compiling 100 files with Solc 0.8.26\nSolc 0.8.26 finished in 196.93s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Adversarial.t.sol:28:28:\n   |\n28 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/AuditV3.t.sol:49:28:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n   --> test/AuditV3CarryUpkeep.t.sol:137:9:\n    |\n137 |         uint256 value = entry ? 0.5 ether : 1 ether;\n    |         ^^^^^^^^^^^^^\n\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> test/Revision.t.sol:41:28:\n   |\n41 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |                            ^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to pure\n  --> test/AuditV3.t.sol:49:5:\n   |\n49 |     function onIMDTransfer(uint256 receivedAmount) external {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":8008,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/AuditV3.t.sol:AuditV3GameTest\n[PASS] test_lapsedSeedIsIndependentOfCallerAndCaptureDelayAndBountyPaidOnce() (gas: 3345795)\n[PASS] test_nonGenesisSplitAndExpiredTipGoesToPotWithPenalty() (gas: 11681268)\n[PASS] test_resolveBatchClampsToSixteenAndLowGasStopsSafely() (gas: 27171590)\n[PASS] test_tenBlocksPerSecondSixtySecondRollerNeverExpiresWithResolver() (gas: 7001986)\n[PASS] test_upkeepSeedBountyGoesToCallerAndNotPad() (gas: 2253736)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 41.82ms (19.17ms CPU time)\n\nRan 1 test for test/AtomicDeployment.t.sol:AtomicDeploymentTest\n[PASS] test_atomicManifestGasIncludingCalldataAndLaterGenesisFitsTarget() (gas: 44828779)\nLogs:\n  Raw CREATE2 manifest gas including calldata and intrinsic: 12016891\n  Later openPad including hook and genesis gas: 900486\n  Combined manifest and later opening gas: 12917377\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 43.76ms (43.55ms CPU time)\n\nRan 14 tests for test/King.t.sol:KingTest\n[PASS] test_burnChunkBuysPvpToDeadEvery10Minutes() (gas: 1342703)\n[PASS] test_burnChunkStopsAtOnePercentPriceMoveAndKeepsTheRest() (gas: 393876)\n[PASS] test_burnWaitsForPvpGraduation() (gas: 9666347)\n[PASS] test_challengeNeedsHoldAnd110Percent() (gas: 1339668)\n[PASS] test_distributeSendsPoolFeesToKing() (gas: 1153081)\n[PASS] test_distributeWithoutKingLeavesFeesInPosition() (gas: 1071330)\n[PASS] test_extraFundsLiveGamesByPotSize() (gas: 10854492)\n[PASS] test_firstBidMinimumAndFullSplit() (gas: 723699)\n[PASS] test_launchAfterGenesisPlaysAndGraduatesIntoOwnPool() (gas: 10447550)\n[PASS] test_refundToRejectingKingIsClaimable() (gas: 1392177)\n[PASS] test_sandwichOnBurnChunkDoesNotPay() (gas: 1270347)\n[PASS] test_takeCrownUpkeepPaysFinalizerFeeToBidder() (gas: 4504307)\n[PASS] test_unlockCallbackOnlyPoolManager() (gas: 35045)\n[PASS] test_upkeepForAcceptsKingContract() (gas: 168248)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 44.66ms (18.31ms CPU time)\n\nRan 4 tests for test/V3FailureEdges.t.sol:V3PoolFailureEdgesTest\n[PASS] test_onlyCrownMayRequestStrictSettlementAndIndexErrorsDoNotChangeHealth() (gas: 171273)\n[PASS] test_retryInsideRealManagerUnlockCannotDiagnoseHealthyPoolAsBroken() (gas: 878449)\n[PASS] test_successBetweenFailuresRequiresThreeNewDistinctBlocksToBreakPool() (gas: 3205352)\n[PASS] test_tokenTransferFailureBecomesClaimableWithoutBlockingCollection() (gas: 1264954)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 55.42ms (4.29ms CPU time)\n\nRan 7 tests for test/AuditV3.t.sol:AuditV3KingTest\n[PASS] test_failedPoolRequiresThreeDistinctL2BlocksThenAnyoneCanRecoverIt() (gas: 3025284)\n[PASS] test_failedSettlementRollsBackEarlierHealthyPoolPayments() (gas: 7420334)\n[PASS] test_firstCrownAlsoRejectsUnlockedManager() (gas: 548269)\n[PASS] test_gasStarvedBidRevertsWithoutChangingCrownOrPoolHealth() (gas: 1414570)\n[PASS] test_outgoingKingGetsLargeTokenFeesInKindAndNextKingGetsNoStash() (gas: 2835745)\n[PASS] test_sixteenPoolsBothCurrenciesAndGasEatingKingFitSettlementBudget() (gas: 11214900)\nLogs:\n  16 real pools both currencies, rejecting king, bid gas used: 4907515\n\n[PASS] test_unlockCallbackCannotTakeCrownOrDistribute() (gas: 2424129)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 131.62ms (97.60ms CPU time)\n\nRan 9 tests for test/Revision.t.sol:RevisionTest\n[PASS] test_carryStaysInPadEvenAfterFiveSeats() (gas: 22333459)\n[PASS] test_freeLaunchesDoNotCrowdEnteredGamesOutOfTheKingWindowOrUpkeep() (gas: 29544471)\n[PASS] test_fullRangeSqrtPriceConstantsMatchTickMath() (gas: 16802)\n[PASS] test_liquidityClaimLockIsSeparateFromThePoolGuard() (gas: 18078435)\n[PASS] test_outgoingKingIsPaidEvenWhenTheBidComesFromInsideLiquidityClaim() (gas: 19213763)\n[PASS] test_seatedEventUsesTheSameOneBasedIndexesAsTheViews() (gas: 8738142)\n[PASS] test_soleBuyerSybilLosesMoneyEvenAfterDumpingEveryTokenAndTakingTheCappedRelease() (gas: 19367113)\nLogs:\n  curve ETH raised: 220500000000000000000\n  sybil net outlay before the dump: 199225000000000000001\n  dump proceeds: 133542968727184882968\n\n[PASS] test_takeCarryAndNoteFirstEntryAreGameOnly() (gas: 17507213)\n[PASS] test_takeCrownRevertsInsteadOfSkippingTheOutgoingKingWhileLiquidityIsLocked() (gas: 17398725)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 424.60ms (420.58ms CPU time)\n\nRan 21 tests for test/Pad.t.sol:PadTest\n[PASS] test_bindingsAndOwner() (gas: 107427)\n[PASS] test_bindingsAreOneShot() (gas: 87718)\n[PASS] test_carryPotStaysThroughNextDraw() (gas: 19716214)\n[PASS] test_closedPadRevertsEverything() (gas: 97341)\n[PASS] test_constructorsNeedNoExternalCodeAndMintNothing() (gas: 689643)\n[PASS] test_deployGasUnderBudget() (gas: 19942)\n[PASS] test_deployHookOnlyByPad() (gas: 33037)\n[PASS] test_failedGenesisIsRestartedByLaunchAndThePadRecovers() (gas: 20930365)\n[PASS] test_fundGamesOnlyKing() (gas: 121439)\n[PASS] test_hookRejectsForeignInitialize() (gas: 8091115)\n[PASS] test_launchRevertsUntilGenesisGraduates() (gas: 17578703)\n[PASS] test_launchValidatesStrings() (gas: 16759202)\n[PASS] test_openPadByAnyoneAfter30Days() (gas: 7961415)\n[PASS] test_openPadByOwnerDeploysHookWithExactFlag() (gas: 7994869)\n[PASS] test_openPadOnlyOnce() (gas: 8033632)\n[PASS] test_openPadRejectsBadSalt() (gas: 203270)\n[PASS] test_openPadStrangerBefore30DaysReverts() (gas: 7135025)\n[PASS] test_restartGenesisRevertsWhileGenesisWaitsOrPlays() (gas: 8439657)\n[PASS] test_runtimeSizesAndNoEscapeOpcodes() (gas: 37365487)\n[PASS] test_templatesCannotBeInitialized() (gas: 8132248)\n[PASS] test_upkeepForOnlyGames() (gas: 8182632)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 482.14ms (478.51ms CPU time)\n\nRan 6 tests for test/AuditV3CarryUpkeep.t.sol:AuditV3CarryUpkeepTest\n[PASS] test_fiveWalletCarryChainOnlyPullsUnusedCapAtFinalize() (gas: 58790917)\n[PASS] test_fiveWalletNoRollChainNeverTakesCarry() (gas: 6259637)\n[PASS] test_ownGasEstimateEntryAndRollWithForeignDraw() (gas: 102348)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 266738\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignFinalize() (gas: 103864)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_ownGasEstimateEntryAndRollWithForeignGraduate() (gas: 104193)\nLogs:\n  own entry gas limit: 268574\n  own roll gas limit: 270410\n\n[PASS] test_upkeepSubcallCanExhaustItsFullStipendWithoutRevertingEntry() (gas: 77565819)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 616.97ms (637.94ms CPU time)\n\nRan 1 test for test/V3CarryProperties.t.sol:V3CarryPropertiesTest\n[PASS] testFuzz_onlyUnusedReleaseAllowanceLeavesCarryAtFinalization(uint256,uint256,uint256) (runs: 128, μ: 12364000, ~: 11112531)\nLogs:\n  Bound result 0\n  Bound result 3454570121562495996\n  Bound result 292631546637321764959\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 650.34ms (584.59ms CPU time)\n\nRan 36 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_bellOnlyRingsOnceAndNotForNegativeClampOverflow() (gas: 10679178)\n[PASS] test_bellRingerOutsideTopHalfStillGetsBellShare() (gas: 11665018)\n[PASS] test_claimNothingReverts() (gas: 8144324)\n[PASS] test_constructorsRejectZeroAddresses() (gas: 9655)\n[PASS] test_crownEventAndSameKingMayRebid() (gas: 17755850)\n[PASS] test_curveNeverUnderchargesAlongRealRolls() (gas: 21987305)\n[PASS] test_distributeRoundRobinAcrossPools() (gas: 28601567)\n[PASS] test_expiredRollAtZeroHeightStaysZeroAndNeverRingsBell() (gas: 9766218)\n[PASS] test_failedGenesisKeepsKingAndBurnClosedAndLaunchOnlyRelaunchesPvp() (gas: 10832348)\n[PASS] test_failedGenesisRelaunchLeavesCarryInPad() (gas: 12662800)\n[PASS] test_finalizeWithTwoHundredLivingImpsWorstCaseOrderFitsInBlock() (gas: 176168064)\nLogs:\n  finalize gas, 200 living imps, worst-case order: 4394041\n\n[PASS] test_fundGamesOnlyLooksAtLastTenLaunches() (gas: 41872550)\n[PASS] test_fundGamesSkipsGamesWithFewerThanFiveImpsAndEndedOnes() (gas: 25374260)\n[PASS] test_fundGamesSplitsEquallyWhenAllPotsEmpty() (gas: 21931014)\n[PASS] test_fundPotRefusedFromStrangersAndAfterFinalize() (gas: 9687188)\n[PASS] test_hashWindowBoundaryAt257And258Blocks() (gas: 10626580)\n[PASS] test_hookRejectsForeignInitializeWithWrongKeyToo() (gas: 8050665)\n[PASS] test_kingConstructorCannotBindTwice() (gas: 9199)\n[PASS] test_lastRollOnCurveUsesOnlyRemainingEthAndRestToPot() (gas: 9670851)\n[PASS] test_launchViewsRejectIdZero() (gas: 33276)\n[PASS] test_liquidityMayMoveLockedTokensAndApprovalsWorkAfterUnlock() (gas: 9879940)\n[PASS] test_mintEventsAndLaunchEvent() (gas: 18076339)\n[PASS] test_mintOnFreshLaunchBeforeItsOwnFirstMintIsStatusZero() (gas: 17516004)\n[PASS] test_noBellAllToRanksAndDustToCarry() (gas: 16989924)\n[PASS] test_openPadAndGenesisNeedBindings() (gas: 78166)\n[PASS] test_openPadAtExactDeadlineByStranger() (gas: 7962107)\n[PASS] test_openPadEmitsAndIsFinal() (gas: 8003968)\n[PASS] test_openPadRejectsExtraHookFlags() (gas: 28396016)\n[PASS] test_reentrantDistributeFromKingIsRefused() (gas: 18161673)\n[PASS] test_reentrantKingRefundIsRefusedAndMadeClaimable() (gas: 18509553)\n[PASS] test_reentrantWinnerIsRefusedAndMadeClaimable() (gas: 11399595)\n[PASS] test_resolveIsPermissionlessAndIdempotent() (gas: 9951481)\n[PASS] test_restartGenesisNeedsOpenPadAndFailedGenesis() (gas: 16774801)\n[PASS] test_singleLivingImpTakesEverything() (gas: 12771940)\n[PASS] test_soldOutCurveSendsWholeRollToPot() (gas: 9605503)\n[PASS] test_takeCrownBeforeAnyBidRejectsZeroAndDust() (gas: 16824764)\nSuite result: ok. 36 passed; 0 failed; 0 skipped; finished in 1.08s (1.06s CPU time)\n\nRan 35 tests for test/Game.t.sol:GameTest\n[PASS] test_bellEndsGame() (gas: 2300263)\n[PASS] test_claimableWinner() (gas: 3309803)\n[PASS] test_conservationOfEth() (gas: 6924552)\n[PASS] test_curveQuoteMatchesConstantProduct() (gas: 59327)\n[PASS] test_deadImpCannotRingTheBell() (gas: 2695222)\n[PASS] test_deadImpCannotRollWhileOthersPlay() (gas: 2871215)\n[PASS] test_deathAndAllDeadEnd() (gas: 2226004)\n[PASS] test_entryOnePerWalletAndSignupWindow() (gas: 1876939)\n[PASS] test_expiredRollMovesTowardZero() (gas: 2826620)\n[PASS] test_failedPushBecomesClaimable() (gas: 2005991)\n[PASS] test_finalizePaysTriangularRanksAndBell() (gas: 6232160)\n[PASS] test_finalizeRanksAndPays() (gas: 5478374)\n[PASS] test_finalizeWaitsForPendingRolls() (gas: 2030055)\n[PASS] test_finalizeWith200LivingImpsStaysUnderFiveMillionGas() (gas: 163416219)\n[PASS] test_finalizerFeeCapped() (gas: 15337393)\n[PASS] test_finalizerFeeNeverExceedsRollPot() (gas: 2204262)\n[PASS] test_firstEntryStartsSignupWithoutSeating() (gas: 425742)\n[PASS] test_fundPotOnlyPad() (gas: 104086)\n[PASS] test_fundedPotReleasedToFiveLivingCappedAtThreeTimesRollPot() (gas: 25079091)\n[PASS] test_fundedPotReturnsToCarryWhenFewerThanFiveLive() (gas: 4293835)\n[PASS] test_graduateOnlyFromGame() (gas: 132984)\n[PASS] test_graduationCreatesPoolUnlocksTokenBurnsExcess() (gas: 9125070)\n[PASS] test_graduationWithoutEthFailsAndBurns() (gas: 1607320)\n[PASS] test_hardEndAt50MinutesAfterPlayStart() (gas: 4864659)\n[PASS] test_nonGenesisBurnShareGoesToBurnBucket() (gas: 10832860)\n[PASS] test_resolveBatchIncludesTenRolls() (gas: 8615953)\n[PASS] test_rollAfterOwnBellReverts() (gas: 2680143)\n[PASS] test_rollRequiresPlayPhasePriceAndImp() (gas: 2482484)\n[PASS] test_rollResolvesAfterThreeBlocksWithArbHashes() (gas: 2079431)\n[PASS] test_rollResolvesOwnPreviousRoll() (gas: 2041855)\n[PASS] test_rollSplitGenesisBurnShareToPot() (gas: 1664198)\n[PASS] test_soldOutCurveSendsRollToPot() (gas: 1596836)\n[PASS] test_tieBreakFollowsCommitOrderNotResolutionOrder() (gas: 3556029)\n[PASS] test_tokenLockedUntilGraduation() (gas: 1750024)\n[PASS] test_upkeepFinalizesAndGraduatesDueGame() (gas: 3086479)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 1.36s (187.21ms CPU time)\n\nRan 8 tests for test/V4Pad.t.sol:V4PadTest\n[PASS] testFuzz_bailSequencesConserveETHAndSupply(uint8,uint8) (runs: 64, μ: 11903996, ~: 10729805)\nLogs:\n  Bound result 3\n\n[PASS] test_bailAfterActualSellOutReopensCurveAndCostCountsOnlySpentETH() (gas: 5570999)\n[PASS] test_bailOnlyDuringPlayAndOnlySeatedWallets() (gas: 3292618)\n[PASS] test_bailOutProfitLossMinOutAndConservation() (gas: 3631050)\n[PASS] test_deadWalletMayBailWhileAnotherLivesAndErasedActivityDoesNotDelayEnd() (gas: 3550412)\n[PASS] test_erasureExcludesRankingBellLivingAndFundedReleaseButPaysPendingTip() (gas: 5649207)\n[PASS] test_largeRawTokenRatioDoesNotOverflowPriceEncoding() (gas: 6831)\n[PASS] test_rejectedBailPaymentRemainsClaimableAndCannotBePaidTwice() (gas: 2221956)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 1.46s (1.44s CPU time)\n\nRan 9 tests for test/LiquidityV4.t.sol:LiquidityV4Test\n[PASS] test_collectPoolRejectsExternalCallers() (gas: 35216)\n[PASS] test_crownPrecollectsAllEighteenPools() (gas: 20479007)\nLogs:\n  takeCrown gas, eighteen real pools: 2828401\n\n[PASS] test_failedDistributorBlocksCrown() (gas: 17294506)\n[PASS] test_oneFailingPoolCannotBlockBidOrHealthyPoolFees() (gas: 23988494)\n[PASS] test_outgoingKingReceivesFeesBeforeCrownEvent() (gas: 18167302)\n[PASS] test_realBurnIgnoresAnUnrelatedPriorTokenSync() (gas: 16864597)\n[PASS] test_realPoolManagerGraduatesSoldOutAfter2400ActualRolls() (gas: 8886614)\n[PASS] test_realPoolManagerSmallestRaiseGraduatesAndConservesAccounting() (gas: 10915685)\n[PASS] test_realTradingTokenFeesPaidInKindWithoutSwap() (gas: 17728318)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 1.54s (1.60s CPU time)\n\nRan 6 tests for test/RaffleEdges.t.sol:RaffleEdgesTest\n[PASS] testFuzz_above200ExactlyTwoHundredDistinctSeats(uint16,uint32,uint8) (runs: 24, μ: 126913586, ~: 120686550)\nLogs:\n  Bound result 245\n  Bound result 2\n\n[PASS] test_deathAtExactlyTenMinutesFromPlayStartAndAllDeadEndsTheGame() (gas: 3030298)\n[PASS] test_kingFundsSignupGameByEntriesAndFundedEthReturnsToCarryWhenNobodyRolls() (gas: 13795077)\n[PASS] test_repeatedDrawCallsInOneBlockOnlyAdvanceAfterSeedAndNeverSeatTwice() (gas: 117124311)\n[PASS] test_rollOneSecondBeforeHardEndWorksAndAtHardEndReverts() (gas: 5614896)\n[PASS] test_unselectedEntrantKeepsEntryHasNoSeatAndCannotRollOrReenter() (gas: 84129703)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.22s (2.35s 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: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 0\n  Bound result 1198000000000002097153\n  Bound result 0\n  Bound result 59\n  Bound result 14\n  Bound result 0\n  Bound result 160\n  Bound result 204\n  Bound result 0\n  Bound result 2\n  Bound result 39999999999999999998\n  Bound result 7\n  Bound result 453\n  Bound result 272\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 240\n  Bound result 248\n  Bound result 301\n  Bound result 40\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.63s (3.59s CPU time)\n\nRan 8 tests for test/V4Edges.t.sol:V4EdgesTest\n[PASS] testFuzz_bailPayoutFormulaAndCurveLedger(uint8,uint8,uint96) (runs: 256, μ: 5767790, ~: 5252383)\nLogs:\n  Bound result 1\n  Bound result 15171\n\n[PASS] test_bailOutRefusedAfterBellAndAfterHardEnd() (gas: 2638387)\n[PASS] test_bailOutRefusedAtHardEndEvenWithLiveActivity() (gas: 6115406)\n[PASS] test_erasedSeatOneBelowCapNeverRingsTheBell() (gas: 2739935)\n[PASS] test_everySeatBailingOutEndsTheGameAtOnceAndFailsGraduation() (gas: 4391860)\n[PASS] test_expiredPendingRollOfErasedSeatPaysTipToPotWithNoEffect() (gas: 2983587)\n[PASS] test_kingSplitIgnoresGameWithErasedSeatBelowFive() (gas: 5919917)\n[PASS] test_seatedWalletWithoutCoinsBailsForZeroAndMinOutOneReverts() (gas: 3016130)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 3.71s (3.70s CPU time)\n\nRan 1 test for test/V4BailIMDInvariant.t.sol:V4BailIMDInvariantTest\n[PASS]\nV4BailIMDInvariantTest 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 V4BailIMDInvariantTest invariants (runs: 40, calls: 2400, reverts: 91)\n\n╭------------+----------------+-------+---------+----------╮\n| Contract   | Selector       | Calls | Reverts | Discards |\n+==========================================================+\n| PadHandler | bailOut        | 108   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | burnChunk      | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimGame      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimKing      | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | claimLiquidity | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | creditFees     | 99    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | distribute     | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | draw           | 91    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | enter          | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | finalize       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundBurn       | 85    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundCarry      | 94    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | fundPot        | 91    | 91      | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | graduate       | 95    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | launch         | 109   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | padUpkeep      | 90    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | poke           | 86    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | resolve        | 84    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | restartGenesis | 111   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | roll           | 189   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | takeCrown      | 88    | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | tokenTransfer  | 105   | 0       | 0        |\n|------------+----------------+-------+---------+----------|\n| PadHandler | warp           | 195   | 0       | 0        |\n╰------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 16\n  Bound result 16\n  Bound result 16\n  Bound result 100000000000000000000\n  Bound result 2\n  Bound result 0\n  Bound result 1198000000000002097153\n  Bound result 50500000000000000000\n  Bound result 59\n  Bound result 14\n  Bound result 9814\n  Bound result 160\n  Bound result 204\n  Bound result 0\n  Bound result 2\n  Bound result 39999999999999999998\n  Bound result 4\n  Bound result 430\n  Bound result 272\n  Bound result 178\n  Bound result 47\n  Bound result 3117330014963374531\n  Bound result 0\n  Bound result 0\n  Bound result 240\n  Bound result 62\n  Bound result 467\n  Bound result 40\n  Bound result 151132546051068544592\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.03s (3.95s CPU time)\n\nRan 7 tests for test/CrownSettlement.t.sol:CrownSettlementTest\n[PASS] test_bidderCannotSteerCursorToDivertReignFees() (gas: 7311785)\n[PASS] test_brokenPoolSkippedByTwoCrownsPaysTheEarliestUnsettledReign() (gas: 2949438)\n[PASS] test_extraBidGasSettlesMorePoolsInOneBid() (gas: 22362684)\nLogs:\n  takeCrown gas, sixty real pools fully settled: 7572195\n\n[PASS] test_firstCrownOpensNoReignAndPaysPreCrownFeesToTheFirstKing() (gas: 919915)\n[PASS] test_nonKingCannotSettleOrCloseAReign() (gas: 594283)\n[PASS] test_poolsBeyondTheBidGasStayOwedToTheOutgoingKing() (gas: 26398958)\nLogs:\n  pools settled by a minimum-gas bid, sixty real pools: 41\n\n[PASS] test_settlementRevertsBelowSixteenPoolsAndSucceedsAbove() (gas: 6943528)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 4.73s (2.84s CPU time)\n\nRan 15 tests for test/IMDPad.t.sol:IMDPadTest\n[PASS] testFuzz_unitPricesAndRoundingConserveIMD(uint256) (runs: 64, μ: 10180430, ~: 10180435)\nLogs:\n  Bound result 9900000000000000177\n\n[PASS] test_bothCurrencyOrdersPriceEquivalenceAndPartialFillBurn() (gas: 26573453)\n[PASS] test_currentUnitCapsAFullFillBurn() (gas: 17275351)\n[PASS] test_everyApplicationTemplateCloneAndHookRejectsETH() (gas: 8317214)\n[PASS] test_failedIMDAndCoinPayoutsCannotBlockCrownOrBatch() (gas: 18623404)\n[PASS] test_lateAliveBailKeepsCarryReleaseWithFourRankableSeats() (gas: 25527098)\n[PASS] test_lateAliveBailWithFiveOtherSurvivors() (gas: 28494150)\n[PASS] test_lateBailCannotClawBackExistingKingFunding() (gas: 25494137)\n[PASS] test_noReturnIMDFullGameGraduationBurnKingAndClaims() (gas: 18742659)\n[PASS] test_pullOnlyTrustedCallersAndEndpointsAlwaysChargeTheirCaller() (gas: 8677682)\n[PASS] test_shortPoolReceiptDoesNotCreateFeeCredits() (gas: 17804855)\n[PASS] test_shortPullsRevertAtomicallyAndDonationsDoNotCreateCredits() (gas: 8989625)\n[PASS] test_soleBuyerSybilWithAliveBailAndFourSurvivorsStillLoses() (gas: 27194382)\nLogs:\n  Sybil loss in IMD wei: 12160243613483469790\n\n[PASS] test_unitBoundsOwnerEventAndSnapshot() (gas: 14402188)\n[PASS] test_unsolicitedIMDDoesNotAlterGraduationPriceOrCredit() (gas: 11771937)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 4.75s (1.96s CPU time)\n\nRan 9 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzz_challengeBelow110PercentOrWithinHoldReverts(uint256,uint256,uint256) (runs: 200, μ: 17528799, ~: 17528719)\nLogs:\n  Bound result 7996000000000005100001\n  Bound result 4000000000000000000\n  Bound result 400\n\n[PASS] testFuzz_challengeRefundsOldKingAndSplitsOnlyTheExtra(uint256,uint256) (runs: 200, μ: 17963187, ~: 17963264)\nLogs:\n  Bound result 6272996531674916266090\n  Bound result 17109503815157592107302\n\n[PASS] testFuzz_finalizePaysTopHalfWithTriangularWeightsAndNothingLeaks(uint8,uint256) (runs: 64, μ: 20725526, ~: 19700240)\nLogs:\n  Bound result 3\n  Bound result 1164685330982380889835\n\n[PASS] testFuzz_firstBidSplitsToTheWei(uint256) (runs: 200, μ: 17345834, ~: 17345875)\nLogs:\n  Bound result 4000000000000000001\n\n[PASS] testFuzz_fundedReleaseNeverExceedsThreeTimesRollIncome(uint8,uint256,uint8) (runs: 64, μ: 13725157, ~: 12748194)\nLogs:\n  Bound result 1\n  Bound result 1\n  Bound result 1123454570121562513374\n\n[PASS] testFuzz_quoteFromAnyCurveStateIsConsistent(uint256,uint256) (runs: 1000, μ: 8048053, ~: 8048287)\nLogs:\n  Bound result 61\n  Bound result 7152\n\n[PASS] testFuzz_quoteFromFreshCurveNeverUndercharges(uint256) (runs: 1000, μ: 8027188, ~: 8026699)\nLogs:\n  Bound result 16850393551282108547342\n\n[PASS] testFuzz_quoteIsMonotoneInEth(uint256,uint256,uint256) (runs: 500, μ: 8049002, ~: 8049101)\nLogs:\n  Bound result 404284521931462223\n  Bound result 198058407257799441046\n  Bound result 1801941592742261523603\n\n[PASS] testFuzz_rollSplitConservesEveryWei(uint8,bool) (runs: 64, μ: 16282797, ~: 14671085)\nLogs:\n  Bound result 11\n\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.75s (32.51s 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 500000000000000000\n  Bound result 40000000000000000000000\n  Bound result 16\n  Bound result 0\n  Bound result 500000\n  Bound result 3618791\n  Bound result 5275559\n  Bound result 4854\n  Bound result 5400201\n  Bound result 6080\n  Bound result 1048576\n  Bound result 4733\n  Bound result 24\n  Bound result 600000\n  Bound result 40640000000000000000\n  Bound result 5465536\n  Bound result 1058760442193818\n  Bound result 5410467\n  Bound result 1966500\n  Bound result 5411742\n  Bound result 11802\n  Bound result 12525\n  Bound result 5412299\n  Bound result 2197979\n  Bound result 5\n  Bound result 10133\n  Bound result 716782\n  Bound result 4424555\n  Bound result 5401904\n  Bound result 3197263883\n  Bound result 7\n  Bound result 7477639625207\n  Bound result 60289588469921344040983\n  Bound result 15807\n  Bound result 6782\n  Bound result 9177\n  Bound result 4948492\n  Bound result 638212886\n  Bound result 33\n  Bound result 415154087980144090\n  Bound result 80229752778653436787973\n  Bound result 15\n  Bound result 39999999999995001\n  Bound result 11475\n  Bound result 1507695\n  Bound result 5000000\n  Bound result 1414\n  Bound result 5400025\n  Bound result 29999999999999999\n  Bound result 18355023563429206\n  Bound result 5400201\n  Bound result 31\n  Bound result 39998999999997891\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.79s (4.74s 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 30\n  Bound result 80\n  Bound result 12\n  Bound result 82\n  Bound result 16\n  Bound result 74\n  Bound result 21\n  Bound result 10\n  Bound result 22\n  Bound result 30\n  Bound result 49\n  Bound result 53\n  Bound result 21\n  Bound result 74\n  Bound result 1\n  Bound result 37\n  Bound result 28\n  Bound result 24\n  Bound result 79\n  Bound result 41\n  Bound result 89\n  Bound result 8\n  Bound result 18\n  Bound result 15\n  Bound result 50\n  Bound result 82\n  Bound result 17\n  Bound result 12\n  Bound result 5\n  Bound result 58\n  Bound result 10\n  Bound result 4\n  Bound result 51\n  Bound result 14\n  Bound result 18\n  Bound result 37\n  Bound result 49\n  Bound result 18\n  Bound result 58\n  Bound result 11\n  Bound result 1\n  Bound result 76\n  Bound result 3\n  Bound result 15\n  Bound result 16\n  Bound result 69\n  Bound result 43\n  Bound result 35\n  Bound result 30\n  Bound result 32\n  Bound result 16\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.77s (6.72s CPU time)\n\nRan 5 tests for test/V3FailureEdges.t.sol:V3GameFailureEdgesTest\n[PASS] testFuzz_everyResolutionWindowOffsetPreservesTheTip(uint256) (runs: 1000, μ: 1922815, ~: 1931828)\nLogs:\n  Bound result 348\n\n[PASS] test_drawBountyCallbackCannotCaptureAgainOrAdvanceExtraSeats() (gas: 2501825)\n[PASS] test_finalizeBatchFailureRollsBackTipsAndPartialResolutionUntilPermissionlessProgress() (gas: 54734246)\n[PASS] test_optionalDistributeAndBurnMayBothExhaustCapsWithoutRevertingEntryOrRoll() (gas: 3888100)\nLogs:\n  entry with both liquidity upkeep stipends exhausted: 1419318\n  roll with both liquidity upkeep stipends exhausted: 1552826\n\n[PASS] test_resolverDebtSurvivesFinalizationGraduationAndRejectedClaim() (gas: 3279258)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 7.85s (7.86s CPU time)\n\nRan 15 tests for test/Raffle.t.sol:RaffleTest\n[PASS] testFuzz_everyEntrantPlaysAtOrBelow200(uint16) (runs: 64, μ: 34494681, ~: 27850051)\nLogs:\n  Bound result 193\n\n[PASS] test_5000EntriesChunkedDrawGasAndNonselectedFeesStayBurned() (gas: 117419314)\nLogs:\n  5000-entry draw max chunk gas (cold game): 2688595\n  5000-entry draw total gas: 16272475\n\n[PASS] test_contractWalletCanEnterAndViewsArePaged() (gas: 86617813)\n[PASS] test_drawBeforeEntryBeforeSignupAndZeroChunkRejected() (gas: 578198)\n[PASS] test_entryExactFeeOnePerWalletAndNoRefund() (gas: 791204)\n[PASS] test_entryFeesAlsoFundBurnOnOrdinaryGames() (gas: 9787606)\n[PASS] test_entryGateAndReentrantBurnCallback() (gas: 1693003)\n[PASS] test_failedGenesisGriefCostsOneFeeEveryRoundAndNeverRefunds() (gas: 5732752)\n[PASS] test_firstEntryStartsTenMinutesAndLateEntryRejected() (gas: 941892)\n[PASS] test_hashAtExactly256BlocksOldStillSeeds() (gas: 876998)\n[PASS] test_lapsedCommitFallsBackOnceAndNeverRecommits() (gas: 82455613)\n[PASS] test_manySeedsGiveEarlyAndLateEntrantsEqualOpportunity() (gas: 526729)\n[PASS] test_noRollUntilAllSeatsDrawnAndDelayedPlayStartsFresh() (gas: 83272421)\n[PASS] test_seedUsesOnlyThreeFutureL2HashesAndChunkSizeCannotChangeSeats() (gas: 135380744)\n[PASS] test_upkeepCommitsThenDrawsInBoundedChunksAndKingCountsEntries() (gas: 2624002)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 7.85s (12.22s CPU time)\n\nRan 24 test suites in 7.86s (63.01s CPU time): 225 tests passed, 0 failed, 0 skipped (225 total tests)\n","passed":true},{"durationMs":105,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"KingOfThePad.claim()\",\"KingOfThePad.distribute(uint256)\",\"KingOfThePad.takeCrown(uint256)\",\"PadGame.bailOut(uint256)\",\"PadGame.claim()\",\"PadGame.draw(uint256)\",\"PadGame.enter()\",\"PadGame.finalize()\",\"PadGame.fundPot(uint256)\",\"PadGame.graduate()\",\"PadGame.initialize(uint256,address,address,bool)\",\"PadGame.poke()\",\"PadGame.resolvePending(uint256)\",\"PadGame.roll()\",\"PadGame.upkeepStep(address)\",\"PadLiquidity.bindKing()\",\"PadLiquidity.burnChunk()\",\"PadLiquidity.claim(address)\",\"PadLiquidity.collectPool(uint256,address)\",\"PadLiquidity.creditBurn(address,uint256)\",\"PadLiquidity.deployHook(bytes32)\",\"PadLiquidity.distribute(uint256)\",\"PadLiquidity.fundBurn(uint256)\",\"PadLiquidity.graduate(uint256,address,uint256,uint256,uint256,uint256)\",\"PadLiquidity.retryPool(uint256)\",\"PadLiquidity.settleCrown()\",\"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.burn(uint256)\",\"PvPPad.fundCarry(uint256)\",\"PvPPad.fundGames(uint256)\",\"PvPPad.launch(string,string,string)\",\"PvPPad.noteFirstEntry(uint256)\",\"PvPPad.openPad(bytes32)\",\"PvPPad.pull(address,uint256)\",\"PvPPad.restartGenesis()\",\"PvPPad.setUnit(uint256)\",\"PvPPad.startGenesis()\",\"PvPPad.takeCarry(uint256,uint256)\",\"PvPPad.upkeep()\",\"PvPPad.upkeepFor(address)\"],\"files\":{\".gitignore\":4,\"ADAPTATION.md\":47,\"README.md\":166,\"docs/AUDIT-V2-HISTORY.md\":256,\"docs/AUDIT-V3-HISTORY.md\":311,\"docs/AUDIT-V4-ETH-HISTORY.md\":476,\"docs/AUDIT.md\":197,\"docs/TEST-REPORT.md\":135,\"docs/VERIFY.md\":52,\"foundry.toml\":22,\"launch.json\":38,\"remappings.txt\":2,\"src/KingOfThePad.sol\":139,\"src/PadGame.sol\":806,\"src/PadHook.sol\":26,\"src/PadLiquidity.sol\":507,\"src/PadToken.sol\":94,\"src/PvPPad.sol\":353,\"src/interfaces/Interfaces.sol\":128,\"src/interfaces/PadErrors.sol\":79,\"src/libs/PadLib.sol\":149,\"test/Adversarial.t.sol\":802,\"test/AtomicDeployment.t.sol\":124,\"test/AuditV3.t.sol\":406,\"test/AuditV3CarryUpkeep.t.sol\":192,\"test/Base.t.sol\":224,\"test/CrownSettlement.t.sol\":253,\"test/Fuzz.t.sol\":290,\"test/Game.t.sol\":762,\"test/IMDPad.t.sol\":401,\"test/Invariants.t.sol\":608,\"test/King.t.sol\":316,\"test/LiquidityV4.t.sol\":252,\"test/Pad.t.sol\":300,\"test/Raffle.t.sol\":425,\"test/RaffleEdges.t.sol\":274,\"test/RealV4.sol\":95,\"test/Revision.t.sol\":265,\"test/V3-CONTRIBUTOR-REPORT.md\":129,\"test/V3AccountingActors.sol\":22,\"test/V3CarryProperties.t.sol\":131,\"test/V3FailureEdges.t.sol\":356,\"test/V3KingFeesInvariant.t.sol\":254,\"test/V3ResolverInvariant.t.sol\":216,\"test/V4-CONTRIBUTOR-REPORT.md\":43,\"test/V4BailIMDInvariant.t.sol\":36,\"test/V4Edges.t.sol\":271,\"test/V4Pad.t.sol\":298,\"test/mocks/IMD.sol\":113,\"test/mocks/Mocks.sol\":37,\"tools/validate_manifest.py\":86},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f1734b88b36e813eae6bd665981a8f371623d5be7cb7ece53bdf543a7e68d0fa","verifiedTreeHash":"104ef3fcfebe87ca21f8836e7687a1929f873226","verifierVersion":"0.1.0+8fbf00a5"}]}