{"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":"fcd37662-83bf-4c94-9dce-c8b516eaa9e3","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"619a9d6e6e35a1b4739b35f0d371c23e7f45aaadfbf37a22e2f20064060f0116","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 — apply two changes from the independent audit (continue from parent job). Single job, do NOT ask clarifying questions. Keep everything else exactly as is: token, hook, fees, splits, oracle, NFTClaim, IMDSTR logic, bounds, keeper bounty.\n\n## 1. Fix audit finding A-01 (just-in-time staking)\n- AdamDistributorV2: unstake (and exit/withdraw of principal) is allowed only 24 hours after the wallet's most recent stake. Every new stake or stakeFor (incl. NFTClaim.claimAndStake) resets that wallet's 24h lock.\n- Reward claims (claimReward, claimIMDSTR, any per-asset claim) stay available at any time; reward accounting unchanged.\n- Expose unlockTime(wallet) view; revert with a clear custom error before the lock ends.\n- Tests: stake → unstake before 24h reverts, after 24h succeeds; top-up resets lock; claimAndStake sets lock for the claimant; rewards claimable during lock; JIT scenario (stake right before process(), try to exit) now blocked; invariants/fuzz still green.\n\n## 2. Permanent LP lock\n- DeployAdam hook-only path: mint the single-sided ETH/ADAM LP position NFT directly to 0x000000000000000000000000000000000000dEaD (recipient constant, not configurable). Nothing goes to the deployer.\n- LIQUIDITY_ADAM default = 890,000,000 ADAM when used after DeployAdamExtension (still overridable downward only by explicit env).\n- Fork test: after deploy, PositionManager ownerOf(lpId) == dead address, deployer holds no LP NFT, swaps work in both directions, liquidity cannot be decreased by deployer.\n\n## Deliverables\n1. Code changes + tests (unit, fuzz, fork). All green.\n2. README + deployment checklist updated (lock, 24h unstake rule, LP burned).\n3. Short changelog entry.\nNothing is broadcast; deployer signs manually.","parentJobId":"efe10e08-c8c8-486a-8f07-609470388a39","planHash":"ddc7896cd3f4a84152a5ac740cd7e8a1650dd5a6acf92f485c46466ca2724a17","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"e497ebcf-33bb-4548-bfd7-fa95843dc898","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-720-adam-official-x"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51305","feedbackHash":"54102c591661f6200e7f015d16febfa9287d03c1dcea89ee583e5c53278bdc3a","nodeKey":"build_contract_project","submissionHash":"619a9d6e6e35a1b4739b35f0d371c23e7f45aaadfbf37a22e2f20064060f0116","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52145","feedbackHash":"a46c9ed0ff2bb3cdc571e70da410d858d6706ddd606fbf518e1eea2ff2c034c9","nodeKey":"build_contract_project","submissionHash":"f165e5d67c31922c9196cedd1539ed84e3cd18e2c4300b94c248e20e596e6935","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"946add4b7e790343cacf10e705796c7a4e42eab4f58b1f9c65eb1805033d0ede","state":"completed","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"7b74dcaa35cdbee6e7c80b2d84b7a9bdf791e724c44af4d6fec03f75707dd082","device":"4576f670afa0131d","findings":[],"hash":"619a9d6e6e35a1b4739b35f0d371c23e7f45aaadfbf37a22e2f20064060f0116","nodeId":"f710df10-933f-4be6-bd98-eeda9159138c","outcome":"completed","summary":"Implemented both changes: V2’s 24-hour principal lock and hook-only LP minting directly to dead, with the 890 million ADAM default and downward-only overrides.\n\nValidation passed: build, formatting, 179 offline tests, second-seed fuzzing with 1,024 cases, and 11 fork tests.\n\nREADME, deployment checklist, changelog, and verification report updated. Protected configuration and dependencies unchanged. Nothing broadcast.","treeHash":"f5834a4cd03bcedff341f250d0262c7536be7ed6","usage":{"cachedInputTokens":4673536,"inputTokens":135669,"model":"gpt-6-astra","outputTokens":28447,"runtime":"codex","turns":14,"wallClockMs":1188341}},{"artifacts":[],"attempt":1,"bundleHash":"3dca49d67c25955cca6dd6221577ca7d80336722eff17f22e34b8a705cb42f07","device":"49d1d2fa353d99fb","findings":[],"hash":"f165e5d67c31922c9196cedd1539ed84e3cd18e2c4300b94c248e20e596e6935","nodeId":"f710df10-933f-4be6-bd98-eeda9159138c","outcome":"completed","summary":"Both audit changes are implemented and tested; nothing was broadcast and nothing is committed — the changes are in the working tree. `forge build` and `forge fmt --check` pass, `forge test` passes 188/188 offline, and the mainnet-fork profile passes 13/13.\n\n## 1. A-01: 24h unstake lock (`AdamDistributorV2`)\n- **Lock:** every `stake`, `stakeFor` and `NFTClaim.claimAndStake` sets `unlockTime(wallet)` to now + 24h for the wallet's whole staked balance. `unstake` and `exit` revert with `StakeLocked(unlockTime)` until then.\n- **Claims:** `claim`, `claimReward` and `claimIMDSTR` stay available at any time; reward accounting is unchanged.\n- **One behaviour change you did not ask for:** `stakeFor` now only accepts the beneficiary itself or NFTClaim (`UnauthorizedStakeFor`). If it stayed open while resetting locks, anyone could freeze another wallet's principal indefinitely with 1 wei per day. `claimAndStake` works as before.\n- **Residual:** a wallet staking just before `process()` still earns its pro-rata share of that distribution; it just cannot leave for 24h.\n- **Legacy V1:** `AdamDistributor` gained two empty internal hooks and remains lock-free.\n\n## 2. Permanent LP lock (`DeployAdam`)\n- **Recipient:** the position NFT is minted to the constant `LP_RECIPIENT = 0x…dEaD`. The script reverts with `LpNotLocked` unless `ownerOf(lpId)` is that address. This also applies to the legacy fixture path.\n- **Amount:** hook-only `LIQUIDITY_ADAM` defaults to 890,000,000 ADAM. Zero or anything above reverts with `InvalidLiquidityAdam`.\n- **Irreversible:** a wrong tick, price or amount cannot be corrected after signing; the checklist says so.\n\n## Tests\n- **Lock unit/fuzz** (`test/unit/StakeLock.t.sol`): covers every case in the brief, including the just-in-time scenario around `process()`, plus the blocked third-party `stakeFor`.\n- **Lock invariant** (`test/invariant/StakeLock.invariant.t.sol`): random stake/unstake/exit/claim/warp sequences with fail-on-revert.\n- **LP lock offline** (`test/unit/LpLock.t.sol`): runs the real v4 PositionManager code with a mock Permit2, since the full Permit2 is not vendored.\n- **Fork:** on live PositionManager and Permit2, `ownerOf(lpId)` is the dead address, the deployer holds no LP NFT, buys and sells work, and decrease, burn and transfer revert for the deployer.\n- **Existing tests edited:** three tests now warp past the lock before unstaking, and one audit test now expects third-party `stakeFor` to be rejected.\n\n## Docs\n- `README.md` has the 24h rule and a \"Permanent LP lock\" section.\n- `AUDIT.md` marks A-01 as fixed after the audit (and A-05 as addressed), with checklist steps 4, 7 and 8 updated.\n- `CHANGELOG.md` is new; `test/TESTING.md` lists the added coverage.\n\n## Open items for the deployer\n- The post-audit changes have not been independently re-reviewed.\n- Token, deployer, team wallet, NFT launch time and oracle question hash are still unspecified, as before.","treeHash":"a0000942fabf0789ae19c1956680135e303eb91d","usage":{"cachedInputTokens":2561694,"inputTokens":49,"model":"claude-fable-5-1","outputTokens":41198,"runtime":"claude","turns":28,"wallClockMs":2606223}}],"verification":[{"checks":[{"durationMs":117659,"exitCode":0,"name":"build","output":"Compiling 160 files with Solc 0.8.26\nSolc 0.8.26 finished in 117.44s\nCompiler run successful!\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[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/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/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[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[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[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[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-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[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/AdamDistributorV2.sol:55:30\n   │\n55 │                 || 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[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[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/AdamDistributorV2.sol:55:38\n   │\n55 │                 || 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[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[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/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[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:9\n   │\n95 │         emit StakeLockUpdated(wallet, unlockAt);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\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[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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/AdamDistributorV2.sol:77:9\n   │\n77 │         emit Staked(beneficiary, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\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[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[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/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-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[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[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/AdamTreasury.sol:227:9\n    │\n227 │         emit TeamPaid(amount);\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[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-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/AdamTreasuryV2.sol:153:9\n    │\n153 │         emit TeamPaid(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\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[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[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[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/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[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[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[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[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[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[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[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/AdamDistributorV2.sol:88:13\n   │\n88 │         if (block.timestamp < unlockAt) revert StakeLocked(msg.sender, unlockAt);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\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[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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamDistributorV2.sol:107:9\n    │\n107 │         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 `_status` is updated\n    ╭▸ src/AdamDistributorV2.sol:153:31\n    │\n153 │         bytes memory result = poolManager.unlock(abi.encode(recipient, ethIn, minOut));\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/AdamDistributorV2.sol:119:13\n    │\n119 │             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:122:13\n    │\n122 │             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/AdamDistributorV2.sol:133:13\n    │\n133 │         if (block.timestamp > deadline_ || minOut == 0 || ethAmount == 0 || ethAmount > maxEthPerClaim) {\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/AdamDistributorV2.sol:141:9\n    │\n141 │         emit IMDSTRClaimed(msg.sender, ethAmount, 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/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[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/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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamDistributor.sol:121:9\n    │\n121 │         emit Staked(msg.sender, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamDistributorV2.sol:162:59\n    │\n162 │             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:163:37\n    │\n163 │         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:166:23\n    │\n166 │         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:166:31\n    │\n166 │         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:168:9\n    │\n168 │         poolManager.settle{value: ethIn}();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\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:214:13\n    │\n214 │             emit RewardClaimed(account, token, 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:162:9\n    │\n162 │         emit RewardNotified(token, msg.sender, received, 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/AdamDistributor.sol:201:9\n    │\n201 │         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/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/AdamDistributor.sol:243:13\n    │\n243 │         if (elapsed > BACKLOG_DURATION) elapsed = BACKLOG_DURATION;\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamDistributor.sol:265:77\n    │\n265 │                 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[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/AdamExtension.t.sol:119:48\n    │\n119 │         d2.claimIMDSTR(due, type(uint128).max, block.timestamp);\n    │                                                ━━━━━━━━━━━━━━━\n    ‡\n131 │         vm.warp(d2.unlockTime(alice));\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/AdamExtension.t.sol:124:32\n    │\n124 │         d2.claimIMDSTR(due, 1, block.timestamp - 1);\n    │                                ━━━━━━━━━━━━━━━\n    ‡\n131 │         vm.warp(d2.unlockTime(alice));\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/AdamExtension.t.sol:127:30\n    │\n127 │         d2.claimIMDSTR(1, 1, block.timestamp);\n    │                              ━━━━━━━━━━━━━━━\n    ‡\n131 │         vm.warp(d2.unlockTime(alice));\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/AdamExtension.t.sol:130:30\n    │\n130 │         d2.claimIMDSTR(1, 0, block.timestamp);\n    │                              ━━━━━━━━━━━━━━━\n131 │         vm.warp(d2.unlockTime(alice));\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/AdamSplitOracle.t.sol:39:20\n   │\n39 │             uint64(block.timestamp),\n   │                    ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/unit/AuditOracleNFT.t.sol:15:9\n   │\n15 │         vm.warp(a.expiresAt);\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/AdamSplitOracle.t.sol:40:20\n   │\n40 │             uint64(block.timestamp + 2 days)\n   │                    ━━━━━━━━━━━━━━━\n   │\n   ⸬  test/unit/AuditOracleNFT.t.sol:15:9\n   │\n15 │         vm.warp(a.expiresAt);\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/AuditOracleNFT.t.sol:13:30\n   │\n13 │         a.expiresAt = uint64(block.timestamp + 60);\n   │                              ━━━━━━━━━━━━━━━\n14 │         assertTrue(oracle.submit(a, signature(a, PK), REASON));\n15 │         vm.warp(a.expiresAt);\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.chainid` may be reused across `vm.chainId`\n   ╭▸ test/unit/AdamSplitOracle.t.sol:27:13\n   │\n27 │             block.chainid,\n   │             ━━━━━━━━━━━━━\n   │\n   ⸬  test/unit/AuditOracleNFT.t.sol:48:9\n   │\n48 │         vm.chainId(block.chainid + 1);\n   │         ───────────────────────────── `vm.chainId` changes this environment here\n   │\n   ├ help: capture it with `vm.getChainId()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.chainid` may be reused across `vm.chainId`\n   ╭▸ test/unit/AuditOracleNFT.t.sol:48:20\n   │\n48 │         vm.chainId(block.chainid + 1);\n   │         ───────────━━━━━━━━━━━━━───── `vm.chainId` changes this environment here\n   │\n   ├ help: capture it with `vm.getChainId()` 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/AuditTreasury.t.sol:71:21\n   │\n71 │             vm.warp(block.timestamp + t2.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":4912,"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 1.11ms (944.33µs CPU time)\n\nRan 6 tests for test/unit/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 80134, ~: 80349)\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 8.00ms (8.21ms CPU time)\n\nRan 10 tests for test/unit/AuditOracleNFT.t.sol:AuditOracleTest\n[PASS] testBadTimesQuorumAndSumsFallBack() (gas: 357308)\n[PASS] testChangedChainRejectsPreviouslySignedReport() (gas: 231884)\n[PASS] testDomainReplayAndDuplicateCannotReplaceValidReport() (gas: 317545)\n[PASS] testExpiryBoundaryAndRejectedReportPreserveActiveState() (gas: 263092)\n[PASS] testFuzzClampedWeightsAlwaysSumAndBound(uint16,uint16) (runs: 256, μ: 10609, ~: 10486)\n[PASS] testFuzzMalformedReport(bytes) (runs: 256, μ: 44398, ~: 44193)\n[PASS] testInvalidSignatureReasonQuestionAndChain() (gas: 252915)\n[PASS] testMalformedAnswerNeverReverts() (gas: 148727)\n[PASS] testSignedClampedReportAndAgeBoundary() (gas: 227805)\n[PASS] testSignedPanelAndBlockFieldsCannotBeTampered() (gas: 213780)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 23.73ms (22.24ms CPU time)\n\nRan 24 tests for test/unit/AdamDistributor.t.sol:AdamDistributorTest\n[PASS] testFuzz_backlogConservation(uint128,uint32) (runs: 256, μ: 585430, ~: 605095)\n[PASS] testFuzz_claimsNeverExceedDistributed(uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 1314856, ~: 1339100)\n[PASS] testFuzz_stakeUnstakeRoundTrip(uint256,uint256) (runs: 256, μ: 251155, ~: 251394)\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 91.35ms (164.67ms CPU time)\n\nRan 4 tests for test/unit/LiquidityLock.t.sol:LiquidityLockTest\n[PASS] testDefaultReservesElevenPercentForNFTClaim() (gas: 7916)\n[PASS] testFuzzCannotIncreaseHookOnlyAllocation(uint128) (runs: 256, μ: 133781, ~: 133780)\n[PASS] testFuzzHookOnlyMintsDirectlyToDead(uint96) (runs: 256, μ: 153955, ~: 154012)\n[PASS] testZeroAndInsufficientAllocationRevert() (gas: 211552)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 91.14ms (34.40ms 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, μ: 10530, ~: 10362)\n[PASS] testFuzzMalformedReport(bytes) (runs: 256, μ: 44334, ~: 44133)\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 91.34ms (21.21ms CPU time)\n\nRan 5 tests for test/unit/StakingLock.t.sol:StakingLockTest\n[PASS] testClaimsDuringLockDoNotChangeDeadlineOrPrincipal() (gas: 749713)\n[PASS] testFuzzTopUpResetsWholeWalletLock(uint32,uint96,bool,bool) (runs: 256, μ: 543929, ~: 553202)\n[PASS] testNewStakeAfterFullExitLocksAgain() (gas: 641891)\n[PASS] testRejectedAndZeroStakesDoNotResetLock() (gas: 546176)\n[PASS] testUnstakeAndExitBlockedUntilExactBoundary() (gas: 645388)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 91.25ms (90.58ms CPU time)\n\nRan 12 tests for test/unit/DistributorAdversarial.t.sol:DistributorAdversarialTest\n[PASS] testFuzz_taxedRewardCreditsOnlyReceivedTokens(uint256,uint16) (runs: 1000, μ: 496754, ~: 499667)\n[PASS] testFuzz_twoEpochsFollowStakeOwnership(uint256,uint256,uint256,uint256) (runs: 1000, μ: 839905, ~: 846996)\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 91.23ms (172.65ms CPU time)\n\nRan 2 tests for test/unit/Integration.t.sol:IntegrationTest\n[PASS] test_excludedAddressesEarnNothing() (gas: 1111838)\n[PASS] test_fullLifecycle() (gas: 2254319)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 147.89ms (2.46ms CPU time)\n\nRan 5 tests for test/unit/ExtensionDeploy.t.sol:ExtensionDeployTest\n[PASS] testClaimConstructorRejectsNonexcludedAddress() (gas: 12561)\n[PASS] testDeployFailsWrongChainMissingTokenOrUnavailableSnapshot() (gas: 11079716)\n[PASS] testExistingTokenReusedAndExactlyElevenPercentFunded() (gas: 19379576)\n[PASS] testFundFromScriptCreatorAndNoMint() (gas: 19090152)\n[PASS] testRunUsesExplicitManualSignerAndExistingSupply() (gas: 19097750)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 156.97ms (2.79ms CPU time)\n\nRan 4 tests for test/unit/PostFactoryHook.t.sol:PostFactoryHookTest\n[PASS] test_feesFromHookedPoolReachManifestedDistributor() (gas: 1322970)\n[PASS] test_hookOnlyDeploymentReusesManifestedPipeline() (gas: 65982)\n[PASS] test_launchPoolRejectsAllocationAboveHolding() (gas: 89767)\n[PASS] test_resolvePipelineRejectsMismatchedConfig() (gas: 251117)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 169.69ms (1.21ms 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 192.43ms (19.85ms CPU time)\n\nRan 11 tests for test/unit/Revision.t.sol:RevisionTest\n[PASS] testFuzz_exactOutputFeesAreGrossRate(uint32,uint128) (runs: 256, μ: 339374, ~: 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 252.62ms (109.01ms CPU time)\n\nRan 22 tests for test/unit/AdamHook.t.sol:AdamHookTest\n[PASS] testFuzz_buyFeeMatchesSchedule(uint256,uint32) (runs: 256, μ: 331220, ~: 331473)\n[PASS] testFuzz_decayIsMonotoneAndBounded(uint32,uint32) (runs: 256, μ: 196462, ~: 196457)\n[PASS] test_addressCarriesExactlyTheRequiredFlags() (gas: 12012)\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: 6491865)\n[PASS] test_initializeRequiresOwner() (gas: 6602684)\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 298.95ms (274.16ms CPU time)\n\nRan 2 tests for test/unit/AuditOracleNFT.t.sol:AuditNFTTest\n[PASS] testAnyoneBurnsOnlyRemainingBalanceAtExactDeadline() (gas: 353796)\n[PASS] testFuzzTransferMidVestingConservesAllocation(uint8,uint8,bool) (runs: 256, μ: 460242, ~: 517354)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 308.10ms (63.99ms CPU time)\n\nRan 4 tests for test/fuzz/Treasury.fuzz.t.sol:TreasuryFuzzTest\n[PASS] testFuzz_accountingIdentityHolds(uint256,uint16,uint8) (runs: 256, μ: 1122563, ~: 1063055)\n[PASS] testFuzz_capAndConservation(uint256) (runs: 256, μ: 549618, ~: 549630)\n[PASS] testFuzz_quoteIsLinear(uint256) (runs: 256, μ: 91959, ~: 91997)\n[PASS] testFuzz_splitIsExact(uint256) (runs: 256, μ: 524440, ~: 524542)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 315.94ms (373.37ms CPU time)\n\nRan 2 tests for test/unit/AuditTreasury.t.sol:AuditTreasuryTest\n[PASS] testFuzzDeferredKeeperDebtSurvivesRepeatedFailuresAndRecovery(uint96) (runs: 256, μ: 2622976, ~: 2690578)\n[PASS] testRewardCreditFailureRollsBackBuyAndPreservesOtherLegs() (gas: 1314404)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 318.20ms (120.81ms CPU time)\n\nRan 6 tests for test/unit/NFTClaim.t.sol:NFTClaimTest\n[PASS] testBatchDuplicateStakeAndNoRewardsForClaimContract() (gas: 473800)\n[PASS] testBurnDeadlineAndBurnedNFT() (gas: 286142)\n[PASS] testClaimAndStakeSetsAndResetsClaimantsLock() (gas: 626938)\n[PASS] testDailyUnlockAndTransferredOwnership() (gas: 399150)\n[PASS] testFuzzUnlockConservation(uint8,uint8) (runs: 256, μ: 123112, ~: 123077)\n[PASS] testInvalidIdsUnauthorizedAndBatchAtomicity() (gas: 205844)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 323.69ms (93.86ms CPU time)\n\nRan 11 tests for test/unit/AdamExtension.t.sol:AdamExtensionTest\n[PASS] testCallbackAndAtomicSelfCallGuards() (gas: 98371)\n[PASS] testETHBacklogThresholdAndNewStakeNoPastRewards() (gas: 797561)\n[PASS] testFuzzETHConservation(uint96) (runs: 256, μ: 904765, ~: 942934)\n[PASS] testJITProcessCannotExitButCanClaimAllRewardForms() (gas: 2194660)\n[PASS] testLegFailureIsolationRetriesRerouteAndNoSecondBounty() (gas: 13150288)\n[PASS] testOneTimeDirectSwitchPreservesOldETHCredits() (gas: 1847367)\n[PASS] testRejectingKeeperCreditsAreReservedAndPullable() (gas: 926385)\n[PASS] testReportWeightsAndStaleFallback() (gas: 1556033)\n[PASS] testSlippageDeadlineAndFailurePreserveClaim() (gas: 1162067)\n[PASS] testThirdLegFailureAfterWhitelistRevokedReroutes() (gas: 9688540)\n[PASS] testThreeLegPullRewardsAndKeeper() (gas: 1626994)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 323.84ms (131.20ms CPU time)\n\nRan 2 tests for test/unit/AuditDistributor.t.sol:AuditDistributorTest\n[PASS] testFuzzStakeForCannotRedirectBeneficiaryPastRewards(uint96) (runs: 256, μ: 777408, ~: 777356)\n[PASS] testFuzzSwitchPreservesBothEmptyStakeBacklogs(uint64,uint64) (runs: 256, μ: 1428696, ~: 1428734)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 337.81ms (155.41ms CPU time)\n\nRan 4 tests for test/unit/ExtensionAdversarial.t.sol:ExtensionAdversarialTest\n[PASS] testBountyCallbackCannotReenterOrDoubleAllocate() (gas: 1107199)\n[PASS] testDirectTokenLockCannotPreventPrincipalOrOtherRewards() (gas: 2158225)\n[PASS] testFuzzTwoStakersNeverClaimMoreETHThanFunded(uint96,uint96,uint64) (runs: 256, μ: 1191765, ~: 1187835)\n[PASS] testNFTStakeCallbackCannotReenterAndAllowanceIsCleared() (gas: 837558)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 338.36ms (49.40ms CPU time)\n\nRan 4 tests for test/unit/HookAdversarial.t.sol:HookAdversarialTest\n[PASS] testFuzz_exactInputSellChargesGrossEthAtAnyDecayTime(uint256,uint32,uint16) (runs: 1000, μ: 385914, ~: 386370)\n[PASS] testFuzz_exactOutputSellDeliversRequestedNetAndGrossFee(uint256,uint32) (runs: 1000, μ: 351519, ~: 351854)\n[PASS] test_decayBoundariesAndNoFeeResurrection() (gas: 526002)\n[PASS] test_partialExactOutputSellRevertsFeeAndPoolMovement() (gas: 480909)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 340.26ms (276.50ms CPU time)\n\nRan 4 tests for test/unit/TreasuryBoundaries.t.sol:TreasuryBoundariesTest\n[PASS] testFuzz_directionalProtocolFeesPreserveExecutableOutputFloors(uint16,uint16) (runs: 1000, μ: 845365, ~: 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 341.26ms (62.09ms CPU time)\n\nRan 4 tests for test/unit/Integration.t.sol:DeployWiringTest\n[PASS] test_contractsAreWiredTogether() (gas: 62312)\n[PASS] test_deployWithExistingToken() (gas: 460217607)\n[PASS] test_launchPoolRejectsMisconfiguration() (gas: 145669)\n[PASS] test_mainnetConfigConstants() (gas: 14612)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.49s (1.32s CPU time)\n\nRan 1 test for test/invariant/StakingLock.invariant.t.sol:StakingLockInvariantTest\n[PASS] invariantLockPrincipalAndRewards() (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+--------------+-------+---------+----------╮\n| Contract           | Selector     | Calls | Reverts | Discards |\n+================================================================+\n| StakingLockHandler | claimAndFund | 4080  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| StakingLockHandler | elapse       | 4185  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| StakingLockHandler | stake        | 4035  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| StakingLockHandler | withdraw     | 4084  | 0       | 0        |\n╰--------------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.59s (1.58s 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     | 2043  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | elapse           | 2031  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | flush            | 2085  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | fund             | 2072  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | market           | 2027  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | payTeam          | 2051  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | process          | 2085  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | teamAvailability | 1990  | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.70s (2.51s 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             | 1888  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | donate            | 1877  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | elapse            | 1808  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | invalidWithdrawal | 1780  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | move              | 1797  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | reward            | 1759  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | roundTrip         | 1825  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | stake             | 1801  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | unstake           | 1849  | 0       | 0        |\n╰--------------------+-------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.73s (4.72s CPU time)\n\nRan 27 test suites in 4.73s (15.16s CPU time): 179 tests passed, 0 failed, 0 skipped (179 total tests)\n","passed":true},{"durationMs":127,"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,\"AUDIT.md\":82,\"CHANGELOG.md\":7,\"README.md\":85,\"REVIEW.md\":35,\"SELF_AUDIT.md\":28,\"docs/DEPLOYMENT_CHECKLIST.md\":29,\"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\":305,\"script/DeployAdamExtension.s.sol\":141,\"script/utils/HookMiner.sol\":60,\"src/AdamDistributor.sol\":269,\"src/AdamDistributorV2.sol\":174,\"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\":49,\"test/fork/IMDSTRFork.t.sol\":263,\"test/fork/MainnetFork.t.sol\":236,\"test/fuzz/Treasury.fuzz.t.sol\":102,\"test/invariant/Distributor.invariant.t.sol\":257,\"test/invariant/StakingLock.invariant.t.sol\":112,\"test/invariant/Treasury.invariant.t.sol\":247,\"test/unit/AdamDistributor.t.sol\":425,\"test/unit/AdamExtension.t.sol\":268,\"test/unit/AdamHook.t.sol\":279,\"test/unit/AdamSplitOracle.t.sol\":152,\"test/unit/AdamTreasury.t.sol\":503,\"test/unit/AuditDistributor.t.sol\":60,\"test/unit/AuditOracleNFT.t.sol\":105,\"test/unit/AuditTreasury.t.sol\":97,\"test/unit/DistributorAdversarial.t.sol\":310,\"test/unit/ExtensionAdversarial.t.sol\":127,\"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/LiquidityLock.t.sol\":95,\"test/unit/NFTClaim.t.sol\":133,\"test/unit/OraclePublicVector.t.sol\":41,\"test/unit/PostFactoryHook.t.sol\":152,\"test/unit/Revision.t.sol\":198,\"test/unit/StakingLock.t.sol\":148,\"test/unit/TreasuryBoundaries.t.sol\":197,\"test/utils/ExtensionFixture.sol\":182,\"test/utils/LocalV4.sol\":225,\"test/utils/MockTaxHook.sol\":130},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":8112,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/AdamDistributorV2.sol:158: Reentrancy in AdamDistributorV2.unlockCallback(bytes) (src/AdamDistributorV2.sol#158-173):\n[high/medium] reentrancy-balance at src/AdamDistributorV2.sol:158: Reentrancy in AdamDistributorV2.unlockCallback(bytes) (src/AdamDistributorV2.sol#158-173):\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:248: AdamDistributor._releaseBacklog(address) (src/AdamDistributor.sol#248-255) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/AdamDistributor.sol:152: AdamDistributor.notifyReward(address,uint256) (src/AdamDistributor.sol#152-163) 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:259: AdamDistributor._syncBacklogStreams() (src/AdamDistributor.sol#259-268) 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/AdamDistributorV2.sol:158: AdamDistributorV2.unlockCallback(bytes) (src/AdamDistributorV2.sol#158-173) ignores return value by poolManager.settle{value: ethIn}() (src/AdamDistributorV2.sol#168)\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/high] write-after-write at src/AdamDistributorV2.sol:32: AdamDistributorV2._swapping (src/AdamDistributorV2.sol#32) 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/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/AdamDistributorV2.sol:151: Reentrancy in AdamDistributorV2._buy(address,uint256,uint256) (src/AdamDistributorV2.sol#151-156):\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:112: Reentrancy in AdamDistributorV2.notifyIMDSTR(uint256) (src/AdamDistributorV2.sol#112-124):\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:220: AdamDistributor._settle(address) (src/AdamDistributor.sol#220-229) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamDistributor.sol:259: AdamDistributor._syncBacklogStreams() (src/AdamDistributor.sol#259-268) 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/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/AdamDistributorV2.sol:86: AdamDistributorV2._unstake(uint256) (src/AdamDistributorV2.sol#86-90) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamDistributorV2.sol:128: AdamDistributorV2.claimIMDSTR(uint256,uint256,uint256) (src/AdamDistributorV2.sol#128-142) 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/AdamDistributor.sol:248: AdamDistributor._releaseBacklog(address) (src/AdamDistributor.sol#248-255) 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/AdamDistributor.sol:239: AdamDistributor._backlogDue(address) (src/AdamDistributor.sol#239-245) 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","passed":true},{"durationMs":854,"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:146: 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:208: 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:208: 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:260: Storage Array Length not Cached\n[low] uninitialized-local-variable at src/AdamDistributor.sol:208: Uninitialized Local Variable (7 places)\n[low] unused-public-function at src/AdamDistributor.sol:174: 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":"619a9d6e6e35a1b4739b35f0d371c23e7f45aaadfbf37a22e2f20064060f0116","verifiedTreeHash":"f5834a4cd03bcedff341f250d0262c7536be7ed6","verifierVersion":"0.1.0+986b9f58"},{"checks":[{"durationMs":300026,"exitCode":137,"name":"build","output":"Compiling 188 files with Solc 0.8.26\n","passed":false}],"detail":"build failed with exit code 137","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"f165e5d67c31922c9196cedd1539ed84e3cd18e2c4300b94c248e20e596e6935","verifiedTreeHash":"a0000942fabf0789ae19c1956680135e303eb91d","verifierVersion":"0.1.0+986b9f58"}]}