{"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":"cf0ac7ec-f796-4071-aa1c-fdc2a8f3fa33","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","write_foundry_tests","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"587567a5ef71546b5973ceaf6ef1dbbd590f49503b5ac9a6973ed86b89584857","skillId":"build-contract-project","state":"failed"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","write_foundry_tests"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"waiting"}],"objective":"[SIMD-LAUNCH]\nToken name: SIMDTEST\nToken symbol: SIMDTEST\n\nCONTRACT: SIMDTESTHook (the launch pool's hook)\n\n1. Immutable parameters:\n   - Swap fee fixed at 1.25% (12500 bps) by the pool.\n   - Hook fee fixed at 1% (100 bps) charged on the launched token side only, calculated on the actual amount filled in each swap.\n   - executeBatch() callable by anyone once every 3600 seconds.\n   - executeBatch() swaps up to 25% of accrued paired currency balance.\n   - SqrtPriceLimit in executeBatch() is set exactly 300 bps beyond a time-weighted reference price (referencePrice()), to prevent deadlocks and limit slippage.\n\n2. Swap mechanics:\n   - The hook applies its 1% fee on launched token amount transferred from the PoolManager (buys).\n   - Fees in launched tokens are sent to the dead address (0x000000000000000000000000000000000000dEaD) via sweep(), effectively burning them.\n   - Paired currency fee accruals accumulate inside the hook contract; no spending occurs inside swap callbacks; usage only via executeBatch().\n\n3. Buyback & Burn:\n   - executeBatch() swaps accrued paired currency for SIMDTEST tokens via the PoolManager, accepting partial fills.\n   - Bought back tokens are sent directly to the dead address, burning them.\n   - Unused accrued paired currency remains in the hook for future batches to avoid batch deadlock.\n\n4. Views for frontend:\n   - pending(): returns current accrued paired currency balance pending for buybacks.\n   - lastBatch(): timestamp of the last buyback batch executed.\n   - referencePrice(): current time-weighted reference sqrtPriceX96 used for executeBatch slippage limit.\n\nTOKEN:\n- SIMDTEST is a standard ERC-20 token minted with 1,000,000,000 supply and 18 decimals; no transfer taxes or special logic.\n- 10% of total supply allocated externally to the swarm; 90% seeded to the pool.\n\nTESTS AND REVIEW:\n1. Validate correct minting and distribution: 10% swarm external, 90% pool seed.\n2. Test swap paths with 1.25% pool fee plus 1% hook fee on buys, check fee accrual and burning.\n3. Check that fees correctly accrue in paired currency and launched token, and that token fees only apply on transfers from PoolManager.\n4. Simulate executeBatch() calls at intervals ≥ 3600s, validate correct partial fills, price limits, and burning of bought-back tokens.\n5. Test multiple consecutive swaps and batch executions for fee consistency and contract balance correctness.\n6. Confirm no mutable parameters or owner/admin powers.\n7. Adversarial review focusing on fee application, price slippage logic, partial fills, and race conditions in batch execution.\n\nThis launch satisfies all SIMD Launchpad rules with fixed parameters, no ownership, and a robust buyback mechanism integrated via a Uniswap v4 hook.\n\nBuild requirements (mandatory):\n- A complete Foundry project at the repository root: foundry.toml with solc 0.8.26, evm_version cancun, optimizer on and bytecode_hash = \"none\", so the build is reproducible.\n- Contracts: SIMDTESTHook. The hook is the hook of this launch's pool; keep its creation code within the EIP-3860 size limit.\n- No selfdestruct and no delegatecall anywhere in runtime code. No proxies, no owner, no upgradeability.\n- Chain: Ethereum mainnet (chainId 1). Uniswap v4 PoolManager: 0x000000000004444c5dc75cB358380D2e3dE08A90 (pass it to the hook constructor).\n- Paired currency: IMD, the ERC-20 at 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 on Ethereum mainnet (18 decimals).\n- Every address the hook needs is known now and fixed at deployment; nothing may require an owner or a setter after launch.\n- Supply distribution is done by the launch factory: it mints the supply, seeds the pool, sends the swarm's 10% through its Merkle distributor and any remainder to remainderTo. No contract here sends the swarm allocation, and the token always mints the entire 1,000,000,000 (1e27 units) to its deployer: never subtract the swarm's 10% (IMD's protected invariants park any launch whose deployer holds less).\n- Hook fees are collected through beforeSwap/afterSwap return deltas, on top of the pool's static 1.25% LP fee (fee tier 12500). Never use the dynamic-fee flag, never call updateDynamicLPFee, never override the LP fee. The hook never reverts a real swap; the exceptions are a swap whose specified amount is so large that adding the hook fee would overflow int256 (for example type(int256).max requests): it may revert with UnrepresentableFee. That is the accepted swap domain.\n- The hook is a plain immutable contract deployed directly at a CREATE2-mined address with the right permission bits, and launch.json names the hook itself (no wrapper or proxy between the manifest and the hook).\n- Tests: Foundry unit, fuzz and mainnet-fork tests that swap through the real PoolManager with the hook (exact-input and exact-output, buys and sells), plus permission bits matching the hook address.\n- Every hook fee is proportional to what actually filled. Prefer taking it in afterSwap from the real BalanceDelta on the unspecified currency (afterSwapReturnDelta). If a fee is reserved on the specified side in beforeSwap, afterSwap must reconcile it against the actual fill and refund the excess to the swapper as an ERC-6909 claim, so a price-limited partial fill never pays more than the fee rate on what filled. Test exact-input and exact-output partial fills with a price limit.\n- launch.json pool: pairedCurrency 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, fee 12500, tickSpacing 60, initialPrice \"79228162514264337593543950336\" (provenance only; the launch factory sets the opening price from the economics).","parentJobId":null,"planHash":"2976917bcfdd105af6f757504596ce0fbdaf6247087c792d05abd4cb8b3e56a5","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"cf0ac7ec-f796-4071-aa1c-fdc2a8f3fa33","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1014-simdtest"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51086","feedbackHash":"d76fb33081e4d74cd0676a2ee6f2818d99dd753780e54f010f2e74e228fb10f7","nodeKey":"build_contract_project","submissionHash":"f8620c72514bc1a7cd35bf02c3f17a5654eee6a95250b2f0d6e092d3e942f34a","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"875ae3570112467368673688573299bf6f5b3957573607cb76de04627a88ac3b","state":"blocked","submissions":[{"artifacts":[],"attempt":2,"bundleHash":null,"device":"468e1f512c9ac6ca","findings":[],"hash":"e8c9e3e72cee6df89dbee35407ce1e98d6e5d5ed088db3d546c1a6e5ab88784e","nodeId":"7a622eed-069d-4891-b0a0-97ea70ea394a","outcome":"failed","summary":"needs input: The source of IMD for buybacks is unspecified. The brief requires the hook fee to be charged only on SIMDTEST received on buys and all collected SIMDTEST to be burned, but also requires paired-currency fee accruals. Those token-only fees cannot generate IMD without changing the specified economics. — Should buybacks use only externally supplied IMD while keeping the SIMDTEST-only buy fee, or should the hook also charge a 1% fee on actual IMD output from sells to fund buybacks?","treeHash":null,"usage":{"cachedInputTokens":197120,"inputTokens":63167,"model":"gpt-6-astra","outputTokens":2223,"runtime":"codex","turns":3,"wallClockMs":113040}},{"artifacts":[],"attempt":1,"bundleHash":"7082523e83a2403b435218a3ec3ee32336b49683b6b51a524b18b8771474786a","device":"080780b6898c2241","findings":[],"hash":"f8620c72514bc1a7cd35bf02c3f17a5654eee6a95250b2f0d6e092d3e942f34a","nodeId":"7a622eed-069d-4891-b0a0-97ea70ea394a","outcome":"completed","summary":"Implemented the Foundry project with token, immutable hook, launch manifest, vendored dependencies, tests, and deployment/security documentation.\n\nValidation: **54 tests passed**, offline build passed, and formatting passed. Mainnet fork execution remains unverified because RPC requests timed out.\n\nBuybacks require external IMD funding under the token-only fee interpretation. Exact-output routers must redeem refund claims; both requirements are documented in `README.md`.","treeHash":"e8a8bdd825e95a9a1906205e2acf1ac40d04288b","usage":{"cachedInputTokens":2146688,"inputTokens":110503,"model":"gpt-6-astra","outputTokens":33755,"runtime":"codex","turns":7,"wallClockMs":731363}}],"verification":[{"checks":[{"durationMs":2670,"exitCode":0,"name":"build","output":"Compiling 89 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.55s\nCompiler run successful!\nwarning[missing-events-arithmetic]: `initializedAt` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:108:9\n    │\n108 │         initializedAt = block.timestamp;\n    │         ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `next` is changed without an event but is used in arithmetic\n   ╭▸ src/SqrtPriceOracle.sol:36:9\n   │\n36 │         next = (next + 1) % CAPACITY;\n   │         ━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `count` is changed without an event but is used in arithmetic\n   ╭▸ src/SqrtPriceOracle.sol:37:33\n   │\n37 │         if (count < CAPACITY) ++count;\n   │                                 ━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/SIMDTESTHook.sol:60:40\n   │\n60 │     constructor(IPoolManager manager_, address token_) {\n   │                                        ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SqrtPriceOracle.sol:21:28\n   │\n21 │         uint64 timestamp = uint64(block.timestamp);\n   │                            ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n   ╭▸ src/SqrtPriceOracle.sol:52:16\n   │\n52 │         while (low < high) {\n   │                ━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SqrtPriceOracle.sol:45:26\n   │\n45 │         uint256 target = block.timestamp > REFERENCE_WINDOW ? block.timestamp - REFERENCE_WINDOW : 0;\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SqrtPriceOracle.sol:46:13\n   │\n46 │         if (target < observations[oldest].timestamp) target = observations[oldest].timestamp;\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SqrtPriceOracle.sol:47:13\n   │\n47 │         if (target == block.timestamp) return latest.price;\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/SqrtPriceOracle.sol:54:17\n   │\n54 │             if (observations[(oldest + middle) % CAPACITY].timestamp <= target) low = middle + 1;\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SIMDTESTHook.sol:122:77\n    │\n122 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(reserved)), 0), 0);\n    │                                                                             ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SqrtPriceOracle.sol:59:16\n   │\n59 │         return uint160((end - startCumulative) / (block.timestamp - target));\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint160' 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/SIMDTESTHook.sol:122:63\n    │\n122 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(reserved)), 0), 0);\n    │                                                               ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:122:70\n    │\n122 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(reserved)), 0), 0);\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[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SIMDTESTHook.sol:144:45\n    │\n144 │         emit FeeAccrued(sender, gross, fee, refund);\n    │                                             ━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTHook.sol:144:9\n    │\n144 │         emit FeeAccrued(sender, gross, fee, refund);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:135:42\n    │\n135 │         uint256 gross = tokenDelta > 0 ? uint256(uint128(tokenDelta)) : 0;\n    │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:135:50\n    │\n135 │         uint256 gross = tokenDelta > 0 ? uint256(uint128(tokenDelta)) : 0;\n    │                                                  ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:145:73\n    │\n145 │         return (IHooks.afterSwap.selector, params.amountSpecified < 0 ? int128(int256(fee)) : int128(0));\n    │                                                                         ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:145:80\n    │\n145 │         return (IHooks.afterSwap.selector, params.amountSpecified < 0 ? int128(int256(fee)) : int128(0));\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/SIMDTESTHook.sol:155:29\n    │\n155 │         uint256 requested = uint256(amount);\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/SIMDTESTHook.sol:157:30\n    │\n157 │         uint256 maximumFee = uint256(uint128(type(int128).max)) / 100;\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/SIMDTESTHook.sol:157:38\n    │\n157 │         uint256 maximumFee = uint256(uint128(type(int128).max)) / 100;\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/SIMDTESTHook.sol:159:25\n    │\n159 │         if (requested > uint256(type(int256).max) - reserve) revert UnrepresentableFee();\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 `operation` is updated\n    ╭▸ src/SIMDTESTHook.sol:174:29\n    │\n174 │         burned = abi.decode(poolManager.unlock(\"\"), (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/SIMDTESTHook.sol:176:9\n    │\n176 │         emit Swept(burned);\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `lastBatch` is updated\n    ╭▸ src/SIMDTESTHook.sol:203:24\n    │\n203 │             abi.decode(poolManager.unlock(abi.encode(budget, uint160(limit))), (uint256, uint256));\n    │                        ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SIMDTESTHook.sol:184:13\n    │\n184 │         if (block.timestamp - anchor < BATCH_INTERVAL) revert TooSoon();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTHook.sol:206:9\n    │\n206 │         emit BatchExecuted(spent, burned, referenceSqrt, uint160(limit));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:188:29\n    │\n188 │         uint256 maxBudget = 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/SIMDTESTHook.sol:188:37\n    │\n188 │         uint256 maxBudget = 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/SIMDTESTHook.sol:203:62\n    │\n203 │             abi.decode(poolManager.unlock(abi.encode(budget, uint160(limit))), (uint256, uint256));\n    │                                                              ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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/SIMDTESTHook.sol:206:58\n    │\n206 │         emit BatchExecuted(spent, burned, referenceSqrt, uint160(limit));\n    │                                                          ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' 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/SIMDTESTHook.sol:223:72\n    │\n223 │             poolManager.swap(poolKey(), SwapParams(!tokenIsCurrency0, -int256(budget), limit), \"\");\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/SIMDTESTHook.sol:226:25\n    │\n226 │         uint256 spent = uint256(-int256(pairedDelta));\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/SIMDTESTHook.sol:227:26\n    │\n227 │         uint256 burned = uint256(int256(tokenDelta));\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[unused-return]: return value of an external call is not used\n    ╭▸ src/SIMDTESTHook.sol:232:13\n    │\n232 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Hook.t.sol:147:17\n    │\n147 │         vm.warp(block.timestamp + 3600);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Hook.t.sol:231:17\n    │\n231 │         vm.warp(block.timestamp + 3600);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Hook.t.sol:249:17\n    │\n249 │         vm.warp(block.timestamp + 3600);\n    │         ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/Hook.t.sol:273:25\n    │\n273 │         uint256 start = block.timestamp;\n    │                         ━━━━━━━━━━━━━━━\n274 │         vm.warp(start + 1800);\n    │         ───────────────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Sequence.t.sol:68:25\n   │\n68 │                 vm.warp(block.timestamp + 3600);\n   │                 ────────━━━━━━━━━━━━━━━──────── `vm.warp` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockTimestamp()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":564,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/MainnetFork.t.sol:MainnetForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 312.84µs (0.00ns CPU time)\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_transfersHaveNoTax(uint256) (runs: 1000, μ: 91358, ~: 91408)\nLogs:\n  Bound result 1571\n\n[PASS] test_allSupplyToFactoryAndExternalDistribution() (gas: 196972)\n[PASS] test_noMintOrAdminEvenForDeployer() (gas: 126757)\n[PASS] test_transferFailureAndAllowance() (gas: 207578)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 13.04ms (13.56ms CPU time)\n\nRan 22 tests for test/Hook.t.sol:HookToken0Test\n[PASS] testFuzz_feesTrackActualFill(bool,bool,uint128,uint16) (runs: 1000, μ: 264461, ~: 244197)\nLogs:\n  Bound result 128\n  Bound result 60\n\n[PASS] test_batchCooldownAndQuarterCap() (gas: 467998)\n[PASS] test_batchPartialFillExactLimitAndRetry() (gas: 567114)\n[PASS] test_buyExactInputBurnAndLpFee() (gas: 463729)\n[PASS] test_buyExactOutput() (gas: 285619)\n[PASS] test_callbackAuthorization() (gas: 140845)\n[PASS] test_directTransferAndLpWithdrawalUntaxed() (gas: 238150)\n[PASS] test_emptyAndDustBatchDoNotConsumeCooldown() (gas: 147830)\n[PASS] test_hugePartialExactInput() (gas: 314074)\n[PASS] test_hugePartialOutputDoesNotOverflowReservation() (gas: 381623)\n[PASS] test_nearInt256MaxPartialOutput() (gas: 381653)\n[PASS] test_noAdminEntrypoints() (gas: 143590)\n[PASS] test_oracleTimeWeightAndSameBlockResistance() (gas: 609402)\n[PASS] test_outsideBoundNoDeadlockAndNoCooldownGrief() (gas: 659343)\n[PASS] test_partialExactInput() (gas: 314108)\n[PASS] test_partialExactOutputRefund() (gas: 381356)\n[PASS] test_permissionsInitializationAndSizes() (gas: 80940)\n[PASS] test_refuseOtherPool() (gas: 78805)\n[PASS] test_runtimeHasNoEscapeOpcodes() (gas: 3833905)\n[PASS] test_sellsExactInputAndOutputHaveNoHookFee() (gas: 400153)\n[PASS] test_unrepresentableFeeHasExplicitError() (gas: 108314)\n[PASS] test_zeroFillRefundsEntireReservationAndBatchCanRetry() (gas: 1099861)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 95.68ms (82.21ms CPU time)\n\nRan 22 tests for test/Hook.t.sol:HookToken1Test\n[PASS] testFuzz_feesTrackActualFill(bool,bool,uint128,uint16) (runs: 1000, μ: 264474, ~: 238185)\nLogs:\n  Bound result 128\n  Bound result 60\n\n[PASS] test_batchCooldownAndQuarterCap() (gas: 474535)\n[PASS] test_batchPartialFillExactLimitAndRetry() (gas: 573958)\n[PASS] test_buyExactInputBurnAndLpFee() (gas: 470056)\n[PASS] test_buyExactOutput() (gas: 290692)\n[PASS] test_callbackAuthorization() (gas: 140845)\n[PASS] test_directTransferAndLpWithdrawalUntaxed() (gas: 238150)\n[PASS] test_emptyAndDustBatchDoNotConsumeCooldown() (gas: 147830)\n[PASS] test_hugePartialExactInput() (gas: 320428)\n[PASS] test_hugePartialOutputDoesNotOverflowReservation() (gas: 387476)\n[PASS] test_nearInt256MaxPartialOutput() (gas: 387506)\n[PASS] test_noAdminEntrypoints() (gas: 143590)\n[PASS] test_oracleTimeWeightAndSameBlockResistance() (gas: 615387)\n[PASS] test_outsideBoundNoDeadlockAndNoCooldownGrief() (gas: 666692)\n[PASS] test_partialExactInput() (gas: 320163)\n[PASS] test_partialExactOutputRefund() (gas: 387209)\n[PASS] test_permissionsInitializationAndSizes() (gas: 80940)\n[PASS] test_refuseOtherPool() (gas: 78805)\n[PASS] test_runtimeHasNoEscapeOpcodes() (gas: 3833905)\n[PASS] test_sellsExactInputAndOutputHaveNoHookFee() (gas: 394670)\n[PASS] test_unrepresentableFeeHasExplicitError() (gas: 108337)\n[PASS] test_zeroFillRefundsEntireReservationAndBatchCanRetry() (gas: 1106158)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 96.70ms (75.85ms CPU time)\n\nRan 3 tests for test/Oracle.t.sol:OracleTest\n[PASS] testFuzz_sparseHistoryInterpolates(uint160,uint160,uint16) (runs: 1000, μ: 238728, ~: 238607)\nLogs:\n  Bound result 1461501637330902918203684832716283019655932542975\n  Bound result 1461501637330902918203684832716283019655932542975\n  Bound result 2\n\n[PASS] test_noHistoryAndWarmupAndSameTimestamp() (gas: 288609)\n[PASS] test_ringWrapRetainsExactlyOneHour() (gas: 318867627)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 480.25ms (366.30ms CPU time)\n\nRan 3 tests for test/Sequence.t.sol:SequenceTest\n[PASS] testFuzz_sequenceConservesBothCurrencies(bytes32) (runs: 1000, μ: 6009278, ~: 6046887)\n[PASS] test_failedSettlementRollsBackBudgetAndCooldown() (gas: 1569202)\n[PASS] test_pairCannotReenterBatchOrSweepDuringSettlement() (gas: 1086272)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 481.85ms (455.89ms CPU time)\n\nRan 6 test suites in 482.66ms (1.17s CPU time): 54 tests passed, 0 failed, 1 skipped (55 total tests)\n","passed":true},{"durationMs":54,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SIMDTEST.approve(address,uint256)\",\"SIMDTEST.transfer(address,uint256)\",\"SIMDTEST.transferFrom(address,address,uint256)\",\"SIMDTESTHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"SIMDTESTHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"SIMDTESTHook.executeBatch()\",\"SIMDTESTHook.sweep()\",\"SIMDTESTHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":3,\"LICENSE\":23,\"README.md\":59,\"dependencies.json\":110,\"docs/SECURITY_REVIEW.md\":30,\"docs/VALIDATION.md\":30,\"foundry.toml\":17,\"launch.json\":40,\"script/MineHook.s.sol\":29,\"src/SIMDTEST.sol\":11,\"src/SIMDTESTHook.sol\":244,\"src/SqrtPriceOracle.sol\":61,\"test/Hook.t.sol\":321,\"test/MainnetFork.t.sol\":82,\"test/Oracle.t.sol\":68,\"test/Sequence.t.sol\":128,\"test/Token.t.sol\":71,\"test/helpers/HookFixture.sol\":98,\"test/helpers/PoolRouter.sol\":69},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1484,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/SIMDTESTHook.sol:181: SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#181-207) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SqrtPriceOracle.sol:40: SqrtPriceOracle.referencePrice() (src/SqrtPriceOracle.sol#40-60) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SqrtPriceOracle.sol:20: SqrtPriceOracle._record(uint160) (src/SqrtPriceOracle.sol#20-38) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/SIMDTESTHook.sol:181: SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#181-207) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/SIMDTESTHook.sol:172: Reentrancy in SIMDTESTHook.sweep() (src/SIMDTESTHook.sol#172-177):\n[medium/medium] reentrancy-no-eth at src/SIMDTESTHook.sol:181: Reentrancy in SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#181-207):\n[medium/medium] uninitialized-local at src/SIMDTESTHook.sol:120: SIMDTESTHook.beforeSwap(address,PoolKey,SwapParams,bytes).reserved (src/SIMDTESTHook.sol#120) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SIMDTESTHook.sol:137: SIMDTESTHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes).refund (src/SIMDTESTHook.sol#137) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SqrtPriceOracle.sol:50: SqrtPriceOracle.referencePrice().low (src/SqrtPriceOracle.sol#50) is a local variable never initialized\n[medium/medium] unused-return at src/SIMDTESTHook.sol:240: SIMDTESTHook._recordSpot() (src/SIMDTESTHook.sol#240-243) ignores return value by (price,None,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#241)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:209: SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#209-238) ignores return value by poolManager.settle() (src/SIMDTESTHook.sol#232)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:181: SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#181-207) ignores return value by (spot,None,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#193)\n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:209: Reentrancy in SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#209-238):\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:125: Reentrancy in SIMDTESTHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#125-146):\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:181: Reentrancy in SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#181-207):\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:172: Reentrancy in SIMDTESTHook.sweep() (src/SIMDTESTHook.sol#172-177):\n[low/medium] timestamp at src/SqrtPriceOracle.sol:20: SqrtPriceOracle._record(uint160) (src/SqrtPriceOracle.sol#20-38) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTHook.sol:181: SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#181-207) uses timestamp for comparisons\n[low/medium] timestamp at src/SqrtPriceOracle.sol:40: SqrtPriceOracle.referencePrice() (src/SqrtPriceOracle.sol#40-60) uses timestamp for comparisons","passed":true},{"durationMs":388,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/SIMDTESTHook.sol:174: Reentrancy: State change after external call (2 places)\n[low] large-numeric-literal at src/SIMDTEST.sol:9: Large Numeric Literal (2 places)\n[low] literal-instead-of-constant at src/SIMDTESTHook.sol:136: Literal Instead of Constant (4 places)\n[low] state-change-without-event at src/SIMDTESTHook.sol:99: State Change Without Event (2 places)\n[low] unchecked-return at src/SIMDTESTHook.sol:232: Unchecked Return\n[low] unused-public-function at src/SIMDTESTHook.sol:167: Public Function Not Used Internally","passed":true}],"detail":"launch.json is not a valid launch manifest: kind: Invalid discriminator value. Expected 'univ4_hook' | 'evm_project' | 'custom_token' | 'evm_contracts'","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"f8620c72514bc1a7cd35bf02c3f17a5654eee6a95250b2f0d6e092d3e942f34a","verifiedTreeHash":"e8a8bdd825e95a9a1906205e2acf1ac40d04288b","verifierVersion":"0.1.0+ad90ce4c"}]}