{"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":"66f8d5a8-b6b7-41e6-b0c7-c18997e82ecb","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 constants: 1% (100 bps) fee taken on every swap in afterSwap from the actual BalanceDelta (afterSwapReturnDelta).\n2. The fee is taken on the 'unspecified currency' side in afterSwap, which corresponds to launched token on buys and paired currency (IMD) on sells.\n3. The 1% fee accrues inside the hook contract balance in the paired currency and launched token separately.\n4. Anyone can call sweep() to transfer all accrued launched tokens from fees to the burn address 0x000000000000000000000000000000000000dEaD.\n5. Anyone can call executeBatch() once per 3600 seconds; it uses up to 25% of accrued paired currency fees.\n6. executeBatch() swaps exact-input paired currency through the PoolManager (0x000000000004444c5dc75cB358380D2e3dE08A90) for SIMDTEST tokens with a sqrtPriceLimit set 300 bps beyond a time-weighted referencePrice.\n7. Partial fills are accepted; unswapped paired currency remains accrued in the hook.\n8.\n\nMechanics specification (authoritative: where anything above differs, follow these exactly):\nM1. Buyback and burn in batches: on EVERY swap (buys and sells) the hook takes an extra 1% in afterSwap from the actual BalanceDelta, on the unspecified currency (afterSwapReturnDelta), so the fee always matches what filled. On a buy that currency is usually the launched token; on a sell it is usually the paired currency. Launched-token fees are burned: an anyone-callable sweep() sends them to 0x000000000000000000000000000000000000dEaD. Paired-currency fees accrue in the hook to fund buybacks and are never spent inside a swap callback. executeBatch(), callable by anyone in its own transaction, runs at most once every 3600 seconds; its budget is up to 25% of the accrued paired-currency balance, and it swaps exact-input through the PoolManager (unlock and swap) with a sqrtPriceLimit 300 bps beyond a time-weighted reference price kept by the hook, accepting a partial fill: whatever does not fit inside that limit stays accrued for the next batch, so the buyback can never deadlock. The price limit is the only slippage guard (no minimum-output check that hardcodes the LP fee). Batch swaps are made by the hook itself and pay no hook fee. Bought tokens go to 0x000000000000000000000000000000000000dEaD. Immutable constants; views pending(), pendingBurn(), lastBatch(), referencePrice().\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":"192497ccf3ad8528d2af901dd3a0ed705f6781e4d22cdcf60e1f09c84fb047f4","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"66f8d5a8-b6b7-41e6-b0c7-c18997e82ecb","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1016-simdtest"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50968","feedbackHash":"0e27618b81d8fdaa3b54ac2a7ac72746cf26730f572d55b14f3d0ff93c31f530","nodeKey":"build_contract_project","submissionHash":"27c337f5dcf6783b5267017aba9a7702a87ef8a234003d347996af16f1a1d6f6","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51206","feedbackHash":"c38ab063c8c09da7d5fa67cd9fa00813cc8253923f32ccc406aad953877e471b","nodeKey":"build_contract_project","submissionHash":"15114b4d8334e802e92192f6ec91475327e250cc4819b308a346e0dd3b694a70","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51297","feedbackHash":"16d024392d20492db2dbb35bd0bd6d5d46eccbfd104150b1a28c0ce4a247ac48","nodeKey":"build_contract_project","submissionHash":"e40ae145425c656a90ed144887fab6b560f3addfd430ef5372c6fdf4d275792e","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"e8ba8cb126841acc688b4ab129545374f8099eca4410ecc03ac9a308e959daa9","state":"blocked","submissions":[{"artifacts":[],"attempt":3,"bundleHash":"85286259a5333b39b65640777d12dd9a09bbd357c446b4c627728688e0f5f760","device":"6f28da6b9cc6e577","findings":[],"hash":"15114b4d8334e802e92192f6ec91475327e250cc4819b308a346e0dd3b694a70","nodeId":"00105215-906b-41f8-b656-ded4e3ceae01","outcome":"completed","summary":"Implemented the Foundry project with SIMDTEST, SIMDTESTHook, corrected manifest fields, vendored dependencies, tests, and deployment documentation.\n\nValidation passed:\n\n- `forge build`\n- `forge test`: 51 passed; 2 fork suites skipped offline\n- Mainnet fork: 42 passed at block 26,146,073\n- Invariants: 4,096 actions, zero reverts\n- `forge fmt --check`\n\nDeployment and oracle assumptions are documented in `README.md`; review results are in `VALIDATION.md`. No transactions were broadcast.","treeHash":"d6892dfeda4e27ebaa1e00d2867a57a415907962","usage":{"cachedInputTokens":1740160,"inputTokens":122021,"model":"gpt-6-astra","outputTokens":30294,"runtime":"codex","turns":7,"wallClockMs":1219657}},{"artifacts":[],"attempt":2,"bundleHash":"47b891584fcae2bd7ce4a23f5f51490b4c9595d5984f904ae2933119a235844d","device":"228636b860e0212c","findings":[],"hash":"27c337f5dcf6783b5267017aba9a7702a87ef8a234003d347996af16f1a1d6f6","nodeId":"00105215-906b-41f8-b656-ded4e3ceae01","outcome":"completed","summary":"Implemented the Foundry project, token, hook, vendored dependencies, tests, deployment helper, and documentation. Corrected `launch.json` to `kind: \"univ4_hook\"`.\n\nVerified:\n- `forge build` and `forge fmt --check` pass.\n- Default suite: 47 passed; fork suite skips without a fork.\n- Four mainnet-fork tests passed at block 26146003.\n- 8,192 invariant actions completed without reverts.\n\nAssumptions and operational responsibilities are documented in `README.md`.","treeHash":"2b9b58c8a8c30456520c5841240c6183943f8956","usage":{"cachedInputTokens":1863552,"inputTokens":114198,"model":"gpt-6-astra","outputTokens":32502,"runtime":"codex","turns":8,"wallClockMs":1222842}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"11f978978d1e9b55","findings":[],"hash":"5c121338eba9deee93901b3014904f0d3fd08eaac1756edd671c64e44cbb1b46","nodeId":"00105215-906b-41f8-b656-ded4e3ceae01","outcome":"failed","summary":"the task produced no changes; the agent's last message was: Blocked by the runner: every command fails with `bwrap: setting up uid map: Permission denied`.\n\nNo files changed. Writing `.imd-blocked.json` also failed, so I couldn’t read the checks, implement the contracts, or run `forge build` and `forge test`.\n\nPlease rerun with working repository access and sandbox permissions.","treeHash":null,"usage":{"cachedInputTokens":111872,"inputTokens":21998,"model":"gpt-6-astra","outputTokens":967,"runtime":"codex","turns":3,"wallClockMs":59847}},{"artifacts":[],"attempt":1,"bundleHash":"416866dfa1ce4bef956c0d8df97bbf2399fe5dcc686b52c79eb7ad1bfd85132a","device":"8df16409e9706163","findings":[],"hash":"e40ae145425c656a90ed144887fab6b560f3addfd430ef5372c6fdf4d275792e","nodeId":"00105215-906b-41f8-b656-ded4e3ceae01","outcome":"completed","summary":"Implemented the token, immutable hook, launch manifest, CREATE2 miner, vendored dependencies, tests, and [documentation](README.md).\n\nValidation passed: `forge build`, `forge fmt --check`, and 66 tests. The mainnet fork suite is included but remains unrun because RPC requests returned HTTP 403.","treeHash":"0bf77f7ca0f5284c25d296fd18ca4225d2e5b841","usage":{"cachedInputTokens":1780992,"inputTokens":119463,"model":"gpt-6-astra","outputTokens":31893,"runtime":"codex","turns":7,"wallClockMs":1183003}}],"verification":[{"checks":[{"durationMs":8342,"exitCode":0,"name":"build","output":"Compiling 82 files with Solc 0.8.26\nSolc 0.8.26 finished in 8.19s\nCompiler run successful!\nwarning[missing-events-arithmetic]: `_epochStart` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:125:9\n    │\n125 │         _epochStart = uint64(block.timestamp);\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `_lastObservation` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:126:9\n    │\n126 │         _lastObservation = uint64(block.timestamp);\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `_lastTick` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:127:9\n    │\n127 │         _lastTick = tick;\n    │         ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `_cachedReference` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:128:9\n    │\n128 │         _cachedReference = sqrtPriceX96;\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `_tickSeconds` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:273:9\n    │\n273 │         _tickSeconds += int256(_lastTick) * int256(block.timestamp - _lastObservation);\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `_lastObservation` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:274:9\n    │\n274 │         _lastObservation = uint64(block.timestamp);\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `_lastTick` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:275:9\n    │\n275 │         _lastTick = tick;\n    │         ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `pending` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:253:9\n    │\n253 │         pending -= spent;\n    │         ━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:125:23\n    │\n125 │         _epochStart = uint64(block.timestamp);\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:126:28\n    │\n126 │         _lastObservation = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:140:42\n    │\n140 │             params.amountSpecified < 0 ? uint256(-(params.amountSpecified + 1)) + 1 : 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/SIMDTESTHook.sol:140:87\n    │\n140 │             params.amountSpecified < 0 ? uint256(-(params.amountSpecified + 1)) + 1 : 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/SIMDTESTHook.sol:141:25\n    │\n141 │         if (magnitude > uint256(type(int256).max) - magnitude / 100) 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-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTHook.sol:177:9\n    │\n177 │         emit FeeAccrued(Currency.unwrap(currency), fee, asClaim);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:160:23\n    │\n160 │         uint256 fee = uint256(filled < 0 ? -filled : filled) / 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:179:44\n    │\n179 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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:179:51\n    │\n179 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                                   ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SIMDTESTHook.sol:187:13\n    │\n187 │         if (elapsed == 0) return _cachedReference;\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/SIMDTESTHook.sol:191:31\n    │\n191 │         if (cumulative < 0 && cumulative % int256(elapsed) != 0) --mean;\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:188:64\n    │\n188 │         int256 cumulative = _tickSeconds + int256(_lastTick) * int256(block.timestamp - _lastObservation);\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:189:36\n    │\n189 │         int256 mean = cumulative / int256(elapsed);\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:191:44\n    │\n191 │         if (cumulative < 0 && cumulative % int256(elapsed) != 0) --mean;\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:192:44\n    │\n192 │         return TickMath.getSqrtPriceAtTick(int24(mean));\n    │                                            ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:202:16\n    │\n202 │         return 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[reentrancy-no-eth]: external call can be reentered before `_operation` is updated\n    ╭▸ src/SIMDTESTHook.sol:208:31\n    │\n208 │         if (tokenClaims != 0) poolManager.unlock(\"\");\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:210:9\n    │\n210 │         emit Swept(amount);\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/SIMDTESTHook.sol:208:31\n    │\n208 │         if (tokenClaims != 0) poolManager.unlock(\"\");\n    │                               ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_operation` is updated\n    ╭▸ src/SIMDTESTHook.sol:229:42\n    │\n229 │             (spent, burned) = abi.decode(poolManager.unlock(abi.encode(budget, 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:214:13\n    │\n214 │         if (block.timestamp - _epochStart < BATCH_INTERVAL) revert BatchTooSoon();\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:231:9\n    │\n231 │         emit BatchExecuted(budget, spent, burned, ref, limit);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:218:22\n    │\n218 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:218:30\n    │\n218 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:218:67\n    │\n218 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:218:75\n    │\n218 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:222:23\n    │\n222 │         _epochStart = uint64(block.timestamp);\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:223:28\n    │\n223 │         _lastObservation = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:248:89\n    │\n248 │         BalanceDelta delta = poolManager.swap(poolKey(), SwapParams(pairedIsCurrency0, -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:251:25\n    │\n251 │         uint256 spent = uint256(-int256(input));\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:252:26\n    │\n252 │         uint256 burned = uint256(int256(output));\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:257:13\n    │\n257 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:273:45\n    │\n273 │         _tickSeconds += int256(_lastTick) * int256(block.timestamp - _lastObservation);\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:274:28\n    │\n274 │         _lastObservation = uint64(block.timestamp);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/AccountingInvariant.t.sol:31:17\n   │\n31 │         vm.warp(block.timestamp + bound(secondsForward, 0, 7200));\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":829,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/MainnetFork.t.sol:MainnetForkPairFirstTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 502.22µs (0.00ns CPU time)\n\nRan 1 test for test/MainnetFork.t.sol:MainnetForkTokenFirstTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 578.83µs (0.00ns CPU time)\n\nRan 4 tests for test/SIMDTEST.t.sol:SIMDTESTTest\n[PASS] testFuzz_TransferConservesSupply(uint256) (runs: 256, μ: 79126, ~: 79274)\n[PASS] test_AllowanceAndInsufficientFunds() (gas: 181516)\n[PASS] test_LaunchSupplyAllGoesToDeployer() (gas: 44163)\n[PASS] test_NoAdministrativeEntryPointsOrForbiddenOpcodes() (gas: 626150)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 9.44ms (11.04ms CPU time)\n\nRan 2 tests for test/SIMDTESTHook.t.sol:HookClaimsTest\n[PASS] test_InputPairFeeUsesClaimWhenCashIsNotYetSettled() (gas: 995428)\n[PASS] test_InputTokenFeeClaimsCanBeSweptAfterSettlement() (gas: 896813)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 21.40ms (1.83ms CPU time)\n\nRan 21 tests for test/SIMDTESTHook.t.sol:HookTokenFirstTest\n[PASS] testFuzz_FilledFee(bool,bool,uint96,uint16) (runs: 256, μ: 396253, ~: 399157)\n[PASS] test_BatchPartialFillAndNextBatchRemainLive() (gas: 1183294)\n[PASS] test_BatchSpendsQuarterAndBurnsWithoutHookFee() (gas: 788665)\n[PASS] test_CallbacksRejectUnauthorizedAndUnexpectedUnlock() (gas: 170242)\n[PASS] test_CannotSpendOrSweepInsideSwapUnlock() (gas: 618230)\n[PASS] test_CooldownAndFirstHour() (gas: 968159)\n[PASS] test_ExactInputBuy() (gas: 397609)\n[PASS] test_ExactInputSell() (gas: 404166)\n[PASS] test_ExactOutputBuy() (gas: 397893)\n[PASS] test_ExactOutputSell() (gas: 402958)\n[PASS] test_PartialExactInputBuy() (gas: 412896)\n[PASS] test_PartialExactInputSell() (gas: 419155)\n[PASS] test_PartialExactOutputBuy() (gas: 412195)\n[PASS] test_PartialExactOutputSell() (gas: 418177)\n[PASS] test_PermissionsInitializationAndCodeLimits() (gas: 2212140)\n[PASS] test_PriceOutsideLimitSkipsAndNextHourRecovers() (gas: 1522666)\n[PASS] test_RejectsOtherPoolsAndDynamicFee() (gas: 591923)\n[PASS] test_SweepBurnsAllFeesAndIsIdempotent() (gas: 667992)\n[PASS] test_TimeWeightUsesOldTickAndIncludesIdleTime() (gas: 907416)\n[PASS] test_UnrepresentableAmountHasExplicitError() (gas: 439015)\n[PASS] test_ZeroBudgetAndNoLiquidityDoNotDeadlock() (gas: 858239)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 45.08ms (50.38ms CPU time)\n\nRan 21 tests for test/SIMDTESTHook.t.sol:HookPairFirstTest\n[PASS] testFuzz_FilledFee(bool,bool,uint96,uint16) (runs: 256, μ: 395818, ~: 399134)\n[PASS] test_BatchPartialFillAndNextBatchRemainLive() (gas: 1177314)\n[PASS] test_BatchSpendsQuarterAndBurnsWithoutHookFee() (gas: 782661)\n[PASS] test_CallbacksRejectUnauthorizedAndUnexpectedUnlock() (gas: 170206)\n[PASS] test_CannotSpendOrSweepInsideSwapUnlock() (gas: 611745)\n[PASS] test_CooldownAndFirstHour() (gas: 962933)\n[PASS] test_ExactInputBuy() (gas: 404124)\n[PASS] test_ExactInputSell() (gas: 397681)\n[PASS] test_ExactOutputBuy() (gas: 402989)\n[PASS] test_ExactOutputSell() (gas: 397892)\n[PASS] test_PartialExactInputBuy() (gas: 419110)\n[PASS] test_PartialExactInputSell() (gas: 412971)\n[PASS] test_PartialExactOutputBuy() (gas: 418185)\n[PASS] test_PartialExactOutputSell() (gas: 412217)\n[PASS] test_PermissionsInitializationAndCodeLimits() (gas: 2212140)\n[PASS] test_PriceOutsideLimitSkipsAndNextHourRecovers() (gas: 1516719)\n[PASS] test_RejectsOtherPoolsAndDynamicFee() (gas: 598402)\n[PASS] test_SweepBurnsAllFeesAndIsIdempotent() (gas: 674507)\n[PASS] test_TimeWeightUsesOldTickAndIncludesIdleTime() (gas: 900917)\n[PASS] test_UnrepresentableAmountHasExplicitError() (gas: 445530)\n[PASS] test_ZeroBudgetAndNoLiquidityDoNotDeadlock() (gas: 851797)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 46.75ms (47.64ms CPU time)\n\nRan 2 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] test_DeploymentRejectsWrongPermissionBits() (gas: 4396773)\n[PASS] test_PredictedPoolCannotBeInitializedBeforeHookHasCode() (gas: 79876434)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 50.99ms (50.98ms CPU time)\n\nRan 1 test for test/AccountingInvariant.t.sol:AccountingInvariantTest\n[PASS] invariant_FeesAreConservedAndAllDeltasSettled() (runs: 128, calls: 4096, reverts: 0)\n\n╭-------------------------+----------+-------+---------+----------╮\n| Contract                | Selector | Calls | Reverts | Discards |\n+=================================================================+\n| AccountingInvariantTest | actBatch | 1304  | 0       | 0        |\n|-------------------------+----------+-------+---------+----------|\n| AccountingInvariantTest | actSwap  | 1383  | 0       | 0        |\n|-------------------------+----------+-------+---------+----------|\n| AccountingInvariantTest | actSweep | 1409  | 0       | 0        |\n╰-------------------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 730.42ms (710.54ms CPU time)\n\nRan 8 test suites in 731.79ms (905.16ms CPU time): 51 tests passed, 0 failed, 2 skipped (53 total tests)\n","passed":true},{"durationMs":47,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SIMDTEST.approve(address,uint256)\",\"SIMDTEST.transfer(address,uint256)\",\"SIMDTEST.transferFrom(address,address,uint256)\",\"SIMDTESTHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"SIMDTESTHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"SIMDTESTHook.executeBatch()\",\"SIMDTESTHook.sweep()\",\"SIMDTESTHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":12,\"README.md\":93,\"VALIDATION.md\":27,\"foundry.toml\":14,\"launch.json\":24,\"script/MineHook.s.sol\":25,\"src/SIMDTEST.sol\":11,\"src/SIMDTESTHook.sol\":281,\"test/AccountingInvariant.t.sol\":58,\"test/Deployment.t.sol\":53,\"test/MainnetFork.t.sol\":22,\"test/SIMDTEST.t.sol\":69,\"test/SIMDTESTHook.t.sol\":298,\"test/helpers/HookFixture.sol\":172,\"test/helpers/MockERC20.sol\":12,\"test/helpers/PoolRouter.sol\":60},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1300,"exitCode":0,"name":"slither","output":"[high/medium] weak-prng at src/SIMDTESTHook.sol:184: SIMDTESTHook.referencePrice() (src/SIMDTESTHook.sol#184-193) uses a weak PRNG: \"cumulative < 0 && cumulative % int256(elapsed) != 0 (src/SIMDTESTHook.sol#191)\"\n[medium/high] incorrect-equality at src/SIMDTESTHook.sol:184: SIMDTESTHook.referencePrice() (src/SIMDTESTHook.sol#184-193) uses a dangerous strict equality:\n[medium/medium] unused-return at src/SIMDTESTHook.sol:205: SIMDTESTHook.sweep() (src/SIMDTESTHook.sol#205-211) ignores return value by poolManager.unlock() (src/SIMDTESTHook.sol#208)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:213: SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#213-232) ignores return value by (spot,None,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#226)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:234: SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#234-264) ignores return value by poolManager.settle() (src/SIMDTESTHook.sol#257)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:234: SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#234-264) ignores return value by (None,tick,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#261)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:145: SIMDTESTHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#145-180) ignores return value by (None,tick,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#153)\n[low/medium] events-maths at src/SIMDTESTHook.sol:234: SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#234-264) should emit an event for: \n[low/medium] events-maths at src/SIMDTESTHook.sol:117: SIMDTESTHook.afterInitialize(address,PoolKey,uint160,int24) (src/SIMDTESTHook.sol#117-130) should emit an event for: \n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:234: Reentrancy in SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#234-264):\n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:234: Reentrancy in SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#234-264):\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:213: Reentrancy in SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#213-232):\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:145: Reentrancy in SIMDTESTHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#145-180):\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:205: Reentrancy in SIMDTESTHook.sweep() (src/SIMDTESTHook.sol#205-211):\n[low/medium] timestamp at src/SIMDTESTHook.sol:184: SIMDTESTHook.referencePrice() (src/SIMDTESTHook.sol#184-193) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTHook.sol:213: SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#213-232) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTHook.sol:196: SIMDTESTHook.batchPriceLimit() (src/SIMDTESTHook.sol#196-203) uses timestamp for comparisons","passed":true},{"durationMs":367,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/SIMDTESTHook.sol:248: Reentrancy: State change after external call\n[high] unsafe-casting at src/SIMDTESTHook.sol:192: Unsafe Casting of integers\n[low] large-numeric-literal at src/SIMDTEST.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/SIMDTESTHook.sol:141: Literal Instead of Constant (2 places)\n[low] state-change-without-event at src/SIMDTESTHook.sol:117: State Change Without Event (2 places)\n[low] unchecked-return at src/SIMDTESTHook.sol:257: Unchecked Return\n[low] unsafe-erc20-operation at src/SIMDTESTHook.sol:209: Unsafe ERC20 Operation (2 places)","passed":true}],"detail":"launch.json is not a valid launch manifest: hook.contract: expected a contract name; token.contract: expected a contract name","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"15114b4d8334e802e92192f6ec91475327e250cc4819b308a346e0dd3b694a70","verifiedTreeHash":"d6892dfeda4e27ebaa1e00d2867a57a415907962","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":3515,"exitCode":0,"name":"build","output":"Compiling 90 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.36s\nCompiler run successful!\nwarning[missing-events-arithmetic]: `epochStart` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:111:9\n    │\n111 │         epochStart = observedAt = uint64(block.timestamp);\n    │         ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `observedAt` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:111:22\n    │\n111 │         epochStart = observedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `spotSqrtPrice` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:112:9\n    │\n112 │         spotSqrtPrice = epochReference = sqrtPriceX96;\n    │         ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `epochReference` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:112:25\n    │\n112 │         spotSqrtPrice = epochReference = sqrtPriceX96;\n    │                         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `sqrtPriceSeconds` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:242:9\n    │\n242 │         sqrtPriceSeconds += uint256(spotSqrtPrice) * (block.timestamp - observedAt);\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `observedAt` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:243:9\n    │\n243 │         observedAt = uint64(block.timestamp);\n    │         ━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `spotSqrtPrice` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:244:9\n    │\n244 │         (spotSqrtPrice,,,) = poolManager.getSlot0(poolId);\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:70:40\n   │\n70 │     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/SIMDTESTHook.sol:111:35\n    │\n111 │         epochStart = observedAt = uint64(block.timestamp);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:124:33\n    │\n124 │             uint256 specified = 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/SIMDTESTHook.sol:125:29\n    │\n125 │             if (specified > uint256(type(int256).max) - specified / 100) 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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:142:23\n    │\n142 │         uint256 fee = uint256(filled < 0 ? -filled : filled) / 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:145:44\n    │\n145 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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:51\n    │\n145 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                                   ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SIMDTESTHook.sol:161:13\n    │\n161 │         if (elapsed == 0) return epochReference;\n    │             ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:162:16\n    │\n162 │         return uint160((sqrtPriceSeconds + uint256(spotSqrtPrice) * (block.timestamp - observedAt)) / elapsed);\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:174:16\n    │\n174 │         return 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[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SIMDTESTHook.sol:181:13\n    │\n181 │             poolManager.unlock(\"\");\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:186:9\n    │\n186 │         emit Swept(amount);\n    │         ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SIMDTESTHook.sol:179:13\n    │\n179 │         if (poolManager.balanceOf(address(this), uint160(token)) != 0) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SIMDTESTHook.sol:181:13\n    │\n181 │             poolManager.unlock(\"\");\n    │             ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `spotSqrtPrice` is updated\n    ╭▸ src/SIMDTESTHook.sol:205:42\n    │\n205 │             (spent, burned) = abi.decode(poolManager.unlock(abi.encode(budget, 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:194:13\n    │\n194 │         if (block.timestamp - epochStart < BATCH_INTERVAL) revert BatchTooSoon();\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:213:9\n    │\n213 │         emit BatchExecuted(budget, spent, burned, ref, limit);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:199:22\n    │\n199 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:199:30\n    │\n199 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:199:67\n    │\n199 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:199:75\n    │\n199 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:210:35\n    │\n210 │         epochStart = observedAt = uint64(block.timestamp);\n    │                                   ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:226:89\n    │\n226 │         BalanceDelta delta = poolManager.swap(poolKey(), SwapParams(pairedIsCurrency0, -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:229:25\n    │\n229 │         uint256 spent = uint256(-input);\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:230:26\n    │\n230 │         uint256 bought = uint256(output);\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:234:13\n    │\n234 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:243:22\n    │\n243 │         observedAt = uint64(block.timestamp);\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint64' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTHook.sol:253:9\n    │\n253 │         emit FeeAccrued(Currency.unwrap(currency), fee, claim);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/SIMDTESTHook.t.sol:108:17\n    │\n108 │         vm.warp(block.timestamp + 3599);\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/SIMDTESTHook.t.sol:111:17\n    │\n111 │         vm.warp(block.timestamp + 1);\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/SIMDTESTHook.t.sol:122:17\n    │\n122 │         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/SIMDTESTInvariant.t.sol:66:17\n   │\n66 │         vm.warp(block.timestamp + bound(secondsSeed, 1, 7200));\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":1804,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/SIMDTESTFork.t.sol:SIMDTESTForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 467.30µs (0.00ns CPU time)\n\nRan 4 tests for test/SIMDTEST.t.sol:SIMDTESTTest\n[PASS] test_EntireSupplyBelongsToDeployerBeforeFactoryDistribution() (gas: 52546)\n[PASS] test_NoDangerousRuntimeOpcodes() (gas: 761991)\n[PASS] test_NoMintOrAdminEvenForDeployer() (gas: 58369)\n[PASS] test_TransferAndAllowanceConserveSupplyWithoutTax() (gas: 178587)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.23ms (2.40ms CPU time)\n\nRan 21 tests for test/SIMDTESTHook.t.sol:SIMDTESTHookReverseOrderTest\n[PASS] testFuzz_ConservationAndProportionalFees(bool,bool,bool,uint96) (runs: 256, μ: 352649, ~: 358209)\nLogs:\n  Bound result 99999000000000000000017423\n\n[PASS] test_AllEnabledCallbacksAndUnlockRejectUnauthorizedCallers() (gas: 160979)\n[PASS] test_AllFourPriceLimitedPartialFills() (gas: 1362282)\n[PASS] test_AllFourSwapModesChargeActualUnspecifiedDelta() (gas: 1296893)\n[PASS] test_AlreadyBeyondLimitDoesNotDeadlock() (gas: 745309)\n[PASS] test_BatchCannotRunInsideAnotherUnlock() (gas: 320648)\n[PASS] test_BatchPartialFillKeepsUnspentFundsAndCanRunAgain() (gas: 518918)\n[PASS] test_BatchUsesOneQuarterAndPaysNoHookFee() (gas: 855417)\n[PASS] test_CooldownIncludesFirstBatchAndExactBoundary() (gas: 263317)\n[PASS] test_DeploymentSizesAndNoDangerousRuntimeOpcodes() (gas: 3737912)\n[PASS] test_FreshOneSidedPoolExactOutputBuyAccruesRedeemableIMDClaims() (gas: 1003316)\n[PASS] test_FreshOneSidedPoolExactOutputSellClaimsCanBeSwept() (gas: 893436)\n[PASS] test_HugeRepresentableRequestsWithSmallActualFills() (gas: 706823)\n[PASS] test_NoLiquidityAcceptsZeroFill() (gas: 326110)\n[PASS] test_OnlyLaunchPoolCanInitialize() (gas: 110013)\n[PASS] test_PermissionBitsAndStaticLPFee() (gas: 38662)\n[PASS] test_PriceLimitIsThreePercentInPriceSpace() (gas: 32958)\n[PASS] test_ReferenceUsesTimeAtPreviousSpotAndExcludesSameTimestampChanges() (gas: 781050)\n[PASS] test_SweepAnyoneBurnsAllAndCanRepeat() (gas: 882837)\n[PASS] test_TinyTradeRoundsFeeDown() (gas: 312243)\n[PASS] test_UnrepresentableSpecifiedAmountIsRejected() (gas: 97937)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 47.55ms (51.65ms CPU time)\n\nRan 21 tests for test/SIMDTESTHook.t.sol:SIMDTESTHookTest\n[PASS] testFuzz_ConservationAndProportionalFees(bool,bool,bool,uint96) (runs: 1000, μ: 352603, ~: 351665)\nLogs:\n  Bound result 15589406\n\n[PASS] test_AllEnabledCallbacksAndUnlockRejectUnauthorizedCallers() (gas: 161182)\n[PASS] test_AllFourPriceLimitedPartialFills() (gas: 1368324)\n[PASS] test_AllFourSwapModesChargeActualUnspecifiedDelta() (gas: 1291143)\n[PASS] test_AlreadyBeyondLimitDoesNotDeadlock() (gas: 733046)\n[PASS] test_BatchCannotRunInsideAnotherUnlock() (gas: 320660)\n[PASS] test_BatchPartialFillKeepsUnspentFundsAndCanRunAgain() (gas: 481209)\n[PASS] test_BatchUsesOneQuarterAndPaysNoHookFee() (gas: 865462)\n[PASS] test_CooldownIncludesFirstBatchAndExactBoundary() (gas: 263109)\n[PASS] test_DeploymentSizesAndNoDangerousRuntimeOpcodes() (gas: 3737912)\n[PASS] test_FreshOneSidedPoolExactOutputBuyAccruesRedeemableIMDClaims() (gas: 973856)\n[PASS] test_FreshOneSidedPoolExactOutputSellClaimsCanBeSwept() (gas: 921993)\n[PASS] test_HugeRepresentableRequestsWithSmallActualFills() (gas: 696372)\n[PASS] test_NoLiquidityAcceptsZeroFill() (gas: 320147)\n[PASS] test_OnlyLaunchPoolCanInitialize() (gas: 110049)\n[PASS] test_PermissionBitsAndStaticLPFee() (gas: 38662)\n[PASS] test_PriceLimitIsThreePercentInPriceSpace() (gas: 32854)\n[PASS] test_ReferenceUsesTimeAtPreviousSpotAndExcludesSameTimestampChanges() (gas: 781417)\n[PASS] test_SweepAnyoneBurnsAllAndCanRepeat() (gas: 883212)\n[PASS] test_TinyTradeRoundsFeeDown() (gas: 300444)\n[PASS] test_UnrepresentableSpecifiedAmountIsRejected() (gas: 97948)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 48.62ms (64.77ms CPU time)\n\nRan 1 test for test/SIMDTESTInvariant.t.sol:SIMDTESTInvariantTest\n[PASS] invariant_FeesAndBurnsConserveBothCurrencies() (runs: 128, calls: 8192, reverts: 0)\n\n╭------------+-----------------+-------+---------+----------╮\n| Contract   | Selector        | Calls | Reverts | Discards |\n+===========================================================+\n| FeeHandler | advanceAndBatch | 2847  | 0       | 0        |\n|------------+-----------------+-------+---------+----------|\n| FeeHandler | sweep           | 2704  | 0       | 0        |\n|------------+-----------------+-------+---------+----------|\n| FeeHandler | trade           | 2641  | 0       | 0        |\n╰------------+-----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 514\n  Bound result 127\n  Bound result 3263\n  Bound result 10463\n  Bound result 4\n  Bound result 20\n  Bound result 600\n  Bound result 5420\n  Bound result 131699298465\n  Bound result 1114277012\n  Bound result 19351\n  Bound result 1908\n  Bound result 11514423465933982080\n  Bound result 1517015002\n  Bound result 3\n  Bound result 758\n  Bound result 3\n  Bound result 2770266796\n  Bound result 5035583941203119438\n  Bound result 640533719813451760\n  Bound result 74863407976662570135\n  Bound result 653\n  Bound result 4050\n  Bound result 5339\n  Bound result 7810\n  Bound result 2655\n  Bound result 4505\n  Bound result 128\n  Bound result 1863\n  Bound result 14916441803199768133\n  Bound result 13983\n  Bound result 79455674698473862133\n  Bound result 1\n  Bound result 4\n  Bound result 5312\n  Bound result 300\n  Bound result 600\n  Bound result 319\n  Bound result 14264337593543950332\n  Bound result 828\n  Bound result 80488956411239202817\n  Bound result 2801\n  Bound result 5300\n  Bound result 1\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.70s (1.69s CPU time)\n\nRan 5 test suites in 1.70s (1.80s CPU time): 47 tests passed, 0 failed, 1 skipped (48 total tests)\n","passed":true},{"durationMs":56,"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\":4,\"DEPENDENCIES.md\":8,\"README.md\":105,\"SECURITY_REVIEW.md\":15,\"foundry.toml\":16,\"launch.json\":44,\"script/MineHook.s.sol\":26,\"src/HookFlags.sol\":29,\"src/SIMDTEST.sol\":11,\"src/SIMDTESTHook.sol\":267,\"test/SIMDTEST.t.sol\":55,\"test/SIMDTESTFork.t.sol\":71,\"test/SIMDTESTHook.t.sol\":309,\"test/SIMDTESTInvariant.t.sol\":114,\"test/helpers/HookFixture.sol\":130,\"test/helpers/PoolRouter.sol\":56,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1804,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/SIMDTESTHook.sol:158: SIMDTESTHook.referencePrice() (src/SIMDTESTHook.sol#158-163) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/SIMDTESTHook.sol:191: Reentrancy in SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#191-214):\n[medium/medium] unused-return at src/SIMDTESTHook.sol:240: SIMDTESTHook._observe() (src/SIMDTESTHook.sol#240-245) ignores return value by (spotSqrtPrice,None,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#244)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:191: SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#191-214) ignores return value by (spotSqrtPrice,None,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#209)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:191: SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#191-214) ignores return value by (current,None,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#201)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:178: SIMDTESTHook.sweep() (src/SIMDTESTHook.sol#178-187) ignores return value by poolManager.unlock() (src/SIMDTESTHook.sol#181)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:216: SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#216-238) ignores return value by poolManager.settle() (src/SIMDTESTHook.sol#234)\n[low/medium] events-maths at src/SIMDTESTHook.sol:103: SIMDTESTHook.beforeInitialize(address,PoolKey,uint160) (src/SIMDTESTHook.sol#103-114) should emit an event for: \n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:178: Reentrancy in SIMDTESTHook.sweep() (src/SIMDTESTHook.sol#178-187):\n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:191: Reentrancy in SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#191-214):\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:247: Reentrancy in SIMDTESTHook._collect(Currency,uint256) (src/SIMDTESTHook.sol#247-254):\n[low/medium] timestamp at src/SIMDTESTHook.sol:191: SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#191-214) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTHook.sol:158: SIMDTESTHook.referencePrice() (src/SIMDTESTHook.sol#158-163) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTHook.sol:166: SIMDTESTHook.batchPriceLimit() (src/SIMDTESTHook.sol#166-175) uses timestamp for comparisons","passed":true},{"durationMs":492,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/SIMDTESTHook.sol:179: Reentrancy: State change after external call (3 places)\n[low] internal-function-used-once at src/HookFlags.sol:22: Internal Function Used Only Once\n[low] large-numeric-literal at src/SIMDTEST.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/SIMDTESTHook.sol:125: Literal Instead of Constant (4 places)\n[low] state-change-without-event at src/SIMDTESTHook.sol:103: State Change Without Event (2 places)\n[low] unchecked-return at src/SIMDTESTHook.sol:181: Unchecked Return (2 places)\n[low] unused-public-function at src/SIMDTESTHook.sol:152: Public Function Not Used Internally","passed":true}],"detail":"launch.json is not a valid launch manifest: hook.permissions: Invalid input: expected array, received object; notes: Invalid input: expected string, received undefined","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"27c337f5dcf6783b5267017aba9a7702a87ef8a234003d347996af16f1a1d6f6","verifiedTreeHash":"2b9b58c8a8c30456520c5841240c6183943f8956","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":3275,"exitCode":0,"name":"build","output":"Compiling 89 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.12s\nCompiler run successful!\nwarning[missing-events-arithmetic]: `observedTick` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:109:9\n    │\n109 │         observedTick = tick;\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `observationTime` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:110:9\n    │\n110 │         observationTime = block.timestamp;\n    │         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `windowStart` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:111:9\n    │\n111 │         windowStart = block.timestamp;\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastBatch` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:112:9\n    │\n112 │         lastBatch = block.timestamp;\n    │         ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `tickSeconds` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:268:9\n    │\n268 │         tickSeconds += int256(observedTick) * int256(block.timestamp - observationTime);\n    │         ━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `observationTime` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:269:9\n    │\n269 │         observationTime = block.timestamp;\n    │         ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `observedTick` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:270:9\n    │\n270 │         (, observedTick,,) = poolManager.getSlot0(poolId);\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:69:40\n   │\n69 │     constructor(IPoolManager manager_, address token_, address factory_) {\n   │                                        ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:124:45\n    │\n124 │         uint256 magnitude = specified < 0 ? uint256(-(specified + 1)) + 1 : uint256(specified);\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:124:77\n    │\n124 │         uint256 magnitude = specified < 0 ? uint256(-(specified + 1)) + 1 : uint256(specified);\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:125:25\n    │\n125 │         if (magnitude > uint256(type(int256).max) - magnitude / 100) 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[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/SIMDTESTHook.sol:136:32\n    │\n136 │     ) external onlyPoolManager nonReentrant returns (bytes4, int128) {\n    │                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\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:146:17\n    │\n146 │                 emit FeeAccrued(Currency.unwrap(currency), fee, false);\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/SIMDTESTHook.sol:149:17\n    │\n149 │                 emit FeeAccrued(Currency.unwrap(currency), fee, true);\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:141:23\n    │\n141 │         uint256 fee = uint256(actual < 0 ? -actual : actual) / 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:153:44\n    │\n153 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\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:153:51\n    │\n153 │         return (IHooks.afterSwap.selector, int128(int256(fee)));\n    │                                                   ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SIMDTESTHook.sol:171:13\n    │\n171 │         if (elapsed == 0) return TickMath.getSqrtPriceAtTick(observedTick);\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/SIMDTESTHook.sol:174:31\n    │\n174 │         if (cumulative < 0 && cumulative % int256(elapsed) != 0) --average;\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:172:66\n    │\n172 │         int256 cumulative = tickSeconds + int256(observedTick) * int256(block.timestamp - observationTime);\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:173:39\n    │\n173 │         int256 average = cumulative / int256(elapsed);\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:174:44\n    │\n174 │         if (cumulative < 0 && cumulative % int256(elapsed) != 0) --average;\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:175:44\n    │\n175 │         return TickMath.getSqrtPriceAtTick(int24(average));\n    │                                            ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:187:16\n    │\n187 │         return 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[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/SIMDTESTHook.sol:194:29\n    │\n194 │         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:196:9\n    │\n196 │         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 `_status` is updated\n    ╭▸ src/SIMDTESTHook.sol:214:42\n    │\n214 │             (spent, burned) = abi.decode(poolManager.unlock(abi.encode(budget, 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:202:13\n    │\n202 │         if (block.timestamp - lastBatch < BATCH_INTERVAL) revert BatchTooSoon();\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:217:9\n    │\n217 │         emit BatchExecuted(budget, spent, burned, referenceX96, limit);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:207:22\n    │\n207 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:207:30\n    │\n207 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:207:67\n    │\n207 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:207:75\n    │\n207 │         if (budget > uint256(uint128(type(int128).max))) budget = 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:229:31\n    │\n229 │             if (tokenClaims > 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:229:39\n    │\n229 │             if (tokenClaims > 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:230:31\n    │\n230 │                 tokenClaims = 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:230:39\n    │\n230 │                 tokenClaims = 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:245:82\n    │\n245 │         BalanceDelta delta = poolManager.swap(poolKey(), SwapParams(zeroForOne, -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:246:25\n    │\n246 │         uint256 spent = uint256(-int256(zeroForOne ? delta.amount0() : delta.amount1()));\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:247:26\n    │\n247 │         uint256 bought = uint256(int256(zeroForOne ? delta.amount1() : delta.amount0()));\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:255:13\n    │\n255 │             poolManager.settle();\n    │             ━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:268:47\n    │\n268 │         tickSeconds += int256(observedTick) * int256(block.timestamp - observationTime);\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[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Adversarial.t.sol:50:17\n   │\n50 │         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:225:17\n    │\n225 │         vm.warp(block.timestamp + 1);\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":946,"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 483.35µs (0.00ns CPU time)\n\nRan 5 tests for test/Token.t.sol:TokenTest\n[PASS] testFuzz_transferAndAllowanceConserveSupply(uint256) (runs: 256, μ: 151795, ~: 151876)\nLogs:\n  Bound result 193\n\n[PASS] test_entirePolicySupplyBelongsToDeployer() (gas: 52592)\n[PASS] test_insufficientAllowanceAndInvalidRecipient() (gas: 59909)\n[PASS] test_noMintOrAdminSelectorEvenForDeployer() (gas: 442006)\n[PASS] test_runtimeHasNoEscapeHatch() (gas: 761926)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 12.19ms (14.35ms CPU time)\n\nRan 5 tests for test/Initialization.t.sol:InitializationTest\n[PASS] test_invalidDeploymentArguments() (gas: 7597)\n[PASS] test_invalidFeeSpacingOrCurrencyCannotBindPool() (gas: 984214)\n[PASS] test_onlyFactoryCanInitializeCorrectPool() (gas: 272967)\n[PASS] test_operationsRequireInitialization() (gas: 74933)\n[PASS] test_wrongAddressPermissionsRefusedByConstructor() (gas: 8157)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 39.52ms (1.09ms CPU time)\n\nRan 3 tests for test/Adversarial.t.sol:AdversarialTest\n[PASS] test_feeTransferRefusalCannotBlockTrade() (gas: 1231941)\n[PASS] test_nearExtremePricesDoNotBreakOracleOrLimits() (gas: 1586642)\n[PASS] test_reentryFromFeeTransferIsRefused() (gas: 1059592)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 42.85ms (3.09ms CPU time)\n\nRan 26 tests for test/Hook.t.sol:HookPairFirstTest\n[PASS] testFuzz_feeMatchesActualFill(bool,bool,uint96) (runs: 256, μ: 337371, ~: 349129)\nLogs:\n  Bound result 238867246237140375\n\n[PASS] testFuzz_partialFeeMatchesActualFill(bool,bool,uint96) (runs: 256, μ: 366944, ~: 369002)\nLogs:\n  Bound result 999000000000000059433035\n\n[PASS] test_allCallbacksRejectUnauthorizedCalls() (gas: 141484)\n[PASS] test_alreadyCrossedBoundZeroFillAndRecovery() (gas: 636463)\n[PASS] test_batchBuysBurnsAndChargesNoHookFee() (gas: 738507)\n[PASS] test_batchCannotRunInsideSwapUnlock() (gas: 105786)\n[PASS] test_batchCooldownAndFirstWarmup() (gas: 269819)\n[PASS] test_batchPartialFillRetainsBudgetAndCanRepeat() (gas: 570007)\n[PASS] test_exactInputBuy() (gas: 346928)\n[PASS] test_exactInputSell() (gas: 340495)\n[PASS] test_exactOutputBuy() (gas: 345845)\n[PASS] test_exactOutputSell() (gas: 340765)\n[PASS] test_exactOutputWithNoInputReservesUsesClaim() (gas: 784303)\n[PASS] test_initializationCannotBeReusedForAnotherPool() (gas: 74049)\n[PASS] test_largeExactOutputRequestWithTinyFillSucceeds() (gas: 364973)\n[PASS] test_largeRequestWithTinyFillSucceeds() (gas: 365782)\n[PASS] test_noLiquidityDoesNotDeadlockBatchOrChargeSwap() (gas: 906367)\n[PASS] test_partialExactInputBuy() (gas: 365506)\n[PASS] test_partialExactInputSell() (gas: 359229)\n[PASS] test_partialExactOutputBuy() (gas: 364606)\n[PASS] test_partialExactOutputSell() (gas: 358575)\n[PASS] test_permissionBitsAndImmutableCode() (gas: 4010812)\n[PASS] test_priceLimitIsThreePercentInPrice() (gas: 18582)\n[PASS] test_referenceIsTimeWeightedAndSameBlockImmune() (gas: 547330)\n[PASS] test_sweepBurnsOnlyLaunchTokenAndAnyoneCanCall() (gas: 695055)\n[PASS] test_unrepresentableRequestRejected() (gas: 38776)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 55.36ms (87.02ms CPU time)\n\nRan 26 tests for test/Hook.t.sol:HookTokenFirstTest\n[PASS] testFuzz_feeMatchesActualFill(bool,bool,uint96) (runs: 256, μ: 333271, ~: 324483)\nLogs:\n  Bound result 5693\n\n[PASS] testFuzz_partialFeeMatchesActualFill(bool,bool,uint96) (runs: 256, μ: 365786, ~: 363670)\nLogs:\n  Bound result 999000238867246237140376\n\n[PASS] test_allCallbacksRejectUnauthorizedCalls() (gas: 141484)\n[PASS] test_alreadyCrossedBoundZeroFillAndRecovery() (gas: 629845)\n[PASS] test_batchBuysBurnsAndChargesNoHookFee() (gas: 744085)\n[PASS] test_batchCannotRunInsideSwapUnlock() (gas: 105786)\n[PASS] test_batchCooldownAndFirstWarmup() (gas: 269591)\n[PASS] test_batchPartialFillRetainsBudgetAndCanRepeat() (gas: 532065)\n[PASS] test_exactInputBuy() (gas: 340448)\n[PASS] test_exactInputSell() (gas: 346975)\n[PASS] test_exactOutputBuy() (gas: 340744)\n[PASS] test_exactOutputSell() (gas: 345866)\n[PASS] test_exactOutputWithNoInputReservesUsesClaim() (gas: 816434)\n[PASS] test_initializationCannotBeReusedForAnotherPool() (gas: 74049)\n[PASS] test_largeExactOutputRequestWithTinyFillSucceeds() (gas: 358990)\n[PASS] test_largeRequestWithTinyFillSucceeds() (gas: 359294)\n[PASS] test_noLiquidityDoesNotDeadlockBatchOrChargeSwap() (gas: 904720)\n[PASS] test_partialExactInputBuy() (gas: 359317)\n[PASS] test_partialExactInputSell() (gas: 365418)\n[PASS] test_partialExactOutputBuy() (gas: 358623)\n[PASS] test_partialExactOutputSell() (gas: 364558)\n[PASS] test_permissionBitsAndImmutableCode() (gas: 4010812)\n[PASS] test_priceLimitIsThreePercentInPrice() (gas: 18450)\n[PASS] test_referenceIsTimeWeightedAndSameBlockImmune() (gas: 540646)\n[PASS] test_sweepBurnsOnlyLaunchTokenAndAnyoneCanCall() (gas: 700206)\n[PASS] test_unrepresentableRequestRejected() (gas: 38776)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 55.30ms (85.07ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:HookInvariantTest\n[PASS]\nHookInvariantTest invariants:\n[PASS] invariant_feesSpentAndBurnedAreConserved\n[PASS] invariant_fullERC20SupplyIsConserved\n HookInvariantTest invariants (runs: 64, calls: 3072, reverts: 0)\n\n╭------------+----------+-------+---------+----------╮\n| Contract   | Selector | Calls | Reverts | Discards |\n+====================================================+\n| FeeHandler | batch    | 1029  | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| FeeHandler | swap     | 992   | 0       | 0        |\n|------------+----------+-------+---------+----------|\n| FeeHandler | sweep    | 1051  | 0       | 0        |\n╰------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 5168\n  Bound result 2148931654467864743\n  Bound result 3683\n  Bound result 6221\n  Bound result 3665\n  Bound result 3612\n  Bound result 1934905322\n  Bound result 9999999999999019504\n  Bound result 9999999999999000942\n  Bound result 7131\n  Bound result 9999999999999018501\n  Bound result 9999999999999006074\n  Bound result 9999999999999001058\n  Bound result 9999999999999005890\n  Bound result 3901\n  Bound result 5218\n  Bound result 3697\n  Bound result 4976\n  Bound result 4389\n  Bound result 9999999999999000118\n  Bound result 7061\n  Bound result 3701\n  Bound result 9999999999999009278\n  Bound result 4939\n  Bound result 9999999999999008824\n  Bound result 9999999999999004537\n  Bound result 6834\n  Bound result 3660\n  Bound result 4351\n  Bound result 7200\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 848.45ms (814.48ms CPU time)\n\nRan 7 test suites in 849.82ms (1.05s CPU time): 66 tests passed, 0 failed, 1 skipped (67 total tests)\n","passed":true},{"durationMs":55,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SIMDTEST.approve(address,uint256)\",\"SIMDTEST.transfer(address,uint256)\",\"SIMDTEST.transferFrom(address,address,uint256)\",\"SIMDTESTHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"SIMDTESTHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"SIMDTESTHook.executeBatch()\",\"SIMDTESTHook.sweep()\",\"SIMDTESTHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":4,\"README.md\":176,\"dependencies.json\":22,\"docs/REVIEW.md\":51,\"foundry.toml\":14,\"launch.json\":22,\"remappings.txt\":4,\"script/MineHook.s.sol\":27,\"src/HookFlags.sol\":31,\"src/SIMDTEST.sol\":11,\"src/SIMDTESTHook.sol\":277,\"test/Adversarial.t.sol\":59,\"test/Hook.t.sol\":341,\"test/Initialization.t.sol\":75,\"test/Invariant.t.sol\":119,\"test/MainnetFork.t.sol\":113,\"test/Token.t.sol\":74,\"test/helpers/HookFixture.sol\":101,\"test/helpers/PoolRouter.sol\":85,\"test/mocks/AdversarialPair.sol\":31,\"test/mocks/MockERC20.sol\":13},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1650,"exitCode":0,"name":"slither","output":"[high/medium] weak-prng at src/SIMDTESTHook.sol:168: SIMDTESTHook.referencePrice() (src/SIMDTESTHook.sol#168-176) uses a weak PRNG: \"cumulative < 0 && cumulative % int256(elapsed) != 0 (src/SIMDTESTHook.sol#174)\"\n[medium/high] incorrect-equality at src/SIMDTESTHook.sol:168: SIMDTESTHook.referencePrice() (src/SIMDTESTHook.sol#168-176) uses a dangerous strict equality:\n[medium/medium] unused-return at src/SIMDTESTHook.sol:220: SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#220-261) ignores return value by poolManager.settle() (src/SIMDTESTHook.sol#255)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:267: SIMDTESTHook._observe() (src/SIMDTESTHook.sol#267-271) ignores return value by (None,observedTick,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#270)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:220: SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#220-261) ignores return value by (spot,None,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#242)\n[low/medium] events-maths at src/SIMDTESTHook.sol:100: SIMDTESTHook.afterInitialize(address,PoolKey,uint160,int24) (src/SIMDTESTHook.sol#100-114) should emit an event for: \n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:191: Reentrancy in SIMDTESTHook.sweep() (src/SIMDTESTHook.sol#191-197):\n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:200: Reentrancy in SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#200-218):\n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:220: Reentrancy in SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#220-261):\n[low/medium] timestamp at src/SIMDTESTHook.sol:179: SIMDTESTHook.batchPriceLimit() (src/SIMDTESTHook.sol#179-188) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTHook.sol:168: SIMDTESTHook.referencePrice() (src/SIMDTESTHook.sol#168-176) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTHook.sol:200: SIMDTESTHook.executeBatch() (src/SIMDTESTHook.sol#200-218) uses timestamp for comparisons","passed":true},{"durationMs":400,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/SIMDTESTHook.sol:194: Reentrancy: State change after external call (2 places)\n[high] unsafe-casting at src/SIMDTESTHook.sol:175: Unsafe Casting of integers\n[low] internal-function-used-once at src/HookFlags.sol:24: Internal Function Used Only Once\n[low] large-numeric-literal at src/SIMDTEST.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/SIMDTESTHook.sol:125: Literal Instead of Constant (5 places)\n[low] non-reentrant-not-first at src/SIMDTESTHook.sol:136: `nonReentrant` is Not the First Modifier\n[low] state-change-without-event at src/SIMDTESTHook.sol:100: State Change Without Event (2 places)\n[low] unchecked-return at src/SIMDTESTHook.sol:255: Unchecked Return\n[low] unsafe-erc20-operation at src/SIMDTESTHook.sol:237: Unsafe ERC20 Operation (2 places)\n[low] unused-public-function at src/SIMDTESTHook.sol:162: 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":"e40ae145425c656a90ed144887fab6b560f3addfd430ef5372c6fdf4d275792e","verifiedTreeHash":"0bf77f7ca0f5284c25d296fd18ca4225d2e5b841","verifierVersion":"0.1.0+ad90ce4c"}]}