{"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":"0e2b7540-0d9b-4c54-96ec-66655b02d025","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"79860a19169b04a212110abdfcf4eadd3ae3c7090f075de52053771090175aba","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"59f544e50f7a13ae3d0400ecd92391e151b98e08bbce2df83a10863240de42fb","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"73cb594ac0c125b8df3aa54b17c100cc50a861e3eb2f077dfdfb503a12b22cc4","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"1982179701e2b8bad0204db85b2ac2a590d3a5991947b6ecb8b48e6aadc65068","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"ef564031bb20753efe7feff6aeef682b641e68cd9e12d1758fb0c8c43ea6c055","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"6b5a66525309b25a25b8ba7aa1180b3d0dd45fe2a88cda1d51be5d3575d9dab9","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"1924e1829d9934280885582cdf343b0bec7fcc9a1dacb5120ae8aa5331b9913e","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"aac3e207f4df610e4947f9075ad729a34317e4169efa2308bcb4f7e732973553","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Token name: Crown. Token symbol: CROWN.\n\nCROWN is a daily king-of-the-hill game built into its own Uniswap v4 pool, paired with native ETH on Ethereum mainnet. Every UTC day, the single biggest buy wins that day's pot.\n\nFEE: the hook takes 2% of the ETH side of every buy and every sell, in native ETH, on the settled swap deltas, for exact-input and exact-output swaps alike. All of it goes into the current day's pot. Nothing goes to any team, owner or other address.\n\nDAYS: a day is a UTC calendar day, day = block.timestamp / 86400. The pot of a day collects every fee taken during that day.\n\nKING: during each day, the buyer whose single buy pays the most ETH into the pool (measured after the fee) is that day's king. A later buy must be strictly larger to take the crown; a tie keeps the earlier buyer. The buyer is tx.origin of the buy, so any router or wallet app works. Sells pay the fee into the pot but never make anyone king.\n\nCLAIM: once a day has ended, its king can call claim(day) to receive that day's whole pot in ETH, sent with call. A pot can be claimed once. If the king has not claimed within 7 days after the day ended, anyone can call rollover(day), which moves that unclaimed pot into the current day's pot. A day with no buys has no king; its pot (from sells) rolls over the same way once it has ended. If the ETH transfer in claim fails, the claim reverts and the pot stays claimable.\n\nVIEWS: currentDay(); dayInfo(day) returns (king, biggestBuy, pot, claimed); claimable(day) returns the ETH the king could claim now.\n\nRULES: no owner, no admin, no setters, no minting, no pause, no upgrades, no external oracles or services. The hook holds pot ETH itself and only pays it out through claim. All rules are fixed at deployment.\n\nTESTS: Foundry tests for the fee on all four swap directions (buy and sell, exact-in and exact-out), the strictly-larger and tie rules, a king crowned late in the day, claim and double-claim, rollover after 7 days, a day with only sells, and the pot accounting never paying out more than was collected.","parentJobId":null,"planHash":"3fcc4fcbd2de8b4aafa02680cd919f624270f1ac520070e8f49995a6a1e41c2a","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"0e2b7540-0d9b-4c54-96ec-66655b02d025","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2442-crown-token-symbol-crown"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"53925","feedbackHash":"6fcdb0681e8000145eddb4d55d71dbc036491ad5a68f5bad14cf41d9391872ab","nodeKey":"audit_economics","submissionHash":"79860a19169b04a212110abdfcf4eadd3ae3c7090f075de52053771090175aba","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51141","feedbackHash":"1a406be348c681080dffbeaff255f05c22afca333070111b0b740ab60516e43c","nodeKey":"audit_flow","submissionHash":"59f544e50f7a13ae3d0400ecd92391e151b98e08bbce2df83a10863240de42fb","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51483","feedbackHash":"fc5dbc31b77cdd0aec1fc2d833ee087f07b34dc42d37d9c20526b62fda9cc997","nodeKey":"audit_judge","submissionHash":"73cb594ac0c125b8df3aa54b17c100cc50a861e3eb2f077dfdfb503a12b22cc4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52214","feedbackHash":"275b1a89ffd73e9f145f9f5db79c60653c1811ba54fa88b4745cc8e97d52a9aa","nodeKey":"audit_math","submissionHash":"1982179701e2b8bad0204db85b2ac2a590d3a5991947b6ecb8b48e6aadc65068","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51484","feedbackHash":"da61e0385be96e0d0ceb310d13f50a92f813c52cb72c4cb4431494994372d1ef","nodeKey":"audit_permissions","submissionHash":"ef564031bb20753efe7feff6aeef682b641e68cd9e12d1758fb0c8c43ea6c055","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"54144","feedbackHash":"2d4edb86b7136eff67d5ac2bd6edcb407b033b8045186273fe02bae537f4c104","nodeKey":"build_contract_project","submissionHash":"6b5a66525309b25a25b8ba7aa1180b3d0dd45fe2a88cda1d51be5d3575d9dab9","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52221","feedbackHash":"22889c783508bee0752301223c0488739b97a4db025330e66089768bd134197f","nodeKey":"manifest","submissionHash":"1924e1829d9934280885582cdf343b0bec7fcc9a1dacb5120ae8aa5331b9913e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51431","feedbackHash":"96edd0384ae9a4a47c14c70c786af3fe5d96c1756c3bf8b7d1e8bf37cf9fd3f0","nodeKey":"write_foundry_tests","submissionHash":"aac3e207f4df610e4947f9075ad729a34317e4169efa2308bcb4f7e732973553","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"29d22a872a90f7f1e6dccd7baf31350e42ff498f71911996de8fb458f008a73b","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"9e651016f802e120e53ff89e9e66824a7a79f340f97ac65b32c54e2347c8f5f9","device":"2ca00c67242c649b","findings":[],"hash":"1924e1829d9934280885582cdf343b0bec7fcc9a1dacb5120ae8aa5331b9913e","nodeId":"aac08c83-feb0-45d3-af18-625d4878adfa","outcome":"completed","summary":"Created [launch.json](/home/identitymd/.identitymd/work/0e2b7540-0d9b-4c54-96ec-66655b02d025/aac08c83-feb0-45d3-af18-625d4878adfa/launch.json) with matching contracts, constructor placeholders, permissions, pool settings, and implementation notes.\n\n`forge build` passed. All 59 tests passed with the required fuzz seed. Only the manifest is submitted.","treeHash":"b6d313d687d0778f11529cf86474b69fb8356c71","usage":{"cachedInputTokens":397952,"inputTokens":47623,"model":"gpt-6-astra","outputTokens":4287,"runtime":"codex","turns":4,"wallClockMs":132968}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6b47d1bf92391c22","findings":[],"hash":"1982179701e2b8bad0204db85b2ac2a590d3a5991947b6ecb8b48e6aadc65068","nodeId":"1260f03c-b563-40cd-b322-78f46f73bfc3","outcome":"completed","summary":"I found no math defects in CROWN, so `.imd-findings.json` has an empty findings list. Its coverage record answers all 11 entry points as `holds`, plus one row for the pot-accounting invariant.\n\n**How I checked it:**\n- **Fee math, worked by hand.** Every path charges floor(2% of the gross ETH):\n  - **Exact-input buy:** keeps `floor(req/50)` on a full fill and charges `floor(x/49)` on a partial fill.\n  - **Exact-output sell:** asks the pool for `req + floor(req/49)`, and the hook's fee always adds back to exactly that amount.\n  - **The other two directions** compute the fee after the swap.\n  - The \"fee equals 2% of gross\" check inside `afterSwap` holds for every amount, so no honest swap reverts on it.\n  - At a partial fill the trader can never be charged on ETH that didn't trade.\n- **Fee math, fuzzed against the real pool.** I wrote a throwaway test: 3,000 random swaps across all four directions, from 1 wei to 90,000 ETH. It included swaps cut short by a price limit and a fresh pool seeded with tokens only, where the fee is held as a credit and paid out later. Every swap passed: the fee was exactly floor(2% of gross), the trader paid or received exactly the pool amount plus or minus the fee, and the hook's ETH plus pending credit plus amounts paid always equalled the fees collected. I deleted the test afterwards, so no files changed.\n- **Boundaries.**\n  - The claim window (1 to 7 days after the day) and the rollover window (more than 7) meet with no gap or overlap.\n  - A day with no king can roll over as soon as it ends.\n  - The crown needs a strictly larger buy, measured after the fee, so a tie keeps the earlier buyer.\n  - Swap amounts are limited to the int128 range before any negation.\n  - The fee can never push the swap amount past zero.\n- **Static-analysis leads.** The strict-equality checks on `pendingFees` and the ignored return value of `unlock()` are harmless. The timestamp warnings are the intended day calculation.\n\n**Things I looked at but didn't report:**\n- **Dust.** A buy of 49 wei or less pays no fee but can still be crowned king, which on a sell-only day lets it win that day's pot for gas alone. The existing tests show this is deliberate and the brief allows it (any buy counts).\n- **Rolled-over days show `claimed = true`.** `dayInfo` reports a rolled-over pot as claimed even though the king was never paid. This is documented in the code and isn't a math issue.\n- **Buying and selling back in one transaction.** This is cheap, because the trader wins back their own 4% in hook fees. It is still allowed under the \"single biggest buy\" rule and outside my area.\n\n**What I didn't do:** I covered all three assigned guides (Math Precision, Boundary, Numerical Gap) in full. The token's three functions are standard OpenZeppelin ERC-20 with no math of their own, so I didn't trace them deeply. A clean review doesn't prove the code has no defects.\n\n`git status` wouldn't run because of a repository-ownership warning, so I couldn't use it to confirm the tree is unchanged. I didn't change the git config to get around it.","treeHash":null,"usage":{"cachedInputTokens":931238,"inputTokens":24,"model":"claude-opus-5-5","outputTokens":22655,"runtime":"claude","turns":13,"wallClockMs":266273}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7d454e6cee88c390","findings":[{"citation":"resolved","description":"Not a code defect: the pool key is hard-bound by design and the README documents it. It is recorded because the protected floor test test_initializesFromTheLaunchFactory opens the pool with the manifest's pool.fee and pool.tickSpacing, and the constants POOL_FEE = 12_500 and TICK_SPACING = 60 are the only values _checkPool admits. No launch.json exists in the tree yet. Whoever writes it must put fee 12500 (the policy tier, which the hook accepts) and tickSpacing 60, pairedCurrency 0x0000000000000000000000000000000000000000, permissions [beforeInitialize, beforeSwap, afterSwap, beforeSwapReturnDelta, afterSwapReturnDelta] (address bits 0x20cc), constructorArgs [\"$poolManager\", \"$token\"]. Any other spacing or fee makes the launch revert in the deployer's simulation.","line":287,"path":"src/CrownHook.sol","reproduction":"State: Crown token and CrownHook deployed (fixture). Call manager.initialize(PoolKey(ETH, token, 12500, 10, hook), 2^96) -> reverts WrongPool() from beforeInitialize. Call manager.initialize(PoolKey(ETH, token, 3000, 60, hook), 2^96) -> reverts WrongPool(). Call manager.initialize(PoolKey(ETH, token, 12500, 60, hook), 2^96) -> succeeds (test_initializeAcceptsPolicyPoolAndReturnsSelector / test_initializeRejectsOtherPools in test/CrownAccess.t.sol show both).","severity":"info","snippet":"            !key.currency0.isAddressZero() || Currency.unwrap(key.currency1) != token || key.fee != POOL_FEE\n                || key.tickSpacing != TICK_SPACING || address(key.hooks) != address(this)","title":"beforeInitialize accepts only LP fee 12500 and tick spacing 60; the launch manifest must state exactly those or the factory's initialize reverts"},{"citation":"resolved","description":"The brief says a day with no buys 'rolls over the same way once it has ended'. The implementation reads 'once it has ended' literally: for a day whose king is address(0), rollover(day) is allowed from the first second of the next UTC day, while a day with a king waits until day+8. The README documents this interpretation. There is nobody entitled to a kingless pot, so there is no loss, but the timing differs from the 7-day rule and today's king (or whoever times the rollover) decides which day receives the pot. Recorded so the author can confirm the intended reading; no change is required if the documented behaviour is the intended one.","line":231,"path":"src/CrownHook.sol","reproduction":"Day d = 20000 (fixture START_DAY). Only sells happen on day d: _trade(alice, false, -1 ether) puts 2% of the ETH output into dayInfo(d).pot and leaves king == address(0). Warp to (d+1)*86400 (first second of day d+1). Anyone calls rollover(d): it succeeds immediately, dayInfo(d).pot becomes 0 and dayInfo(d+1).pot gains the amount. Compare: if alice had also bought on day d, rollover(d) at the same timestamp reverts RolloverTooEarly() until (d+8)*86400. test_sellOnlyDayRollsAfterMidnightWithoutSevenDayDelay in test/CrownGame.t.sol demonstrates the kingless path.","severity":"info","snippet":"        if (info.king != address(0) && today - day <= CLAIM_DAYS) revert RolloverTooEarly();","title":"A kingless (sell-only) day can be rolled over by anyone the second after it ends, not after the 7-day window used for days with a king"}],"hash":"59f544e50f7a13ae3d0400ecd92391e151b98e08bbce2df83a10863240de42fb","nodeId":"d7f379b4-3e0c-4c84-9200-9aed903339aa","outcome":"completed","summary":"The review is complete. The findings file is valid JSON, the scratch directory is gone, and `git status --porcelain` is empty, so the tree contains only the required output.\n\n**Outcome: no defects of low severity or above in the control-flow area.** The Execution Trace, Periphery and First Principles passes all came back clean. Two informational notes are recorded in `.imd-findings.json`, alongside a coverage row for every listed entry point plus the invariants I checked.\n\n**What I verified**\n\n- **Fee and delta flow in all four swap modes.** I traced the hook against the vendored v4 `Hooks.beforeSwap` and `Hooks.afterSwap` code. In every mode the hook's delta is (+fee ETH, 0), the in-callback `take` or `mint` nets it to zero, and the fee equals floor(gross/50) for both full and limit-bound fills.\n- **Reverting preview.** The self-call to `quoteSwap` is skipped by v4's hook-as-caller bypass, always reverts, and leaves no state. I argued from the capped-step math in `SwapMath` that the preview's consumed ETH equals the real swap's, then fuzzed it: 6,000 runs over a pool with liquidity gaps and random price limits produced no `SettlementMismatch`.\n- **Adversarial unlock flows.** A caller that drains the manager's ETH inside its own unlock and then buys forces the mint path safely. A king claiming from inside such an unlock reverts and the pot stays claimable. A `redeemFees` call inside a drained foreign unlock is a harmless no-op.\n- **Claim and rollover windows.** The claim window is days d+1 through d+7 inclusive, and rollover opens at d+8, with no gap or overlap. State is finalized before the ETH send, and a failed send reverts everything including redemption.\n- **Periphery.** `HookFlags` bit positions and the 14-bit mask match v4, the 0x20cc flag set matches `getHookPermissions`, and the constructor re-validates the address.\n\n**Informational notes recorded**\n\n1. `beforeInitialize` admits only LP fee 12500 and tick spacing 60. The manifest, which does not exist yet, must state exactly those or the factory's initialize reverts in the protected floor test.\n2. A sell-only day can be rolled over the second after it ends rather than after seven days. The brief's wording is ambiguous and the README documents this reading, so it is flagged for the author to confirm, not as a defect.\n\n**Not reached:** nothing in the assigned area was left unexamined. The repository suite passes in full, 59 tests including the invariant runs.","treeHash":null,"usage":{"cachedInputTokens":1124563,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":54522,"runtime":"claude","turns":33,"wallClockMs":730051}},{"artifacts":[],"attempt":1,"bundleHash":"9d7417e5f1f57abe1a0212be07e205332a68d83a3c7d280aa01987ad0f3640c5","device":"9a9cbce82297045e","findings":[],"hash":"6b5a66525309b25a25b8ba7aa1180b3d0dd45fe2a88cda1d51be5d3575d9dab9","nodeId":"2668c7c0-01b7-4d72-8cc6-cedb43d39359","outcome":"completed","summary":"Implemented Crown, the immutable game hook, vendored dependencies, and deployment/security documentation.\n\nChecks passed:\n- `forge build`\n- `forge test`: 59 tests, including 8,192 invariant calls\n- `forge fmt --check`\n\nThe README documents deployment parameters, fee rounding, claim deadlines, and the fresh-PoolManager ETH-credit fallback.","treeHash":"de5fb652baec7601974478a291315ba0fd584b45","usage":{"cachedInputTokens":2227200,"inputTokens":139100,"model":"gpt-6-astra","outputTokens":44785,"runtime":"codex","turns":7,"wallClockMs":1116610}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"f96a0c89c039c22a","findings":[{"citation":"resolved","description":"Merged from audit_economics (rated medium there). The crown goes to the largest poolETH, which is the ETH the AMM debited. It does not matter who ends up holding that ETH. No liquidity callbacks are enabled, so anyone can add liquidity. A buyer can add a narrow, very large position just below the price, buy through it and remove it in the same transaction. Nearly all of the ETH and LP fee comes back to the buyer, and the 2% hook fee goes into a pot the buyer then claims. This follows the brief's literal rule ('pays the most ETH into the pool, measured after the fee'), so it is a design weakness, not a broken stated guarantee. That is why it is low, not medium. The loss falls on that day's genuine biggest buyer, who expected to win the pot. A fix would be an LP lock through beforeAddLiquidity/beforeRemoveLiquidity, or the brief accepting this behaviour.","line":167,"path":"src/CrownHook.sol","reproduction":"Traced against the code, not executed (the specialist's test/scratch/KingCapture.t.sol is not in the tree). State: the fixture pool at 1:1. Alice buys 10 ETH exact-in, so dayInfo(D) has king alice, biggestBuy 9.8e18 and pot 0.2e18. At (D+1)*86400-1 carol, as tx.origin, uses one unlock to: modifyLiquidity on [tick-120, tick] with +1e25; swap zeroForOne with amountSpecified -11e18; modifyLiquidity -1e25 on the same range. afterSwap sees poolETH = 10.78e18 > 9.8e18 at line 167 and sets king = carol. Carol's ETH comes back through her position, so her net outlay is about the 0.22 ETH hook fee plus a small LP-fee share to other LPs. claim(D) then pays her 0.42 ETH. Expected: dethroning Alice costs ~10.78 ETH of real buying. Actual: carol ends with a small net profit.","severity":"low","snippet":"        if (params.zeroForOne && poolETH > info.biggestBuy) {","title":"King ranking counts ETH routed into the buyer's own just-in-time liquidity, so a last-block buyer can take the crown for little net cost"}],"hash":"73cb594ac0c125b8df3aa54b17c100cc50a861e3eb2f077dfdfb503a12b22cc4","nodeId":"d6460792-4e9a-4e54-8db0-87464e27ce18","outcome":"completed","summary":"I found nothing blocking in Crown/CrownHook. I kept one low-severity finding, and I did not run its reproduction: I traced it by hand. The results are in `.imd-findings.json`, which is valid JSON. The existing suite passes (73 tests, 0 failures, including the invariant runs).\n\n**The finding I kept (low):** the specialist's just-in-time liquidity issue, `src/CrownHook.sol:167`. The crown goes to whoever's single buy debits the most ETH, and the code doesn't check who ends up holding that ETH. Anyone can add liquidity to the pool, so a last-second buyer can do this in one transaction:\n1. Add a huge, narrow position just below the current price.\n2. Buy through it, which records a buy bigger than the current king's.\n3. Remove the position, which returns almost all of their ETH and the LP fee.\n\nTheir real cost is roughly the 2% hook fee, which goes into the pot they then claim, plus gas. The specialist rated this medium. I lowered it to low because the code follows the brief's literal rule (\"pays the most ETH into the pool, measured after the fee\"). It's a design weakness, not a broken stated guarantee. Fixing it means a design choice for the author, such as locking liquidity positions for the day.\n\nThe specialist's test for this (`test/scratch/KingCapture.t.sol`) isn't in the tree. I didn't write my own, so this finding has no attached proof.\n\n**What I dropped:**\n- **Kingless days roll over right after midnight**, not after 7 days. The README documents this, it matches the brief's \"once it has ended\", and nobody is owed a kingless pot, so there's no loss.\n- **The hook accepts only fee 12500 and tick spacing 60.** `launch.json` already states exactly those values, so this isn't a defect.\n- **Slither's strict-equality and unused-return warnings** on the fee redemption code: I checked both and they're harmless.\n\n**Coverage:** all 11 entry points have a row. Ten hold, and `afterSwap` points to the finding. I checked the fee accounting for all four swap types and the claim and rollover guards, including that the pot stays claimable when the ETH transfer fails.","treeHash":null,"usage":{"cachedInputTokens":199947,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":4070,"runtime":"claude","turns":4,"wallClockMs":98172}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"96ecbe9236c400bb","findings":[{"citation":"resolved","description":"Economic Security / Invariant review. The crown is awarded on `poolETH`, the ETH the AMM debited for the buy, with no regard to who receives that ETH. In v4 anyone can add liquidity to this pool (no liquidity callbacks are enabled, and the README says liquidity is unrestricted). A last-second buyer can therefore add a concentrated position just below the current price that dwarfs the pool's liquidity, buy through it, and remove the position in the same block. The ETH 'paid into the pool' flows into the attacker's own position and comes straight back, together with almost all of the 1.25% LP fee. The only money that leaves the attacker is the 2% hook fee, which goes into the pot the attacker is now king of and is returned by `claim`. Net cost is the small liquidity share of other LPs plus gas; the prize is every genuine buyer's and seller's 2% for the whole day. The invariant the game rests on, 'the king is the buyer who spent the most ETH on CROWN that day', is broken: the attacker spends ~0 and holds the same CROWN (slightly more) afterwards. Measured on the repository fixture (10,000 liquidity at 1:1, alice buys 10 ETH, attacker JIT-adds 10,000,000 liquidity in [tick-120, tick], buys 11 ETH, removes): attacker ETH out 0.2308 ETH (0.22 of it the hook fee), CROWN +0.0106, claims 0.42 ETH next day, net +0.1892 ETH. Without the JIT trick the same capture via buy-then-sell-back costs 0.698 ETH against a 0.63 pot in this thin fixture (2x 1.25% LP fee plus slippage, since both 2% fees return to the king), so plain round-tripping becomes profitable as soon as the pre-existing pot exceeds roughly 2.5%-3% of the buy needed to top the current king; with JIT it is profitable at any pot size above gas. The README's 'not MEV-resistant' note covers ordering, not that the ranking metric can be satisfied with ETH that never leaves the buyer. Because the hook already returns the actual deltas, a fix needs a design decision: e.g. rank by ETH net of the buyer's own liquidity (not observable), enable beforeAddLiquidity/afterRemoveLiquidity to impose a same-day lock on positions, or state in the brief that the pot is a bounty for the last-block capturer rather than for genuine buyers.","line":167,"path":"src/CrownHook.sol","reproduction":"State: pool initialized at 1:1 with 10,000 liquidity over [-60000,60000]; day D; alice buys with 10 ETH exact-input (pot 0.2 ETH, king alice, biggestBuy 9.8 ETH). At timestamp (D+1)*86400-1, attacker (carol, tx.origin) with a router she controls: 1) modifyLiquidity(tickLower=floor(tick/60)*60-120, tickUpper=floor(tick/60)*60, +10,000,000e18); 2) swap zeroForOne exact-input 11 ETH, limit MIN_SQRT_PRICE+1; 3) modifyLiquidity same range, -10,000,000e18. Expected: dethroning a 10 ETH buyer costs the attacker on the order of 10.78 ETH paid to the pool's LPs. Actual: dayInfo(D).king == carol, biggestBuy 10.78 ETH, attacker's combined ETH balance fell by only 0.2308 ETH and her CROWN rose by 0.0106; at (D+1)*86400 claim(D) pays her 0.42 ETH, net +0.1892 ETH. test/scratch/KingCapture.t.sol::test_jitLiquidityMakesKingCaptureNearlyFree fails on this code with 'king capture with self-provided liquidity must not be profitable'.","severity":"medium","snippet":"        if (params.zeroForOne && poolETH > info.biggestBuy) {\n            info.king = tx.origin;\n            info.biggestBuy = poolETH;","title":"King rule counts ETH paid into the buyer's own just-in-time liquidity, so the daily pot is capturable at near-zero cost"}],"hash":"79860a19169b04a212110abdfcf4eadd3ae3c7090f075de52053771090175aba","nodeId":"34f25f8f-02d2-4566-a323-7879ae92d224","outcome":"completed","summary":"The review is complete and the findings file is in place. No tracked files were changed; only the ignored findings file and the scratch test exist.\n\n**Outcome**\n\nI audited the CROWN hook against the Economic Security, Invariant and Flow Gap guides and found one substantiated defect. The rest of the economic model holds. The result is written to `.imd-findings.json` with one finding and 15 coverage rows covering all 11 listed entry points plus four invariants I checked.\n\n**The finding (medium): the king rule can be satisfied with ETH that never leaves the buyer.** The crown is awarded on the ETH the AMM debited for the buy, in `CrownHook.afterSwap` at `src/CrownHook.sol:167`. Liquidity provision is unrestricted, so a last-second buyer can add a huge just-in-time position just below the price, buy through it, and remove it in the same block. The ETH flows into their own position and comes back, with almost all of the LP fee. The only money that leaves is the 2% hook fee, which lands in the pot they now win. Measured on the repository fixture, dethroning a genuine 10 ETH buyer cost the attacker 0.23 ETH, and after claiming they ended 0.19 ETH richer while also holding slightly more CROWN. The proof test under `test/scratch/KingCapture.t.sol` fails on the current code for this reason and is self-contained. I also measured the plain buy-then-sell-back variant. In this thin fixture it loses 0.07 ETH, but it turns profitable once the existing pot exceeds roughly 2.5% to 3% of the buy needed to top the king, because both 2% fees return to the king.\n\n**What holds.** I traced the fee math for all four swap modes including partial fills at a price limit, and the preview-then-charge design is consistent with the 2% check in afterSwap. The claim and rollover windows are disjoint with no gap. The three accounting invariants hold: hook balance plus pending credits plus paid equals collected, pots plus paid equals collected, and the PoolManager stays solvent for the hook's claims and for sellers' withdrawals after the mid-swap redemption. The Slither leads were benign strict-equality and timestamp uses. The full repository suite passes.\n\n**Not reached in depth.** Access control and manifest concerns, including the tx.origin identity rule under account-abstraction bundlers, belong to the other specialists and are documented in the README. I did not attempt gas-exhaustion analysis of the reverting preview beyond confirming it cannot be used by third parties.","treeHash":null,"usage":{"cachedInputTokens":1968712,"inputTokens":610,"model":"claude-fable-5-1","outputTokens":41944,"runtime":"claude","turns":20,"wallClockMs":605012}},{"artifacts":[],"attempt":1,"bundleHash":"154861566cae415532d075ca075ad41d69d08f789a5eab93805bb52e8aad6afb","device":"74f6c6912a376f27","findings":[],"hash":"aac3e207f4df610e4947f9075ad729a34317e4169efa2308bcb4f7e732973553","nodeId":"461b9dda-60aa-4c32-9bf8-4c291b01ebdc","outcome":"completed","summary":"Added differential, adversarial, and invariant tests under `test/`, covering swap fees, rounding ties, failed settlement, claims, rollovers, and pot conservation.\n\nVerified offline with the required seed: `forge build` and `forge test` pass—73 tests, zero failures or skips. The new invariant campaign checks 20,480 random actions.\n\nNo implementation defects found in these checks.","treeHash":"23c103035a47121e307197e8c0c1f4b184b1cae3","usage":{"cachedInputTokens":2412800,"inputTokens":125199,"model":"gpt-6-astra","outputTokens":26513,"runtime":"codex","turns":6,"wallClockMs":803617}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6ed09c2eb1ff6aec","findings":[],"hash":"ef564031bb20753efe7feff6aeef682b641e68cd9e12d1758fb0c8c43ea6c055","nodeId":"04e35507-5259-4781-ae19-761137ff3061","outcome":"completed","summary":"I found no permission defects I could back with a reproduction. `.imd-findings.json` has an empty findings list and a coverage record with one row for each of the 11 entry points, all marked `holds`, plus a 12th row for the no-admin rule. I changed no files. The existing suite passes (59 tests, 0 failed). I didn't write any new test proofs, because I had nothing to prove.\n\nWhat I checked under the access control, trust gap and asymmetry guides:\n- **No privileged roles:** `CrownHook` has no owner, setters, pause, upgrade path or withdraw function. `Crown` is a standard OpenZeppelin ERC20 that mints its fixed supply once, in the constructor. ETH leaves the hook only through `claim`.\n- **Pool callbacks:** `beforeInitialize`, `beforeSwap`, `afterSwap`, `unlockCallback` and `receive` all reject any caller except the PoolManager. The swap callbacks also reject any pool other than CROWN/ETH at the 12500 fee and 60 tick spacing.\n- **`quoteSwap`:** only the hook itself can call it, and every path reverts. So nobody can use it to swap without paying the fee. Because the hook itself starts the preview swap, Uniswap v4 skips the hook's own callbacks during it, so there is no recursion.\n- **`claim`:** only that day's king can claim, and only after the day ends and within 7 days. The pot is marked paid before the ETH is sent, a reentrancy guard covers it, and a failed send undoes the whole claim. The 7-day claim window and the rollover rule line up, so neither side gets an extra day.\n- **`rollover` and `redeemFees`:** anyone can call them, but neither pays the caller. `rollover` moves an expired or kingless pot into today's pot. `redeemFees` only turns the hook's own pending credits at the PoolManager into ETH held by the hook.\n- **Who becomes king:** buys crown `tx.origin` with a strictly larger amount; sells never crown anyone.\n\nTwo things to note, neither of which is a defect against the spec:\n- **Pool setup:** `beforeInitialize` checks the pool settings but not which address initializes the pool. That's safe only because the factory deploys the hook and initializes the pool in the same transaction.\n- **Smart-wallet buyers:** since the king is `tx.origin`, a buy sent through a smart-contract wallet (for example an ERC-4337 bundler) crowns whoever submitted the transaction, not the wallet's owner. The spec requires `tx.origin`, so this is a design choice.\n\nI didn't follow up these static-analysis warnings:\n- **\"Strict equality\" in `_redeem` and `_redeemAvailable`:** these are early-exit checks for a zero amount, and I saw no exploit from them.\n- **Ignored `unlock()` return value:** I didn't trace any harm from it.\n\nI didn't investigate fee rounding or price manipulation, which belong to the other three reviewers.","treeHash":null,"usage":{"cachedInputTokens":185230,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":3742,"runtime":"claude","turns":4,"wallClockMs":56412}}],"verification":[{"checks":[{"durationMs":2760,"exitCode":0,"name":"build","output":"Compiling 83 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.67s\nCompiler run successful!\n","passed":true},{"durationMs":2115,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/Crown.t.sol:CrownTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 512, μ: 98939, ~: 99196)\nLogs:\n  Bound result 976896101082699796178157856\n\n[PASS] test_metadataAndOneTimeSupply() (gas: 60137)\n[PASS] test_noPrivilegedEntryPointsEvenForDeployer() (gas: 205662)\n[PASS] test_rejectsZeroRecipientAndInsufficientBalance() (gas: 60838)\n[PASS] test_transfersAndAllowanceHaveNoTax() (gas: 250198)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 5.88ms (6.02ms CPU time)\n\nRan 11 tests for test/CrownAccess.t.sol:CrownAccessTest\n[PASS] test_addressWithWrongPermissionBitsCannotDeploy() (gas: 19808)\n[PASS] test_allEnabledCallbacksRejectNonManager() (gas: 175945)\n[PASS] test_constructorsRejectZeroConfiguration() (gas: 6033)\n[PASS] test_initializeAcceptsPolicyPoolAndReturnsSelector() (gas: 23762)\n[PASS] test_initializeRejectsOtherPools() (gas: 140022)\n[PASS] test_invalidAmountBoundsRejectedBeforeNegation() (gas: 134592)\n[PASS] test_noOwnerAdminSettersMintOrUpgradeFunctions() (gas: 269100)\n[PASS] test_permissionsExactlyMatchDeploymentBits() (gas: 35702)\n[PASS] test_runtimeHasNoUpgradeOrDestructionOpcodes() (gas: 5277096)\n[PASS] test_saltMinerDeploysReviewedBytecodeEvenBeforeDependenciesHaveCode() (gas: 16940438)\n[PASS] test_swapCallbacksAlsoRejectWrongPool() (gas: 74272)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 83.08ms (47.29ms CPU time)\n\nRan 25 tests for test/CrownFees.t.sol:CrownFeesTest\n[PASS] testFuzz_buyRoundingAtSmallWeiAmounts(uint16) (runs: 512, μ: 449877, ~: 477271)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_fourDirectionsRespectFeeAndBudget(uint96,bool,bool) (runs: 512, μ: 433810, ~: 446150)\nLogs:\n  Bound result 759946627\n\n[PASS] testFuzz_partialFillsRespectFee(uint96,uint16,bool,bool) (runs: 512, μ: 441222, ~: 448164)\nLogs:\n  Bound result 99000000000000012085\n  Bound result 14\n\n[PASS] testFuzz_sellExactOutputAtSmallWeiAmounts(uint16) (runs: 512, μ: 424700, ~: 445924)\nLogs:\n  Bound result 3\n\n[PASS] test_allFourModesInOneUnlockClearTransientState() (gas: 999939)\n[PASS] test_badPriceLimitRevertsWithoutFeeOrCrown() (gas: 108489)\n[PASS] test_buyExactInput() (gas: 493975)\n[PASS] test_buyExactOutput() (gas: 419862)\n[PASS] test_dayClaimAutomaticallyRedeemsPendingFees() (gas: 59802632)\n[PASS] test_freshManagerSellExactInputAfterFirstBuy() (gas: 60259339)\n[PASS] test_freshManagerSellExactOutputAfterFirstBuy() (gas: 60345411)\n[PASS] test_freshTokenOnlyManagerBuyExactInput() (gas: 59832126)\n[PASS] test_freshTokenOnlyManagerBuyExactOutput() (gas: 59732729)\n[PASS] test_liquidityFeeCollectIsUntaxedAndUnrestricted() (gas: 711207)\n[PASS] test_nextSwapAutomaticallyRedeemsPendingFees() (gas: 60017942)\n[PASS] test_oneWeiBuyCountsItsActualPoolPaymentWithoutChargingRoundedFee() (gas: 367846)\n[PASS] test_partialBuyExactInputChargesSettledAmount() (gas: 497629)\n[PASS] test_partialBuyExactOutput() (gas: 420395)\n[PASS] test_partialSellExactInput() (gas: 388552)\n[PASS] test_partialSellExactOutputChargesSettledAmount() (gas: 440906)\n[PASS] test_publicRedemptionWorksInsideExistingUnlockAndKeepsOriginalDay() (gas: 60072737)\n[PASS] test_routerSlippageFailureRollsBackAllGameAndPoolState() (gas: 473440)\n[PASS] test_sellExactInput() (gas: 382391)\n[PASS] test_sellExactOutput() (gas: 442737)\n[PASS] test_zeroLiquidityDoesNotCreateFeeOrKing() (gas: 1069016)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 121.11ms (760.39ms CPU time)\n\nRan 17 tests for test/CrownGame.t.sol:CrownGameTest\n[PASS] testFuzz_multipleDaysNeverPayMoreThanCollected(uint96,uint96,uint96) (runs: 512, μ: 1553494, ~: 1553634)\nLogs:\n  Bound result 5614\n  Bound result 11584\n  Bound result 99900000\n\n[PASS] test_buySizesAreNotAccumulatedPerBuyer() (gas: 1077500)\n[PASS] test_claimAllowedUntilLastSecondOfSevenDayWindow() (gas: 571727)\n[PASS] test_claimAndDoubleClaim() (gas: 1125095)\n[PASS] test_claimCannotReenterClaimRolloverOrRedemption() (gas: 1122835)\n[PASS] test_emptyAndFutureDaysHaveNoEntitlement() (gas: 186538)\n[PASS] test_failedTransferLeavesClaimAvailableForRetry() (gas: 768763)\n[PASS] test_forcedETHCannotInflatePotOrPayout() (gas: 546461)\n[PASS] test_kingCrownedInLastSecondReceivesWholeDayPot() (gas: 851631)\n[PASS] test_midnightStartsIndependentDay() (gas: 892079)\n[PASS] test_rejectedClaimAlsoRollsBackRedemption() (gas: 59928117)\n[PASS] test_rolloverAtSevenDaysAfterEndMovesWholePotExactlyOnce() (gas: 1206057)\n[PASS] test_rolloverBeforeKingDeadlineRefused() (gas: 473898)\n[PASS] test_routerAndWalletUseOriginAndIgnoreHookData() (gas: 806109)\n[PASS] test_sellAddsPotWithoutChangingKing() (gas: 783720)\n[PASS] test_sellOnlyDayRollsAfterMidnightWithoutSevenDayDelay() (gas: 1191698)\n[PASS] test_strictlyLargerBuyWinsAndTieKeepsEarlierKing() (gas: 1439665)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 135.29ms (170.03ms CPU time)\n\nRan 1 test for test/CrownInvariant.t.sol:CrownInvariantTest\n[PASS]\nCrownInvariantTest invariants:\n[PASS] invariant_accountedETHIsBackedAndNeverOverpaid\n[PASS] invariant_everyDayMatchesIndependentLedger\n CrownInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| GameHandler | advance  | 2047  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| GameHandler | claim    | 2035  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| GameHandler | rollover | 2070  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| GameHandler | trade    | 2040  | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 8396\n  Bound result 259200\n  Bound result 254\n  Bound result 999999999900007382\n  Bound result 2258\n  Bound result 999999999900000119\n  Bound result 999999999900006998\n  Bound result 50\n  Bound result 5\n  Bound result 18615\n  Bound result 56354675830\n  Bound result 100\n  Bound result 4752\n  Bound result 6914\n  Bound result 5\n  Bound result 1313373041\n  Bound result 945463953135244577\n  Bound result 100000002\n  Bound result 999999999900001457\n  Bound result 91\n  Bound result 7521\n  Bound result 128\n  Bound result 434473543160919604\n  Bound result 932121624990153589\n  Bound result 663\n  Bound result 1\n  Bound result 7860\n  Bound result 999999999912643629\n  Bound result 17991\n  Bound result 26008\n  Bound result 978467625029465159\n  Bound result 737\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.01s (1.97s CPU time)\n\nRan 5 test suites in 2.01s (2.35s CPU time): 59 tests passed, 0 failed, 0 skipped (59 total tests)\n","passed":true},{"durationMs":55,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Crown.approve(address,uint256)\",\"Crown.transfer(address,uint256)\",\"Crown.transferFrom(address,address,uint256)\",\"CrownHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"CrownHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"CrownHook.claim(uint256)\",\"CrownHook.quoteSwap((address,address,uint24,int24,address),(bool,int256,uint160))\",\"CrownHook.receive()\",\"CrownHook.redeemFees()\",\"CrownHook.rollover(uint256)\",\"CrownHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":34,\"DEPENDENCIES.md\":14,\"LICENSE\":23,\"README.md\":129,\"SECURITY.md\":57,\"foundry.toml\":22,\"launch.json\":30,\"remappings.txt\":4,\"script/MineSalt.s.sol\":29,\"src/Crown.sol\":13,\"src/CrownHook.sol\":309,\"src/HookFlags.sol\":32,\"test/Crown.t.sol\":73,\"test/CrownAccess.t.sol\":176,\"test/CrownFees.t.sol\":300,\"test/CrownGame.t.sol\":320,\"test/CrownInvariant.t.sol\":160,\"test/helpers/CrownFixture.sol\":138,\"test/helpers/PoolRouter.sol\":125},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1924e1829d9934280885582cdf343b0bec7fcc9a1dacb5120ae8aa5331b9913e","verifiedTreeHash":"b6d313d687d0778f11529cf86474b69fb8356c71","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":2560,"exitCode":0,"name":"build","output":"Compiling 83 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.47s\nCompiler run successful!\n","passed":true},{"durationMs":1956,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/Crown.t.sol:CrownTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 512, μ: 98939, ~: 99196)\nLogs:\n  Bound result 8019\n\n[PASS] test_metadataAndOneTimeSupply() (gas: 60137)\n[PASS] test_noPrivilegedEntryPointsEvenForDeployer() (gas: 205662)\n[PASS] test_rejectsZeroRecipientAndInsufficientBalance() (gas: 60838)\n[PASS] test_transfersAndAllowanceHaveNoTax() (gas: 250198)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 5.20ms (5.28ms CPU time)\n\nRan 11 tests for test/CrownAccess.t.sol:CrownAccessTest\n[PASS] test_addressWithWrongPermissionBitsCannotDeploy() (gas: 19808)\n[PASS] test_allEnabledCallbacksRejectNonManager() (gas: 175945)\n[PASS] test_constructorsRejectZeroConfiguration() (gas: 6033)\n[PASS] test_initializeAcceptsPolicyPoolAndReturnsSelector() (gas: 23762)\n[PASS] test_initializeRejectsOtherPools() (gas: 140022)\n[PASS] test_invalidAmountBoundsRejectedBeforeNegation() (gas: 134592)\n[PASS] test_noOwnerAdminSettersMintOrUpgradeFunctions() (gas: 269100)\n[PASS] test_permissionsExactlyMatchDeploymentBits() (gas: 35702)\n[PASS] test_runtimeHasNoUpgradeOrDestructionOpcodes() (gas: 5277096)\n[PASS] test_saltMinerDeploysReviewedBytecodeEvenBeforeDependenciesHaveCode() (gas: 16940438)\n[PASS] test_swapCallbacksAlsoRejectWrongPool() (gas: 74272)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 96.62ms (47.15ms CPU time)\n\nRan 17 tests for test/CrownGame.t.sol:CrownGameTest\n[PASS] testFuzz_multipleDaysNeverPayMoreThanCollected(uint96,uint96,uint96) (runs: 512, μ: 1553494, ~: 1553634)\nLogs:\n  Bound result 1308496235240\n  Bound result 8136284301519114389\n  Bound result 6176044702527350679\n\n[PASS] test_buySizesAreNotAccumulatedPerBuyer() (gas: 1077500)\n[PASS] test_claimAllowedUntilLastSecondOfSevenDayWindow() (gas: 571727)\n[PASS] test_claimAndDoubleClaim() (gas: 1125095)\n[PASS] test_claimCannotReenterClaimRolloverOrRedemption() (gas: 1122835)\n[PASS] test_emptyAndFutureDaysHaveNoEntitlement() (gas: 186538)\n[PASS] test_failedTransferLeavesClaimAvailableForRetry() (gas: 768763)\n[PASS] test_forcedETHCannotInflatePotOrPayout() (gas: 546461)\n[PASS] test_kingCrownedInLastSecondReceivesWholeDayPot() (gas: 851631)\n[PASS] test_midnightStartsIndependentDay() (gas: 892079)\n[PASS] test_rejectedClaimAlsoRollsBackRedemption() (gas: 59928117)\n[PASS] test_rolloverAtSevenDaysAfterEndMovesWholePotExactlyOnce() (gas: 1206057)\n[PASS] test_rolloverBeforeKingDeadlineRefused() (gas: 473898)\n[PASS] test_routerAndWalletUseOriginAndIgnoreHookData() (gas: 806109)\n[PASS] test_sellAddsPotWithoutChangingKing() (gas: 783720)\n[PASS] test_sellOnlyDayRollsAfterMidnightWithoutSevenDayDelay() (gas: 1191698)\n[PASS] test_strictlyLargerBuyWinsAndTieKeepsEarlierKing() (gas: 1439665)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 159.93ms (183.33ms CPU time)\n\nRan 25 tests for test/CrownFees.t.sol:CrownFeesTest\n[PASS] testFuzz_buyRoundingAtSmallWeiAmounts(uint16) (runs: 512, μ: 449877, ~: 477271)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_fourDirectionsRespectFeeAndBudget(uint96,bool,bool) (runs: 512, μ: 433810, ~: 446150)\nLogs:\n  Bound result 759946627\n\n[PASS] testFuzz_partialFillsRespectFee(uint96,uint16,bool,bool) (runs: 512, μ: 441222, ~: 448164)\nLogs:\n  Bound result 99586896142627534802\n  Bound result 54\n\n[PASS] testFuzz_sellExactOutputAtSmallWeiAmounts(uint16) (runs: 512, μ: 424700, ~: 445924)\nLogs:\n  Bound result 209\n\n[PASS] test_allFourModesInOneUnlockClearTransientState() (gas: 999939)\n[PASS] test_badPriceLimitRevertsWithoutFeeOrCrown() (gas: 108489)\n[PASS] test_buyExactInput() (gas: 493975)\n[PASS] test_buyExactOutput() (gas: 419862)\n[PASS] test_dayClaimAutomaticallyRedeemsPendingFees() (gas: 59802632)\n[PASS] test_freshManagerSellExactInputAfterFirstBuy() (gas: 60259339)\n[PASS] test_freshManagerSellExactOutputAfterFirstBuy() (gas: 60345411)\n[PASS] test_freshTokenOnlyManagerBuyExactInput() (gas: 59832126)\n[PASS] test_freshTokenOnlyManagerBuyExactOutput() (gas: 59732729)\n[PASS] test_liquidityFeeCollectIsUntaxedAndUnrestricted() (gas: 711207)\n[PASS] test_nextSwapAutomaticallyRedeemsPendingFees() (gas: 60017942)\n[PASS] test_oneWeiBuyCountsItsActualPoolPaymentWithoutChargingRoundedFee() (gas: 367846)\n[PASS] test_partialBuyExactInputChargesSettledAmount() (gas: 497629)\n[PASS] test_partialBuyExactOutput() (gas: 420395)\n[PASS] test_partialSellExactInput() (gas: 388552)\n[PASS] test_partialSellExactOutputChargesSettledAmount() (gas: 440906)\n[PASS] test_publicRedemptionWorksInsideExistingUnlockAndKeepsOriginalDay() (gas: 60072737)\n[PASS] test_routerSlippageFailureRollsBackAllGameAndPoolState() (gas: 473440)\n[PASS] test_sellExactInput() (gas: 382391)\n[PASS] test_sellExactOutput() (gas: 442737)\n[PASS] test_zeroLiquidityDoesNotCreateFeeOrKing() (gas: 1069016)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 160.08ms (887.62ms CPU time)\n\nRan 1 test for test/CrownInvariant.t.sol:CrownInvariantTest\n[PASS]\nCrownInvariantTest invariants:\n[PASS] invariant_accountedETHIsBackedAndNeverOverpaid\n[PASS] invariant_everyDayMatchesIndependentLedger\n CrownInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| GameHandler | advance  | 2047  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| GameHandler | claim    | 2035  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| GameHandler | rollover | 2070  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| GameHandler | trade    | 2040  | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 8396\n  Bound result 259200\n  Bound result 254\n  Bound result 999999999900007382\n  Bound result 2258\n  Bound result 999999999900000119\n  Bound result 999999999900006998\n  Bound result 50\n  Bound result 5\n  Bound result 18615\n  Bound result 56354675830\n  Bound result 100\n  Bound result 4752\n  Bound result 6914\n  Bound result 5\n  Bound result 1313373041\n  Bound result 945463953135244577\n  Bound result 100000002\n  Bound result 999999999900001457\n  Bound result 91\n  Bound result 7521\n  Bound result 128\n  Bound result 434473543160919604\n  Bound result 932121624990153589\n  Bound result 663\n  Bound result 1\n  Bound result 7860\n  Bound result 999999999912643629\n  Bound result 17991\n  Bound result 26008\n  Bound result 678485556260774521\n  Bound result 737\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.85s (1.81s CPU time)\n\nRan 5 test suites in 1.85s (2.27s CPU time): 59 tests passed, 0 failed, 0 skipped (59 total tests)\n","passed":true},{"durationMs":56,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Crown.approve(address,uint256)\",\"Crown.transfer(address,uint256)\",\"Crown.transferFrom(address,address,uint256)\",\"CrownHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"CrownHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"CrownHook.claim(uint256)\",\"CrownHook.quoteSwap((address,address,uint24,int24,address),(bool,int256,uint160))\",\"CrownHook.receive()\",\"CrownHook.redeemFees()\",\"CrownHook.rollover(uint256)\",\"CrownHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":34,\"DEPENDENCIES.md\":14,\"LICENSE\":23,\"README.md\":129,\"SECURITY.md\":57,\"foundry.toml\":22,\"remappings.txt\":4,\"script/MineSalt.s.sol\":29,\"src/Crown.sol\":13,\"src/CrownHook.sol\":309,\"src/HookFlags.sol\":32,\"test/Crown.t.sol\":73,\"test/CrownAccess.t.sol\":176,\"test/CrownFees.t.sol\":300,\"test/CrownGame.t.sol\":320,\"test/CrownInvariant.t.sol\":160,\"test/helpers/CrownFixture.sol\":138,\"test/helpers/PoolRouter.sol\":125},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1011,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/CrownHook.sol:253: CrownHook._redeem() (src/CrownHook.sol#253-257) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/CrownHook.sol:259: CrownHook._redeemAvailable() (src/CrownHook.sol#259-267) uses a dangerous strict equality:\n[medium/medium] unused-return at src/CrownHook.sol:253: CrownHook._redeem() (src/CrownHook.sol#253-257) ignores return value by poolManager.unlock() (src/CrownHook.sol#256)\n[low/medium] timestamp at src/CrownHook.sol:226: CrownHook.rollover(uint256) (src/CrownHook.sol#226-237) uses timestamp for comparisons\n[low/medium] timestamp at src/CrownHook.sol:199: CrownHook.claimable(uint256) (src/CrownHook.sol#199-204) uses timestamp for comparisons\n[low/medium] timestamp at src/CrownHook.sol:206: CrownHook.claim(uint256) (src/CrownHook.sol#206-222) uses timestamp for comparisons","passed":true},{"durationMs":358,"exitCode":0,"name":"aderyn","output":"[low] internal-function-used-once at src/HookFlags.sol:25: Internal Function Used Only Once\n[low] large-numeric-literal at src/Crown.sol:8: Large Numeric Literal (2 places)\n[low] unused-public-function at src/CrownHook.sol:199: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6b5a66525309b25a25b8ba7aa1180b3d0dd45fe2a88cda1d51be5d3575d9dab9","verifiedTreeHash":"de5fb652baec7601974478a291315ba0fd584b45","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":3848,"exitCode":0,"name":"build","output":"Compiling 88 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.75s\nCompiler run successful!\n","passed":true},{"durationMs":7065,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/Crown.t.sol:CrownTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 512, μ: 98904, ~: 99190)\nLogs:\n  Bound result 8019\n\n[PASS] test_metadataAndOneTimeSupply() (gas: 60137)\n[PASS] test_noPrivilegedEntryPointsEvenForDeployer() (gas: 205662)\n[PASS] test_rejectsZeroRecipientAndInsufficientBalance() (gas: 60838)\n[PASS] test_transfersAndAllowanceHaveNoTax() (gas: 250198)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 5.28ms (5.63ms CPU time)\n\nRan 25 tests for test/CrownFees.t.sol:CrownFeesTest\n[PASS] testFuzz_buyRoundingAtSmallWeiAmounts(uint16) (runs: 512, μ: 450345, ~: 477271)\nLogs:\n  Bound result 3\n\n[PASS] testFuzz_fourDirectionsRespectFeeAndBudget(uint96,bool,bool) (runs: 512, μ: 433808, ~: 446150)\nLogs:\n  Bound result 1549470\n\n[PASS] testFuzz_partialFillsRespectFee(uint96,uint16,bool,bool) (runs: 512, μ: 441006, ~: 448153)\nLogs:\n  Bound result 99586896142627534802\n  Bound result 54\n\n[PASS] testFuzz_sellExactOutputAtSmallWeiAmounts(uint16) (runs: 512, μ: 425237, ~: 445924)\nLogs:\n  Bound result 209\n\n[PASS] test_allFourModesInOneUnlockClearTransientState() (gas: 999939)\n[PASS] test_badPriceLimitRevertsWithoutFeeOrCrown() (gas: 108489)\n[PASS] test_buyExactInput() (gas: 493975)\n[PASS] test_buyExactOutput() (gas: 419862)\n[PASS] test_dayClaimAutomaticallyRedeemsPendingFees() (gas: 59802632)\n[PASS] test_freshManagerSellExactInputAfterFirstBuy() (gas: 60259339)\n[PASS] test_freshManagerSellExactOutputAfterFirstBuy() (gas: 60345411)\n[PASS] test_freshTokenOnlyManagerBuyExactInput() (gas: 59832126)\n[PASS] test_freshTokenOnlyManagerBuyExactOutput() (gas: 59732729)\n[PASS] test_liquidityFeeCollectIsUntaxedAndUnrestricted() (gas: 711207)\n[PASS] test_nextSwapAutomaticallyRedeemsPendingFees() (gas: 60017942)\n[PASS] test_oneWeiBuyCountsItsActualPoolPaymentWithoutChargingRoundedFee() (gas: 367846)\n[PASS] test_partialBuyExactInputChargesSettledAmount() (gas: 497629)\n[PASS] test_partialBuyExactOutput() (gas: 420395)\n[PASS] test_partialSellExactInput() (gas: 388552)\n[PASS] test_partialSellExactOutputChargesSettledAmount() (gas: 440906)\n[PASS] test_publicRedemptionWorksInsideExistingUnlockAndKeepsOriginalDay() (gas: 60072737)\n[PASS] test_routerSlippageFailureRollsBackAllGameAndPoolState() (gas: 473440)\n[PASS] test_sellExactInput() (gas: 382391)\n[PASS] test_sellExactOutput() (gas: 442737)\n[PASS] test_zeroLiquidityDoesNotCreateFeeOrKing() (gas: 1069016)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 288.25ms (886.97ms CPU time)\n\nRan 8 tests for test/CrownAdversarial.t.sol:CrownAdversarialTest\n[PASS] testFuzz_allModesWithTemporarilyEmptyManager(uint96,uint8) (runs: 1000, μ: 681821, ~: 686181)\nLogs:\n  Bound result 7472265214914716\n\n[PASS] test_allFourEmptyPoolSwapsLeaveNoPotOrKing() (gas: 3171774)\n[PASS] test_claimCallbackCanBuyWithoutReopeningPreviousDay() (gas: 1426341)\n[PASS] test_largeUnfilledBudgetCannotTakeCrown() (gas: 747354)\n[PASS] test_largerGrossBuyCanTieAfterFeeRounding() (gas: 1090011)\n[PASS] test_pendingFeesFromSeveralDaysRolloverAndPayExactlyOnce() (gas: 1303909)\n[PASS] test_rejectedClaimCanExpireAndRolloverWithoutLosingItsCredits() (gas: 1216431)\n[PASS] test_unpaidSwapsCannotCreateCrownPotOrFeeCreditsInAnyMode() (gas: 2685444)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 624.43ms (599.07ms CPU time)\n\nRan 17 tests for test/CrownGame.t.sol:CrownGameTest\n[PASS] testFuzz_multipleDaysNeverPayMoreThanCollected(uint96,uint96,uint96) (runs: 512, μ: 1553477, ~: 1553614)\nLogs:\n  Bound result 1308496235240\n  Bound result 8136284301519114389\n  Bound result 6176044702527350679\n\n[PASS] test_buySizesAreNotAccumulatedPerBuyer() (gas: 1077500)\n[PASS] test_claimAllowedUntilLastSecondOfSevenDayWindow() (gas: 571727)\n[PASS] test_claimAndDoubleClaim() (gas: 1125095)\n[PASS] test_claimCannotReenterClaimRolloverOrRedemption() (gas: 1122835)\n[PASS] test_emptyAndFutureDaysHaveNoEntitlement() (gas: 186538)\n[PASS] test_failedTransferLeavesClaimAvailableForRetry() (gas: 768763)\n[PASS] test_forcedETHCannotInflatePotOrPayout() (gas: 546461)\n[PASS] test_kingCrownedInLastSecondReceivesWholeDayPot() (gas: 851631)\n[PASS] test_midnightStartsIndependentDay() (gas: 892079)\n[PASS] test_rejectedClaimAlsoRollsBackRedemption() (gas: 59928117)\n[PASS] test_rolloverAtSevenDaysAfterEndMovesWholePotExactlyOnce() (gas: 1206057)\n[PASS] test_rolloverBeforeKingDeadlineRefused() (gas: 473898)\n[PASS] test_routerAndWalletUseOriginAndIgnoreHookData() (gas: 806109)\n[PASS] test_sellAddsPotWithoutChangingKing() (gas: 783720)\n[PASS] test_sellOnlyDayRollsAfterMidnightWithoutSevenDayDelay() (gas: 1191698)\n[PASS] test_strictlyLargerBuyWinsAndTieKeepsEarlierKing() (gas: 1439665)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 624.43ms (692.39ms CPU time)\n\nRan 11 tests for test/CrownAccess.t.sol:CrownAccessTest\n[PASS] test_addressWithWrongPermissionBitsCannotDeploy() (gas: 19808)\n[PASS] test_allEnabledCallbacksRejectNonManager() (gas: 175945)\n[PASS] test_constructorsRejectZeroConfiguration() (gas: 6033)\n[PASS] test_initializeAcceptsPolicyPoolAndReturnsSelector() (gas: 23762)\n[PASS] test_initializeRejectsOtherPools() (gas: 140022)\n[PASS] test_invalidAmountBoundsRejectedBeforeNegation() (gas: 134592)\n[PASS] test_noOwnerAdminSettersMintOrUpgradeFunctions() (gas: 269100)\n[PASS] test_permissionsExactlyMatchDeploymentBits() (gas: 35702)\n[PASS] test_runtimeHasNoUpgradeOrDestructionOpcodes() (gas: 5277096)\n[PASS] test_saltMinerDeploysReviewedBytecodeEvenBeforeDependenciesHaveCode() (gas: 16940438)\n[PASS] test_swapCallbacksAlsoRejectWrongPool() (gas: 74272)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 652.76ms (36.26ms CPU time)\n\nRan 4 tests for test/CrownDifferential.t.sol:CrownDifferentialTest\n[PASS] testFuzz_allModesMatchUnhookedPool(uint96,uint8) (runs: 1000, μ: 709374, ~: 711283)\nLogs:\n  Bound result 500000000000000000\n\n[PASS] testFuzz_alternatingModesDoNotAccumulatePreviewFees(uint96[8],uint16) (runs: 1000, μ: 5615968, ~: 5622006)\nLogs:\n  Bound result 29\n  Bound result 897850692\n  Bound result 1\n  Bound result 4264337593543950334\n  Bound result 1358621679448886202\n  Bound result 27767207000126943\n  Bound result 3\n  Bound result 49827933\n\n[PASS] testFuzz_priceLimitedTradesMatchUnhookedPool(uint96,uint16,uint8) (runs: 1000, μ: 721351, ~: 713875)\nLogs:\n  Bound result 99100000000000000001\n  Bound result 35\n\n[PASS] test_roundingEdgesInEveryMode() (gas: 28672127)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 655.10ms (1.97s CPU time)\n\nRan 1 test for test/CrownInvariant.t.sol:CrownInvariantTest\n[PASS]\nCrownInvariantTest invariants:\n[PASS] invariant_accountedETHIsBackedAndNeverOverpaid\n[PASS] invariant_everyDayMatchesIndependentLedger\n CrownInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------+----------+-------+---------+----------╮\n| Contract    | Selector | Calls | Reverts | Discards |\n+=====================================================+\n| GameHandler | advance  | 2047  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| GameHandler | claim    | 2035  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| GameHandler | rollover | 2070  | 0       | 0        |\n|-------------+----------+-------+---------+----------|\n| GameHandler | trade    | 2040  | 0       | 0        |\n╰-------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 127\n  Bound result 1000\n  Bound result 97\n  Bound result 999999999900006958\n  Bound result 37257\n  Bound result 100000000000000000\n  Bound result 1000000000000000000\n  Bound result 101\n  Bound result 3\n  Bound result 18516\n  Bound result 56354675830\n  Bound result 98\n  Bound result 107\n  Bound result 6713\n  Bound result 2\n  Bound result 1000000000000000000\n  Bound result 500000000000000000\n  Bound result 100000002\n  Bound result 1000000000000000000\n  Bound result 86\n  Bound result 3643\n  Bound result 32\n  Bound result 434473543160919604\n  Bound result 932121624990153589\n  Bound result 510\n  Bound result 1\n  Bound result 5217\n  Bound result 999999999912643629\n  Bound result 17871\n  Bound result 26008\n  Bound result 999999999900007998\n  Bound result 16893\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.18s (2.14s CPU time)\n\nRan 2 tests for test/CrownAdversarialInvariant.t.sol:CrownAdversarialInvariantTest\n[PASS]\nCrownAdversarialInvariantTest invariants:\n[PASS] invariant_accountedETHIsBackedAndNeverOverpaid\n[PASS] invariant_everyDayMatchesIndependentLedger\n[PASS] invariant_fixedSupplyAndAllTokenBalancesAreConserved\n CrownAdversarialInvariantTest invariants (runs: 256, calls: 20480, reverts: 0)\n\n╭------------------------+-----------------+-------+---------+----------╮\n| Contract               | Selector        | Calls | Reverts | Discards |\n+=======================================================================+\n| AdversarialGameHandler | advance         | 3343  | 0       | 0        |\n|------------------------+-----------------+-------+---------+----------|\n| AdversarialGameHandler | attemptClaim    | 3359  | 0       | 0        |\n|------------------------+-----------------+-------+---------+----------|\n| AdversarialGameHandler | attemptRollover | 3519  | 0       | 0        |\n|------------------------+-----------------+-------+---------+----------|\n| AdversarialGameHandler | flashTrade      | 3484  | 0       | 0        |\n|------------------------+-----------------+-------+---------+----------|\n| AdversarialGameHandler | redeem          | 3321  | 0       | 0        |\n|------------------------+-----------------+-------+---------+----------|\n| AdversarialGameHandler | trade           | 3454  | 0       | 0        |\n╰------------------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000000000\n  Bound result 500000000000000000\n  Bound result 1000000000000000000\n  Bound result 16979\n  Bound result 1000000000000000000\n  Bound result 86\n  Bound result 96\n  Bound result 208\n  Bound result 100000000000000000\n  Bound result 100000000000000000\n  Bound result 187153766515787812\n  Bound result 2048\n  Bound result 999999999900003694\n  Bound result 96\n  Bound result 1025222066\n  Bound result 131847453264458733\n  Bound result 489113095383050574\n  Bound result 100000000000000000\n  Bound result 500000000000000000\n  Bound result 500000000000000000\n  Bound result 20814\n  Bound result 500000000000000000\n  Bound result 1238136576\n  Bound result 16384\n  Bound result 4096\n  Bound result 100000000000000000\n  Bound result 1000000000000000000\n  Bound result 100000000000000000\n  Bound result 4308\n  Bound result 11096\n  Bound result 17027\n  Bound result 3757\n  Bound result 48\n  Bound result 111813333\n  Bound result 100000000000000000\n  Bound result 999999999900000812\n  Bound result 500000000000000000\n  Bound result 611686018827387901\n  Bound result 17856\n  Bound result 259200\n  Bound result 1000000000000000000\n  Bound result 100000000000000000\n  Bound result 999999999900003846\n  Bound result 100000000000000000\n  Bound result 999999999900005088\n  Bound result 13768\n  Bound result 3146555\n  Bound result 554191095771\n  Bound result 30837\n  Bound result 728512181915893309\n  Bound result 100000000000000000\n  Bound result 141593\n  Bound result 1000000000000000000\n\n[PASS] test_handlerExercisesDeferredFeesFailuresAndSuccessfulFinalization() (gas: 3350923)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 500000000000000000\n  Bound result 100000000000000000\n  Bound result 1000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.96s (6.94s CPU time)\n\nRan 8 test suites in 6.96s (11.99s CPU time): 73 tests passed, 0 failed, 0 skipped (73 total tests)\n","passed":true},{"durationMs":58,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Crown.approve(address,uint256)\",\"Crown.transfer(address,uint256)\",\"Crown.transferFrom(address,address,uint256)\",\"CrownHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"CrownHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"CrownHook.claim(uint256)\",\"CrownHook.quoteSwap((address,address,uint24,int24,address),(bool,int256,uint160))\",\"CrownHook.receive()\",\"CrownHook.redeemFees()\",\"CrownHook.rollover(uint256)\",\"CrownHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":34,\"DEPENDENCIES.md\":14,\"LICENSE\":23,\"README.md\":129,\"SECURITY.md\":57,\"foundry.toml\":22,\"remappings.txt\":4,\"script/MineSalt.s.sol\":29,\"src/Crown.sol\":13,\"src/CrownHook.sol\":309,\"src/HookFlags.sol\":32,\"test/Crown.t.sol\":73,\"test/CrownAccess.t.sol\":176,\"test/CrownAdversarial.t.sol\":250,\"test/CrownAdversarialInvariant.t.sol\":265,\"test/CrownDifferential.t.sol\":117,\"test/CrownFees.t.sol\":300,\"test/CrownGame.t.sol\":320,\"test/CrownInvariant.t.sol\":170,\"test/README.md\":68,\"test/helpers/CrownFixture.sol\":138,\"test/helpers/FlashAccountingRouter.sol\":84,\"test/helpers/PayoutReceivers.sol\":45,\"test/helpers/PoolRouter.sol\":125},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"aac3e207f4df610e4947f9075ad729a34317e4169efa2308bcb4f7e732973553","verifiedTreeHash":"23c103035a47121e307197e8c0c1f4b184b1cae3","verifierVersion":"0.1.0+560ab6a2"}]}