{"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":"0c639c09-9121-4851-93d2-eaaa763ecaa4","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"ab06b4365ed912532597c5defdcc39f103d436a0acb6bb32bbb63b377902223a","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 — fix AdamSplitOracle so it works with daily IMD oracle runs (continue from parent job). Single job, do NOT ask clarifying questions. Change nothing else.\n\n## Problem (verified against the live IMD API)\nIMD's questionHash changes on every run because it includes the pinned block window (two quotes 30 s apart returned different hashes). The immutable questionHash check therefore rejects every daily report. Also, requests created on the IMD website are signed with a default EIP-712 domain verifyingContract (observed 0x37bfb8ac7c960e558657871d41ca70e07e7dbfff), not with our oracle's address.\n\n## Fix\n- Remove the immutable questionHash check.\n- Add immutable `relayer` (constructor param). Only `relayer` may call submit(); others revert with a custom error. Mainnet value: 0x087Bada60BB18d1667F03a8BA6b2aE5394E0E2C5.\n- Add immutable `domainVerifyingContract` (constructor param) used in the EIP-712 domain {name \"IdentityMD Oracle\", version \"2\", chainId, verifyingContract = domainVerifyingContract}. If zero is passed, use address(this). Do NOT use OZ EIP712's implicit address(this) when a value is set.\n- Keep everything else: immutable signer, answerType 5, exactly four bytes32 words, bps sum 10000, reason hash check, panelSize >= 5, quorum >= 4, agreed >= quorum, freshness <= 26h, expiry, strictly increasing issuedAt, replay protection, clamps 1500–7000, equal-thirds fallback.\n- Update DeployAdamExtension Config + mainnetConfig (relayer, domainVerifyingContract; drop questionHash), deploy-script checks, README, HEARTBEAT.md and checklist.\n\n## Tests\nValid report from relayer accepted with both domain modes; non-relayer reverts; wrong domain / wrong signer / stale / replay / bad sum / low quorum rejected; different questionHash values across runs all accepted; all existing tests green.\n\n## Deliverables\nCode + tests, REVIEW.md section for this change, CHANGELOG. Nothing broadcast.","parentJobId":"88060684-81ad-4627-a2bf-26f2877f826f","planHash":"e82d3ce33b1eb45a5fcabde31c2bb44da68d75415b403ea68e11b9d901e0a9e1","previousHash":"5f71fe41bd8ad6cd73a9aa258441a9231cdf571443ae9bf9439292b13cae600f","projectId":"e497ebcf-33bb-4548-bfd7-fa95843dc898","publication":{"commit":"f9b1e4509678c6703da3ca647f742cd457329f5f","deliveredAt":"2026-10-05T19:39:53.243Z","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":[],"site":null,"snapshotHash":"7791aca33e76d20eb994eaea947e31998d8f362bf23d69df68296c8a2dd8691d","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"ef31c84a776d70d7bb3d63740241efc4767d049f266ee03f8920e43ac826f059","device":"f2a99efe911b5581","findings":[],"hash":"ab06b4365ed912532597c5defdcc39f103d436a0acb6bb32bbb63b377902223a","nodeId":"7aa2d258-a5ab-4716-8eea-4ff2f060cdb2","outcome":"completed","summary":"Implemented daily-run compatibility: changing question hashes, immutable relayer authorization, and configurable EIP-712 domains. Existing validation, clamps and fallback remain intact.\n\nUpdated deployment configuration, tests and all requested documentation.\n\n- Build and formatting checks pass.\n- All 226 offline tests pass, including a second seed with 1,024 fuzz cases.\n- Network fork tests were not rerun.\n- Protected files remain unchanged. Nothing broadcast.","treeHash":"6abb6585eb02ae71fcdf80fd6fe2f4ccf712b091","usage":{"cachedInputTokens":3054464,"inputTokens":120423,"model":"gpt-6-astra","outputTokens":22794,"runtime":"codex","turns":10,"wallClockMs":830269}}],"verification":[{"checks":[{"durationMs":126616,"exitCode":0,"name":"build","output":"Compiling 157 files with Solc 0.8.26\nSolc 0.8.26 finished in 126.43s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/NFTClaim.sol:55:72\n   │\n55 │                 || imd_ == pepe_ || imdSize_ == 0 || pepeSize_ == 0 || launch_ < block.timestamp\n   │                                                                        ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/NFTClaim.sol:77:13\n   │\n77 │         if (block.timestamp < launch || block.timestamp >= deadline) return 0;\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/NFTClaim.sol:77:41\n   │\n77 │         if (block.timestamp < launch || block.timestamp >= deadline) return 0;\n   │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/NFTClaim.sol:79:13\n   │\n79 │         if (tranches > 10) tranches = 10;\n   │             ━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:149:97\n    │\n149 │                 || imdTaxBps >= BPS || pnkstrTaxBps >= BPS || imd == pnkstr || imdTickSpacing > uint24(type(int24).max)\n    │                                                                                                 ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:150:40\n    │\n150 │                 || pnkstrTickSpacing > uint24(type(int24).max)\n    │                                        ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:164:26\n    │\n164 │             tickSpacing: int24(imdTickSpacing),\n    │                          ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[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[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/AdamTreasuryV2.sol:71:17\n   │\n71 │                 revert InvalidParameter();\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/AdamTreasuryV2.sol:50:13\n   │\n50 │             uint24(c.keys[0].tickSpacing),\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint24' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/AdamTreasuryV2.sol:55:13\n   │\n55 │             uint24(c.keys[1].tickSpacing),\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint24' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/AdamTreasuryV2.sol:65:37\n   │\n65 │                 || c.maxEthPerBuy > uint256(uint128(type(int128).max)) || c.taxes[2] >= BPS\n   │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[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[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/AdamDistributorV2.sol:50:9\n   │\n50 │         address nftClaim_,\n   │         ━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/AdamDistributorV2.sol:58:30\n   │\n58 │                 || maxEth_ > uint256(uint128(type(int128).max))\n   │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/AdamDistributorV2.sol:58:38\n   │\n58 │                 || maxEth_ > uint256(uint128(type(int128).max))\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-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[reentrancy-no-eth]: external call can be reentered before `teamOwed` is updated\n    ╭▸ src/AdamTreasuryV2.sol:108:36\n    │\n108 │         uint16[3] memory weights = splitOracle.checkpoint();\n    │                                    ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:169:31\n    │\n169 │             launchTimestamp = uint64(block.timestamp);\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:177:42\n    │\n177 │             params.amountSpecified < 0 ? uint256(-params.amountSpecified) : uint256(params.amountSpecified);\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:177:77\n    │\n177 │             params.amountSpecified < 0 ? uint256(-params.amountSpecified) : uint256(params.amountSpecified);\n    │                                                                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-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:46\n    │\n192 │                 params.amountSpecified < 0 ? uint256(-params.amountSpecified) : uint256(params.amountSpecified);\n    │                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:192:81\n    │\n192 │                 params.amountSpecified < 0 ? uint256(-params.amountSpecified) : uint256(params.amountSpecified);\n    │                                                                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:195:47\n    │\n195 │                 params.amountSpecified < 0 ? -int256(requested - prepaidFee) : int256(requested + prepaidFee);\n    │                                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:195:80\n    │\n195 │                 params.amountSpecified < 0 ? -int256(requested - prepaidFee) : int256(requested + prepaidFee);\n    │                                                                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:200:44\n    │\n200 │         uint256 ethAmount = ethDelta < 0 ? uint256(uint128(-ethDelta)) : uint256(uint128(ethDelta));\n    │                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:200:52\n    │\n200 │         uint256 ethAmount = ethDelta < 0 ? uint256(uint128(-ethDelta)) : uint256(uint128(ethDelta));\n    │                                                    ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:200:74\n    │\n200 │         uint256 ethAmount = ethDelta < 0 ? uint256(uint128(-ethDelta)) : uint256(uint128(ethDelta));\n    │                                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamHook.sol:200:82\n    │\n200 │         uint256 ethAmount = ethDelta < 0 ? uint256(uint128(-ethDelta)) : uint256(uint128(ethDelta));\n    │                                                                                  ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_legs` is updated\n    ╭▸ src/AdamTreasuryV2.sol:198:13\n    │\n198 │         try this.executeV2(id, ethIn) returns (uint256 out) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_legs` is updated\n    ╭▸ src/AdamTreasury.sol:341:13\n    │\n341 │             distributor.notifyReward(token, amountOut);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/AdamTreasury.sol:196:13\n    │\n196 │         if (block.timestamp < availableAt) revert CooldownActive(availableAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasury.sol:339:13\n    │\n339 │             emit LegBought(legId, token, ethIn, amountOut);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasury.sol:343:13\n    │\n343 │             emit LegFailed(legId, ethIn, reason);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-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/AdamDistributorV2.sol:100:9\n    │\n100 │         emit StakeLockUpdated(wallet, unlockAt);\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:82:9\n   │\n82 │         emit Staked(beneficiary, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/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[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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/AdamTreasuryV2.sol:131:13\n    │\n131 │         if (bounty != 0) {\n    │             ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/AdamTreasuryV2.sol:100:13\n    │\n100 │         if (block.timestamp < availableAt) revert CooldownActive(availableAt);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/AdamTreasuryV2.sol:198:13\n    │\n198 │         try this.executeV2(id, ethIn) returns (uint256 out) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/AdamTreasuryV2.sol:202:37\n    │\n202 │             if (id != LEG_IMDSTR || distributorV2.directDistribution()) {\n    │                                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasuryV2.sol:123:13\n    │\n123 │             emit Split(amount, teamShare, holders);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasuryV2.sol:205:13\n    │\n205 │             emit LegBought(id, Currency.unwrap(l.key.currency1), ethIn, out);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasuryV2.sol:207:13\n    │\n207 │             emit LegFailed(id, ethIn, reason);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasuryV2.sol:221:17\n    │\n221 │                 emit LegRerouted(id, other, moved);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasuryV2.sol:136:17\n    │\n136 │                 emit KeeperPaid(msg.sender, bounty);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasuryV2.sol:140:17\n    │\n140 │                 emit KeeperPaymentDeferred(msg.sender, bounty);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasuryV2.sol:107:25\n    │\n107 │         lastProcessed = uint64(block.timestamp);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/AdamTreasuryV2.sol:134:26\n    │\n134 │             (bool ok,) = msg.sender.call{value: bounty, gas: 100_000}(\"\");\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamDistributor.sol:121:9\n    │\n121 │         emit Staked(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:96:13\n   │\n96 │         if (block.timestamp >= deadline) revert ClaimClosed();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[calls-loop]: external call inside a loop\n    ╭▸ src/NFTClaim.sol:100:17\n    │\n100 │             if ((collection == 0 ? imdNFT : swarmPepe).ownerOf(id) != msg.sender) revert NotOwner();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/calls-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n   ╭▸ src/NFTClaim.sol:72:9\n   │\n72 │         revert InvalidToken();\n   │         ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/NFTClaim.sol:100:83\n    │\n100 │             if ((collection == 0 ? imdNFT : swarmPepe).ownerOf(id) != msg.sender) revert NotOwner();\n    │                                                                                   ━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:262:53\n    │\n262 │                 zeroForOne: true, amountSpecified: -int256(ethIn), sqrtPriceLimitX96: TickMath.MIN_SQRT_PRICE + 1\n    │                                                     ━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:268:30\n    │\n268 │         if (ethDelta >= 0 || uint256(uint128(-ethDelta)) != ethIn) revert PartialFill();\n    │                              ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/AdamDistributorV2.sol:93:13\n   │\n93 │         if (block.timestamp < unlockAt) revert StakeLocked(msg.sender, unlockAt);\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:268:38\n    │\n268 │         if (ethDelta >= 0 || uint256(uint128(-ethDelta)) != ethIn) revert PartialFill();\n    │                                      ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:270:29\n    │\n270 │         uint256 amountOut = uint256(uint128(outDelta));\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamTreasury.sol:270:37\n    │\n270 │         uint256 amountOut = uint256(uint128(outDelta));\n    │                                     ━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/AdamTreasury.sol:273:9\n    │\n273 │         poolManager.settle{value: ethIn}();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/NFTClaim.sol:111:13\n    │\n111 │         if (block.timestamp < deadline) revert TooEarly();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/AdamTreasury.sol:304:16\n    │\n304 │         return (afterTax * (BPS - slippageBps)) / BPS;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamDistributorV2.sol:112:9\n    │\n112 │         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:158:31\n    │\n158 │         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:124:13\n    │\n124 │             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:127:13\n    │\n127 │             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:138:13\n    │\n138 │         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:146:9\n    │\n146 │         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/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/AdamTreasury.sol:315:13\n    │\n315 │             emit TeamPaid(amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamTreasury.sol:318:13\n    │\n318 │             emit TeamPaymentDeferred(amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[return-bomb]: external call with a gas limit may copy unbounded return data\n    ╭▸ src/AdamTreasury.sol:313:22\n    │\n313 │         (bool ok,) = teamWallet.call{value: amount, gas: TEAM_PUSH_GAS}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/return-bomb\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/AdamDistributor.sol:201:9\n    │\n201 │         emit Unstaked(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/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/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[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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/AdamDistributorV2.sol:167:59\n    │\n167 │             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:168:37\n    │\n168 │         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:171:23\n    │\n171 │         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:171:31\n    │\n171 │         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:173:9\n    │\n173 │         poolManager.settle{value: ethIn}();\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/AdamSplitOracle.sol:56:52\n   │\n56 │     constructor(address signer_, address relayer_, address domainVerifyingContract_) {\n   │                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\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:115:13\n    │\n115 │             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:127:9\n    │\n127 │         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/AdamSplitOracle.sol:138:20\n    │\n138 │                 || a.issuedAt > block.timestamp || a.issuedAt <= issuedAt || block.timestamp - a.issuedAt > MAX_AGE\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:138:78\n    │\n138 │                 || a.issuedAt > block.timestamp || a.issuedAt <= issuedAt || block.timestamp - a.issuedAt > MAX_AGE\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:139:20\n    │\n139 │                 || a.expiresAt < block.timestamp || a.expiresAt < a.issuedAt || a.fromBlock > a.toBlock\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:172:13\n    │\n172 │             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:174:25\n    │\n174 │         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:179:25\n    │\n179 │                 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:182:25\n    │\n182 │                 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:189:30\n    │\n189 │         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:189:79\n    │\n189 │         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/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[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/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/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":5110,"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: 50847)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 720.93µs (572.42µs CPU time)\n\nRan 4 tests for test/unit/LiquidityLock.t.sol:LiquidityLockTest\n[PASS] testDefaultReservesElevenPercentForNFTClaim() (gas: 7916)\n[PASS] testFuzzCannotIncreaseHookOnlyAllocation(uint128) (runs: 256, μ: 133777, ~: 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 51.90ms (50.90ms CPU time)\n\nRan 9 tests for test/unit/StakingLock.t.sol:StakingLockTest\n[PASS] testClaimsDuringLockDoNotChangeDeadlineOrPrincipal() (gas: 749933)\n[PASS] testFuzzOnlyImmutableNFTClaimMayStakeFor(address,uint96,uint32) (runs: 256, μ: 560170, ~: 560131)\n[PASS] testFuzzTopUpResetsWholeWalletLock(uint32,uint96,bool,bool) (runs: 256, μ: 547686, ~: 555990)\n[PASS] testMatureSecondWalletCannotWithdrawNewWalletStake() (gas: 1133391)\n[PASS] testNewStakeAfterFullExitLocksAgain() (gas: 642094)\n[PASS] testRejectedAndZeroStakesDoNotResetLock() (gas: 602723)\n[PASS] testRepeatedOneWeiGriefCannotDelayWithdrawal() (gas: 623684)\n[PASS] testSelfStakeForRejectedButStakeWorks() (gas: 245202)\n[PASS] testUnstakeAndExitBlockedUntilExactBoundary() (gas: 645646)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 120.25ms (216.90ms CPU time)\n\nRan 24 tests for test/unit/AdamDistributor.t.sol:AdamDistributorTest\n[PASS] testFuzz_backlogConservation(uint128,uint32) (runs: 256, μ: 588008, ~: 605083)\n[PASS] testFuzz_claimsNeverExceedDistributed(uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 1311504, ~: 1338726)\n[PASS] testFuzz_stakeUnstakeRoundTrip(uint256,uint256) (runs: 256, μ: 251136, ~: 251363)\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 146.15ms (197.92ms CPU time)\n\nRan 17 tests for test/unit/AdamSplitOracle.t.sol:AdamSplitOracleTest\n[PASS] testBadTimesQuorumAndSumsFallBack() (gas: 416990)\n[PASS] testChangingQuestionCannotBypassReplayOrMonotonicTime() (gas: 418567)\n[PASS] testConfiguredRelayerMayDifferFromDeployerAndSigner() (gas: 225471)\n[PASS] testConstructorRejectsZeroSignerOrRelayer() (gas: 4109)\n[PASS] testDomainReplayAndDuplicateCannotReplaceValidReport() (gas: 322374)\n[PASS] testDomainUsesCurrentChainAfterChainIdChange() (gas: 235133)\n[PASS] testFuzzClampedWeightsAlwaysSumAndBound(uint16,uint16) (runs: 256, μ: 10794, ~: 10644)\n[PASS] testFuzzDifferentDailyQuestionHashesAccepted(bytes32,bytes32) (runs: 256, μ: 544490, ~: 544898)\n[PASS] testFuzzMalformedReport(bytes) (runs: 256, μ: 48154, ~: 47970)\n[PASS] testFuzzNonRelayerCannotReplaceReport(address) (runs: 256, μ: 306851, ~: 306851)\n[PASS] testIndependentSignatureAndDomainMetadata() (gas: 196178)\n[PASS] testInvalidSignatureReasonTamperedQuestionAndChain() (gas: 269758)\n[PASS] testMalformedAnswerNeverReverts() (gas: 153347)\n[PASS] testSignedClampedReportAndAgeBoundary() (gas: 232418)\n[PASS] testSubmissionAtExactAgeLimitAccepted() (gas: 185733)\n[PASS] testUnauthorizedMalformedReportReverts() (gas: 35337)\n[PASS] testWrongDomainFieldsRejected() (gas: 228636)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 148.20ms (236.99ms CPU time)\n\nRan 20 tests for test/unit/AuditOracleNFT.t.sol:AuditOracleTest\n[PASS] testBadTimesQuorumAndSumsFallBack() (gas: 417056)\n[PASS] testChangedChainRejectsPreviouslySignedReport() (gas: 235620)\n[PASS] testChangingQuestionCannotBypassReplayOrMonotonicTime() (gas: 418589)\n[PASS] testConfiguredRelayerMayDifferFromDeployerAndSigner() (gas: 225537)\n[PASS] testConstructorRejectsZeroSignerOrRelayer() (gas: 4153)\n[PASS] testDomainReplayAndDuplicateCannotReplaceValidReport() (gas: 322446)\n[PASS] testDomainUsesCurrentChainAfterChainIdChange() (gas: 235130)\n[PASS] testExpiryBoundaryAndRejectedReportPreserveActiveState() (gas: 277151)\n[PASS] testFuzzClampedWeightsAlwaysSumAndBound(uint16,uint16) (runs: 256, μ: 10864, ~: 10681)\n[PASS] testFuzzDifferentDailyQuestionHashesAccepted(bytes32,bytes32) (runs: 256, μ: 544539, ~: 544942)\n[PASS] testFuzzMalformedReport(bytes) (runs: 256, μ: 48223, ~: 48048)\n[PASS] testFuzzNonRelayerCannotReplaceReport(address) (runs: 256, μ: 306916, ~: 306916)\n[PASS] testIndependentSignatureAndDomainMetadata() (gas: 196222)\n[PASS] testInvalidSignatureReasonTamperedQuestionAndChain() (gas: 269854)\n[PASS] testMalformedAnswerNeverReverts() (gas: 153413)\n[PASS] testSignedClampedReportAndAgeBoundary() (gas: 232484)\n[PASS] testSignedPanelAndBlockFieldsCannotBeTampered() (gas: 222009)\n[PASS] testSubmissionAtExactAgeLimitAccepted() (gas: 185777)\n[PASS] testUnauthorizedMalformedReportReverts() (gas: 35403)\n[PASS] testWrongDomainFieldsRejected() (gas: 228680)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 148.24ms (238.59ms CPU time)\n\nRan 18 tests for test/unit/AdamSplitOracle.t.sol:AdamSplitOracleConfiguredDomainTest\n[PASS] testBadTimesQuorumAndSumsFallBack() (gas: 416966)\n[PASS] testChangingQuestionCannotBypassReplayOrMonotonicTime() (gas: 418567)\n[PASS] testConfiguredDomainRejectsImplicitSelfDomainSignature() (gas: 65120)\n[PASS] testConfiguredRelayerMayDifferFromDeployerAndSigner() (gas: 225493)\n[PASS] testConstructorRejectsZeroSignerOrRelayer() (gas: 4109)\n[PASS] testDomainReplayAndDuplicateCannotReplaceValidReport() (gas: 322338)\n[PASS] testDomainUsesCurrentChainAfterChainIdChange() (gas: 235169)\n[PASS] testFuzzClampedWeightsAlwaysSumAndBound(uint16,uint16) (runs: 256, μ: 10795, ~: 10644)\n[PASS] testFuzzDifferentDailyQuestionHashesAccepted(bytes32,bytes32) (runs: 256, μ: 544495, ~: 544898)\n[PASS] testFuzzMalformedReport(bytes) (runs: 256, μ: 48181, ~: 48004)\n[PASS] testFuzzNonRelayerCannotReplaceReport(address) (runs: 256, μ: 306855, ~: 306855)\n[PASS] testIndependentSignatureAndDomainMetadata() (gas: 196178)\n[PASS] testInvalidSignatureReasonTamperedQuestionAndChain() (gas: 269734)\n[PASS] testMalformedAnswerNeverReverts() (gas: 153323)\n[PASS] testSignedClampedReportAndAgeBoundary() (gas: 232440)\n[PASS] testSubmissionAtExactAgeLimitAccepted() (gas: 185711)\n[PASS] testUnauthorizedMalformedReportReverts() (gas: 35337)\n[PASS] testWrongDomainFieldsRejected() (gas: 228648)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 148.09ms (223.45ms CPU time)\n\nRan 12 tests for test/unit/DistributorAdversarial.t.sol:DistributorAdversarialTest\n[PASS] testFuzz_taxedRewardCreditsOnlyReceivedTokens(uint256,uint16) (runs: 1000, μ: 497553, ~: 499655)\n[PASS] testFuzz_twoEpochsFollowStakeOwnership(uint256,uint256,uint256,uint256) (runs: 1000, μ: 841512, ~: 846980)\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 147.67ms (245.81ms 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 179.80ms (1.08ms CPU time)\n\nRan 9 tests for test/unit/NFTClaim.t.sol:NFTClaimTest\n[PASS] testApprovedOperatorCannotResetOwnersLockThroughNFTClaim() (gas: 456768)\n[PASS] testBatchDuplicateStakeAndNoRewardsForClaimContract() (gas: 471968)\n[PASS] testBurnDeadlineAndBurnedNFT() (gas: 286208)\n[PASS] testClaimAndStakeSetsAndResetsClaimantsLock() (gas: 627171)\n[PASS] testDailyUnlockAndTransferredOwnership() (gas: 399201)\n[PASS] testDuplicateAndEmptyClaimsCannotRelockAndPlainClaimDoesNotStake() (gas: 428631)\n[PASS] testFuzzUnlockConservation(uint8,uint8) (runs: 256, μ: 123115, ~: 123077)\n[PASS] testInvalidIdsUnauthorizedAndBatchAtomicity() (gas: 205910)\n[PASS] testTransferredNFTCannotMoveStakeOrInheritMatureLock() (gas: 1379889)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 190.67ms (14.51ms CPU time)\n\nRan 2 tests for test/unit/AuditOracleNFT.t.sol:AuditNFTTest\n[PASS] testAnyoneBurnsOnlyRemainingBalanceAtExactDeadline() (gas: 353867)\n[PASS] testFuzzTransferMidVestingConservesAllocation(uint8,uint8,bool) (runs: 256, μ: 456510, ~: 383479)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 223.71ms (22.91ms 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 286.89ms (20.38ms CPU time)\n\nRan 4 tests for test/fuzz/Treasury.fuzz.t.sol:TreasuryFuzzTest\n[PASS] testFuzz_accountingIdentityHolds(uint256,uint16,uint8) (runs: 256, μ: 1170772, ~: 1063259)\n[PASS] testFuzz_capAndConservation(uint256) (runs: 256, μ: 549616, ~: 549630)\n[PASS] testFuzz_quoteIsLinear(uint256) (runs: 256, μ: 91956, ~: 91978)\n[PASS] testFuzz_splitIsExact(uint256) (runs: 256, μ: 524420, ~: 524542)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 289.98ms (314.87ms 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 297.69ms (2.53ms CPU time)\n\nRan 2 tests for test/unit/AuditDistributor.t.sol:AuditDistributorTest\n[PASS] testFuzzStakeForCannotRedirectBeneficiaryPastRewards(uint96) (runs: 256, μ: 817872, ~: 817830)\n[PASS] testFuzzSwitchPreservesBothEmptyStakeBacklogs(uint64,uint64) (runs: 256, μ: 1428909, ~: 1428951)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 316.67ms (139.58ms CPU time)\n\nRan 7 tests for test/unit/ExtensionDeploy.t.sol:ExtensionDeployTest\n[PASS] testClaimConstructorRejectsNonexcludedAddress() (gas: 12561)\n[PASS] testDeployFailsWrongChainMissingTokenOrUnavailableSnapshot() (gas: 10938681)\n[PASS] testDeployRejectsZeroSignerAndRelayerBeforeFunding() (gas: 10899056)\n[PASS] testExistingTokenReusedAndExactlyElevenPercentFunded() (gas: 19212358)\n[PASS] testFundFromScriptCreatorAndNoMint() (gas: 18909512)\n[PASS] testMainnetOracleDefaultsAndConfiguredDomainDeployment() (gas: 18927703)\n[PASS] testRunUsesExplicitManualSignerAndExistingSupply() (gas: 18917187)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 316.09ms (6.07ms CPU time)\n\nRan 11 tests for test/unit/AdamExtension.t.sol:AdamExtensionTest\n[PASS] testCallbackAndAtomicSelfCallGuards() (gas: 98437)\n[PASS] testETHBacklogThresholdAndNewStakeNoPastRewards() (gas: 797649)\n[PASS] testFuzzETHConservation(uint96) (runs: 256, μ: 906614, ~: 943061)\n[PASS] testJITProcessCannotExitButCanClaimAllRewardForms() (gas: 2195074)\n[PASS] testLegFailureIsolationRetriesRerouteAndNoSecondBounty() (gas: 13152070)\n[PASS] testOneTimeDirectSwitchPreservesOldETHCredits() (gas: 1847556)\n[PASS] testRejectingKeeperCreditsAreReservedAndPullable() (gas: 926491)\n[PASS] testReportWeightsAndStaleFallback() (gas: 1556639)\n[PASS] testSlippageDeadlineAndFailurePreserveClaim() (gas: 1162177)\n[PASS] testThirdLegFailureAfterWhitelistRevokedReroutes() (gas: 9693437)\n[PASS] testThreeLegPullRewardsAndKeeper() (gas: 1627143)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 320.47ms (109.59ms CPU time)\n\nRan 11 tests for test/unit/Revision.t.sol:RevisionTest\n[PASS] testFuzz_exactOutputFeesAreGrossRate(uint32,uint128) (runs: 256, μ: 339345, ~: 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 320.39ms (144.35ms CPU time)\n\nRan 6 tests for test/unit/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 80094, ~: 80337)\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 327.46ms (148.42ms CPU time)\n\nRan 4 tests for test/unit/ExtensionAdversarial.t.sol:ExtensionAdversarialTest\n[PASS] testBountyCallbackCannotReenterOrDoubleAllocate() (gas: 1107305)\n[PASS] testDirectTokenLockCannotPreventPrincipalOrOtherRewards() (gas: 2158480)\n[PASS] testFuzzTwoStakersNeverClaimMoreETHThanFunded(uint96,uint96,uint64) (runs: 256, μ: 1192323, ~: 1187989)\n[PASS] testNFTStakeCallbackCannotReenterAndAllowanceIsCleared() (gas: 837558)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 327.24ms (118.39ms CPU time)\n\nRan 4 tests for test/unit/HookAdversarial.t.sol:HookAdversarialTest\n[PASS] testFuzz_exactInputSellChargesGrossEthAtAnyDecayTime(uint256,uint32,uint16) (runs: 1000, μ: 385659, ~: 386370)\n[PASS] testFuzz_exactOutputSellDeliversRequestedNetAndGrossFee(uint256,uint32) (runs: 1000, μ: 351494, ~: 351835)\n[PASS] test_decayBoundariesAndNoFeeResurrection() (gas: 526002)\n[PASS] test_partialExactOutputSellRevertsFeeAndPoolMovement() (gas: 480909)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 327.76ms (252.19ms CPU time)\n\nRan 22 tests for test/unit/AdamHook.t.sol:AdamHookTest\n[PASS] testFuzz_buyFeeMatchesSchedule(uint256,uint32) (runs: 256, μ: 331178, ~: 331448)\n[PASS] testFuzz_decayIsMonotoneAndBounded(uint32,uint32) (runs: 256, μ: 196456, ~: 196462)\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 347.27ms (404.33ms CPU time)\n\nRan 4 tests for test/unit/TreasuryBoundaries.t.sol:TreasuryBoundariesTest\n[PASS] testFuzz_directionalProtocolFeesPreserveExecutableOutputFloors(uint16,uint16) (runs: 1000, μ: 845355, ~: 845377)\n[PASS] test_cooldownRejectsOneSecondEarlyAndAcceptsExactBoundary() (gas: 996842)\n[PASS] test_deferredAndDirectTeamPaymentsGuardEveryMaintenanceEntryPoint() (gas: 1543795)\n[PASS] test_failureGapContinuesAtBoundaryAndResetsOneSecondLater() (gas: 1146904)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 347.31ms (149.20ms CPU time)\n\nRan 2 tests for test/unit/AuditTreasury.t.sol:AuditTreasuryTest\n[PASS] testFuzzDeferredKeeperDebtSurvivesRepeatedFailuresAndRecovery(uint96) (runs: 256, μ: 2616400, ~: 2690930)\n[PASS] testRewardCreditFailureRollsBackBuyAndPreservesOtherLegs() (gas: 1314580)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 360.00ms (146.23ms 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.55s (1.29s 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 | 3340  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| StakingLockHandler | elapse       | 3286  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| StakingLockHandler | grief        | 3333  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| StakingLockHandler | stake        | 3194  | 0       | 0        |\n|--------------------+--------------+-------+---------+----------|\n| StakingLockHandler | withdraw     | 3231  | 0       | 0        |\n╰--------------------+--------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.67s (1.67s 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     | 2119  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | elapse           | 2099  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | flush            | 2049  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | fund             | 1955  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | market           | 2137  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | payTeam          | 2005  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | process          | 2024  | 0       | 0        |\n|-----------------+------------------+-------+---------+----------|\n| TreasuryHandler | teamAvailability | 1996  | 0       | 0        |\n╰-----------------+------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.73s (2.44s 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             | 1835  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | donate            | 1790  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | elapse            | 1852  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | invalidWithdrawal | 1772  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | move              | 1827  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | reward            | 1821  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | roundTrip         | 1822  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | stake             | 1807  | 0       | 0        |\n|--------------------+-------------------+-------+---------+----------|\n| DistributorHandler | unstake           | 1858  | 0       | 0        |\n╰--------------------+-------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.93s (4.92s CPU time)\n\nRan 28 test suites in 4.93s (16.58s CPU time): 226 tests passed, 0 failed, 0 skipped (226 total tests)\n","passed":true},{"durationMs":94,"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\":21,\"README.md\":99,\"REVIEW.md\":103,\"SELF_AUDIT.md\":28,\"docs/DEPLOYMENT_CHECKLIST.md\":33,\"docs/HEARTBEAT.md\":79,\"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\":146,\"script/utils/HookMiner.sol\":60,\"src/AdamDistributor.sol\":269,\"src/AdamDistributorV2.sol\":179,\"src/AdamHook.sol\":276,\"src/AdamSplitOracle.sol\":203,\"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\":65,\"test/fork/IMDSTRFork.t.sol\":305,\"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\":125,\"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\":374,\"test/unit/AdamTreasury.t.sol\":503,\"test/unit/AuditDistributor.t.sol\":63,\"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\":123,\"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\":207,\"test/unit/OraclePublicVector.t.sol\":41,\"test/unit/PostFactoryHook.t.sol\":152,\"test/unit/Revision.t.sol\":198,\"test/unit/StakingLock.t.sol\":240,\"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":7387,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/AdamDistributorV2.sol:163: Reentrancy in AdamDistributorV2.unlockCallback(bytes) (src/AdamDistributorV2.sol#163-178):\n[high/medium] reentrancy-balance at src/AdamDistributorV2.sol:163: Reentrancy in AdamDistributorV2.unlockCallback(bytes) (src/AdamDistributorV2.sol#163-178):\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:168: AdamSplitOracle.clamp(uint16,uint16,uint16).sum (src/AdamSplitOracle.sol#168) 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/AdamSplitOracle.sol:131: AdamSplitOracle._valid(AdamSplitOracle.Attestation,bytes,string) (src/AdamSplitOracle.sol#131-162) ignores return value by (recovered,err,None) = ECDSA.tryRecover(digest(a),signature) (src/AdamSplitOracle.sol#160)\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/AdamTreasury.sol:252: AdamTreasury.unlockCallback(bytes) (src/AdamTreasury.sol#252-276) ignores return value by poolManager.settle{value: ethIn}() (src/AdamTreasury.sol#273)\n[medium/medium] unused-return at src/AdamTreasury.sol:125: AdamTreasury.constructor(address,address,address,address,uint24,uint24,address,uint16,address,uint24,uint24,address,uint16,uint256,uint16,uint32) (src/AdamTreasury.sol#125-183) ignores return value by (_legs[i].checkpointSqrtPriceX96,None,None,None) = poolManager.getSlot0(_legs[i].key.toId()) (src/AdamTreasury.sol#180)\n[medium/medium] unused-return at src/AdamTreasuryV2.sol:188: AdamTreasuryV2._executeLeg(uint8) (src/AdamTreasuryV2.sol#188-224) ignores return value by (l.checkpointSqrtPriceX96,None,None,None) = poolManager.getSlot0(l.key.toId()) (src/AdamTreasuryV2.sol#203)\n[medium/medium] unused-return at src/AdamTreasury.sol:322: AdamTreasury._executeLeg(uint8) (src/AdamTreasury.sol#322-360) ignores return value by (l.checkpointSqrtPriceX96,None,None,None) = poolManager.getSlot0(l.key.toId()) (src/AdamTreasury.sol#338)\n[medium/medium] unused-return at src/AdamDistributorV2.sol:163: AdamDistributorV2.unlockCallback(bytes) (src/AdamDistributorV2.sol#163-178) ignores return value by poolManager.settle{value: ethIn}() (src/AdamDistributorV2.sol#173)\n[medium/high] write-after-write at src/AdamDistributorV2.sol:34: AdamDistributorV2._swapping (src/AdamDistributorV2.sol#34) is written in both\n[low/medium] missing-zero-check at src/AdamDistributorV2.sol:50: AdamDistributorV2.constructor(address,address,address,address,address,PoolKey,uint256).nftClaim_ (src/AdamDistributorV2.sol#50) lacks a zero-check on :\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:156: Reentrancy in AdamDistributorV2._buy(address,uint256,uint256) (src/AdamDistributorV2.sol#156-161):\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:117: Reentrancy in AdamDistributorV2.notifyIMDSTR(uint256) (src/AdamDistributorV2.sol#117-129):\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-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/AdamDistributorV2.sol:91: AdamDistributorV2._unstake(uint256) (src/AdamDistributorV2.sol#91-95) 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/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/AdamDistributorV2.sol:133: AdamDistributorV2.claimIMDSTR(uint256,uint256,uint256) (src/AdamDistributorV2.sol#133-147) 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/AdamSplitOracle.sol:131: AdamSplitOracle._valid(AdamSplitOracle.Attestation,bytes,string) (src/AdamSplitOracle.sol#131-162) uses timestamp for comparisons\n[low/medium] timestamp at src/NFTClaim.sol:75: NFTClaim.claimable(uint8,uint256) (src/NFTClaim.sol#75-81) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamHook.sol:110: AdamHook.currentFeeBps() (src/AdamHook.sol#110-118) uses timestamp for comparisons\n[low/medium] timestamp at src/AdamTreasuryV2.sol:98: AdamTreasuryV2.process() (src/AdamTreasuryV2.sol#98-143) uses timestamp for comparisons\n[low/medium] timestamp at src/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:188: AdamSplitOracle.currentSplit() (src/AdamSplitOracle.sol#188-193) uses timestamp for comparisons","passed":true},{"durationMs":760,"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:151: 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:119: Literal Instead of Constant (32 places)\n[low] local-variable-shadowing at src/AdamSplitOracle.sol:38: Local Variable Shadows State Variable (6 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 (2 places)\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":"ab06b4365ed912532597c5defdcc39f103d436a0acb6bb32bbb63b377902223a","verifiedTreeHash":"6abb6585eb02ae71fcdf80fd6fe2f4ccf712b091","verifierVersion":"0.1.0+986b9f58"}]}