{"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":"ba9d232e-9213-459b-963d-811773f73376","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"cdeb6f1db3e9a7c9003cd0a2bb87568f5be2c49e9c9b9717c28180789103bf35","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":"1cc7070c027aa5dece31e7b4401c2b75f519cb3eba6af5eb42d1dbf148184995","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":"417399a1c1412e9c61474843e6631eb62c8f7c2d2eef612f029927c862f49f1e","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":"e7197aaba6ba0e499a153a5724ec178aaa13d296fc0c473495c6e61a3c51d86a","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":"f123d0e349a9dc18e0908fed20df8d31e6e2ee7e16e5b7499523ea8c750b0d81","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":"28020b1c70a9337f8f1fb7bc09a72e0f69ab886b74c34f83f0a8364850d4fdd9","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":"e41bcd82b409b80bc798783e8e5bed86f3b8458dfdec5a248f4a2da24256edbc","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"447d0df02fa14b3ec8ae2fd2b8892d687ab0adb75c40a5297d3b5a80755a3bf6","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":"Launch DAEMON (DAEMON) on Ethereum, paired with native ETH, using the standard fixed 1,000,000,000 supply, 18 decimals and plain transfers. Use economics.poolBps=8300 and exact economics.remainderTo=0x5ed4ecc313a55d72842c5b3abbaa0c67f0fb0334, an existing deployed immutable 9:3:2 allocation router; do not redeploy or substitute it. Keep the standard 10% swarm allocation. The hook charges ZERO additional fees, always returns zero swap deltas and no LP fee override. No hook fee recipient, treasury deployment, fee claims, fee setter, transfer tax, extra mint, pause, game, backend signer, oracle, NFT eligibility or season. It validates initialization by the factory for the DAEMON/native ETH pool and restricts callbacks to PoolManager and that initialized pool. Owner cannot enable an extra fee later. Preserve standard platform LP fee only. After launch, the actual current requester must call the factory setRequester(launchNumber,0x81e5b64e1bc3d9ae681812d516953f05b1b964b2) to direct its ENTIRE creator fee share to that approved community/NFT purchase wallet; never GameRewards or the allocation router. This required wallet authorization is separate from the token owner and cannot be executed by someone else. Fee collection sends ETH and/or token fees without automatic conversion to imdUSD. No automatic NFT purchase/distribution. Defer signed artwork NFT and auction. Logo https://imdfamily.com/daemon-seated-pepe.webp. Explicitly report initial cap, standard LP fee and recipient authorization requirement.","parentJobId":null,"planHash":"0d37f44d0eff047fda0f5b5baab31ff4b329bf5d562d1bfc5b6ff66bd662c1df","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"ba9d232e-9213-459b-963d-811773f73376","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2335-launch-daemon-daemon-ethereum"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51507","feedbackHash":"cc8c19c823765d5559e5650cc587340a7cf37b3db5233429a9353cfd64f4663a","nodeKey":"audit_economics","submissionHash":"cdeb6f1db3e9a7c9003cd0a2bb87568f5be2c49e9c9b9717c28180789103bf35","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52675","feedbackHash":"b3fed817c4e24dd7548ba038a67dfca517a73584cfc2524467663158c3a237a3","nodeKey":"audit_flow","submissionHash":"1cc7070c027aa5dece31e7b4401c2b75f519cb3eba6af5eb42d1dbf148184995","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50988","feedbackHash":"4f803ce9542b85c3d20519ce077024d35a7a41598ca07c9c4ac67fecb5c66fe5","nodeKey":"audit_judge","submissionHash":"417399a1c1412e9c61474843e6631eb62c8f7c2d2eef612f029927c862f49f1e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52167","feedbackHash":"3e545f8f13b2938f11b6190023347d29e24d0d29d329ad4a537abb8a1e74dc15","nodeKey":"audit_math","submissionHash":"e7197aaba6ba0e499a153a5724ec178aaa13d296fc0c473495c6e61a3c51d86a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51070","feedbackHash":"16ae771734f03f5101c3ec15bd3a8e131f50a73a0a0a623927873bca356a4ec3","nodeKey":"audit_permissions","submissionHash":"f123d0e349a9dc18e0908fed20df8d31e6e2ee7e16e5b7499523ea8c750b0d81","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52641","feedbackHash":"772cdf6048087359b2c4503e7fd681626016da1f978fa4d0d6ad064bdce16e49","nodeKey":"build_contract_project","submissionHash":"28020b1c70a9337f8f1fb7bc09a72e0f69ab886b74c34f83f0a8364850d4fdd9","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51420","feedbackHash":"252fb484048adce6f7ea5c9c9de1904af1cebf651dc0007afd08212f68689394","nodeKey":"manifest","submissionHash":"e41bcd82b409b80bc798783e8e5bed86f3b8458dfdec5a248f4a2da24256edbc","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51142","feedbackHash":"3d9d559267ef833a5af5265b204ccc794d1c372cae6a49628bcccdfabde66491","nodeKey":"write_foundry_tests","submissionHash":"447d0df02fa14b3ec8ae2fd2b8892d687ab0adb75c40a5297d3b5a80755a3bf6","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"7770fd8c66a16ac935f1ac4d291e43f165212330fd73f0f32955a0a91780136a","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"382ebcfad965e0cd","findings":[],"hash":"1cc7070c027aa5dece31e7b4401c2b75f519cb3eba6af5eb42d1dbf148184995","nodeId":"ee1d44de-34ad-405e-8a2a-e71983870f7c","outcome":"completed","summary":"I found no defects I could back up with evidence, and I wrote `.imd-findings.json` with an empty findings list. I didn't run any tests or write any proof files. The conclusions come from reading `src/DaemonHook.sol`, `src/DaemonToken.sol` and the README.\n\n**Hook (`src/DaemonHook.sol`):**\n- **Initialization:** `beforeInitialize` only accepts calls from the PoolManager, with the factory as the sender. It works once, and only for the native ETH / DAEMON pool at fee 12500 and tick spacing 60. It returns the correct selector.\n- **Swaps:** `beforeSwap` and `afterSwap` only accept calls from the PoolManager about that one initialized pool. They return zero deltas and no LP fee override.\n- **No extra fees, ever:** the hook has no fee logic, recipient, treasury, claim, pause or setter. None of the delta-returning permissions are enabled, so the PoolManager would ignore a delta even if one were returned.\n- **Owner:** the owner (from the inherited `Ownable`) controls nothing. So `transferOwnership` and `renounceOwnership` can't turn on a fee or block anything. Aderyn's centralization-risk warning doesn't apply.\n- **Fee collection:** the hook declares no liquidity callbacks, so the factory's zero-liquidity fee collection always goes through.\n\n**Token (`src/DaemonToken.sol`):** it's a plain OpenZeppelin ERC-20 with 1,000,000,000 tokens at 18 decimals, minted once to the deployer. There's no tax, extra mint or owner. Aderyn's large-numeric-literal warning is just the supply constant and isn't a problem.\n\n**The three things you asked me to report:**\n- **Initial cap:** the README says the launch policy opens the pool at a 10 ETH cap for the whole supply. I didn't check that against the launch policy.\n- **LP fee:** the standard 12500 (1.25%). It's the only fee the hook accepts, and nothing is added on top.\n- **Recipient authorization:** after launch, the actual current requester must call `setRequester(launchNumber, 0x81e5b64e1bc3d9ae681812d516953f05b1b964b2)` on the factory. That happens outside these contracts and nobody else can do it for them. The README documents it.\n\n**Not checked:** there is no launch.json in the repo, so I couldn't check the manifest. I also didn't verify the factory's own behaviour, including `setRequester` and how the 8300 pool share and remainder to the 9:3:2 router are applied.\n\n**Coverage:** all six entry points are marked \"holds\". I added two extra rows for the zero-delta swap invariant and for fee collection not being blocked.","treeHash":null,"usage":{"cachedInputTokens":174569,"inputTokens":8,"model":"claude-opus-5-5","outputTokens":2057,"runtime":"claude","turns":4,"wallClockMs":23435}},{"artifacts":[],"attempt":1,"bundleHash":"bd77dea5f0395b63f7b0ea7fbafa05b5f853e53732d4fc7cd0571ffd3471383c","device":"803eeae3d8b63de3","findings":[],"hash":"28020b1c70a9337f8f1fb7bc09a72e0f69ab886b74c34f83f0a8364850d4fdd9","nodeId":"78378543-8fba-4d01-9159-fb4c0f31d1ef","outcome":"completed","summary":"The work is complete and verified. Here is the recap.\n\n**Outcome.** The DAEMON launch is implemented as a Foundry project at the repository root: a standard fixed-supply token and a zero-fee Uniswap v4 hook, with 35 passing tests, a clean build, and a passing format check. Checks ran with the verifier's fuzz seed. Slither was not available on this machine and did not run.\n\n| Check | Result |\n| --- | --- |\n| forge build (solc 0.8.26, cancun, bytecode_hash none) | success |\n| forge test --fuzz-seed 0xd2dc… | 35 passed, 0 failed |\n| forge fmt --check | clean |\n\n**What was built**\n\n- `src/DaemonToken.sol` is a plain OpenZeppelin v5 ERC-20 named DAEMON, 1,000,000,000 tokens at 18 decimals, minted once to the deploying factory. No owner, mint, pause, blocklist, tax or upgrade path.\n- `src/DaemonHook.sol` takes the PoolManager, factory, token and owner as constructor arguments, written in the manifest as $poolManager, $factory, $token and $owner. It declares beforeInitialize, beforeSwap and afterSwap only. Initialization is accepted once, from the factory, for native ETH against DAEMON at fee 12500 and spacing 60. Swap callbacks verify the caller and the pool id and return zero deltas with no LP fee override. No return-delta bit is set, there are no liquidity callbacks, no receive function, no fee path, and the owner has no privileged function, so an extra fee can never be enabled.\n- Tests cover factory initialization, refusal of other senders, pairs, tokens, fees and spacings, caller checks on every callback, swaps in all four shapes matched against a hookless twin pool, a buy on a manager holding no ETH, LP fee accrual and the factory's zero-liquidity collect, the absent admin surface, and an opcode scan for proxies and self-destruct.\n- Dependencies are vendored as plain files under `lib/`, trimmed to what the project imports, with licenses kept. Two leftover nested `.gitmodules` text files could not be deleted in this sandbox and are excluded by `.gitignore`. No submodule exists.\n\n**Facts the brief asked to report explicitly**\n\n- Initial cap: the policy opens the pool at 10 ETH for the whole supply. The deployer derives the opening price at launch.\n- Standard LP fee: 12500, or 1.25%, which the hook requires at initialization and adds nothing to.\n- Recipient authorization: after launch the current requester must themselves call `setRequester(launchNumber, 0x81e5b64e1bc3d9ae681812d516953f05b1b964b2)` on the factory. Nothing in these contracts can do it and nobody else may.\n\n**Documentation.** `README.md` records every constructor argument and manifest value, the economics (poolBps 8300, remainder to the existing allocation router, 10% swarm), the hook configuration record, which callbacks were added and why, the after-launch steps, assumptions, and the security review notes.\n\n**Not done, by design.** No launch.json was written, no deploy script was added since the IMD factory deploys both contracts, and no memory note could be saved because the memory directory is denied in this session.","treeHash":"4a59db398b14c700c9b3d1bb84f79d71a8d3b0dd","usage":{"cachedInputTokens":4508818,"inputTokens":1218,"model":"claude-fable-5-1","outputTokens":67488,"runtime":"claude","turns":116,"wallClockMs":996935}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa2b0b9c7ebc1547","findings":[{"citation":"resolved","description":"Merged from the three specialist reports (audit_permissions, audit_economics, audit_math), which all describe the same coupling and all rated it info / not a defect. beforeInitialize accepts exactly one (fee, tickSpacing) pair, LP_FEE = 12_500 (src/DaemonHook.sol:39) and TICK_SPACING = 60 (src/DaemonHook.sol:42), and refuses anything else, as the brief asks (standard platform LP fee only, factory-opened DAEMON/native ETH pool). The specialists wrote when no launch.json was in the tree. It is in the tree now: launch.json writes pool.fee 12500, pool.tickSpacing 60, pool.pairedCurrency 0x0, hook.constructorArgs [\"$poolManager\",\"$factory\",\"$token\",\"$owner\"] in the constructor's declaration order (poolManager_, factory_, token_, owner_ at src/DaemonHook.sol:78), and permissions [beforeInitialize, beforeSwap, afterSwap] matching getHookPermissions (src/DaemonHook.sol:89-106). So the coupling resolves consistently and the launch can open. Recorded only so the manifest is not changed to another spacing later without changing TICK_SPACING (a constant, not a constructor argument). Not a code defect; nothing to fix.","line":131,"path":"src/DaemonHook.sol","reproduction":"Reproduced with test/scratch/JudgeProbe.t.sol::test_leadTickSpacingCoupling on a fresh PoolManager: DaemonHook deployed by CREATE2 from the factory address with (manager, factory, token, owner). Input 1: factory calls PoolManager.initialize(PoolKey{currency0: 0x0, currency1: DAEMON, fee: 12500, tickSpacing: 200, hooks: hook}, 792281625142643375935439503360000). Expected (per the brief): refused. Actual: reverts (WrongTickSpacing(200) wrapped by the PoolManager's HookCallFailed), hook.initialized() stays false. Input 2: same call with tickSpacing 60, the manifest's value. Actual: pool opens, hook.initialized() == true, hook.poolId() == key.toId(), slot0 sqrtPriceX96 == the given price and lpFee == 12500. Fee 0, the dynamic-fee flag 0x800000, a non-ETH currency0 and a foreign currency1 are each refused with WrongFee/NotNativePair/WrongToken (test_beforeInitializeGuards, passes).","severity":"info","snippet":"        if (key.tickSpacing != TICK_SPACING) revert WrongTickSpacing(key.tickSpacing);","title":"Hook hard-codes the pool shape (fee 12500, tickSpacing 60); the manifest now in the tree matches it, so no action is needed"}],"hash":"417399a1c1412e9c61474843e6631eb62c8f7c2d2eef612f029927c862f49f1e","nodeId":"c326ea21-8f76-45a9-946f-bfb824889b64","outcome":"completed","summary":"The review is complete. The findings record is written at `.imd-findings.json`, the JSON parses, the quoted snippet matches line 131 of the hook, and the working tree shows no tracked changes (the findings file and `test/scratch/` are ignored).\n\n**Outcome: no defects found.** The DAEMON launch code does what the brief asks, and the panel's only reports were three copies of one informational note.\n\n**What I did with the specialists' findings**\n\n- The three info reports (permissions, economics, math) all describe the same thing: the hook hard-codes fee 12500 and tick spacing 60, so a manifest with any other spacing would make the factory's initialize revert. I merged them into one info finding and reproduced it on a fresh PoolManager. Spacing 200 is refused and the hook stays uninitialized. Spacing 60 opens the pool with the LP fee recorded as 12500.\n- The specialists wrote before launch.json existed. It is in the tree now and writes fee 12500, tickSpacing 60, native ETH as the pair, constructor arguments in declaration order, and permissions matching getHookPermissions. So the coupling resolves consistently and there is nothing to fix.\n- The tester, flow auditor, and static analyzers reported nothing. The aderyn centralization and large-literal leads are the intended powerless owner and the brief's fixed supply.\n\n**My own pass**\n\n- All six entry points hold. The initialize guard chain, both owner functions, and the three token functions were each traced and exercised in a scratch suite of five tests, all passing.\n- Swap callbacks are view, PoolManager-only, pool-key-bound, and return zero deltas with no fee override. A buy and sell on a manager holding no ETH, seeded with tokens only, leaves the hook with no ETH, tokens, or claims.\n- No liquidity callbacks exist, so the factory's zero-liquidity fee collect cannot be blocked. Bytecode is far under the deployment limits and the constructor needs only manifest placeholders.\n- The existing 51-test suite passes with the verifier's fuzz seed.\n\n**Two items I could not verify from the inputs given to me** are the README's stated 10 ETH opening cap and the specific owner address it names for `$owner`. Both come from launch facts outside this task. Neither affects the code, and the manifest uses the placeholder, so I recorded them in coverage rather than as findings.","treeHash":null,"usage":{"cachedInputTokens":1067290,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":21543,"runtime":"claude","turns":29,"wallClockMs":291465}},{"artifacts":[],"attempt":1,"bundleHash":"a6575c955e30786f225167ea710bbb6b9bb0e6d46884245efbd80ee36dfdc541","device":"e57a8e639cccfbab","findings":[],"hash":"447d0df02fa14b3ec8ae2fd2b8892d687ab0adb75c40a5297d3b5a80755a3bf6","nodeId":"6b1bc3b6-4683-4b50-b997-84d96d007f4d","outcome":"completed","summary":"I added three test files. `forge build` succeeds, and `forge test` with the verifier's fuzz seed passes all 51 tests (35 already in the repo plus my additions). I found no defects in `DaemonHook` or `DaemonToken`, so I did not write `.imd-findings.json`. Only those three new files under `test/` are changed.\n\n**`test/invariant/DaemonHookInvariant.t.sol`**: random call sequences against the real launch pool. The factory opens and seeds the DAEMON/ETH pool on a locally deployed PoolManager. Next to it is an identical pool with no hook. A handler runs each random action on both pools: exact-input and exact-output swaps, adding and removing liquidity on four price ranges, donations, and the factory's fee collect. Between these it makes calls that must fail: calling the hook's callbacks directly, strangers or the owner opening a pool on this hook, the factory opening a second pool, and the owner trying fee, pause and claim functions. After every call these must hold:\n- The hook never holds ETH, DAEMON or a PoolManager balance claim on either.\n- Every trade and liquidity change on the launch pool gives the same result as on the hookless pool, and the two pools' price, tick and liquidity stay equal.\n- The LP fee stays at 12500 and the protocol fee at 0.\n- The factory's zero-liquidity fee collect never reverts and pays exactly what it reports.\n- No unauthorized call ever succeeds.\n- The recorded pool, the owner and the DAEMON supply never change.\n\nThe run made 2,560 calls, none of which reverted unexpectedly.\n\n**`test/invariant/DaemonTokenInvariant.t.sol`**: transfers, approvals and `transferFrom` among five holders, plus attempts to spend more than a balance or an allowance. The supply stays at exactly 1,000,000,000 and the holders always own all of it. Every transfer moves exactly the amount asked, every overspend reverts, and allowances match what was approved and spent.\n\n**`test/DaemonHookEdges.t.sol`**: failure paths, fuzzed over wide inputs:\n- **Opening the pool:** it reverts for any sender other than the factory, any fee other than 12500, any tick spacing other than 60, any token other than DAEMON, and any pair without native ETH. A second open is refused, even by the factory and even with a different key. A refused attempt doesn't stop the factory opening the pool afterwards.\n- **Callers and pools:** the swap callbacks refuse any caller other than the PoolManager, and any pool other than the launch pool in any field. No trade or liquidity is possible before the factory opens the pool.\n- **Trades and owner:** extra data passed with a swap never changes the trade. After the owner gives up ownership, trades and the factory's fee collect work exactly as before.\n- **Opening price:** a test reads the price from the pool and checks the figures below.\n\n**The three things you asked to have reported:**\n- **Initial market cap:** 10 ETH for the whole 1,000,000,000 supply, i.e. 100,000,000 DAEMON per ETH. The test reads this from the opened pool's price.\n- **Standard LP fee:** 12500 (1.25%), tick spacing 60, and no hook fee on top. The hook accepts no other fee and no dynamic fee.\n- **Recipient authorization:** after launch, the current requester must call `setRequester(launchNumber, 0x81e5b64e1bc3d9ae681812d516953f05b1b964b2)` on the launch factory. That sends the entire creator fee share to that wallet. No one else can make this call, and nothing in these contracts does it, so it isn't covered by these tests.\n\nThe pool-split values (83% to the pool, 10% swarm, 7% to `0x5ed4ecc313a55d72842c5b3abbaa0c67f0fb0334`) are set by the launch configuration and the factory, not by this repository's contracts, so these tests don't cover them.\n\nOne thing to check: the hook only accepts tick spacing 60. If the launch configuration uses any other spacing, the launch will revert when the pool is opened. The README says the configuration uses 60.","treeHash":"58f2cc41a70dbe3d727e581f411e3198d0a00d00","usage":{"cachedInputTokens":1653189,"inputTokens":40,"model":"claude-opus-5-5","outputTokens":31519,"runtime":"claude","turns":22,"wallClockMs":402605}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2dc755dfe7bd177c","findings":[{"citation":"resolved","description":"Not a code defect: the hook intentionally hard-codes LP_FEE = 12_500 and TICK_SPACING = 60 and refuses any other pool, which is what the brief asks (standard platform LP fee only, factory-initialized DAEMON/ETH pool). It is recorded so the judge can hold the manifest step to it, because the repository contains no launch.json yet and nothing a worker runs validates one. If the manifest's pool.tickSpacing (or pool.fee) differs from the constants, or hook.constructorArgs are not in the declaration order (poolManager_, factory_, token_, owner_), the factory's single launch transaction reverts in beforeInitialize (or the constructor's ZeroAddress/OwnableInvalidOwner check) and the launch cannot open. The README documents 12500/60 and the argument order, so the expected manifest is consistent; this row only names the coupling.","line":131,"path":"src/DaemonHook.sol","reproduction":"State: hook deployed by the factory with the arguments above. Call: factory -> PoolManager.initialize(PoolKey{currency0: 0x0, currency1: DAEMON, fee: 12500, tickSpacing: 200, hooks: hook}, anyPrice). Expected per brief: the launch pool opens only at the policy's 12500/60. Actual: beforeInitialize reverts WrongTickSpacing(200) wrapped in HookCallFailed, the whole launch transaction reverts. Same with fee 3000 (WrongFee(3000)) or fee 0x800000 (dynamic flag). With tickSpacing 60 and fee 12500 (test/DaemonHook.t.sol test_factoryInitializesTheLaunchPool and the scratch probe at the 10 ETH opening price) the pool opens and records lpFee 12500.","severity":"info","snippet":"        if (key.tickSpacing != TICK_SPACING) revert WrongTickSpacing(key.tickSpacing);","title":"Launch depends on the manifest writing exactly fee 12500, tickSpacing 60 and constructor order ($poolManager,$factory,$token,$owner); no launch.json is in the tree to confirm it"}],"hash":"cdeb6f1db3e9a7c9003cd0a2bb87568f5be2c49e9c9b9717c28180789103bf35","nodeId":"4e694210-72e0-4fe7-87ae-8e811433dff1","outcome":"completed","summary":"The review is complete and the findings file is written. No defects were found in the economics, invariants or flow gaps of the DAEMON launch contracts.\n\n**What I checked**\n\n- Both contracts, the project tests, the four protected floor tests, and the v4-core code the hook relies on (initialize ordering, hook call parsing, delta handling).\n- The project suite builds and passes with the verifier's fuzz seed, 35 of 35 tests.\n- A scratch probe I wrote and then removed confirmed four invariants by execution: a front-run of the predicted pool address before the hook has code reverts, the hook's `initialized` flag rolls back if the manager reverts after the callback, a launch-shaped seed of 830M DAEMON below the opening tick on a manager holding no ETH accepts a 1 ETH buy and the factory's zero-liquidity collect pays out the 1.25% fee in ETH, and donations plus ownership renouncement change nothing.\n\n**Economic conclusions**\n\n- The hook charges nothing, returns zero deltas both sides, has no return-delta bits, holds no funds, and has no fee, pause, claim, setter or conversion path. The owner has no power to add one later.\n- The pool opens only at LP fee 12500 with tick spacing 60, initialized by the factory, for native ETH against DAEMON, once.\n- The token is a plain fixed-supply OpenZeppelin ERC-20 minted to the factory.\n\n**Report contents**\n\n- One info-level row only. It records that the launch depends on the manifest writing fee 12500, tick spacing 60 and the constructor order the hook declares, with the concrete revert if it does not. No launch.json exists in the tree yet, so this coupling cannot be confirmed now.\n- Coverage rows for all six listed entry points, all marked holds, plus four invariant rows that hold.\n- One row marked unreached for the economics that live outside the code: pool allocation, remainder router, swarm share, the setRequester authorization and the initial cap. The README states them consistently with the brief, but there is no manifest to verify.\n\nThe headline facts the brief asked to be reported are in the README: a 10 ETH opening cap for the full supply, the standard 1.25% LP fee with zero hook fee on top, and the requirement that the current requester alone call setRequester to the approved wallet after launch.","treeHash":null,"usage":{"cachedInputTokens":1214007,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":22098,"runtime":"claude","turns":28,"wallClockMs":321718}},{"artifacts":[],"attempt":1,"bundleHash":"24216e96dd4ce884a49fe2eeba5e5de2123ca4c2dd5bbe19d7a66db6f92cb029","device":"e382bd4d2b3e471f","findings":[],"hash":"e41bcd82b409b80bc798783e8e5bed86f3b8458dfdec5a248f4a2da24256edbc","nodeId":"cde153bd-5fba-401d-a9c5-6cb395d81a52","outcome":"completed","summary":"Done. `launch.json` is written at the repository root and is the only change in the working tree.\n\nWhat it describes:\n\n- **Hook** `DaemonHook` with constructor arguments `$poolManager`, `$factory`, `$token`, `$owner`, in the declaration order of `src/DaemonHook.sol:78`. Permissions are `beforeInitialize`, `beforeSwap`, `afterSwap`, exactly what `getHookPermissions` returns at `src/DaemonHook.sol:89`.\n- **Token** `DaemonToken`, name and symbol DAEMON, 18 decimals, no constructor arguments.\n- **Pool** native ETH as the zero address, fee 12500, tickSpacing 60, initialPrice as the launch facts give it.\n- **Notes** at 2639 characters, under the 4000 cap. They state the zero hook fee and zero deltas, the hook's factory-only initialization gate for the DAEMON/ETH pool at 12500/60, the PoolManager-only callbacks, and the owner's lack of any fee switch.\n\nReported explicitly in the notes, as the brief asked:\n\n- **Initial cap**: the launch policy opens the pool at 10 ETH for the whole supply. The deployer derives the opening price from that cap and the token's address, so the manifest's initialPrice is not the opening price.\n- **Standard LP fee**: 12500 (1.25%) is the pool's real LP fee, which the hook requires and the factory splits 80/20 between payer and network. The hook adds nothing.\n- **Recipient authorization requirement**: after launch the actual current requester must call `setRequester(launchNumber, 0x81e5b64e1bc3d9ae681812d516953f05b1b964b2)` on the factory. This directs the entire creator fee share to the community/NFT purchase wallet, never GameRewards or the allocation router. It is separate from the token owner and cannot be done by anyone else.\n- **Allocation**: 10% swarm, poolBps 8300, remainder 7% to the existing immutable 9:3:2 router at 0x5ed4ecc313a55d72842c5b3abbaa0c67f0fb0334, noted as factory policy rather than manifest fields.\n\nVerification: `forge build` compiled cleanly and `forge test` with the verifier's fuzz seed passed all 35 tests with none failed or skipped. The manifest parses as JSON with `kind` as its first key. No address stand-ins were needed, so no `.imd-blocked.json` was written.","treeHash":"a5531cd113d0a7223187aa136d54890e24399fc8","usage":{"cachedInputTokens":288568,"inputTokens":130,"model":"claude-fable-5-1","outputTokens":4379,"runtime":"claude","turns":13,"wallClockMs":73860}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1ca477e8d9b58040","findings":[{"citation":"resolved","description":"Boundary coupling, not a code error: beforeInitialize accepts exactly one (fee, tickSpacing) pair, 12500/60. The fee tier is the launch policy's (12500 on every chain), so that side is correct and `fee == 0` and the dynamic flag are rightly refused. The tick spacing, however, is not fixed by the policy text supplied with this task; it is whatever the manifest step writes into pool.tickSpacing and whatever the verifier's floor passes as IMD_TICK_SPACING. No launch.json exists in this tree yet, so there is no mismatch today, but if the manifest author writes any spacing other than 60 (e.g. the 10 that v4 commonly pairs with lower fees, or a policy default), PoolManager.initialize from the factory reverts with WrongTickSpacing and the launch cannot open; the protected floor test test_initializesFromTheLaunchFactory fails with the same input. The README documents 60 and the existing test test_initializationAtAnotherFeeOrSpacingReverts proves the refusal. Recorded so the manifest step writes pool.tickSpacing = 60 and pool.fee = 12500 exactly; no code change is required unless the policy's spacing differs, in which case TICK_SPACING must be changed before deployment (it is a constant, not a constructor argument).","line":131,"path":"src/DaemonHook.sol","reproduction":"State: DaemonHook deployed with factory F, token T, PoolManager PM. Call (from F) PM.initialize(PoolKey{currency0: 0x0, currency1: T, fee: 12500, tickSpacing: 10, hooks: hook}, 792281625142643375935439503360000). Expected by a manifest that names spacing 10: pool opens. Actual: revert wrapped WrongTickSpacing(10); hook.initialized() stays false. With tickSpacing 60 the same call succeeds (tick 184216 recorded, lpFee 12500). Reproduced by test_initializationAtAnotherFeeOrSpacingReverts in test/DaemonHook.t.sol and by a scratch run on this tree.","severity":"info","snippet":"        if (key.tickSpacing != TICK_SPACING) revert WrongTickSpacing(key.tickSpacing);","title":"Hook hard-codes tickSpacing 60 (and fee 12500); a manifest pool.tickSpacing other than 60 makes the launch revert in the factory's initialize"}],"hash":"e7197aaba6ba0e499a153a5724ec178aaa13d296fc0c473495c6e61a3c51d86a","nodeId":"b012aa01-105e-4140-97dc-74cf8f36e5a6","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written with one info-level finding and twelve coverage rows covering all six listed entry points.\n\n**Outcome: no math, boundary or numerical-gap defect found.** The hook contains no arithmetic, casts, divisions, external calls, payable paths or decoded bytes. The token is a byte-identical OpenZeppelin v5.4.0 ERC-20 with a correct supply literal. Every failure mode in the three assigned guides was checked and none applies with a failing input.\n\nWhat I verified, with concrete values:\n- **Supply literal** is exactly 1e9 × 1e18 with 18 decimals, minted once to the deployer. The aderyn large-literal lead is correct code.\n- **Constants against v4 bounds**: fee 12500 is valid and non-dynamic, spacing 60 is within range, and the pool's slot0 records lpFee 12500 and protocolFee 0 after initialize.\n- **Opening price** for the 10 ETH cap is about 7.9e32, inside the sqrt-price range at tick 184216. ETH is always currency0, so the price does not depend on the token's address.\n- **Extreme amounts** in a scratch test: seeding 83% of supply tokens-only needs liquidity of about 8.3e22, well inside uint128. A 1000 ETH buy followed by a full sell-back loses only LP fees. A 1 wei buy returns zero output through Uniswap's own rounding. The hook holds no ETH, token or claim after any of these.\n- **Zero-delta guarantee**: beforeSwap returns a 96-byte zero delta and zero override, afterSwap returns zero and has no return-delta bit, so trades equal a hookless twin pool.\n- **Library integrity**: all imported OpenZeppelin files are identical to upstream; the two v4-core diffs are `forge fmt` whitespace only.\n\nThe one recorded item is informational. The hook hard-codes tick spacing 60, so a manifest that writes any other `pool.tickSpacing` reverts the factory's initialize with `WrongTickSpacing`. No launch.json exists yet, so nothing fails today. The manifest step must write 60 and 12500 exactly.\n\nTwo things I could not verify from this tree, left as notes rather than findings: the README's 10 ETH opening cap is not stated in the brief and must come from the launch policy, and the owner address the README names as `$owner` is a manifest resolution the deployer performs. The requester-authorization step for `setRequester` is correctly described as a factory action outside these contracts.","treeHash":null,"usage":{"cachedInputTokens":1264155,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":22988,"runtime":"claude","turns":30,"wallClockMs":379868}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"89214b73ec1e0b7b","findings":[{"citation":"resolved","description":"Not a defect in the code as designed; recorded so the judge can cross-check the one launch input the contracts cannot see. The brief fixes the LP fee (12500, the platform tier) but names no tick spacing. DaemonHook.beforeInitialize accepts exactly fee 12500 and tickSpacing 60 (src/DaemonHook.sol:42,130-131). If launch.json / the launch policy opens the DAEMON/ETH pool at any other spacing, the factory's PoolManager.initialize reverts inside the hook with WrongTickSpacing and the launch cannot open; the hook is CREATE2-mined for this exact bytecode and cannot be re-pointed. No launch.json is in the tree yet. The README (line 18, 56, 155-157) states the assumption of 60. The reference's example manifest also uses 60, so the expected outcome is that this holds; if the manifest says 60 this item needs no action. Access-control-wise the restriction is correct and desirable (no other pool shape can ever attach to this hook).","line":131,"path":"src/DaemonHook.sol","reproduction":"Deploy DaemonHook via CREATE2 from the factory with (poolManager, factory, token, owner). Factory calls PoolManager.initialize(PoolKey{currency0: address(0), currency1: token, fee: 12500, tickSpacing: 200, hooks: hook}, sqrtPrice). Expected if the policy spacing were 200: pool opens. Actual: revert WrappedError(hook, beforeInitialize.selector, WrongTickSpacing(200), HookCallFailed); hook.initialized() stays false. Verified with test/scratch/AccessProbe.t.sol::test_factoryWithTickSpacingOtherThan60IsRefused (passes, i.e. the refusal is reproducible). With tickSpacing 60 the same call succeeds (test_predictedPoolCannotBeOpenedBeforeHookExists_andOnlyFactoryAfter).","severity":"info","snippet":"        if (key.tickSpacing != TICK_SPACING) revert WrongTickSpacing(key.tickSpacing);","title":"Hook hardcodes tickSpacing 60: a factory initialize at any other spacing is refused (assumption to confirm against the manifest)"}],"hash":"f123d0e349a9dc18e0908fed20df8d31e6e2ee7e16e5b7499523ea8c750b0d81","nodeId":"f0248cf1-847d-4612-abc7-e78a7d68bc99","outcome":"completed","summary":"The review is complete and the findings file is written and valid. Only the scratch test and the findings file were created, and neither is a tree change that is kept.\n\n**Outcome: no defects in the permissions area.** The access model of the DAEMON hook and token holds against the Access Control, Trust Gap and Asymmetry checklists. The file `.imd-findings.json` holds one info-level note and ten coverage rows, all six listed entry points answered as `holds`.\n\nWhat I verified, with concrete probes run under `test/scratch/`:\n\n- **Pool initialization is factory-only and once-only.** The PoolManager passes its own caller as `sender`, so the hook's factory check is sound. The predicted pool cannot be opened before the hook has code, because the PoolManager rejects an empty hook response. After deployment, strangers and the owner are refused, and a second initialization reverts.\n- **The owner has no power.** The only owner functions are the two OpenZeppelin ownership transfers. There is no fee setter, pause, claim, recipient, or liquidity callback. Renouncing or transferring ownership changes no behaviour, and the factory and launch wallet never become owner because the constructor takes the explicit owner argument.\n- **No value path exists.** No return-delta permission bit is set, the swap callbacks are view and return zero deltas, and the hook has no receive function. The factory's zero-liquidity fee collect never touches the hook since no liquidity callback bit is set.\n- **The token is a plain OpenZeppelin ERC-20** with a single constructor mint to the factory and no admin surface.\n\nThe one recorded item is informational. The hook hardcodes tick spacing 60 beside the fixed 12500 fee, and the brief names no spacing. If the launch manifest or policy opened the pool at a different spacing, the factory's initialize would revert and the launch could not open. The reference example and the README both use 60, so this is expected to hold. It is there so the judge can cross-check the manifest once it exists.\n\nTrust assumptions, documented rather than reported: the factory is trusted to open the pool at the standard fee with native ETH and to hold and collect the LP position. The requester wallet authorization through `setRequester` is a factory-side action that nothing in this tree can perform, block or redirect.","treeHash":null,"usage":{"cachedInputTokens":815193,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":14681,"runtime":"claude","turns":24,"wallClockMs":228290}}],"verification":[{"checks":[{"durationMs":2154,"exitCode":0,"name":"build","output":"Compiling 83 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.06s\nCompiler run successful!\n","passed":true},{"durationMs":177,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 9 tests for test/DaemonToken.t.sol:DaemonTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 81764, ~: 81615)\nLogs:\n  Bound result 1000000000000000000\n\n[PASS] test_metadata() (gas: 29173)\n[PASS] test_mintsTheWholeSupplyToTheDeployer() (gas: 20583)\n[PASS] test_noAdminEntryPointChangesSupplyOrBalances() (gas: 768333)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 958586)\n[PASS] test_transferFromRespectsAllowance() (gas: 203814)\n[PASS] test_transferMovesExactlyWhatItWasAsked() (gas: 152600)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 33184)\n[PASS] test_transferToZeroAddressReverts() (gas: 30446)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 3.41ms (7.04ms CPU time)\n\nRan 26 tests for test/DaemonHook.t.sol:DaemonHookTest\n[PASS] testFuzz_swapsNeverChangeTheTradeOrFundTheHook(uint96,bool) (runs: 256, μ: 1018679, ~: 1012358)\nLogs:\n  Bound result 9261844432785175014\n\n[PASS] test_anyoneCanAddAndRemoveLiquidity() (gas: 1025894)\n[PASS] test_beforeInitializeRefusesCallersOtherThanThePoolManager() (gas: 70823)\n[PASS] test_buyAndSellExactInputMatchAHooklessPoolAndLeaveTheHookEmpty() (gas: 1342613)\n[PASS] test_buyAndSellExactOutputMatchAHooklessPoolAndLeaveTheHookEmpty() (gas: 1355479)\n[PASS] test_constructorRecordsItsArgumentsAndOwner() (gas: 73140)\n[PASS] test_constructorRejectsZeroAddresses() (gas: 8280)\n[PASS] test_deploymentAtAnAddressWithOtherBitsReverts() (gas: 1006365)\n[PASS] test_factoryCanRemoveItsLiquidity() (gas: 482287)\n[PASS] test_factoryInitializesTheLaunchPool() (gas: 155338)\n[PASS] test_hookCannotReceiveEth() (gas: 33169)\n[PASS] test_initializationAtAnotherFeeOrSpacingReverts() (gas: 180061)\n[PASS] test_initializationFromAnyoneButTheFactoryReverts() (gas: 106681)\n[PASS] test_initializationOfAnotherPairReverts() (gas: 627762)\n[PASS] test_lpFeeAccruesToTheFactoryPositionAndCollectPassesThrough() (gas: 865231)\n[PASS] test_onlyOnePoolCanEverBeInitialized() (gas: 154518)\n[PASS] test_ownerHasNoFeeOrPauseEntryPoint() (gas: 1346974)\n[PASS] test_ownershipIsTransferableButPowerless() (gas: 111757)\n[PASS] test_permissionsMatchTheAddressBits() (gas: 12697)\n[PASS] test_runtimeCodeHasNoEscapeHatch() (gas: 2026085)\n[PASS] test_swapCallbacksRefuseAnyPoolButTheLaunchPool() (gas: 760684)\n[PASS] test_swapCallbacksRefuseCallersOtherThanThePoolManager() (gas: 727063)\n[PASS] test_swapCallbacksReturnZeroDeltaAndNoFeeOverride() (gas: 739335)\n[PASS] test_swapOnAPoolSeededWithTokensOnlyNeedsNoEthInTheManager() (gas: 535902)\n[PASS] test_swapsWorkAtTheLaunchOpeningPrice() (gas: 1009832)\n[PASS] test_undeclaredCallbacksRevert() (gas: 130150)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 73.86ms (83.94ms CPU time)\n\nRan 2 test suites in 74.79ms (77.27ms CPU time): 35 tests passed, 0 failed, 0 skipped (35 total tests)\n","passed":true},{"durationMs":46,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DaemonHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"DaemonHook.renounceOwnership()\",\"DaemonHook.transferOwnership(address)\",\"DaemonToken.approve(address,uint256)\",\"DaemonToken.transfer(address,uint256)\",\"DaemonToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":25,\"README.md\":218,\"foundry.toml\":20,\"remappings.txt\":4,\"src/DaemonHook.sol\":251,\"src/DaemonToken.sol\":20,\"test/DaemonHook.t.sol\":582,\"test/DaemonToken.t.sol\":137,\"test/utils/HookMiner.sol\":28,\"test/utils/LaunchFactoryMock.sol\":84,\"test/utils/MockERC20.sol\":11},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":998,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":302,"exitCode":0,"name":"aderyn","output":"[low] centralization-risk at src/DaemonHook.sol:34: Centralization Risk\n[low] large-numeric-literal at src/DaemonToken.sol:15: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"28020b1c70a9337f8f1fb7bc09a72e0f69ab886b74c34f83f0a8364850d4fdd9","verifiedTreeHash":"4a59db398b14c700c9b3d1bb84f79d71a8d3b0dd","verifierVersion":"0.1.0+a26ee00d"},{"checks":[{"durationMs":3713,"exitCode":0,"name":"build","output":"Compiling 87 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.60s\nCompiler run successful!\n","passed":true},{"durationMs":4498,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 9 tests for test/DaemonToken.t.sol:DaemonTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 81714, ~: 81627)\nLogs:\n  Bound result 3685301650135773379\n\n[PASS] test_metadata() (gas: 29173)\n[PASS] test_mintsTheWholeSupplyToTheDeployer() (gas: 20583)\n[PASS] test_noAdminEntryPointChangesSupplyOrBalances() (gas: 768333)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 958586)\n[PASS] test_transferFromRespectsAllowance() (gas: 203814)\n[PASS] test_transferMovesExactlyWhatItWasAsked() (gas: 152600)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 33184)\n[PASS] test_transferToZeroAddressReverts() (gas: 30446)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 5.22ms (9.16ms CPU time)\n\nRan 26 tests for test/DaemonHook.t.sol:DaemonHookTest\n[PASS] testFuzz_swapsNeverChangeTheTradeOrFundTheHook(uint96,bool) (runs: 256, μ: 1018679, ~: 1012358)\nLogs:\n  Bound result 18147360076901085899\n\n[PASS] test_anyoneCanAddAndRemoveLiquidity() (gas: 1025894)\n[PASS] test_beforeInitializeRefusesCallersOtherThanThePoolManager() (gas: 70823)\n[PASS] test_buyAndSellExactInputMatchAHooklessPoolAndLeaveTheHookEmpty() (gas: 1342613)\n[PASS] test_buyAndSellExactOutputMatchAHooklessPoolAndLeaveTheHookEmpty() (gas: 1355479)\n[PASS] test_constructorRecordsItsArgumentsAndOwner() (gas: 73140)\n[PASS] test_constructorRejectsZeroAddresses() (gas: 8280)\n[PASS] test_deploymentAtAnAddressWithOtherBitsReverts() (gas: 1006365)\n[PASS] test_factoryCanRemoveItsLiquidity() (gas: 482287)\n[PASS] test_factoryInitializesTheLaunchPool() (gas: 155338)\n[PASS] test_hookCannotReceiveEth() (gas: 33169)\n[PASS] test_initializationAtAnotherFeeOrSpacingReverts() (gas: 180061)\n[PASS] test_initializationFromAnyoneButTheFactoryReverts() (gas: 106681)\n[PASS] test_initializationOfAnotherPairReverts() (gas: 627762)\n[PASS] test_lpFeeAccruesToTheFactoryPositionAndCollectPassesThrough() (gas: 865231)\n[PASS] test_onlyOnePoolCanEverBeInitialized() (gas: 154518)\n[PASS] test_ownerHasNoFeeOrPauseEntryPoint() (gas: 1346974)\n[PASS] test_ownershipIsTransferableButPowerless() (gas: 111757)\n[PASS] test_permissionsMatchTheAddressBits() (gas: 12697)\n[PASS] test_runtimeCodeHasNoEscapeHatch() (gas: 2026085)\n[PASS] test_swapCallbacksRefuseAnyPoolButTheLaunchPool() (gas: 760684)\n[PASS] test_swapCallbacksRefuseCallersOtherThanThePoolManager() (gas: 727063)\n[PASS] test_swapCallbacksReturnZeroDeltaAndNoFeeOverride() (gas: 739335)\n[PASS] test_swapOnAPoolSeededWithTokensOnlyNeedsNoEthInTheManager() (gas: 535902)\n[PASS] test_swapsWorkAtTheLaunchOpeningPrice() (gas: 1009832)\n[PASS] test_undeclaredCallbacksRevert() (gas: 130150)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 77.88ms (89.46ms CPU time)\n\nRan 14 tests for test/DaemonHookEdges.t.sol:DaemonHookEdgesTest\n[PASS] testFuzz_factoryOpensThePoolAtAnyValidPrice(uint160) (runs: 256, μ: 151880, ~: 152014)\nLogs:\n  Bound result 1461446703485210103287273052203988822374428846848\n\n[PASS] testFuzz_hookDataNeverChangesATrade(bytes,uint96,bool) (runs: 256, μ: 997806, ~: 992410)\nLogs:\n  Bound result 1271978678399114575\n\n[PASS] testFuzz_initializationAgainstAnyOtherTokenReverts(address) (runs: 256, μ: 62545, ~: 62630)\n[PASS] testFuzz_initializationAtAnyOtherFeeReverts(uint24) (runs: 256, μ: 63747, ~: 63615)\nLogs:\n  Bound result 48168\n\n[PASS] testFuzz_initializationAtAnyOtherTickSpacingReverts(int24) (runs: 256, μ: 68128, ~: 68423)\nLogs:\n  Bound result 600\n\n[PASS] testFuzz_initializationFromAnySenderButTheFactoryReverts(address) (runs: 256, μ: 56042, ~: 56042)\n[PASS] testFuzz_swapCallbacksRefuseAnyCallerButTheManager(address,address,bool) (runs: 256, μ: 190407, ~: 190407)\n[PASS] testFuzz_swapCallbacksRefuseAnyKeyButTheLaunchPool(uint8,uint256) (runs: 256, μ: 164970, ~: 168072)\n[PASS] test_aRefusedAttemptDoesNotBlockTheFactory() (gas: 204539)\n[PASS] test_factoryCannotInitializeASecondTimeThroughTheManager() (gas: 211593)\n[PASS] test_initializationWithDaemonAsCurrency0Reverts() (gas: 53314)\n[PASS] test_noTradeOrLiquidityBeforeTheFactoryOpensThePool() (gas: 133936)\n[PASS] test_openingPriceIsTheReportedTenEthCap() (gas: 139514)\n[PASS] test_renouncedOwnershipChangesNothing() (gas: 1136885)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 94.15ms (225.15ms CPU time)\n\nRan 1 test for test/invariant/DaemonHookInvariant.t.sol:DaemonHookInvariantTest\n[PASS]\nDaemonHookInvariantTest invariants:\n[PASS] invariant_factoryCollectAlwaysPasses\n[PASS] invariant_hookNeverHoldsValue\n[PASS] invariant_launchPoolTracksTheHooklessTwinExactly\n[PASS] invariant_noUnauthorizedCallEverSucceeds\n[PASS] invariant_theOnePoolNeverChanges\n DaemonHookInvariantTest invariants (runs: 64, calls: 2560, reverts: 0)\n\n╭-------------------+-------------------------+-------+---------+----------╮\n| Contract          | Selector                | Calls | Reverts | Discards |\n+==========================================================================+\n| DaemonHookHandler | addLiquidity            | 263   | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| DaemonHookHandler | callCallbackDirectly    | 276   | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| DaemonHookHandler | donate                  | 325   | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| DaemonHookHandler | factoryCollect          | 289   | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| DaemonHookHandler | factoryInitializesAgain | 303   | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| DaemonHookHandler | ownerTriesToEnableAFee  | 247   | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| DaemonHookHandler | removeLiquidity         | 288   | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| DaemonHookHandler | strangerInitialize      | 277   | 0       | 0        |\n|-------------------+-------------------------+-------+---------+----------|\n| DaemonHookHandler | swap                    | 292   | 0       | 0        |\n╰-------------------+-------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10129\n  Bound result 4832\n  Bound result 1461446703485210103287273052203988822374428841845\n  Bound result 16400\n  Bound result 1915\n  Bound result 1000000000000000000\n  Bound result 86\n  Bound result 19224\n  Bound result 1461446703485210103287273052203988822374428858875\n  Bound result 218201\n  Bound result 17339\n  Bound result 1461446703485210103287273052203988822374428844319\n  Bound result 3430\n  Bound result 6696\n  Bound result 1000000000000000\n  Bound result 17858\n  Bound result 4657\n  Bound result 1461446703485210103287273052203988822374428842343\n  Bound result 5327\n  Bound result 2144\n  Bound result 4368\n  Bound result 12000\n  Bound result 54933845692814916411780512294197281503701372\n  Bound result 12500000000000000\n  Bound result 143\n  Bound result 285\n  Bound result 20000000000000000000\n  Bound result 4071\n  Bound result 1645\n  Bound result 1461446703485210103287273052203988822374428844032\n  Bound result 3000\n  Bound result 32167\n  Bound result 1461446703485210103287273052203988822374428893569\n  Bound result 0\n  Bound result 5694\n  Bound result 4295128740\n  Bound result 576090\n  Bound result 10\n  Bound result 1461446703485210103287273052203988822374428841608\n  Bound result 99999999999999007803\n  Bound result 100000\n  Bound result 999999000000000001\n  Bound result 19396\n  Bound result 67902\n  Bound result 777199\n  Bound result 12000\n  Bound result 1461446703485210103287273052203988822374428845475\n  Bound result 84217160767544122549\n  Bound result 57568\n  Bound result 999999999999000001\n  Bound result 719033050546\n  Bound result 999999999999999981\n  Bound result 2989\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 647.06ms (629.01ms CPU time)\n\nRan 1 test for test/invariant/DaemonTokenInvariant.t.sol:DaemonTokenInvariantTest\n[PASS]\nDaemonTokenInvariantTest invariants:\n[PASS] invariant_allowancesFollowTheModel\n[PASS] invariant_holdersOwnTheWholeSupply\n[PASS] invariant_supplyIsFixed\n[PASS] invariant_transfersMoveExactlyAndOverspendsFail\n DaemonTokenInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+--------------------+-------+---------+----------╮\n| Contract           | Selector           | Calls | Reverts | Discards |\n+======================================================================+\n| DaemonTokenHandler | approve            | 3264  | 0       | 0        |\n|--------------------+--------------------+-------+---------+----------|\n| DaemonTokenHandler | overspendAllowance | 3330  | 0       | 0        |\n|--------------------+--------------------+-------+---------+----------|\n| DaemonTokenHandler | overspendBalance   | 3204  | 0       | 0        |\n|--------------------+--------------------+-------+---------+----------|\n| DaemonTokenHandler | transfer           | 3259  | 0       | 0        |\n|--------------------+--------------------+-------+---------+----------|\n| DaemonTokenHandler | transferFrom       | 3327  | 0       | 0        |\n╰--------------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 244\n  Bound result 1070\n  Bound result 710051325\n  Bound result 243\n  Bound result 8360\n  Bound result 0\n  Bound result 8013\n  Bound result 300874099995878916785925491003390478627\n  Bound result 999999999999999999999999001\n  Bound result 47825\n  Bound result 11908472073416477338179115\n  Bound result 86\n  Bound result 8258\n  Bound result 62500000000000000000008358\n  Bound result 0\n  Bound result 0\n  Bound result 256\n  Bound result 0\n  Bound result 1000000000000000000000000000\n  Bound result 4969\n  Bound result 0\n  Bound result 3131\n  Bound result 2167\n  Bound result 58546670099955605923138087\n  Bound result 4294967296\n  Bound result 2478893113\n  Bound result 12\n  Bound result 0\n  Bound result 0\n  Bound result 100000000000000000000\n  Bound result 3852\n  Bound result 100000000000000000000\n  Bound result 16\n  Bound result 254\n  Bound result 662756624688346981332735881555844055\n  Bound result 0\n  Bound result 2827\n  Bound result 271\n  Bound result 1023\n  Bound result 6\n  Bound result 86\n  Bound result 826074472\n  Bound result 27757\n  Bound result 20000000000000000000\n  Bound result 157\n  Bound result 12333\n  Bound result 6588\n  Bound result 0\n  Bound result 100000000000000000000000000\n  Bound result 342655366582113269032531174\n  Bound result 987500000000000000000000\n  Bound result 1000000\n  Bound result 3601\n  Bound result 931\n  Bound result 16\n  Bound result 726344047988430355\n  Bound result 763600052\n  Bound result 5322\n  Bound result 408\n  Bound result 6000\n  Bound result 14\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.37s (4.37s CPU time)\n\nRan 5 test suites in 4.38s (5.19s CPU time): 51 tests passed, 0 failed, 0 skipped (51 total tests)\n","passed":true},{"durationMs":66,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DaemonHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"DaemonHook.renounceOwnership()\",\"DaemonHook.transferOwnership(address)\",\"DaemonToken.approve(address,uint256)\",\"DaemonToken.transfer(address,uint256)\",\"DaemonToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":25,\"README.md\":218,\"foundry.toml\":20,\"remappings.txt\":4,\"src/DaemonHook.sol\":251,\"src/DaemonToken.sol\":20,\"test/DaemonHook.t.sol\":582,\"test/DaemonHookEdges.t.sol\":319,\"test/DaemonToken.t.sol\":137,\"test/invariant/DaemonHookInvariant.t.sol\":379,\"test/invariant/DaemonTokenInvariant.t.sol\":158,\"test/utils/HookMiner.sol\":28,\"test/utils/LaunchFactoryMock.sol\":84,\"test/utils/MockERC20.sol\":11},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"447d0df02fa14b3ec8ae2fd2b8892d687ab0adb75c40a5297d3b5a80755a3bf6","verifiedTreeHash":"58f2cc41a70dbe3d727e581f411e3198d0a00d00","verifierVersion":"0.1.0+a26ee00d"},{"checks":[{"durationMs":2103,"exitCode":0,"name":"build","output":"Compiling 83 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.01s\nCompiler run successful!\n","passed":true},{"durationMs":179,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 9 tests for test/DaemonToken.t.sol:DaemonTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 81764, ~: 81615)\nLogs:\n  Bound result 520\n\n[PASS] test_metadata() (gas: 29173)\n[PASS] test_mintsTheWholeSupplyToTheDeployer() (gas: 20583)\n[PASS] test_noAdminEntryPointChangesSupplyOrBalances() (gas: 768333)\n[PASS] test_runtimeCodeHasNoDelegatecallOrSelfdestruct() (gas: 958586)\n[PASS] test_transferFromRespectsAllowance() (gas: 203814)\n[PASS] test_transferMovesExactlyWhatItWasAsked() (gas: 152600)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 33184)\n[PASS] test_transferToZeroAddressReverts() (gas: 30446)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 4.73ms (8.02ms CPU time)\n\nRan 26 tests for test/DaemonHook.t.sol:DaemonHookTest\n[PASS] testFuzz_swapsNeverChangeTheTradeOrFundTheHook(uint96,bool) (runs: 256, μ: 1018679, ~: 1012358)\nLogs:\n  Bound result 99999999999999001247\n\n[PASS] test_anyoneCanAddAndRemoveLiquidity() (gas: 1025894)\n[PASS] test_beforeInitializeRefusesCallersOtherThanThePoolManager() (gas: 70823)\n[PASS] test_buyAndSellExactInputMatchAHooklessPoolAndLeaveTheHookEmpty() (gas: 1342613)\n[PASS] test_buyAndSellExactOutputMatchAHooklessPoolAndLeaveTheHookEmpty() (gas: 1355479)\n[PASS] test_constructorRecordsItsArgumentsAndOwner() (gas: 73140)\n[PASS] test_constructorRejectsZeroAddresses() (gas: 8280)\n[PASS] test_deploymentAtAnAddressWithOtherBitsReverts() (gas: 1006365)\n[PASS] test_factoryCanRemoveItsLiquidity() (gas: 482287)\n[PASS] test_factoryInitializesTheLaunchPool() (gas: 155338)\n[PASS] test_hookCannotReceiveEth() (gas: 33169)\n[PASS] test_initializationAtAnotherFeeOrSpacingReverts() (gas: 180061)\n[PASS] test_initializationFromAnyoneButTheFactoryReverts() (gas: 106681)\n[PASS] test_initializationOfAnotherPairReverts() (gas: 627762)\n[PASS] test_lpFeeAccruesToTheFactoryPositionAndCollectPassesThrough() (gas: 865231)\n[PASS] test_onlyOnePoolCanEverBeInitialized() (gas: 154518)\n[PASS] test_ownerHasNoFeeOrPauseEntryPoint() (gas: 1346974)\n[PASS] test_ownershipIsTransferableButPowerless() (gas: 111757)\n[PASS] test_permissionsMatchTheAddressBits() (gas: 12697)\n[PASS] test_runtimeCodeHasNoEscapeHatch() (gas: 2026085)\n[PASS] test_swapCallbacksRefuseAnyPoolButTheLaunchPool() (gas: 760684)\n[PASS] test_swapCallbacksRefuseCallersOtherThanThePoolManager() (gas: 727063)\n[PASS] test_swapCallbacksReturnZeroDeltaAndNoFeeOverride() (gas: 739335)\n[PASS] test_swapOnAPoolSeededWithTokensOnlyNeedsNoEthInTheManager() (gas: 535902)\n[PASS] test_swapsWorkAtTheLaunchOpeningPrice() (gas: 1009832)\n[PASS] test_undeclaredCallbacksRevert() (gas: 130150)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 72.19ms (82.36ms CPU time)\n\nRan 2 test suites in 73.08ms (76.93ms CPU time): 35 tests passed, 0 failed, 0 skipped (35 total tests)\n","passed":true},{"durationMs":60,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DaemonHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"DaemonHook.renounceOwnership()\",\"DaemonHook.transferOwnership(address)\",\"DaemonToken.approve(address,uint256)\",\"DaemonToken.transfer(address,uint256)\",\"DaemonToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":25,\"README.md\":218,\"foundry.toml\":20,\"launch.json\":30,\"remappings.txt\":4,\"src/DaemonHook.sol\":251,\"src/DaemonToken.sol\":20,\"test/DaemonHook.t.sol\":582,\"test/DaemonToken.t.sol\":137,\"test/utils/HookMiner.sol\":28,\"test/utils/LaunchFactoryMock.sol\":84,\"test/utils/MockERC20.sol\":11},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e41bcd82b409b80bc798783e8e5bed86f3b8458dfdec5a248f4a2da24256edbc","verifiedTreeHash":"a5531cd113d0a7223187aa136d54890e24399fc8","verifierVersion":"0.1.0+a26ee00d"}]}