{"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":"23ea78f8-a419-4162-a296-e46f94d5b665","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\nYou are launching SIMDTEST (symbol SIMDTEST), a token on Ethereum paired with IMD using Identity.md's launch.open with an onchain univ4_hook called SIMDTESTHook. The project is a test preset on the SIMD Launchpad featuring anti-snipe and buyback-and-burn mechanics. The total supply is 1,000,000,000 tokens with 18 decimals. The token itself only supports basic transfers with no taxes, limits, pausing, or minting; all mechanics live exclusively in the hook.\n\nSupply Distribution:\n- 80% of the total supply seeds the IMD-SIMDTEST pool.\n- 10% of supply is sent to the SIMD Hackathon vault at 0x3dd5f73dd1a4e62630fad3909673f130ad429985.\n- The remaining 10% is reserved outside this scope (e.g., the launcher or other destination as desired).\n\nSIMDTESTHook Mechanics:\n- Triggers on Uniswap v4 hook callbacks involved in token swaps (swap callbacks).\n- Anti-snipe fee: for the first 10 blocks after the pool opens, an extra fee starts at 30% and linearly decays to 0% at block 10. This fee is deducted from the swap amount.\n- The anti-snipe fee is not burned or sent elsewhere: it is donated back into the pool's in-range liquidity via PoolManager.donate(), increasing liquidity and reducing slippage.\n- Buyback-and-burn fee: on every swap, an additional 0.5% fee is charged on top of the pool's default 1.25% fee and the anti-snipe fee if applicable.\n- The 0.5% buyback fee (taken in the paired currency IMD) accumulates inside SIMDTESTHook.\n- Anyone can call buybackAndBurn(), which swaps all accumulated paired currency fees for SIMDTEST tokens in the same pool and sends those tokens immediately to the burn address 0x000000000000000000000000000000000000dEaD.\n\nAdministrability:\n- The hook has no owner, no pausing ability, no upgradeability, and no fee adjustments after deployment.\n\nTesting Instructions:\n- Verify the anti-snipe fee correctly starts at 30% at pool start and linearly decreases to 0% by block 10.\n- Confirm the anti-snipe fees are donated correctly into pool liquidity, increasing the pool’s balances.\n- Check that the 0.5% buyback fee is properly collected in paired currency.\n- Test buybackAndBurn() swaps accumulated IMD fees into SIMDTEST tokens within the correct pool and burns them.\n- Confirm no unexpected minting, blacklisting, or owner privileges exist that could trap buyers.\n\nNote on Fees:\n- The pool charge remains 1.25%.\n- The hook adds up to 30.5% extra fee only during initial anti-snipe period, otherwise only 0.5% extra.\n- Identity.md's 1% creator fee is handled externally and omitted here.\n\nThis setup ensures a fair launch and emission control by buyback and burn, while sustaining pool depth through liquidity donation.\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- 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":"e34e768f6bb35bff9cf23cf098dd7bc47c1640e1245a0e242522bb0517127760","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"23ea78f8-a419-4162-a296-e46f94d5b665","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-971-simdtest"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51725","feedbackHash":"40561d7ff9f39b6ce0eb122fc7d5351eda3068e2f39ef4524fd97feeb5d9986e","nodeKey":"build_contract_project","submissionHash":"4b255240c971daf046017d35484c74fcc1f3cc3c8757b58dd2c1ff8d7c3759ae","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51544","feedbackHash":"c69696554fc8f11536f2ac56d71d79046b1a3205c59177466f7fadff926de512","nodeKey":"build_contract_project","submissionHash":"fe2bf5dae29de79973b7fced3c75b633eea811c08ed31a7c0e87dbb675c44648","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"51724","feedbackHash":"48603ea7f3af1d96267e840c9a093a368a78e5bc88009e015997b5ec31a6d756","nodeKey":"build_contract_project","submissionHash":"f8826bc0561608a44f346105d8ac0922553a29ba4d4121278334088e2a49e942","tag1":"verification:checks","tag2":"acceptance-v2","value":0}],"site":null,"snapshotHash":"91136af28f8808fcfde5e8c521cea4d3775aaacd80b100e757e22bcfdd19abd8","state":"blocked","submissions":[{"artifacts":[],"attempt":3,"bundleHash":"60f5999a30c2617a2e0351ab581ad7ba275b065a4f314fffc7b22655b5d6d6fe","device":"004eae350f695d24","findings":[],"hash":"4b255240c971daf046017d35484c74fcc1f3cc3c8757b58dd2c1ff8d7c3759ae","nodeId":"46d76437-fbd7-4682-b72c-4953e6d56860","outcome":"completed","summary":"Implemented the token, hook, launch manifest, vendored dependencies, tests, and deployment documentation.\n\nVerified:\n- `forge build` passes offline.\n- All 61 tests pass.\n- `forge fmt --check` passes.\n- Manifest consistency, bytecode size, and forbidden-opcode checks pass.\n\nThe launcher must execute the documented 80/10/10 allocation. Buybacks require 30 minutes of price history. Donations reward in-range LPs; they do not automatically increase active liquidity.","treeHash":"0b62310de9b34f6e1b457f4761ebcb3a98bdf099","usage":{"cachedInputTokens":1463424,"inputTokens":101059,"model":"gpt-6-astra","outputTokens":32185,"runtime":"codex","turns":7,"wallClockMs":976215}},{"artifacts":[],"attempt":2,"bundleHash":"244fc960803b0a7e5f0e632c1e60f8f41f97260c2de556542f93929083c0e171","device":"e1d2139b33ec4bd9","findings":[],"hash":"f8826bc0561608a44f346105d8ac0922553a29ba4d4121278334088e2a49e942","nodeId":"46d76437-fbd7-4682-b72c-4953e6d56860","outcome":"completed","summary":"Implemented the token, hook, vendored dependencies, deployment helper, documentation, and manifest with `kind: \"univ4_hook\"`.\n\n- `forge build`: passed\n- `forge test`: 26 passed, including fuzzing\n- `forge fmt --check`: passed\n- Hook init code: 9,295 bytes, below EIP-3860\n\nREADME documents allocation responsibilities, donation semantics, buyback price risks, and mainnet/launch.open verification limits.","treeHash":"d839c0bac1b6c245efca39e8acdd877548e71acb","usage":{"cachedInputTokens":1527168,"inputTokens":103844,"model":"gpt-6-astra","outputTokens":31661,"runtime":"codex","turns":7,"wallClockMs":986589}},{"artifacts":[],"attempt":1,"bundleHash":"60dc969bd3141ac4cda99904e1b718fea971b8dee15278f295f1174d9906185d","device":"cf6bec70b883c22a","findings":[],"hash":"fe2bf5dae29de79973b7fced3c75b633eea811c08ed31a7c0e87dbb675c44648","nodeId":"46d76437-fbd7-4682-b72c-4953e6d56860","outcome":"completed","summary":"Implemented SIMDTEST, SIMDTESTHook, launch configuration, vendored dependencies, deployment tooling, and documentation.\n\nVerified:\n- `forge build` passes.\n- All 56 tests pass.\n- `forge fmt --check` passes.\n- Clean offline builds reproduce identical bytecode.\n- Hook creation code meets EIP-3860 limits.\n\nThe launcher must execute the documented 80/10/10 allocation. Pool donations credit LP fees without automatically increasing active liquidity. Permissionless market-order buybacks retain documented MEV risk. No deployment was performed.","treeHash":"4dc9cebd79f68310f86409b4a9a5e940f80e504e","usage":{"cachedInputTokens":2026496,"inputTokens":127125,"model":"gpt-6-astra","outputTokens":34530,"runtime":"codex","turns":7,"wallClockMs":1056682}}],"verification":[{"checks":[{"durationMs":2364,"exitCode":0,"name":"build","output":"Compiling 72 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.22s\nCompiler run successful!\nwarning[missing-events-arithmetic]: `cumulativeTick` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:304:9\n    │\n304 │         cumulativeTick += int192(lastTick) * int192(uint192(now_ - lastTimestamp));\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `lastTimestamp` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:305:9\n    │\n305 │         lastTimestamp = now_;\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:306:9\n    │\n306 │         (, lastTick,,) = poolManager.getSlot0(poolId);\n    │         ━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-events-arithmetic]: `observationIndex` is changed without an event but is used in arithmetic\n    ╭▸ src/SIMDTESTHook.sol:308:13\n    │\n308 │             observationIndex = uint8((uint256(observationIndex) + 1) % OBSERVATION_COUNT);\n    │             ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-arithmetic\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/SIMDTESTHook.sol:82:39\n   │\n82 │     constructor(IPoolManager manager, address launchToken, address factory) {\n   │                                       ━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTHook.sol:132:9\n    │\n132 │         emit PoolOpened(poolId, block.number);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:129:25\n    │\n129 │         lastTimestamp = 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:153:63\n    │\n153 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int256(anti + buy).toInt128(), 0), 0);\n    │                                                               ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SIMDTESTHook.sol:178:44\n    │\n178 │         return (IHooks.afterSwap.selector, fee);\n    │                                            ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:171:28\n    │\n171 │             uint256 base = uint256(pairedDelta < 0 ? -int256(pairedDelta) : int256(pairedDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:175:19\n    │\n175 │             fee = int256(anti + buy).toInt128();\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[reentrancy-no-eth]: external call can be reentered before `buyingBack` is updated\n    ╭▸ src/SIMDTESTHook.sol:192:29\n    │\n192 │         burned = abi.decode(poolManager.unlock(abi.encode(amount, priceLimit)), (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:194:9\n    │\n194 │         emit BuybackAndBurn(amount, burned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:188:22\n    │\n188 │         if (amount > uint256(uint128(type(int128).max))) revert AmountTooLarge();\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:188:30\n    │\n188 │         if (amount > uint256(uint128(type(int128).max))) revert AmountTooLarge();\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:201:65\n    │\n201 │             poolKey(), IPoolManager.SwapParams(imdIsCurrency0, -int256(amount), priceLimit), \"\"\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:205:31\n    │\n205 │         if (int256(spent) != -int256(amount)) revert PartialFill();\n    │                               ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:211:26\n    │\n211 │         uint256 burned = uint256(int256(received));\n    │                          ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SIMDTESTHook.sol:220:29\n    │\n220 │         if (!initialized || block.timestamp < TWAP_WINDOW) revert OracleNotReady();\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:226:17\n    │\n226 │             if (old.timestamp <= target) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:222:70\n    │\n222 │         int256 current = int256(cumulativeTick) + int256(lastTick) * int256(block.timestamp - lastTimestamp);\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:227:35\n    │\n227 │                 int256 duration = int256(block.timestamp - old.timestamp);\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:231:24\n    │\n231 │                 return int24(mean); // A weighted average of valid v4 ticks remains within int24.\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[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/SIMDTESTHook.sol:268:20\n    │\n268 │             anti = gross * rate / BPS;\n    │                    ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/SIMDTESTHook.sol:269:19\n    │\n269 │             buy = gross * BUYBACK_BPS / BPS;\n    │                   ━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:258:26\n    │\n258 │         uint256 amount = uint256(specified < 0 ? -specified : 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:259:22\n    │\n259 │         if (amount > uint256(uint128(type(int128).max))) revert AmountTooLarge();\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:259:30\n    │\n259 │         if (amount > uint256(uint128(type(int128).max))) revert AmountTooLarge();\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:264:36\n    │\n264 │             expected = specified + int256(anti + buy);\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:276:25\n    │\n276 │             if (gross > uint256(uint128(type(int128).max))) revert AmountTooLarge();\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:276:33\n    │\n276 │             if (gross > uint256(uint128(type(int128).max))) revert AmountTooLarge();\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:277:24\n    │\n277 │             expected = int256(gross);\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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTHook.sol:290:30\n    │\n290 │         if (anti + buy != 0) emit FeesCollected(anti, buy);\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:284:13\n    │\n284 │             poolManager.donate(key, imdIsCurrency0 ? anti : 0, imdIsCurrency0 ? 0 : anti, \"\");\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:303:23\n    │\n303 │         uint64 now_ = 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:308:32\n    │\n308 │             observationIndex = uint8((uint256(observationIndex) + 1) % OBSERVATION_COUNT);\n    │                                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint8' 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/SIMDTESTHook.t.sol:467:17\n    │\n467 │         vm.warp(block.timestamp + 900);\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":521,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 7 tests for test/SIMDTEST.t.sol:SIMDTESTTokenTest\n[PASS] testAllocationPlanAndVaultPayment() (gas: 339275)\n[PASS] testFixedSupplyMetadataAndFactoryAllocation() (gas: 45390)\n[PASS] testFuzzTransfersConserveSupply(uint96,uint96) (runs: 256, μ: 159619, ~: 161292)\nLogs:\n  Bound result 7772\n  Bound result 2251\n\n[PASS] testInvalidTransfersAndApprovalsFail() (gas: 195638)\n[PASS] testNoMintBlacklistPauseOwnerOrUpgrade() (gas: 220343)\n[PASS] testTransferTransferFromSelfAndBurnAreUntaxed() (gas: 280524)\n[PASS] testZeroTransfersAndInfiniteAllowance() (gas: 192114)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 5.40ms (6.07ms CPU time)\n\nRan 27 tests for test/SIMDTESTHook.t.sol:IMDIsCurrency1Test\n[PASS] testAllSwapModesAfterAntiSnipe() (gas: 1336231)\n[PASS] testAllSwapModesAtLaunch() (gas: 1382225)\n[PASS] testAntiSnipeEveryBlockAndDonation() (gas: 4325489)\n[PASS] testBuybackAllFeesCorrectPoolAndBurnNoRecursiveTax() (gas: 816269)\n[PASS] testBuybackPartialFillRevertsWithoutLosingFees() (gas: 512575)\n[PASS] testBuybackReentrancyFails() (gas: 534953)\n[PASS] testBuybackTransferFailureRollsBackAndCanRetry() (gas: 659716)\n[PASS] testCannotInitializeWrongPoolOrFactoryOrTwice() (gas: 17716568)\n[PASS] testCreationAndRuntimeSizeLimits() (gas: 15390)\n[PASS] testDonationsAreClaimableByInRangeLP() (gas: 458520)\n[PASS] testDustExactOutputGrossUpAtEveryAntiSnipeRate() (gas: 449366093)\n[PASS] testExtremeSpecifiedAmountsFailCleanly() (gas: 82457)\n[PASS] testFlashManipulationCannotChangeHistoricalLimit() (gas: 541332)\n[PASS] testFuzzAllSwapModes(uint96,uint8,uint8) (runs: 256, μ: 339142, ~: 330218)\nLogs:\n  Bound result 993609262121026084871\n  Bound result 2\n\n[PASS] testInitializationAndPermissions() (gas: 70161)\n[PASS] testInvalidConstructorAddressesAndPermissions() (gas: 6151)\n[PASS] testNoFeesAndImmatureOracleFail() (gas: 349747)\n[PASS] testNoLiquidityDonationFailsWithoutCollectingFees() (gas: 203325)\n[PASS] testOracleCannotBeChurnedInOneBlockAndWrapsSafely() (gas: 23292634)\n[PASS] testOracleWeightsElapsedTicksInsteadOfTradeCount() (gas: 557892)\n[PASS] testPartialSpecifiedSwapRevertsFeesAtomically() (gas: 211391)\n[PASS] testPartialUnspecifiedSwapFeesOnlyFilledVolume() (gas: 306607)\n[PASS] testRejectsForeignSwapPool() (gas: 74326)\n[PASS] testUnauthorizedCallbacksAndUnlock() (gas: 153809)\n[PASS] testUnexpectedIMDTransfersCannotDiluteAccountedFees() (gas: 482565)\n[PASS] testUninitializedHookRejectsSwapAndBuyback() (gas: 17223251)\n[PASS] testUnsupportedSelectorsCannotGrantPrivileges() (gas: 120247)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 440.81ms (523.89ms CPU time)\n\nRan 27 tests for test/SIMDTESTHook.t.sol:IMDIsCurrency0Test\n[PASS] testAllSwapModesAfterAntiSnipe() (gas: 1337153)\n[PASS] testAllSwapModesAtLaunch() (gas: 1382772)\n[PASS] testAntiSnipeEveryBlockAndDonation() (gas: 4336897)\n[PASS] testBuybackAllFeesCorrectPoolAndBurnNoRecursiveTax() (gas: 797022)\n[PASS] testBuybackPartialFillRevertsWithoutLosingFees() (gas: 519295)\n[PASS] testBuybackReentrancyFails() (gas: 542248)\n[PASS] testBuybackTransferFailureRollsBackAndCanRetry() (gas: 667799)\n[PASS] testCannotInitializeWrongPoolOrFactoryOrTwice() (gas: 11793472)\n[PASS] testCreationAndRuntimeSizeLimits() (gas: 15390)\n[PASS] testDonationsAreClaimableByInRangeLP() (gas: 452616)\n[PASS] testDustExactOutputGrossUpAtEveryAntiSnipeRate() (gas: 452284437)\n[PASS] testExtremeSpecifiedAmountsFailCleanly() (gas: 82913)\n[PASS] testFlashManipulationCannotChangeHistoricalLimit() (gas: 548540)\n[PASS] testFuzzAllSwapModes(uint96,uint8,uint8) (runs: 256, μ: 340846, ~: 339808)\nLogs:\n  Bound result 993609262121026084871\n  Bound result 2\n\n[PASS] testInitializationAndPermissions() (gas: 70161)\n[PASS] testInvalidConstructorAddressesAndPermissions() (gas: 6151)\n[PASS] testNoFeesAndImmatureOracleFail() (gas: 356254)\n[PASS] testNoLiquidityDonationFailsWithoutCollectingFees() (gas: 203524)\n[PASS] testOracleCannotBeChurnedInOneBlockAndWrapsSafely() (gas: 23556686)\n[PASS] testOracleWeightsElapsedTicksInsteadOfTradeCount() (gas: 564632)\n[PASS] testPartialSpecifiedSwapRevertsFeesAtomically() (gas: 217609)\n[PASS] testPartialUnspecifiedSwapFeesOnlyFilledVolume() (gas: 300789)\n[PASS] testRejectsForeignSwapPool() (gas: 74411)\n[PASS] testUnauthorizedCallbacksAndUnlock() (gas: 154122)\n[PASS] testUnexpectedIMDTransfersCannotDiluteAccountedFees() (gas: 489860)\n[PASS] testUninitializedHookRejectsSwapAndBuyback() (gas: 11350199)\n[PASS] testUnsupportedSelectorsCannotGrantPrivileges() (gas: 120247)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 440.86ms (518.88ms CPU time)\n\nRan 3 test suites in 442.82ms (887.07ms CPU time): 61 tests passed, 0 failed, 0 skipped (61 total tests)\n","passed":true},{"durationMs":40,"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.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"SIMDTESTHook.buybackAndBurn()\",\"SIMDTESTHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":5,\"DEPENDENCIES.md\":11,\"README.md\":102,\"foundry.toml\":23,\"launch.json\":27,\"script/LaunchParameters.sol\":31,\"src/LaunchDistribution.sol\":18,\"src/SIMDTEST.sol\":56,\"src/SIMDTESTHook.sol\":313,\"test/SIMDTEST.t.sol\":121,\"test/SIMDTESTHook.t.sol\":527,\"test/helpers/LocalRouter.sol\":65,\"test/helpers/MockIMD.sol\":48,\"tools/check_launch.py\":52},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1182,"exitCode":0,"name":"slither","output":"[high/medium] weak-prng at src/SIMDTESTHook.sol:219: SIMDTESTHook.consult() (src/SIMDTESTHook.sol#219-235) uses a weak PRNG: \"diff < 0 && diff % duration != 0 (src/SIMDTESTHook.sol#230)\"\n[medium/medium] divide-before-multiply at src/SIMDTESTHook.sol:252: SIMDTESTHook._specifiedFees(int256) (src/SIMDTESTHook.sol#252-279) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/SIMDTESTHook.sol:252: SIMDTESTHook._specifiedFees(int256) (src/SIMDTESTHook.sol#252-279) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/SIMDTESTHook.sol:252: SIMDTESTHook._specifiedFees(int256) (src/SIMDTESTHook.sol#252-279) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/SIMDTESTHook.sol:252: SIMDTESTHook._specifiedFees(int256) (src/SIMDTESTHook.sol#252-279) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/SIMDTESTHook.sol:183: SIMDTESTHook.buybackAndBurn() (src/SIMDTESTHook.sol#183-195) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/SIMDTESTHook.sol:183: Reentrancy in SIMDTESTHook.buybackAndBurn() (src/SIMDTESTHook.sol#183-195):\n[medium/medium] uninitialized-local at src/SIMDTESTHook.sol:165: SIMDTESTHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes).fee (src/SIMDTESTHook.sol#165) is a local variable never initialized\n[medium/medium] unused-return at src/SIMDTESTHook.sol:281: SIMDTESTHook._collect(PoolKey,uint256,uint256) (src/SIMDTESTHook.sol#281-291) ignores return value by poolManager.donate(key,anti,0,) (src/SIMDTESTHook.sol#284)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:237: SIMDTESTHook.buybackPriceLimit() (src/SIMDTESTHook.sol#237-246) ignores return value by (spot,None,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#244)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:302: SIMDTESTHook._observe() (src/SIMDTESTHook.sol#302-312) ignores return value by (None,lastTick,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#306)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:281: SIMDTESTHook._collect(PoolKey,uint256,uint256) (src/SIMDTESTHook.sol#281-291) ignores return value by poolManager.donate(key,0,anti,) (src/SIMDTESTHook.sol#284)\n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:281: Reentrancy in SIMDTESTHook._collect(PoolKey,uint256,uint256) (src/SIMDTESTHook.sol#281-291):\n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:156: Reentrancy in SIMDTESTHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#156-179):\n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:197: Reentrancy in SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#197-215):\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:183: Reentrancy in SIMDTESTHook.buybackAndBurn() (src/SIMDTESTHook.sol#183-195):\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:281: Reentrancy in SIMDTESTHook._collect(PoolKey,uint256,uint256) (src/SIMDTESTHook.sol#281-291):\n[low/medium] timestamp at src/SIMDTESTHook.sol:219: SIMDTESTHook.consult() (src/SIMDTESTHook.sol#219-235) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTHook.sol:302: SIMDTESTHook._observe() (src/SIMDTESTHook.sol#302-312) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTHook.sol:237: SIMDTESTHook.buybackPriceLimit() (src/SIMDTESTHook.sol#237-246) uses timestamp for comparisons","passed":true},{"durationMs":261,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/SIMDTESTHook.sol:192: Reentrancy: State change after external call\n[high] unsafe-casting at src/SIMDTESTHook.sol:231: Unsafe Casting of integers\n[low] empty-require-revert at src/LaunchDistribution.sol:16: Empty `require()` / `revert()` Statement\n[low] large-numeric-literal at src/LaunchDistribution.sol:10: Large Numeric Literal (5 places)\n[low] local-variable-shadowing at src/SIMDTESTHook.sol:52: Local Variable Shadows State Variable\n[low] missing-inheritance at src/SIMDTEST.sol:5: Missing Inheritance\n[low] state-change-without-event at src/SIMDTESTHook.sol:197: State Change Without Event\n[low] unchecked-return at src/SIMDTESTHook.sol:284: Unchecked Return\n[low] uninitialized-local-variable at src/SIMDTESTHook.sol:223: Uninitialized Local Variable\n[low] unsafe-erc20-operation at src/LaunchDistribution.sol:16: Unsafe ERC20 Operation (2 places)","passed":true}],"detail":"launch.json is not a valid launch manifest: token.decimals: Invalid input: expected number, received undefined","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"4b255240c971daf046017d35484c74fcc1f3cc3c8757b58dd2c1ff8d7c3759ae","verifiedTreeHash":"0b62310de9b34f6e1b457f4761ebcb3a98bdf099","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":2297,"exitCode":0,"name":"build","output":"Compiling 74 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.14s\nCompiler run successful!\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/SIMDTESTHook.sol:61:40\n   │\n61 │     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:125:67\n    │\n125 │             return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(donation + buyback)), 0), 0);\n    │                                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:125:74\n    │\n125 │             return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(donation + buyback)), 0), 0);\n    │                                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:144:62\n    │\n144 │             if (int256(imdDelta) != params.amountSpecified + int256(donation + buyback)) revert PartialFill();\n    │                                                              ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:147:28\n    │\n147 │         uint256 executed = uint256(imdDelta < 0 ? -int256(imdDelta) : int256(imdDelta));\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:150:44\n    │\n150 │         return (IHooks.afterSwap.selector, int128(int256(donation_ + buyback_)));\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:150:51\n    │\n150 │         return (IHooks.afterSwap.selector, int128(int256(donation_ + buyback_)));\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[reentrancy-no-eth]: external call can be reentered before `buyingBack` is updated\n    ╭▸ src/SIMDTESTHook.sol:174:29\n    │\n174 │         burned = abi.decode(poolManager.unlock(abi.encode(amount, minTokensOut)), (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:168:13\n    │\n168 │         if (block.timestamp > deadline) revert Expired();\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:176:9\n    │\n176 │         emit BuybackBurned(msg.sender, amount, burned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:171:22\n    │\n171 │         if (amount > uint256(uint128(type(int128).max))) revert InvalidAmount();\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:171:30\n    │\n171 │         if (amount > uint256(uint128(type(int128).max))) revert InvalidAmount();\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:194:63\n    │\n194 │                 zeroForOne: imdIsCurrency0, amountSpecified: -int256(amount), sqrtPriceLimitX96: uint160(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:194:98\n    │\n194 │                 zeroForOne: imdIsCurrency0, amountSpecified: -int256(amount), sqrtPriceLimitX96: uint160(limit)\n    │                                                                                                  ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:200:30\n    │\n200 │         if (int256(paid) != -int256(amount)) revert PartialFill();\n    │                              ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:201:30\n    │\n201 │         if (received <= 0 || uint256(int256(received)) < minTokensOut) revert InsufficientBuybackOutput();\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:26\n    │\n207 │         uint256 burned = uint256(int256(received));\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:222:9\n    │\n222 │         emit FeesCollected(basis, donation, buyback);\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:220:13\n    │\n220 │             poolManager.donate(key, imdIsCurrency0 ? donation : 0, imdIsCurrency0 ? 0 : donation, \"\");\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:238:16\n    │\n238 │         return uint256(amount < 0 ? -amount : amount);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":182,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Launch.t.sol:LaunchTest\n[PASS] testLaunchPlanAllocationAndPoolSeeding() (gas: 24185355)\n[PASS] testLaunchPlanRejectsInvalidParameters() (gas: 417035)\n[PASS] testPredictedPoolCannotBeInitializedBeforeHookDeployment() (gas: 6193112)\n[PASS] testTokenAllowanceAndFailurePaths() (gas: 238810)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 41.30ms (42.43ms CPU time)\n\nRan 22 tests for test/SIMDTESTHook.t.sol:SIMDTESTHookTest\n[PASS] testAllFourSwapModesWithAndWithoutAntiSnipe() (gas: 3189713)\n[PASS] testBothCurrencyOrderings() (gas: 111796267)\n[PASS] testBuybackOutputDeadlineAndTransferFailuresAreAtomic() (gas: 766969)\n[PASS] testBuybackReentrancyCannotSpendTwice() (gas: 445503)\n[PASS] testBuybackRejectsPartialFillAndRetainsFees() (gas: 802826)\n[PASS] testBuybackSpendsAllFeesInCorrectPoolAndBurnsImmediately() (gas: 712254)\n[PASS] testDecayEveryBlockAndNeverRestarts() (gas: 3438358)\n[PASS] testDeploymentRejectsMissingCodeOrPairAsToken() (gas: 6148)\n[PASS] testDirectTransfersDoNotChangeAccountedFees() (gas: 505003)\n[PASS] testExactInputBuyDonationAndBalanceConservation() (gas: 563802)\n[PASS] testFeeCollectionReentrancyAndTransferFailure() (gas: 474503)\n[PASS] testFuzzFeeConservation(bool,bool,uint8,uint96) (runs: 256, μ: 360808, ~: 360578)\nLogs:\n  Bound result 1846051951270169678918\n\n[PASS] testInitializationPermissionsAndSize() (gas: 95147)\n[PASS] testInvalidAmountsAndUninitializedHook() (gas: 29673942)\n[PASS] testNoAdministrativeOrMintEntrypoints() (gas: 375910)\n[PASS] testNoForbiddenRuntimeOpcodes() (gas: 2239496)\n[PASS] testNoLiquidityDonationFailureDoesNotLoseFees() (gas: 267650)\n[PASS] testSpecifiedPairPartialFillRevertsWithoutFees() (gas: 233164)\n[PASS] testTinySwapsRoundFeesDown() (gas: 202766)\n[PASS] testUnauthorizedCallbacksAndUnlock() (gas: 157368)\n[PASS] testUnspecifiedPairPartialFillFeesUseExecutedAmount() (gas: 241932)\n[PASS] testWrongPoolAndInitializationHijackFail() (gas: 4086374)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 71.98ms (152.33ms CPU time)\n\nRan 2 test suites in 73.01ms (113.28ms CPU time): 26 tests passed, 0 failed, 0 skipped (26 total tests)\n","passed":true},{"durationMs":46,"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.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"SIMDTESTHook.buybackAndBurn()\",\"SIMDTESTHook.buybackAndBurn(uint256,uint256)\",\"SIMDTESTHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":3,\"README.md\":92,\"foundry.toml\":18,\"launch.json\":31,\"remappings.txt\":4,\"script/LaunchPlan.s.sol\":52,\"src/SIMDTEST.sol\":11,\"src/SIMDTESTHook.sol\":250,\"test/Launch.t.sol\":140,\"test/SIMDTESTHook.t.sol\":484,\"test/helpers/LocalPool.sol\":84},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1649,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/SIMDTESTHook.sol:165: SIMDTESTHook._buyback(uint256,uint256) (src/SIMDTESTHook.sol#165-177) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/SIMDTESTHook.sol:165: Reentrancy in SIMDTESTHook._buyback(uint256,uint256) (src/SIMDTESTHook.sol#165-177):\n[medium/medium] unused-return at src/SIMDTESTHook.sol:212: SIMDTESTHook._collect(PoolKey,uint256,uint256,uint256) (src/SIMDTESTHook.sol#212-223) ignores return value by poolManager.donate(key,0,donation,) (src/SIMDTESTHook.sol#220)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:179: SIMDTESTHook.unlockCallback(bytes) (src/SIMDTESTHook.sol#179-210) ignores return value by (price,None,None,None) = poolManager.getSlot0(poolId) (src/SIMDTESTHook.sol#182)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:212: SIMDTESTHook._collect(PoolKey,uint256,uint256,uint256) (src/SIMDTESTHook.sol#212-223) ignores return value by poolManager.donate(key,donation,0,) (src/SIMDTESTHook.sol#220)\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:165: Reentrancy in SIMDTESTHook._buyback(uint256,uint256) (src/SIMDTESTHook.sol#165-177):\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:212: Reentrancy in SIMDTESTHook._collect(PoolKey,uint256,uint256,uint256) (src/SIMDTESTHook.sol#212-223):\n[low/medium] timestamp at src/SIMDTESTHook.sol:165: SIMDTESTHook._buyback(uint256,uint256) (src/SIMDTESTHook.sol#165-177) uses timestamp for comparisons","passed":true},{"durationMs":439,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SIMDTEST.sol:9: Large Numeric Literal (3 places)\n[low] unchecked-return at src/SIMDTESTHook.sol:220: Unchecked Return\n[low] unsafe-erc20-operation at src/SIMDTESTHook.sol:205: Unsafe ERC20 Operation","passed":true}],"detail":"launch.json is not a valid launch manifest: hook.contract: expected a contract name; hook.permissions: Invalid input: expected array, received undefined; token.contract: expected a contract name; notes: Invalid input: expected string, received undefined","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"f8826bc0561608a44f346105d8ac0922553a29ba4d4121278334088e2a49e942","verifiedTreeHash":"d839c0bac1b6c245efca39e8acdd877548e71acb","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":1545,"exitCode":0,"name":"build","output":"Compiling 66 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.48s\nCompiler run successful!\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:139:46\n    │\n139 │             if (params.amountSpecified > 0) (uint256(params.amountSpecified) + totalFee).toInt128();\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:150:32\n    │\n150 │     ) 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:181:9\n    │\n181 │         emit FeesCollected(anti, buyback);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:159:57\n    │\n159 │             if (pairedDelta != params.amountSpecified + int256(anti + buyback)) revert PartialFill();\n    │                                                         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:162:28\n    │\n162 │             uint256 base = uint256(isBuy ? -pairedDelta : pairedDelta);\n    │                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/SIMDTESTHook.sol:169:13\n    │\n169 │             poolManager.donate(key, imdIsCurrency0 ? anti : 0, imdIsCurrency0 ? 0 : anti, \"\");\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n    ╭▸ src/SIMDTESTHook.sol:179:17\n    │\n179 │             if (IERC20(IMD).balanceOf(address(this)) != beforeBalance + buyback) revert SettlementMismatch();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SIMDTESTHook.sol:204:13\n    │\n204 │         if (block.timestamp > deadline) revert Expired();\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:214:9\n    │\n214 │         emit BuybackBurned(msg.sender, amount, tokensBurned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:227:35\n    │\n227 │                 amountSpecified: -int256(amount),\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:234:23\n    │\n234 │         if (spent != -int256(amount)) revert PartialFill();\n    │                       ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:235:30\n    │\n235 │         if (received <= 0 || uint256(received) < minimumTokensOut) revert InsufficientOutput();\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:244:62\n    │\n244 │         poolManager.take(Currency.wrap(token), BURN_ADDRESS, uint256(received));\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:245:27\n    │\n245 │         return abi.encode(uint256(received));\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:259:26\n    │\n259 │         uint256 amount = uint256(exactInput ? -params.amountSpecified : 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\n","passed":true},{"durationMs":183,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/SIMDTEST.t.sol:SIMDTESTTest\n[PASS] testFixedSupplyMetadataAndDistributionByLauncher() (gas: 231008)\n[PASS] testFuzzOrdinaryTransfersAndApprovals(uint96) (runs: 256, μ: 182356, ~: 182782)\n[PASS] testNoMintPauseBlacklistOrOwnershipFunctions() (gas: 260337)\n[PASS] testUnauthorizedSpendInsufficientBalanceAndZeroRecipient() (gas: 88237)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.85ms (4.94ms CPU time)\n\nRan 26 tests for test/SIMDTESTHook.t.sol:IMDAsCurrency0Test\n[PASS] testBuyExactInputAfterWindowOnlyHalfPercent() (gas: 250824)\n[PASS] testBuyExactInputOpeningFeesAndLPDonation() (gas: 458152)\n[PASS] testBuybackAllFeesCorrectPoolNoSelfTaxAndBurn() (gas: 717937)\n[PASS] testBuybackCombinesCashAndIMDClaims() (gas: 119069897)\n[PASS] testBuybackFailureRollsBackFeesAndBalances() (gas: 585729)\n[PASS] testBuybackInsufficientLiquidityPreservesFees() (gas: 1256641)\n[PASS] testCodeLimitsAndNoDestructiveOpcodes() (gas: 2097781)\n[PASS] testEveryAntiSnipeBlockAndUnchangedSupply() (gas: 177489)\n[PASS] testFactoryAndPoolBindingCannotBeHijacked() (gas: 30217028)\n[PASS] testFuzzFourSwapModesAndFeeConservation(bool,bool,uint96,uint8) (runs: 256, μ: 319451, ~: 318474)\n[PASS] testFuzzSequenceConservesFunds(bytes32,uint8) (runs: 256, μ: 1736850, ~: 1361451)\n[PASS] testIMDTransferFailureAndShortSettlementRollback() (gas: 722822)\n[PASS] testInitRollbackOnBadPriceAndStartAtBlockZero() (gas: 29668315)\n[PASS] testInitializationPermissionsAndIdentity() (gas: 70492)\n[PASS] testInvalidConstructorInputsAndWrongPermissionBits() (gas: 6229)\n[PASS] testNestedUnlockCannotConsumeFees() (gas: 452503)\n[PASS] testNoFeesNoPoolAndUnsolicitedTokens() (gas: 1078661)\n[PASS] testNoHookOwnerWithdrawalUpgradeOrFeeSetters() (gas: 554807)\n[PASS] testPartialSpecifiedSwapRevertsWithoutCollectingFee() (gas: 162327)\n[PASS] testPartialUnspecifiedSwapPaysOnlyExecutedAmount() (gas: 248516)\n[PASS] testReentrantIMDTransfersCannotEnterBuyback() (gas: 496779)\n[PASS] testSaltMinerMatchesActualCreationAndRejectsUndeployedHook() (gas: 4586664)\n[PASS] testShortFeeCollectionCannotCreateUnbackedAccounting() (gas: 534116)\n[PASS] testTokenOnlyPoolFirstBuyAccruesAndSpendsIMDClaims() (gas: 119116370)\n[PASS] testUnauthorizedCallbacksAndUnexpectedUnlock() (gas: 156002)\n[PASS] testWrongPoolSwapAndOversizedAmountRejected() (gas: 126221)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 125.85ms (310.87ms CPU time)\n\nRan 26 tests for test/SIMDTESTHook.t.sol:IMDAsCurrency1Test\n[PASS] testBuyExactInputAfterWindowOnlyHalfPercent() (gas: 244397)\n[PASS] testBuyExactInputOpeningFeesAndLPDonation() (gas: 451782)\n[PASS] testBuybackAllFeesCorrectPoolNoSelfTaxAndBurn() (gas: 711056)\n[PASS] testBuybackCombinesCashAndIMDClaims() (gas: 22387080)\n[PASS] testBuybackFailureRollsBackFeesAndBalances() (gas: 577787)\n[PASS] testBuybackInsufficientLiquidityPreservesFees() (gas: 1248885)\n[PASS] testCodeLimitsAndNoDestructiveOpcodes() (gas: 2097781)\n[PASS] testEveryAntiSnipeBlockAndUnchangedSupply() (gas: 177489)\n[PASS] testFactoryAndPoolBindingCannotBeHijacked() (gas: 2696150)\n[PASS] testFuzzFourSwapModesAndFeeConservation(bool,bool,uint96,uint8) (runs: 256, μ: 319716, ~: 311817)\n[PASS] testFuzzSequenceConservesFunds(bytes32,uint8) (runs: 256, μ: 1679537, ~: 1332848)\n[PASS] testIMDTransferFailureAndShortSettlementRollback() (gas: 714025)\n[PASS] testInitRollbackOnBadPriceAndStartAtBlockZero() (gas: 2472816)\n[PASS] testInitializationPermissionsAndIdentity() (gas: 70492)\n[PASS] testInvalidConstructorInputsAndWrongPermissionBits() (gas: 6229)\n[PASS] testNestedUnlockCannotConsumeFees() (gas: 445414)\n[PASS] testNoFeesNoPoolAndUnsolicitedTokens() (gas: 146681013)\n[PASS] testNoHookOwnerWithdrawalUpgradeOrFeeSetters() (gas: 547718)\n[PASS] testPartialSpecifiedSwapRevertsWithoutCollectingFee() (gas: 156066)\n[PASS] testPartialUnspecifiedSwapPaysOnlyExecutedAmount() (gas: 254697)\n[PASS] testReentrantIMDTransfersCannotEnterBuyback() (gas: 489520)\n[PASS] testSaltMinerMatchesActualCreationAndRejectsUndeployedHook() (gas: 37441089)\n[PASS] testShortFeeCollectionCannotCreateUnbackedAccounting() (gas: 521296)\n[PASS] testTokenOnlyPoolFirstBuyAccruesAndSpendsIMDClaims() (gas: 22350264)\n[PASS] testUnauthorizedCallbacksAndUnexpectedUnlock() (gas: 156193)\n[PASS] testWrongPoolSwapAndOversizedAmountRejected() (gas: 126592)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 125.88ms (297.70ms CPU time)\n\nRan 3 test suites in 126.75ms (256.58ms CPU time): 56 tests passed, 0 failed, 0 skipped (56 total tests)\n","passed":true},{"durationMs":27,"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.buybackAndBurn()\",\"SIMDTESTHook.buybackAndBurn(uint256,uint256)\",\"SIMDTESTHook.unlockCallback(bytes)\"],\"files\":{\".gitignore\":4,\"README.md\":100,\"foundry.toml\":21,\"launch.json\":32,\"script/MineHookSalt.s.sol\":32,\"src/SIMDTEST.sol\":11,\"src/SIMDTESTHook.sol\":271,\"test/SIMDTEST.t.sol\":80,\"test/SIMDTESTHook.t.sol\":605,\"test/helpers/PoolDriver.sol\":73,\"test/helpers/TestBase.sol\":44,\"test/helpers/TestIMD.sol\":39},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1107,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/SIMDTESTHook.sol:144: Reentrancy in SIMDTESTHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#144-183):\n[medium/high] incorrect-equality at src/SIMDTESTHook.sol:202: SIMDTESTHook._buyback(uint256,uint256) (src/SIMDTESTHook.sol#202-215) uses a dangerous strict equality:\n[medium/medium] unused-return at src/SIMDTESTHook.sol:121: SIMDTESTHook.beforeSwap(address,PoolKey,IPoolManager.SwapParams,bytes) (src/SIMDTESTHook.sol#121-142) ignores return value by (uint256(params.amountSpecified) + totalFee).toInt128() (src/SIMDTESTHook.sol#139)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:202: SIMDTESTHook._buyback(uint256,uint256) (src/SIMDTESTHook.sol#202-215) ignores return value by amount.toInt128() (src/SIMDTESTHook.sol#207)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:144: SIMDTESTHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#144-183) ignores return value by poolManager.donate(key,0,anti,) (src/SIMDTESTHook.sol#169)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:144: SIMDTESTHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#144-183) ignores return value by poolManager.donate(key,anti,0,) (src/SIMDTESTHook.sol#169)\n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:202: Reentrancy in SIMDTESTHook._buyback(uint256,uint256) (src/SIMDTESTHook.sol#202-215):\n[low/medium] reentrancy-benign at src/SIMDTESTHook.sol:144: Reentrancy in SIMDTESTHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#144-183):\n[low/medium] timestamp at src/SIMDTESTHook.sol:202: SIMDTESTHook._buyback(uint256,uint256) (src/SIMDTESTHook.sol#202-215) uses timestamp for comparisons","passed":true},{"durationMs":249,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/SIMDTESTHook.sol:169: Reentrancy: State change after external call (2 places)\n[low] large-numeric-literal at src/SIMDTEST.sol:9: Large Numeric Literal (2 places)\n[low] non-reentrant-not-first at src/SIMDTESTHook.sol:150: `nonReentrant` is Not the First Modifier\n[low] state-change-without-event at src/SIMDTESTHook.sol:217: State Change Without Event\n[low] unchecked-return at src/SIMDTESTHook.sol:169: Unchecked Return (2 places)","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":"fe2bf5dae29de79973b7fced3c75b633eea811c08ed31a7c0e87dbb675c44648","verifiedTreeHash":"4dc9cebd79f68310f86409b4a9a5e940f80e504e","verifierVersion":"0.1.0+ad90ce4c"}]}