{"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":"e4a76c72-d53a-45d3-97c4-82b4428dae24","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"2ad93b5ffcae71b841d573436e0b4d6781e419013e1cba7432030b8975f385b7","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"}],"objective":"there is no ethereum mainnet launch record yet\n\nDCA paired with FWA on ethereum mainnet\n1 billion token supply\n88% opens the pool at a 2 million FWA market cap\n\n0x1EE3ffadfE138415A2ddaedeEBe5F46616fA413d will be the operator and signer, send fees to 0xCAE0B01E56cB164ce866A137d3528658b2FCBd4b","parentJobId":"5567e049-a518-4c7e-9efc-b78b2fd0d2ee","planHash":"9fd7ebd5d10f191a5464c5c459b2031d768066d16bdda22b1e75ac4076a9f4ca","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"6e8264fd-0574-4350-8fb0-9058496d00f3","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1464-democratizing-collectable-acquisions"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51368","feedbackHash":"3e17edaeca35d56394e060ec1357d51a74206618f6930c54539345af5a7724d3","nodeKey":"build_contract_project","submissionHash":"2ad93b5ffcae71b841d573436e0b4d6781e419013e1cba7432030b8975f385b7","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51390","feedbackHash":"4719dbab495a3b0a518ce559a8728283379a83fd16635bbdc1b42d39cc853d04","nodeKey":"build_contract_project","submissionHash":"409a9d5fbd84e7ccd6d747f7c9b8e56075c90d734a7d6fdc84410c2805ea32c0","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"b2cfd1e8b53ccc38c8b83b761585b76349880a0f91b2ff1af6860b79ed50f2a2","state":"completed","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"7e39dfc946d434a114d2af73152f8c4054de49210a45f3af026c8d2f4a7b6dac","device":"bf4c5b8707945096","findings":[],"hash":"2ad93b5ffcae71b841d573436e0b4d6781e419013e1cba7432030b8975f385b7","nodeId":"47d58004-2133-4553-bf4c-9c29ed06c6e1","outcome":"completed","summary":"I've written the Ethereum mainnet launch for DCA paired with FWA, without the fault that got the last attempt rejected. `forge build`, `forge test` (168 tests, all passing) and `forge fmt --check` all pass. Slither now reports nothing above informational: only three notes about long number literals in embedded contract code. Nothing was deployed, signed or committed.\n\n**How the launch works** (`src/DCAMainnetLauncher.sol`)\n- The operator `0x1EE3…413d` is the launcher's owner. They call `launch(salt)` once, and the whole launch happens in one transaction:\n  - it creates the DCA token, with the full 1,000,000,000 supply minted to the launcher;\n  - it deploys the existing 5% FWA fee hook at an address prepared in advance;\n  - it opens the DCA/FWA pool at a 2,000,000 FWA market cap (0.002 FWA per DCA);\n  - it puts 88% of the supply into the pool as DCA-only liquidity;\n  - it sends the other 12% to the operator.\n- The price, supply, 88% share and fee recipient are fixed in the code. The operator's only input is the salt, and there are no settings to change after deployment.\n- **The rejected fault is gone.** The launcher only ever spends tokens it holds itself. There is no `transferFrom` and no approval anywhere.\n- **Fees:** the hook's 5% FWA fee and the pool's 1.25% trading fees both go to `0xCAE0…4b`. Anyone can trigger the payouts, with `hook.claimFees()` and `launcher.collectFees()`.\n- **If something fails:** a wrong salt or any other error undoes the whole transaction, and the launch can be retried.\n- I also fixed the other warnings from the last review in `DCAHook` and `DCAHookLauncher`. Return values that were ignored are now checked, and events and state changes now come before outside calls.\n\n**Script** (`script/MainnetLaunch.s.sol`)\n- `deploy()` deploys the launcher with the operator and the Uniswap v4 PoolManager address.\n- `prepare(launcher, start, attempts)` is read-only. It checks mainnet, the owner, the PoolManager and FWA's settings, finds the hook salt, and returns the exact zero-value transaction for the operator to sign, with every expected number.\n\n**Choices I made where the brief was open** (all documented in the README):\n- **Liquidity is locked forever.** Nothing can withdraw the 88%, including the operator.\n- **No FWA goes into the pool.** Because the pool holds only DCA, it can't start exactly at the opening price. Liquidity begins at most about 0.5% above it, so the first buyer pays up to that much more.\n- **Trading fees go to `0xCAE0…4b` too.** I read \"send fees to 0xCAE0…\" as covering them as well as the 5% hook fee.\n- **No IMD platform fee share is paid** by this route.\n- **The 12% goes entirely to the operator.** The earlier launch plan's 10% for the swarm and 2% remainder are not split out by the contracts; that is now the operator's decision.\n\n**Things to watch:**\n- Deploy only `DCAMainnetLauncher`. Don't use it alongside the older `DCAHookLauncher` route, or you'd end up with two DCA tokens.\n- FWA's owner controls FWA's transfer rules. If the PoolManager stopped being an FWA distributor, FWA swaps and fee payouts would fail.\n- Passing tests is not an audit. A separate independent review is still needed before launch.\n\nThe README has the full parameter tables, the launch steps and an \"After launch\" section. `SECURITY.md` and `test/ADVERSARIAL_TESTS.md` record the security cases and failure tests.","treeHash":"e3bea53a8710a8e583546b1607a8323df0cfe391","usage":{"cachedInputTokens":3275635,"inputTokens":64,"model":"claude-opus-5-5","outputTokens":67348,"runtime":"claude","turns":33,"wallClockMs":691718}},{"artifacts":[],"attempt":1,"bundleHash":"c4f267936c39cd5098fdcf9a1b500c6bd52757f44ebe943ad7b489f599d9fe7e","device":"dd0f9bb0bf93f9dd","findings":[],"hash":"409a9d5fbd84e7ccd6d747f7c9b8e56075c90d734a7d6fdc84410c2805ea32c0","nodeId":"47d58004-2133-4553-bf4c-9c29ed06c6e1","outcome":"completed","summary":"Implemented the mainnet launch path with 880 million DCA (88%) at 0.002 FWA/DCA, using the specified operator and fee recipient.\n\n`forge build`, `forge test` — **196 tests passed** — and `forge fmt --check` pass.\n\n[Launch runbook](/home/imd-worker/.identitymd/work/e4a76c72-d53a-45d3-97c4-82b4428dae24/47d58004-2133-4553-bf4c-9c29ed06c6e1/docs/MAINNET.md) documents parameters, assumptions and responsibilities. The operator must configure the liquidity range and supply its quoted FWA funding. No mainnet transactions were sent.","treeHash":"a47b1d24a26a316ff5e1674e0a898851e3ea9a99","usage":{"cachedInputTokens":2343040,"inputTokens":131282,"model":"gpt-6-astra","outputTokens":37044,"runtime":"codex","turns":8,"wallClockMs":991833}}],"verification":[{"checks":[{"durationMs":10252,"exitCode":0,"name":"build","output":"Compiling 99 files with Solc 0.8.26\nSolc 0.8.26 finished in 9.99s\nCompiler run successful!\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DCAHook.sol:106:30\n    │\n106 │                 ? feeOnGross(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/DCAHook.sol:107:28\n    │\n107 │                 : feeOnNet(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/DCAHook.sol:132:36\n    │\n132 │             fee = buy ? feeOnGross(uint256(-params.amountSpecified)) : feeOnNet(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/DCAHook.sol:132:81\n    │\n132 │             fee = buy ? feeOnGross(uint256(-params.amountSpecified)) : feeOnNet(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/DCAHook.sol:134:54\n    │\n134 │             if (fwaDelta != params.amountSpecified + int256(fee)) revert PartialFill();\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/DCAHook.sol:135:27\n    │\n135 │             gross = buy ? uint256(-params.amountSpecified) : uint256(fwaDelta);\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/DCAHook.sol:135:62\n    │\n135 │             gross = buy ? uint256(-params.amountSpecified) : uint256(fwaDelta);\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/DCAHook.sol:137:27\n    │\n137 │             uint256 net = uint256(-fwaDelta);\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/DCAHook.sol:141:21\n    │\n141 │             gross = uint256(fwaDelta);\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 `_status` is updated\n    ╭▸ src/DCAHook.sol:182:35\n    │\n182 │         uint256 paid = abi.decode(poolManager.unlock(\"\"), (uint256));\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/DCAMainnetLauncher.sol:202:13\n    │\n202 │         if (poolManager.initialize(_poolKey(expectedToken, expectedHook), sqrtPriceX96) != tick) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/DCAMainnetLauncher.sol:205:24\n    │\n205 │         if (abi.decode(poolManager.unlock(\"\"), (uint256)) != pooled) revert UnexpectedDelta();\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/DCAMainnetLauncher.sol:184:9\n    │\n184 │ ┏         emit Launched(\n185 │ ┃             expectedToken,\n186 │ ┃             expectedHook,\n187 │ ┃             _poolKey(expectedToken, expectedHook).toId(),\n    ‡ ┃\n194 │ ┃             TOTAL_SUPPLY - pooled\n195 │ ┃         );\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/DCAMainnetLauncher.sol:214:45\n    │\n214 │         (dcaAmount, fwaAmount) = abi.decode(poolManager.unlock(\"\"), (uint256, uint256));\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/DCAMainnetLauncher.sol:215:9\n    │\n215 │         emit LiquidityFeesCollected(msg.sender, FEE_RECIPIENT, dcaAmount, fwaAmount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DCAMainnetLauncher.sol:244:16\n    │\n244 │         owed = uint256(-int256(dcaDelta));\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/DCAMainnetLauncher.sol:260:21\n    │\n260 │         dcaAmount = uint256(int256(dcaDelta));\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/DCAMainnetLauncher.sol:261:21\n    │\n261 │         fwaAmount = uint256(int256(fwaDelta));\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/DCAHookLauncher.sol:118:9\n    │\n118 │         emit PoolLaunched(address(deployed), key.toId(), salt, sqrtPriceX96, tick);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\n","passed":true},{"durationMs":10892,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/DCATokenEdges.t.sol:DCATokenEdgesTest\n[PASS] test_ApprovalReplacementRevocationAndReapprovalAreEffectiveImmediately() (gas: 332874)\n[PASS] test_Uint256MaxTransfersFailWithoutChangingBalancesOrInfiniteAllowance() (gas: 209044)\n[PASS] test_WholeSupplyTransferFromSelfConsumesAllowanceWithoutChangingBalance() (gas: 273579)\n[PASS] test_ZeroAddressesCannotBeApprovedOrUsedAsMintBurnPathsEvenForZeroAmount() (gas: 125073)\n[PASS] test_ZeroTransfersFromEmptyWalletEmitEventsWithoutApprovalOrTax() (gas: 135267)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 953.34µs (1.30ms CPU time)\n\nRan 12 tests for test/DCAHookEdges.t.sol:DCAHookEdgesFwa0Test\n[PASS] testFuzz_GrossFeeHasBoundedRemainderOverEntireUint256Domain(uint256) (runs: 1000, μ: 9822, ~: 9822)\n[PASS] testFuzz_NetInversionIsExactAndMinimalThroughSignedBoundary(uint256) (runs: 1000, μ: 29691, ~: 29471)\nLogs:\n  Bound result 46798150697572605365840513036422847968\n\n[PASS] testFuzz_SenderAndHookDataCannotChangeFixedBuyFee(address,bytes) (runs: 1000, μ: 38981, ~: 38979)\n[PASS] test_AfterSwapRejectsWrongFwaSignsForAllFourModes() (gas: 150159)\n[PASS] test_AllInvalidAmountEdgesRejectedByBothCallbacks() (gas: 850921)\n[PASS] test_BeforeSwapAcceptsSignedEdgesWithoutNarrowingOrPoolFeeOverride() (gas: 50529)\n[PASS] test_FailedSecondSwapRollsBackFirstSwapAndItsFees() (gas: 630144)\n[PASS] test_FeeRoundingPinnedBoundaries() (gas: 144932)\n[PASS] test_FwaClaimIgnoresUnrelatedCurrencyClaims() (gas: 357902)\n[PASS] test_InitializedTickCrossingChargesFwaAndPreservesPoolFees() (gas: 1680094)\n[PASS] test_LargestRepresentableNetAcceptedAndNextWeiRejected() (gas: 33983)\n[PASS] test_RemovingAllLiquidityCannotConsumeAccruedFees() (gas: 773254)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 88.45ms (67.18ms CPU time)\n\nRan 7 tests for test/DCAToken.t.sol:DCATokenTest\n[PASS] testFuzz_WalletTransfersAreUntaxed(uint256) (runs: 256, μ: 150924, ~: 151664)\nLogs:\n  Bound result 767\n\n[PASS] test_ApprovalTransferFromAndInfiniteApproval() (gas: 285319)\n[PASS] test_FactoryReceivesSupplyAndLaunchAllocationsArriveWhole() (gas: 504856)\n[PASS] test_InsufficientBalanceAndAllowanceRevert() (gas: 124739)\n[PASS] test_MetadataAndEntireSupplyMintedOnce() (gas: 64311)\n[PASS] test_NoMintPauseBlacklistSeizeOrUpgradePowers() (gas: 619116)\n[PASS] test_ZeroRecipientRevertsAndSelfTransferPreservesBalance() (gas: 72110)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 89.21ms (90.67ms CPU time)\n\nRan 31 tests for test/DCAHook.t.sol:DCAHookFwaCurrency0Test\n[PASS] testFuzz_FeeConservationAcrossSwapModes(bool,bool,uint256) (runs: 256, μ: 524200, ~: 522730)\nLogs:\n  Bound result 24071\n\n[PASS] testFuzz_RoundingInverseIsMinimalAndExactlyFivePercent(uint256) (runs: 256, μ: 13919, ~: 13675)\nLogs:\n  Bound result 67539396928082804774722857648616982\n\n[PASS] test_BatchedSwapsCollectOncePerSwapAndSettle() (gas: 357329)\n[PASS] test_BuyExactInputChargesFivePercentOfFwaPaidIn() (gas: 525791)\n[PASS] test_BuyExactOutputIncludesFeeInTotalFwaPaid() (gas: 523417)\n[PASS] test_CallbackFromManagerWithoutClaimReverts() (gas: 36787)\n[PASS] test_ClaimBeforeFeesIsNoop() (gas: 37441)\n[PASS] test_ClaimIncludesDonatedFwaClaims() (gas: 350852)\n[PASS] test_ClaimInsideAnExistingUnlockRevertsWithoutLosingFees() (gas: 355949)\n[PASS] test_ClaimsAboveSignedDeltaLimitRemainClaimableInChunks() (gas: 406857)\n[PASS] test_ClaimsCannotBeStolenByAnOperatorOrAllowance() (gas: 257127)\n[PASS] test_DirectCallbacksRequireManager() (gas: 101436)\n[PASS] test_DustBuyRoundsFeeDown() (gas: 346307)\n[PASS] test_FailedPayoutPreservesAllClaimsAndCanRetry() (gas: 460516)\n[PASS] test_FeeAndRecipientCannotBeChanged() (gas: 190882)\n[PASS] test_FwaMockRejectsOrdinaryTransferButClaimSucceeds() (gas: 367434)\n[PASS] test_InitializationCannotBeFrontRun() (gas: 49536)\n[PASS] test_LiquidityHasNoHookFeeAndCanBeRemoved() (gas: 152484)\n[PASS] test_PartialExactInputBuyRevertsAndRollsBack() (gas: 168129)\n[PASS] test_PartialExactInputSellOnlyTaxesActualFwaOutput() (gas: 209754)\n[PASS] test_PartialExactOutputBuyOnlyTaxesActualFwaInput() (gas: 202712)\n[PASS] test_PartialExactOutputSellRevertsAndRollsBack() (gas: 120268)\n[PASS] test_PayoutReentrancyCannotClaimTwice() (gas: 397694)\n[PASS] test_PermissionlessClaimPaysOnlyFixedRecipientAndRepeatIsNoop() (gas: 794861)\n[PASS] test_PermissionsMatchActualMinedAddress() (gas: 34997)\n[PASS] test_RejectsOtherFeeTickSpacingCurrencyAndHook() (gas: 189810)\n[PASS] test_RejectsZeroAndOutOfRangeAmounts() (gas: 115344)\n[PASS] test_SellExactInputChargesFivePercentOfGrossFwaOutput() (gas: 516348)\n[PASS] test_SellExactOutputReceivesRequestedNetFwa() (gas: 518381)\n[PASS] test_SingleSidedLaunchSeedsWithoutFwaAndFirstBuyCanFundItsFee() (gas: 1000662)\n[PASS] test_SwapCallbacksRejectDifferentPoolEvenFromManager() (gas: 57558)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 111.47ms (77.77ms CPU time)\n\nRan 21 tests for test/DCAMainnetLauncher.t.sol:DCAMainnetLauncherTest\n[PASS] testFuzz_PositionRangeIsSingleSidedAndAligned(int24,bool) (runs: 256, μ: 21309, ~: 21219)\nLogs:\n  Bound result -1\n\n[PASS] test_CollectFeesCannotBeReentered() (gas: 19293057)\n[PASS] test_CollectFeesPayoutFailureRevertsAndRetries() (gas: 47428257)\n[PASS] test_CollectFeesWithNothingAccruedReturnsZero() (gas: 17026142)\n[PASS] test_Constants() (gas: 40241)\n[PASS] test_ConstructorRejectsZeroAddresses() (gas: 6118)\n[PASS] test_DeployConfigUsesOperatorWhoeverSends() (gas: 3981494)\n[PASS] test_FirstBuyPaysNearOpeningPriceAndFeesReachRecipient() (gas: 98023250)\n[PASS] test_LaunchDcaAsCurrency0() (gas: 17246976)\n[PASS] test_LaunchFwaAsCurrency0() (gas: 45527284)\n[PASS] test_LaunchOnlyOnce() (gas: 16988368)\n[PASS] test_LaunchRequiresManagerAndFwaCode() (gas: 15049382)\n[PASS] test_NotLaunchedViewsAndFees() (gas: 41153)\n[PASS] test_OnlyOperatorCanLaunch() (gas: 15102455)\n[PASS] test_OpeningPriceIsTwoMillionFwaMarketCap() (gas: 4777)\n[PASS] test_OpeningSqrtPriceIsFloorSqrt() (gas: 69853)\n[PASS] test_OthersCannotInitializeTheHookedPool() (gas: 17006402)\n[PASS] test_PrepareRejectsWrongSetup() (gas: 4181089)\n[PASS] test_PrepareReturnsExecutableLaunch() (gas: 12505807)\n[PASS] test_UnlockCallbackIsAuthenticated() (gas: 17139087)\n[PASS] test_WrongSaltRollsBackAndCanRetry() (gas: 46115553)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 140.66ms (804.11ms CPU time)\n\nRan 13 tests for test/PrepareLaunch.t.sol:PrepareLaunchTest\n[PASS] test_ExhaustedSearchLeavesLauncherUnconfigured() (gas: 80007)\n[PASS] test_PreparationDoesNotDependOnCallerAndSignedTokenOverridesStaleSetting() (gas: 15177221)\n[PASS] test_PreparationIsReadOnlyAndReturnsExecutableOwnerTransaction() (gas: 8327747)\n[PASS] test_PreparationRejectsActivatedLauncher() (gas: 8238151)\n[PASS] test_PreparationRejectsIncompatibleFwaAndRevokedDistributor() (gas: 219947)\n[PASS] test_PreparationRejectsInvalidPriceBounds() (gas: 80165)\n[PASS] test_PreparationRejectsMissingContracts() (gas: 159313)\n[PASS] test_PreparationRejectsNoncanonicalManager() (gas: 27905)\n[PASS] test_PreparationRejectsOccupiedHookAddress() (gas: 13822693)\n[PASS] test_PreparationRejectsWrongChain() (gas: 20407)\n[PASS] test_PreparationRejectsWrongOwnerIncludingFactory() (gas: 47624)\n[PASS] test_PreparationRejectsWrongTokenMetadataAndSupply() (gas: 185054)\n[PASS] test_PreparedActivationBuySellAndPayoutForBothTokenOrderings() (gas: 32842328)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 140.73ms (252.64ms CPU time)\n\nRan 5 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_InvalidConstructorArgumentsRevert() (gas: 5417)\n[PASS] test_NoExternalCallsEvenIfTokenIsNotYetDeployed() (gas: 7436868)\n[PASS] test_PreparationDeploysExactPredictedAddressOnEmptyChain() (gas: 6379946)\n[PASS] test_PreparationRejectsMissingAddressesAndExhaustedSearch() (gas: 1774014)\n[PASS] test_WrongHookAddressBitsAreRejected() (gas: 251871)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 141.99ms (44.73ms CPU time)\n\nRan 31 tests for test/DCAHook.t.sol:DCAHookFwaCurrency1Test\n[PASS] testFuzz_FeeConservationAcrossSwapModes(bool,bool,uint256) (runs: 256, μ: 525150, ~: 531320)\nLogs:\n  Bound result 8302\n\n[PASS] testFuzz_RoundingInverseIsMinimalAndExactlyFivePercent(uint256) (runs: 256, μ: 13917, ~: 13675)\nLogs:\n  Bound result 120\n\n[PASS] test_BatchedSwapsCollectOncePerSwapAndSettle() (gas: 351628)\n[PASS] test_BuyExactInputChargesFivePercentOfFwaPaidIn() (gas: 513249)\n[PASS] test_BuyExactOutputIncludesFeeInTotalFwaPaid() (gas: 513485)\n[PASS] test_CallbackFromManagerWithoutClaimReverts() (gas: 36787)\n[PASS] test_ClaimBeforeFeesIsNoop() (gas: 37441)\n[PASS] test_ClaimIncludesDonatedFwaClaims() (gas: 344550)\n[PASS] test_ClaimInsideAnExistingUnlockRevertsWithoutLosingFees() (gas: 349647)\n[PASS] test_ClaimsAboveSignedDeltaLimitRemainClaimableInChunks() (gas: 406857)\n[PASS] test_ClaimsCannotBeStolenByAnOperatorOrAllowance() (gas: 250825)\n[PASS] test_DirectCallbacksRequireManager() (gas: 101627)\n[PASS] test_DustBuyRoundsFeeDown() (gas: 339135)\n[PASS] test_FailedPayoutPreservesAllClaimsAndCanRetry() (gas: 454214)\n[PASS] test_FeeAndRecipientCannotBeChanged() (gas: 190882)\n[PASS] test_FwaMockRejectsOrdinaryTransferButClaimSucceeds() (gas: 361132)\n[PASS] test_InitializationCannotBeFrontRun() (gas: 49536)\n[PASS] test_LiquidityHasNoHookFeeAndCanBeRemoved() (gas: 152484)\n[PASS] test_PartialExactInputBuyRevertsAndRollsBack() (gas: 161993)\n[PASS] test_PartialExactInputSellOnlyTaxesActualFwaOutput() (gas: 215811)\n[PASS] test_PartialExactOutputBuyOnlyTaxesActualFwaInput() (gas: 196865)\n[PASS] test_PartialExactOutputSellRevertsAndRollsBack() (gas: 126282)\n[PASS] test_PayoutReentrancyCannotClaimTwice() (gas: 391392)\n[PASS] test_PermissionlessClaimPaysOnlyFixedRecipientAndRepeatIsNoop() (gas: 788567)\n[PASS] test_PermissionsMatchActualMinedAddress() (gas: 34997)\n[PASS] test_RejectsOtherFeeTickSpacingCurrencyAndHook() (gas: 189810)\n[PASS] test_RejectsZeroAndOutOfRangeAmounts() (gas: 115377)\n[PASS] test_SellExactInputChargesFivePercentOfGrossFwaOutput() (gas: 529078)\n[PASS] test_SellExactOutputReceivesRequestedNetFwa() (gas: 528501)\n[PASS] test_SingleSidedLaunchSeedsWithoutFwaAndFirstBuyCanFundItsFee() (gas: 988269)\n[PASS] test_SwapCallbacksRejectDifferentPoolEvenFromManager() (gas: 57749)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 142.03ms (71.85ms CPU time)\n\nRan 12 tests for test/DCAHookEdges.t.sol:DCAHookEdgesFwa1Test\n[PASS] testFuzz_GrossFeeHasBoundedRemainderOverEntireUint256Domain(uint256) (runs: 1000, μ: 9822, ~: 9822)\n[PASS] testFuzz_NetInversionIsExactAndMinimalThroughSignedBoundary(uint256) (runs: 1000, μ: 29693, ~: 29471)\nLogs:\n  Bound result 24562895406168245343474936345946\n\n[PASS] testFuzz_SenderAndHookDataCannotChangeFixedBuyFee(address,bytes) (runs: 1000, μ: 38992, ~: 38990)\n[PASS] test_AfterSwapRejectsWrongFwaSignsForAllFourModes() (gas: 150283)\n[PASS] test_AllInvalidAmountEdgesRejectedByBothCallbacks() (gas: 850921)\n[PASS] test_BeforeSwapAcceptsSignedEdgesWithoutNarrowingOrPoolFeeOverride() (gas: 50529)\n[PASS] test_FailedSecondSwapRollsBackFirstSwapAndItsFees() (gas: 617403)\n[PASS] test_FeeRoundingPinnedBoundaries() (gas: 144932)\n[PASS] test_FwaClaimIgnoresUnrelatedCurrencyClaims() (gas: 357902)\n[PASS] test_InitializedTickCrossingChargesFwaAndPreservesPoolFees() (gas: 1677283)\n[PASS] test_LargestRepresentableNetAcceptedAndNextWeiRejected() (gas: 33983)\n[PASS] test_RemovingAllLiquidityCannotConsumeAccruedFees() (gas: 767529)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 142.07ms (120.58ms CPU time)\n\nRan 22 tests for test/DCAHookLauncher.t.sol:DCAHookLauncherTest\n[PASS] test_AtomicActivationCannotReplaceLaunchedHook() (gas: 10293063)\n[PASS] test_AtomicActivationCommitsToTokenDespiteEarlierConfiguration() (gas: 10229561)\n[PASS] test_AtomicActivationFailureRestoresPriorSettingAndCanRetry() (gas: 11537363)\n[PASS] test_AtomicActivationStartsUnconfiguredAndMintsNothing() (gas: 10296128)\n[PASS] test_AtomicActivationUnauthorizedOrMissingCodeLeavesTokenUnset() (gas: 112414)\n[PASS] test_ConstructorRejectsMissingOwnerOrManager() (gas: 64799)\n[PASS] test_ConstructorWorksOnEmptyChainWithExplicitOwner() (gas: 60230)\n[PASS] test_DeploymentAndInitializationAreAtomicAndLeaveExistingSupplyUntouched() (gas: 10372252)\n[PASS] test_ExhaustedPreparationDoesNotChangeConfiguration() (gas: 100060)\n[PASS] test_ExplicitTokenHashRejectsInvalidTokenWithoutChangingConfiguration() (gas: 51837)\n[PASS] test_FrontRunnerCannotUsePublishedSaltOrChooseOpeningPrice() (gas: 10292027)\n[PASS] test_InvalidPriceRollsBackChildAndPoolThenSameSaltCanRetry() (gas: 11500124)\n[PASS] test_InvalidSaltRevertsWithoutDisablingRetry() (gas: 10379083)\n[PASS] test_InvalidTokenConfigurationLeavesItUnset() (gas: 117980)\n[PASS] test_LaunchAndTokenConfigurationCannotRepeatAfterSuccess() (gas: 10313454)\n[PASS] test_MissingManagerFailsAtFirstUseWithoutDeployingChild() (gas: 124638)\n[PASS] test_MissingTokenFailsAtFirstUseAndConfigurationCanBeFixed() (gas: 10321592)\n[PASS] test_OnlyRequesterCanConfigureOrLaunchNotEvenDeployingFactory() (gas: 172550)\n[PASS] test_OrdinaryFactoryDeploysLauncherWithoutHookAddressConstraint() (gas: 50556)\n[PASS] test_PreexistingUnhookedPoolIsDistinctAndDoesNotGainAFee() (gas: 10327714)\n[PASS] test_TokenMayBeCorrectedBeforeLaunchAndNewHashIsUsed() (gas: 10315900)\n[PASS] test_UnconfiguredLauncherCannotPrepareOrLaunch() (gas: 84132)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 141.97ms (449.20ms CPU time)\n\nRan 1 test for test/DCAInvariant.t.sol:DCAInvariantFwa1Test\n[PASS]\nDCAInvariantFwa1Test invariants:\n[PASS] invariant_ConservationOfBothTokensAndFixedSupply\n[PASS] invariant_FeeClaimsPlusPayoutsEqualAllAccruedFees\n[PASS] invariant_TransientAccountingAlwaysSettled\n DCAInvariantFwa1Test invariants (runs: 128, calls: 4096, reverts: 0)\n\n╭------------+----------+-------+---------+----------╮\n| Contract   | Selector | Calls | Reverts | Discards |\n+====================================================+\n| FeeHandler | claim    | 2029  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| FeeHandler | swap     | 2067  | 0       | 0        |\n╰------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 792012081\n  Bound result 19000000000000000\n  Bound result 380000\n  Bound result 71308647333140578476\n  Bound result 10000000000000000000\n  Bound result 19000000000000000\n  Bound result 242\n  Bound result 100\n  Bound result 190\n  Bound result 566\n  Bound result 50000000000000022553\n  Bound result 4079\n  Bound result 19223\n  Bound result 4468\n  Bound result 11204\n  Bound result 2797\n  Bound result 30201801920421680691\n  Bound result 244\n  Bound result 4961\n  Bound result 4755\n  Bound result 190000000000\n  Bound result 99999999999999999997\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.48s (1.35s CPU time)\n\nRan 1 test for test/DCAInvariant.t.sol:DCAInvariantFwa0Test\n[PASS]\nDCAInvariantFwa0Test invariants:\n[PASS] invariant_ConservationOfBothTokensAndFixedSupply\n[PASS] invariant_FeeClaimsPlusPayoutsEqualAllAccruedFees\n[PASS] invariant_TransientAccountingAlwaysSettled\n DCAInvariantFwa0Test invariants (runs: 128, calls: 4096, reverts: 0)\n\n╭------------+----------+-------+---------+----------╮\n| Contract   | Selector | Calls | Reverts | Discards |\n+====================================================+\n| FeeHandler | claim    | 2029  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| FeeHandler | swap     | 2067  | 0       | 0        |\n╰------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 768\n  Bound result 19000000000000000\n  Bound result 380000\n  Bound result 71308647333140578476\n  Bound result 10000000000000000000\n  Bound result 19000000000000000\n  Bound result 242\n  Bound result 100\n  Bound result 190\n  Bound result 2479\n  Bound result 50000000000000022553\n  Bound result 16354\n  Bound result 1484145232\n  Bound result 4451\n  Bound result 11148\n  Bound result 1005\n  Bound result 13377359127845683037\n  Bound result 244\n  Bound result 10879\n  Bound result 353\n  Bound result 190000000000\n  Bound result 99999999999999999997\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.49s (1.43s CPU time)\n\nRan 2 tests for test/DCATokenStateful.t.sol:DCATokenStatefulTest\n[PASS]\nDCATokenStatefulTest invariants:\n[PASS] invariant_AllowancesMatchApprovalsAndSuccessfulSpendsOnly\n[PASS] invariant_BalancesMatchIndependentLedgerAndEntireSupply\n DCATokenStatefulTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------+----------------------+-------+---------+----------╮\n| Contract         | Selector             | Calls | Reverts | Discards |\n+======================================================================+\n| DCALedgerHandler | approve              | 2262  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | invalidReceiver      | 2352  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | overdraw             | 2426  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | overdrawWithApproval | 2310  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | overspendAllowance   | 2357  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | transfer             | 2327  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | transferFrom         | 2350  | 0       | 0        |\n╰------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 39\n  Bound result 10000000000000000000000\n  Bound result 0\n  Bound result 0\n  Bound result 784427943156835650870558491\n  Bound result 340357837340314122547982718\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 112680032526537768683193139\n  Bound result 0\n  Bound result 8480\n  Bound result 4096093076\n  Bound result 1046363170\n  Bound result 0\n  Bound result 120\n  Bound result 0\n  Bound result 16\n  Bound result 781977366984781074901378973\n  Bound result 7127\n  Bound result 110\n  Bound result 3\n  Bound result 0\n  Bound result 1675\n  Bound result 17\n  Bound result 7126\n  Bound result 19\n  Bound result 2771\n  Bound result 88\n  Bound result 95\n  Bound result 10\n  Bound result 1\n  Bound result 31000000000000000000\n  Bound result 64\n  Bound result 828\n  Bound result 10\n  Bound result 10000\n  Bound result 0\n  Bound result 6299\n  Bound result 112680032526537768683186720\n  Bound result 31\n\n[PASS] test_LedgerExercisesFullSupplySelfTransfersAndFailureRecovery() (gas: 1385456)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 5.00s (5.00s CPU time)\n\nRan 2 tests for test/DCAHookStateful.t.sol:DCAHookStatefulFwa1Test\n[PASS]\nDCAHookStatefulFwa1Test invariants:\n[PASS] invariant_AllAccruedFwaRemainsBackedAndBelongsOnlyToRecipient\n[PASS] invariant_BothTokensConservedAcrossAllActors\n[PASS] invariant_ManagerIsLockedWithoutUnsettledDebts\n[PASS] invariant_PriceLiquidityAndMandatoryPoolFeesMatchControl\n DCAHookStatefulFwa1Test invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+---------------------+-------+---------+----------╮\n| Contract             | Selector            | Calls | Reverts | Discards |\n+=========================================================================+\n| DCAAccountingHandler | changeLiquidity     | 2031  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | claim               | 2083  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | donate              | 2009  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | dustSwap            | 2120  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | rejectedPartialFill | 2033  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | rejectedPayout      | 2036  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | roundTrip           | 2051  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | swap                | 2021  | 0       | 0        |\n╰----------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 20\n  Bound result 15\n  Bound result 29\n  Bound result 2000000000000000000000000\n  Bound result 23\n  Bound result 30\n  Bound result 999999999999999999007\n  Bound result 1\n  Bound result 397370844099035002626\n  Bound result 1500000000000000000001009\n  Bound result 100000000000000000000\n  Bound result 8800\n  Bound result 11939\n  Bound result 8052\n  Bound result 15826\n  Bound result 11432\n  Bound result 1\n  Bound result 324\n  Bound result 1500020000000000000000001\n  Bound result 3000\n  Bound result 1500000000000000000000019\n  Bound result 40\n  Bound result 1500000000000000000016384\n  Bound result 1928882748678592652998870\n  Bound result 11875000000000000000\n  Bound result 13588\n  Bound result 2139367456799869028408\n  Bound result 192\n  Bound result 31\n  Bound result 999999999999999999333334\n  Bound result 40\n  Bound result 22\n  Bound result 1000\n  Bound result 1500000000000000000060001\n  Bound result 64\n  Bound result 130352422839366854625\n  Bound result 1500000000000002090626705\n  Bound result 10000000000000000000000\n\n[PASS] test_AllHandlerPathsAndSwapModesReachMeaningfulStates() (gas: 3251080)\nLogs:\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 1\n  Bound result 17000000000000000000\n  Bound result 500000000000000000000000\n  Bound result 100000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.63s (10.53s CPU time)\n\nRan 2 tests for test/DCAHookStateful.t.sol:DCAHookStatefulFwa0Test\n[PASS]\nDCAHookStatefulFwa0Test invariants:\n[PASS] invariant_AllAccruedFwaRemainsBackedAndBelongsOnlyToRecipient\n[PASS] invariant_BothTokensConservedAcrossAllActors\n[PASS] invariant_ManagerIsLockedWithoutUnsettledDebts\n[PASS] invariant_PriceLiquidityAndMandatoryPoolFeesMatchControl\n DCAHookStatefulFwa0Test invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+---------------------+-------+---------+----------╮\n| Contract             | Selector            | Calls | Reverts | Discards |\n+=========================================================================+\n| DCAAccountingHandler | changeLiquidity     | 2031  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | claim               | 2083  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | donate              | 2009  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | dustSwap            | 2120  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | rejectedPartialFill | 2033  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | rejectedPayout      | 2036  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | roundTrip           | 2051  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | swap                | 2021  | 0       | 0        |\n╰----------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 34\n  Bound result 15\n  Bound result 23\n  Bound result 2000000000000000000000000\n  Bound result 23\n  Bound result 30\n  Bound result 999999999999999999007\n  Bound result 1\n  Bound result 397370844099035002626\n  Bound result 1500000000000000011532127\n  Bound result 100000000000000000000\n  Bound result 8800\n  Bound result 8394\n  Bound result 2813059832\n  Bound result 12356\n  Bound result 11332\n  Bound result 1\n  Bound result 330\n  Bound result 1500020000000000000000001\n  Bound result 3000\n  Bound result 1500000000000000000000019\n  Bound result 40\n  Bound result 1500000000000000000016384\n  Bound result 1928882748678592652998870\n  Bound result 11875000000000000000\n  Bound result 13635\n  Bound result 2139367456799869028408\n  Bound result 192\n  Bound result 31\n  Bound result 999999999999999999333334\n  Bound result 40\n  Bound result 22\n  Bound result 1000\n  Bound result 1500000000000000000060001\n  Bound result 64\n  Bound result 130352422839366854625\n  Bound result 1500000000000000000010147\n  Bound result 10000000000000000000000\n\n[PASS] test_AllHandlerPathsAndSwapModesReachMeaningfulStates() (gas: 3258054)\nLogs:\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 1\n  Bound result 17000000000000000000\n  Bound result 500000000000000000000000\n  Bound result 100000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 10.73s (10.68s CPU time)\n\nRan 15 test suites in 10.73s (30.45s CPU time): 167 tests passed, 0 failed, 0 skipped (167 total tests)\n","passed":true},{"durationMs":110,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DCAHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"DCAHook.claimFees()\",\"DCAHook.unlockCallback(bytes)\",\"DCAHookLauncher.launch(bytes32,uint160)\",\"DCAHookLauncher.launchWithToken(address,bytes32,uint160)\",\"DCAHookLauncher.setToken(address)\",\"DCAMainnetLauncher.collectFees()\",\"DCAMainnetLauncher.launch(bytes32)\",\"DCAMainnetLauncher.unlockCallback(bytes)\",\"DCAToken.approve(address,uint256)\",\"DCAToken.transfer(address,uint256)\",\"DCAToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":130,\"README.md\":220,\"SECURITY.md\":66,\"foundry.toml\":19,\"remappings.txt\":4,\"script/MainnetLaunch.s.sol\":113,\"script/PrepareHook.s.sol\":31,\"script/PrepareLaunch.s.sol\":107,\"src/DCAHook.sol\":209,\"src/DCAHookLauncher.sol\":128,\"src/DCAMainnetLauncher.sol\":291,\"src/DCAToken.sol\":14,\"src/HookMiner.sol\":21,\"test/ADVERSARIAL_TESTS.md\":54,\"test/DCAHook.t.sol\":391,\"test/DCAHookEdges.t.sol\":225,\"test/DCAHookLauncher.t.sol\":367,\"test/DCAHookStateful.t.sol\":317,\"test/DCAInvariant.t.sol\":113,\"test/DCAMainnetLauncher.t.sol\":538,\"test/DCAToken.t.sol\":126,\"test/DCATokenEdges.t.sol\":110,\"test/DCATokenStateful.t.sol\":172,\"test/Deployment.t.sol\":98,\"test/PrepareLaunch.t.sol\":282,\"test/helpers/HookTestBase.sol\":103,\"test/helpers/PoolRouter.sol\":112,\"test/helpers/RestrictedFWA.sol\":43},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2477,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":558,"exitCode":0,"name":"aderyn","output":"[low] centralization-risk at src/DCAHookLauncher.sol:49: Centralization Risk (3 places)\n[low] large-numeric-literal at src/DCAHook.sol:26: Large Numeric Literal (3 places)\n[low] literal-instead-of-constant at src/DCAMainnetLauncher.sol:116: Literal Instead of Constant (2 places)\n[low] state-change-without-event at src/DCAHook.sol:186: State Change Without Event (2 places)\n[low] state-no-address-check at src/DCAHookLauncher.sol:56: Address State Variable Set Without Checks\n[low] uninitialized-local-variable at src/HookMiner.sol:13: Uninitialized Local Variable\n[low] unused-public-function at src/DCAMainnetLauncher.sol:109: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2ad93b5ffcae71b841d573436e0b4d6781e419013e1cba7432030b8975f385b7","verifiedTreeHash":"e3bea53a8710a8e583546b1607a8323df0cfe391","verifierVersion":"0.1.0+788bb33f"},{"checks":[{"durationMs":19714,"exitCode":0,"name":"build","output":"Compiling 101 files with Solc 0.8.26\nSolc 0.8.26 finished in 19.31s\nCompiler run successful!\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/DCAMainnetConfig.sol:60:43\n   │\n60 │         if (liquidity == 0 || liquidity > uint256(uint128(type(int128).max))) revert InvalidLiquidity();\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/DCAMainnetConfig.sol:60:51\n   │\n60 │         if (liquidity == 0 || liquidity > uint256(uint128(type(int128).max))) revert InvalidLiquidity();\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/DCAMainnetConfig.sol:62:23\n   │\n62 │         q.liquidity = uint128(liquidity);\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/DCAMainnetConfig.sol:66:58\n   │\n66 │         if (q.dca == 0 || q.dca > POOL_TOKENS || q.fwa > 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/DCAMainnetConfig.sol:66:66\n   │\n66 │         if (q.dca == 0 || q.dca > POOL_TOKENS || q.fwa > uint256(uint128(type(int128).max))) {\n   │                                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DCAHook.sol:106:30\n    │\n106 │                 ? feeOnGross(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/DCAHook.sol:107:28\n    │\n107 │                 : feeOnNet(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/DCAHook.sol:132:36\n    │\n132 │             fee = buy ? feeOnGross(uint256(-params.amountSpecified)) : feeOnNet(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/DCAHook.sol:132:81\n    │\n132 │             fee = buy ? feeOnGross(uint256(-params.amountSpecified)) : feeOnNet(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/DCAHook.sol:134:54\n    │\n134 │             if (fwaDelta != params.amountSpecified + int256(fee)) revert PartialFill();\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/DCAHook.sol:135:27\n    │\n135 │             gross = buy ? uint256(-params.amountSpecified) : uint256(fwaDelta);\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/DCAHook.sol:135:62\n    │\n135 │             gross = buy ? uint256(-params.amountSpecified) : uint256(fwaDelta);\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/DCAHook.sol:137:27\n    │\n137 │             uint256 net = uint256(-fwaDelta);\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/DCAHook.sol:141:21\n    │\n141 │             gross = uint256(fwaDelta);\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 `_status` is updated\n    ╭▸ src/DCAHook.sol:182:9\n    │\n182 │         poolManager.unlock(\"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/DCAHook.sol:182:9\n    │\n182 │         poolManager.unlock(\"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/DCAHookLauncher.sol:114:9\n    │\n114 │         poolManager.initialize(deployed.getPoolKey(), sqrtPriceX96);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/DCAMainnetLauncher.sol:107:9\n    │\n107 │         poolManager.unlock(abi.encode(q));\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/DCAHookLauncher.sol:115:9\n    │\n115 │         emit PoolLaunched(address(deployed), deployed.poolId(), salt, sqrtPriceX96);\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/DCAMainnetLauncher.sol:108:9\n    │\n108 │         emit PoolFunded(q.liquidity, q.dca, q.fwa, q.dcaRemainder);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/DCAMainnetLauncher.sol:107:9\n    │\n107 │         poolManager.unlock(abi.encode(q));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/DCAMainnetLauncher.sol:154:27\n    │\n154 │         return abi.decode(poolManager.unlock(abi.encode(amount)), (uint256, uint256));\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/DCAMainnetLauncher.sol:143:9\n    │\n143 │         emit LiquidityWithdrawn(amount, dca, fwa);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/DCAHookLauncher.sol:114:9\n    │\n114 │         poolManager.initialize(deployed.getPoolKey(), sqrtPriceX96);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/DCAMainnetLauncher.sol:195:9\n    │\n195 │         emit LPFeesPaid(dcaFees, fwaFees);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/DCAMainnetLauncher.sol:165:37\n    │\n165 │               (BalanceDelta delta,) = poolManager.modifyLiquidity(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n166 │ ┃                 key, ModifyLiquidityParams(tickLower, tickUpper, int256(uint256(q.liquidity)), bytes32(0)), \"\"\n167 │ ┃             );\n    │ ┗━━━━━━━━━━━━━┛\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DCAMainnetLauncher.sol:170:38\n    │\n170 │             if (int256(dcaDelta) != -int256(q.dca) || int256(fwaDelta) != -int256(q.fwa)) revert UnexpectedDelta();\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/DCAMainnetLauncher.sol:170:76\n    │\n170 │             if (int256(dcaDelta) != -int256(q.dca) || int256(fwaDelta) != -int256(q.fwa)) revert UnexpectedDelta();\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[arbitrary-send-erc20]: `transferFrom` uses an arbitrary `from`; require it to equal `msg.sender` or `address(this)`\n    ╭▸ src/DCAMainnetLauncher.sol:202:9\n    │\n202 │         IERC20(currency).safeTransferFrom(owner, address(poolManager), amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-erc20\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/DCAMainnetLauncher.sol:212:16\n    │\n212 │         return uint256(uint128(delta));\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/DCAMainnetLauncher.sol:212:24\n    │\n212 │         return uint256(uint128(delta));\n    │                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/DCAMainnetLauncher.sol:216:13\n    │\n216 │         if (block.timestamp > deadline) revert Expired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\n","passed":true},{"durationMs":17114,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/DCATokenEdges.t.sol:DCATokenEdgesTest\n[PASS] test_ApprovalReplacementRevocationAndReapprovalAreEffectiveImmediately() (gas: 332874)\n[PASS] test_Uint256MaxTransfersFailWithoutChangingBalancesOrInfiniteAllowance() (gas: 209044)\n[PASS] test_WholeSupplyTransferFromSelfConsumesAllowanceWithoutChangingBalance() (gas: 273579)\n[PASS] test_ZeroAddressesCannotBeApprovedOrUsedAsMintBurnPathsEvenForZeroAmount() (gas: 125073)\n[PASS] test_ZeroTransfersFromEmptyWalletEmitEventsWithoutApprovalOrTax() (gas: 135267)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 12.89ms (1.72ms CPU time)\n\nRan 7 tests for test/DCAToken.t.sol:DCATokenTest\n[PASS] testFuzz_WalletTransfersAreUntaxed(uint256) (runs: 256, μ: 151163, ~: 151748)\nLogs:\n  Bound result 816714167683928811667502643\n\n[PASS] test_ApprovalTransferFromAndInfiniteApproval() (gas: 285319)\n[PASS] test_FactoryReceivesSupplyAndLaunchAllocationsArriveWhole() (gas: 504856)\n[PASS] test_InsufficientBalanceAndAllowanceRevert() (gas: 124739)\n[PASS] test_MetadataAndEntireSupplyMintedOnce() (gas: 64311)\n[PASS] test_NoMintPauseBlacklistSeizeOrUpgradePowers() (gas: 619116)\n[PASS] test_ZeroRecipientRevertsAndSelfTransferPreservesBalance() (gas: 72110)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 13.06ms (15.00ms CPU time)\n\nRan 4 tests for test/DCAMainnetConfig.t.sol:DCAMainnetConfigTest\n[PASS] testFuzz_QuoteMatchesCoreAmountsAndAllocation(uint16,uint16,bool) (runs: 256, μ: 14509, ~: 14487)\n[PASS] test_ApprovedTermsAvailableBeforeDeploymentsWithoutPlaceholderAddresses() (gas: 1522623)\n[PASS] test_InvalidRangeTokenAndInactiveOneSidedRangeAreRejected() (gas: 1602480)\n[PASS] test_OpeningPricesAreCorrectIntegerSquareRootsForBothOrderings() (gas: 6076)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 72.20ms (73.09ms CPU time)\n\nRan 13 tests for test/PrepareLaunch.t.sol:PrepareLaunchTest\n[PASS] test_ExhaustedSearchLeavesLauncherUnconfigured() (gas: 79943)\n[PASS] test_PreparationDoesNotDependOnCallerAndSignedTokenOverridesStaleSetting() (gas: 6387978)\n[PASS] test_PreparationIsReadOnlyAndReturnsExecutableOwnerTransaction() (gas: 3924423)\n[PASS] test_PreparationRejectsActivatedLauncher() (gas: 3834869)\n[PASS] test_PreparationRejectsIncompatibleFwaAndRevokedDistributor() (gas: 219903)\n[PASS] test_PreparationRejectsInvalidPriceBounds() (gas: 80165)\n[PASS] test_PreparationRejectsMissingContracts() (gas: 158750)\n[PASS] test_PreparationRejectsNoncanonicalManager() (gas: 27905)\n[PASS] test_PreparationRejectsOccupiedHookAddress() (gas: 5053082)\n[PASS] test_PreparationRejectsWrongChain() (gas: 20407)\n[PASS] test_PreparationRejectsWrongOwnerIncludingFactory() (gas: 47624)\n[PASS] test_PreparationRejectsWrongTokenMetadataAndSupply() (gas: 185054)\n[PASS] test_PreparedActivationBuySellAndPayoutForBothTokenOrderings() (gas: 26980841)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 72.16ms (140.19ms CPU time)\n\nRan 12 tests for test/DCAHookEdges.t.sol:DCAHookEdgesFwa0Test\n[PASS] testFuzz_GrossFeeHasBoundedRemainderOverEntireUint256Domain(uint256) (runs: 1000, μ: 9822, ~: 9822)\n[PASS] testFuzz_NetInversionIsExactAndMinimalThroughSignedBoundary(uint256) (runs: 1000, μ: 29690, ~: 29471)\nLogs:\n  Bound result 12500517036405020599851916473752051052\n\n[PASS] testFuzz_SenderAndHookDataCannotChangeFixedBuyFee(address,bytes) (runs: 1000, μ: 38981, ~: 38979)\n[PASS] test_AfterSwapRejectsWrongFwaSignsForAllFourModes() (gas: 150159)\n[PASS] test_AllInvalidAmountEdgesRejectedByBothCallbacks() (gas: 850921)\n[PASS] test_BeforeSwapAcceptsSignedEdgesWithoutNarrowingOrPoolFeeOverride() (gas: 50529)\n[PASS] test_FailedSecondSwapRollsBackFirstSwapAndItsFees() (gas: 629832)\n[PASS] test_FeeRoundingPinnedBoundaries() (gas: 144932)\n[PASS] test_FwaClaimIgnoresUnrelatedCurrencyClaims() (gas: 357656)\n[PASS] test_InitializedTickCrossingChargesFwaAndPreservesPoolFees() (gas: 1679738)\n[PASS] test_LargestRepresentableNetAcceptedAndNextWeiRejected() (gas: 33983)\n[PASS] test_RemovingAllLiquidityCannotConsumeAccruedFees() (gas: 772986)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 104.43ms (126.30ms CPU time)\n\nRan 31 tests for test/DCAHook.t.sol:DCAHookFwaCurrency0Test\n[PASS] testFuzz_FeeConservationAcrossSwapModes(bool,bool,uint256) (runs: 256, μ: 523956, ~: 522663)\nLogs:\n  Bound result 999999999999999999999\n\n[PASS] testFuzz_RoundingInverseIsMinimalAndExactlyFivePercent(uint256) (runs: 256, μ: 13955, ~: 13675)\nLogs:\n  Bound result 1593676816714167684267755569096319\n\n[PASS] test_BatchedSwapsCollectOncePerSwapAndSettle() (gas: 357105)\n[PASS] test_BuyExactInputChargesFivePercentOfFwaPaidIn() (gas: 525615)\n[PASS] test_BuyExactOutputIncludesFeeInTotalFwaPaid() (gas: 523241)\n[PASS] test_CallbackFromManagerWithoutClaimReverts() (gas: 36787)\n[PASS] test_ClaimBeforeFeesIsNoop() (gas: 37441)\n[PASS] test_ClaimIncludesDonatedFwaClaims() (gas: 350562)\n[PASS] test_ClaimInsideAnExistingUnlockRevertsWithoutLosingFees() (gas: 355716)\n[PASS] test_ClaimsAboveSignedDeltaLimitRemainClaimableInChunks() (gas: 406364)\n[PASS] test_ClaimsCannotBeStolenByAnOperatorOrAllowance() (gas: 257083)\n[PASS] test_DirectCallbacksRequireManager() (gas: 101436)\n[PASS] test_DustBuyRoundsFeeDown() (gas: 346219)\n[PASS] test_FailedPayoutPreservesAllClaimsAndCanRetry() (gas: 460261)\n[PASS] test_FeeAndRecipientCannotBeChanged() (gas: 190882)\n[PASS] test_FwaMockRejectsOrdinaryTransferButClaimSucceeds() (gas: 367166)\n[PASS] test_InitializationCannotBeFrontRun() (gas: 49536)\n[PASS] test_LiquidityHasNoHookFeeAndCanBeRemoved() (gas: 152484)\n[PASS] test_PartialExactInputBuyRevertsAndRollsBack() (gas: 168085)\n[PASS] test_PartialExactInputSellOnlyTaxesActualFwaOutput() (gas: 209754)\n[PASS] test_PartialExactOutputBuyOnlyTaxesActualFwaInput() (gas: 202668)\n[PASS] test_PartialExactOutputSellRevertsAndRollsBack() (gas: 120268)\n[PASS] test_PayoutReentrancyCannotClaimTwice() (gas: 399313)\n[PASS] test_PermissionlessClaimPaysOnlyFixedRecipientAndRepeatIsNoop() (gas: 794281)\n[PASS] test_PermissionsMatchActualMinedAddress() (gas: 34997)\n[PASS] test_RejectsOtherFeeTickSpacingCurrencyAndHook() (gas: 189810)\n[PASS] test_RejectsZeroAndOutOfRangeAmounts() (gas: 115344)\n[PASS] test_SellExactInputChargesFivePercentOfGrossFwaOutput() (gas: 516260)\n[PASS] test_SellExactOutputReceivesRequestedNetFwa() (gas: 518293)\n[PASS] test_SingleSidedLaunchSeedsWithoutFwaAndFirstBuyCanFundItsFee() (gas: 1000416)\n[PASS] test_SwapCallbacksRejectDifferentPoolEvenFromManager() (gas: 57558)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 112.32ms (110.22ms CPU time)\n\nRan 12 tests for test/DCAHookEdges.t.sol:DCAHookEdgesFwa1Test\n[PASS] testFuzz_GrossFeeHasBoundedRemainderOverEntireUint256Domain(uint256) (runs: 1000, μ: 9822, ~: 9822)\n[PASS] testFuzz_NetInversionIsExactAndMinimalThroughSignedBoundary(uint256) (runs: 1000, μ: 29693, ~: 29471)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_SenderAndHookDataCannotChangeFixedBuyFee(address,bytes) (runs: 1000, μ: 38992, ~: 38990)\n[PASS] test_AfterSwapRejectsWrongFwaSignsForAllFourModes() (gas: 150283)\n[PASS] test_AllInvalidAmountEdgesRejectedByBothCallbacks() (gas: 850921)\n[PASS] test_BeforeSwapAcceptsSignedEdgesWithoutNarrowingOrPoolFeeOverride() (gas: 50529)\n[PASS] test_FailedSecondSwapRollsBackFirstSwapAndItsFees() (gas: 617091)\n[PASS] test_FeeRoundingPinnedBoundaries() (gas: 144932)\n[PASS] test_FwaClaimIgnoresUnrelatedCurrencyClaims() (gas: 357656)\n[PASS] test_InitializedTickCrossingChargesFwaAndPreservesPoolFees() (gas: 1676927)\n[PASS] test_LargestRepresentableNetAcceptedAndNextWeiRejected() (gas: 33983)\n[PASS] test_RemovingAllLiquidityCannotConsumeAccruedFees() (gas: 767261)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 116.96ms (82.08ms CPU time)\n\nRan 31 tests for test/DCAHook.t.sol:DCAHookFwaCurrency1Test\n[PASS] testFuzz_FeeConservationAcrossSwapModes(bool,bool,uint256) (runs: 256, μ: 524570, ~: 531236)\nLogs:\n  Bound result 999999999999999999999\n\n[PASS] testFuzz_RoundingInverseIsMinimalAndExactlyFivePercent(uint256) (runs: 256, μ: 13949, ~: 13675)\nLogs:\n  Bound result 1593676816714167684267755569096319\n\n[PASS] test_BatchedSwapsCollectOncePerSwapAndSettle() (gas: 351404)\n[PASS] test_BuyExactInputChargesFivePercentOfFwaPaidIn() (gas: 513073)\n[PASS] test_BuyExactOutputIncludesFeeInTotalFwaPaid() (gas: 513309)\n[PASS] test_CallbackFromManagerWithoutClaimReverts() (gas: 36787)\n[PASS] test_ClaimBeforeFeesIsNoop() (gas: 37441)\n[PASS] test_ClaimIncludesDonatedFwaClaims() (gas: 344260)\n[PASS] test_ClaimInsideAnExistingUnlockRevertsWithoutLosingFees() (gas: 349414)\n[PASS] test_ClaimsAboveSignedDeltaLimitRemainClaimableInChunks() (gas: 406364)\n[PASS] test_ClaimsCannotBeStolenByAnOperatorOrAllowance() (gas: 250781)\n[PASS] test_DirectCallbacksRequireManager() (gas: 101627)\n[PASS] test_DustBuyRoundsFeeDown() (gas: 339047)\n[PASS] test_FailedPayoutPreservesAllClaimsAndCanRetry() (gas: 453959)\n[PASS] test_FeeAndRecipientCannotBeChanged() (gas: 190882)\n[PASS] test_FwaMockRejectsOrdinaryTransferButClaimSucceeds() (gas: 360864)\n[PASS] test_InitializationCannotBeFrontRun() (gas: 49536)\n[PASS] test_LiquidityHasNoHookFeeAndCanBeRemoved() (gas: 152484)\n[PASS] test_PartialExactInputBuyRevertsAndRollsBack() (gas: 161949)\n[PASS] test_PartialExactInputSellOnlyTaxesActualFwaOutput() (gas: 215811)\n[PASS] test_PartialExactOutputBuyOnlyTaxesActualFwaInput() (gas: 196821)\n[PASS] test_PartialExactOutputSellRevertsAndRollsBack() (gas: 126282)\n[PASS] test_PayoutReentrancyCannotClaimTwice() (gas: 393011)\n[PASS] test_PermissionlessClaimPaysOnlyFixedRecipientAndRepeatIsNoop() (gas: 787987)\n[PASS] test_PermissionsMatchActualMinedAddress() (gas: 34997)\n[PASS] test_RejectsOtherFeeTickSpacingCurrencyAndHook() (gas: 189810)\n[PASS] test_RejectsZeroAndOutOfRangeAmounts() (gas: 115377)\n[PASS] test_SellExactInputChargesFivePercentOfGrossFwaOutput() (gas: 528990)\n[PASS] test_SellExactOutputReceivesRequestedNetFwa() (gas: 528413)\n[PASS] test_SingleSidedLaunchSeedsWithoutFwaAndFirstBuyCanFundItsFee() (gas: 988023)\n[PASS] test_SwapCallbacksRejectDifferentPoolEvenFromManager() (gas: 57749)\nSuite result: ok. 31 passed; 0 failed; 0 skipped; finished in 251.98ms (122.74ms CPU time)\n\nRan 5 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_InvalidConstructorArgumentsRevert() (gas: 5417)\n[PASS] test_NoExternalCallsEvenIfTokenIsNotYetDeployed() (gas: 4010203)\n[PASS] test_PreparationDeploysExactPredictedAddressOnEmptyChain() (gas: 101759257)\n[PASS] test_PreparationRejectsMissingAddressesAndExhaustedSearch() (gas: 1757298)\n[PASS] test_WrongHookAddressBitsAreRejected() (gas: 251808)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 317.84ms (159.03ms CPU time)\n\nRan 22 tests for test/DCAHookLauncher.t.sol:DCAHookLauncherTest\n[PASS] test_AtomicActivationCannotReplaceLaunchedHook() (gas: 1742503)\n[PASS] test_AtomicActivationCommitsToTokenDespiteEarlierConfiguration() (gas: 1678123)\n[PASS] test_AtomicActivationFailureRestoresPriorSettingAndCanRetry() (gas: 2934572)\n[PASS] test_AtomicActivationStartsUnconfiguredAndMintsNothing() (gas: 1741109)\n[PASS] test_AtomicActivationUnauthorizedOrMissingCodeLeavesTokenUnset() (gas: 112414)\n[PASS] test_ConstructorRejectsMissingOwnerOrManager() (gas: 64799)\n[PASS] test_ConstructorWorksOnEmptyChainWithExplicitOwner() (gas: 60230)\n[PASS] test_DeploymentAndInitializationAreAtomicAndLeaveExistingSupplyUntouched() (gas: 1821527)\n[PASS] test_ExhaustedPreparationDoesNotChangeConfiguration() (gas: 100018)\n[PASS] test_ExplicitTokenHashRejectsInvalidTokenWithoutChangingConfiguration() (gas: 51837)\n[PASS] test_FrontRunnerCannotUsePublishedSaltOrChooseOpeningPrice() (gas: 1741533)\n[PASS] test_InvalidPriceRollsBackChildAndPoolThenSameSaltCanRetry() (gas: 2941398)\n[PASS] test_InvalidSaltRevertsWithoutDisablingRetry() (gas: 1828597)\n[PASS] test_InvalidTokenConfigurationLeavesItUnset() (gas: 117980)\n[PASS] test_LaunchAndTokenConfigurationCannotRepeatAfterSuccess() (gas: 1763003)\n[PASS] test_MissingManagerFailsAtFirstUseWithoutDeployingChild() (gas: 124695)\n[PASS] test_MissingTokenFailsAtFirstUseAndConfigurationCanBeFixed() (gas: 1771137)\n[PASS] test_OnlyRequesterCanConfigureOrLaunchNotEvenDeployingFactory() (gas: 172721)\n[PASS] test_OrdinaryFactoryDeploysLauncherWithoutHookAddressConstraint() (gas: 50556)\n[PASS] test_PreexistingUnhookedPoolIsDistinctAndDoesNotGainAFee() (gas: 1777214)\n[PASS] test_TokenMayBeCorrectedBeforeLaunchAndNewHashIsUsed() (gas: 1765317)\n[PASS] test_UnconfiguredLauncherCannotPrepareOrLaunch() (gas: 84189)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 360.61ms (40.17ms CPU time)\n\nRan 23 tests for test/DCAMainnetLauncher.t.sol:MainnetDcaFirstTest\n[PASS] testFuzz_PartialWithdrawalsAndFeesConserveAllAssets(uint256) (runs: 256, μ: 6422701, ~: 6466827)\nLogs:\n  Bound result 2736221573313106231331301\n  Bound result 92841822720216787002\n  Bound result 27770817949709985935\n  Bound result 19608300550948297430124\n\n[PASS] test_BuySellHookPayoutAndLpFeesUseRestrictedFwaPaths() (gas: 4029094)\n[PASS] test_CallbackAuthenticationAndNoUnsolicitedUnlock() (gas: 1849933)\n[PASS] test_ClosestActiveRangeKeepsExactOpeningPriceWithSmallerFwaSeed() (gas: 6614627)\n[PASS] test_ConstructorNeedsNoExternalContractsAndFitsSizeLimit() (gas: 28762)\n[PASS] test_FailedLpFeePaymentRemainsRetryableAndReentryCannotCollectTwice() (gas: 4386423)\n[PASS] test_FailedLpPayoutDuringWithdrawalRestoresPrincipalAndPosition() (gas: 4325616)\n[PASS] test_FundingFailureRollsBackHookPoolAndEarlierDcaPaymentThenRetries() (gas: 3496301)\n[PASS] test_FwaBalanceShortfallRollsBackThenCanBeFunded() (gas: 3501891)\n[PASS] test_InsufficientDcaAllowanceFailsWithoutTakingAnyFwa() (gas: 1721312)\n[PASS] test_LaunchCannotRepeatOrChangeTokenAndRange() (gas: 1863495)\n[PASS] test_LegacyPathsCannotBypassEconomics() (gas: 136777)\n[PASS] test_MissingTokenManagerAndFwaFailClearlyAtExecution() (gas: 571430)\n[PASS] test_OnlyNamedOperatorCanConfigureLaunchOrWithdraw() (gas: 1889659)\n[PASS] test_PreflightReadOnlyCallerIndependentAndReportsFundingShortfall() (gas: 5856854)\n[PASS] test_PreflightRejectsOccupiedHookAndRepeatLaunch() (gas: 4625652)\n[PASS] test_PreflightRejectsWrongChainAbsentLauncherExpiredLimitAndExhaustedSearch() (gas: 229036)\n[PASS] test_PreparedLaunchSeeds88PercentAtApprovedPriceWithoutMinting() (gas: 2018516)\n[PASS] test_RangeMissingInvalidOrChangedRequiresExplicitConfiguration() (gas: 371007)\n[PASS] test_TokenAndFwaValidationRunAtExecutionAfterPreparation() (gas: 2040680)\n[PASS] test_WithdrawalReturnsPrincipalToOperatorAndSettlesRoundingClaims() (gas: 2058171)\n[PASS] test_WithdrawalSlippageDeadlineAndExcessAmountRollback() (gas: 2312533)\n[PASS] test_WrongChainDeadlineOrMaxFwaCannotOpenPool() (gas: 405537)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 360.86ms (427.33ms CPU time)\n\nRan 23 tests for test/DCAMainnetLauncher.t.sol:MainnetFwaFirstTest\n[PASS] testFuzz_PartialWithdrawalsAndFeesConserveAllAssets(uint256) (runs: 256, μ: 6428793, ~: 6467132)\nLogs:\n  Bound result 571508489980094933393198\n  Bound result 1347789475756493744594648\n  Bound result 1863085199159810440256906\n  Bound result 17075730755409059033\n\n[PASS] test_BuySellHookPayoutAndLpFeesUseRestrictedFwaPaths() (gas: 4029004)\n[PASS] test_CallbackAuthenticationAndNoUnsolicitedUnlock() (gas: 1849821)\n[PASS] test_ClosestActiveRangeKeepsExactOpeningPriceWithSmallerFwaSeed() (gas: 49189215)\n[PASS] test_ConstructorNeedsNoExternalContractsAndFitsSizeLimit() (gas: 28762)\n[PASS] test_FailedLpFeePaymentRemainsRetryableAndReentryCannotCollectTwice() (gas: 4386344)\n[PASS] test_FailedLpPayoutDuringWithdrawalRestoresPrincipalAndPosition() (gas: 4325531)\n[PASS] test_FundingFailureRollsBackHookPoolAndEarlierDcaPaymentThenRetries() (gas: 3496077)\n[PASS] test_FwaBalanceShortfallRollsBackThenCanBeFunded() (gas: 3501667)\n[PASS] test_InsufficientDcaAllowanceFailsWithoutTakingAnyFwa() (gas: 1721200)\n[PASS] test_LaunchCannotRepeatOrChangeTokenAndRange() (gas: 1863383)\n[PASS] test_LegacyPathsCannotBypassEconomics() (gas: 136777)\n[PASS] test_MissingTokenManagerAndFwaFailClearlyAtExecution() (gas: 571430)\n[PASS] test_OnlyNamedOperatorCanConfigureLaunchOrWithdraw() (gas: 1889547)\n[PASS] test_PreflightReadOnlyCallerIndependentAndReportsFundingShortfall() (gas: 91006077)\n[PASS] test_PreflightRejectsOccupiedHookAndRepeatLaunch() (gas: 47163553)\n[PASS] test_PreflightRejectsWrongChainAbsentLauncherExpiredLimitAndExhaustedSearch() (gas: 228688)\n[PASS] test_PreparedLaunchSeeds88PercentAtApprovedPriceWithoutMinting() (gas: 2018414)\n[PASS] test_RangeMissingInvalidOrChangedRequiresExplicitConfiguration() (gas: 370893)\n[PASS] test_TokenAndFwaValidationRunAtExecutionAfterPreparation() (gas: 2040588)\n[PASS] test_WithdrawalReturnsPrincipalToOperatorAndSettlesRoundingClaims() (gas: 2058064)\n[PASS] test_WithdrawalSlippageDeadlineAndExcessAmountRollback() (gas: 2312433)\n[PASS] test_WrongChainDeadlineOrMaxFwaCannotOpenPool() (gas: 405363)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 451.71ms (688.97ms CPU time)\n\nRan 1 test for test/DCAInvariant.t.sol:DCAInvariantFwa1Test\n[PASS]\nDCAInvariantFwa1Test invariants:\n[PASS] invariant_ConservationOfBothTokensAndFixedSupply\n[PASS] invariant_FeeClaimsPlusPayoutsEqualAllAccruedFees\n[PASS] invariant_TransientAccountingAlwaysSettled\n DCAInvariantFwa1Test invariants (runs: 128, calls: 4096, reverts: 0)\n\n╭------------+----------+-------+---------+----------╮\n| Contract   | Selector | Calls | Reverts | Discards |\n+====================================================+\n| FeeHandler | claim    | 2071  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| FeeHandler | swap     | 2025  | 0       | 0        |\n╰------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 255\n  Bound result 6560\n  Bound result 38005693715784294424\n  Bound result 77369977427245345661\n  Bound result 5412\n  Bound result 15425\n  Bound result 16912\n  Bound result 30000000000000000000\n  Bound result 3800000\n  Bound result 14130\n  Bound result 12178\n  Bound result 1900000\n  Bound result 86400\n  Bound result 60750757160721831892\n  Bound result 17440\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.06s (1.94s CPU time)\n\nRan 1 test for test/DCAInvariant.t.sol:DCAInvariantFwa0Test\n[PASS]\nDCAInvariantFwa0Test invariants:\n[PASS] invariant_ConservationOfBothTokensAndFixedSupply\n[PASS] invariant_FeeClaimsPlusPayoutsEqualAllAccruedFees\n[PASS] invariant_TransientAccountingAlwaysSettled\n DCAInvariantFwa0Test invariants (runs: 128, calls: 4096, reverts: 0)\n\n╭------------+----------+-------+---------+----------╮\n| Contract   | Selector | Calls | Reverts | Discards |\n+====================================================+\n| FeeHandler | claim    | 2071  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| FeeHandler | swap     | 2025  | 0       | 0        |\n╰------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 255\n  Bound result 11332\n  Bound result 38005693715784294424\n  Bound result 77369977427245345661\n  Bound result 5383\n  Bound result 16483\n  Bound result 17925\n  Bound result 30000000000000000000\n  Bound result 3800000\n  Bound result 15760\n  Bound result 13294\n  Bound result 1900000\n  Bound result 86400\n  Bound result 4437\n  Bound result 1550\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.18s (2.13s CPU time)\n\nRan 2 tests for test/DCATokenStateful.t.sol:DCATokenStatefulTest\n[PASS]\nDCATokenStatefulTest invariants:\n[PASS] invariant_AllowancesMatchApprovalsAndSuccessfulSpendsOnly\n[PASS] invariant_BalancesMatchIndependentLedgerAndEntireSupply\n DCATokenStatefulTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭------------------+----------------------+-------+---------+----------╮\n| Contract         | Selector             | Calls | Reverts | Discards |\n+======================================================================+\n| DCALedgerHandler | approve              | 2293  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | invalidReceiver      | 2357  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | overdraw             | 2348  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | overdrawWithApproval | 2414  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | overspendAllowance   | 2315  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | transfer             | 2351  | 0       | 0        |\n|------------------+----------------------+-------+---------+----------|\n| DCALedgerHandler | transferFrom         | 2306  | 0       | 0        |\n╰------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 206058829802589768870334047\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 478957328088269597967019893\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 788221378978\n  Bound result 1000000000000000000000000000\n  Bound result 922907282510174407288009667\n  Bound result 130713751354673968124122245\n  Bound result 880000000000000000000000000\n  Bound result 121897369935459971859686072\n  Bound result 1475\n  Bound result 297531729124343701223142882\n  Bound result 6789\n  Bound result 0\n  Bound result 21\n  Bound result 6908\n  Bound result 0\n  Bound result 223\n  Bound result 0\n  Bound result 70000000000000000000\n  Bound result 56\n  Bound result 788221378955\n  Bound result 4597\n  Bound result 0\n  Bound result 0\n  Bound result 922330667227485252525900207\n  Bound result 307\n  Bound result 6115\n  Bound result 1\n  Bound result 0\n  Bound result 7\n  Bound result 0\n  Bound result 315\n  Bound result 1\n\n[PASS] test_LedgerExercisesFullSupplySelfTransfersAndFailureRecovery() (gas: 1385456)\nLogs:\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 1000000000000000000000000000\n  Bound result 1\n  Bound result 1\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1000000000000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.22s (7.22s CPU time)\n\nRan 2 tests for test/DCAHookStateful.t.sol:DCAHookStatefulFwa0Test\n[PASS]\nDCAHookStatefulFwa0Test invariants:\n[PASS] invariant_AllAccruedFwaRemainsBackedAndBelongsOnlyToRecipient\n[PASS] invariant_BothTokensConservedAcrossAllActors\n[PASS] invariant_ManagerIsLockedWithoutUnsettledDebts\n[PASS] invariant_PriceLiquidityAndMandatoryPoolFeesMatchControl\n DCAHookStatefulFwa0Test invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+---------------------+-------+---------+----------╮\n| Contract             | Selector            | Calls | Reverts | Discards |\n+=========================================================================+\n| DCAAccountingHandler | changeLiquidity     | 2024  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | claim               | 2056  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | donate              | 1978  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | dustSwap            | 2105  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | rejectedPartialFill | 2031  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | rejectedPayout      | 2081  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | roundTrip           | 2052  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | swap                | 2057  | 0       | 0        |\n╰----------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1500000000000000000009115\n  Bound result 1\n  Bound result 4596266340239397448774\n  Bound result 999999999999999999006\n  Bound result 40\n  Bound result 1500000000000000000000020\n  Bound result 62977905276737143993\n  Bound result 30000000000000000000\n  Bound result 37\n  Bound result 40\n  Bound result 19980000\n  Bound result 2818\n  Bound result 14621\n  Bound result 287\n  Bound result 39\n  Bound result 99999999999999999999\n  Bound result 12\n  Bound result 20\n  Bound result 1500000000000000000000021\n  Bound result 1500000000000000000012314\n  Bound result 97013443684179617978\n  Bound result 1\n  Bound result 1500000000000003196814599\n  Bound result 1691142285914205922031962\n  Bound result 999999999999999999160\n  Bound result 1775725192008748565\n  Bound result 1600000000000000000000001\n  Bound result 10\n  Bound result 1500000000000000000062160\n  Bound result 7389\n  Bound result 1500000000000000000000009\n  Bound result 999999999999999999006\n  Bound result 1500000000000000000001001\n  Bound result 999999999999999999201\n  Bound result 42957102961017161607\n  Bound result 7\n  Bound result 142285914209461682132\n  Bound result 60\n  Bound result 999999999999999999008\n  Bound result 1500000000000000000001071\n  Bound result 1500000000000000000002494\n  Bound result 9727372892876203821266\n  Bound result 1500000000000000000000101\n  Bound result 10000000000000000000000\n\n[PASS] test_AllHandlerPathsAndSwapModesReachMeaningfulStates() (gas: 3256609)\nLogs:\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 1\n  Bound result 17000000000000000000\n  Bound result 500000000000000000000000\n  Bound result 100000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 15.77s (15.74s CPU time)\n\nRan 2 tests for test/DCAHookStateful.t.sol:DCAHookStatefulFwa1Test\n[PASS]\nDCAHookStatefulFwa1Test invariants:\n[PASS] invariant_AllAccruedFwaRemainsBackedAndBelongsOnlyToRecipient\n[PASS] invariant_BothTokensConservedAcrossAllActors\n[PASS] invariant_ManagerIsLockedWithoutUnsettledDebts\n[PASS] invariant_PriceLiquidityAndMandatoryPoolFeesMatchControl\n DCAHookStatefulFwa1Test invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭----------------------+---------------------+-------+---------+----------╮\n| Contract             | Selector            | Calls | Reverts | Discards |\n+=========================================================================+\n| DCAAccountingHandler | changeLiquidity     | 2024  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | claim               | 2056  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | donate              | 1978  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | dustSwap            | 2105  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | rejectedPartialFill | 2031  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | rejectedPayout      | 2081  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | roundTrip           | 2052  | 0       | 0        |\n|----------------------+---------------------+-------+---------+----------|\n| DCAAccountingHandler | swap                | 2057  | 0       | 0        |\n╰----------------------+---------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1500000000000000000013792\n  Bound result 1\n  Bound result 4596266340239397448774\n  Bound result 999999999999999999006\n  Bound result 40\n  Bound result 1500000000000000000000020\n  Bound result 62977905276737143993\n  Bound result 30000000000000000000\n  Bound result 37\n  Bound result 40\n  Bound result 19980000\n  Bound result 600\n  Bound result 13548\n  Bound result 319\n  Bound result 39\n  Bound result 3549\n  Bound result 25\n  Bound result 30\n  Bound result 1500000000000000000000021\n  Bound result 1709876281281145568259863\n  Bound result 97013443684179617978\n  Bound result 1\n  Bound result 1500000000000000115788164\n  Bound result 1691142285914205922031962\n  Bound result 999999999999999999160\n  Bound result 1775725192008748565\n  Bound result 1600000000000000000000001\n  Bound result 38\n  Bound result 1500000000000000000062160\n  Bound result 5958\n  Bound result 1500000000000000000000009\n  Bound result 999999999999999999006\n  Bound result 1500000000000000000001001\n  Bound result 999999999999999999201\n  Bound result 42957102961017161607\n  Bound result 7\n  Bound result 142285914209461682132\n  Bound result 60\n  Bound result 999999999999999999008\n  Bound result 1500000000000000000002423\n  Bound result 1500000000000000000001251\n  Bound result 9727372892876203821266\n  Bound result 1500000000000000000000101\n  Bound result 10000000000000000000000\n\n[PASS] test_AllHandlerPathsAndSwapModesReachMeaningfulStates() (gas: 3249635)\nLogs:\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 10000000000000000000000\n  Bound result 1\n  Bound result 17000000000000000000\n  Bound result 500000000000000000000000\n  Bound result 100000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 16.86s (16.74s CPU time)\n\nRan 17 test suites in 16.86s (46.33s CPU time): 196 tests passed, 0 failed, 0 skipped (196 total tests)\n","passed":true},{"durationMs":300,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DCAHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"DCAHook.claimFees()\",\"DCAHook.unlockCallback(bytes)\",\"DCAHookLauncher.launch(bytes32,uint160)\",\"DCAHookLauncher.launchWithToken(address,bytes32,uint160)\",\"DCAHookLauncher.setToken(address)\",\"DCAMainnetLauncher.collectLPFees()\",\"DCAMainnetLauncher.launchMainnet(address,bytes32,int24,int24,uint256,uint256)\",\"DCAMainnetLauncher.setLiquidityRange(int24,int24)\",\"DCAMainnetLauncher.setToken(address)\",\"DCAMainnetLauncher.unlockCallback(bytes)\",\"DCAMainnetLauncher.withdrawLiquidity(uint128,uint256,uint256,uint256)\",\"DCAToken.approve(address,uint256)\",\"DCAToken.transfer(address,uint256)\",\"DCAToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.json\":130,\"README.md\":109,\"SECURITY.md\":85,\"docs/MAINNET.md\":101,\"foundry.toml\":19,\"remappings.txt\":4,\"script/PrepareHook.s.sol\":31,\"script/PrepareLaunch.s.sol\":107,\"script/PrepareMainnet.s.sol\":124,\"src/DCAHook.sol\":208,\"src/DCAHookLauncher.sol\":124,\"src/DCAMainnetConfig.sol\":71,\"src/DCAMainnetLauncher.sol\":218,\"src/DCAToken.sol\":14,\"src/HookMiner.sol\":21,\"test/ADVERSARIAL_TESTS.md\":44,\"test/DCAHook.t.sol\":391,\"test/DCAHookEdges.t.sol\":225,\"test/DCAHookLauncher.t.sol\":367,\"test/DCAHookStateful.t.sol\":317,\"test/DCAInvariant.t.sol\":113,\"test/DCAMainnetConfig.t.sol\":81,\"test/DCAMainnetLauncher.t.sol\":544,\"test/DCAToken.t.sol\":126,\"test/DCATokenEdges.t.sol\":110,\"test/DCATokenStateful.t.sol\":172,\"test/Deployment.t.sol\":98,\"test/PrepareLaunch.t.sol\":282,\"test/helpers/HookTestBase.sol\":103,\"test/helpers/PoolRouter.sol\":112,\"test/helpers/RestrictedFWA.sol\":50},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":4262,"exitCode":0,"name":"slither","output":"[high/high] arbitrary-send-erc20 at src/DCAMainnetLauncher.sol:199: DCAMainnetLauncher._pay(address,uint256) (src/DCAMainnetLauncher.sol#199-204) uses arbitrary from in transferFrom: IERC20(currency).safeTransferFrom(owner,address(poolManager),amount) (src/DCAMainnetLauncher.sol#202)\n[medium/medium] unused-return at src/DCAHook.sol:176: DCAHook.claimFees() (src/DCAHook.sol#176-183) ignores return value by poolManager.unlock() (src/DCAHook.sol#182)\n[medium/medium] unused-return at src/DCAMainnetLauncher.sol:112: DCAMainnetLauncher.validateTokens(address) (src/DCAMainnetLauncher.sol#112-128) ignores return value by DCAMainnetConfig.openingPrice(token_) (src/DCAMainnetLauncher.sol#116)\n[medium/medium] unused-return at src/DCAMainnetLauncher.sol:88: DCAMainnetLauncher.launchMainnet(address,bytes32,int24,int24,uint256,uint256) (src/DCAMainnetLauncher.sol#88-109) ignores return value by poolManager.unlock(abi.encode(q)) (src/DCAMainnetLauncher.sol#107)\n[medium/medium] unused-return at src/DCAMainnetLauncher.sol:157: DCAMainnetLauncher.unlockCallback(bytes) (src/DCAMainnetLauncher.sol#157-197) ignores return value by (delta,None) = poolManager.modifyLiquidity(key,ModifyLiquidityParams(tickLower,tickUpper,int256(uint256(q.liquidity)),bytes32(0)),) (src/DCAMainnetLauncher.sol#165-167)\n[medium/medium] unused-return at src/DCAHookLauncher.sol:104: DCAHookLauncher._launch(bytes32,uint160) (src/DCAHookLauncher.sol#104-116) ignores return value by poolManager.initialize(deployed.getPoolKey(),sqrtPriceX96) (src/DCAHookLauncher.sol#114)\n[low/medium] reentrancy-benign at src/DCAMainnetLauncher.sol:157: Reentrancy in DCAMainnetLauncher.unlockCallback(bytes) (src/DCAMainnetLauncher.sol#157-197):\n[low/medium] reentrancy-benign at src/DCAMainnetLauncher.sol:88: Reentrancy in DCAMainnetLauncher.launchMainnet(address,bytes32,int24,int24,uint256,uint256) (src/DCAMainnetLauncher.sol#88-109):\n[low/medium] reentrancy-events at src/DCAHookLauncher.sol:104: Reentrancy in DCAHookLauncher._launch(bytes32,uint160) (src/DCAHookLauncher.sol#104-116):\n[low/medium] reentrancy-events at src/DCAMainnetLauncher.sol:157: Reentrancy in DCAMainnetLauncher.unlockCallback(bytes) (src/DCAMainnetLauncher.sol#157-197):\n[low/medium] timestamp at src/DCAMainnetLauncher.sol:215: DCAMainnetLauncher._checkDeadline(uint256) (src/DCAMainnetLauncher.sol#215-217) uses timestamp for comparisons","passed":false}],"detail":"static analysis found arbitrary-send-erc20 at src/DCAMainnetLauncher.sol:199: DCAMainnetLauncher._pay(address,uint256) (src/DCAMainnetLauncher.sol#199-204) uses arbitrary from in transferFrom: IERC20(currency).safeTransferFrom(owner,address(poolManager),amount) (src/DCAMainnetLauncher.sol#202)","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"409a9d5fbd84e7ccd6d747f7c9b8e56075c90d734a7d6fdc84410c2805ea32c0","verifiedTreeHash":"a47b1d24a26a316ff5e1674e0a898851e3ea9a99","verifierVersion":"0.1.0+788bb33f"}]}