{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"4098dafa-99b4-4c9f-97e3-430b49ea6afa","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"f1a89b8e51ed339c33dfcf9f69a18d5a29f73d1986afb2bbbff3a22108173d0a","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"15128eeb8da9fb5ec13c7964e80f936ddc40e718cc0d455d200435c3dc43d6a7","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"15128eeb8da9fb5ec13c7964e80f936ddc40e718cc0d455d200435c3dc43d6a7","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"2ea3d733d6fe9838a85412abe1e36ef4d96a035094a72cf3be40a1a218b1864f","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"e94fe0895930933a46d9e580b1d1305cb48bb7d78aca0adbf24d0cb12c88be40","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"5015232c3db162914cdfbf55f338def72b397d65971767e1a9db2953be1af42b","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b72293c3366fff3f0b93151bca72cc6cbd189dad31d1ccd1d34dd483f2165a36","skillId":"audit-imported-code","subagents":4,"tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"b72293c3366fff3f0b93151bca72cc6cbd189dad31d1ccd1d34dd483f2165a36","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":"1be0a42ba37f3cee96b6919bd4229aa8563074f557ae1e60ec389908c42ab75f","dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","subagents":4,"tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"b89279670f5a00f5d26286edee00c97dd158b997031350a01cafe6e0329ad227","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"e68672d79e44fb09c95098bad9c7fcacfb5aed5f38d09d814033736e7215a9d8","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"1b90b7417e16ff83ba8fc99a0fbf3657a5b799ac787a9c46bf8f1381ee7b1ceb","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","subagents":3,"tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"bc5bfc8455464381f2db18badb2b55cf8bec1e535c019349a0378fa990741171","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"e0fbd4c62f881bce05969142ee74e364adfe8454028f33768ddf4956e5cb9368","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"a9b51bd8e8687934854dcf739baa081b1b74b283a498747af1688b9bab7a7c04","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","subagents":4,"tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"606842ccca0e7c5d3017a54684625438eab9b351eb51dcf0cf88c43d1ea41464","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Launch IMDuel (IMDUEL) from launch.json exactly as committed: the IMDuelHook Uniswap v4 hook with the constructor arguments listed there (the engine is the ChessEngineV5 already deployed at 0xc21788f704a8b9456f7391a01d8a3d95be215a27), the standard launch token named IMDuel with symbol IMDUEL, and its pool paired with IMD at fee 12500 and tick spacing 60. The hook takes 0.75% of every swap of its pools and reads no prices: 0.65% fills both teams' pots, half from each side of the trade into that token's pot; 0.1% is taken in IMDUEL wherever the pool holds it and burned (owed to 0x...dEaD, sent by anyone's withdraw), and in a duel without IMDUEL in IMD into the main duel's IMD pot; there is no opening surcharge. A bid's strength is what its trade received as a share of its own team's pot. Only checkmate pays: the owner of the mating move gets the smallest of a quarter of the losing team's pot, twice what that move's bid paid, and what that game's trades paid into the losing pot, in the loser's token; captures, checks, draws and timeout moves pay nothing; payouts are recorded and claimed. Every swap the hook takes a fee from emits URC-2's HookSwap. The hook keeps per-address play counts (stats) for display only. It has no owner, admin, pause or upgrade path and no backend signer; every swap bids for its team's next chess move, which a later swap plays through the engine. Do not change any contract source, constructor argument or compiler setting: the project builds with forge build and its tests pass with forge test, including launches shaped like the factory's in both token orders.","parentJobId":null,"planHash":"a1e6ef87b40aa1ff21252c155b224d9ffefd05d0ff3dff5616ff63c641109b89","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"4098dafa-99b4-4c9f-97e3-430b49ea6afa","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2843-launch-imduel-imduel-launch-json"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51460","feedbackHash":"39ac6d11889d95a079a453a98ae476e8f8d987bfa6f26ab0d65577695f3817b6","nodeKey":"adapt_contract_project","submissionHash":"f1a89b8e51ed339c33dfcf9f69a18d5a29f73d1986afb2bbbff3a22108173d0a","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51332","feedbackHash":"06c7ccd900989abbbe143e1f30e90d46236e4fa6342abf70fae8a317f9836636","nodeKey":"audit_economics","submissionHash":"2ea3d733d6fe9838a85412abe1e36ef4d96a035094a72cf3be40a1a218b1864f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52585","feedbackHash":"7d0cfe4f0ce26a7374e193e3a74dd508869afdd7b16526709ef08340b1df15d2","nodeKey":"audit_flow","submissionHash":"e94fe0895930933a46d9e580b1d1305cb48bb7d78aca0adbf24d0cb12c88be40","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51022","feedbackHash":"b5872855ca48c364e8def252dc41f6594ffdf0218119b4889d4e894ed40d4dfd","nodeKey":"audit_imported_code","submissionHash":"5015232c3db162914cdfbf55f338def72b397d65971767e1a9db2953be1af42b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51163","feedbackHash":"3c68158cbb196398cee114ff3b4827512fec32764e92fe91956868b29fadcc50","nodeKey":"audit_judge","submissionHash":"1be0a42ba37f3cee96b6919bd4229aa8563074f557ae1e60ec389908c42ab75f","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51316","feedbackHash":"70fff9b51c642d14bcd4207066b6cfd134c56cc9e57f6e8cb3c5379f3585eb1d","nodeKey":"audit_math","submissionHash":"e68672d79e44fb09c95098bad9c7fcacfb5aed5f38d09d814033736e7215a9d8","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"53924","feedbackHash":"72b93a954af334328e592473d419c45f5546cab8f6543ceed9ba3fca79935c45","nodeKey":"audit_permissions","submissionHash":"1b90b7417e16ff83ba8fc99a0fbf3657a5b799ac787a9c46bf8f1381ee7b1ceb","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51007","feedbackHash":"07ec0f48c9e5a213dbdc9cb7dc1af4905b3f2c0369e5480708eee269ca691742","nodeKey":"manifest","submissionHash":"e0fbd4c62f881bce05969142ee74e364adfe8454028f33768ddf4956e5cb9368","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52584","feedbackHash":"33a9dc4ebeca5671426d38c767ff19c52e090180d92b1d89382247b05290491f","nodeKey":"write_foundry_tests","submissionHash":"a9b51bd8e8687934854dcf739baa081b1b74b283a498747af1688b9bab7a7c04","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"a95a5659587d1bb0077484371dc50283397a8b88b3209c18dc86e5bbf37f7b55","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5950526089333555","findings":[],"hash":"09885a5aa1458a05f0241f96a6d67325ccb697db056e62b7271295ca1ce9cca9","nodeId":"74a6edae-99a1-49f6-9e48-bd7ce4710dcc","outcome":"failed","summary":"API Error: Your account can't receive replies from Claude right now. You can find the next step in the Anthropic Verification Portal: https://portal.anthropic.com/…","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"claude","turns":1,"wallClockMs":4501}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"a7ac9f7a7687c25e","findings":[{"citation":"resolved","description":"Asymmetry between the two ways a silent side's move gets played. The brief and the contract notes say a side that is silent for TURN_TIMEOUT (600 s) plays at 0% when the other side trades (_play, lines 461-465). But any swap bids for the team of the token it buys, and the first bid for a move only has to satisfy _beats with no open bid, so paid = 1 wei qualifies. A 1-wei exact-input swap pays zero hook fee on both sides (amount * 65 / 20_000 and amount * 10 / 10_000 both truncate to 0 at line 319 and 322), receives 0 output, and so gets strength 0 from Strength.fromShare(0, chest). The opponent therefore locks in a 0% move for the silent team, owned by the opponent's own address, as soon as the silent team's window opens, and the move is played by the next trade after the (at most 3-block, ~36 s) window instead of after 600 s of silence. The fee rounding to zero makes the bid free apart from gas; the mated team's pot then pays the attacker's real mating bids (capped at 2x bid and the game's inflow). This is consistent with 'every swap bids for its team', so it may be accepted design, but it makes the 600 s timeout protection reachable in ~36 s for 1 wei and the stated rule misleading.","line":497,"path":"src/IMDuelHook.sol","reproduction":"Main duel with turnBlocks = 3 (Base with turnBlocks() = 3). (1) White (team W) buys 100e18 with owner 0xA; roll past closeBlock; Black buys 100e18 with owner 0xB (plays White's move, bids ply 1); roll past closeBlock; White buys 100e18 (plays Black's move, bids ply 2); roll past closeBlock. (2) 0xA now buys exactly 1 wei of Black's token (trade(blackTeam, 1, 0xA)) in the first block of Black's turn: White's ply-2 move is played first, then bidOf(id) is {owner 0xA, size 1, strength 0, open true}; chest(id,0) and chest(id,1) are unchanged (fee 0). (3) Roll to closeBlock+1 (36 s later) and make any trade: game.ply becomes 4, moveStrength == 0, moveOwner == 0xA. Expected per the brief: Black's move plays at 0% only after 600 s without a move; actual: 36 s after Black got the turn, triggered by a free 1-wei trade from the opponent. Scratch test test/scratch/Dust.t.sol::test_dustBidForcesSilentTeamMove reproduced exactly these values (bid size 1, strength 0, fee 0 into both chests, 36 seconds).","severity":"low","snippet":"        return !b.open || paid * 100 > uint256(b.size) * (100 + RAISE_PCT);","title":"A 1-wei buy of a silent team's token forces that team's move at 0% within one window, bypassing the 600 s silence rule, and pays no hook fee"},{"citation":"resolved","description":"Trust assumption, not a defect in this launch. _apply (line 627-628) writes r.board, r.mover and r.other exactly as the engine returned them; the hook never runs Rules.move or any legality check on the production path, and the constructor does not check the engine has code (line 189-192). Whatever code sits at the immutable engine address decides every move, every mate and so every payout from the pots. For this launch the risk is bounded: I fetched eth_getCode for 0xc21788f704a8b9456f7391a01d8a3d95be215a27 on Ethereum mainnet (publicnode RPC) and it is byte-identical to out/ChessEngineV5.sol/ChessEngineV5.json deployedBytecode (23,339 bytes, sha256 68ebc498...6d122 for both), so the engine that will decide games is the audited source in this tree. Recorded so the judge has the evidence; no change required.","line":599,"path":"src/IMDuelHook.sol","reproduction":"State that would fail: deploy IMDuelHook with engine_ pointing at any contract whose play() returns a Rules.Played with status 2 (checkmate) for an arbitrary board; the first resolved move in the main duel is recorded as a mate and _payMate moves a quarter of the losing pot (capped) to the bidder. With the committed address and current mainnet code this state is not reachable: the bytes match the local ChessEngineV5 build.","severity":"info","snippet":"        (bool ok, bytes memory result) = address(engine).staticcall{gas: gasCap}(data);","title":"The hook trusts the engine's returned board without checking legality; the committed engine address was verified to hold this tree's ChessEngineV5 bytecode"}],"hash":"1b90b7417e16ff83ba8fc99a0fbf3657a5b799ac787a9c46bf8f1381ee7b1ceb","nodeId":"5d129c4d-c0f9-438a-a7a6-addf112a4942","outcome":"completed","summary":"The review is complete. The findings file is at `.imd-findings.json`, the tree is otherwise unchanged, and the scratch tests are removed.\n\n**Outcome.** The permission model holds. The hook has no owner, admin, pause, upgrade or signer path. All three callbacks and `unlockCallback` accept only the PoolManager, and the manager only calls back its own unlocker, so every callback payload is hook-authored. I found one low-severity asymmetry and recorded one trust assumption as info. No medium or higher defect, so no proof file was warranted.\n\n**Finding 1, low.** A 1-wei buy of a silent team's token places a bid for that team at 0% strength, owned by the buyer, and pays no hook fee because both fee terms truncate to zero. The silent team's move is then played by the next trade after the 3-block window. The brief says a silent side plays at 0% only after 600 s. A scratch test reproduced the exact state: bid size 1, strength 0, no change to either pot, and the forced move played 36 seconds after the team got the turn. This may be accepted design since every swap bids for its team, but it makes the 600 s rule bypassable for free.\n\n**Finding 2, info.** The hook writes the engine's returned board without any legality check, and the constructor does not check the engine has code. I fetched the mainnet runtime code at the committed engine address over a public RPC and it is byte-identical to this tree's ChessEngineV5 build, so the trust assumption holds for this launch.\n\n**What I verified and found sound.**\n- A reward recipient trading inside its own claim's unlock leaves the books exact. A recipient that credits the hook 1 wei, or a hostile side-duel token that re-syncs the manager during `fundChest`, makes the whole call revert with no chest or claim change.\n- Third parties cannot redirect anyone's reward through `withdraw` or `withdrawTo`.\n- Permissionless side duels only touch their own pots and can only add to the main IMD pot.\n- The manifest's constructor arguments, permissions and pool terms match the implementation.\n\n**Coverage.** All ten listed entry points have rows, plus five invariant and trust rows. Nine entry points hold, `afterSwap` carries finding 1. Nothing was left unreached. The `tx.origin` fallback is accepted in the brief and README, so I did not report it again.","treeHash":null,"usage":{"cachedInputTokens":1810946,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":55570,"runtime":"claude","turns":33,"wallClockMs":933313}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"8af9903f4ad1eed0","findings":[{"citation":"resolved","description":"Merged from audit_permissions (1-wei buy forces the silent team's move) and audit_flow (no window extension at closeBlock-1); same root cause. A move's first bid only has to satisfy _beats with no open bid (line 497: `!b.open || paid * 100 > ...`), so any swap that buys 1 wei of the side-to-move's token owns that move. A 1-wei exact-input swap pays no hook fee (1 * 65 / 20_000 and 1 * 10 / 10_000 are 0 at lines 319 and 322), receives 0 output and so has strength 0 (Strength.fromShare(0, pot)). The opponent can therefore place such a bid the moment the silent team's turn opens and have that team's move played at 0% by the next trade after the window, about 36 s later with turnBlocks = 3, instead of the 600 s TURN_TIMEOUT the brief and the manifest notes describe for a silent side. The L-1 mitigation from the earlier audit (this line) gives a first bid a full window only when it lands in or after the closing block: a first bid at closeBlock-2 leaves two blocks to answer, at closeBlock a fresh three, but at closeBlock-1 only the closing block, so an attacker gains by moving the dust bid one block earlier. Impact is bounded: any real buy of that token in the remaining block(s) outbids dust (needs only >10% over 1 wei), the move plays at 0% rather than for the attacker's benefit directly, and a mate it helps produce pays at most min(pot/4, 2x the mating bid, that game's inflow into the losing pot), so no funds leave the pots beyond what the game's traders paid in. It is a gap in a stated protection and a cheap griefing vector (one dust trade's gas), not a loss of funds. A fix is a design decision, e.g. closeBlock = max(closeBlock, block.number + turnBlocks - 1) on any first bid, which also changes test_onlyALateFirstBidMovesTheWindow and the manifest note.","line":456,"path":"src/IMDuelHook.sol","reproduction":"Reproduced with test/scratch/JudgeRepro.t.sol on this tree (Base with turnBlocks() = 3, setUpMainDuel, both pots funded 1000e18). (A) Gap at closeBlock-1: C = st().closeBlock; vm.roll(C - 1); white(1_000, 0xD05) -> st().closeBlock still C, bid().owner == 0xD05, bid().strength == 0; vm.roll(C + 1); vm.setBlockhash(C, keccak256('x')); black(1e17, 0) -> st().ply == 1, st().moveOwner == 0xD05, st().moveStrength == 0. Control: vm.roll(C); white(1_000, 0xD05) -> st().closeBlock == C + 2. (B) Opponent's 1-wei bid: trade(white, 100e18, 0xA); roll past close; trade(black, 100e18, 0xB); roll past close; trade(white, 100e18, 0xA); roll past close; trade(black, 1, 0xA) -> ply 3 played, then bid() == {owner 0xA, size 1, strength 0}, chest(id,0) and chest(id,1) unchanged (fee 0), closeBlock == block + 2; roll to closeBlock + 1; trade(white, 1e18, 0xC) -> st().ply == 4, moveOwner == 0xA, moveStrength == 0. Expected from the brief: a silent side plays at 0% only after 600 s without a move and a first bid gets a window the team can answer; actual: 36 s, one free 1-wei trade, and one block to answer when the dust lands at closeBlock-1.","severity":"low","snippet":"if (!b.open && block.number >= g.closeBlock) g.closeBlock = uint40(block.number + turnBlocks - 1);","title":"A dust first bid owns a silent team's move at 0% within one window; the answer period is shortest one block before the close"},{"citation":"resolved","description":"Merged from audit_math (bid measured on leg amounts) and write_foundry_tests (size and strength read the raw swap). `delta` in _play is the PoolManager's swapDelta for amountToSwap, before the hook's own beforeSwap and afterSwap deltas are subtracted (v4 Hooks.afterSwap passes swapDelta to the hook and only then does `swapDelta = swapDelta - hookDelta`). For an exact-input buy of X, the pool input is X minus the beforeSwap fee (0.325%, or 0.425% on the slice side), so Bid.size is below what the trader paid and PAYOUT_CAP at line 682 (`t.size * PAYOUT_CAP`) caps a mate at under twice what the trade paid. For an exact-output buy of O, `got` is O plus the beforeSwap fee taken in the output currency (1.00425 O on the slice side) while the trader receives exactly O, so Strength.fromShare runs on more than was received. The brief and the manifest define strength as what the trade received as a share of its team's pot and the cap as twice what the bid paid; the code is off by the hook fee in one direction (a few basis points of strength, 0.325-0.425% of the cap). It never changes who holds the top bid in practice (far under the 10% raise rule) and moves no funds to the wrong party, so it is a precision deviation from the stated rule rather than a loss.","line":450,"path":"src/IMDuelHook.sol","reproduction":"Reproduced with test/scratch/JudgeRepro2.t.sol (Base, main duel, pots funded 1000e18 each, currency1 is the IMDUEL stand-in and White's team in game 0). Exact input: white(1e18, 0xE) -> bid().size == 996750000000000000 == 1e18 - 1e18*65/20000, so a mate by this bid is capped at 1.9935e18 where the brief's 'twice what it paid' is 2e18. Exact output: swap(pool, true, +500e18, 0xE) -> the trader's balance of the bought token rises by exactly 500e18; bid().strength == Strength.fromShare(500e18 + 500e18*65/20000 + 500e18*10/10000, chest(id, 1)) == 8095, while Strength.fromShare(500e18, chest(id, 1)) == 8088. Expected per the brief: 8088 (share of what was received) and a 2e18 cap; actual: 8095 and 1.9935e18.","severity":"low","snippet":"team == 1 ? (_abs(delta.amount0()), _abs(delta.amount1())) : (_abs(delta.amount1()), _abs(delta.amount0()));","title":"Bid size, strength and the 2x mate cap are measured on the pool's raw legs, not on what the trader paid and received"},{"citation":"resolved","description":"From audit_math; reproduced. amount * 65 / 20_000 is 0 for every side amount below 308 wei and amount * 10 / 10_000 is 0 below 1,000 wei, so a swap whose legs are both under 308 wei pays nothing to either pot or the burn, and afterSwap (line 303) emits no HookSwap because the hook took nothing. The trade still runs _play: it bids with size = its pool input and owns the move, at the 9,000 cap against an empty pot and at 0 against a funded one. This is the arithmetic that makes the dust bids of finding 1 free. The brief's 'takes 0.75% of every swap' does not hold at this boundary; the HookSwap guarantee ('every swap the hook takes a fee from') does hold. Economically dust: the 2x payout cap bounds any mate from such a bid to under 616 wei. No fix required; documented in the manifest as 'fees round down'.","line":319,"path":"src/IMDuelHook.sol","reproduction":"The specialist's proof (.imd/reads/proofs/Proof_ff1df9a26a21.t.sol, copied to test/scratch) runs and passes on this tree as a probe: main duel at 1:1 with deep liquidity and empty pots, white(300, 0xD057) -> no HookSwap log, one Bid log, chest(id,0), chest(id,1) and owed(0xdEaD, currency1) unchanged, bid().owner == 0xD057, bid().strength == 9000; after fundChest of 1 ether on the side to move, trade(team, 300, 0xD058) -> bid().owner == 0xD058, bid().strength == 0, bid().size == 300. Thresholds: 307*65/20000 == 0, 308*65/20000 == 1, 999*10/10000 == 0, 1000*10/10000 == 1.","severity":"info","snippet":"uint256 toChest = _addChest(id, idx, amount * CHEST_BPS / 20_000); // half the pot fee, from this side","title":"Swaps under 308 wei per side pay no pot fee and under 1,000 wei no slice, emit no HookSwap, yet place a full bid"},{"citation":"resolved","description":"Merged from audit_permissions (engine trust) and write_foundry_tests (an engine answer with an out-of-range word reverts the swap). _apply writes r.board, r.mover, r.other and r.status exactly as the immutable engine returned them; the production path never runs Rules.move, and the constructor (lines 189-192) deliberately does not check that the engine has code. Whatever sits at the engine address decides every move, every mate and so every payout. Likewise _engine (line 602) abi.decodes a 224-byte answer outside any try, so a 224-byte answer with a word out of range for uint16 or bool would revert the swap rather than take the fallback the manifest promises ('a failing engine never reverts a swap'). Neither is reachable in this launch: I fetched eth_getCode for 0xc21788f704a8b9456f7391a01d8a3d95be215a27 on Ethereum mainnet (public RPC) and it is byte-identical to out/ChessEngineV5.sol/ChessEngineV5.json deployedBytecode (23,339 bytes, equal strings), compiled from this tree with bytecode_hash none; ChessEngineV5 is pure Solidity, returns ABI-clean values, has no owner or upgrade path, and the hook's engine is immutable. Recorded as evidence for admission; no change required.","line":627,"path":"src/IMDuelHook.sol","reproduction":"State that would fail: deploy IMDuelHook with engine_ at a contract whose play() returns a Rules.Played with status 2 for any board; the first resolved move in the main duel is recorded as a mate and _payMate moves min(pot/4, 2x bid, game inflow) of the losing pot to the bidder. Or one whose play() returns 224 bytes with first word 0x10000: the resolving swap reverts in afterSwap (HookCallFailed) instead of falling back. With the committed address this is not reachable: eth_getCode(0xc21788f704a8b9456f7391a01d8a3d95be215a27) on chain 1 equals the local ChessEngineV5 deployedBytecode, 23,339 bytes, compared byte for byte on 2026-11-01.","severity":"info","snippet":"g.board = r.board;","title":"Trust assumption: the hook records the engine's returned board without a legality check; the committed engine address holds this tree's ChessEngineV5 bytecode"}],"hash":"1be0a42ba37f3cee96b6919bd4229aa8563074f557ae1e60ec389908c42ab75f","nodeId":"74a6edae-99a1-49f6-9e48-bd7ce4710dcc","outcome":"completed","summary":"The review is complete. The findings file at `.imd-findings.json` holds four findings and thirteen coverage rows, and no other file in the tree was changed.\n\n**Outcome: no blocking defects.** The build passes, all 241 project tests pass, and the launch manifest matches the hook's constructor and permissions. Nothing in the seven specialist findings reaches a loss of funds. I kept four after merging and dropped nothing outright, though two were folded into one trust note.\n\n**Findings kept, all reproduced on this tree**\n\n- **Low, merged from permissions and flow.** Any first bid owns a move, so the opponent can buy 1 wei of a silent team's token and have that move played at 0% about 36 seconds later instead of after the 600 second timeout. The earlier audit's fix gives a first bid a full window only in or after the closing block, so a dust bid one block before the close gets the shortest answer period. Reproduced in a scratch test at the launch's 3 block window, with both the gap and the 1 wei path. Bounded by the mate caps, so no pot pays more than its game took in.\n- **Low, merged from math and the tester.** Bid size, strength and the twice-the-bid mate cap read the PoolManager's raw swap legs, before the hook's own fee. A 1e18 exact input records a bid of 0.99675e18. An exact output of 500e18 gets strength 8095 where the share actually received gives 8088. Always a few basis points in one direction and never changes who holds the top bid.\n- **Info, from math.** Legs under 308 wei pay no pot fee and under 1,000 wei no slice, emit no HookSwap, yet place a full bid. The specialist's probe passes on this tree as described. This is the arithmetic behind the dust bids above.\n- **Info, merged from permissions and the tester.** The hook trusts the engine's returned board and would revert on a malformed 224 byte answer. I fetched the engine's code on Ethereum mainnet and it is byte for byte the local ChessEngineV5 build, so neither path is reachable with the committed address.\n\n**What I checked beyond the specialists.** Manager-only guards on every callback, the PartialFill check against v4's own delta arithmetic, claim solvency across fees, donations, mate payouts and withdrawals, the fund path through the hook's own unlock, hash expiry and timeout handling, carried-over bids across game boundaries, and the manifest's deployability including hook size, permission bits and both token orders. The IMD paired token on mainnet is a plain owned ERC-20 with 18 decimals, not a proxy.\n\n**Dropped or reshaped.** The tester's engine decode finding was not kept as its own entry because it cannot occur with the verified engine. The math specialist's attached proof passes rather than fails on this code, so it stays as a reproduction reference and not as a proof.","treeHash":null,"usage":{"cachedInputTokens":1676014,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":43593,"runtime":"claude","turns":33,"wallClockMs":967995}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"b12a68c6f8a8ce99","findings":[],"hash":"2ea3d733d6fe9838a85412abe1e36ef4d96a035094a72cf3be40a1a218b1864f","nodeId":"27028f99-2560-460f-a51e-f3788fb1b4f8","outcome":"completed","summary":"I found no economic defect I could reproduce, so `.imd-findings.json` has an empty findings list. It also has a coverage row for each of the 10 entry points (all `holds`) and four rows for the invariants I checked. I changed no project files, and the file is valid JSON.\n\nThe project builds, and the two money and mate test suites I ran pass (41 tests). I did not run the full `forge test` suite.\n\n**What I checked against the Economic Security, Invariant and Flow Gap guides:**\n- **The 0.75% fee:** each side of a trade puts 0.325% into its own token's pot, and 0.1% is taken only on the slice side. That slice is owed to 0x…dEaD in IMDUEL, or added to the main duel's IMD pot in a duel without IMDUEL. Fees are recorded as claims in the PoolManager and balance out within the swap. An order that only partly fills reverts.\n- **Claims match the books:** in every currency, the claims the hook holds equal the pots plus what is owed to players. Fees, slices and `fundChest` each add claims and book them in the same step. Mate payouts move money from a pot to what is owed. `withdraw` and `withdrawTo` remove exactly what they pay out and leave 1 wei.\n- **Mate payouts:** a mate pays the smallest of a quarter of the losing pot, twice what the mating bid paid, and that game's trade inflow into the losing pot, in the loser's token. The bid amount and the payout are in the same token. The inflow is read for the right game, before the trade that plays the mate adds its own fees. Money added through `fundChest` and the slices never counts as inflow.\n- **Only checkmate pays:** timeout moves and moves replayed after their block hash expired have no owner, so they pay no one. Draws and engine failures never reach the payout code.\n- **The static-analysis leads:** the `^` in `teamOf` is meant as XOR to alternate colours between games. The ETH-lock lead only applies to `fundChest`, where the ETH is settled into the PoolManager and counted in the pot.\n\n**What I looked at but did not report:**\n- A trade under about 308 wei rounds its fee to zero and can still take the first bid in an empty window. Any normal trade can outbid it, it plays at 0% strength, and a mate from it pays at most about 2 wei.\n- Anyone can buy a team's token to make a weak bid for that team's move, which plays after the normal 3-block window. That follows from \"every swap bids for its team's next move\".\n- A trader acting alone can't profit from mates: they get back at most 0.325% of their own volume after paying 2% in fees.\n\n**Not covered in depth:** the chess engine and `Bitboard` internals, gas costs, and the exact sign convention URC-2 expects for `HookSwap`. I relied on the existing tests for that last one.","treeHash":null,"usage":{"cachedInputTokens":432837,"inputTokens":14,"model":"claude-opus-5-5","outputTokens":25723,"runtime":"claude","turns":7,"wallClockMs":363075}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c35be49d2f8f8def","findings":[{"citation":"resolved","description":"_owner falls back to tx.origin whenever the swap carries no 20- or 32-byte hookData. For an EOA trading through a router that is the trader, but for a smart-contract wallet (ERC-4337 account, Safe, any contract that calls a router) tx.origin is the bundler or relayer that submitted the transaction. The bid is recorded for that relayer (TopBid.owner), Moved/Bid events name it, stats count for it, and if the move checkmates, _payMate books owed[relayer][loser token], so the reward of a real trader is claimable by an unrelated party. The requester lists this as accepted in the contract notes and launch.json; it is recorded here because it is a payout to the wrong party under an ordinary condition (any smart wallet whose router does not forward hookData), and the Pashov and v4-security checklists both flag tx.origin for attribution. A fix that keeps the design is to use the `sender` the PoolManager passes to afterSwap when it is not a known router, or to document loudly that integrators must pass hookData.","line":474,"path":"src/IMDuelHook.sol","reproduction":"Pool: IMD/IMDUEL main duel with liquidity (any token order). Deploy a SmartWallet contract that calls PoolSwapTest.swap(key, SwapParams(true, -1e20, MIN_SQRT_PRICE+1), settings, \"\") with empty hookData. Send it with vm.prank(address(wallet), 0xB0B) so msg.sender is the wallet and tx.origin is 0xB0B. Expected: the bid for currency1's team belongs to the wallet (the party that paid). Actual: hook.game(id).bids[1].owner == 0x0000000000000000000000000000000000000B0b (the relayer). Verified in a scratch Foundry test on this tree (test passes with that assertion). If that bid later plays a mating move, owed[0xB0B][loserCurrency] receives the payout and 0xB0B can withdraw it.","severity":"low","snippet":"        if (owner == address(0) || owner == address(this) || owner == address(manager) || owner == DEAD) owner = tx.origin;","title":"A trade relayed for a smart-contract wallet without hookData credits tx.origin: the bid, its move and any mate payout go to the relayer or bundler"},{"citation":"resolved","description":"_resolve runs inside the first afterSwap after closeBlock and gives the engine up to ENGINE_GAS (3,000,000) plus FALLBACK_GAS (2,000,000) on failure. Wallets and routers set a swap's gas limit from a simulation against the latest block; while the window is still open the simulation does not include the engine, so the limit is ~350k plus a buffer. If the window closes before inclusion (every 3 blocks on mainnet with turnBlocks = 3), the swap that lands first reverts. The failing frame is the hook's own: the engine staticcall takes 63/64 of what is left, _enoughGas then runs with ~1/64 and the afterSwap frame runs out of gas before `revert NotEnoughGas()` is reached, so the PoolManager wraps an empty reason (Wrap__FailedHookCall(hook, afterSwap selector, 0x, HookCallFailed())). The user loses the gas, the trade does not happen, and the error message does not say what to do. The notes promise `NotEnoughGas` as the signal; in this reproduction it is not produced. No funds are at risk beyond gas and no state is corrupted; it is a liveness/UX defect that will recur for a share of trades every window. Mitigations: lower ENGINE_GAS to what the engine measurably needs (the heaviest measured move is ~950k per the contract comment), move resolution to a dedicated permissionless `play(poolId)` so swaps never carry it, or at least make _enoughGas's check run before the engine call (reserve the gas up front) so the revert reason survives.","line":575,"path":"src/IMDuelHook.sol","reproduction":"Scratch Foundry test on this tree, fresh PoolManager, IMD/IMDUEL pool at fee 12500/spacing 60, full-range liquidity 1e6e18, hook with turnBlocks 3 and the real ChessEngineV5. (1) swap exact-input 1e20 currency0 -> currency1 with 5M gas: succeeds, measured 343,912 gas (bids for White). (2) same swap in the same block with gas = 343,912 * 1.3 = 447,085: succeeds. (3) vm.roll(closeBlock + 1); the same swap with 447,085 gas: reverts; return data 0x90bfb865... decodes to Wrap__FailedHookCall(hook, 0xb47b2fb1 afterSwap, reason = 0x (empty), details = 0xa9e35b2f HookCallFailed()). Expected per the notes: a revert carrying NotEnoughGas() (0xdd629f86), or success. (4) the same swap with 6M gas succeeds and uses 603,042 gas in the opening position (1.75x the in-window swap; heavier positions approach ENGINE_GAS).","severity":"low","snippet":"        (bool ok, bytes memory result) = address(engine).staticcall{gas: gasCap}(data);","title":"The first swap after a bidding window closes needs several times the gas of an ordinary swap; a swap sent with a gas limit estimated during the open window reverts opaquely (hook frame out of gas, not"},{"citation":"resolved","description":"The manifest schema has no token.constructorArgs or token.totalSupply (supply comes from the launch policy). The deployer drops unknown keys, so these do not break admission, but a reader may take totalSupply as deployment authority. Everything else in launch.json checks out: four hook constructorArgs in declaration order matching constructor(IPoolManager, IChessEngine, Currency, uint256) with $poolManager first, lowercase addresses, string uints, permissions equal to getHookPermissions, pool.fee 12500 with tickSpacing 60, notes 3,362 characters (under 4,000). The engine address 0xc21788f704a8b9456f7391a01d8a3d95be215a27 has 23,339 bytes of code on chain 1 and it is byte-identical to this tree's ChessEngineV5 build (forge, solc 0.8.26, via_ir, 200 runs), so the unchecked constructor argument points at the intended engine.","line":25,"path":"launch.json","reproduction":"Read launch.json lines 21 and 25. Compare with the schema fields listed in the task reference (kind, hook.contract, hook.constructorArgs, hook.permissions, token.contract/name/symbol/decimals, pool.pairedCurrency/fee/tickSpacing/initialPrice, notes). The two keys are not in it. Engine check: eth_getCode(0xc21788f704a8b9456f7391a01d8a3d95be215a27, latest) on chain 1 equals out/ChessEngineV5.sol/ChessEngineV5.json deployedBytecode.object.","severity":"info","snippet":"    \"totalSupply\": \"1000000000000000000000000000\"","title":"launch.json carries keys outside the manifest schema (token.constructorArgs, token.totalSupply); they are dropped and describe nothing"},{"citation":"resolved","description":"Read in full: src/IMDuelHook.sol, src/IMDuelToken.sol, src/Strength.sol, src/Rules.sol, src/Chess.sol, src/IChessEngine.sol, launch.json, launch/hook.json, script/LaunchPolicy.sol, test/Base.sol, test/Harness.sol, test/V4Fixture.sol, test/Launch.t.sol, part of test/Hostile.t.sol, and the four protected tests under .imd/reads. Read only at its entry points (play, playAny, _choose): src/ChessEngineV5.sol; its 850 lines of search and src/Bitboard.sol (719 lines) were not audited move by move; the on-chain engine was verified byte-identical to this build instead. forge build passes (lint warnings only); forge test passes 177/177 including both token orders (Launch.t.sol) and the hostile-token and invariant suites. Slither 0.11.6 on src/ reports one reentrancy-no-eth in afterSwap, a false positive (the only external call is PoolManager.mint; no untrusted code runs). The arbitrary-send-erc20 detector does not fire on the low-level transferFrom call at line 411. Leads traced and closed: fee accounting for exact-input and exact-output in both directions (beforeSwap specified delta plus mint, afterSwap unspecified delta plus mint, net hook delta zero; PartialFill check matches v4's raw swapDelta); hook solvency (claims == chests + owed, including the IMD slice routed to the main pot and the IMDUEL slice owed to 0xdEaD); mate payout caps (quarter of loser pot, 2x bid, game inflow, all in the loser's token, taken from the loser's pot); timeout, expired-hash and engine-failure paths; reentrancy through withdraw/withdrawTo/fundChest (owed set before unlock, nested unlock reverts); hookData owner parsing; HookSwap matches URC-2's declaration (PoolId indexed id, address indexed sender, int128 amount0, int128 amount1, uint24 swapFee); permissions match the address flags and the manifest; all callbacks are PoolManager-only; afterInitialize is present so the pool cannot be pre-initialised; no owner, pause, mint, DELEGATECALL, SELFDESTRUCT or proxy in hook or token (hook runtime 16,876 bytes, token 1,088). Launch-forbidden features: none found.","line":52,"path":"src/IMDuelHook.sol","reproduction":"Not a defect. Commands run: forge build; forge test (177 passed); slither . --detect arbitrary-send-erc20,reentrancy-eth,reentrancy-no-eth,delegatecall-loop,suicidal,controlled-delegatecall --filter-paths 'lib/|test/|script/'.","severity":"info","snippet":"contract IMDuelHook is IUnlockCallback {","title":"Coverage: contracts read, checks run, and leads closed without a finding"}],"hash":"5015232c3db162914cdfbf55f338def72b397d65971767e1a9db2953be1af42b","nodeId":"d602237b-cf32-4414-bbe7-f242b0b2e4d0","outcome":"completed","summary":"The review is complete. The findings file is written and validated, the working tree is otherwise untouched, and scratch files are removed.\n\n**Outcome: no fund-loss, accounting or access-control defect found in the IMDuel hook or token.** The report in `.imd-findings.json` holds two low findings and two info entries.\n\n**What I checked**\n- Read in full: the hook, token, Strength, Rules, Chess, the engine interface, launch.json, the launch policy script, the test fixtures, the launch test for both token orders, and all four protected floor tests. The chess engine and bitboard libraries were read only at their entry points. Instead, I fetched the engine's code on chain 1 and it is byte-identical to this tree's build.\n- Build and tests: forge build passes with lint warnings only. All 177 tests pass, including both token orders and the hostile-token and invariant suites.\n- Slither 0.11.6 on src reports one reentrancy-no-eth in afterSwap, a false positive since the only external call is to the PoolManager. The arbitrary-send-erc20 detector did not fire on the low-level transferFrom.\n- Leads traced and closed: fee deltas for exact-input and exact-output in both directions, hook solvency across pools, mate payout caps, timeout and expired-hash paths, reentrancy through withdraw and fundChest, HookSwap against URC-2's actual declaration (it matches), permission bits, PoolManager-only callbacks, and the absence of owner, pause, mint, proxy or self-destruct paths.\n\n**Findings written**\n- **Low, relayer attribution.** A smart-wallet trade without hookData credits tx.origin. Reproduced: the bid owner became the pranked relayer address, so a mate payout would be claimable by the bundler. The requester lists this as accepted.\n- **Low, gas after a window closes.** A swap with 1.3× an ordinary swap's gas succeeds in the window and reverts in the first block after it. The hook's own frame runs out of gas, so the wrapped revert carries an empty reason rather than the documented NotEnoughGas. Measured: 343,912 gas in-window, 603,042 to resolve the opening position.\n- **Info, manifest.** launch.json has two keys outside the schema (token.constructorArgs, token.totalSupply). Everything else in the manifest checks out, notes are 3,362 characters.\n- **Info, coverage.** Which contracts were read, which were not, and the commands run.\n\nNo critical or high findings, so no proof files were attached.","treeHash":null,"usage":{"cachedInputTokens":2263871,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":58804,"runtime":"claude","turns":42,"wallClockMs":1514093}},{"artifacts":[],"attempt":1,"bundleHash":"113ba98a2664f96b9268d67d2c3f6c1a602698feeb211b3d7514b2f00dbbaa0e","device":"6f41bd9b44d3e708","findings":[{"description":"The brief says strength is 'what its trade received' as a share of its team's pot, and that a mate pays at most 'twice what that move's bid paid'. _play takes both from the PoolManager's raw swap delta, before the hook's own fee is applied on the output or input side. So a trade's recorded `paid` is below what it paid and its `got` is above what it received, by the hook fee on that side (0.325% to 0.425%). The effect is small and always in one direction: the 2x cap is slightly lower than the brief's words, and strength slightly higher (at most about 6 bps of strength, from log2(1.00425) * 903). Existing comments in test/Hostile.t.sol and test/GasEstimate.t.sol describe the size as 'what the pool received, net of the hook fee', so this may be intended; the brief and the code's own comment on _trade ('what it received') don't say so. The new tests pin the implemented measure (test_twiceTheBidBinds, testFuzz_strengthReadsItsOwnTeamsPot, test_exactlyTenPercentMoreDoesNotTakeTheTop) and would need the same change if the requester wants the brief's literal reading.","line":449,"path":"src/IMDuelHook.sol","reproduction":"Exact input of 1e18 IMD buying IMDUEL: the trader pays 1e18, Bid.size is 1e18 - 1e18*65/20000 = 996750000000000000, so the mate cap is 1.9935e18. Expected by the brief's wording: 2e18. Exact output of O IMDUEL: the trader receives exactly O, while `got` is O + O*65/20000 + O*10/10000 = 1.00425 * O, so a trade receiving 0.9958 of a pot is treated as a whole pot and plays at the 9,000 cap. Expected by the brief's wording: strength from 0.9958 of the pot, about 8,994.","severity":"low","title":"A bid's size and strength read the raw swap, not what the trade paid and received as the brief words them"},{"description":"_engine's comment says 'ok only for a well-formed answer', and launch.json says 'A failing engine never reverts a swap'. It checks the call's success and that the answer is 224 bytes, then abi.decodes it outside any try. A 224-byte answer holding a word out of range for its type makes the decode revert inside afterSwap, so the fallback and the draw path are never reached, and every swap of that pool reverts for as long as the engine answers that way at that position. This is not reachable with the committed engine: ChessEngineV5 is compiled Solidity, returns ABI-clean values and is immutable, so nothing in this launch can trigger it. It is reported because the stated guarantee is wider than the code, and because the hook does not check the engine's address on chain. The new tests cover only the failures the hook handles (a revert, too few bytes, a move number of 4096 or more) and do not assert this case either way.","line":602,"path":"src/IMDuelHook.sol","reproduction":"Put at the engine's address a contract whose play() returns 224 bytes with the first word 0x10000 (out of range for uint16). Buy with 1e18 IMD, roll past closeBlock, swap again. Expected per launch.json: EngineFailed, then a legal fallback move or a draw, and the swap succeeds. Actual: the swap reverts with WrappedError(hook, afterSwap selector 0xb47b2fb1, empty reason, HookCallFailed 0xa9e35b2f). Confirmed locally against the production hook and token, launched through the factory-shaped probe.","severity":"info","title":"An engine answer of the right length with an out-of-range word reverts the swap instead of falling back"}],"hash":"a9b51bd8e8687934854dcf739baa081b1b74b283a498747af1688b9bab7a7c04","nodeId":"38487da5-75b5-427c-980c-b8b0476be6ec","outcome":"completed","summary":"I added 57 tests for the IMDuel launch, and the full suite passes with the verifier's seed: `forge build` succeeds and `forge test` shows 241 passed, 0 failed, 0 skipped in about 15 s. I changed nothing outside `test/` apart from writing `.imd-findings.json`, and made no commit.\n\nThe earlier tests mostly used a test harness with setters at fee 3000. The new ones run the production hook and token, launched in one factory-shaped call with the committed constructor arguments, at fee 12500 and spacing 60, in both token orders.\n\n## New files\n| File | What it covers |\n| --- | --- |\n| `test/LaunchFixture.sol` | The two launches, plus a scriptable engine at the committed engine address and a stand-in for the EIP-2935 block-hash history contract. |\n| `test/LaunchMoney.t.sol` | Every wei of the 0.65% and 0.1% fees and `HookSwap` across all swap shapes, side duels, and with a protocol fee on. Also pots at their limit, the mate's least-of-three payout, and everything that must pay nothing. |\n| `test/LaunchFailures.t.sol` | Failure paths: caller checks, no privileged functions, refused openings and orders, malformed `hookData`, and exact edges (110% raise, 600 s timeout, 256 and 8,191 block hashes). Also claims, hostile tokens and recipients, and engine failures. |\n| `test/LaunchInvariant.t.sol` | Random call sequences with fail-on-revert on: 64×100 per invariant with the scripted engine, 16×120 with the real engine, in both token orders. It keeps its own books from the brief, and a fixed walk confirms every ending and claim path is actually reached. |\n\n## How strong the tests are\nI ran 27 deliberate mutations of the hook in a temporary copy, without the invariant file. Four survived at first; I added tests for those gaps and all 27 now fail the suite.\n\n## Findings (`.imd-findings.json`)\nNeither is critical or high, so neither carries a proof file.\n- **Low – bid size and strength use the raw swap amounts:** the brief says what the trade \"paid\" and \"received\", but the hook measures before its own fee. A 1e18 IMD exact-input bid records 0.99675e18, so the 2× cap is 1.9935e18 rather than 2e18. This may be intended, and three new tests pin the current behaviour, so they would change if you want the literal reading.\n- **Info – a malformed engine answer reverts the swap:** a 224-byte answer with an out-of-range word reverts instead of falling back, though `launch.json` says a failing engine never reverts a swap. I reproduced it against the production hook, but the committed engine can't produce such an answer.\n\nNo test asserts the malformed-answer case either way.\n\n## Limits\n- **Scripted endings:** most mate and draw paths use the scripted engine, which plays legal moves but reports the ending the test asks for. Real-engine runs reach few natural mates; mates on real positions are covered by the older harness tests.\n- **No fork tests:** the task named no fork blocks, so the code at `0xc217…5a27` and the real IMD token are still unchecked on mainnet. Those fork runs are still owed.\n- **`launch.json` not pinned by a test:** `fs_permissions` stops tests reading the repo root, so I compared it by hand. It matches `launch/hook.json` except for the engine placeholder in the constructor arguments and the notes text.","treeHash":"4c96300089eb9791ee8523540e2c8b3878560dea","usage":{"cachedInputTokens":6240214,"inputTokens":46,"model":"claude-opus-5-5","outputTokens":163927,"runtime":"claude","turns":47,"wallClockMs":3611723}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"00920b27421b9a80","findings":[],"hash":"bb59e552879c27e449586d98002b08138a6b409a18ac779764e8e03013f6e7c3","nodeId":"27028f99-2560-460f-a51e-f3788fb1b4f8","outcome":"failed","summary":"Claude Code can't use your Claude subscription, usually because a payment is past due · Pay or renew at https://claude.ai/… (if you just paid, try again shortly), or use an Anthropic API key instead","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"claude","turns":1,"wallClockMs":1451}},{"artifacts":[],"attempt":1,"bundleHash":"2d79ff0614cbedfd0776dbd101eccb03c9d73da0547fa728e9c0dbddc917a61f","device":"c0d25825e3f9518b","findings":[],"hash":"e0fbd4c62f881bce05969142ee74e364adfe8454028f33768ddf4956e5cb9368","nodeId":"2b8e767d-2b60-43c0-9b80-0f3142a62b58","outcome":"completed","summary":"Updated [launch.json](/home/imd-worker/.identitymd/work/4098dafa-99b4-4c9f-97e3-430b49ea6afa/2b8e767d-2b60-43c0-9b80-0f3142a62b58/launch.json), removing unsupported token fields and refining technical notes. Constructor arguments, permissions and pool settings are preserved.\n\n`forge build` passed with existing warnings. All 184 tests passed using the specified fuzz seed, including both factory token orders.\n\nOnly `launch.json` changed.","treeHash":"1214f161ccd6f46fbcca3f315554d7aa849f138d","usage":{"cachedInputTokens":1868544,"inputTokens":78038,"model":"gpt-6-astra","outputTokens":9445,"runtime":"codex","turns":6,"wallClockMs":316414}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6b0a28df3d585600","findings":[{"citation":"resolved","description":"Math Precision / zero-rounding at the boundary. amount * 65 / 20_000 is 0 for every side amount below 308 wei and amount * 10 / 10_000 is 0 below 1,000 wei, so a swap whose both legs are under 308 wei pays nothing to either pot, nothing to the burn, and (per line 303) emits no HookSwap, although the brief says the hook takes 0.75% of every swap and every fee-bearing swap emits HookSwap. The trade still runs the whole game side (_play): it bids with size = its pool input, its owner is recorded, and against an empty pot (every side duel at creation, the main duel before its first fee) its strength is the 9,000 cap for free; against a funded pot it is 0 but still owns the move until someone pays over 10% more than ~300 wei. Economically this is dust (0.75% of 300 wei) and the 2x payout cap bounds any mate from such a bid to 600 wei, so there is no loss of funds; it is reported because it is a concrete deviation from the stated fee and event guarantee at the input boundary, and it lets anyone own an unbid move for only gas (the same effect a 600 s timeout gives for free, but 36 s after the previous move instead).","line":319,"path":"src/IMDuelHook.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {Vm} from \"forge-std/Test.sol\";\nimport {Currency, CurrencyLibrary} from \"v4-core/src/types/Currency.sol\";\nimport {Base} from \"../Base.sol\";\nimport {IMDuelHook} from \"../../src/IMDuelHook.sol\";\n\n/// Probe: a swap under the fee floor (308 wei per side for the pot fee, 1,000 wei for the slice) pays nothing,\n/// emits no HookSwap, yet bids and owns the move.\ncontract FeeFloorProbe is Base {\n    using CurrencyLibrary for Currency;\n\n    function setUp() public {\n        setUpMainDuel();\n    }\n\n    function test_dustSwapPaysNothingButBids() public {\n        uint256 c0 = hook.chest(id, 0);\n        uint256 c1 = hook.chest(id, 1);\n        uint256 burn = hook.owed(DEAD, currency1.toId());\n        vm.recordLogs();\n        white(300, address(0xD057)); // 300 wei exact input\n        Vm.Log[] memory logs = vm.getRecordedLogs();\n        assertEq(count(logs, HOOK_SWAP), 0, \"no HookSwap\");\n        assertEq(count(logs, BID), 1, \"but a bid\");\n        assertEq(hook.chest(id, 0), c0, \"pot 0 unchanged\");\n        assertEq(hook.chest(id, 1), c1, \"pot 1 unchanged\");\n        assertEq(hook.owed(DEAD, currency1.toId()), burn, \"no slice\");\n        assertEq(bid().owner, address(0xD057));\n        assertEq(bid().strength, 9_000, \"empty pot: the cap, for free\");\n        // now with a funded pot: a 1 ether pot, 300 wei dust -> strength 0, still owns the move\n        next(12);\n        playTurn();\n        uint256 team = toMove();\n        MockERC20Like(Currency.unwrap(team == 0 ? currency0 : currency1)).approve(address(hook), type(uint256).max);\n        hook.fundChest(pool, team == 1, 1 ether);\n        trade(team, 300, address(0xD058));\n        assertEq(bid().owner, address(0xD058));\n        assertEq(bid().strength, 0);\n        assertEq(bid().size, 300);\n    }\n\n    /// The exact fee floor: 307 wei pays no pot fee, 308 pays 1 wei.\n    function test_feeFloorValues() public pure {\n        assertEq(uint256(307) * 65 / 20_000, 0);\n        assertEq(uint256(308) * 65 / 20_000, 1);\n        assertEq(uint256(999) * 10 / 10_000, 0);\n        assertEq(uint256(1000) * 10 / 10_000, 1);\n    }\n}\n\ninterface MockERC20Like {\n    function approve(address, uint256) external returns (bool);\n}","reproduction":"Main duel at 1:1, deep liquidity, empty pots. Exact-input swap of 300 wei buying White's token with hookData 0xD057: beforeSwap fee = 300*65/20000 = 0, slice 300*10/10000 = 0; output ~297 wei, afterSwap fee 0. Expected per brief: 0.75% taken and a HookSwap event. Actual: chests and owed[0xdEaD] unchanged, no HookSwap, one Bid event, bid().owner == 0xD057, bid().strength == 9000 (empty pot). After funding the pot with 1 ether, a second 300-wei buy still becomes the top bid with size 300 and strength 0. test/scratch/FeeFloor.t.sol test_dustSwapPaysNothingButBids passes on the current code, showing the behaviour; test_feeFloorValues pins the thresholds 307/308 and 999/1000 wei.","severity":"info","snippet":"uint256 toChest = _addChest(id, idx, amount * CHEST_BPS / 20_000); // half the pot fee, from this side","title":"Fee floor: swaps under 308 wei per side pay no pot fee and under 1,000 wei no slice, emit no HookSwap, yet place a full bid"},{"citation":"resolved","description":"Numerical gap (precision x invariant), no loss. `delta` in _play is v4's swapDelta before the hook's own deltas are subtracted. For an exact-input buy of X the pool input is X - fee_before (the beforeSwap fee already came off), so the bid size is 0.325% (0.425% on the slice side) under what the trader paid, and `got` is the pool output before the afterSwap fee, so strength is computed on up to 0.425% more than the trader actually received. For an exact-output buy the size is the pool input before the afterSwap fee (again under what the trader pays) and `got` is X + fee_before, above the X delivered. The brief defines strength as the share the trade received and the mate cap as twice what the bid paid; both are off by the hook fee. _payMate line 682 then caps the prize at 2 * t.size, i.e. up to 0.85% under twice what the trader really paid. The deviation is bounded by the 0.75% fee, far under the 10% raise rule, so it changes no bidding outcome in practice; reported as a precise statement of what the recorded numbers mean.","line":450,"path":"src/IMDuelHook.sol","reproduction":"Main duel, IMD = currency0, IMDUEL = currency1, deep 1:1 liquidity, empty pots. Exact-input buy of IMDUEL with amountSpecified = -1e18 IMD. beforeSwap takes 1e18*65/20000 = 3.25e15 IMD; pool input = 9.9675e17; bid().size == 996750000000000000, not 1e18. If this bid mates, PAYOUT_CAP bounds the prize at 1.9935e18 IMD where 'twice what the trade paid' is 2e18. Same trade: pool output ~9.9e17 IMDUEL, afterSwap takes 0.425% of it; strength uses the pre-fee output (Strength.fromShare(got, chest)) while the trader receives got * 0.99575. Observed with test/Money.t.sol test_aBuyFeedsBothPotsAndBurnsTheSlice style setup by reading bid().size after the swap.","severity":"info","snippet":"team == 1 ? (_abs(delta.amount0()), _abs(delta.amount1())) : (_abs(delta.amount1()), _abs(delta.amount0()));","title":"Bid size, strength and the 2x payout cap are measured on the pool's leg amounts, not on what the trader paid or received"}],"hash":"e68672d79e44fb09c95098bad9c7fcacfb5aed5f38d09d814033736e7215a9d8","nodeId":"a00a6164-746d-46c0-8830-31dbab3bad20","outcome":"completed","summary":"The review is complete and the findings file is written. Here is the recap.\n\n**Outcome.** The hook's money math holds under the Math Precision, Boundary and Numerical Gap passes. I found no defect that loses funds, pays the wrong party or breaks the game. Two informational boundary facts are recorded, each with a verified reproduction.\n\n**What I checked and found sound:**\n- Fee schedule: 0.325% from each leg into that token's pot plus the 0.1% slice on the slice side, taken before the swap on the specified leg and after it on the other. The PartialFill check matches v4's swapDelta semantics for both exact-input and exact-output orders.\n- Casts and packing: the int128 fee cast is protected because the PoolManager's mint reverts first for oversized amounts. The game-inflow word (game number, two 112-bit halves) and the transient pending-fee slot (two 128-bit halves) cannot spill or interleave within a swap.\n- Mate payout: the three caps (quarter of the loser's pot, twice the bid, the game's inflow into the losing pot) are all in the loser's token, overflow-free, and read before the resolving trade's inflow is written under the new game.\n- Strength curve: monotone, capped at 9,000, zero at or below a 0.1% share, no overflow for pool-sized amounts.\n- Repetition ring and engine history: lane, slot and parity arithmetic agree with each other.\n- Deployed engine: the code at the constructor's engine address on chain 1 is byte-identical to this tree's ChessEngineV5 build.\n- Token: plain ERC-20 with bounded unchecked arithmetic.\n\n**Findings recorded (both info):**\n1. Fee floor. A swap whose legs are under 308 wei pays no pot fee, under 1,000 wei no slice, emits no HookSwap, yet still places a full bid, at the 9,000 cap against an empty pot. The scratch test `test/scratch/FeeFloor.t.sol` demonstrates it.\n2. Bid size, strength and the 2x payout cap use the pool's leg amounts, not what the trader paid or received. A 1e18 exact-input buy records a bid size of 996,750,000,000,000,000. Bounded by the 0.75% fee, so no bidding outcome changes.\n\n**Coverage.** All ten listed entry points have rows, plus six invariant rows. The only unreached area is the internal evaluation arithmetic of the engine and bitboard libraries, which is outside the hook's money math.\n\nTargeted suites (95 tests across the money, pot, strength, bidding, window, team and draw files) pass on this tree. No repository file was changed; the scratch tests live only under `test/scratch/`.","treeHash":null,"usage":{"cachedInputTokens":2018166,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":48031,"runtime":"claude","turns":32,"wallClockMs":1317523}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3c1226d190150ef0","findings":[{"citation":"resolved","description":"_play gives a move's first bid a new full window only when it lands in the window's last block or later (block.number >= g.closeBlock). The comment on this line gives the reason, from swarm audit 74895075 L-1: 'so the team can answer it'. A first bid one block earlier gets no extension, and this is where the protection is weakest. With turnBlocks = 3 and close C: dust at C-2 leaves two blocks to answer (C-1, C), dust at C-1 leaves one (C), and dust at C leaves two (C+1, C+2). So an attacker moves the L-1 attack back one block. Any wallet can buy dust of the side to move's token in block C-1. Unless a real buy of that token lands in the very next block, the dust bid owns the move at strength 0 and the next trade plays it. Anyone can do this for one dust trade's gas (about 190k-200k gas for a non-resolving swap on the mainnet fork rehearsal), on any turn where that team has no queued bid and no bid in the window's first two blocks. It brings a 0% move forward from the 600 s timeout to about 24 s after the previous move. A team pushed into repeated 0% moves is more likely to be mated, and a mate pays from its pot, though I did not measure that effect. The team can defend by bidding early, including a queued bid during the opponent's turn, and any real buy in block C outbids the dust. Scope: launch.json's notes state this exact rule ('a first bid in or after the last block opens 3 blocks from it') and test_onlyALateFirstBidMovesTheWindow pins part of it, so this is a gap in the L-1 guarantee and not a departure from the manifest. A fix is a design decision: for example closeBlock = max(closeBlock, block.number + turnBlocks - 1) on a first bid gives every first bid a full window. That lets a first bid delay a move by up to 2 blocks, and it requires changing that test and the manifest note.","line":456,"path":"src/IMDuelHook.sol","reproduction":"Setup: a contract extending test/Base.sol with turnBlocks() = 3; setUpMainDuel(); approve the hook on both currencies; fundChest(pool, false, 1000e18) and fundChest(pool, true, 1000e18). State: game 0, ply 0, no open bid, C = st().closeBlock. Steps: vm.roll(C - 1); white(1_000, address(0xD05)); no trade in block C; vm.roll(C + 1); vm.setBlockhash(C, keccak256('x')); black(1e17, address(0)). Actual, run and passing as assertions: after the dust trade closeBlock is still C, bid().owner is 0xD05 and bid().strength is 0; after the next trade ply is 1, moveOwner is 0xD05 and moveStrength is 0. Control: vm.roll(C); white(1_000, address(0xD05)) gives closeBlock == C + 2. Expected from the stated purpose: a dust first bid should not get a shorter answer period for landing one block earlier.","severity":"low","snippet":"if (!b.open && block.number >= g.closeBlock) g.closeBlock = uint40(block.number + turnBlocks - 1);","title":"A dust first bid one block before a window closes still owns a silent team's move at 0%, with a single block to answer"}],"hash":"e94fe0895930933a46d9e580b1d1305cb48bb7d78aca0adbf24d0cb12c88be40","nodeId":"5961aa1b-cd2b-4b5d-b0f5-73f33badd614","outcome":"completed","summary":"The control-flow audit found one low-severity defect and nothing critical, high or medium. The results are in `.imd-findings.json`: that finding plus 18 coverage rows, one for each of the 10 entry points and 8 for invariants I checked. No tracked files changed, and I deleted my scratch tests.\n\n## Finding\n**Low: a dust first bid one block before a window closes can still take a silent team's move** (`src/IMDuelHook.sol:456`).\n- **Cause:** only a first bid in the window's last block or later gets a new full window. A dust buy in the block before that gets no extension.\n- **Effect:** the team has one block to answer. If no real buy lands, the dust bid owns the move at 0% strength. It costs one dust trade's gas (about 190k–200k on the fork), and the 0% move comes about 24 s after the previous one instead of at the 600 s timeout.\n- **Reproduced:** with a 3-block window closing at block C, dust at C-1 kept the close at C and the next trade played it at 0%. The same dust at C moved the close to C+2.\n- **Not measured:** how much repeated 0% moves raise a team's chance of being mated, which is what would cost it pot money.\n- **Fixing it is a design choice:** `launch.json` states this exact rule and `test_onlyALateFirstBidMovesTheWindow` pins part of it. A fix means changing both and lets a first bid delay a move by up to 2 blocks, so I didn't include a proof test.\n\n## What I checked\n- **Execution Trace:** I traced every entry point through fees, partial fills, move resolution, mate payouts and withdrawals. That included hostile tokens and recipients re-entering mid-call, and starving the engine of gas; none of them broke anything.\n- **Periphery:**\n    - `Strength`, `Chess`, `Rules` and the token all hold.\n    - `Bitboard` matches expected move counts (perft) on 7 positions, including castling, en passant and queen-only promotion.\n- **First Principles:**\n    - A bid can't be changed once the block hash is known, and low gas can't force the fallback move.\n    - The stats never affect play.\n    - The game-inflow record stays correct across games.\n- **Static analysis leads:** the ones I traced in the hook are false positives, including `teamOf`'s `^`, the \"locks Ether\" flag and the `afterSwap` reentrancy flag. I didn't trace the `Bitboard` and engine lint items individually.\n\n## Evidence from running it\n- **Project tests:** `forge test` passes 184 of 184 with the README's seed.\n- **Engine:** the deployed bytecode at the `launch.json` address is byte-for-byte identical to this build.\n- **Mainnet fork:** a launch using the real PoolManager, real IMD and the deployed engine ran 240 swaps in each token order, playing 237–239 moves. The hook's claims matched its books, and burn, `withdrawTo` and factory fee collection all worked.\n- **HookSwap:** the event matches the URC-2 draft's signature and signs, though the draft is still under discussion.\n\n## Limits\n- **Fork block hashes:** the fork can't serve hashes for future blocks, so I set them by hand. I called the live EIP-2935 history contract directly, but no fork swap resolved a move through it; the local tests cover that path with a stub.\n- **Engine gas:** the worst case I measured was 2.65M against the 3M cap, on a contrived position, and this wasn't an exhaustive search. Going over the cap only falls back to a legal move at 0%.\n- **IMD token:** I exercised it through normal transfers only and didn't review its owner powers.\n- **Economics:** I only touched bidding and pot strategy where they crossed control flow, such as whether a large low-strength bid is worth making.\n\nSources:\n- [URC-2: Custom Accounting Hook Swap Event](https://gov.uniswap.org/t/urc-2-custom-accounting-hook-swap-event/26154)","treeHash":null,"usage":{"cachedInputTokens":4823533,"inputTokens":45,"model":"claude-opus-5-5","outputTokens":105639,"runtime":"claude","turns":36,"wallClockMs":1406223}},{"artifacts":[],"attempt":1,"bundleHash":"d10c55e805646d94d543550ad23e838de9b0a31aeb560a41cadbe87131e17b79","device":"a74f2bc0ce11ed16","findings":[],"hash":"f1a89b8e51ed339c33dfcf9f69a18d5a29f73d1986afb2bbbff3a22108173d0a","nodeId":"2a36e34e-4127-4137-9f91-71b56749bc43","outcome":"completed","summary":"Fixed the reproduced gas-budget issue and added factory tests covering both token orders. Manifest, constructors, compiler settings and dependencies remain unchanged.\n\n`forge build` passes. All **184 tests pass** with the supplied seed; seven isolated regressions also pass.\n\nRelayed wallets still require `hookData` for correct attribution. All changes and audit dispositions are documented in [ADAPTATION.md](/home/imd2/.identitymd/work/4098dafa-99b4-4c9f-97e3-430b49ea6afa/2a36e34e-4127-4137-9f91-71b56749bc43/ADAPTATION.md).","treeHash":"aa186586ef4bff0f75fc74c6d0bb1a90a0317809","usage":{"cachedInputTokens":4840576,"inputTokens":155470,"model":"gpt-6-astra","outputTokens":35352,"runtime":"codex","turns":11,"wallClockMs":1245122}}],"verification":[{"checks":[{"durationMs":178374,"exitCode":0,"name":"build","output":"Compiling 120 files with Solc 0.8.26\nSolc 0.8.26 finished in 178.23s\nCompiler run successful with warnings:\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:108:22:\n    |\n108 |             rook = ((FILE_A << f) | (RANK_1 << (8 * r))) ^ bit;\n    |                      ^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:108:38:\n    |\n108 |             rook = ((FILE_A << f) | (RANK_1 << (8 * r))) ^ bit;\n    |                                      ^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:109:57:\n    |\n109 |             uint64 d = f >= r ? DIAG >> (8 * (f - r)) : DIAG << (8 * (r - f));\n    |                                                         ^^^^^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:110:65:\n    |\n110 |             uint64 a = f + r <= 7 ? ANTI >> (8 * (7 - f - r)) : ANTI << (8 * (f + r - 7));\n    |                                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/ChessEngineV5.sol:537:38:\n    |\n537 |             uint64 ahead = c.white ? ~uint64(0) << ((r + 1) * 8) : (uint64(1) << (r * 8)) - 1;\n    |                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/ChessEngineV5.sol:537:69:\n    |\n537 |             uint64 ahead = c.white ? ~uint64(0) << ((r + 1) * 8) : (uint64(1) << (r * 8)) - 1;\n    |                                                                     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:31:18:\n   |\n31 |         returns (uint16, Rules.Played memory)\n   |                  ^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:31:26:\n   |\n31 |         returns (uint16, Rules.Played memory)\n   |                          ^^^^^^^^^^^^^^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:36:85:\n   |\n36 |     function playAny(uint256, uint32, uint32, bool, uint256) external pure returns (uint16, Rules.Played memory) {\n   |                                                                                     ^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:36:93:\n   |\n36 |     function playAny(uint256, uint32, uint32, bool, uint256) external pure returns (uint16, Rules.Played memory) {\n   |                                                                                             ^^^^^^^^^^^^^^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/Hostile.t.sol:62:18:\n   |\n62 |         returns (uint16, Rules.Played memory)\n   |                  ^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/Hostile.t.sol:62:26:\n   |\n62 |         returns (uint16, Rules.Played memory)\n   |                          ^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Game.t.sol:97:9:\n   |\n97 |         IMDuelHook.Game memory g = st();\n   |         ^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/LaunchFiles.t.sol:73:5:\n   |\n73 |     function test_engineLaunchFileDeploysTheEngineWithoutArguments() public {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":9869,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/Size.t.sol:SizeTest\n[PASS] test_deployedCodeFitsTheBudgets() (gas: 71241)\nLogs:\n  hook: 16900\n  engine v5: 23339\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 777.48µs (675.18µs CPU time)\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] test_allowances() (gas: 347653)\n[PASS] test_fixedSupplyToTheDeployer() (gas: 39384)\n[PASS] test_nothingPrivileged() (gas: 192691)\n[PASS] test_transfers() (gas: 188240)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.32ms (602.91µs CPU time)\n\nRan 3 tests for test/LaunchFiles.t.sol:LaunchFilesTest\n[PASS] test_engineLaunchFileDeploysTheEngineWithoutArguments() (gas: 7834)\n[PASS] test_ethereumLaunchFile() (gas: 158792)\n[PASS] test_sepoliaLaunchFile() (gas: 150795)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 11.35ms (10.88ms CPU time)\n\nRan 7 tests for test/Draws.t.sol:DrawsTest\n[PASS] test_checkmate() (gas: 334401)\n[PASS] test_moveCap() (gas: 331503)\n[PASS] test_ordinaryMoveDoesNotEndTheGame() (gas: 272039)\n[PASS] test_quietMoveLimit() (gas: 337709)\n[PASS] test_stalemate() (gas: 329276)\n[PASS] test_thirdRepetition() (gas: 1128186)\n[PASS] test_tooFewPiecesToMate() (gas: 321032)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 15.24ms (3.47ms CPU time)\n\nRan 7 tests for test/Windows.t.sol:WindowsTest\n[PASS] test_aHash257BlocksBackComesFromHistory() (gas: 1379597)\n[PASS] test_anExpiredMovesWindowIsTheFindingBlock() (gas: 809971)\n[PASS] test_dustAfterTheWindowCanBeAnswered() (gas: 1859162)\n[PASS] test_dustInTheClosingBlockCanBeAnswered() (gas: 1874191)\n[PASS] test_noPreviewBeforeTheClosingBlock() (gas: 749879)\n[PASS] test_onlyALateFirstBidMovesTheWindow() (gas: 768169)\n[PASS] test_theResolvingTradesBidNamesItsHalfMove() (gas: 1223658)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 16.92ms (12.74ms CPU time)\n\nRan 5 tests for test/Teams.t.sol:TeamsTest\n[PASS] test_aDynamicFeePoolPlaysWithAZeroLpFee() (gas: 1904114)\n[PASS] test_nativeEthIsATeamLikeAnyToken() (gas: 1224021)\n[PASS] test_poolsOnOneHookKeepSeparateGamesAndChests() (gas: 2479138)\n[PASS] test_sliceSide() (gas: 720994)\n[PASS] test_twoPlainTokensCannotDuel() (gas: 437611)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 19.97ms (17.44ms CPU time)\n\nRan 8 tests for test/Slice.t.sol:SliceTest\n[PASS] test_aDuelAgainstImdSendsItsSliceToTheMainDuelsImdPot() (gas: 981778)\n[PASS] test_aDuelAgainstImduelBurnsItsSlice() (gas: 960558)\n[PASS] test_aSliceMovesNoPrice() (gas: 1532512)\n[PASS] test_anyoneSendsTheBurn() (gas: 648930)\n[PASS] test_buyingImduelBurnsASliceOfIt() (gas: 411997)\n[PASS] test_dustPaysNoSlice() (gas: 514419)\n[PASS] test_theMainDuelsSliceIsBurned() (gas: 577029)\n[PASS] test_theWholeSliceIsBurnedToTheWei() (gas: 536637)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 20.23ms (9.16ms CPU time)\n\nRan 5 tests for test/AuditRegression.t.sol:AuditRegressionTest\n[PASS] test_abiHookDataKeepsWalletBidStatsAndMatePayout() (gas: 1654557)\n[PASS] test_closedWindowPreservesNotEnoughGasAndCanBeRetried() (gas: 1803274)\n[PASS] test_emptyHookDataReproducesAcceptedRelayerAttribution() (gas: 1651793)\n[PASS] test_packedHookDataKeepsWalletBidStatsAndMatePayout() (gas: 1654352)\n[PASS] test_starvedFallbackPreservesNotEnoughGas() (gas: 9732906)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 22.56ms (18.34ms CPU time)\n\nRan 14 tests for test/Bidding.t.sol:BiddingTest\n[PASS] test_aBuyOfTheOtherTeamBidsForItsNextMove() (gas: 2302673)\n[PASS] test_aBuyOfTheOtherTeamTimesTheSilentSideOutAndBids() (gas: 1220837)\n[PASS] test_aClosedWindowTakesNoBidsForItsMove() (gas: 1238283)\n[PASS] test_aLateFirstBidOpensAFullWindow() (gas: 1790503)\n[PASS] test_aMateIsPaidFromTheLosersChestInItsToken() (gas: 1589493)\n[PASS] test_aMoveIsOpenForTurnBlocksBlocks() (gas: 1216340)\n[PASS] test_aNewTopMustPayMoreThanTenPercentMore() (gas: 988826)\n[PASS] test_aNextMoveBidCarriesIntoTheNextGame() (gas: 1751624)\n[PASS] test_bidsCountAcrossTheWholeWindow() (gas: 1703229)\n[PASS] test_exactlyTenPercentMoreIsNotEnough() (gas: 989254)\n[PASS] test_theMoveDependsOnlyOnTheWindowsLastBlock() (gas: 1949748)\n[PASS] test_theMoversOwnBuyAfterItsWindowBidsForItsNextMove() (gas: 1251927)\n[PASS] test_theOwnerIsTheHookDataAddressElseTheSigner() (gas: 1846249)\n[PASS] test_thePreviewIsTheMoveThatIsPlayed() (gas: 1485460)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 24.70ms (23.25ms CPU time)\n\nRan 11 tests for test/Stats.t.sol:StatsTest\n[PASS] test_aDustBidsMoveCounts() (gas: 1177326)\n[PASS] test_aMateCountsEvenWhenItPaysNothing() (gas: 691623)\n[PASS] test_aMoveAtAnyStrengthCounts() (gas: 278453)\n[PASS] test_aPaidSideDuelMateCountsNothing() (gas: 861550)\n[PASS] test_aSideDuelCountsNothing() (gas: 583461)\n[PASS] test_amountsWonAreCountedPerToken() (gas: 935020)\n[PASS] test_checksAndCapturesByType() (gas: 1018958)\n[PASS] test_countersSaturate() (gas: 33090)\n[PASS] test_enPassantAndPromotion() (gas: 682261)\n[PASS] test_gamesMatesAndThePlayerList() (gas: 1493429)\n[PASS] test_movesByPieceCastlingAndFullStrength() (gas: 1407030)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 34.07ms (29.90ms CPU time)\n\nRan 2 tests for test/FactoryLaunch.t.sol:FactoryLaunchTest\n[PASS] test_factoryLaunchWithTokenAboveImd() (gas: 11440064)\n[PASS] test_factoryLaunchWithTokenBelowImd() (gas: 11419485)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 18.84ms (18.18ms CPU time)\n\nRan 2 tests for test/LaunchAdmission.t.sol:LaunchAdmissionTest\n[PASS] test_blankChainTokenAboveImd() (gas: 20224129)\n[PASS] test_blankChainTokenBelowImd() (gas: 20213889)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 70.18ms (88.08ms CPU time)\n\nRan 5 tests for test/PotStrength.t.sol:PotStrengthTest\n[PASS] test_aDonationWeakensTheTeamsBidsAndRaisesThePrizeForMatingIt() (gas: 3394559)\n[PASS] test_anEmptyPotPlaysAtTheCapUntilItIsAPot() (gas: 4178752)\n[PASS] test_exactOutputStrengthIncludesThePotShare() (gas: 616267)\n[PASS] test_liquidityChangesNothing() (gas: 1669734)\n[PASS] test_strengthIsReadAfterTheMateTheTradePlayed() (gas: 1580288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 129.10ms (15.22ms CPU time)\n\nRan 5 tests for test/HookGas.t.sol:HookGasTest\n[PASS] test_aSideDuelsSliceStaysAPlainTrade() (gas: 2225484)\nLogs:\n  side duel trade with its slice: 198280\n\n[PASS] test_hookShareOfAMovingTrade() (gas: 27867148)\nLogs:\n  hook share of a moving trade: average: 280427\n  hook share of a moving trade: max: 291566\n\n[PASS] test_middlegameGas() (gas: 8526507)\nLogs:\n  first bid in a new pool: 260797\n  bidding trade: 203812\n  outbidding trade: 203617\n  plain trade: 194129\n  next block: play the turn and bid: 585327\n\n[PASS] test_openingGas() (gas: 3870102)\nLogs:\n  first bid in a new pool: 260797\n  bidding trade: 204410\n  outbidding trade: 203617\n  plain trade: 194129\n  next block: play the turn and bid: 624966\n\n[PASS] test_runningGameGas() (gas: 47700896)\nLogs:\n  running game, moving trades measured: 42\n  running game, moving trade average: 451639\n  running game, moving trade max: 557656\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 183.15ms (182.11ms CPU time)\n\nRan 3 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_launchPairedWithEth() (gas: 20464305)\n[PASS] test_launchTokenAboveImd() (gas: 22051377)\nLogs:\n  first buy (opens game 0, bids for White): 390904\n\n[PASS] test_launchTokenBelowImd() (gas: 21786067)\nLogs:\n  first buy (opens game 0, bids for White): 357618\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 144.30ms (126.16ms CPU time)\n\nRan 8 tests for test/Strength.t.sol:StrengthTest\n[PASS] testFuzz_boundedAndMonotonic(uint256,uint256,uint256) (runs: 256, μ: 9034, ~: 9046)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640554039457584007913129648936\n\n[PASS] testFuzz_depthMonotonic(uint256,uint256,uint256) (runs: 256, μ: 11902, ~: 11898)\nLogs:\n  Bound result 9000\n  Bound result 6500000000000000000000\n\n[PASS] testFuzz_shiftKeepsTheShare(uint256,uint256,uint8) (runs: 256, μ: 14498, ~: 13993)\nLogs:\n  Bound result 15\n  Bound result 10000000000000000000000000\n  Bound result 9000\n\n[PASS] testFuzz_tenfoldIsAboutThirtyPoints(uint128,uint128) (runs: 256, μ: 13838, ~: 13708)\nLogs:\n  Bound result 45250658653330366098318\n  Bound result 4479815206731807721503\n\n[PASS] testFuzz_unscalablePaidFollowsTheCurve(uint256,uint256) (runs: 256, μ: 14003, ~: 14210)\nLogs:\n  Bound result 115676297148078879228147414023679219945416714680974923476978348610226064830178\n  Bound result 115676297148078879228147414023691475161338229062180099083019117769300591507360\n\n[PASS] test_decidedPoints() (gas: 13720)\n[PASS] test_hugePaymentsDoNotRevert() (gas: 12835)\n[PASS] test_zeroInputs() (gas: 5289)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 184.18ms (118.79ms CPU time)\n\nRan 8 tests for test/FeeSchedule.t.sol:FeeScheduleTest\n[PASS] testFuzz_exactOutputDeliversTheOrderAndTakesItsFeeOnTop(uint256) (runs: 256, μ: 542312, ~: 542477)\nLogs:\n  Bound result 500000000000000000000\n\n[PASS] test_exactOutputStoppedByItsPriceLimitIsRefused() (gas: 259775)\n[PASS] test_fundChestBeyondBalanceIsRefused() (gas: 121187)\n[PASS] test_fundChestOfZeroAddsNothing() (gas: 97993)\n[PASS] test_fundChestWithTheWrongEthValueIsRefused() (gas: 344437)\n[PASS] test_fundChestWithoutAllowanceIsRefused() (gas: 110843)\n[PASS] test_owedRewardOnlyEverReachesItsOwner() (gas: 1268983)\n[PASS] test_withdrawWithNothingOwedDoesNothing() (gas: 90005)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 248.81ms (241.53ms CPU time)\n\nRan 12 tests for test/Hostile.t.sol:HostileTest\n[PASS] test_aCallbackTokenOwnerLeavingADebtCannotFreezeTheDuel() (gas: 4090732)\n[PASS] test_aDeadEngineEndsTheGameAsADrawAndTradingGoesOn() (gas: 2312934)\n[PASS] test_aGasBurningEngineCostsOneExpensiveTradeNotTheGame() (gas: 7405962)\n[PASS] test_aTokenReturningNothingFundsAChest() (gas: 1032369)\n[PASS] test_anEthOwnerCreditingTheHookCannotFreezeTheDuel() (gas: 3176697)\n[PASS] test_anEthOwnerLeavingADebtCannotFreezeTheDuel() (gas: 3021701)\n[PASS] test_anOwnerThatCannotReceiveWithdrawsElsewhere() (gas: 2560365)\n[PASS] test_blockedRecipientStaysOwedAndTradingContinues() (gas: 3067657)\n[PASS] test_brokenEngineFallsBackToALegalMove() (gas: 4095973)\n[PASS] test_feeOnTransferTokenFundsOnlyWhatArrives() (gas: 1578261)\n[PASS] test_reenteringTokenCannotBreakAClaim() (gas: 3695941)\n[PASS] test_starvingTheEngineNeverPlaysTheFallback() (gas: 17054982)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 289.93ms (144.60ms CPU time)\n\nRan 1 test for test/Predict.t.sol:PredictTest\n[PASS] test_aBotCannotPickItsOwnCapturingMoves() (gas: 252152063)\nLogs:\n  bot moves: 0\n  other moves: 53\n  captures among other moves: 13\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 615.43ms (615.27ms CPU time)\n\nRan 34 tests for test/LaunchFailures.t.sol:LaunchFailuresTest\n[PASS] testFuzz_aStoppedOrderIsRefusedWhole(bool,bool,bool) (runs: 64, μ: 584246, ~: 580995)\n[PASS] testFuzz_hookDataNamesAnOwnerOnlyInItsTwoShapes(bool,bytes,address) (runs: 256, μ: 419425, ~: 434629)\n[PASS] testFuzz_nobodyButTheManagerDrivesTheCallbacks(address,bool,bytes) (runs: 64, μ: 137799, ~: 137621)\n[PASS] testFuzz_theRaiseIsExactlyOverTenPercent(bool,uint256,uint256) (runs: 128, μ: 655284, ~: 665325)\nLogs:\n  Bound result 26630080835454380864\n  Bound result 125\n\n[PASS] testFuzz_withdrawToSpendsOnlyTheCallersOwn(address,address) (runs: 32, μ: 1218272, ~: 1218352)\n[PASS] test_aClaimPaysOnceAndOnlyItsOwner() (gas: 2444977)\n[PASS] test_aFirstSaleIntoTheLaunchPoolIsRefusedWhole() (gas: 1002407)\n[PASS] test_aLateBidBySilentSideGetsAFullWindow() (gas: 438474)\n[PASS] test_aLyingTokenFundsNothing() (gas: 1246043)\n[PASS] test_aMateAfterLostDicePaysNobody() (gas: 2337575)\n[PASS] test_aMisbehavingEngineFallsBack() (gas: 10920706)\n[PASS] test_aPoolCannotOpenOnAHookWithoutCode() (gas: 69529)\n[PASS] test_aRecipientTradingInsideItsClaimKeepsTheBooks() (gas: 4030578)\n[PASS] test_aRefusedOpeningDoesNotBrickTheLaunch() (gas: 780986)\n[PASS] test_aRefusingRecipientLosesNothing() (gas: 2601596)\n[PASS] test_aTokenSwitchingTheSyncedCurrencyCannotMintItselfAClaim() (gas: 1326392)\n[PASS] test_anAddressWithoutCodeDrawsEveryGame() (gas: 1971476)\n[PASS] test_claimsAndFundingRefuseToRunInsideAnUnlock() (gas: 1787138)\n[PASS] test_exactlyTenPercentMoreDoesNotTakeTheTop() (gas: 1815543)\n[PASS] test_fallbackMateAndDoubleFailure() (gas: 1897144)\n[PASS] test_fundChestRefusals() (gas: 343333)\n[PASS] test_hookDataEdges() (gas: 4024441)\n[PASS] test_impossibleOrdersMoveNothing() (gas: 2221018)\n[PASS] test_onlyTheMainDuelCounts() (gas: 3494672)\n[PASS] test_previewRefusals() (gas: 547200)\n[PASS] test_statsNeverPayOrLimit() (gas: 9485664)\n[PASS] test_theDiceHashEdges() (gas: 2819102)\n[PASS] test_theHookHasNoPrivilegedSurface() (gas: 598239)\n[PASS] test_theMainDuelIsFixedOnceOpened() (gas: 1300852)\n[PASS] test_theTimeoutIsExactToTheSecond() (gas: 1686909)\n[PASS] test_theTokenHasNoPrivilegedSurface() (gas: 236214)\n[PASS] test_theWindowEndsAtItsLastBlock() (gas: 2854594)\n[PASS] test_turnBlocksEdges() (gas: 694008)\n[PASS] test_withoutHistoryTheLastServedHashIs256BlocksBack() (gas: 1159239)\nSuite result: ok. 34 passed; 0 failed; 0 skipped; finished in 693.49ms (856.83ms CPU time)\n\nRan 17 tests for test/LaunchMoney.t.sol:LaunchMoneyTest\n[PASS] testFuzz_aProtocolFeeChangesNothingForTheHook(bool,bool,bool,uint256,uint16) (runs: 64, μ: 878914, ~: 889493)\nLogs:\n  Bound result 214\n  Bound result 49999999999999001670\n\n[PASS] testFuzz_mainDuelFeeIsExact(bool,bool,bool,uint256) (runs: 256, μ: 848310, ~: 863034)\nLogs:\n  Bound result 49574\n\n[PASS] testFuzz_nothingButMatePays(bool,uint8,uint256) (runs: 64, μ: 8769538, ~: 8956585)\nLogs:\n  Bound result 0\n  Bound result 9999000000000043877\n\n[PASS] testFuzz_sideDuelSlicesGoWhereTheBriefSays(bool,bool,bool,bool,uint256) (runs: 128, μ: 1129621, ~: 1140496)\nLogs:\n  Bound result 39389\n\n[PASS] testFuzz_strengthReadsItsOwnTeamsPot(bool,uint256,uint256) (runs: 64, μ: 1465212, ~: 1476934)\nLogs:\n  Bound result 999000000083093882844041\n  Bound result 43876\n\n[PASS] testFuzz_theMatePaysTheLeastOfThree(bool,uint256,uint256,uint256,uint256,bool) (runs: 256, μ: 1944552, ~: 1811977)\nLogs:\n  Bound result 3\n  Bound result 620664090053294209824\n  Bound result 999999999999999999999997\n  Bound result 747036317\n\n[PASS] test_aFullPotIsNotChargedAndTheTradeGoesOn() (gas: 1355293)\n[PASS] test_aLaunchsFirstBidPlaysAtTheCap() (gas: 808879)\n[PASS] test_aQuarterOfThePotBindsOnAFreshGame() (gas: 2455875)\n[PASS] test_aSliceIntoAFullMainPotTakesWhatFits() (gas: 1188854)\n[PASS] test_aTimeoutMoveThatMatesPaysNothing() (gas: 1639694)\n[PASS] test_dustPaysNoFeeAndEmitsNothing() (gas: 666046)\n[PASS] test_sixGamesPayTheRightTokenEachTime() (gas: 12987715)\n[PASS] test_theFeeRoundsDownAtItsEdges() (gas: 1162954)\n[PASS] test_theGamesInflowBinds() (gas: 2492149)\n[PASS] test_theSettlingTradeCountsForTheNextGame() (gas: 1000179)\n[PASS] test_twiceTheBidBinds() (gas: 3358752)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 828.55ms (1.48s CPU time)\n\nRan 2 tests for test/GasEstimate.t.sol:GasEstimateTest\n[PASS] test_atTheEstimateThePayoutIsRecorded() (gas: 6326804)\nLogs:\n  smallest gas limit that plays and records the mate's payout: 3701048\n\n[PASS] test_noGasLimitPlaysTheMoveWithoutItsPayout() (gas: 974659330)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 833.06ms (839.76ms CPU time)\n\nRan 21 tests for test/MatePot.t.sol:MatePotTest\n[PASS] testFuzz_heldEqualsOwedWithImdAsCurrency1(uint256) (runs: 32, μ: 13018095, ~: 13002044)\n[PASS] test_aDonationDoesNotRaiseTheCap() (gas: 1883900)\n[PASS] test_aDrawPaysNothing() (gas: 1861364)\n[PASS] test_aDustGamePaysNothing() (gas: 2010121)\n[PASS] test_aDustMateEarnsTwiceItsDust() (gas: 2017977)\n[PASS] test_aFeeFreeSwapAfterAFeeInOneUnlockAddsNoInflow() (gas: 2559726)\n[PASS] test_aGameTradedAloneReturnsAtMostItsPotFees() (gas: 2022701)\n[PASS] test_aMateAgainstATeamNobodyBoughtStillPays() (gas: 3694476)\n[PASS] test_aMateAgainstAnEmptyPotPaysNothing() (gas: 1813816)\n[PASS] test_aShortGamePaysTheLosersFeesNotTheResolvingTrades() (gas: 2981382)\n[PASS] test_aThinSideDuelPaysBackAtMostTheAttackersOwnFee() (gas: 2670612)\n[PASS] test_aTimeoutMatePaysNobody() (gas: 2616259)\n[PASS] test_anExpiredHashPlaysThePaidBidForNobody() (gas: 2925806)\n[PASS] test_everySwapShapeRecordsItsPotFee() (gas: 2832299)\n[PASS] test_theLoserPaysWhenImduelIsCurrency0() (gas: 2600254)\n[PASS] test_theLoserPaysWhenImduelIsCurrency1() (gas: 2600793)\n[PASS] test_theManagerOrTheHookOwnsNoBid() (gas: 2354405)\n[PASS] test_thePrizeIsAtMostTheLosersOwnInflow() (gas: 2546191)\n[PASS] test_twoSwapsInOneUnlockKeepTheirInflowApart() (gas: 4588692)\n[PASS] test_twoSwapsInOneUnlockKeepTheirInflowApartReversed() (gas: 4589218)\n[PASS] test_withdrawToRefusesAddressZeroTheHookAndTheManager() (gas: 1407537)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 963.92ms (1.05s CPU time)\n\nRan 25 tests for test/Game.t.sol:GameTest\n[PASS] testFuzz_swapsNeverRevert(uint256) (runs: 48, μ: 10512797, ~: 10684333)\n[PASS] test_aGamePlaysOutThroughSwaps() (gas: 77324728)\nLogs:\n  moves played: 108\n  bids (incl. outbid ones): 138\n  most gas for a swap: 737149\n\n[PASS] test_aSmallerTradeInTheBlockDoesNotTakeTheTurn() (gas: 692202)\n[PASS] test_aTimeoutTurnCanBeTakenInItsBlock() (gas: 1484871)\n[PASS] test_aTradeBidsForTheTurn() (gas: 505631)\n[PASS] test_aTurnClosesWithItsBlock() (gas: 1146176)\n[PASS] test_anExpiredTurnPlaysItsBidForNobody() (gas: 1583139)\n[PASS] test_anOldTurnIsPlayedWithTheHistoryContractsHash() (gas: 2094806)\n[PASS] test_anyTradeSizeBids() (gas: 2685983)\n[PASS] test_lateTradeStillBidsNormally() (gas: 452508)\n[PASS] test_onlyThePoolManagerAndTheHookCanCallIn() (gas: 122174)\n[PASS] test_ownerDefaultsToTxOrigin() (gas: 438886)\n[PASS] test_playedPositionsEnterTheRepetitionMemory() (gas: 1104251)\n[PASS] test_previewMoveIsReadyInTheClosingBlock() (gas: 721740)\n[PASS] test_previewMoveReadsTheServedHashItself() (gas: 1677587)\n[PASS] test_rejectsBadConfig() (gas: 8818)\n[PASS] test_silentSidePlaysAtZeroStrength() (gas: 1055478)\n[PASS] test_strengthFollowsTheShareOfTheTeamsPot() (gas: 8610230)\n[PASS] test_teamsSwapColoursEveryGame() (gas: 1026940)\n[PASS] test_theBiggestTradeInTheBlockOwnsTheTurn() (gas: 788475)\n[PASS] test_theFirstPoolOpenedIsTheMainDuel() (gas: 179045)\n[PASS] test_theMainDuelMustPairImd() (gas: 312270)\n[PASS] test_theNextBlocksTradePlaysTheTurn() (gas: 1221781)\n[PASS] test_theOtherTeamCannotBidOnThisTurn() (gas: 435166)\n[PASS] test_whoPlaysTheTurnAndWhenDoesNotChangeTheMove() (gas: 1874217)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 969.09ms (1.28s CPU time)\n\nRan 20 tests for test/Money.t.sol:MoneyTest\n[PASS] testFuzz_heldEqualsOwed(uint256) (runs: 48, μ: 11926265, ~: 12019249)\n[PASS] test_aBuyFeedsBothPotsAndBurnsTheSlice() (gas: 421634)\n[PASS] test_aFullChestTakesNoMore() (gas: 1100726)\n[PASS] test_aMateForNobodyPaysNobody() (gas: 515104)\n[PASS] test_aTradeStoppedByItsPriceLimitIsRefused() (gas: 557098)\n[PASS] test_capturesAndChecksPayNothing() (gas: 507482)\n[PASS] test_everyTradeEmitsHookSwapWithTheHookFee() (gas: 556213)\n[PASS] test_everyTradeFeedsBothPots() (gas: 2154397)\n[PASS] test_exactOutputSlicesTheInput() (gas: 541596)\n[PASS] test_exactOutputWithTheFeeInTheOutput() (gas: 393823)\n[PASS] test_feesCannotBeWithdrawnByAnyone() (gas: 536437)\n[PASS] test_fundChestNeedsTheRightValue() (gas: 48679)\n[PASS] test_fundChestOnlyForHookPools() (gas: 41774)\n[PASS] test_fundChestWithEth() (gas: 252841)\n[PASS] test_fundChestWithTokens() (gas: 255519)\n[PASS] test_mateTakesAQuarterOfTheLosersPot() (gas: 895609)\n[PASS] test_quietMovesPayNothing() (gas: 458996)\n[PASS] test_rewardsAreClaimedNeverPushed() (gas: 1359511)\n[PASS] test_theMateIsCappedAtTwiceWhatItsTradePaid() (gas: 773155)\n[PASS] test_theMateIsCountedForItsOwner() (gas: 636338)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 1.15s (1.15s CPU time)\n\nRan 1 test for test/Invariant.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_boardHasBothKingsAndPlyIsBounded\n[PASS] invariant_heldEqualsOwed\n InvariantTest invariants (runs: 24, calls: 2400, reverts: 0)\n\n╭----------+----------------+-------+---------+----------╮\n| Contract | Selector       | Calls | Reverts | Discards |\n+========================================================+\n| Handler  | burn           | 274   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | fund           | 281   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | idle           | 247   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | longPause      | 250   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | nextBlock      | 263   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | trade          | 283   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | tradeAgain     | 255   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | tradeNextBlock | 305   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | withdrawReward | 242   | 0       | 0        |\n╰----------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1238\n  Bound result 19999999000000001801\n  Bound result 19999999000000001709\n  Bound result 18474772824141606944\n  Bound result 25000000000000000000\n  Bound result 58\n  Bound result 80\n  Bound result 18198805245380381879\n  Bound result 19999999000000008193\n  Bound result 14962\n  Bound result 99\n  Bound result 14999999999985\n  Bound result 19999999000000010611\n  Bound result 19999999000000018888\n  Bound result 19999999000000019741\n  Bound result 64\n  Bound result 19999999000000000972\n  Bound result 6641997679134031052\n  Bound result 9927\n  Bound result 19999999000000007501\n  Bound result 19999999000000009061\n  Bound result 120\n  Bound result 50000000000000000000\n  Bound result 73\n  Bound result 19999999000000023501\n  Bound result 19999999000000006748\n  Bound result 42754813917896217807\n  Bound result 80\n  Bound result 19999999000000887221\n  Bound result 50\n  Bound result 30\n  Bound result 50000000000000000000\n  Bound result 21158\n  Bound result 19999999000000828418\n  Bound result 16\n  Bound result 19296707693607447019\n  Bound result 2155872256\n  Bound result 19999999999999999998\n  Bound result 19999999000000002131\n  Bound result 2355172927998303886\n  Bound result 6644185449734949650\n  Bound result 113\n  Bound result 11565342078087335612\n  Bound result 2835717307\n  Bound result 19999999000000003423\n  Bound result 120\n  Bound result 11207232426633969231\n  Bound result 19999999000000000815\n  Bound result 19999999000000001355\n  Bound result 3605\n  Bound result 100000000\n  Bound result 4090335565\n  Bound result 5313166770951398828\n  Bound result 45\n  Bound result 1\n  Bound result 1771\n  Bound result 120\n  Bound result 44329428244169878758\n  Bound result 17471123994747445864\n  Bound result 152\n  Bound result 19999999000000019898\n  Bound result 99\n  swaps: 29\n  moves: 13\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.45s (1.44s CPU time)\n\nRan 3 tests for test/TokenInvariant.t.sol:TokenInvariantTest\n[PASS]\nTokenInvariantTest invariants:\n[PASS] invariant_allowancesAreExactlyWhatWasApprovedLessWhatWasSpent\n[PASS] invariant_supplyIsFixedAndHeldByTheActors\n TokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------------+-------+---------+----------╮\n| Contract     | Selector           | Calls | Reverts | Discards |\n+================================================================+\n| TokenHandler | approve            | 2071  | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| TokenHandler | approveZeroSpender | 1993  | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| TokenHandler | transfer           | 2072  | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| TokenHandler | transferFrom       | 2056  | 0       | 0        |\n╰--------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 2\n  Bound result 10\n  Bound result 6507\n  Bound result 100\n  Bound result 200000000000000000000\n  Bound result 273036128075084041412834184\n  Bound result 500000000000000000000\n  Bound result 31\n  Bound result 0\n  Bound result 20000000000000000\n  Bound result 2\n  Bound result 1282\n  Bound result 8\n  Bound result 3\n  Bound result 9\n  Bound result 826217201815837797482935365\n  Bound result 5927\n  Bound result 7172\n  Bound result 10\n  Bound result 23500\n  Bound result 6\n  Bound result 2\n  Bound result 5\n  Bound result 17\n  Bound result 7\n  Bound result 0\n  Bound result 6\n  Bound result 858534827628530496360373871\n  Bound result 911\n  Bound result 20000000000000000\n\n[PASS] testFuzz_transferOfMoreThanTheBalanceIsRefused(uint256) (runs: 512, μ: 55913, ~: 55857)\nLogs:\n  Bound result 6021\n\n[PASS] test_transferFromTheZeroAddressIsRefused() (gas: 82118)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.03s (3.04s CPU time)\n\nRan 1 test for test/LaunchInvariant.t.sol:LaunchRealEngineTokenBelowImd\n[PASS] invariant_realChessKeepsTheBooks() (runs: 16, calls: 1920, reverts: 0)\n\n╭---------------+-------------------+-------+---------+----------╮\n| Contract      | Selector          | Calls | Reverts | Discards |\n+================================================================+\n| LaunchHandler | burn              | 130   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactIn        | 185   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactInAgain   | 149   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactOut       | 150   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | collectLpFees     | 164   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | fund              | 173   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | longSilence       | 165   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | roll              | 153   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | silence           | 176   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | tradeNextBlock    | 154   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | withdraw          | 159   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | withdrawElsewhere | 162   | 0       | 0        |\n╰---------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 52233848661454616555\n  Bound result 1\n  Bound result 1\n  Bound result 34630393076404389251\n  Bound result 1\n  Bound result 1\n  Bound result 3\n  Bound result 3\n  Bound result 99999999999999000121\n  Bound result 2\n  Bound result 2\n  Bound result 99999999999999022661\n  Bound result 1\n  Bound result 1\n  Bound result 99999999999999460032\n  Bound result 13787848793156543929\n  Bound result 99999999999999010754\n  Bound result 99999999999999004918\n  Bound result 37653177137556678068\n  Bound result 99999999999999012264\n  Bound result 99999999999999000301\n  Bound result 99999999999999048767\n  Bound result 50773608567104280435\n  Bound result 2\n  Bound result 2\n  Bound result 57670510585350444375\n  Bound result 99999999999999011840\n  Bound result 91381434021703806220\n  Bound result 99999999999999012350\n  Bound result 99999999999999000012\n  Bound result 99999999999999007823\n  Bound result 21593623174000959670\n  Bound result 20000000000000000000\n  Bound result 150000000000000000000\n  Bound result 99999999999999020842\n  Bound result 13787848793156543930\n  Bound result 99999999999999000577\n  Bound result 99999999999999000097\n  Bound result 2\n  Bound result 2\n  Bound result 99999999999999005594\n  Bound result 77346068317978955699\n  Bound result 99999999999999003001\n  Bound result 99999999999999013049\n  Bound result 99999999999999000041\n  Bound result 99999999999999000029\n  Bound result 7\n  Bound result 13787848793156543930\n  Bound result 3\n  Bound result 3\n  Bound result 5\n  Bound result 5\n  Bound result 99999999999999000137\n  Bound result 35019726803522325841\n  Bound result 99999999999999002405\n  Bound result 99999999999999018908\n  Bound result 3\n  Bound result 3\n  Bound result 50590119099839012060\n  Bound result 2\n  Bound result 2\n  Bound result 5263433031247014417\n  Bound result 99999999999999119010\n  Bound result 5\n  Bound result 5\n  Bound result 13693\n  Bound result 99999999999999017973\n  Bound result 1229782939087557171\n  Bound result 2\n  Bound result 2\n  Bound result 18374686479671623680\n  Bound result 2380011137\n  Bound result 68360832578312986351\n  Bound result 99999999999999021846\n  Bound result 99999999999999000904\n  Bound result 15886084294922358739\n  swaps: 41\n  moves: 9\n  fallbacks: 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.14s (3.08s CPU time)\n\nRan 1 test for test/LaunchInvariant.t.sol:LaunchRealEngineTokenAboveImd\n[PASS] invariant_realChessKeepsTheBooks() (runs: 16, calls: 1920, reverts: 0)\n\n╭---------------+-------------------+-------+---------+----------╮\n| Contract      | Selector          | Calls | Reverts | Discards |\n+================================================================+\n| LaunchHandler | burn              | 130   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactIn        | 185   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactInAgain   | 149   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactOut       | 150   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | collectLpFees     | 164   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | fund              | 173   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | longSilence       | 165   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | roll              | 153   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | silence           | 176   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | tradeNextBlock    | 154   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | withdraw          | 159   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | withdrawElsewhere | 162   | 0       | 0        |\n╰---------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 52233848661454616555\n  Bound result 1\n  Bound result 1\n  Bound result 34630393076404389251\n  Bound result 1\n  Bound result 1\n  Bound result 3\n  Bound result 3\n  Bound result 99999999999999000121\n  Bound result 2\n  Bound result 2\n  Bound result 99999999999999025183\n  Bound result 1\n  Bound result 1\n  Bound result 99999999999999460032\n  Bound result 13787848793156543929\n  Bound result 99999999999999010754\n  Bound result 99999999999999015957\n  Bound result 37653177137556678068\n  Bound result 99999999999999013167\n  Bound result 99999999999999000301\n  Bound result 99999999999999048767\n  Bound result 50773608567104280435\n  Bound result 1\n  Bound result 1\n  Bound result 57670510585350444375\n  Bound result 99999999999999011840\n  Bound result 91381434021703806220\n  Bound result 99999999999999012350\n  Bound result 99999999999999003152\n  Bound result 99999999999999008779\n  Bound result 21593623174000959670\n  Bound result 20000000000000000000\n  Bound result 150000000000000000000\n  Bound result 99999999999999022086\n  Bound result 10974\n  Bound result 99999999999999000673\n  Bound result 99999999999999000097\n  Bound result 3\n  Bound result 3\n  Bound result 99999999999999004167\n  Bound result 77346068317978955699\n  Bound result 99999999999999003001\n  Bound result 99999999999999015632\n  Bound result 99999999999999000041\n  Bound result 99999999999999000029\n  Bound result 7\n  Bound result 11048\n  Bound result 1\n  Bound result 1\n  Bound result 3\n  Bound result 3\n  Bound result 99999999999999000137\n  Bound result 35019726803522325841\n  Bound result 99999999999999002404\n  Bound result 99999999999999021949\n  Bound result 3\n  Bound result 3\n  Bound result 50590119099839012060\n  Bound result 2\n  Bound result 2\n  Bound result 5263433031247014417\n  Bound result 99999999999999119010\n  Bound result 5\n  Bound result 5\n  Bound result 13611\n  Bound result 99999999999999020299\n  Bound result 99999999999999008505\n  Bound result 2\n  Bound result 2\n  Bound result 18374686479671623680\n  Bound result 19999980000000000\n  Bound result 68360832578312986351\n  Bound result 99999999999999021283\n  Bound result 99999999999999000904\n  Bound result 1007998992983\n  swaps: 40\n  moves: 7\n  fallbacks: 0\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.18s (3.13s CPU time)\n\nRan 1 test for test/InvariantDuels.t.sol:InvariantDuelsTest\n[PASS]\nInvariantDuelsTest invariants:\n[PASS] invariant_everyBoardIsSound\n[PASS] invariant_everyCurrencyBalances\n[PASS] invariant_rightsMatchTheBoard\n[PASS] invariant_turnsAreWellFormed\n InvariantDuelsTest invariants (runs: 24, calls: 2880, reverts: 0)\n\n╭--------------+-------------------+-------+---------+----------╮\n| Contract     | Selector          | Calls | Reverts | Discards |\n+===============================================================+\n| DuelsHandler | addLiquidity      | 233   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | burn              | 191   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | fund              | 215   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | longPause         | 222   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | nextBlock         | 198   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | pushThenNextBlock | 201   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | queueMate         | 195   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | removeLiquidity   | 240   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | roundTrip         | 189   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | setMates          | 224   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | trade             | 191   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | tradeAgain        | 188   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | tradeNextBlock    | 190   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | withdrawReward    | 203   | 0       | 0        |\n╰--------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 9571383389564039707\n  Bound result 2832708629194959756\n  Bound result 9999999000000000000113\n  Bound result 9999998000000000000194\n  Bound result 19999999999000300001\n  Bound result 999999999999919\n  Bound result 4999999999000000101\n  Bound result 15729891982349346891\n  Bound result 4999999999000000033\n  Bound result 12\n  Bound result 19999999999000004868\n  Bound result 180000000000000000081\n  Bound result 12\n  Bound result 6000000\n  Bound result 19999999999000004506\n  Bound result 4749543059978807639089\n  Bound result 5984458188212908122032\n  Bound result 84443867409285120\n  Bound result 195555781221513395233\n  Bound result 12\n  Bound result 10734000248193127481535\n  Bound result 19999999999000021261\n  Bound result 999998588279586\n  Bound result 180000000000000009465\n  Bound result 12\n  Bound result 10000\n  Bound result 9999999000000000000243\n  Bound result 1374389534720\n  Bound result 21\n  Bound result 12\n  Bound result 23801927633\n  Bound result 4999999999000005904\n  Bound result 100000000000000000\n  Bound result 4263924515136285476\n  Bound result 101\n  Bound result 120195651445596224263\n  Bound result 12\n  Bound result 180000000001000000000\n  Bound result 12\n  Bound result 121824603\n  Bound result 3449504731626547562\n  Bound result 12662923559173284841\n  Bound result 89840749632055725\n  Bound result 4999999999000014185\n  Bound result 4000000000000000000\n  Bound result 19999999999000000101\n  Bound result 9999999000000000262140\n  Bound result 9999999000000001000001\n  Bound result 180000000000000000036\n  Bound result 12\n  Bound result 1904806139\n  Bound result 12\n  Bound result 19999999999000006864\n  Bound result 4000000000000000000\n  Bound result 19999999999000006338\n  Bound result 9999999000000000007975\n  Bound result 20000086840749633072630\n  Bound result 9999999000000000004365\n  Bound result 4727466057209245298517\n  Bound result 66\n  Bound result 180000000000000019387\n  Bound result 12\n  Bound result 19999999999000002850\n  Bound result 4999999999000000701\n  Bound result 12\n  Bound result 4999999995000000\n  Bound result 12\n  Bound result 19999999999000012263\n  Bound result 19999999999000002297\n  Bound result 2816\n  Bound result 12\n  Bound result 19999999999003000001\n  Bound result 19999999999000006960\n  Bound result 19999999999000000181\n  Bound result 108000\n  Bound result 12\n  Bound result 19999999999999999997\n  Bound result 6285809022066282034245\n  Bound result 13714187977933718237637\n  Bound result 7584007913129639936\n  Bound result 12\n  Bound result 19999999999000004091\n  Bound result 19999999999000014940\n  Bound result 4999999999000001441\n  Bound result 12\n  Bound result 17707567918181156739\n  Bound result 9646790310336179065656\n  Bound result 999999999991071\n  Bound result 5515388225557274223\n  Bound result 114\n  Bound result 22850050648440832\n  swaps: 31\n  moves: 14\n  mates paid: 5\n  Bound result 12\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.37s (4.35s CPU time)\n\nRan 2 tests for test/LaunchInvariant.t.sol:LaunchInvariantTokenAboveImd\n[PASS]\nLaunchInvariantTokenAboveImd invariants:\n[PASS] invariant_gamesAndCountsStaySound\n[PASS] invariant_theMoneyIsAllAccountedFor\n LaunchInvariantTokenAboveImd invariants (runs: 64, calls: 6400, reverts: 0)\n\n╭---------------+-------------------+-------+---------+----------╮\n| Contract      | Selector          | Calls | Reverts | Discards |\n+================================================================+\n| LaunchHandler | burn              | 539   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactIn        | 543   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactInAgain   | 507   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactOut       | 498   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | collectLpFees     | 508   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | fund              | 554   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | longSilence       | 553   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | roll              | 527   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | silence           | 564   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | tradeNextBlock    | 523   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | withdraw          | 542   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | withdrawElsewhere | 542   | 0       | 0        |\n╰---------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 64218862784848682755\n  Bound result 9143560130412421430960\n  Bound result 99999999999999000225\n  Bound result 3375844324789059840\n  Bound result 80\n  Bound result 2\n  Bound result 2\n  Bound result 99999999999999015113\n  Bound result 99999999999999022711\n  Bound result 28319729703828893044\n  Bound result 1\n  Bound result 1\n  Bound result 66000000000000000\n  Bound result 99999999999999008886\n  Bound result 34664905578206286223\n  Bound result 4\n  Bound result 4\n  Bound result 99999999999999004001\n  Bound result 4\n  Bound result 4\n  Bound result 99999999999999999997\n  Bound result 99999999999999000901\n  Bound result 4\n  Bound result 4\n  Bound result 99999999999999002797\n  Bound result 5\n  Bound result 5\n  Bound result 99999999999999048767\n  Bound result 5\n  Bound result 5\n  Bound result 4\n  Bound result 4\n  Bound result 99999999999999000064\n  Bound result 99999999999999001634\n  Bound result 1\n  Bound result 1\n  Bound result 99999999999999001001\n  Bound result 99999999999999000061\n  Bound result 5\n  Bound result 5\n  Bound result 20\n  Bound result 8965348187831378279412\n  Bound result 69704869424028597895\n  Bound result 1\n  Bound result 1\n  Bound result 84443867409285120\n  Bound result 2461109646979420542716\n  Bound result 99395432914459023454\n  Bound result 99574999999999019299\n  Bound result 99999999999999016250\n  Bound result 3\n  Bound result 3\n  Bound result 99999999999999006938\n  Bound result 943668479\n  Bound result 1\n  Bound result 1\n  Bound result 5\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 99999999999999010521\n  Bound result 1\n  Bound result 1\n  Bound result 97792120365436117857\n  Bound result 83096749817291174030\n  Bound result 92911554501929449926\n  Bound result 99999999999999015365\n  Bound result 6071\n  Bound result 1012092019\n  Bound result 21368\n  Bound result 85855469266232227209\n  Bound result 33548658560907093020\n  Bound result 24036\n  Bound result 5\n  Bound result 5\n  swaps: 29\n  refused: 3\n  moves: 8\n  mates: 0\n  mates paid: 0\n  draws: 1\n  fallbacks: 0\n  timeouts: 2\n  expired: 8\n  claims: 5\n  collects: 9\n\n[PASS] test_theHandlerReachesEveryPath() (gas: 289489952)\nLogs:\n  Bound result 300000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1000000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 310000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1001000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 320000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1002000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 330000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1003000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 340000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1004000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 350000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1005000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 360000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1006000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 370000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1007000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 380000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1008000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 390000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1009000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 400000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1010000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 410000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1011000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 420000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1012000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 430000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1013000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 440000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1014000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 450000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1015000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 460000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1016000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 470000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1017000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 480000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1018000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 490000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1019000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 500000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1020000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 510000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1021000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 520000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1022000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 530000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1023000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 540000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1024000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 550000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1025000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 560000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1026000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 570000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1027000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 580000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1028000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 590000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1029000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 600000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1030000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 610000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1031000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 620000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1032000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 630000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1033000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 640000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1034000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 650000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1035000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 660000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1036000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 670000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1037000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 680000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1038000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 690000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1039000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 700000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1040000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 710000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1041000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 720000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1042000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 730000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1043000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 740000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1044000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 750000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1045000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 760000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1046000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 770000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1047000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 780000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1048000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 790000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1049000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 800000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1050000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 810000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1051000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 820000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1052000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 830000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1053000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 840000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1054000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 850000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1055000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 860000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1056000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 870000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1057000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 880000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1058000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 890000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1059000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 900000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1060000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 910000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1061000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 920000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1062000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 930000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1063000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 940000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1064000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 950000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1065000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 960000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1066000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 970000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1067000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 980000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1068000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 990000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1069000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1070000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1010000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1071000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1020000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1072000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 1030000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1073000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1040000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1074000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1050000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1075000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1060000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1076000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1070000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1077000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1080000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1078000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1090000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1079000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1100000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1080000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1110000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1081000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 1120000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1082000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1130000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1083000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1140000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1084000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1150000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1085000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1160000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1086000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1170000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1087000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1180000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1088000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1190000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1089000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.06s (9.59s CPU time)\n\nRan 2 tests for test/LaunchInvariant.t.sol:LaunchInvariantTokenBelowImd\n[PASS]\nLaunchInvariantTokenBelowImd invariants:\n[PASS] invariant_gamesAndCountsStaySound\n[PASS] invariant_theMoneyIsAllAccountedFor\n LaunchInvariantTokenBelowImd invariants (runs: 64, calls: 6400, reverts: 0)\n\n╭---------------+-------------------+-------+---------+----------╮\n| Contract      | Selector          | Calls | Reverts | Discards |\n+================================================================+\n| LaunchHandler | burn              | 539   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactIn        | 543   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactInAgain   | 507   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | buyExactOut       | 498   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | collectLpFees     | 508   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | fund              | 554   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | longSilence       | 553   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | roll              | 527   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | silence           | 564   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | tradeNextBlock    | 523   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | withdraw          | 542   | 0       | 0        |\n|---------------+-------------------+-------+---------+----------|\n| LaunchHandler | withdrawElsewhere | 542   | 0       | 0        |\n╰---------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 64218862784848682755\n  Bound result 9143560130412421430960\n  Bound result 99999999999999000225\n  Bound result 3375844324789059840\n  Bound result 80\n  Bound result 5\n  Bound result 5\n  Bound result 99999999999999014312\n  Bound result 99999999999999021749\n  Bound result 28319729703828893044\n  Bound result 1\n  Bound result 1\n  Bound result 66000000000000000\n  Bound result 1229782939087557173\n  Bound result 34664905578206286223\n  Bound result 4\n  Bound result 4\n  Bound result 99999999999999004001\n  Bound result 5\n  Bound result 5\n  Bound result 99999999999999999997\n  Bound result 99999999999999000901\n  Bound result 3\n  Bound result 3\n  Bound result 21350665613463463186\n  Bound result 3\n  Bound result 3\n  Bound result 99999999999999048767\n  Bound result 5\n  Bound result 5\n  Bound result 4\n  Bound result 4\n  Bound result 99999999999999000064\n  Bound result 99999999999999001613\n  Bound result 2\n  Bound result 2\n  Bound result 99999999999999001001\n  Bound result 99999999999999000061\n  Bound result 5\n  Bound result 5\n  Bound result 13290\n  Bound result 8965348187831378279412\n  Bound result 69704869424028597895\n  Bound result 1\n  Bound result 1\n  Bound result 84443867409285120\n  Bound result 2461109646979420542716\n  Bound result 99395432914459023454\n  Bound result 6920054841393814985832\n  Bound result 99999999999999023980\n  Bound result 3\n  Bound result 3\n  Bound result 99999999999999007667\n  Bound result 943668479\n  Bound result 1\n  Bound result 1\n  Bound result 5\n  Bound result 5\n  Bound result 100000000000000000000\n  Bound result 99999999999999018202\n  Bound result 1\n  Bound result 1\n  Bound result 97792120365436117857\n  Bound result 83096749817291174030\n  Bound result 92911554501929449926\n  Bound result 99999999999999016473\n  Bound result 197\n  Bound result 1209821812\n  Bound result 21368\n  Bound result 85855469266232227209\n  Bound result 33548658560907093020\n  Bound result 17694\n  Bound result 5\n  Bound result 5\n  swaps: 32\n  refused: 0\n  moves: 11\n  mates: 1\n  mates paid: 1\n  draws: 0\n  fallbacks: 1\n  timeouts: 0\n  expired: 7\n  claims: 5\n  collects: 9\n\n[PASS] test_theHandlerReachesEveryPath() (gas: 291634364)\nLogs:\n  Bound result 300000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1000000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 310000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1001000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 320000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1002000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 330000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1003000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 340000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1004000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 350000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1005000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 360000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1006000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 370000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1007000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 380000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1008000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 390000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1009000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 400000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1010000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 410000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1011000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 420000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1012000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 430000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1013000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 440000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1014000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 450000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1015000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 460000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1016000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 470000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1017000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 480000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1018000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 490000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1019000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 500000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1020000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 510000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1021000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 520000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1022000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 530000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1023000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 540000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1024000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 550000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1025000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 560000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1026000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 570000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1027000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 580000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1028000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 590000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1029000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 600000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1030000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 610000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1031000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 620000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1032000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 630000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1033000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 640000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1034000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 650000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1035000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 660000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1036000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 670000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1037000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 680000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1038000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 690000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1039000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 700000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1040000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 710000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1041000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 720000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1042000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 730000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1043000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 740000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1044000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 750000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1045000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 760000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1046000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 770000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1047000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 780000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1048000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 790000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1049000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 800000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1050000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 810000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1051000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 820000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1052000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 830000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1053000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 840000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1054000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 850000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1055000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 860000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1056000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 870000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1057000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 880000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1058000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 890000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1059000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 900000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1060000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 910000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1061000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 920000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1062000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 930000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1063000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 940000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1064000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 950000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1065000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 960000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1066000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 970000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1067000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 980000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1068000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 990000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1069000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1070000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1010000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1071000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1020000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1072000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 1030000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1073000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1040000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1074000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1050000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1075000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1060000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1076000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1070000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1077000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1080000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1078000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1090000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1079000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1100000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1080000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1110000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1081000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1000000000000000000\n  Bound result 1120000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1082000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1130000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1083000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1140000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1084000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1150000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1085000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1160000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1086000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1170000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1087000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1180000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1088000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 1190000000000000000\n  Bound result 3\n  Bound result 3\n  Bound result 1089000000000000000\n  Bound result 1000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n  Bound result 4\n  Bound result 4\n  Bound result 2000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.64s (10.20s CPU time)\n\nRan 32 test suites in 9.65s (41.35s CPU time): 241 tests passed, 0 failed, 0 skipped (241 total tests)\n","passed":true},{"durationMs":172,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMDuelHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"IMDuelHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"IMDuelHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"IMDuelHook.fundChest((address,address,uint24,int24,address),bool,uint256)\",\"IMDuelHook.unlockCallback(bytes)\",\"IMDuelHook.withdraw(address,address)\",\"IMDuelHook.withdrawTo(address,address)\",\"IMDuelToken.approve(address,uint256)\",\"IMDuelToken.transfer(address,uint256)\",\"IMDuelToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":114,\"LICENSE\":16,\"README.md\":106,\"foundry.toml\":29,\"launch.json\":34,\"launch/engine.json\":10,\"launch/hook.json\":34,\"launch/hook.sepolia.json\":34,\"script/LaunchPolicy.sol\":43,\"src/Bitboard.sol\":719,\"src/Chess.sol\":35,\"src/ChessEngineV5.sol\":852,\"src/IChessEngine.sol\":29,\"src/IMDuelHook.sol\":858,\"src/IMDuelToken.sol\":62,\"src/Rules.sol\":45,\"src/Strength.sol\":46,\"test/AuditRegression.t.sol\":192,\"test/Base.sol\":223,\"test/Bidding.t.sol\":256,\"test/Chessboard.sol\":79,\"test/Draws.t.sol\":90,\"test/FactoryLaunch.t.sol\":218,\"test/FeeSchedule.t.sol\":165,\"test/Game.t.sol\":381,\"test/GasEstimate.t.sol\":96,\"test/Harness.sol\":83,\"test/HookGas.t.sol\":172,\"test/Hostile.t.sol\":415,\"test/Invariant.t.sol\":158,\"test/InvariantDuels.t.sol\":463,\"test/Launch.t.sol\":139,\"test/LaunchAdmission.t.sol\":156,\"test/LaunchFailures.t.sol\":1096,\"test/LaunchFiles.t.sol\":78,\"test/LaunchFixture.sol\":291,\"test/LaunchInvariant.t.sol\":1020,\"test/LaunchMoney.t.sol\":576,\"test/MatePot.t.sol\":461,\"test/Money.t.sol\":360,\"test/PotStrength.t.sol\":114,\"test/Predict.t.sol\":102,\"test/Size.t.sol\":27,\"test/Slice.t.sol\":140,\"test/Stats.t.sol\":248,\"test/Strength.t.sol\":88,\"test/Teams.t.sol\":90,\"test/Token.t.sol\":82,\"test/TokenInvariant.t.sol\":155,\"test/Tokens.sol\":150,\"test/V4Fixture.sol\":100,\"test/Windows.t.sol\":135,\"test/data/chess.json\":1,\"test/data/conversion-validation.json\":770,\"test/data/conversion.json\":98,\"test/data/endings.json\":1,\"test/data/legal.json\":1,\"test/data/random.json\":1},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a9b51bd8e8687934854dcf739baa081b1b74b283a498747af1688b9bab7a7c04","verifiedTreeHash":"4c96300089eb9791ee8523540e2c8b3878560dea","verifierVersion":"0.1.0+b10502ca"},{"checks":[{"durationMs":92667,"exitCode":0,"name":"build","output":"Compiling 116 files with Solc 0.8.26\nSolc 0.8.26 finished in 92.54s\nCompiler run successful with warnings:\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:108:22:\n    |\n108 |             rook = ((FILE_A << f) | (RANK_1 << (8 * r))) ^ bit;\n    |                      ^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:108:38:\n    |\n108 |             rook = ((FILE_A << f) | (RANK_1 << (8 * r))) ^ bit;\n    |                                      ^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:109:57:\n    |\n109 |             uint64 d = f >= r ? DIAG >> (8 * (f - r)) : DIAG << (8 * (r - f));\n    |                                                         ^^^^^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:110:65:\n    |\n110 |             uint64 a = f + r <= 7 ? ANTI >> (8 * (7 - f - r)) : ANTI << (8 * (f + r - 7));\n    |                                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/ChessEngineV5.sol:537:38:\n    |\n537 |             uint64 ahead = c.white ? ~uint64(0) << ((r + 1) * 8) : (uint64(1) << (r * 8)) - 1;\n    |                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/ChessEngineV5.sol:537:69:\n    |\n537 |             uint64 ahead = c.white ? ~uint64(0) << ((r + 1) * 8) : (uint64(1) << (r * 8)) - 1;\n    |                                                                     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:31:18:\n   |\n31 |         returns (uint16, Rules.Played memory)\n   |                  ^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:31:26:\n   |\n31 |         returns (uint16, Rules.Played memory)\n   |                          ^^^^^^^^^^^^^^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:36:85:\n   |\n36 |     function playAny(uint256, uint32, uint32, bool, uint256) external pure returns (uint16, Rules.Played memory) {\n   |                                                                                     ^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:36:93:\n   |\n36 |     function playAny(uint256, uint32, uint32, bool, uint256) external pure returns (uint16, Rules.Played memory) {\n   |                                                                                             ^^^^^^^^^^^^^^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/Hostile.t.sol:62:18:\n   |\n62 |         returns (uint16, Rules.Played memory)\n   |                  ^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/Hostile.t.sol:62:26:\n   |\n62 |         returns (uint16, Rules.Played memory)\n   |                          ^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Game.t.sol:97:9:\n   |\n97 |         IMDuelHook.Game memory g = st();\n   |         ^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/LaunchFiles.t.sol:73:5:\n   |\n73 |     function test_engineLaunchFileDeploysTheEngineWithoutArguments() public {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":3966,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/Size.t.sol:SizeTest\n[PASS] test_deployedCodeFitsTheBudgets() (gas: 71241)\nLogs:\n  hook: 16900\n  engine v5: 23339\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.16ms (1.03ms CPU time)\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] test_allowances() (gas: 347653)\n[PASS] test_fixedSupplyToTheDeployer() (gas: 39384)\n[PASS] test_nothingPrivileged() (gas: 192691)\n[PASS] test_transfers() (gas: 188240)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.49ms (695.95µs CPU time)\n\nRan 3 tests for test/LaunchFiles.t.sol:LaunchFilesTest\n[PASS] test_engineLaunchFileDeploysTheEngineWithoutArguments() (gas: 7834)\n[PASS] test_ethereumLaunchFile() (gas: 158792)\n[PASS] test_sepoliaLaunchFile() (gas: 150795)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.30ms (4.44ms CPU time)\n\nRan 8 tests for test/Slice.t.sol:SliceTest\n[PASS] test_aDuelAgainstImdSendsItsSliceToTheMainDuelsImdPot() (gas: 981778)\n[PASS] test_aDuelAgainstImduelBurnsItsSlice() (gas: 960558)\n[PASS] test_aSliceMovesNoPrice() (gas: 1532512)\n[PASS] test_anyoneSendsTheBurn() (gas: 648930)\n[PASS] test_buyingImduelBurnsASliceOfIt() (gas: 411997)\n[PASS] test_dustPaysNoSlice() (gas: 514419)\n[PASS] test_theMainDuelsSliceIsBurned() (gas: 577029)\n[PASS] test_theWholeSliceIsBurnedToTheWei() (gas: 536637)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 12.68ms (10.13ms CPU time)\n\nRan 7 tests for test/Draws.t.sol:DrawsTest\n[PASS] test_checkmate() (gas: 334401)\n[PASS] test_moveCap() (gas: 331503)\n[PASS] test_ordinaryMoveDoesNotEndTheGame() (gas: 272039)\n[PASS] test_quietMoveLimit() (gas: 337709)\n[PASS] test_stalemate() (gas: 329276)\n[PASS] test_thirdRepetition() (gas: 1128186)\n[PASS] test_tooFewPiecesToMate() (gas: 321032)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 13.89ms (5.26ms CPU time)\n\nRan 7 tests for test/Windows.t.sol:WindowsTest\n[PASS] test_aHash257BlocksBackComesFromHistory() (gas: 1379597)\n[PASS] test_anExpiredMovesWindowIsTheFindingBlock() (gas: 809971)\n[PASS] test_dustAfterTheWindowCanBeAnswered() (gas: 1859162)\n[PASS] test_dustInTheClosingBlockCanBeAnswered() (gas: 1874191)\n[PASS] test_noPreviewBeforeTheClosingBlock() (gas: 749879)\n[PASS] test_onlyALateFirstBidMovesTheWindow() (gas: 768169)\n[PASS] test_theResolvingTradesBidNamesItsHalfMove() (gas: 1223658)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 14.97ms (12.83ms CPU time)\n\nRan 5 tests for test/PotStrength.t.sol:PotStrengthTest\n[PASS] test_aDonationWeakensTheTeamsBidsAndRaisesThePrizeForMatingIt() (gas: 3394559)\n[PASS] test_anEmptyPotPlaysAtTheCapUntilItIsAPot() (gas: 4178752)\n[PASS] test_exactOutputStrengthIncludesThePotShare() (gas: 616267)\n[PASS] test_liquidityChangesNothing() (gas: 1669734)\n[PASS] test_strengthIsReadAfterTheMateTheTradePlayed() (gas: 1580288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 14.92ms (13.27ms CPU time)\n\nRan 8 tests for test/Strength.t.sol:StrengthTest\n[PASS] testFuzz_boundedAndMonotonic(uint256,uint256,uint256) (runs: 256, μ: 9069, ~: 9046)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457584006914073308415\n\n[PASS] testFuzz_depthMonotonic(uint256,uint256,uint256) (runs: 256, μ: 11949, ~: 11898)\nLogs:\n  Bound result 943668479\n  Bound result 64000000000000000\n\n[PASS] testFuzz_shiftKeepsTheShare(uint256,uint256,uint8) (runs: 256, μ: 14506, ~: 14033)\nLogs:\n  Bound result 30\n  Bound result 1000000000000\n  Bound result 943668479\n\n[PASS] testFuzz_tenfoldIsAboutThirtyPoints(uint128,uint128) (runs: 256, μ: 13853, ~: 13708)\nLogs:\n  Bound result 340282366920938463463374607431767211498\n  Bound result 33687954325172908121109934628444571451\n\n[PASS] testFuzz_unscalablePaidFollowsTheCurve(uint256,uint256) (runs: 256, μ: 14007, ~: 14210)\nLogs:\n  Bound result 115676297148078879228147414023679219945416714680974923476978348610226064830178\n  Bound result 115676297148078879228147414023691475161338229062180099083019117769300591507360\n\n[PASS] test_decidedPoints() (gas: 13720)\n[PASS] test_hugePaymentsDoNotRevert() (gas: 12835)\n[PASS] test_zeroInputs() (gas: 5289)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 20.04ms (45.66ms CPU time)\n\nRan 5 tests for test/Teams.t.sol:TeamsTest\n[PASS] test_aDynamicFeePoolPlaysWithAZeroLpFee() (gas: 1904114)\n[PASS] test_nativeEthIsATeamLikeAnyToken() (gas: 1224021)\n[PASS] test_poolsOnOneHookKeepSeparateGamesAndChests() (gas: 2479138)\n[PASS] test_sliceSide() (gas: 720994)\n[PASS] test_twoPlainTokensCannotDuel() (gas: 437611)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 25.08ms (16.36ms CPU time)\n\nRan 2 tests for test/FactoryLaunch.t.sol:FactoryLaunchTest\n[PASS] test_factoryLaunchWithTokenAboveImd() (gas: 11440064)\n[PASS] test_factoryLaunchWithTokenBelowImd() (gas: 11419485)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 26.53ms (28.73ms CPU time)\n\nRan 2 tests for test/LaunchAdmission.t.sol:LaunchAdmissionTest\n[PASS] test_blankChainTokenAboveImd() (gas: 20224129)\n[PASS] test_blankChainTokenBelowImd() (gas: 20213889)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 27.13ms (52.29ms CPU time)\n\nRan 12 tests for test/Hostile.t.sol:HostileTest\n[PASS] test_aCallbackTokenOwnerLeavingADebtCannotFreezeTheDuel() (gas: 4090732)\n[PASS] test_aDeadEngineEndsTheGameAsADrawAndTradingGoesOn() (gas: 2312934)\n[PASS] test_aGasBurningEngineCostsOneExpensiveTradeNotTheGame() (gas: 7405962)\n[PASS] test_aTokenReturningNothingFundsAChest() (gas: 1032369)\n[PASS] test_anEthOwnerCreditingTheHookCannotFreezeTheDuel() (gas: 3176697)\n[PASS] test_anEthOwnerLeavingADebtCannotFreezeTheDuel() (gas: 3021701)\n[PASS] test_anOwnerThatCannotReceiveWithdrawsElsewhere() (gas: 2560365)\n[PASS] test_blockedRecipientStaysOwedAndTradingContinues() (gas: 3067657)\n[PASS] test_brokenEngineFallsBackToALegalMove() (gas: 4095973)\n[PASS] test_feeOnTransferTokenFundsOnlyWhatArrives() (gas: 1578261)\n[PASS] test_reenteringTokenCannotBreakAClaim() (gas: 3695941)\n[PASS] test_starvingTheEngineNeverPlaysTheFallback() (gas: 17054982)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 44.49ms (71.15ms CPU time)\n\nRan 5 tests for test/AuditRegression.t.sol:AuditRegressionTest\n[PASS] test_abiHookDataKeepsWalletBidStatsAndMatePayout() (gas: 1654557)\n[PASS] test_closedWindowPreservesNotEnoughGasAndCanBeRetried() (gas: 1803274)\n[PASS] test_emptyHookDataReproducesAcceptedRelayerAttribution() (gas: 1651793)\n[PASS] test_packedHookDataKeepsWalletBidStatsAndMatePayout() (gas: 1654352)\n[PASS] test_starvedFallbackPreservesNotEnoughGas() (gas: 9732906)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 46.03ms (43.43ms CPU time)\n\nRan 3 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_launchPairedWithEth() (gas: 20464305)\n[PASS] test_launchTokenAboveImd() (gas: 22051377)\nLogs:\n  first buy (opens game 0, bids for White): 390904\n\n[PASS] test_launchTokenBelowImd() (gas: 21786067)\nLogs:\n  first buy (opens game 0, bids for White): 357618\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 49.30ms (125.19ms CPU time)\n\nRan 8 tests for test/FeeSchedule.t.sol:FeeScheduleTest\n[PASS] testFuzz_exactOutputDeliversTheOrderAndTakesItsFeeOnTop(uint256) (runs: 256, μ: 542315, ~: 542477)\nLogs:\n  Bound result 499999999999000000537\n\n[PASS] test_exactOutputStoppedByItsPriceLimitIsRefused() (gas: 259775)\n[PASS] test_fundChestBeyondBalanceIsRefused() (gas: 121187)\n[PASS] test_fundChestOfZeroAddsNothing() (gas: 97993)\n[PASS] test_fundChestWithTheWrongEthValueIsRefused() (gas: 344437)\n[PASS] test_fundChestWithoutAllowanceIsRefused() (gas: 110843)\n[PASS] test_owedRewardOnlyEverReachesItsOwner() (gas: 1268983)\n[PASS] test_withdrawWithNothingOwedDoesNothing() (gas: 90005)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 57.26ms (57.52ms CPU time)\n\nRan 11 tests for test/Stats.t.sol:StatsTest\n[PASS] test_aDustBidsMoveCounts() (gas: 1177326)\n[PASS] test_aMateCountsEvenWhenItPaysNothing() (gas: 691623)\n[PASS] test_aMoveAtAnyStrengthCounts() (gas: 278453)\n[PASS] test_aPaidSideDuelMateCountsNothing() (gas: 861550)\n[PASS] test_aSideDuelCountsNothing() (gas: 583461)\n[PASS] test_amountsWonAreCountedPerToken() (gas: 935020)\n[PASS] test_checksAndCapturesByType() (gas: 1018958)\n[PASS] test_countersSaturate() (gas: 33090)\n[PASS] test_enPassantAndPromotion() (gas: 682261)\n[PASS] test_gamesMatesAndThePlayerList() (gas: 1493429)\n[PASS] test_movesByPieceCastlingAndFullStrength() (gas: 1407030)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 122.76ms (10.51ms CPU time)\n\nRan 14 tests for test/Bidding.t.sol:BiddingTest\n[PASS] test_aBuyOfTheOtherTeamBidsForItsNextMove() (gas: 2302673)\n[PASS] test_aBuyOfTheOtherTeamTimesTheSilentSideOutAndBids() (gas: 1220837)\n[PASS] test_aClosedWindowTakesNoBidsForItsMove() (gas: 1238283)\n[PASS] test_aLateFirstBidOpensAFullWindow() (gas: 1790503)\n[PASS] test_aMateIsPaidFromTheLosersChestInItsToken() (gas: 1589493)\n[PASS] test_aMoveIsOpenForTurnBlocksBlocks() (gas: 1216340)\n[PASS] test_aNewTopMustPayMoreThanTenPercentMore() (gas: 988826)\n[PASS] test_aNextMoveBidCarriesIntoTheNextGame() (gas: 1751624)\n[PASS] test_bidsCountAcrossTheWholeWindow() (gas: 1703229)\n[PASS] test_exactlyTenPercentMoreIsNotEnough() (gas: 989254)\n[PASS] test_theMoveDependsOnlyOnTheWindowsLastBlock() (gas: 1949748)\n[PASS] test_theMoversOwnBuyAfterItsWindowBidsForItsNextMove() (gas: 1251927)\n[PASS] test_theOwnerIsTheHookDataAddressElseTheSigner() (gas: 1846249)\n[PASS] test_thePreviewIsTheMoveThatIsPlayed() (gas: 1485460)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 122.84ms (24.28ms CPU time)\n\nRan 5 tests for test/HookGas.t.sol:HookGasTest\n[PASS] test_aSideDuelsSliceStaysAPlainTrade() (gas: 2225484)\nLogs:\n  side duel trade with its slice: 198280\n\n[PASS] test_hookShareOfAMovingTrade() (gas: 27867148)\nLogs:\n  hook share of a moving trade: average: 280427\n  hook share of a moving trade: max: 291566\n\n[PASS] test_middlegameGas() (gas: 8526507)\nLogs:\n  first bid in a new pool: 260797\n  bidding trade: 203812\n  outbidding trade: 203617\n  plain trade: 194129\n  next block: play the turn and bid: 585327\n\n[PASS] test_openingGas() (gas: 3870102)\nLogs:\n  first bid in a new pool: 260797\n  bidding trade: 204410\n  outbidding trade: 203617\n  plain trade: 194129\n  next block: play the turn and bid: 624966\n\n[PASS] test_runningGameGas() (gas: 47700896)\nLogs:\n  running game, moving trades measured: 42\n  running game, moving trade average: 451639\n  running game, moving trade max: 557656\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 122.77ms (169.32ms CPU time)\n\nRan 1 test for test/Predict.t.sol:PredictTest\n[PASS] test_aBotCannotPickItsOwnCapturingMoves() (gas: 252152063)\nLogs:\n  bot moves: 0\n  other moves: 53\n  captures among other moves: 13\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 513.12ms (512.94ms CPU time)\n\nRan 2 tests for test/GasEstimate.t.sol:GasEstimateTest\n[PASS] test_atTheEstimateThePayoutIsRecorded() (gas: 6326804)\nLogs:\n  smallest gas limit that plays and records the mate's payout: 3701048\n\n[PASS] test_noGasLimitPlaysTheMoveWithoutItsPayout() (gas: 974659330)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 711.40ms (719.77ms CPU time)\n\nRan 21 tests for test/MatePot.t.sol:MatePotTest\n[PASS] testFuzz_heldEqualsOwedWithImdAsCurrency1(uint256) (runs: 32, μ: 13076467, ~: 13021554)\n[PASS] test_aDonationDoesNotRaiseTheCap() (gas: 1883900)\n[PASS] test_aDrawPaysNothing() (gas: 1861364)\n[PASS] test_aDustGamePaysNothing() (gas: 2010121)\n[PASS] test_aDustMateEarnsTwiceItsDust() (gas: 2017977)\n[PASS] test_aFeeFreeSwapAfterAFeeInOneUnlockAddsNoInflow() (gas: 2559726)\n[PASS] test_aGameTradedAloneReturnsAtMostItsPotFees() (gas: 2022701)\n[PASS] test_aMateAgainstATeamNobodyBoughtStillPays() (gas: 3694476)\n[PASS] test_aMateAgainstAnEmptyPotPaysNothing() (gas: 1813816)\n[PASS] test_aShortGamePaysTheLosersFeesNotTheResolvingTrades() (gas: 2981382)\n[PASS] test_aThinSideDuelPaysBackAtMostTheAttackersOwnFee() (gas: 2670612)\n[PASS] test_aTimeoutMatePaysNobody() (gas: 2616259)\n[PASS] test_anExpiredHashPlaysThePaidBidForNobody() (gas: 2925806)\n[PASS] test_everySwapShapeRecordsItsPotFee() (gas: 2832299)\n[PASS] test_theLoserPaysWhenImduelIsCurrency0() (gas: 2600254)\n[PASS] test_theLoserPaysWhenImduelIsCurrency1() (gas: 2600793)\n[PASS] test_theManagerOrTheHookOwnsNoBid() (gas: 2354405)\n[PASS] test_thePrizeIsAtMostTheLosersOwnInflow() (gas: 2546191)\n[PASS] test_twoSwapsInOneUnlockKeepTheirInflowApart() (gas: 4588692)\n[PASS] test_twoSwapsInOneUnlockKeepTheirInflowApartReversed() (gas: 4589218)\n[PASS] test_withdrawToRefusesAddressZeroTheHookAndTheManager() (gas: 1407537)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 714.44ms (765.10ms CPU time)\n\nRan 25 tests for test/Game.t.sol:GameTest\n[PASS] testFuzz_swapsNeverRevert(uint256) (runs: 48, μ: 10516656, ~: 10614120)\n[PASS] test_aGamePlaysOutThroughSwaps() (gas: 77324728)\nLogs:\n  moves played: 108\n  bids (incl. outbid ones): 138\n  most gas for a swap: 737149\n\n[PASS] test_aSmallerTradeInTheBlockDoesNotTakeTheTurn() (gas: 692202)\n[PASS] test_aTimeoutTurnCanBeTakenInItsBlock() (gas: 1484871)\n[PASS] test_aTradeBidsForTheTurn() (gas: 505631)\n[PASS] test_aTurnClosesWithItsBlock() (gas: 1146176)\n[PASS] test_anExpiredTurnPlaysItsBidForNobody() (gas: 1583139)\n[PASS] test_anOldTurnIsPlayedWithTheHistoryContractsHash() (gas: 2094806)\n[PASS] test_anyTradeSizeBids() (gas: 2685983)\n[PASS] test_lateTradeStillBidsNormally() (gas: 452508)\n[PASS] test_onlyThePoolManagerAndTheHookCanCallIn() (gas: 122174)\n[PASS] test_ownerDefaultsToTxOrigin() (gas: 438886)\n[PASS] test_playedPositionsEnterTheRepetitionMemory() (gas: 1104251)\n[PASS] test_previewMoveIsReadyInTheClosingBlock() (gas: 721740)\n[PASS] test_previewMoveReadsTheServedHashItself() (gas: 1677587)\n[PASS] test_rejectsBadConfig() (gas: 8818)\n[PASS] test_silentSidePlaysAtZeroStrength() (gas: 1055478)\n[PASS] test_strengthFollowsTheShareOfTheTeamsPot() (gas: 8610230)\n[PASS] test_teamsSwapColoursEveryGame() (gas: 1026940)\n[PASS] test_theBiggestTradeInTheBlockOwnsTheTurn() (gas: 788475)\n[PASS] test_theFirstPoolOpenedIsTheMainDuel() (gas: 179045)\n[PASS] test_theMainDuelMustPairImd() (gas: 312270)\n[PASS] test_theNextBlocksTradePlaysTheTurn() (gas: 1221781)\n[PASS] test_theOtherTeamCannotBidOnThisTurn() (gas: 435166)\n[PASS] test_whoPlaysTheTurnAndWhenDoesNotChangeTheMove() (gas: 1874217)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 815.65ms (985.84ms CPU time)\n\nRan 20 tests for test/Money.t.sol:MoneyTest\n[PASS] testFuzz_heldEqualsOwed(uint256) (runs: 48, μ: 11961464, ~: 12019249)\n[PASS] test_aBuyFeedsBothPotsAndBurnsTheSlice() (gas: 421634)\n[PASS] test_aFullChestTakesNoMore() (gas: 1100726)\n[PASS] test_aMateForNobodyPaysNobody() (gas: 515104)\n[PASS] test_aTradeStoppedByItsPriceLimitIsRefused() (gas: 557098)\n[PASS] test_capturesAndChecksPayNothing() (gas: 507482)\n[PASS] test_everyTradeEmitsHookSwapWithTheHookFee() (gas: 556213)\n[PASS] test_everyTradeFeedsBothPots() (gas: 2154397)\n[PASS] test_exactOutputSlicesTheInput() (gas: 541596)\n[PASS] test_exactOutputWithTheFeeInTheOutput() (gas: 393823)\n[PASS] test_feesCannotBeWithdrawnByAnyone() (gas: 536437)\n[PASS] test_fundChestNeedsTheRightValue() (gas: 48679)\n[PASS] test_fundChestOnlyForHookPools() (gas: 41774)\n[PASS] test_fundChestWithEth() (gas: 252841)\n[PASS] test_fundChestWithTokens() (gas: 255519)\n[PASS] test_mateTakesAQuarterOfTheLosersPot() (gas: 895609)\n[PASS] test_quietMovesPayNothing() (gas: 458996)\n[PASS] test_rewardsAreClaimedNeverPushed() (gas: 1359511)\n[PASS] test_theMateIsCappedAtTwiceWhatItsTradePaid() (gas: 773155)\n[PASS] test_theMateIsCountedForItsOwner() (gas: 636338)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 1.05s (1.06s CPU time)\n\nRan 1 test for test/Invariant.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_boardHasBothKingsAndPlyIsBounded\n[PASS] invariant_heldEqualsOwed\n InvariantTest invariants (runs: 24, calls: 2400, reverts: 0)\n\n╭----------+----------------+-------+---------+----------╮\n| Contract | Selector       | Calls | Reverts | Discards |\n+========================================================+\n| Handler  | burn           | 274   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | fund           | 281   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | idle           | 247   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | longPause      | 250   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | nextBlock      | 263   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | trade          | 283   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | tradeAgain     | 255   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | tradeNextBlock | 305   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | withdrawReward | 242   | 0       | 0        |\n╰----------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1238\n  Bound result 19999999000000000131\n  Bound result 19999999000000001709\n  Bound result 19999999000001500001\n  Bound result 2900000000000000000\n  Bound result 58\n  Bound result 40\n  Bound result 18198805245380381879\n  Bound result 19999999000000001000\n  Bound result 14944\n  Bound result 99\n  Bound result 2499949999997500\n  Bound result 19999999000000010610\n  Bound result 19999999000000018889\n  Bound result 19999999000000013656\n  Bound result 24\n  Bound result 19999999000000000970\n  Bound result 6641997679134031052\n  Bound result 9911\n  Bound result 3000000000000000000\n  Bound result 19999999000000009434\n  Bound result 40\n  Bound result 3600\n  Bound result 73\n  Bound result 30000000000000000\n  Bound result 1381282641142296733\n  Bound result 42754813917896217807\n  Bound result 100\n  Bound result 19999999000000000053\n  Bound result 50\n  Bound result 32\n  Bound result 108000\n  Bound result 24861\n  Bound result 19999999000000106693\n  Bound result 63\n  Bound result 19296707693607447019\n  Bound result 63\n  Bound result 19999999999999999998\n  Bound result 71776119061217280\n  Bound result 2355172927998303886\n  Bound result 6644185449734949650\n  Bound result 113\n  Bound result 11565342078087335612\n  Bound result 998\n  Bound result 12560002122043146505\n  Bound result 22\n  Bound result 12731486101901322513\n  Bound result 19999999000000000473\n  Bound result 19999999000000001250\n  Bound result 3317\n  Bound result 16524750123642650624\n  Bound result 1833\n  Bound result 5313166770951398828\n  Bound result 67\n  Bound result 1\n  Bound result 1769\n  Bound result 40\n  Bound result 23036\n  Bound result 17471123994747445864\n  Bound result 41626477544305852416\n  Bound result 19999999000000019692\n  Bound result 70\n  swaps: 29\n  moves: 13\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.24s (1.23s CPU time)\n\nRan 3 tests for test/TokenInvariant.t.sol:TokenInvariantTest\n[PASS]\nTokenInvariantTest invariants:\n[PASS] invariant_allowancesAreExactlyWhatWasApprovedLessWhatWasSpent\n[PASS] invariant_supplyIsFixedAndHeldByTheActors\n TokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------------+-------+---------+----------╮\n| Contract     | Selector           | Calls | Reverts | Discards |\n+================================================================+\n| TokenHandler | approve            | 2071  | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| TokenHandler | approveZeroSpender | 1993  | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| TokenHandler | transfer           | 2072  | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| TokenHandler | transferFrom       | 2056  | 0       | 0        |\n╰--------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 2\n  Bound result 10\n  Bound result 6\n  Bound result 128\n  Bound result 98000000000000000000\n  Bound result 7\n  Bound result 8\n  Bound result 150\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 5\n  Bound result 962975107793718920005656293\n  Bound result 141\n  Bound result 10000000000000001000\n  Bound result 6\n  Bound result 117\n  Bound result 7171\n  Bound result 86\n  Bound result 30000000000000000\n  Bound result 5688638793625097300\n  Bound result 6627458794374122\n  Bound result 1911\n  Bound result 3\n  Bound result 35\n  Bound result 30\n  Bound result 7158\n  Bound result 24442493013196478\n  Bound result 6233\n  Bound result 11\n\n[PASS] testFuzz_transferOfMoreThanTheBalanceIsRefused(uint256) (runs: 512, μ: 55910, ~: 55857)\nLogs:\n  Bound result 6021\n\n[PASS] test_transferFromTheZeroAddressIsRefused() (gas: 82118)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.62s (2.73s CPU time)\n\nRan 1 test for test/InvariantDuels.t.sol:InvariantDuelsTest\n[PASS]\nInvariantDuelsTest invariants:\n[PASS] invariant_everyBoardIsSound\n[PASS] invariant_everyCurrencyBalances\n[PASS] invariant_rightsMatchTheBoard\n[PASS] invariant_turnsAreWellFormed\n InvariantDuelsTest invariants (runs: 24, calls: 2880, reverts: 0)\n\n╭--------------+-------------------+-------+---------+----------╮\n| Contract     | Selector          | Calls | Reverts | Discards |\n+===============================================================+\n| DuelsHandler | addLiquidity      | 233   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | burn              | 191   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | fund              | 215   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | longPause         | 222   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | nextBlock         | 198   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | pushThenNextBlock | 201   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | queueMate         | 195   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | removeLiquidity   | 240   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | roundTrip         | 189   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | setMates          | 224   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | trade             | 191   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | tradeAgain        | 188   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | tradeNextBlock    | 190   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | withdrawReward    | 203   | 0       | 0        |\n╰--------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 9571383389564039707\n  Bound result 2832708629194959756\n  Bound result 3346456166257235449597\n  Bound result 3346455166257235450498\n  Bound result 1374389534720\n  Bound result 999999999999099\n  Bound result 4999999999000000129\n  Bound result 19999999999000018938\n  Bound result 4999999999000000065\n  Bound result 12\n  Bound result 19999999999000004868\n  Bound result 180000000000000000901\n  Bound result 12\n  Bound result 28792003956564819968\n  Bound result 19999999999000004596\n  Bound result 4749543059978807639089\n  Bound result 7254798590618308578765\n  Bound result 4999999999000000041\n  Bound result 20000000000000000000\n  Bound result 12\n  Bound result 7254797590618318578766\n  Bound result 19999999999000021229\n  Bound result 4749542059978807659257\n  Bound result 200000000000000000000\n  Bound result 12\n  Bound result 34817478633412362240\n  Bound result 9999999000000000640001\n  Bound result 4351784985231616391876\n  Bound result 3787848795156543927\n  Bound result 5648213014768384248139\n  Bound result 21\n  Bound result 12\n  Bound result 23801927633\n  Bound result 2155872511\n  Bound result 4263924515136285476\n  Bound result 7\n  Bound result 120195651445596224263\n  Bound result 12\n  Bound result 180000000000000000251\n  Bound result 12\n  Bound result 517440285\n  Bound result 3449504731626547562\n  Bound result 12662923559173284841\n  Bound result 89840749632055725\n  Bound result 4999999999000014802\n  Bound result 12500\n  Bound result 19999999999000000129\n  Bound result 9999999000000000006150\n  Bound result 999999999999999000000\n  Bound result 180000000000000005001\n  Bound result 12\n  Bound result 1904806139\n  Bound result 12\n  Bound result 19999999999000007197\n  Bound result 50000000000000000000\n  Bound result 19999999999000007036\n  Bound result 9999999000000000005280\n  Bound result 9999998000000000014275\n  Bound result 4367372619753551603892\n  Bound result 9999999000000000000113\n  Bound result 43\n  Bound result 180000000000000019289\n  Bound result 12\n  Bound result 19999999999000003014\n  Bound result 4999999999000000161\n  Bound result 12\n  Bound result 499999999500\n  Bound result 12\n  Bound result 19999999999000005032\n  Bound result 19999999999000000195\n  Bound result 2302\n  Bound result 12\n  Bound result 1374396088320\n  Bound result 19999999999000006928\n  Bound result 6124552197892110433\n  Bound result 1099511627775\n  Bound result 12\n  Bound result 19999999999999999997\n  Bound result 4548284025475070265260\n  Bound result 5451714974524929730456\n  Bound result 7408\n  Bound result 12\n  Bound result 19999999999000004094\n  Bound result 19999999999000015121\n  Bound result 4999999999000010998\n  Bound result 12\n  Bound result 19999999999000000032\n  Bound result 9646790310336179065656\n  Bound result 1000089840749621068789\n  Bound result 19047248989631123541\n  Bound result 114\n  Bound result 10000000000000001\n  swaps: 31\n  moves: 15\n  mates paid: 4\n  Bound result 12\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.77s (3.75s CPU time)\n\nRan 26 test suites in 3.77s (12.16s CPU time): 184 tests passed, 0 failed, 0 skipped (184 total tests)\n","passed":true},{"durationMs":86,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMDuelHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"IMDuelHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"IMDuelHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"IMDuelHook.fundChest((address,address,uint24,int24,address),bool,uint256)\",\"IMDuelHook.unlockCallback(bytes)\",\"IMDuelHook.withdraw(address,address)\",\"IMDuelHook.withdrawTo(address,address)\",\"IMDuelToken.approve(address,uint256)\",\"IMDuelToken.transfer(address,uint256)\",\"IMDuelToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":114,\"LICENSE\":16,\"README.md\":106,\"foundry.toml\":29,\"launch.json\":32,\"launch/engine.json\":10,\"launch/hook.json\":34,\"launch/hook.sepolia.json\":34,\"script/LaunchPolicy.sol\":43,\"src/Bitboard.sol\":719,\"src/Chess.sol\":35,\"src/ChessEngineV5.sol\":852,\"src/IChessEngine.sol\":29,\"src/IMDuelHook.sol\":858,\"src/IMDuelToken.sol\":62,\"src/Rules.sol\":45,\"src/Strength.sol\":46,\"test/AuditRegression.t.sol\":192,\"test/Base.sol\":223,\"test/Bidding.t.sol\":256,\"test/Chessboard.sol\":79,\"test/Draws.t.sol\":90,\"test/FactoryLaunch.t.sol\":218,\"test/FeeSchedule.t.sol\":165,\"test/Game.t.sol\":381,\"test/GasEstimate.t.sol\":96,\"test/Harness.sol\":83,\"test/HookGas.t.sol\":172,\"test/Hostile.t.sol\":415,\"test/Invariant.t.sol\":158,\"test/InvariantDuels.t.sol\":463,\"test/Launch.t.sol\":139,\"test/LaunchAdmission.t.sol\":156,\"test/LaunchFiles.t.sol\":78,\"test/MatePot.t.sol\":461,\"test/Money.t.sol\":360,\"test/PotStrength.t.sol\":114,\"test/Predict.t.sol\":102,\"test/Size.t.sol\":27,\"test/Slice.t.sol\":140,\"test/Stats.t.sol\":248,\"test/Strength.t.sol\":88,\"test/Teams.t.sol\":90,\"test/Token.t.sol\":82,\"test/TokenInvariant.t.sol\":155,\"test/Tokens.sol\":150,\"test/V4Fixture.sol\":100,\"test/Windows.t.sol\":135,\"test/data/chess.json\":1,\"test/data/conversion-validation.json\":770,\"test/data/conversion.json\":98,\"test/data/endings.json\":1,\"test/data/legal.json\":1,\"test/data/random.json\":1},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e0fbd4c62f881bce05969142ee74e364adfe8454028f33768ddf4956e5cb9368","verifiedTreeHash":"1214f161ccd6f46fbcca3f315554d7aa849f138d","verifierVersion":"0.1.0+b10502ca"},{"checks":[{"durationMs":108695,"exitCode":0,"name":"build","output":"Compiling 116 files with Solc 0.8.26\nSolc 0.8.26 finished in 108.55s\nCompiler run successful with warnings:\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:108:22:\n    |\n108 |             rook = ((FILE_A << f) | (RANK_1 << (8 * r))) ^ bit;\n    |                      ^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:108:38:\n    |\n108 |             rook = ((FILE_A << f) | (RANK_1 << (8 * r))) ^ bit;\n    |                                      ^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:109:57:\n    |\n109 |             uint64 d = f >= r ? DIAG >> (8 * (f - r)) : DIAG << (8 * (r - f));\n    |                                                         ^^^^^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/Bitboard.sol:110:65:\n    |\n110 |             uint64 a = f + r <= 7 ? ANTI >> (8 * (7 - f - r)) : ANTI << (8 * (f + r - 7));\n    |                                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/ChessEngineV5.sol:537:38:\n    |\n537 |             uint64 ahead = c.white ? ~uint64(0) << ((r + 1) * 8) : (uint64(1) << (r * 8)) - 1;\n    |                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (3149): The result type of the shift operation is equal to the type of the first operand (uint64) ignoring the (larger) type of the second operand (uint256) which might be unexpected. Silence this warning by either converting the first or the second operand to the type of the other.\n   --> src/ChessEngineV5.sol:537:69:\n    |\n537 |             uint64 ahead = c.white ? ~uint64(0) << ((r + 1) * 8) : (uint64(1) << (r * 8)) - 1;\n    |                                                                     ^^^^^^^^^^^^^^^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:31:18:\n   |\n31 |         returns (uint16, Rules.Played memory)\n   |                  ^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:31:26:\n   |\n31 |         returns (uint16, Rules.Played memory)\n   |                          ^^^^^^^^^^^^^^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:36:85:\n   |\n36 |     function playAny(uint256, uint32, uint32, bool, uint256) external pure returns (uint16, Rules.Played memory) {\n   |                                                                                     ^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/AuditRegression.t.sol:36:93:\n   |\n36 |     function playAny(uint256, uint32, uint32, bool, uint256) external pure returns (uint16, Rules.Played memory) {\n   |                                                                                             ^^^^^^^^^^^^^^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/Hostile.t.sol:62:18:\n   |\n62 |         returns (uint16, Rules.Played memory)\n   |                  ^^^^^^\n\nWarning (6321): Unnamed return variable can remain unassigned. Add an explicit return with value to all non-reverting code paths or name the variable.\n  --> test/Hostile.t.sol:62:26:\n   |\n62 |         returns (uint16, Rules.Played memory)\n   |                          ^^^^^^^^^^^^^^^^^^^\n\nWarning (2072): Unused local variable.\n  --> test/Game.t.sol:97:9:\n   |\n97 |         IMDuelHook.Game memory g = st();\n   |         ^^^^^^^^^^^^^^^^^^^^^^^^\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/LaunchFiles.t.sol:73:5:\n   |\n73 |     function test_engineLaunchFileDeploysTheEngineWithoutArguments() public {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":4011,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/Size.t.sol:SizeTest\n[PASS] test_deployedCodeFitsTheBudgets() (gas: 71241)\nLogs:\n  hook: 16900\n  engine v5: 23339\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 738.67µs (614.71µs CPU time)\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] test_allowances() (gas: 347653)\n[PASS] test_fixedSupplyToTheDeployer() (gas: 39384)\n[PASS] test_nothingPrivileged() (gas: 192691)\n[PASS] test_transfers() (gas: 188240)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.03ms (480.21µs CPU time)\n\nRan 7 tests for test/Draws.t.sol:DrawsTest\n[PASS] test_checkmate() (gas: 334401)\n[PASS] test_moveCap() (gas: 331503)\n[PASS] test_ordinaryMoveDoesNotEndTheGame() (gas: 272039)\n[PASS] test_quietMoveLimit() (gas: 337709)\n[PASS] test_stalemate() (gas: 329276)\n[PASS] test_thirdRepetition() (gas: 1128186)\n[PASS] test_tooFewPiecesToMate() (gas: 321032)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 9.23ms (4.59ms CPU time)\n\nRan 5 tests for test/Teams.t.sol:TeamsTest\n[PASS] test_aDynamicFeePoolPlaysWithAZeroLpFee() (gas: 1904114)\n[PASS] test_nativeEthIsATeamLikeAnyToken() (gas: 1224021)\n[PASS] test_poolsOnOneHookKeepSeparateGamesAndChests() (gas: 2479138)\n[PASS] test_sliceSide() (gas: 720994)\n[PASS] test_twoPlainTokensCannotDuel() (gas: 437611)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 11.05ms (12.43ms CPU time)\n\nRan 3 tests for test/LaunchFiles.t.sol:LaunchFilesTest\n[PASS] test_engineLaunchFileDeploysTheEngineWithoutArguments() (gas: 7834)\n[PASS] test_ethereumLaunchFile() (gas: 158792)\n[PASS] test_sepoliaLaunchFile() (gas: 150795)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 11.62ms (4.33ms CPU time)\n\nRan 7 tests for test/Windows.t.sol:WindowsTest\n[PASS] test_aHash257BlocksBackComesFromHistory() (gas: 1379597)\n[PASS] test_anExpiredMovesWindowIsTheFindingBlock() (gas: 809971)\n[PASS] test_dustAfterTheWindowCanBeAnswered() (gas: 1859162)\n[PASS] test_dustInTheClosingBlockCanBeAnswered() (gas: 1874191)\n[PASS] test_noPreviewBeforeTheClosingBlock() (gas: 749879)\n[PASS] test_onlyALateFirstBidMovesTheWindow() (gas: 768169)\n[PASS] test_theResolvingTradesBidNamesItsHalfMove() (gas: 1223658)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 12.64ms (11.49ms CPU time)\n\nRan 8 tests for test/Slice.t.sol:SliceTest\n[PASS] test_aDuelAgainstImdSendsItsSliceToTheMainDuelsImdPot() (gas: 981778)\n[PASS] test_aDuelAgainstImduelBurnsItsSlice() (gas: 960558)\n[PASS] test_aSliceMovesNoPrice() (gas: 1532512)\n[PASS] test_anyoneSendsTheBurn() (gas: 648930)\n[PASS] test_buyingImduelBurnsASliceOfIt() (gas: 411997)\n[PASS] test_dustPaysNoSlice() (gas: 514419)\n[PASS] test_theMainDuelsSliceIsBurned() (gas: 577029)\n[PASS] test_theWholeSliceIsBurnedToTheWei() (gas: 536637)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 13.26ms (6.37ms CPU time)\n\nRan 11 tests for test/Stats.t.sol:StatsTest\n[PASS] test_aDustBidsMoveCounts() (gas: 1177326)\n[PASS] test_aMateCountsEvenWhenItPaysNothing() (gas: 691623)\n[PASS] test_aMoveAtAnyStrengthCounts() (gas: 278453)\n[PASS] test_aPaidSideDuelMateCountsNothing() (gas: 861550)\n[PASS] test_aSideDuelCountsNothing() (gas: 583461)\n[PASS] test_amountsWonAreCountedPerToken() (gas: 935020)\n[PASS] test_checksAndCapturesByType() (gas: 1018958)\n[PASS] test_countersSaturate() (gas: 33090)\n[PASS] test_enPassantAndPromotion() (gas: 682261)\n[PASS] test_gamesMatesAndThePlayerList() (gas: 1493429)\n[PASS] test_movesByPieceCastlingAndFullStrength() (gas: 1407030)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 30.66ms (30.12ms CPU time)\n\nRan 12 tests for test/Hostile.t.sol:HostileTest\n[PASS] test_aCallbackTokenOwnerLeavingADebtCannotFreezeTheDuel() (gas: 4090732)\n[PASS] test_aDeadEngineEndsTheGameAsADrawAndTradingGoesOn() (gas: 2312934)\n[PASS] test_aGasBurningEngineCostsOneExpensiveTradeNotTheGame() (gas: 7405962)\n[PASS] test_aTokenReturningNothingFundsAChest() (gas: 1032369)\n[PASS] test_anEthOwnerCreditingTheHookCannotFreezeTheDuel() (gas: 3176697)\n[PASS] test_anEthOwnerLeavingADebtCannotFreezeTheDuel() (gas: 3021701)\n[PASS] test_anOwnerThatCannotReceiveWithdrawsElsewhere() (gas: 2560365)\n[PASS] test_blockedRecipientStaysOwedAndTradingContinues() (gas: 3067657)\n[PASS] test_brokenEngineFallsBackToALegalMove() (gas: 4095973)\n[PASS] test_feeOnTransferTokenFundsOnlyWhatArrives() (gas: 1578261)\n[PASS] test_reenteringTokenCannotBreakAClaim() (gas: 3695941)\n[PASS] test_starvingTheEngineNeverPlaysTheFallback() (gas: 17054982)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 38.00ms (67.78ms CPU time)\n\nRan 2 tests for test/FactoryLaunch.t.sol:FactoryLaunchTest\n[PASS] test_factoryLaunchWithTokenAboveImd() (gas: 11440064)\n[PASS] test_factoryLaunchWithTokenBelowImd() (gas: 11419485)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 47.88ms (29.95ms CPU time)\n\nRan 2 tests for test/LaunchAdmission.t.sol:LaunchAdmissionTest\n[PASS] test_blankChainTokenAboveImd() (gas: 20224129)\n[PASS] test_blankChainTokenBelowImd() (gas: 20213889)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 47.71ms (68.70ms CPU time)\n\nRan 3 tests for test/Launch.t.sol:LaunchTest\n[PASS] test_launchPairedWithEth() (gas: 20464305)\n[PASS] test_launchTokenAboveImd() (gas: 22051377)\nLogs:\n  first buy (opens game 0, bids for White): 390904\n\n[PASS] test_launchTokenBelowImd() (gas: 21786067)\nLogs:\n  first buy (opens game 0, bids for White): 357618\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 54.05ms (149.62ms CPU time)\n\nRan 8 tests for test/FeeSchedule.t.sol:FeeScheduleTest\n[PASS] testFuzz_exactOutputDeliversTheOrderAndTakesItsFeeOnTop(uint256) (runs: 256, μ: 542315, ~: 542477)\nLogs:\n  Bound result 499999999999000000537\n\n[PASS] test_exactOutputStoppedByItsPriceLimitIsRefused() (gas: 259775)\n[PASS] test_fundChestBeyondBalanceIsRefused() (gas: 121187)\n[PASS] test_fundChestOfZeroAddsNothing() (gas: 97993)\n[PASS] test_fundChestWithTheWrongEthValueIsRefused() (gas: 344437)\n[PASS] test_fundChestWithoutAllowanceIsRefused() (gas: 110843)\n[PASS] test_owedRewardOnlyEverReachesItsOwner() (gas: 1268983)\n[PASS] test_withdrawWithNothingOwedDoesNothing() (gas: 90005)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 81.31ms (82.48ms CPU time)\n\nRan 5 tests for test/HookGas.t.sol:HookGasTest\n[PASS] test_aSideDuelsSliceStaysAPlainTrade() (gas: 2225484)\nLogs:\n  side duel trade with its slice: 198280\n\n[PASS] test_hookShareOfAMovingTrade() (gas: 27867148)\nLogs:\n  hook share of a moving trade: average: 280427\n  hook share of a moving trade: max: 291566\n\n[PASS] test_middlegameGas() (gas: 8526507)\nLogs:\n  first bid in a new pool: 260797\n  bidding trade: 203812\n  outbidding trade: 203617\n  plain trade: 194129\n  next block: play the turn and bid: 585327\n\n[PASS] test_openingGas() (gas: 3870102)\nLogs:\n  first bid in a new pool: 260797\n  bidding trade: 204410\n  outbidding trade: 203617\n  plain trade: 194129\n  next block: play the turn and bid: 624966\n\n[PASS] test_runningGameGas() (gas: 47700896)\nLogs:\n  running game, moving trades measured: 42\n  running game, moving trade average: 451639\n  running game, moving trade max: 557656\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 97.93ms (131.71ms CPU time)\n\nRan 5 tests for test/AuditRegression.t.sol:AuditRegressionTest\n[PASS] test_abiHookDataKeepsWalletBidStatsAndMatePayout() (gas: 1654557)\n[PASS] test_closedWindowPreservesNotEnoughGasAndCanBeRetried() (gas: 1803274)\n[PASS] test_emptyHookDataReproducesAcceptedRelayerAttribution() (gas: 1651793)\n[PASS] test_packedHookDataKeepsWalletBidStatsAndMatePayout() (gas: 1654352)\n[PASS] test_starvedFallbackPreservesNotEnoughGas() (gas: 9732906)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 163.37ms (29.54ms CPU time)\n\nRan 8 tests for test/Strength.t.sol:StrengthTest\n[PASS] testFuzz_boundedAndMonotonic(uint256,uint256,uint256) (runs: 256, μ: 9069, ~: 9046)\nLogs:\n  Bound result 115792089237316195423570985008687907853269984665640564039457584006914073308415\n\n[PASS] testFuzz_depthMonotonic(uint256,uint256,uint256) (runs: 256, μ: 11949, ~: 11898)\nLogs:\n  Bound result 943668479\n  Bound result 64000000000000000\n\n[PASS] testFuzz_shiftKeepsTheShare(uint256,uint256,uint8) (runs: 256, μ: 14506, ~: 14033)\nLogs:\n  Bound result 30\n  Bound result 1000000000000\n  Bound result 943668479\n\n[PASS] testFuzz_tenfoldIsAboutThirtyPoints(uint128,uint128) (runs: 256, μ: 13853, ~: 13708)\nLogs:\n  Bound result 340282366920938463463374607431767211498\n  Bound result 33687954325172908121109934628444571451\n\n[PASS] testFuzz_unscalablePaidFollowsTheCurve(uint256,uint256) (runs: 256, μ: 14007, ~: 14210)\nLogs:\n  Bound result 115676297148078879228147414023679219945416714680974923476978348610226064830178\n  Bound result 115676297148078879228147414023691475161338229062180099083019117769300591507360\n\n[PASS] test_decidedPoints() (gas: 13720)\n[PASS] test_hugePaymentsDoNotRevert() (gas: 12835)\n[PASS] test_zeroInputs() (gas: 5289)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 163.17ms (133.14ms CPU time)\n\nRan 5 tests for test/PotStrength.t.sol:PotStrengthTest\n[PASS] test_aDonationWeakensTheTeamsBidsAndRaisesThePrizeForMatingIt() (gas: 3394559)\n[PASS] test_anEmptyPotPlaysAtTheCapUntilItIsAPot() (gas: 4178752)\n[PASS] test_exactOutputStrengthIncludesThePotShare() (gas: 616267)\n[PASS] test_liquidityChangesNothing() (gas: 1669734)\n[PASS] test_strengthIsReadAfterTheMateTheTradePlayed() (gas: 1580288)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 163.47ms (18.39ms CPU time)\n\nRan 14 tests for test/Bidding.t.sol:BiddingTest\n[PASS] test_aBuyOfTheOtherTeamBidsForItsNextMove() (gas: 2302673)\n[PASS] test_aBuyOfTheOtherTeamTimesTheSilentSideOutAndBids() (gas: 1220837)\n[PASS] test_aClosedWindowTakesNoBidsForItsMove() (gas: 1238283)\n[PASS] test_aLateFirstBidOpensAFullWindow() (gas: 1790503)\n[PASS] test_aMateIsPaidFromTheLosersChestInItsToken() (gas: 1589493)\n[PASS] test_aMoveIsOpenForTurnBlocksBlocks() (gas: 1216340)\n[PASS] test_aNewTopMustPayMoreThanTenPercentMore() (gas: 988826)\n[PASS] test_aNextMoveBidCarriesIntoTheNextGame() (gas: 1751624)\n[PASS] test_bidsCountAcrossTheWholeWindow() (gas: 1703229)\n[PASS] test_exactlyTenPercentMoreIsNotEnough() (gas: 989254)\n[PASS] test_theMoveDependsOnlyOnTheWindowsLastBlock() (gas: 1949748)\n[PASS] test_theMoversOwnBuyAfterItsWindowBidsForItsNextMove() (gas: 1251927)\n[PASS] test_theOwnerIsTheHookDataAddressElseTheSigner() (gas: 1846249)\n[PASS] test_thePreviewIsTheMoveThatIsPlayed() (gas: 1485460)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 163.56ms (39.00ms CPU time)\n\nRan 1 test for test/Predict.t.sol:PredictTest\n[PASS] test_aBotCannotPickItsOwnCapturingMoves() (gas: 252152063)\nLogs:\n  bot moves: 0\n  other moves: 53\n  captures among other moves: 13\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 585.55ms (585.34ms CPU time)\n\nRan 21 tests for test/MatePot.t.sol:MatePotTest\n[PASS] testFuzz_heldEqualsOwedWithImdAsCurrency1(uint256) (runs: 32, μ: 13076467, ~: 13021554)\n[PASS] test_aDonationDoesNotRaiseTheCap() (gas: 1883900)\n[PASS] test_aDrawPaysNothing() (gas: 1861364)\n[PASS] test_aDustGamePaysNothing() (gas: 2010121)\n[PASS] test_aDustMateEarnsTwiceItsDust() (gas: 2017977)\n[PASS] test_aFeeFreeSwapAfterAFeeInOneUnlockAddsNoInflow() (gas: 2559726)\n[PASS] test_aGameTradedAloneReturnsAtMostItsPotFees() (gas: 2022701)\n[PASS] test_aMateAgainstATeamNobodyBoughtStillPays() (gas: 3694476)\n[PASS] test_aMateAgainstAnEmptyPotPaysNothing() (gas: 1813816)\n[PASS] test_aShortGamePaysTheLosersFeesNotTheResolvingTrades() (gas: 2981382)\n[PASS] test_aThinSideDuelPaysBackAtMostTheAttackersOwnFee() (gas: 2670612)\n[PASS] test_aTimeoutMatePaysNobody() (gas: 2616259)\n[PASS] test_anExpiredHashPlaysThePaidBidForNobody() (gas: 2925806)\n[PASS] test_everySwapShapeRecordsItsPotFee() (gas: 2832299)\n[PASS] test_theLoserPaysWhenImduelIsCurrency0() (gas: 2600254)\n[PASS] test_theLoserPaysWhenImduelIsCurrency1() (gas: 2600793)\n[PASS] test_theManagerOrTheHookOwnsNoBid() (gas: 2354405)\n[PASS] test_thePrizeIsAtMostTheLosersOwnInflow() (gas: 2546191)\n[PASS] test_twoSwapsInOneUnlockKeepTheirInflowApart() (gas: 4588692)\n[PASS] test_twoSwapsInOneUnlockKeepTheirInflowApartReversed() (gas: 4589218)\n[PASS] test_withdrawToRefusesAddressZeroTheHookAndTheManager() (gas: 1407537)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 639.69ms (697.25ms CPU time)\n\nRan 2 tests for test/GasEstimate.t.sol:GasEstimateTest\n[PASS] test_atTheEstimateThePayoutIsRecorded() (gas: 6326804)\nLogs:\n  smallest gas limit that plays and records the mate's payout: 3701048\n\n[PASS] test_noGasLimitPlaysTheMoveWithoutItsPayout() (gas: 974659330)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 768.98ms (783.12ms CPU time)\n\nRan 25 tests for test/Game.t.sol:GameTest\n[PASS] testFuzz_swapsNeverRevert(uint256) (runs: 48, μ: 10516656, ~: 10614120)\n[PASS] test_aGamePlaysOutThroughSwaps() (gas: 77324728)\nLogs:\n  moves played: 108\n  bids (incl. outbid ones): 138\n  most gas for a swap: 737149\n\n[PASS] test_aSmallerTradeInTheBlockDoesNotTakeTheTurn() (gas: 692202)\n[PASS] test_aTimeoutTurnCanBeTakenInItsBlock() (gas: 1484871)\n[PASS] test_aTradeBidsForTheTurn() (gas: 505631)\n[PASS] test_aTurnClosesWithItsBlock() (gas: 1146176)\n[PASS] test_anExpiredTurnPlaysItsBidForNobody() (gas: 1583139)\n[PASS] test_anOldTurnIsPlayedWithTheHistoryContractsHash() (gas: 2094806)\n[PASS] test_anyTradeSizeBids() (gas: 2685983)\n[PASS] test_lateTradeStillBidsNormally() (gas: 452508)\n[PASS] test_onlyThePoolManagerAndTheHookCanCallIn() (gas: 122174)\n[PASS] test_ownerDefaultsToTxOrigin() (gas: 438886)\n[PASS] test_playedPositionsEnterTheRepetitionMemory() (gas: 1104251)\n[PASS] test_previewMoveIsReadyInTheClosingBlock() (gas: 721740)\n[PASS] test_previewMoveReadsTheServedHashItself() (gas: 1677587)\n[PASS] test_rejectsBadConfig() (gas: 8818)\n[PASS] test_silentSidePlaysAtZeroStrength() (gas: 1055478)\n[PASS] test_strengthFollowsTheShareOfTheTeamsPot() (gas: 8610230)\n[PASS] test_teamsSwapColoursEveryGame() (gas: 1026940)\n[PASS] test_theBiggestTradeInTheBlockOwnsTheTurn() (gas: 788475)\n[PASS] test_theFirstPoolOpenedIsTheMainDuel() (gas: 179045)\n[PASS] test_theMainDuelMustPairImd() (gas: 312270)\n[PASS] test_theNextBlocksTradePlaysTheTurn() (gas: 1221781)\n[PASS] test_theOtherTeamCannotBidOnThisTurn() (gas: 435166)\n[PASS] test_whoPlaysTheTurnAndWhenDoesNotChangeTheMove() (gas: 1874217)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 910.55ms (1.10s CPU time)\n\nRan 20 tests for test/Money.t.sol:MoneyTest\n[PASS] testFuzz_heldEqualsOwed(uint256) (runs: 48, μ: 11961464, ~: 12019249)\n[PASS] test_aBuyFeedsBothPotsAndBurnsTheSlice() (gas: 421634)\n[PASS] test_aFullChestTakesNoMore() (gas: 1100726)\n[PASS] test_aMateForNobodyPaysNobody() (gas: 515104)\n[PASS] test_aTradeStoppedByItsPriceLimitIsRefused() (gas: 557098)\n[PASS] test_capturesAndChecksPayNothing() (gas: 507482)\n[PASS] test_everyTradeEmitsHookSwapWithTheHookFee() (gas: 556213)\n[PASS] test_everyTradeFeedsBothPots() (gas: 2154397)\n[PASS] test_exactOutputSlicesTheInput() (gas: 541596)\n[PASS] test_exactOutputWithTheFeeInTheOutput() (gas: 393823)\n[PASS] test_feesCannotBeWithdrawnByAnyone() (gas: 536437)\n[PASS] test_fundChestNeedsTheRightValue() (gas: 48679)\n[PASS] test_fundChestOnlyForHookPools() (gas: 41774)\n[PASS] test_fundChestWithEth() (gas: 252841)\n[PASS] test_fundChestWithTokens() (gas: 255519)\n[PASS] test_mateTakesAQuarterOfTheLosersPot() (gas: 895609)\n[PASS] test_quietMovesPayNothing() (gas: 458996)\n[PASS] test_rewardsAreClaimedNeverPushed() (gas: 1359511)\n[PASS] test_theMateIsCappedAtTwiceWhatItsTradePaid() (gas: 773155)\n[PASS] test_theMateIsCountedForItsOwner() (gas: 636338)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 1.00s (1.01s CPU time)\n\nRan 1 test for test/Invariant.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_boardHasBothKingsAndPlyIsBounded\n[PASS] invariant_heldEqualsOwed\n InvariantTest invariants (runs: 24, calls: 2400, reverts: 0)\n\n╭----------+----------------+-------+---------+----------╮\n| Contract | Selector       | Calls | Reverts | Discards |\n+========================================================+\n| Handler  | burn           | 274   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | fund           | 281   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | idle           | 247   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | longPause      | 250   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | nextBlock      | 263   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | trade          | 283   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | tradeAgain     | 255   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | tradeNextBlock | 305   | 0       | 0        |\n|----------+----------------+-------+---------+----------|\n| Handler  | withdrawReward | 242   | 0       | 0        |\n╰----------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1238\n  Bound result 19999999000000000131\n  Bound result 19999999000000001709\n  Bound result 19999999000001500001\n  Bound result 2900000000000000000\n  Bound result 58\n  Bound result 40\n  Bound result 18198805245380381879\n  Bound result 19999999000000001000\n  Bound result 14944\n  Bound result 99\n  Bound result 2499949999997500\n  Bound result 19999999000000010610\n  Bound result 19999999000000018889\n  Bound result 19999999000000013656\n  Bound result 24\n  Bound result 19999999000000000970\n  Bound result 6641997679134031052\n  Bound result 9911\n  Bound result 3000000000000000000\n  Bound result 19999999000000009434\n  Bound result 40\n  Bound result 3600\n  Bound result 73\n  Bound result 30000000000000000\n  Bound result 1381282641142296733\n  Bound result 42754813917896217807\n  Bound result 100\n  Bound result 19999999000000000053\n  Bound result 50\n  Bound result 32\n  Bound result 108000\n  Bound result 24861\n  Bound result 19999999000000106693\n  Bound result 63\n  Bound result 19296707693607447019\n  Bound result 63\n  Bound result 19999999999999999998\n  Bound result 71776119061217280\n  Bound result 2355172927998303886\n  Bound result 6644185449734949650\n  Bound result 113\n  Bound result 11565342078087335612\n  Bound result 998\n  Bound result 12560002122043146505\n  Bound result 22\n  Bound result 12731486101901322513\n  Bound result 19999999000000000473\n  Bound result 19999999000000001250\n  Bound result 3317\n  Bound result 16524750123642650624\n  Bound result 1833\n  Bound result 5313166770951398828\n  Bound result 67\n  Bound result 1\n  Bound result 1769\n  Bound result 40\n  Bound result 23036\n  Bound result 17471123994747445864\n  Bound result 41626477544305852416\n  Bound result 19999999000000019692\n  Bound result 70\n  swaps: 29\n  moves: 13\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.39s (1.38s CPU time)\n\nRan 3 tests for test/TokenInvariant.t.sol:TokenInvariantTest\n[PASS]\nTokenInvariantTest invariants:\n[PASS] invariant_allowancesAreExactlyWhatWasApprovedLessWhatWasSpent\n[PASS] invariant_supplyIsFixedAndHeldByTheActors\n TokenInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+--------------------+-------+---------+----------╮\n| Contract     | Selector           | Calls | Reverts | Discards |\n+================================================================+\n| TokenHandler | approve            | 2071  | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| TokenHandler | approveZeroSpender | 1993  | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| TokenHandler | transfer           | 2072  | 0       | 0        |\n|--------------+--------------------+-------+---------+----------|\n| TokenHandler | transferFrom       | 2056  | 0       | 0        |\n╰--------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 2\n  Bound result 10\n  Bound result 6\n  Bound result 128\n  Bound result 98000000000000000000\n  Bound result 7\n  Bound result 8\n  Bound result 150\n  Bound result 0\n  Bound result 0\n  Bound result 6\n  Bound result 5\n  Bound result 962975107793718920005656293\n  Bound result 141\n  Bound result 10000000000000001000\n  Bound result 6\n  Bound result 117\n  Bound result 7171\n  Bound result 86\n  Bound result 30000000000000000\n  Bound result 5688638793625097300\n  Bound result 6627458794374122\n  Bound result 1911\n  Bound result 3\n  Bound result 35\n  Bound result 30\n  Bound result 7158\n  Bound result 24442493013196478\n  Bound result 6233\n  Bound result 11\n\n[PASS] testFuzz_transferOfMoreThanTheBalanceIsRefused(uint256) (runs: 512, μ: 55910, ~: 55857)\nLogs:\n  Bound result 536\n\n[PASS] test_transferFromTheZeroAddressIsRefused() (gas: 82118)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.90s (2.93s CPU time)\n\nRan 1 test for test/InvariantDuels.t.sol:InvariantDuelsTest\n[PASS]\nInvariantDuelsTest invariants:\n[PASS] invariant_everyBoardIsSound\n[PASS] invariant_everyCurrencyBalances\n[PASS] invariant_rightsMatchTheBoard\n[PASS] invariant_turnsAreWellFormed\n InvariantDuelsTest invariants (runs: 24, calls: 2880, reverts: 0)\n\n╭--------------+-------------------+-------+---------+----------╮\n| Contract     | Selector          | Calls | Reverts | Discards |\n+===============================================================+\n| DuelsHandler | addLiquidity      | 233   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | burn              | 191   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | fund              | 215   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | longPause         | 222   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | nextBlock         | 198   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | pushThenNextBlock | 201   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | queueMate         | 195   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | removeLiquidity   | 240   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | roundTrip         | 189   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | setMates          | 224   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | trade             | 191   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | tradeAgain        | 188   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | tradeNextBlock    | 190   | 0       | 0        |\n|--------------+-------------------+-------+---------+----------|\n| DuelsHandler | withdrawReward    | 203   | 0       | 0        |\n╰--------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 9571383389564039707\n  Bound result 2832708629194959756\n  Bound result 3346456166257235449597\n  Bound result 3346455166257235450498\n  Bound result 1374389534720\n  Bound result 999999999999099\n  Bound result 4999999999000000129\n  Bound result 19999999999000018938\n  Bound result 4999999999000000065\n  Bound result 12\n  Bound result 19999999999000004868\n  Bound result 180000000000000000901\n  Bound result 12\n  Bound result 28792003956564819968\n  Bound result 19999999999000004596\n  Bound result 4749543059978807639089\n  Bound result 40235288751030004047\n  Bound result 4999999999000000041\n  Bound result 20000000000000000000\n  Bound result 12\n  Bound result 19999999999000021777\n  Bound result 4749542059978807648262\n  Bound result 180000000000000009465\n  Bound result 12\n  Bound result 34817478633412362240\n  Bound result 9999999000000000640001\n  Bound result 3787848795156543927\n  Bound result 40234288751030004061\n  Bound result 21\n  Bound result 12\n  Bound result 23801927633\n  Bound result 2155872511\n  Bound result 9999999000000000638492\n  Bound result 4263924515136285476\n  Bound result 7\n  Bound result 120195651445596224263\n  Bound result 12\n  Bound result 180000000000000000251\n  Bound result 12\n  Bound result 358612834\n  Bound result 3449504731626547562\n  Bound result 12662923559173284841\n  Bound result 89840749632055725\n  Bound result 4999999999000014590\n  Bound result 12500\n  Bound result 19999999999000000129\n  Bound result 9999999000000000006159\n  Bound result 999999999999999000000\n  Bound result 180000000000000005001\n  Bound result 12\n  Bound result 1904806139\n  Bound result 12\n  Bound result 19999999999000008368\n  Bound result 50000000000000000000\n  Bound result 19999999999000006664\n  Bound result 9999999000000000005644\n  Bound result 9999999000000000001634\n  Bound result 9999999000000000000113\n  Bound result 62\n  Bound result 180000000000000019388\n  Bound result 12\n  Bound result 19999999999000002901\n  Bound result 4999999999000000161\n  Bound result 12\n  Bound result 499999999500\n  Bound result 12\n  Bound result 19999999999000012262\n  Bound result 19999999999000002297\n  Bound result 2816\n  Bound result 12\n  Bound result 1374396088320\n  Bound result 19999999999000006960\n  Bound result 6124552197892110433\n  Bound result 1099511627775\n  Bound result 12\n  Bound result 19999999999999999997\n  Bound result 414189046519069323269\n  Bound result 10585809953480929684781\n  Bound result 49613950791992428230\n  Bound result 12\n  Bound result 19999999999000004094\n  Bound result 19999999999000014957\n  Bound result 12\n  Bound result 19999999999000000032\n  Bound result 9646790310336179065656\n  Bound result 9999998000000000012672\n  Bound result 9571383389564039707\n  Bound result 114\n  Bound result 10000000000000001\n  swaps: 31\n  moves: 16\n  mates paid: 5\n  Bound result 12\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n  Bound result 1000000000000\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.79s (3.78s CPU time)\n\nRan 26 test suites in 3.79s (13.09s CPU time): 184 tests passed, 0 failed, 0 skipped (184 total tests)\n","passed":true},{"durationMs":97,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"IMDuelHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"IMDuelHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"IMDuelHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"IMDuelHook.fundChest((address,address,uint24,int24,address),bool,uint256)\",\"IMDuelHook.unlockCallback(bytes)\",\"IMDuelHook.withdraw(address,address)\",\"IMDuelHook.withdrawTo(address,address)\",\"IMDuelToken.approve(address,uint256)\",\"IMDuelToken.transfer(address,uint256)\",\"IMDuelToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":114,\"LICENSE\":16,\"README.md\":106,\"foundry.toml\":29,\"launch.json\":34,\"launch/engine.json\":10,\"launch/hook.json\":34,\"launch/hook.sepolia.json\":34,\"script/LaunchPolicy.sol\":43,\"src/Bitboard.sol\":719,\"src/Chess.sol\":35,\"src/ChessEngineV5.sol\":852,\"src/IChessEngine.sol\":29,\"src/IMDuelHook.sol\":858,\"src/IMDuelToken.sol\":62,\"src/Rules.sol\":45,\"src/Strength.sol\":46,\"test/AuditRegression.t.sol\":192,\"test/Base.sol\":223,\"test/Bidding.t.sol\":256,\"test/Chessboard.sol\":79,\"test/Draws.t.sol\":90,\"test/FactoryLaunch.t.sol\":218,\"test/FeeSchedule.t.sol\":165,\"test/Game.t.sol\":381,\"test/GasEstimate.t.sol\":96,\"test/Harness.sol\":83,\"test/HookGas.t.sol\":172,\"test/Hostile.t.sol\":415,\"test/Invariant.t.sol\":158,\"test/InvariantDuels.t.sol\":463,\"test/Launch.t.sol\":139,\"test/LaunchAdmission.t.sol\":156,\"test/LaunchFiles.t.sol\":78,\"test/MatePot.t.sol\":461,\"test/Money.t.sol\":360,\"test/PotStrength.t.sol\":114,\"test/Predict.t.sol\":102,\"test/Size.t.sol\":27,\"test/Slice.t.sol\":140,\"test/Stats.t.sol\":248,\"test/Strength.t.sol\":88,\"test/Teams.t.sol\":90,\"test/Token.t.sol\":82,\"test/TokenInvariant.t.sol\":155,\"test/Tokens.sol\":150,\"test/V4Fixture.sol\":100,\"test/Windows.t.sol\":135,\"test/data/chess.json\":1,\"test/data/conversion-validation.json\":770,\"test/data/conversion.json\":98,\"test/data/endings.json\":1,\"test/data/legal.json\":1,\"test/data/random.json\":1},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":18839,"exitCode":0,"name":"slither","output":"[high/medium] incorrect-exp at src/IMDuelHook.sol:242: IMDuelHook.teamOf(uint8,uint32,bool) (src/IMDuelHook.sol#242-244) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[high/medium] incorrect-exp at src/IMDuelHook.sol:242: IMDuelHook.teamOf(uint8,uint32,bool) (src/IMDuelHook.sol#242-244) has bitwise-xor operator ^ instead of the exponentiation operator **: \n[medium/medium] reentrancy-no-eth at src/IMDuelHook.sol:283: Reentrancy in IMDuelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/IMDuelHook.sol#283-308):\n[medium/medium] uninitialized-local at src/Bitboard.sol:643: Bitboard._targets(Bitboard.Pos,Bitboard.Gen,uint8,bool).ep (src/Bitboard.sol#643) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Bitboard.sol:480: Bitboard._anyLegal(Bitboard.Pos,bool).scratch (src/Bitboard.sol#480) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Bitboard.sol:425: Bitboard.isLegal(Bitboard.Pos,uint16,bool).scratch (src/Bitboard.sol#425) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ChessEngineV5.sol:497: ChessEngineV5._queening(ChessEngineV5.Ctx,Bitboard.Pos,uint64,uint64,uint64,uint64,uint64).a (src/ChessEngineV5.sol#497) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ChessEngineV5.sol:182: ChessEngineV5._choose(ChessEngineV5.Ctx,uint256,uint256,uint64[8],uint32,uint16).seen (src/ChessEngineV5.sol#182) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Bitboard.sol:400: Bitboard._legalTargets(Bitboard.Pos,Bitboard.Gen,Bitboard.Pos,uint8,bool).ep (src/Bitboard.sol#400) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Bitboard.sol:236: Bitboard.pieceAttacks(Bitboard.Pos,uint64,uint64,bool).a (src/Bitboard.sol#236) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ChessEngineV5.sol:203: ChessEngineV5._choose(ChessEngineV5.Ctx,uint256,uint256,uint64[8],uint32,uint16).refined (src/ChessEngineV5.sol#203) is a local variable never initialized\n[medium/medium] uninitialized-local at src/Bitboard.sol:580: Bitboard.mateInOne(Bitboard.Pos,bool,uint256).scratch (src/Bitboard.sol#580) is a local variable never initialized\n[medium/medium] uninitialized-local at src/IMDuelHook.sol:770: IMDuelHook._repeated(PoolId,IMDuelHook.Game).seen (src/IMDuelHook.sol#770) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ChessEngineV5.sol:414: ChessEngineV5._placement(ChessEngineV5.Ctx,uint8,uint8,uint8,uint8,bool,bool).near (src/ChessEngineV5.sol#414) is a local variable never initialized\n[medium/medium] uninitialized-local at src/IMDuelHook.sol:641: IMDuelHook._apply(PoolId,IMDuelHook.Game,uint16,Rules.Played,IMDuelHook.Trade,uint256).reason (src/IMDuelHook.sol#641) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ChessEngineV5.sol:276: ChessEngineV5._context(uint256,uint32,uint32,bool,bool).nonPawn (src/ChessEngineV5.sol#276) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ChessEngineV5.sol:377: ChessEngineV5._cheap(ChessEngineV5.Ctx,uint16).squeeze (src/ChessEngineV5.sol#377) is a local variable never initialized\n[medium/medium] uninitialized-local at src/IMDuelHook.sol:637: IMDuelHook._apply(PoolId,IMDuelHook.Game,uint16,Rules.Played,IMDuelHook.Trade,uint256).result (src/IMDuelHook.sol#637) is a local variable never initialized\n[medium/medium] unused-return at src/IMDuelHook.sol:384: IMDuelHook._withdraw(address,Currency,address) (src/IMDuelHook.sol#384-390) ignores return value by manager.unlock(abi.encode(uint8(0),abi.encode(to,c,amount - 1))) (src/IMDuelHook.sol#388)\n[low/high] shadowing-local at src/ChessEngineV5.sol:817: ChessEngineV5._mop(ChessEngineV5.Ctx,uint8,uint8,uint8,bool,bool).at (src/ChessEngineV5.sol#705) shadows:\n[low/medium] missing-zero-check at src/IMDuelHook.sol:408: IMDuelHook.unlockCallback(bytes).who (src/IMDuelHook.sol#408) lacks a zero-check on :\n[low/medium] reentrancy-benign at src/IMDuelHook.sol:395: Reentrancy in IMDuelHook.fundChest(PoolKey,bool,uint256) (src/IMDuelHook.sol#395-403):\n[low/medium] reentrancy-benign at src/IMDuelHook.sol:283: Reentrancy in IMDuelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/IMDuelHook.sol#283-308):\n[low/medium] reentrancy-events at src/IMDuelHook.sol:384: Reentrancy in IMDuelHook._withdraw(address,Currency,address) (src/IMDuelHook.sol#384-390):\n[low/medium] reentrancy-events at src/IMDuelHook.sol:395: Reentrancy in IMDuelHook.fundChest(PoolKey,bool,uint256) (src/IMDuelHook.sol#395-403):\n[low/medium] reentrancy-events at src/IMDuelHook.sol:283: Reentrancy in IMDuelHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/IMDuelHook.sol#283-308):\n[low/medium] return-bomb at src/IMDuelHook.sol:597: IMDuelHook._engine(uint256,bytes) (src/IMDuelHook.sol#597-604) tries to limit the gas of an external call that controls implicit decoding\n[low/medium] timestamp at src/IMDuelHook.sol:434: IMDuelHook._play(PoolId,PoolKey,IMDuelHook.Game,bool,BalanceDelta,bytes) (src/IMDuelHook.sol#434-467) uses timestamp for comparisons","passed":true},{"durationMs":848,"exitCode":0,"name":"aderyn","output":"[high] contract-locks-ether at src/IMDuelHook.sol:52: Contract locks Ether without a withdraw function\n[high] incorrect-caret-operator at src/IMDuelHook.sol:243: Incorrect use of caret operator\n[high] unsafe-casting at src/Bitboard.sol:247: Unsafe Casting of integers\n[low] empty-require-revert at src/ChessEngineV5.sol:157: Empty `require()` / `revert()` Statement\n[low] internal-function-used-once at src/Bitboard.sol:199: Internal Function Used Only Once (9 places)\n[low] large-numeric-literal at src/ChessEngineV5.sol:34: Large Numeric Literal (21 places)\n[low] literal-instead-of-constant at src/Bitboard.sol:35: Literal Instead of Constant (414 places)\n[low] missing-inheritance at src/IMDuelToken.sol:7: Missing Inheritance\n[low] push-zero-opcode at src/Bitboard.sol:2: PUSH0 Opcode (8 places)\n[low] state-change-without-event at src/IMDuelHook.sol:271: State Change Without Event\n[low] unchecked-return at src/IMDuelHook.sol:388: Unchecked Return\n[low] uninitialized-local-variable at src/ChessEngineV5.sol:164: Uninitialized Local Variable (8 places)\n[low] unsafe-erc20-operation at src/IMDuelHook.sol:420: Unsafe ERC20 Operation\n[low] unspecific-solidity-pragma at src/ChessEngineV5.sol:2: Unspecific Solidity Pragma (4 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f1a89b8e51ed339c33dfcf9f69a18d5a29f73d1986afb2bbbff3a22108173d0a","verifiedTreeHash":"aa186586ef4bff0f75fc74c6d0bb1a90a0317809","verifierVersion":"0.1.0+b10502ca"}]}