{"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":"ac8cb4ce-56d5-44d4-9566-469530c2c338","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"42ced304d13563d3e26535d86b029130549f7a2c96af8b8f49dbcf132040b40b","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"accepted"}],"objective":"$ADAM — official X: https://x.com/IaMaDamIMD — continue the ADAM project from the parent job (single job, do NOT ask clarifying questions — pick sane defaults and document them). Keep everything already built and accepted (plain ERC-20 \"ADAM\", staking Distributor, hook, Treasury, anti-snipe, 90/10 split). Token name and symbol stay \"ADAM\". All distributions are pull-based: users claim themselves, nobody pushes tokens.\n\n## 1. NFT holder claims with daily unlock\n- New contract NFTClaim holding 11% of ADAM supply, funded in the deploy script:\n  - IMD NFT 0x0000ec93127baa929e58e97dd0095a2bfb38ec1d: 10% of supply (100,000,000 ADAM).\n  - Swarm Pepe 0x999ce0ce8c5f7661e0c74a568ffe27ceb9177bdb: 1% of supply (10,000,000 ADAM).\n- Per NFT, not per wallet: each tokenId gets an equal share (collection allocation / collection size, read onchain at build, fixed immutably at deploy). The current ownerOf(tokenId) claims its unlocked share; claimed amounts tracked per tokenId. Batch claim for many tokenIds in one tx.\n- Unlock: 10 equal daily tranches per tokenId — 10% of its share at launch, +10% every 24h, full after day 9 (= 1% of supply/day for IMD NFTs, 0.1%/day for Swarm Pepe).\n- claimAndStake(tokenIds) claims and stakes into the Distributor in one tx; plain claim too.\n- burnUnclaimed() after full unlock + 30 days → dead address (covers burned/never-claimed tokenIds).\n- No owner withdraw, no parameter changes, reentrancy guard. NFTClaim earns no rewards.\n\n## 2. Three reward assets, split by the IMD swarm oracle (\"buy what's down\")\n- Reward assets for stakers:\n  - $IMD 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7 (existing ETH/IMD v4 pool)\n  - $PNKSTR 0xc50673edb3a7b94e8cad8a7d4e0cd68864e33edf (existing ETH/PNKSTR v4 pool, 10% hook tax already measured)\n  - $IMDSTR 0x80271ce20184e38f4afe90d4ca134304d197aca2 (TokenWorks NFTStrategy proxy, impl 0x7fb856425f164929f023055e8bc40e980b362f61, v4 hook 0x66b05c8eeca9329f7a2332c02ce3855cfab72444; find PoolKey onchain, measure hook tax on fork)\n- Holder share (90%) split across the three by a daily signed IMD oracle report (imd.fun/docs/#oracle) from a heartbeat job: imdBps, pnkstrBps, imdstrBps (sum 10000) + short reason. Policy: favor what is down over 24h, unless liquidity/risk signals say otherwise.\n- Contract: verify signature + freshness (≤ 26h), clamp each to 1500–7000 bps, missing/stale/invalid → equal thirds. Bounds immutable, owner cannot override. Emit SplitUpdated(imdBps, pnkstrBps, imdstrBps, reportId, reasonHash, source).\n- If verifying the IMD oracle report onchain is not feasible, say so and fall back to onchain daily snapshots of the three pool prices with the same rule.\n- Deliver the heartbeat job spec/prompt (inputs + output format).\n- Keep existing per-leg limits, slippage floors, failure rerouting — extend to three legs.\n\n## 3. IMDSTR transfer lock\n- VERIFIED: IMDSTR wallet→wallet transfer() reverts InvalidTransfer() (0x2f352531); PoolManager is NOT a distributor.\n- Implement buy-on-claim: IMDSTR share accrues per staker in ETH; on claim the Distributor swaps that ETH → IMDSTR via its v4 pool with take() directly to the claimer (claimer-supplied slippage).\n- Support a one-time switch to direct distribution if the IMDSTR owner whitelists our Distributor via setDistributor.\n- Fork test: buy-on-claim delivers IMDSTR to an EOA; direct transfer reverts without whitelist.\n\n## 4. Keeper bounty\n- process() pays the caller 0.5% of the ETH processed in that call (constant max), so bots call it hourly.\n\n## 5. X / discoverability\n- https://x.com/IaMaDamIMD in NatSpec header of every contract (@custom:x), ERC-7572 contractURI() on Distributor/Treasury (token stays plain), README top.\n\n## Deliverables\n1. Updated Foundry repo + deploy script (11% to NFTClaim; NOT broadcast — deployer signs manually).\n2. Unit + fuzz + fork tests for everything above.\n3. Short self-audit with fixes applied.\n4. Updated README (claim flows, unlock schedule, oracle split, links).\nOut of scope: website.","parentJobId":"e497ebcf-33bb-4548-bfd7-fa95843dc898","planHash":"1126f5c5011e78cc97d280c3c5b34f04d751a2a9800e7f265683ba71df8a2404","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"e497ebcf-33bb-4548-bfd7-fa95843dc898","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-713-task-single-job-do"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52141","feedbackHash":"87bba143e877e43a7c93303b78826b7de8fae735e56b69a32a7ff1c610f75a8f","nodeKey":"build_contract_project","submissionHash":"42ced304d13563d3e26535d86b029130549f7a2c96af8b8f49dbcf132040b40b","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"c5f164a01a4ef31dfa4df869e350c830e705c1c5f35cf1280acbb3018ad51aec","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"7c430f852ae9c92739cf3fec58e051b4183770321ed7632e1554f3ff84f3e52a","device":"265d2bb313654afc","findings":[],"hash":"42ced304d13563d3e26535d86b029130549f7a2c96af8b8f49dbcf132040b40b","nodeId":"c0cebf75-191e-4d4b-8862-a401e7624dbd","outcome":"completed","summary":"Implemented NFT claims, three-asset oracle splits, IMDSTR buy-on-claim, keeper bounty, deployment tooling, heartbeat spec, and self-audit.\n\nPassed: `forge build`, 151 offline tests, 10 mainnet fork tests, and formatting checks. Protected files unchanged. Nothing broadcast or re-minted.\n\nDeployment constraint: existing ADAM is on Sepolia; requested assets are on mainnet. Details and deployment requirements are in [README.md](/home/seat/.identitymd/work/ac8cb4ce-56d5-44d4-9566-469530c2c338/c0cebf75-191e-4d4b-8862-a401e7624dbd/README.md).","treeHash":"b9bc68227a11456c7029629103d5047c9105ee7e","usage":{"cachedInputTokens":6953728,"inputTokens":170853,"model":"gpt-6-astra","outputTokens":64820,"runtime":"codex","turns":11,"wallClockMs":2459016}}],"verification":[{"checks":[{"durationMs":193474,"exitCode":0,"name":"build","output":"Compiling 154 files with Solc 0.8.26\nSolc 0.8.26 finished in 193.21s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/NFTClaim.sol:55:72\n   │\n55 │                 || imd_ == pepe_ || imdSize_ == 0 || pepeSize_ == 0 || launch_ < block.timestamp\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/NFTClaim.sol:77:13\n   │\n77 │         if (block.timestamp < launch || block.timestamp >= deadline) return 0;\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/NFTClaim.sol:77:41\n   │\n77 │         if (block.timestamp < launch || block.timestamp >= deadline) return 0;\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/NFTClaim.sol:79:13\n   │\n79 │         if (tranches > 10) tranches = 10;\n   │             ━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/AdamTreasuryV2.sol:71:17\n   │\n71 │                 revert InvalidParameter();\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/AdamTreasuryV2.sol:50:13\n   │\n50 │             uint24(c.keys[0].tickSpacing),\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint24' 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/AdamTreasuryV2.sol:55:13\n   │\n55 │             uint24(c.keys[1].tickSpacing),\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint24' 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/AdamTreasuryV2.sol:65:37\n   │\n65 │                 || c.maxEthPerBuy > uint256(uint128(type(int128).max)) || c.taxes[2] >= BPS\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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/AdamHook.sol:115:13\n    │\n115 │         if (elapsed >= DECAY_DURATION) return base;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n   ╭▸ src/NFTClaim.sol:91:9\n   │\n91 │         distributor.stakeFor(msg.sender, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/AdamTreasuryV2.sol:65:45\n   │\n65 │                 || c.maxEthPerBuy > uint256(uint128(type(int128).max)) || c.taxes[2] >= BPS\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamDistributor.sol:117:9\n    │\n117 │         emit Staked(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `teamOwed` is updated\n    ╭▸ src/AdamTreasuryV2.sol:108:36\n    │\n108 │         uint16[3] memory weights = splitOracle.checkpoint();\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:169:31\n    │\n169 │             launchTimestamp = uint64(block.timestamp);\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/AdamHook.sol:177:42\n    │\n177 │             params.amountSpecified < 0 ? 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/AdamHook.sol:177:77\n    │\n177 │             params.amountSpecified < 0 ? 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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamDistributor.sol:210:13\n    │\n210 │             emit RewardClaimed(account, token, amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_legs` is updated\n    ╭▸ src/AdamTreasuryV2.sol:198:13\n    │\n198 │         try this.executeV2(id, ethIn) returns (uint256 out) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamDistributor.sol:158:9\n    │\n158 │         emit RewardNotified(token, msg.sender, received, distributed);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:192:46\n    │\n192 │                 params.amountSpecified < 0 ? 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/AdamHook.sol:192:81\n    │\n192 │                 params.amountSpecified < 0 ? 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/AdamHook.sol:195:47\n    │\n195 │                 params.amountSpecified < 0 ? -int256(requested - prepaidFee) : int256(requested + prepaidFee);\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/AdamHook.sol:195:80\n    │\n195 │                 params.amountSpecified < 0 ? -int256(requested - prepaidFee) : int256(requested + prepaidFee);\n    │                                                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/AdamHook.sol:200:44\n    │\n200 │         uint256 ethAmount = ethDelta < 0 ? uint256(uint128(-ethDelta)) : uint256(uint128(ethDelta));\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/AdamHook.sol:200:52\n    │\n200 │         uint256 ethAmount = ethDelta < 0 ? uint256(uint128(-ethDelta)) : uint256(uint128(ethDelta));\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/AdamHook.sol:200:74\n    │\n200 │         uint256 ethAmount = ethDelta < 0 ? uint256(uint128(-ethDelta)) : uint256(uint128(ethDelta));\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/AdamHook.sol:200:82\n    │\n200 │         uint256 ethAmount = ethDelta < 0 ? uint256(uint128(-ethDelta)) : uint256(uint128(ethDelta));\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/NFTClaim.sol:96:13\n   │\n96 │         if (block.timestamp >= deadline) revert ClaimClosed();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/NFTClaim.sol:100:17\n    │\n100 │             if ((collection == 0 ? imdNFT : swarmPepe).ownerOf(id) != msg.sender) revert NotOwner();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/NFTClaim.sol:72:9\n   │\n72 │         revert InvalidToken();\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/NFTClaim.sol:100:83\n    │\n100 │             if ((collection == 0 ? imdNFT : swarmPepe).ownerOf(id) != msg.sender) revert NotOwner();\n    │                                                                                   ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NFTClaim.sol:111:13\n    │\n111 │         if (block.timestamp < deadline) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/AdamTreasuryV2.sol:111:22\n    │\n111 │             bounty = amount * KEEPER_BPS / BPS;\n    │                      ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:149:97\n    │\n149 │                 || imdTaxBps >= BPS || pnkstrTaxBps >= BPS || imd == pnkstr || imdTickSpacing > uint24(type(int24).max)\n    │                                                                                                 ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint24' 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/AdamTreasury.sol:150:40\n    │\n150 │                 || pnkstrTickSpacing > uint24(type(int24).max)\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint24' 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/AdamTreasury.sol:164:26\n    │\n164 │             tickSpacing: int24(imdTickSpacing),\n    │                          ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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/AdamTreasury.sol:172:26\n    │\n172 │             tickSpacing: int24(pnkstrTickSpacing),\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' 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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/AdamTreasuryV2.sol:131:13\n    │\n131 │         if (bounty != 0) {\n    │             ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/AdamTreasuryV2.sol:100:13\n    │\n100 │         if (block.timestamp < availableAt) revert CooldownActive(availableAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/AdamTreasuryV2.sol:198:13\n    │\n198 │         try this.executeV2(id, ethIn) returns (uint256 out) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/AdamTreasuryV2.sol:202:37\n    │\n202 │             if (id != LEG_IMDSTR || distributorV2.directDistribution()) {\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasuryV2.sol:123:13\n    │\n123 │             emit Split(amount, teamShare, holders);\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/AdamTreasuryV2.sol:205:13\n    │\n205 │             emit LegBought(id, Currency.unwrap(l.key.currency1), ethIn, out);\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/AdamTreasuryV2.sol:207:13\n    │\n207 │             emit LegFailed(id, ethIn, reason);\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/AdamTreasuryV2.sol:221:17\n    │\n221 │                 emit LegRerouted(id, other, moved);\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/AdamTreasuryV2.sol:136:17\n    │\n136 │                 emit KeeperPaid(msg.sender, bounty);\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/AdamTreasuryV2.sol:140:17\n    │\n140 │                 emit KeeperPaymentDeferred(msg.sender, bounty);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasuryV2.sol:107:25\n    │\n107 │         lastProcessed = uint64(block.timestamp);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/AdamTreasuryV2.sol:134:26\n    │\n134 │             (bool ok,) = msg.sender.call{value: bounty, gas: 100_000}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamHook.sol:274:9\n    │\n274 │         emit FeeTaken(params.zeroForOne, ethAmount, fee, bps);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_legs` is updated\n    ╭▸ src/AdamTreasury.sol:334:13\n    │\n334 │         try poolManager.unlock(abi.encode(legId, ethIn)) returns (bytes memory result) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/AdamDistributorV2.sol:50:30\n   │\n50 │                 || maxEth_ > uint256(uint128(type(int128).max))\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/AdamDistributorV2.sol:50:38\n   │\n50 │                 || maxEth_ > uint256(uint128(type(int128).max))\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/AdamDistributorV2.sol:71:9\n   │\n71 │         emit Staked(beneficiary, 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/AdamDistributor.sol:197:9\n    │\n197 │         emit Unstaked(msg.sender, 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/AdamDistributorV2.sol:83:9\n   │\n83 │         emit RewardClaimed(msg.sender, token, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_legs` is updated\n    ╭▸ src/AdamTreasury.sol:341:13\n    │\n341 │             distributor.notifyReward(token, amountOut);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/AdamDistributor.sol:239:13\n    │\n239 │         if (elapsed > BACKLOG_DURATION) elapsed = BACKLOG_DURATION;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/AdamDistributorV2.sol:129:31\n    │\n129 │         bytes memory result = poolManager.unlock(abi.encode(recipient, ethIn, minOut));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamDistributor.sol:261:77\n    │\n261 │                 backlogStream[token] = BacklogStream(unallocated[token], 0, uint64(block.timestamp));\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/AdamDistributorV2.sol:95:13\n   │\n95 │             emit RewardNotified(imdstr, msg.sender, amountOut, distributed);\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/AdamDistributorV2.sol:98:13\n   │\n98 │             emit RewardNotified(address(0), msg.sender, msg.value, distributed);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/AdamTreasury.sol:196:13\n    │\n196 │         if (block.timestamp < availableAt) revert CooldownActive(availableAt);\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/AdamTreasury.sol:339:13\n    │\n339 │             emit LegBought(legId, token, ethIn, amountOut);\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/AdamTreasury.sol:343:13\n    │\n343 │             emit LegFailed(legId, ethIn, reason);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/AdamTreasuryV2.sol:151:22\n    │\n151 │         (bool ok,) = msg.sender.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasury.sol:357:17\n    │\n357 │                 emit LegRerouted(legId, other, moved);\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/AdamTreasuryV2.sol:153:9\n    │\n153 │         emit TeamPaid(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:202:25\n    │\n202 │         lastProcessed = uint64(block.timestamp);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/AdamTreasuryV2.sol:162:22\n    │\n162 │         (bool ok,) = recipient.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/AdamTreasuryV2.sol:162:22\n    │\n162 │         (bool ok,) = recipient.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/AdamDistributorV2.sol:109:13\n    │\n109 │         if (block.timestamp > deadline_ || minOut == 0 || ethAmount == 0 || ethAmount > maxEthPerClaim) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/AdamTreasury.sol:225:22\n    │\n225 │         (bool ok,) = teamWallet.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasuryV2.sol:164:9\n    │\n164 │         emit KeeperPaid(msg.sender, 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/AdamTreasury.sol:227:9\n    │\n227 │         emit TeamPaid(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/AdamDistributorV2.sol:117:9\n    │\n117 │         emit IMDSTRClaimed(msg.sender, ethAmount, out);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/AdamTreasury.sol:237:13\n    │\n237 │             distributor.notifyReward(token, balance);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/AdamTreasury.sol:234:31\n    │\n234 │             uint256 balance = IERC20(token).balanceOf(address(this));\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/AdamTreasury.sol:237:13\n    │\n237 │             distributor.notifyReward(token, balance);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasury.sol:238:13\n    │\n238 │             emit RewardsFlushed(token, balance);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamDistributorV2.sol:138:59\n    │\n138 │             poolManager.swap(imdstrKey, SwapParams(true, -int256(ethIn), TickMath.MIN_SQRT_PRICE + 1), \"\");\n    │                                                           ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/AdamDistributorV2.sol:139:37\n    │\n139 │         if (delta.amount0() >= 0 || uint256(-int256(delta.amount0())) != ethIn || delta.amount1() <= 0) {\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/AdamDistributorV2.sol:142:23\n    │\n142 │         uint256 out = uint256(uint128(delta.amount1()));\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/AdamDistributorV2.sol:142:31\n    │\n142 │         uint256 out = uint256(uint128(delta.amount1()));\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[unused-return]: return value of an external call is not used\n    ╭▸ src/AdamDistributorV2.sol:144:9\n    │\n144 │         poolManager.settle{value: ethIn}();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/AdamTreasuryV2.sol:191:32\n    │\n191 │         if (l.failures != 0 && block.timestamp > uint256(l.lastFailure) + gap) _resetFailures(l);\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/AdamTreasuryV2.sol:213:47\n    │\n213 │             if (l.failures >= MIN_FAILURES && block.timestamp >= uint256(l.failingSince) + LEG_FALLBACK_DELAY) {\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasuryV2.sol:208:51\n    │\n208 │             if (l.failures == 0) l.failingSince = uint64(block.timestamp);\n    │                                                   ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/AdamTreasuryV2.sol:209:29\n    │\n209 │             l.lastFailure = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/AdamTreasury.sol:262:53\n    │\n262 │                 zeroForOne: true, amountSpecified: -int256(ethIn), sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1\n    │                                                     ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' 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/AdamTreasury.sol:268:30\n    │\n268 │         if (ethDelta >= 0 || uint256(uint128(-ethDelta)) != ethIn) revert PartialFill();\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/AdamTreasury.sol:268:38\n    │\n268 │         if (ethDelta >= 0 || uint256(uint128(-ethDelta)) != ethIn) revert PartialFill();\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/AdamTreasury.sol:270:29\n    │\n270 │         uint256 amountOut = uint256(uint128(outDelta));\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/AdamTreasury.sol:270:37\n    │\n270 │         uint256 amountOut = uint256(uint128(outDelta));\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[unused-return]: return value of an external call is not used\n    ╭▸ src/AdamTreasury.sol:273:9\n    │\n273 │         poolManager.settle{value: ethIn}();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/AdamTreasury.sol:304:16\n    │\n304 │         return (afterTax * (BPS - slippageBps)) / BPS;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasury.sol:315:13\n    │\n315 │             emit TeamPaid(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/AdamTreasury.sol:318:13\n    │\n318 │             emit TeamPaymentDeferred(amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/AdamTreasury.sol:313:22\n    │\n313 │         (bool ok,) = teamWallet.call{value: amount, gas: TEAM_PUSH_GAS}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/AdamSplitOracle.sol:85:13\n   │\n85 │             emit ReportRejected(a.requestId);\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/AdamSplitOracle.sol:97:9\n   │\n97 │         emit SplitUpdated(weights[0], weights[1], weights[2], a.requestId, values[3], 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/AdamTreasury.sol:325:32\n    │\n325 │         if (l.failures != 0 && block.timestamp > uint256(l.lastFailure) + allowedGap) _resetFailures(l);\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/AdamTreasury.sol:351:47\n    │\n351 │             if (l.failures >= MIN_FAILURES && block.timestamp >= uint256(l.failingSince) + LEG_FALLBACK_DELAY) {\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:345:34\n    │\n345 │                 l.failingSince = uint64(block.timestamp);\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/AdamTreasury.sol:347:29\n    │\n347 │             l.lastFailure = uint64(block.timestamp);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' 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/AdamSplitOracle.sol:108:41\n    │\n108 │                 || a.answerType != 5 || a.issuedAt > block.timestamp || a.issuedAt <= issuedAt\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/AdamSplitOracle.sol:109:20\n    │\n109 │                 || block.timestamp - a.issuedAt > MAX_AGE || a.expiresAt < block.timestamp || a.expiresAt < a.issuedAt\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/AdamSplitOracle.sol:109:62\n    │\n109 │                 || block.timestamp - a.issuedAt > MAX_AGE || a.expiresAt < block.timestamp || a.expiresAt < a.issuedAt\n    │                                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/AdamSplitOracle.sol:142:13\n    │\n142 │             sum += w[i];\n    │             ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/AdamSplitOracle.sol:144:25\n    │\n144 │         for (uint256 i; i < 3 && sum != 10000; ++i) {\n    │                         ━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamSplitOracle.sol:149:25\n    │\n149 │                 w[i] -= uint16(delta);\n    │                         ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' 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/AdamSplitOracle.sol:152:25\n    │\n152 │                 w[i] += uint16(delta);\n    │                         ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint16' 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/AdamSplitOracle.sol:159:30\n    │\n159 │         if (issuedAt == 0 || block.timestamp > uint256(issuedAt) + MAX_AGE || block.timestamp > expiresAt) {\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/AdamSplitOracle.sol:159:79\n    │\n159 │         if (issuedAt == 0 || block.timestamp > uint256(issuedAt) + MAX_AGE || block.timestamp > expiresAt) {\n    │                                                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/fuzz/Treasury.fuzz.t.sol:65:25\n   │\n65 │         uint256 clock = block.timestamp;\n   │                         ━━━━━━━━━━━━━━━\n   ‡\n72 │             vm.warp(clock);\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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/unit/AdamDistributor.t.sol:371:25\n    │\n371 │         uint256 start = block.timestamp;\n    │                         ━━━━━━━━━━━━━━━\n372 │         assertEq(dist.earned(alice, address(imd)), 0, \"no instant jackpot at threshold\");\n373 │         vm.warp(start + 1 days);\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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/unit/AdamDistributor.t.sol:395:25\n    │\n395 │         uint256 start = block.timestamp;\n    │                         ━━━━━━━━━━━━━━━\n396 │         vm.warp(start + 1 days);\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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/unit/AdamTreasury.t.sol:246:34\n    │\n246 │         assertEq(l.failingSince, block.timestamp);\n    │                                  ━━━━━━━━━━━━━━━\n    ‡\n251 │         vm.warp(block.timestamp + COOLDOWN);\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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/unit/AdamTreasury.t.sol:251:17\n    │\n251 │         vm.warp(block.timestamp + COOLDOWN);\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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/unit/AdamTreasury.t.sol:420:17\n    │\n420 │         vm.warp(block.timestamp + COOLDOWN);\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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/unit/AdamTreasury.t.sol:492:17\n    │\n492 │         vm.warp(block.timestamp + COOLDOWN);\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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/unit/Revision.t.sol:33:17\n   │\n33 │         vm.warp(block.timestamp + COOLDOWN);\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\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/unit/Revision.t.sol:108:17\n    │\n108 │         vm.warp(block.timestamp + 7 days);\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":5508,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/unit/OraclePublicVector.t.sol:OraclePublicVectorTest\n[PASS] testPublishedV2SignatureRecovery() (gas: 51274)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 711.76µs (539.41µs CPU time)\n\nRan 6 tests for test/unit/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 80130, ~: 80331)\n[PASS] test_metadata() (gas: 24465)\n[PASS] test_mintsFixedSupplyToDeployer() (gas: 23278)\n[PASS] test_noMintOrAdminEntryPoints() (gas: 143123)\n[PASS] test_transferMovesExactAmount() (gas: 74094)\n[PASS] test_transferRevertsOnInsufficientBalance() (gas: 34859)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 75.20ms (76.23ms CPU time)\n\nRan 7 tests for test/unit/AdamSplitOracle.t.sol:AdamSplitOracleTest\n[PASS] testBadTimesQuorumAndSumsFallBack() (gas: 357201)\n[PASS] testDomainReplayAndDuplicateCannotReplaceValidReport() (gas: 317501)\n[PASS] testFuzzClampedWeightsAlwaysSumAndBound(uint16,uint16) (runs: 256, μ: 10514, ~: 10391)\n[PASS] testFuzzMalformedReport(bytes) (runs: 256, μ: 44358, ~: 44181)\n[PASS] testInvalidSignatureReasonQuestionAndChain() (gas: 252774)\n[PASS] testMalformedAnswerNeverReverts() (gas: 148661)\n[PASS] testSignedClampedReportAndAgeBoundary() (gas: 227739)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 86.70ms (92.27ms CPU time)\n\nRan 12 tests for test/unit/DistributorAdversarial.t.sol:DistributorAdversarialTest\n[PASS] testFuzz_taxedRewardCreditsOnlyReceivedTokens(uint256,uint16) (runs: 1000, μ: 496787, ~: 499655)\n[PASS] testFuzz_twoEpochsFollowStakeOwnership(uint256,uint256,uint256,uint256) (runs: 1000, μ: 838948, ~: 846819)\n[PASS] test_allFixedExclusionsRejectStakeBeforeTokenInteraction() (gas: 418004)\n[PASS] test_claimCallbackCannotReenterAnyHolderOrRewardAction() (gas: 499412)\n[PASS] test_failedSecondPayoutRollsBackFirstPayoutAndCanRecover() (gas: 1014623)\n[PASS] test_failedStakeRollsBackBacklogAndShares() (gas: 554541)\n[PASS] test_falseReturningIntakeCannotCreateCredit() (gas: 244782)\n[PASS] test_fullSupplyCanStakeAndExit() (gas: 572723)\n[PASS] test_noReturnTokenCanNotifyAndClaim() (gas: 455184)\n[PASS] test_notifyCallbackCannotReenterAnyHolderOrRewardAction() (gas: 346714)\n[PASS] test_oneWeiAndCompleteTransferTax() (gas: 520803)\n[PASS] test_pausedRewardCannotTrapUnstakedPrincipal() (gas: 607748)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 86.68ms (174.45ms CPU time)\n\nRan 24 tests for test/unit/AdamDistributor.t.sol:AdamDistributorTest\n[PASS] testFuzz_backlogConservation(uint128,uint32) (runs: 256, μ: 583343, ~: 605095)\n[PASS] testFuzz_claimsNeverExceedDistributed(uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 1313325, ~: 1339178)\n[PASS] testFuzz_stakeUnstakeRoundTrip(uint256,uint256) (runs: 256, μ: 251183, ~: 251358)\n[PASS] test_backlogPausesBelowThresholdWithoutRetroactiveVesting() (gas: 907435)\n[PASS] test_backlogStreamsAndNewcomerCannotClaimPastTime() (gas: 1496844)\n[PASS] test_claimIsReentrancySafe() (gas: 1391420)\n[PASS] test_claimWithNothingIsANoop() (gas: 70146)\n[PASS] test_constructorState() (gas: 78331)\n[PASS] test_constructorValidation() (gas: 10329)\n[PASS] test_dustCannotCaptureBacklogEvenAfterWaiting() (gas: 792789)\n[PASS] test_exitAfterUnstakeStillClaims() (gas: 557290)\n[PASS] test_exitWithdrawsAndClaims() (gas: 452478)\n[PASS] test_extraExclusionIsApplied() (gas: 17907)\n[PASS] test_noOwnerOrAdminEntryPoints() (gas: 118454)\n[PASS] test_notifyRejectsUnknownTokenAndZero() (gas: 1127290)\n[PASS] test_notifyRequiresAllowance() (gas: 50801)\n[PASS] test_rewardsBeforeAnyStakeWaitForMeaningfulStake() (gas: 400286)\n[PASS] test_rewardsOnlyAccrueWhileStaked() (gas: 669298)\n[PASS] test_rewardsProRataAcrossTwoTokens() (gas: 1040323)\n[PASS] test_stakeAndUnstake() (gas: 275331)\n[PASS] test_stakeRejectsZeroAndExcluded() (gas: 204572)\n[PASS] test_tokensSentDirectlyAreNotStakedButRewardsFromBalanceDiff() (gas: 220431)\n[PASS] test_unstakeKeepsAccruedRewardsClaimable() (gas: 526766)\n[PASS] test_unstakeMoreThanStakedReverts() (gas: 207505)\nSuite result: ok. 24 passed; 0 failed; 0 skipped; finished in 85.58ms (147.19ms CPU time)\n\nRan 5 tests for test/unit/ExtensionDeploy.t.sol:ExtensionDeployTest\n[PASS] testClaimConstructorRejectsNonexcludedAddress() (gas: 12561)\n[PASS] testDeployFailsWrongChainMissingTokenOrUnavailableSnapshot() (gas: 10974955)\n[PASS] testExistingTokenReusedAndExactlyElevenPercentFunded() (gas: 19178704)\n[PASS] testFundFromScriptCreatorAndNoMint() (gas: 18912996)\n[PASS] testRunUsesExplicitManualSignerAndExistingSupply() (gas: 18920522)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 191.29ms (2.83ms CPU time)\n\nRan 4 tests for test/unit/PostFactoryHook.t.sol:PostFactoryHookTest\n[PASS] test_feesFromHookedPoolReachManifestedDistributor() (gas: 1322980)\n[PASS] test_hookOnlyDeploymentReusesManifestedPipeline() (gas: 65960)\n[PASS] test_launchPoolRejectsAllocationAboveHolding() (gas: 89595)\n[PASS] test_resolvePipelineRejectsMismatchedConfig() (gas: 250817)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 215.23ms (1.52ms CPU time)\n\nRan 10 tests for test/unit/AdamExtension.t.sol:AdamExtensionTest\n[PASS] testCallbackAndAtomicSelfCallGuards() (gas: 98261)\n[PASS] testETHBacklogThresholdAndNewStakeNoPastRewards() (gas: 743625)\n[PASS] testFuzzETHConservation(uint96) (runs: 256, μ: 882761, ~: 919160)\n[PASS] testLegFailureIsolationRetriesRerouteAndNoSecondBounty() (gas: 13126448)\n[PASS] testOneTimeDirectSwitchPreservesOldETHCredits() (gas: 1823532)\n[PASS] testRejectingKeeperCreditsAreReservedAndPullable() (gas: 926275)\n[PASS] testReportWeightsAndStaleFallback() (gas: 1532171)\n[PASS] testSlippageDeadlineAndFailurePreserveClaim() (gas: 1123467)\n[PASS] testThirdLegFailureAfterWhitelistRevokedReroutes() (gas: 9661598)\n[PASS] testThreeLegPullRewardsAndKeeper() (gas: 1603198)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 250.63ms (90.49ms CPU time)\n\nRan 2 tests for test/unit/Integration.t.sol:IntegrationTest\n[PASS] test_excludedAddressesEarnNothing() (gas: 1111838)\n[PASS] test_fullLifecycle() (gas: 2254332)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 262.86ms (3.04ms CPU time)\n\nRan 5 tests for test/unit/NFTClaim.t.sol:NFTClaimTest\n[PASS] testBatchDuplicateStakeAndNoRewardsForClaimContract() (gas: 450138)\n[PASS] testBurnDeadlineAndBurnedNFT() (gas: 286120)\n[PASS] testDailyUnlockAndTransferredOwnership() (gas: 399125)\n[PASS] testFuzzUnlockConservation(uint8,uint8) (runs: 256, μ: 123125, ~: 123077)\n[PASS] testInvalidIdsUnauthorizedAndBatchAtomicity() (gas: 205822)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 292.62ms (101.19ms CPU time)\n\nRan 20 tests for test/unit/AdamTreasury.t.sol:AdamTreasuryTest\n[PASS] test_anyoneCanProcess() (gas: 493995)\n[PASS] test_capPerCallLeavesRemainderUnsplit() (gas: 546448)\n[PASS] test_constructorValidation() (gas: 15276)\n[PASS] test_cooldownBetweenCalls() (gas: 890008)\n[PASS] test_distributorPendingRewardsFlowToStakersLater() (gas: 1668566)\n[PASS] test_flushRewardsForwardsStrandedTokens() (gas: 188424)\n[PASS] test_immutablesAndLegs() (gas: 94419)\n[PASS] test_legFailsWhenHookTaxExceedsAssumption_pendingIsKept() (gas: 1057483)\n[PASS] test_legFailureEmitsReason() (gas: 483403)\n[PASS] test_legsReceiveEqualEth() (gas: 533038)\n[PASS] test_noWithdrawalPathForAnyone() (gas: 147548)\n[PASS] test_ownSwapImpactAboveSlippageIsRejected() (gas: 494486)\n[PASS] test_processRevertsWhenNothingToDo() (gas: 43991)\n[PASS] test_processSplitsTenNinetyAndBuysBothTokens() (gas: 616811)\n[PASS] test_quoteMinOutMatchesSpotMath() (gas: 69243)\n[PASS] test_rerouteAfterThreeDaysOfFailure() (gas: 10501328)\n[PASS] test_rerouteWorksInBothDirections() (gas: 5707518)\n[PASS] test_teamPushFailureIsDeferredNotBlocking() (gas: 858871)\n[PASS] test_teamWalletCannotReenterProcess() (gas: 2264891)\n[PASS] test_unlockCallbackIsGuarded() (gas: 63177)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 318.88ms (19.88ms CPU time)\n\nRan 4 tests for test/unit/ExtensionAdversarial.t.sol:ExtensionAdversarialTest\n[PASS] testBountyCallbackCannotReenterOrDoubleAllocate() (gas: 1107111)\n[PASS] testDirectTokenLockCannotPreventPrincipalOrOtherRewards() (gas: 2119543)\n[PASS] testFuzzTwoStakersNeverClaimMoreETHThanFunded(uint96,uint96,uint64) (runs: 256, μ: 1131431, ~: 1127434)\n[PASS] testNFTStakeCallbackCannotReenterAndAllowanceIsCleared() (gas: 837558)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 325.64ms (131.89ms CPU time)\n\nRan 11 tests for test/unit/Revision.t.sol:RevisionTest\n[PASS] testFuzz_exactOutputFeesAreGrossRate(uint32,uint128) (runs: 256, μ: 339354, ~: 339529)\n[PASS] test_constructorCheckpointAlsoProtectsFirstProcess() (gas: 641507)\n[PASS] test_dustWaitsWithoutStartingFailureStreak() (gas: 735279)\n[PASS] test_emptySellCannotChargeFeeOrStartClock() (gas: 372591)\n[PASS] test_exactOutputAndInputBuySameGrossFeeAtLaunch() (gas: 371741)\n[PASS] test_firstFilledSwapStartsFullDecayAfterDeploymentDelay() (gas: 223443)\n[PASS] test_hookAndTreasuryHaveNoStakingEntryPoint() (gas: 69695)\n[PASS] test_partialInputBuyRevertsAndReturnsEntireFee() (gas: 456031)\n[PASS] test_sandwichCannotLowerCheckpointFloor() (gas: 1640145)\n[PASS] test_thinPoolRecoversAtSmallerSize() (gas: 2347683)\n[PASS] test_twoIsolatedFailuresDoNotReroute() (gas: 959835)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 334.02ms (100.20ms CPU time)\n\nRan 22 tests for test/unit/AdamHook.t.sol:AdamHookTest\n[PASS] testFuzz_buyFeeMatchesSchedule(uint256,uint32) (runs: 256, μ: 331207, ~: 331448)\n[PASS] testFuzz_decayIsMonotoneAndBounded(uint32,uint32) (runs: 256, μ: 196461, ~: 196467)\n[PASS] test_addressCarriesExactlyTheRequiredFlags() (gas: 11990)\n[PASS] test_antiSnipeFeeAtLaunchIs20Percent() (gas: 185840)\n[PASS] test_buyExactInput_takes1_5PercentOfEthIn() (gas: 344650)\n[PASS] test_buyExactOutput_feeIsAddedOnTopOfEthIn() (gas: 346566)\n[PASS] test_callbacksRejectNonPoolManager() (gas: 90662)\n[PASS] test_constructorRejectsUnflaggedAddress() (gas: 12526)\n[PASS] test_decaySchedule() (gas: 223238)\n[PASS] test_feeCannotBeRaisedOrKept() (gas: 122115)\n[PASS] test_feeEventsAreEmitted() (gas: 333635)\n[PASS] test_initialState() (gas: 43167)\n[PASS] test_initializeOnlyOnce() (gas: 46279)\n[PASS] test_initializeRejectsWrongPair() (gas: 6491850)\n[PASS] test_initializeRequiresOwner() (gas: 6602669)\n[PASS] test_lowerFee() (gas: 240682)\n[PASS] test_lowerFeeDuringDecayKeepsDecaying() (gas: 220132)\n[PASS] test_lowerFeeToZeroDisablesFee() (gas: 358245)\n[PASS] test_onlyOwnerLowersFee() (gas: 35222)\n[PASS] test_sellExactInput_takes1_5PercentOfEthOut() (gas: 487228)\n[PASS] test_sellExactOutput_feeIsAddedOnTopOfEthOut() (gas: 467067)\n[PASS] test_twoStepOwnershipTransfer() (gas: 144671)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 354.13ms (270.52ms CPU time)\n\nRan 4 tests for test/unit/HookAdversarial.t.sol:HookAdversarialTest\n[PASS] testFuzz_exactInputSellChargesGrossEthAtAnyDecayTime(uint256,uint32,uint16) (runs: 1000, μ: 385834, ~: 386362)\n[PASS] testFuzz_exactOutputSellDeliversRequestedNetAndGrossFee(uint256,uint32) (runs: 1000, μ: 351492, ~: 351835)\n[PASS] test_decayBoundariesAndNoFeeResurrection() (gas: 526002)\n[PASS] test_partialExactOutputSellRevertsFeeAndPoolMovement() (gas: 480909)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 354.05ms (240.25ms CPU time)\n\nRan 4 tests for test/fuzz/Treasury.fuzz.t.sol:TreasuryFuzzTest\n[PASS] testFuzz_accountingIdentityHolds(uint256,uint16,uint8) (runs: 256, μ: 1090310, ~: 1062396)\n[PASS] testFuzz_capAndConservation(uint256) (runs: 256, μ: 549601, ~: 549630)\n[PASS] testFuzz_quoteIsLinear(uint256) (runs: 256, μ: 91949, ~: 91978)\n[PASS] testFuzz_splitIsExact(uint256) (runs: 256, μ: 524468, ~: 524542)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 354.08ms (274.35ms CPU time)\n\nRan 4 tests for test/unit/TreasuryBoundaries.t.sol:TreasuryBoundariesTest\n[PASS] testFuzz_directionalProtocolFeesPreserveExecutableOutputFloors(uint16,uint16) (runs: 1000, μ: 845355, ~: 845377)\n[PASS] test_cooldownRejectsOneSecondEarlyAndAcceptsExactBoundary() (gas: 996842)\n[PASS] test_deferredAndDirectTeamPaymentsGuardEveryMaintenanceEntryPoint() (gas: 1543795)\n[PASS] test_failureGapContinuesAtBoundaryAndResetsOneSecondLater() (gas: 1146904)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 354.12ms (185.99ms CPU time)\n\nRan 4 tests for test/unit/Integration.t.sol:DeployWiringTest\n[PASS] test_contractsAreWiredTogether() (gas: 62290)\n[PASS] test_deployWithExistingToken() (gas: 460217585)\n[PASS] test_launchPoolRejectsMisconfiguration() (gas: 145489)\n[PASS] test_mainnetConfigConstants() (gas: 14612)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.75s (1.48s CPU time)\n\nRan 1 test for test/invariant/Treasury.invariant.t.sol:TreasuryInvariantTest\n[PASS]\nTreasuryInvariantTest invariants:\n[PASS] invariant_ethIsConservedAcrossIndependentCustodians\n[PASS] invariant_rewardsReachDistributorWithoutUnbackedCredit\n TreasuryInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+------------------+-------+---------+----------╮\n| Contract        | Selector         | Calls | Reverts | Discards |\n+=================================================================+\n| TreasuryHandler | donateReward     | 2096  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | elapse           | 2083  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | flush            | 1980  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | fund             | 2035  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | market           | 2026  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | payTeam          | 2047  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | process          | 2043  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | teamAvailability | 2074  | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.04s (2.87s CPU time)\n\nRan 1 test for test/invariant/Distributor.invariant.t.sol:DistributorInvariantTest\n[PASS]\nDistributorInvariantTest invariants:\n[PASS] invariant_principalAndFixedSupplyAreConserved\n[PASS] invariant_rewardsAreBackedAndConserved\n DistributorInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+-------------------+-------+---------+----------╮\n| Contract           | Selector          | Calls | Reverts | Discards |\n+=====================================================================+\n| DistributorHandler | claim             | 1850  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | donate            | 1806  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | elapse            | 1854  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | invalidWithdrawal | 1767  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | move              | 1808  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | reward            | 1840  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | roundTrip         | 1836  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | stake             | 1829  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | unstake           | 1794  | 0       | 0        |\n╰--------------------+-------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.29s (5.28s CPU time)\n\nRan 20 test suites in 5.29s (14.02s CPU time): 151 tests passed, 0 failed, 0 skipped (151 total tests)\n","passed":true},{"durationMs":129,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"AdamDistributor.claim()\",\"AdamDistributor.exit()\",\"AdamDistributor.notifyReward(address,uint256)\",\"AdamDistributor.stake(uint256)\",\"AdamDistributor.unstake(uint256)\",\"AdamDistributorV2.claim()\",\"AdamDistributorV2.claimIMDSTR(uint256,uint256,uint256)\",\"AdamDistributorV2.claimReward(address)\",\"AdamDistributorV2.enableDirectDistribution()\",\"AdamDistributorV2.exit()\",\"AdamDistributorV2.notifyIMDSTR(uint256)\",\"AdamDistributorV2.notifyReward(address,uint256)\",\"AdamDistributorV2.stake(uint256)\",\"AdamDistributorV2.stakeFor(address,uint256)\",\"AdamDistributorV2.unlockCallback(bytes)\",\"AdamDistributorV2.unstake(uint256)\",\"AdamHook.acceptOwnership()\",\"AdamHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"AdamHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"AdamHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"AdamHook.lowerFee(uint16)\",\"AdamHook.renounceOwnership()\",\"AdamHook.transferOwnership(address)\",\"AdamSplitOracle.checkpoint()\",\"AdamSplitOracle.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes,string)\",\"AdamTreasury.flushRewards()\",\"AdamTreasury.payTeam()\",\"AdamTreasury.process()\",\"AdamTreasury.receive()\",\"AdamTreasury.unlockCallback(bytes)\",\"AdamTreasuryV2.claimKeeper(address)\",\"AdamTreasuryV2.executeV2(uint8,uint256)\",\"AdamTreasuryV2.flushRewards()\",\"AdamTreasuryV2.payTeam()\",\"AdamTreasuryV2.process()\",\"AdamTreasuryV2.receive()\",\"AdamTreasuryV2.unlockCallback(bytes)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\",\"NFTClaim.burnUnclaimed()\",\"NFTClaim.claim(uint8,uint256[])\",\"NFTClaim.claimAndStake(uint8,uint256[])\"],\"files\":{\".gitignore\":4,\"README.md\":77,\"SELF_AUDIT.md\":28,\"docs/HEARTBEAT.md\":77,\"docs/LEGACY_README.md\":83,\"docs/MAINNET_SNAPSHOT.json\":41,\"foundry.toml\":32,\"launch.json\":49,\"remappings.txt\":9,\"script/DeployAdam.s.sol\":295,\"script/DeployAdamExtension.s.sol\":141,\"script/utils/HookMiner.sol\":60,\"src/AdamDistributor.sol\":265,\"src/AdamDistributorV2.sol\":150,\"src/AdamHook.sol\":276,\"src/AdamSplitOracle.sol\":173,\"src/AdamTreasury.sol\":368,\"src/AdamTreasuryV2.sol\":225,\"src/LaunchToken.sol\":18,\"src/NFTClaim.sol\":116,\"src/interfaces/IAdamDistributor.sol\":9,\"test/REVISION.md\":39,\"test/TESTING.md\":36,\"test/fork/IMDSTRFork.t.sol\":149,\"test/fork/MainnetFork.t.sol\":235,\"test/fuzz/Treasury.fuzz.t.sol\":102,\"test/invariant/Distributor.invariant.t.sol\":257,\"test/invariant/Treasury.invariant.t.sol\":247,\"test/unit/AdamDistributor.t.sol\":425,\"test/unit/AdamExtension.t.sol\":230,\"test/unit/AdamHook.t.sol\":279,\"test/unit/AdamSplitOracle.t.sol\":152,\"test/unit/AdamTreasury.t.sol\":503,\"test/unit/DistributorAdversarial.t.sol\":310,\"test/unit/ExtensionAdversarial.t.sol\":125,\"test/unit/ExtensionDeploy.t.sol\":87,\"test/unit/HookAdversarial.t.sol\":102,\"test/unit/Integration.t.sol\":161,\"test/unit/LaunchToken.t.sol\":65,\"test/unit/NFTClaim.t.sol\":109,\"test/unit/OraclePublicVector.t.sol\":41,\"test/unit/PostFactoryHook.t.sol\":152,\"test/unit/Revision.t.sol\":198,\"test/unit/TreasuryBoundaries.t.sol\":197,\"test/utils/ExtensionFixture.sol\":182,\"test/utils/LocalV4.sol\":224,\"test/utils/MockTaxHook.sol\":130},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":9078,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/AdamDistributorV2.sol:134: Reentrancy in AdamDistributorV2.unlockCallback(bytes) (src/AdamDistributorV2.sol#134-149):\n[high/medium] reentrancy-balance at src/AdamDistributorV2.sol:134: Reentrancy in AdamDistributorV2.unlockCallback(bytes) (src/AdamDistributorV2.sol#134-149):\n[high/medium] reentrancy-eth at src/AdamTreasury.sol:194: Reentrancy in AdamTreasury.process() (src/AdamTreasury.sol#194-218):\n[high/medium] reentrancy-eth at src/AdamTreasury.sol:194: Reentrancy in AdamTreasury.process() (src/AdamTreasury.sol#194-218):\n[high/medium] reentrancy-eth at src/AdamTreasuryV2.sol:98: Reentrancy in AdamTreasuryV2.process() (src/AdamTreasuryV2.sol#98-143):\n[medium/medium] divide-before-multiply at src/AdamTreasury.sol:293: AdamTreasury.quoteMinOut(uint8,uint256) (src/AdamTreasury.sol#293-305) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/NFTClaim.sol:95: NFTClaim._claim(uint8,uint256[],bool) (src/NFTClaim.sol#95-108) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/AdamHook.sol:110: AdamHook.currentFeeBps() (src/AdamHook.sol#110-118) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/AdamTreasury.sol:311: AdamTreasury._pushTeam(uint256) (src/AdamTreasury.sol#311-320) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/AdamTreasury.sol:231: AdamTreasury.flushRewards() (src/AdamTreasury.sol#231-240) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/AdamDistributor.sol:148: AdamDistributor.notifyReward(address,uint256) (src/AdamDistributor.sol#148-159) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/AdamDistributor.sol:244: AdamDistributor._releaseBacklog(address) (src/AdamDistributor.sol#244-251) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/AdamTreasuryV2.sol:98: AdamTreasuryV2.process() (src/AdamTreasuryV2.sol#98-143) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/AdamDistributor.sol:255: AdamDistributor._syncBacklogStreams() (src/AdamDistributor.sol#255-264) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/AdamTreasuryV2.sol:98: Reentrancy in AdamTreasuryV2.process() (src/AdamTreasuryV2.sol#98-143):\n[medium/medium] reentrancy-no-eth at src/AdamTreasuryV2.sol:98: Reentrancy in AdamTreasuryV2.process() (src/AdamTreasuryV2.sol#98-143):\n[medium/medium] reentrancy-no-eth at src/AdamTreasuryV2.sol:188: Reentrancy in AdamTreasuryV2._executeLeg(uint8) (src/AdamTreasuryV2.sol#188-224):\n[medium/medium] reentrancy-no-eth at src/AdamTreasury.sol:322: Reentrancy in AdamTreasury._executeLeg(uint8) (src/AdamTreasury.sol#322-360):\n[medium/medium] uninitialized-local at src/AdamTreasuryV2.sol:92: AdamTreasuryV2._distributorKey(AdamDistributorV2).key (src/AdamTreasuryV2.sol#92) is a local variable never initialized\n[medium/medium] uninitialized-local at src/AdamTreasuryV2.sol:109: AdamTreasuryV2.process().bounty (src/AdamTreasuryV2.sol#109) is a local variable never initialized\n[medium/medium] uninitialized-local at src/AdamSplitOracle.sol:138: AdamSplitOracle.clamp(uint16,uint16,uint16).sum (src/AdamSplitOracle.sol#138) is a local variable never initialized\n[medium/medium] unused-return at src/AdamTreasury.sol:293: AdamTreasury.quoteMinOut(uint8,uint256) (src/AdamTreasury.sol#293-305) ignores return value by (sqrtPriceX96,None,protocolFee,lpFee) = poolManager.getSlot0(l.key.toId()) (src/AdamTreasury.sol#295)\n[medium/medium] unused-return at src/AdamTreasuryV2.sol:43: AdamTreasuryV2.constructor(AdamTreasuryV2.Config) (src/AdamTreasuryV2.sol#43-84) ignores return value by (_legs[2].checkpointSqrtPriceX96,None,None,None) = poolManager.getSlot0(c.keys[2].toId()) (src/AdamTreasuryV2.sol#83)\n[medium/medium] unused-return at src/AdamSplitOracle.sol:101: AdamSplitOracle._valid(AdamSplitOracle.Attestation,bytes,string) (src/AdamSplitOracle.sol#101-132) ignores return value by (recovered,err,None) = ECDSA.tryRecover(digest(a),signature) (src/AdamSplitOracle.sol#130)\n[medium/medium] unused-return at src/AdamTreasury.sol:252: AdamTreasury.unlockCallback(bytes) (src/AdamTreasury.sol#252-276) ignores return value by poolManager.settle{value: ethIn}() (src/AdamTreasury.sol#273)\n[medium/medium] unused-return at src/AdamTreasury.sol:125: AdamTreasury.constructor(address,address,address,address,uint24,uint24,address,uint16,address,uint24,uint24,address,uint16,uint256,uint16,uint32) (src/AdamTreasury.sol#125-183) ignores return value by (_legs[i].checkpointSqrtPriceX96,None,None,None) = poolManager.getSlot0(_legs[i].key.toId()) (src/AdamTreasury.sol#180)\n[medium/medium] unused-return at src/AdamTreasuryV2.sol:188: AdamTreasuryV2._executeLeg(uint8) (src/AdamTreasuryV2.sol#188-224) ignores return value by (l.checkpointSqrtPriceX96,None,None,None) = poolManager.getSlot0(l.key.toId()) (src/AdamTreasuryV2.sol#203)\n[medium/medium] unused-return at src/AdamTreasury.sol:322: AdamTreasury._executeLeg(uint8) (src/AdamTreasury.sol#322-360) ignores return value by (l.checkpointSqrtPriceX96,None,None,None) = poolManager.getSlot0(l.key.toId()) (src/AdamTreasury.sol#338)\n[medium/medium] unused-return at src/AdamDistributorV2.sol:134: AdamDistributorV2.unlockCallback(bytes) (src/AdamDistributorV2.sol#134-149) ignores return value by poolManager.settle{value: ethIn}() (src/AdamDistributorV2.sol#144)\n[medium/high] write-after-write at src/AdamDistributorV2.sol:29: AdamDistributorV2._swapping (src/AdamDistributorV2.sol#29) is written in both\n[low/medium] calls-loop at src/AdamTreasuryV2.sol:188: AdamTreasuryV2._executeLeg(uint8) (src/AdamTreasuryV2.sol#188-224) has external calls inside a loop: id != LEG_IMDSTR || distributorV2.directDistribution() (src/AdamTreasuryV2.sol#202)\n[low/medium] calls-loop at src/NFTClaim.sol:95: NFTClaim._claim(uint8,uint256[],bool) (src/NFTClaim.sol#95-108) has external calls inside a loop: swarmPepe.ownerOf(id) != msg.sender (src/NFTClaim.sol#100)\n[low/medium] calls-loop at src/NFTClaim.sol:95: NFTClaim._claim(uint8,uint256[],bool) (src/NFTClaim.sol#95-108) has external calls inside a loop: imdNFT.ownerOf(id) != msg.sender (src/NFTClaim.sol#100)\n[low/medium] calls-loop at src/AdamTreasuryV2.sol:188: AdamTreasuryV2._executeLeg(uint8) (src/AdamTreasuryV2.sol#188-224) has external calls inside a loop: out = this.executeV2(id,ethIn) (src/AdamTreasuryV2.sol#198-223)\n[low/medium] calls-loop at src/NFTClaim.sol:95: NFTClaim._claim(uint8,uint256[],bool) (src/NFTClaim.sol#95-108) has external calls inside a loop: swarmPepe.ownerOf(id) != msg.sender (src/NFTClaim.sol#100)\n[low/medium] calls-loop at src/NFTClaim.sol:95: NFTClaim._claim(uint8,uint256[],bool) (src/NFTClaim.sol#95-108) has external calls inside a loop: imdNFT.ownerOf(id) != msg.sender (src/NFTClaim.sol#100)\n[low/medium] calls-loop at src/AdamTreasury.sol:231: AdamTreasury.flushRewards() (src/AdamTreasury.sol#231-240) has external calls inside a loop: balance = IERC20(token).balanceOf(address(this)) (src/AdamTreasury.sol#234)\n[low/medium] calls-loop at src/AdamTreasury.sol:231: AdamTreasury.flushRewards() (src/AdamTreasury.sol#231-240) has external calls inside a loop: distributor.notifyReward(token,balance) (src/AdamTreasury.sol#237)\n[low/medium] reentrancy-benign at src/AdamDistributorV2.sol:127: Reentrancy in AdamDistributorV2._buy(address,uint256,uint256) (src/AdamDistributorV2.sol#127-132):\n[low/medium] reentrancy-benign at src/AdamTreasury.sol:311: Reentrancy in AdamTreasury._pushTeam(uint256) (src/AdamTreasury.sol#311-320):\n[low/medium] reentrancy-benign at src/AdamTreasuryV2.sol:98: Reentrancy in AdamTreasuryV2.process() (src/AdamTreasuryV2.sol#98-143):\n[low/medium] reentrancy-benign at src/AdamTreasury.sol:194: Reentrancy in AdamTreasury.process() (src/AdamTreasury.sol#194-218):\n[low/medium] reentrancy-benign at src/AdamTreasuryV2.sol:98: Reentrancy in AdamTreasuryV2.process() (src/AdamTreasuryV2.sol#98-143):\n[low/medium] reentrancy-benign at src/AdamTreasury.sol:194: Reentrancy in AdamTreasury.process() (src/AdamTreasury.sol#194-218):\n[low/medium] reentrancy-benign at src/AdamDistributorV2.sol:88: Reentrancy in AdamDistributorV2.notifyIMDSTR(uint256) (src/AdamDistributorV2.sol#88-100):\n[low/medium] reentrancy-events at src/AdamHook.sol:270: Reentrancy in AdamHook._takeFee(SwapParams,uint256) (src/AdamHook.sol#270-275):\n[low/medium] return-bomb at src/AdamTreasury.sol:311: AdamTreasury._pushTeam(uint256) (src/AdamTreasury.sol#311-320) tries to limit the gas of an external call that controls implicit decoding\n[low/medium] return-bomb at src/AdamTreasuryV2.sol:98: AdamTreasuryV2.process() (src/AdamTreasuryV2.sol#98-143) tries to limit the gas of an external call that controls implicit decoding\n[low/medium] timestamp at src/NFTClaim.sol:110: NFTClaim.burnUnclaimed() (src/NFTClaim.sol#110-115) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamHook.sol:270: AdamHook._takeFee(SwapParams,uint256) (src/AdamHook.sol#270-275) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamTreasuryV2.sol:188: AdamTreasuryV2._executeLeg(uint8) (src/AdamTreasuryV2.sol#188-224) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamDistributor.sol:216: AdamDistributor._settle(address) (src/AdamDistributor.sol#216-225) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamDistributorV2.sol:104: AdamDistributorV2.claimIMDSTR(uint256,uint256,uint256) (src/AdamDistributorV2.sol#104-118) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamDistributor.sol:244: AdamDistributor._releaseBacklog(address) (src/AdamDistributor.sol#244-251) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamTreasury.sol:322: AdamTreasury._executeLeg(uint8) (src/AdamTreasury.sol#322-360) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamDistributor.sol:235: AdamDistributor._backlogDue(address) (src/AdamDistributor.sol#235-241) uses timestamp for comparisons\n[low/medium] timestamp at src/NFTClaim.sol:95: NFTClaim._claim(uint8,uint256[],bool) (src/NFTClaim.sol#95-108) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamSplitOracle.sol:101: AdamSplitOracle._valid(AdamSplitOracle.Attestation,bytes,string) (src/AdamSplitOracle.sol#101-132) uses timestamp for comparisons\n[low/medium] timestamp at src/NFTClaim.sol:44: NFTClaim.constructor(address,address,address,address,uint256,uint256,uint256) (src/NFTClaim.sol#44-66) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamHook.sol:182: AdamHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/AdamHook.sol#182-203) uses timestamp for comparisons\n[low/medium] timestamp at src/NFTClaim.sol:75: NFTClaim.claimable(uint8,uint256) (src/NFTClaim.sol#75-81) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamHook.sol:110: AdamHook.currentFeeBps() (src/AdamHook.sol#110-118) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamTreasuryV2.sol:98: AdamTreasuryV2.process() (src/AdamTreasuryV2.sol#98-143) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamHook.sol:163: AdamHook.beforeSwap(address,PoolKey,SwapParams,bytes) (src/AdamHook.sol#163-180) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamTreasury.sol:194: AdamTreasury.process() (src/AdamTreasury.sol#194-218) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamSplitOracle.sol:158: AdamSplitOracle.currentSplit() (src/AdamSplitOracle.sol#158-163) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamDistributor.sol:255: AdamDistributor._syncBacklogStreams() (src/AdamDistributor.sol#255-264) uses timestamp for comparisons","passed":true},{"durationMs":945,"exitCode":0,"name":"aderyn","output":"[high] contract-locks-ether at src/AdamDistributorV2.sol:22: Contract locks Ether without a withdraw function\n[high] eth-send-unchecked-address at src/AdamTreasury.sol:194: ETH transferred without address checks (3 places)\n[high] reentrancy-state-change at src/AdamDistributorV2.sol:122: Reentrancy: State change after external call (5 places)\n[low] centralization-risk at src/AdamHook.sol:39: Centralization Risk (2 places)\n[low] costly-loop at src/AdamDistributor.sol:204: Costly operations inside loop (5 places)\n[low] large-numeric-literal at src/AdamHook.sol:43: Large Numeric Literal (14 places)\n[low] literal-instead-of-constant at src/AdamSplitOracle.sol:89: Literal Instead of Constant (32 places)\n[low] local-variable-shadowing at src/AdamSplitOracle.sol:23: Local Variable Shadows State Variable (7 places)\n[low] require-revert-in-loop at src/AdamDistributor.sol:204: Loop Contains `require`/`revert` (4 places)\n[low] state-variable-could-be-immutable at src/AdamDistributor.sol:37: State Variable Could Be Immutable\n[low] storage-array-length-not-cached at src/AdamDistributor.sol:256: Storage Array Length not Cached\n[low] uninitialized-local-variable at src/AdamDistributor.sol:204: Uninitialized Local Variable (7 places)\n[low] unused-public-function at src/AdamDistributor.sol:170: Public Function Not Used Internally\n[low] unused-state-variable at src/AdamTreasury.sol:56: Unused State Variable","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"42ced304d13563d3e26535d86b029130549f7a2c96af8b8f49dbcf132040b40b","verifiedTreeHash":"b9bc68227a11456c7029629103d5047c9105ee7e","verifierVersion":"0.1.0+b4c7ae3a"}]}