{"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":"b7c7b00e-ed24-46ec-8c25-bd13bb850109","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"e0b621e18f012de471a04582b3f4e5cb0295d5d26f5b9394cb964466a53a5cc9","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"}],"objective":"A Uniswap v4 hook: Build a TEST-ONLY DAEMON Uniswap v4 hook and treasury prototype for https://imdfamily.com. Preserve the existing website. Run local Foundry tests first; do not deploy to mainnet, launch a production token, spend real funds or publish changes.\n\nThe hook charges a fixed 1% on the IMD side of buys and sells, directing all proceeds to an NFT treasury. Keep this separate from factory pool fees. Route the entire creator share of pool fees to game rewards. Verify the supported forwarding mechanism; do not assume remainderTo controls fee revenue.\n\nProduction allocation: 1 billion DAEMON, 18 decimals; 83% liquidity, 10% fixed IMD swarm, 4% game rewards, 1% development, 2% founder. Founder allocation is unlocked, with no vesting. A distribution receiver must separate the 7% remainder. No additional minting or burns.\n\nTest fee accounting, both token orders, exact-input/output swaps, hook permissions and unauthorized access. NFT purchases occur outside swap callbacks, using allowlists, spending caps and ownership checks. Use mock tokens, NFTs and marketplace. Never withdraw pool liquidity for rewards or NFT purchases.\n\nFor existing agent chess, investigate safe automatic participation by two independently authenticated agents with different NFT IDs and wallets. Winner stays and faces the next agent; loser leaves. Exclude founder NFT #222 from prizes. No fake agents or engine substitutes. If swarm-to-game authentication is unsupported, report the blocker.\n\nDeliver source, tests, ABIs, deployment plan and honest implementation status. Official games last four weeks from the future real launch; test scores are excluded. Do not activate prizes, post to X or submit the hackathon entry during this trial.\n\nToken name: DAEMON\nToken symbol: DAEMON","parentJobId":null,"planHash":"c5ca1aabbf85e4ae2e6b2d2352f70515be699f75b9e0cb1b6f9068eb503395f5","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"b7c7b00e-ed24-46ec-8c25-bd13bb850109","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1456-daemon"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51334","feedbackHash":"c7d49d27598702011b76d604899b948537a873b12ece8b1a24ac1ce8114f35d3","nodeKey":"build_contract_project","submissionHash":"e0b621e18f012de471a04582b3f4e5cb0295d5d26f5b9394cb964466a53a5cc9","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"19ee47d84d1a7b5eb7e1d36fe5f9ac0595023917084d34707086ebe8b86204a8","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"f381b5943af91511f3f35ad82e7d725ba0dca7e527cddb17b78343cdc97811b1","device":"433c37ef2c9c708d","findings":[],"hash":"e0b621e18f012de471a04582b3f4e5cb0295d5d26f5b9394cb964466a53a5cc9","nodeId":"f998fd43-4c99-4032-ac19-82918be4699c","outcome":"completed","summary":"Committed. The work is complete and verified locally.\n\n**Outcome.** A test-only DAEMON Uniswap v4 hook and treasury prototype is committed at the repository root as a Foundry project. Build, the 66-test suite, and `forge fmt --check` all pass with solc 0.8.26 pinned. The pinned IMD floor tests for the hook and token were run in a scratch directory with the verifier's environment and passed, 11 of 11. Nothing was deployed, spent, posted or submitted, and the website was not touched.\n\n**What was built**\n- `DaemonHook`: fixed 1% fee on the DAEMON leg of every buy and sell, using beforeSwap when DAEMON is the specified amount and afterSwap when it is unspecified. The fee is settled as ERC-6909 claims, so a fresh manager holding no ETH still trades. Anyone can call `forwardFees()` to push claims to the treasury. Only the launch factory may open exactly one pool containing DAEMON. The pool LP fee is untouched and tested as separate.\n- `DaemonToken`: 1 billion DAEMON, 18 decimals, minted once to the deployer, no mint or burn path.\n- `DistributionReceiver`: splits the 7% remainder 4 : 1 : 2 into game rewards, development and founder, unlocked.\n- `NFTTreasury`: buys NFTs outside swap callbacks with marketplace and collection allowlists, per-purchase and rolling-window caps, exact allowance, and a post-purchase ownership check. Mock NFT and marketplace include rug and overcharge modes.\n- `GameRewards`: ETH-capable prize pool, on-chain winner-stays ladder with one NFT per wallet, founder NFT #222 excluded, prizes inactive, four-week official season with test scores excluded.\n- `script/Deploy.s.sol` with an explicit config struct tested directly, ABIs under `abi/`, and a README with the hook configuration record, security checklist, deployment plan, after-launch setters and honest status.\n\n**Open items and blockers, documented in the README**\n- Agent chess automatic participation is blocked. The arena at imdfamily.com authenticates each agent by a wallet signature from the IdentityMD NFT owner plus an authenticated Codex or Claude CLI on the owner's machine. Its own page states swarm dispatch is not connected and the published client stops after one practice match. No agents were run and nothing was faked. The requester needs to provision two owner-held wallets with distinct NFTs and CLI sessions, or ask the arena maintainers for a delegated agent-credential flow.\n- The factory's creator-share forwarding mechanism could not be verified because the launch fee contracts and network file were not among the inputs. The game rewards contract is ready to receive it, and `remainderTo` is confirmed to be only a token destination.\n- The 4 : 1 : 2 split assumes the factory sends the 10% swarm share itself and only the 7% to `remainderTo`. Confirm before writing the manifest.\n- Invariant tests, Slither and an independent audit were not done.","treeHash":"36a9ded0c8500b85c9cdc586a670a407a357e738","usage":{"cachedInputTokens":2182679,"inputTokens":642,"model":"claude-fable-5-1","outputTokens":78786,"runtime":"claude","turns":51,"wallClockMs":939901}}],"verification":[{"checks":[{"durationMs":4619,"exitCode":0,"name":"build","output":"Compiling 93 files with Solc 0.8.26\nSolc 0.8.26 finished in 4.39s\nCompiler run successful!\nwarning[missing-events-access-control]: `owner` is changed without an event but is used for access control\n   ╭▸ src/DistributionReceiver.sol:67:9\n   │\n67 │         owner = msg.sender;\n   │         ━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-arithmetic]: `queueHead` is changed without an event but is used in arithmetic\n    ╭▸ src/GameRewards.sol:229:30\n    │\n229 │             champion = queue[queueHead++];\n    │                              ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-access-control]: `owner` is changed without an event but is used for access control\n    ╭▸ src/DaemonHook.sol:153:9\n    │\n153 │         owner = msg.sender;\n    │         ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingOwner` is changed without an event but is used for access control\n    ╭▸ src/DaemonHook.sol:154:9\n    │\n154 │         pendingOwner = address(0);\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingOwner` is changed without an event but is used for access control\n   ╭▸ src/DistributionReceiver.sol:68:9\n   │\n68 │         pendingOwner = address(0);\n   │         ━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `owner` is changed without an event but is used for access control\n    ╭▸ src/NFTTreasury.sol:105:9\n    │\n105 │         owner = msg.sender;\n    │         ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingOwner` is changed without an event but is used for access control\n    ╭▸ src/NFTTreasury.sol:106:9\n    │\n106 │         pendingOwner = address(0);\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `owner` is changed without an event but is used for access control\n    ╭▸ src/GameRewards.sol:120:9\n    │\n120 │         owner = msg.sender;\n    │         ━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingOwner` is changed without an event but is used for access control\n    ╭▸ src/GameRewards.sol:121:9\n    │\n121 │         pendingOwner = address(0);\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[solmate-safe-transfer-lib]: the `SafeTransferLib` from Solmate does not check that the token has code, so a transfer to a token-less address succeeds silently\n   ╭▸ src/DistributionReceiver.sol:96:9\n   │\n96 │         daemon.safeTransfer(gameRewards, game);\n   │         ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/solmate-safe-transfer-lib\n\nwarning[solmate-safe-transfer-lib]: the `SafeTransferLib` from Solmate does not check that the token has code, so a transfer to a token-less address succeeds silently\n   ╭▸ src/DistributionReceiver.sol:97:9\n   │\n97 │         daemon.safeTransfer(development, dev);\n   │         ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/solmate-safe-transfer-lib\n\nwarning[solmate-safe-transfer-lib]: the `SafeTransferLib` from Solmate does not check that the token has code, so a transfer to a token-less address succeeds silently\n   ╭▸ src/DistributionReceiver.sol:98:9\n   │\n98 │         daemon.safeTransfer(founder, found);\n   │         ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/solmate-safe-transfer-lib\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NFTTreasury.sol:139:13\n    │\n139 │         if (block.timestamp >= windowStart + windowLength) return windowCap;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `locked` is updated\n    ╭▸ src/NFTTreasury.sol:165:9\n    │\n165 │         IMarketplace(marketplace).buy(collection, tokenId, address(daemon), price);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/DaemonHook.sol:176:9\n    │\n176 │         poolManager.unlock(abi.encode(amount));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/NFTTreasury.sol:148:9\n    │\n148 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NFTTreasury.sol:155:13\n    │\n155 │         if (block.timestamp >= windowStart + windowLength) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/NFTTreasury.sol:175:9\n    │\n175 │         emit Purchased(marketplace, collection, tokenId, charged);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[solmate-safe-transfer-lib]: the `SafeTransferLib` from Solmate does not check that the token has code, so a transfer to a token-less address succeeds silently\n    ╭▸ src/NFTTreasury.sol:164:9\n    │\n164 │         daemon.safeApprove(marketplace, price);\n    │         ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/solmate-safe-transfer-lib\n\nwarning[solmate-safe-transfer-lib]: the `SafeTransferLib` from Solmate does not check that the token has code, so a transfer to a token-less address succeeds silently\n    ╭▸ src/NFTTreasury.sol:166:9\n    │\n166 │         daemon.safeApprove(marketplace, 0);\n    │         ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/solmate-safe-transfer-lib\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/DaemonHook.sol:186:9\n    │\n186 │         emit FeesForwarded(treasury, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/NFTTreasury.sol:184:9\n    │\n184 │         emit NFTWithdrawn(collection, tokenId, to);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[solmate-safe-transfer-lib]: the `SafeTransferLib` from Solmate does not check that the token has code, so a transfer to a token-less address succeeds silently\n    ╭▸ src/NFTTreasury.sol:190:9\n    │\n190 │         token.safeTransfer(to, amount);\n    │         ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/solmate-safe-transfer-lib\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/GameRewards.sol:144:13\n    │\n144 │         if (start <= block.timestamp) revert SeasonInPast();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DaemonHook.sol:218:42\n    │\n218 │         uint256 magnitude = exactInput ? uint256(-params.amountSpecified) : uint256(params.amountSpecified);\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DaemonHook.sol:218:77\n    │\n218 │         uint256 magnitude = exactInput ? uint256(-params.amountSpecified) : uint256(params.amountSpecified);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DaemonHook.sol:224:63\n    │\n224 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(uint128(fee)), 0), 0);\n    │                                                               ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/GameRewards.sol:153:9\n    │\n153 │         emit EthWithdrawn(to, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DaemonHook.sol:224:70\n    │\n224 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(uint128(fee)), 0), 0);\n    │                                                                      ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/GameRewards.sol:159:36\n    │\n159 │         return seasonStart != 0 && block.timestamp >= seasonStart && block.timestamp < seasonStart + SEASON_LENGTH;\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/GameRewards.sol:159:70\n    │\n159 │         return seasonStart != 0 && block.timestamp >= seasonStart && block.timestamp < seasonStart + SEASON_LENGTH;\n    │                                                                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DaemonHook.sol:239:37\n    │\n239 │             unspecifiedAmount < 0 ? uint256(uint128(-unspecifiedAmount)) : uint256(uint128(unspecifiedAmount));\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DaemonHook.sol:239:45\n    │\n239 │             unspecifiedAmount < 0 ? uint256(uint128(-unspecifiedAmount)) : uint256(uint128(unspecifiedAmount));\n    │                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DaemonHook.sol:239:76\n    │\n239 │             unspecifiedAmount < 0 ? uint256(uint128(-unspecifiedAmount)) : uint256(uint128(unspecifiedAmount));\n    │                                                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DaemonHook.sol:239:84\n    │\n239 │             unspecifiedAmount < 0 ? uint256(uint128(-unspecifiedAmount)) : uint256(uint128(unspecifiedAmount));\n    │                                                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DaemonHook.sol:244:44\n    │\n244 │         return (IHooks.afterSwap.selector, int128(uint128(fee)));\n    │                                            ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DaemonHook.sol:244:51\n    │\n244 │         return (IHooks.afterSwap.selector, int128(uint128(fee)));\n    │                                                   ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[solmate-safe-transfer-lib]: the `SafeTransferLib` from Solmate does not check that the token has code, so a transfer to a token-less address succeeds silently\n    ╭▸ src/GameRewards.sol:248:9\n    │\n248 │         daemon.safeTransfer(to, amount);\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/solmate-safe-transfer-lib\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/DaemonHook.sol:252:9\n    │\n252 │         emit FeeCharged(key.toId(), zeroForOne, exactInput, fee);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/GameRewards.t.sol:139:25\n    │\n139 │         uint256 start = block.timestamp + 1 days;\n    │                         ━━━━━━━━━━━━━━━\n    ‡\n146 │         vm.warp(start);\n    │         ────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":234,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 14 tests for test/NFTTreasury.t.sol:NFTTreasuryTest\n[PASS] test_adminIsOwnerOnly() (gas: 195869)\n[PASS] test_collectionMustBeAllowlisted() (gas: 1118878)\n[PASS] test_marketplaceCannotPullMoreThanThePrice() (gas: 180435)\n[PASS] test_marketplaceMustBeAllowlisted() (gas: 156570)\n[PASS] test_marketplaceThatKeepsPaymentWithoutDeliveringReverts() (gas: 229597)\n[PASS] test_maxPriceIsRespectedByMarketplace() (gas: 123375)\n[PASS] test_ownerCustody() (gas: 362552)\n[PASS] test_ownerMayAlsoBuy() (gas: 225075)\n[PASS] test_perPurchaseCap() (gas: 56296)\n[PASS] test_purchaseHappyPath() (gas: 285811)\n[PASS] test_purchasesDisabledUntilCapsSet() (gas: 142795)\n[PASS] test_strangerCannotBuy() (gas: 41988)\n[PASS] test_twoStepOwnership() (gas: 135738)\n[PASS] test_windowCapAndReset() (gas: 554817)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 1.95ms (3.01ms CPU time)\n\nRan 14 tests for test/GameRewards.t.sol:GameRewardsTest\n[PASS] test_drawReturnsBothToQueueAndEndsStreaks() (gas: 475999)\n[PASS] test_founderNft222NeverReceivesAPrize() (gas: 77423)\n[PASS] test_noMatchInProgress() (gas: 218440)\n[PASS] test_officialSeasonIsFourWeeksAndTestScoresAreExcluded() (gas: 854899)\n[PASS] test_oneWalletOneNft() (gas: 311465)\n[PASS] test_onlyArbiterReportsAndOnlySeatedAgents() (gas: 570312)\n[PASS] test_onlyOwnerAwardsAndConfigures() (gas: 159386)\n[PASS] test_prizePaidToCurrentNftOwnerOnceActive() (gas: 145737)\n[PASS] test_prizesInactiveDuringTrial() (gas: 44271)\n[PASS] test_receivesCreatorFeeShareInEth() (gas: 76103)\n[PASS] test_registerRequiresConfiguredNft() (gas: 34927)\n[PASS] test_registerRequiresNftOwnership() (gas: 40327)\n[PASS] test_seasonStartMustBeInTheFuture() (gas: 36476)\n[PASS] test_winnerStaysLoserLeavesNextIsSeated() (gas: 693224)\nSuite result: ok. 14 passed; 0 failed; 0 skipped; finished in 2.06ms (3.37ms CPU time)\n\nRan 5 tests for test/DaemonToken.t.sol:DaemonTokenTest\n[PASS] test_metadataAndSupply() (gas: 46400)\n[PASS] test_noMintOrBurnPath() (gas: 387115)\n[PASS] test_productionAllocationSumsToSupply() (gas: 9160)\n[PASS] test_runtimeHasNoDelegatecallOrSelfdestruct() (gas: 650167)\n[PASS] test_transferMovesExactAmount() (gas: 83222)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.57ms (2.78ms CPU time)\n\nRan 6 tests for test/DistributionReceiver.t.sol:DistributionReceiverTest\n[PASS] testFuzz_conservesEveryWei(uint256) (runs: 64, μ: 346500, ~: 346852)\n[PASS] test_onlyOwnerSetsRecipientsAndRejectsZero() (gas: 70306)\n[PASS] test_partialTransfersDistributeSeparately() (gas: 489489)\n[PASS] test_revertsUntilConfigured() (gas: 100632)\n[PASS] test_revertsWithNothingToDistribute() (gas: 144096)\n[PASS] test_splitsTheSevenPercentRemainder() (gas: 388166)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 5.32ms (5.52ms CPU time)\n\nRan 25 tests for test/DaemonHook.t.sol:DaemonHookTest\n[PASS] testFuzz_buyFeeIsOnePercentOfPoolOutput(uint256) (runs: 64, μ: 253877, ~: 254015)\n[PASS] testFuzz_sellFeeIsOnePercentOfInput(uint256) (runs: 64, μ: 247446, ~: 247658)\n[PASS] test_adminIsOwnerOnly() (gas: 214002)\n[PASS] test_buyExactInput_daemon0() (gas: 16547685)\n[PASS] test_buyExactInput_daemon1() (gas: 260479)\n[PASS] test_buyExactOutput_daemon0() (gas: 16547799)\n[PASS] test_buyExactOutput_daemon1() (gas: 252123)\n[PASS] test_callbacksRefuseNonManager() (gas: 218816)\n[PASS] test_constructorRejectsWrongAddressBits() (gas: 12514)\n[PASS] test_constructorRejectsZeroAddresses() (gas: 50831)\n[PASS] test_forwardRevertsUntilTreasuryConfigured() (gas: 264331)\n[PASS] test_forwardRevertsWithNothingPending() (gas: 90268)\n[PASS] test_forwardSendsEveryFeeToTreasuryWithoutTouchingLiquidity() (gas: 796791)\n[PASS] test_initializeAcceptsLaunchTierFeeAndNativePair() (gas: 14593826)\n[PASS] test_initializeAcceptsOnlyOnePool() (gas: 817828)\n[PASS] test_initializeRefusesNonFactory() (gas: 15289136)\n[PASS] test_initializeRefusesPoolWithoutDaemon() (gas: 16026849)\n[PASS] test_lpFeeAccruesToLiquidityIndependently() (gas: 299294)\n[PASS] test_nativePairTokenOnlySeedBuyAndSell() (gas: 15479647)\n[PASS] test_pairSideIsNeverCharged() (gas: 247650)\n[PASS] test_permissionsMatchAddressAndHaveNoLiquidityCallbacks() (gas: 14271)\n[PASS] test_sellExactInput_daemon0() (gas: 16553615)\n[PASS] test_sellExactInput_daemon1() (gas: 265983)\n[PASS] test_sellExactOutput_daemon0() (gas: 16572484)\n[PASS] test_sellExactOutput_daemon1() (gas: 266602)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 72.72ms (211.36ms CPU time)\n\nRan 2 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_deployRejectsZeroConfig() (gas: 5835319)\n[PASS] test_deployWiresEverythingAndFactoryCanOpenThePool() (gas: 159796504)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 81.86ms (81.66ms CPU time)\n\nRan 6 test suites in 83.88ms (166.47ms CPU time): 66 tests passed, 0 failed, 0 skipped (66 total tests)\n","passed":true},{"durationMs":111,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DaemonHook.acceptOwnership()\",\"DaemonHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"DaemonHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"DaemonHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"DaemonHook.forwardFees()\",\"DaemonHook.setTreasury(address)\",\"DaemonHook.transferOwnership(address)\",\"DaemonHook.unlockCallback(bytes)\",\"DaemonToken.approve(address,uint256)\",\"DaemonToken.permit(address,address,uint256,uint256,uint8,bytes32,bytes32)\",\"DaemonToken.transfer(address,uint256)\",\"DaemonToken.transferFrom(address,address,uint256)\",\"DistributionReceiver.acceptOwnership()\",\"DistributionReceiver.distribute()\",\"DistributionReceiver.setRecipients(address,address,address)\",\"DistributionReceiver.transferOwnership(address)\",\"GameRewards.acceptOwnership()\",\"GameRewards.awardPrize(uint256,uint256)\",\"GameRewards.receive()\",\"GameRewards.register(uint256)\",\"GameRewards.reportResult(uint256,uint256,bool)\",\"GameRewards.setArbiter(address)\",\"GameRewards.setIdentityNft(address)\",\"GameRewards.setPrizesActive(bool)\",\"GameRewards.setSeasonStart(uint256)\",\"GameRewards.transferOwnership(address)\",\"GameRewards.withdrawEth(address,uint256)\",\"NFTTreasury.acceptOwnership()\",\"NFTTreasury.buyNFT(address,address,uint256,uint256)\",\"NFTTreasury.setCaps(uint256,uint256,uint256)\",\"NFTTreasury.setCollection(address,bool)\",\"NFTTreasury.setMarketplace(address,bool)\",\"NFTTreasury.setOperator(address,bool)\",\"NFTTreasury.transferOwnership(address)\",\"NFTTreasury.withdrawNFT(address,uint256,address)\",\"NFTTreasury.withdrawTokens(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":269,\"abi/DaemonHook.json\":1333,\"abi/DaemonToken.json\":317,\"abi/Deploy.json\":233,\"abi/DistributionReceiver.json\":379,\"abi/GameRewards.json\":753,\"abi/NFTTreasury.json\":740,\"foundry.toml\":24,\"remappings.txt\":3,\"script/Deploy.s.sol\":92,\"src/DaemonHook.sol\":318,\"src/DaemonToken.sol\":18,\"src/DistributionReceiver.sol\":101,\"src/GameRewards.sol\":251,\"src/HookFlags.sol\":36,\"src/NFTTreasury.sol\":197,\"test/DaemonHook.t.sol\":358,\"test/DaemonToken.t.sol\":78,\"test/Deploy.t.sol\":71,\"test/DistributionReceiver.t.sol\":98,\"test/GameRewards.t.sol\":223,\"test/NFTTreasury.t.sol\":189,\"test/mocks/MockERC20.sol\":15,\"test/mocks/MockERC721.sol\":17,\"test/mocks/MockMarketplace.sol\":48,\"test/utils/Fixture.sol\":126,\"test/utils/HookDeployer.sol\":34},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2016,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/DistributionReceiver.sol:86: DistributionReceiver.distribute() (src/DistributionReceiver.sol#86-100) uses a dangerous strict equality:\n[medium/medium] unused-return at src/DaemonHook.sol:172: DaemonHook.forwardFees() (src/DaemonHook.sol#172-177) ignores return value by poolManager.unlock(abi.encode(amount)) (src/DaemonHook.sol#176)\n[low/medium] reentrancy-benign at src/DaemonHook.sol:249: Reentrancy in DaemonHook._chargeFee(PoolKey,bool,bool,uint256) (src/DaemonHook.sol#249-253):\n[low/medium] reentrancy-benign at src/DaemonHook.sol:180: Reentrancy in DaemonHook.unlockCallback(bytes) (src/DaemonHook.sol#180-188):\n[low/medium] reentrancy-benign at src/NFTTreasury.sol:145: Reentrancy in NFTTreasury.buyNFT(address,address,uint256,uint256) (src/NFTTreasury.sol#145-176):\n[low/medium] reentrancy-events at src/DaemonHook.sol:249: Reentrancy in DaemonHook._chargeFee(PoolKey,bool,bool,uint256) (src/DaemonHook.sol#249-253):\n[low/medium] reentrancy-events at src/DaemonHook.sol:180: Reentrancy in DaemonHook.unlockCallback(bytes) (src/DaemonHook.sol#180-188):\n[low/medium] reentrancy-events at src/GameRewards.sol:149: Reentrancy in GameRewards.withdrawEth(address,uint256) (src/GameRewards.sol#149-154):\n[low/medium] reentrancy-events at src/NFTTreasury.sol:181: Reentrancy in NFTTreasury.withdrawNFT(address,uint256,address) (src/NFTTreasury.sol#181-185):\n[low/medium] timestamp at src/GameRewards.sol:158: GameRewards.isOfficial() (src/GameRewards.sol#158-160) uses timestamp for comparisons\n[low/medium] timestamp at src/NFTTreasury.sol:138: NFTTreasury.remainingInWindow() (src/NFTTreasury.sol#138-141) uses timestamp for comparisons\n[low/medium] timestamp at src/NFTTreasury.sol:145: NFTTreasury.buyNFT(address,address,uint256,uint256) (src/NFTTreasury.sol#145-176) uses timestamp for comparisons\n[low/medium] timestamp at src/GameRewards.sol:142: GameRewards.setSeasonStart(uint256) (src/GameRewards.sol#142-147) uses timestamp for comparisons","passed":true},{"durationMs":541,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/DaemonHook.sol:183: Reentrancy: State change after external call (9 places)\n[low] centralization-risk at src/DaemonHook.sol:144: Centralization Risk (18 places)\n[low] internal-function-used-once at src/HookFlags.sol:28: Internal Function Used Only Once\n[low] large-numeric-literal at src/DaemonHook.sol:43: Large Numeric Literal\n[low] modifier-used-only-once at src/NFTTreasury.sol:77: Modifier Invoked Only Once\n[low] non-reentrant-not-first at src/NFTTreasury.sol:148: `nonReentrant` is Not the First Modifier\n[low] solmate-safe-transfer-lib at src/DistributionReceiver.sol:5: Solmate's SafeTransferLib (3 places)\n[low] unchecked-return at src/DaemonHook.sol:176: Unchecked Return\n[low] unused-error at src/DaemonHook.sol:87: Unused Error\n[low] unused-public-function at src/NFTTreasury.sol:138: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e0b621e18f012de471a04582b3f4e5cb0295d5d26f5b9394cb964466a53a5cc9","verifiedTreeHash":"36a9ded0c8500b85c9cdc586a670a407a357e738","verifierVersion":"0.1.0+7ff5db2c"}]}