{"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":"3a8766ac-141d-4497-b555-3ea3fe79af36","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":"636e90cf0c987edd4246e1635ae3c97b6842b1307941313a04fe7acf5ae536a7","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":"accepted"},{"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":"failed"},{"acceptedSubmissionHash":"cbd7b239e6fb9cb0024c101e043ac20a2cf78bf26f26d3056d2436a555087e6f","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":"accepted"}],"objective":"[SIMD-LAUNCH]\nToken name: SIMDTEST\nToken symbol: SIMDTEST\n\nThe token SIMDTEST (symbol SIMDTEST) is launched with a total supply of 1,000,000,000 tokens with 18 decimals, 90% supplied initially to the pool paired with IMD, and 10% allocated to the swarm as required. The token itself is a standard ERC-20 with no taxes, limits, pausing, or minting beyond initial supply. A hook contract SIMDTESTHook is deployed and integrated with the Uniswap v4 pool that charges fees on swaps with these mechanics: 1) Anti-snipe fee: for the first 10 blocks after pool opening, an additional swap fee begins at 30% and linearly decays to 0%, with the full anti-snipe fee amount donated back into the pool's liquidity range via the PoolManager's donate function. This fee applies on both swaps and increases effective costs for early trades but strengthens liquidity. 2) Staking vault fee: an additional fixed 1% swap fee on top of the pool's standard 1.25% fee is charged on the paired currency (IMD) and sent to a dedicated staking vault contract SIMDTESTVault. Holders can stake SIMDTEST tokens in SIMDTESTVault to earn IMD rewards distributed pro rata according to stake size and staking duration. Staking and unstaking can occur at any time, and holders can claim accrued IMD rewards on demand. No portion of fees are burned; all fees above pool fees are either donated as liquidity or sent to the staking vault. The hook has no owner, upgradeability, or pausing capability. The hook acts on Uniswap v4 hook callbacks for swaps and pool opening to implement the anti-snipe timing and fees. The SIMD 1% creator fee is handled externally as per SIMD Launchpad rules and is not implemented in the hook. The hook and vault must be tested thoroughly covering: correct anti-snipe fee calculation and linear decay over first 10 blocks, verifying anti-snipe fees are donated to liquidity without burning paired currency; proper charging and routing of the 1% staking vault fee; staking and unstaking functionality working correctly in SIMDTESTVault; accurate proportional distribution of IMD rewards for all stakers over time; ensuring no unexpected owner controls or upgrade paths exist, and compliance with all SIMD launchpad fixed rules on fees and token mechanics.\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, SIMDTESTVault. 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.","parentJobId":null,"planHash":"b2f7ef7485699c458954c4fad6f75f9050e0925ae178fa033eb13cf19bc341b9","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"3a8766ac-141d-4497-b555-3ea3fe79af36","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-966-simdtest"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51740","feedbackHash":"ace2def4f0f16a58fd2a5410f1fa3c796a40596dfec741aec9734db0c89193f7","nodeKey":"build_contract_project","submissionHash":"636e90cf0c987edd4246e1635ae3c97b6842b1307941313a04fe7acf5ae536a7","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51516","feedbackHash":"c3d50ca846dc5cb1a81e299213fe89df2ccb719bd27aa7db93a4f680e53d8250","nodeKey":"write_foundry_tests","submissionHash":"cbd7b239e6fb9cb0024c101e043ac20a2cf78bf26f26d3056d2436a555087e6f","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"804a6c33682d5375525c090084fb4c8e41c967b33cdacb9d015da3ca8d1ebd7f","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"f2451a58fc20b3462ce292fdf2783efe0e0665dc638010d09df39c5664ad8973","device":"4ece7e789ed37442","findings":[],"hash":"636e90cf0c987edd4246e1635ae3c97b6842b1307941313a04fe7acf5ae536a7","nodeId":"69cb90e7-e58d-4e66-ac17-469f63cc9ec0","outcome":"completed","summary":"Implemented the token, hook, vault, vendored dependencies, tests, and deployment documentation.\n\nValidation passed: `forge build`, clean offline build, `forge test` **62 passing**, and `forge fmt --check`.\n\n[README.md](/root/.identitymd-1975/work/3a8766ac-141d-4497-b555-3ea3fe79af36/69cb90e7-e58d-4e66-ac17-469f63cc9ec0/README.md) documents the one-day reward stream, partial-fill restrictions, and external launchpad allocation responsibilities. No mainnet deployment was performed.","treeHash":"fa0b59f3ce941a44f1dbaec3bf7571efb2bb8571","usage":{"cachedInputTokens":1610880,"inputTokens":104096,"model":"gpt-6-astra","outputTokens":33027,"runtime":"codex","turns":7,"wallClockMs":984382}},{"artifacts":[],"attempt":1,"bundleHash":"6c6200d7290442134fa42bfaa0a86083ac54b0da952c446104a32c8c62f840d9","device":"c0f94d5c3d395bef","findings":[],"hash":"cbd7b239e6fb9cb0024c101e043ac20a2cf78bf26f26d3056d2436a555087e6f","nodeId":"de93c035-4c06-4fe1-b912-d6b50f3fbaf6","outcome":"completed","summary":"Added adversarial tests for fee boundaries, reward distribution, rollback, reentrancy, and both currency orderings. All changes are under `test/`.\n\nValidation passed:\n\n- `forge build`\n- `forge test`: 86 passed, 0 failed\n- 9,000 fuzz cases and 49,152 invariant calls\n\nNo reproducible contract defects found. Mainnet fork validation and external launchpad allocation remain unverified.","treeHash":"d5b518d78b1fa1bf4888fcc095b1f0a5995bcb85","usage":{"cachedInputTokens":981888,"inputTokens":83243,"model":"gpt-6-astra","outputTokens":19119,"runtime":"codex","turns":6,"wallClockMs":578170}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"7b7c27166477ddd8","findings":[],"hash":"e4250974b426c62f5502e97da88d6613b26704a9a9a7973b44c91f3f1dd0eb1c","nodeId":"40db017e-c764-4eea-be3e-f556af998b7d","outcome":"failed","summary":"needs input: The launch's initial pool price is missing. launch.json requires pool.initialPrice as a decimal sqrtPriceX96 and supports no price placeholder. The repository's 1:1 test price is not an approved launch price. — What decimal sqrtPriceX96 should pool.initialPrice use for the SIMDTEST/IMD launch pool, with currency0 and currency1 ordered by token address as required by Uniswap v4?","treeHash":null,"usage":{"cachedInputTokens":301568,"inputTokens":24501,"model":"gpt-6-astra","outputTokens":2051,"runtime":"codex","turns":3,"wallClockMs":84492}}],"verification":[{"checks":[{"durationMs":3356,"exitCode":0,"name":"build","output":"Compiling 92 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.20s\nCompiler run successful!\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SIMDTESTHook.sol:128:77\n    │\n128 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n    │                                                                             ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:123:60\n    │\n123 │             if (params.amountSpecified > 0 && base + fee > 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:123:68\n    │\n123 │             if (params.amountSpecified > 0 && base + fee > 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:128:63\n    │\n128 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 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:128:70\n    │\n128 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTVault.sol:146:9\n    │\n146 │         emit StreamUpdated(rewardRate, periodFinish, queuedRewards);\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/SIMDTESTVault.sol:77:9\n   │\n77 │         emit Staked(msg.sender, 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/SIMDTESTVault.sol:75:13\n   │\n75 │         if (stakingToken.balanceOf(address(this)) - beforeBalance != amount) revert UnsupportedTransfer();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/SIMDTESTVault.sol:91:13\n   │\n91 │             emit StreamUpdated(0, periodFinish, queuedRewards);\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/SIMDTESTVault.sol:94:9\n   │\n94 │         emit Unstaked(msg.sender, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTHook.sol:158:9\n    │\n158 │         emit FeesCharged(base, anti, staking);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:147:56\n    │\n147 │             int256 expected = params.amountSpecified + int256(totalFee);\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/SIMDTESTVault.sol:104:13\n    │\n104 │             emit RewardPaid(msg.sender, 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:152:13\n    │\n152 │             poolManager.donate(key, imdIs0 ? anti : 0, imdIs0 ? 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:159:68\n    │\n159 │         return (IHooks.afterSwap.selector, specified ? int128(0) : int128(int256(totalFee)));\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:159:75\n    │\n159 │         return (IHooks.afterSwap.selector, specified ? int128(0) : int128(int256(totalFee)));\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:186:16\n    │\n186 │         return uint256(value < 0 ? -value : value);\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/SIMDTESTVault.sol:120:9\n    │\n120 │         emit RewardNotified(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SIMDTESTVault.sol:137:16\n    │\n137 │         return block.timestamp < periodFinish ? (periodFinish - block.timestamp) * rewardRate : 0;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Vault.t.sol:48:17\n   │\n48 │         vm.warp(block.timestamp + 100);\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/Vault.t.sol:77:17\n   │\n77 │         vm.warp(block.timestamp + DAY / 4);\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/Vault.t.sol:79:17\n   │\n79 │         vm.warp(block.timestamp + DAY / 2);\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/Vault.t.sol:111:17\n    │\n111 │         vm.warp(block.timestamp + 5 * DAY);\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/Vault.t.sol:115:17\n    │\n115 │         vm.warp(block.timestamp + DAY / 2);\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/Vault.t.sol:119:17\n    │\n119 │         vm.warp(block.timestamp + 5 * DAY);\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/Vault.t.sol:132:17\n    │\n132 │         vm.warp(block.timestamp + DAY / 2);\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/Vault.t.sol:261:17\n    │\n261 │         vm.warp(block.timestamp + delay);\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":1145,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/TokenAndRestrictions.t.sol:TokenAndRestrictionsTest\n[PASS] testNoAdministrativeSelectors() (gas: 827581)\n[PASS] testRuntimeOpcodesAndDeploymentSizeLimits() (gas: 4851996)\n[PASS] testTokenMetadataSupplyAndTransfers() (gas: 384062)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 45.44ms (9.43ms CPU time)\n\nRan 16 tests for test/Vault.t.sol:VaultTest\n[PASS] testDirectTokenDonationsDoNotChangePrincipalOrEarned() (gas: 567052)\n[PASS] testFalseTransferAndTaxedStakeRevertAtomically() (gas: 390849)\n[PASS] testFlashStakeEarnsNoRewards() (gas: 831542)\n[PASS] testFuzzConservation(uint96,uint96,uint96,uint32) (runs: 256, μ: 994794, ~: 1002704)\nLogs:\n  Bound result 22660445294934379940\n  Bound result 98758775361044795797923\n  Bound result 1801645766\n  Bound result 20\n\n[PASS] testInvalidConstructor() (gas: 6182)\n[PASS] testInvalidStakeAndWithdrawal() (gas: 197032)\n[PASS] testLateStakeCannotCapturePastRewards() (gas: 637215)\n[PASS] testNoStakerQueueAndPauseResume() (gas: 1088060)\n[PASS] testProportionalStakeSizes() (gas: 699922)\n[PASS] testReentrancyOnStakeUnstakeAndRewardTransferIsBlocked() (gas: 855378)\n[PASS] testRepeatedFundingPreservesVestedAndFutureRewards() (gas: 618634)\n[PASS] testStaggeredStakeDurationAndWithdrawal() (gas: 794272)\n[PASS] testStakeUnstakeAndClaimWithoutLockup() (gas: 781029)\n[PASS] testTinyFundingIsQueuedWithoutDivisionLoss() (gas: 614843)\n[PASS] testTransferFailurePreservesWithdrawalAndClaimAccounting() (gas: 882191)\n[PASS] testUnauthenticatedAndUnfundedNotifications() (gas: 313384)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 45.53ms (33.18ms CPU time)\n\nRan 20 tests for test/Hook.t.sol:HookTest\n[PASS] testAllSwapModesAfterDecay() (gas: 1753945)\n[PASS] testAllSwapModesAtOpening() (gas: 1802353)\n[PASS] testCannotResetOpeningOrAttachAnotherPool() (gas: 83442)\n[PASS] testConstructorRejectsBadConfigurationAndWrongFlags() (gas: 6151)\n[PASS] testDecayEveryBlockAndBothDirections() (gas: 11402496)\n[PASS] testDonationIsCollectibleByLP() (gas: 621676)\n[PASS] testFuzzFeesAndConservation(bool,bool,uint96,uint8) (runs: 256, μ: 510282, ~: 504264)\nLogs:\n  Bound result 3857751029113\n  Bound result 0\n\n[PASS] testIMDTransferFailureRollsBackDonation() (gas: 214089)\n[PASS] testInitializationAndPermissions() (gas: 97479)\n[PASS] testInitializerAndUnopenedPool() (gas: 4072632)\n[PASS] testInvalidSwapAmountFails() (gas: 146649)\n[PASS] testMissingLiquidityRevertsWithoutFees() (gas: 556759)\n[PASS] testPartialExactIMDOutputRevertsWithoutFees() (gas: 146922)\n[PASS] testPartialSpecifiedIMDRevertsWithoutTakingFees() (gas: 161551)\n[PASS] testPartialUnspecifiedIMDChargesOnlyExecutedAmount() (gas: 276964)\n[PASS] testRejectsWrongCurrencyFeeAndSpacing() (gas: 4046534)\n[PASS] testSettlementFailureRollsBackPoolAndRewards() (gas: 316774)\n[PASS] testSwapFeesBecomeTimeWeightedClaimableRewards() (gas: 912063)\n[PASS] testTinyFeesRoundDown() (gas: 403228)\n[PASS] testUnauthorizedCallbacks() (gas: 83679)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 45.53ms (70.71ms CPU time)\n\nRan 2 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testSaltFinderDeploysExactPredictedHook() (gas: 23978420)\nLogs:\n  CREATE2 salt:\n  0x00000000000000000000000000000000000000000000000000000000000055b3\n  Hook: 0x68EEF0499A3a18841ce30263D3B1E0BEB24d20cc\n\n[PASS] testSaltFinderEmptySearchFails() (gas: 2504479)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 53.45ms (31.21ms CPU time)\n\nRan 20 tests for test/Hook.t.sol:HookIMDFirstTest\n[PASS] testAllSwapModesAfterDecay() (gas: 1753370)\n[PASS] testAllSwapModesAtOpening() (gas: 1801614)\n[PASS] testCannotResetOpeningOrAttachAnotherPool() (gas: 83383)\n[PASS] testConstructorRejectsBadConfigurationAndWrongFlags() (gas: 6151)\n[PASS] testDecayEveryBlockAndBothDirections() (gas: 11398185)\n[PASS] testDonationIsCollectibleByLP() (gas: 627811)\n[PASS] testFuzzFeesAndConservation(bool,bool,uint96,uint8) (runs: 256, μ: 510201, ~: 509135)\nLogs:\n  Bound result 9418\n  Bound result 20\n\n[PASS] testIMDTransferFailureRollsBackDonation() (gas: 220365)\n[PASS] testInitializationAndPermissions() (gas: 97479)\n[PASS] testInitializerAndUnopenedPool() (gas: 4072621)\n[PASS] testInvalidSwapAmountFails() (gas: 145978)\n[PASS] testMissingLiquidityRevertsWithoutFees() (gas: 563176)\n[PASS] testPartialExactIMDOutputRevertsWithoutFees() (gas: 141013)\n[PASS] testPartialSpecifiedIMDRevertsWithoutTakingFees() (gas: 167534)\n[PASS] testPartialUnspecifiedIMDChargesOnlyExecutedAmount() (gas: 270899)\n[PASS] testRejectsWrongCurrencyFeeAndSpacing() (gas: 4046534)\n[PASS] testSettlementFailureRollsBackPoolAndRewards() (gas: 305037)\n[PASS] testSwapFeesBecomeTimeWeightedClaimableRewards() (gas: 918258)\n[PASS] testTinyFeesRoundDown() (gas: 409749)\n[PASS] testUnauthorizedCallbacks() (gas: 83440)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 76.84ms (56.75ms CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS]\nVaultInvariantTest invariants:\n[PASS] invariantPrincipalFullyBacked\n[PASS] invariantRewardsConservedAndSolvent\n VaultInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | advance  | 1625  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 1665  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 1593  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | stake    | 1648  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | unstake  | 1661  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 2911\n  Bound result 78772063789442257196\n  Bound result 8\n  Bound result 2187\n  Bound result 13\n  Bound result 62\n  Bound result 2367\n  Bound result 4127\n  Bound result 2478893115\n  Bound result 2458\n  Bound result 999999999999999999337\n  Bound result 2323\n  Bound result 2178\n  Bound result 911713701266691\n  Bound result 5908885\n  Bound result 3328\n  Bound result 1227\n  Bound result 5318\n  Bound result 241\n  Bound result 9\n  Bound result 0\n  Bound result 1963\n  Bound result 1228\n  Bound result 5958\n  Bound result 502\n  Bound result 2296948586\n  Bound result 51797\n  Bound result 271\n  Bound result 13\n  Bound result 3657\n  Bound result 15629\n  Bound result 617\n  Bound result 4306\n  Bound result 393\n  Bound result 59121\n  Bound result 2158\n  Bound result 20\n  Bound result 20\n  Bound result 18596029894173561750\n  Bound result 2007\n  Bound result 181949478\n  Bound result 5676\n  Bound result 4528\n  Bound result 110717\n  Bound result 4997\n  Bound result 37343336854257609119\n  Bound result 1\n  Bound result 2431\n  Bound result 1086409\n  Bound result 51082009986533694\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.04s (1.04s CPU time)\n\nRan 6 test suites in 1.04s (1.31s CPU time): 62 tests passed, 0 failed, 0 skipped (62 total tests)\n","passed":true},{"durationMs":52,"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)\",\"SIMDTESTVault.claim()\",\"SIMDTESTVault.notifyRewardAmount(uint256)\",\"SIMDTESTVault.stake(uint256)\",\"SIMDTESTVault.unstake(uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":106,\"docs/REVIEW.md\":47,\"foundry.toml\":30,\"script/HookAddress.s.sol\":36,\"src/SIMDTEST.sol\":11,\"src/SIMDTESTHook.sol\":188,\"src/SIMDTESTVault.sol\":148,\"test/Deployment.t.sol\":32,\"test/Hook.t.sol\":335,\"test/TokenAndRestrictions.t.sol\":84,\"test/Vault.t.sol\":279,\"test/VaultInvariant.t.sol\":102,\"test/helpers/HookFixture.sol\":88,\"test/helpers/MockERC20.sol\":56,\"test/helpers/PoolRouter.sol\":58},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1660,"exitCode":0,"name":"slither","output":"[high/medium] weak-prng at src/SIMDTESTVault.sol:140: SIMDTESTVault._schedule(uint256) (src/SIMDTESTVault.sol#140-147) uses a weak PRNG: \"queuedRewards = budget % REWARD_DURATION (src/SIMDTESTVault.sol#143)\"\n[medium/medium] uninitialized-local at src/SIMDTESTHook.sol:118: SIMDTESTHook.beforeSwap(address,PoolKey,IPoolManager.SwapParams,bytes).fee (src/SIMDTESTHook.sol#118) is a local variable never initialized\n[medium/medium] unused-return at src/SIMDTESTHook.sol:131: SIMDTESTHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#131-160) ignores return value by poolManager.donate(key,0,anti,) (src/SIMDTESTHook.sol#152)\n[medium/medium] unused-return at src/SIMDTESTHook.sol:131: SIMDTESTHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#131-160) ignores return value by poolManager.donate(key,anti,0,) (src/SIMDTESTHook.sol#152)\n[low/medium] reentrancy-events at src/SIMDTESTHook.sol:131: Reentrancy in SIMDTESTHook.afterSwap(address,PoolKey,IPoolManager.SwapParams,BalanceDelta,bytes) (src/SIMDTESTHook.sol#131-160):\n[low/medium] timestamp at src/SIMDTESTVault.sol:97: SIMDTESTVault.claim() (src/SIMDTESTVault.sol#97-106) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTVault.sol:67: SIMDTESTVault.stake(uint256) (src/SIMDTESTVault.sol#67-78) uses timestamp for comparisons\n[low/medium] timestamp at src/SIMDTESTVault.sol:136: SIMDTESTVault._remaining() (src/SIMDTESTVault.sol#136-138) uses timestamp for comparisons","passed":true},{"durationMs":445,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/SIMDTESTVault.sol:113: Reentrancy: State change after external call\n[low] large-numeric-literal at src/SIMDTEST.sol:9: Large Numeric Literal (2 places)\n[low] unchecked-return at src/SIMDTESTHook.sol:152: Unchecked Return\n[low] unused-public-function at src/SIMDTESTVault.sol:62: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"636e90cf0c987edd4246e1635ae3c97b6842b1307941313a04fe7acf5ae536a7","verifiedTreeHash":"fa0b59f3ce941a44f1dbaec3bf7571efb2bb8571","verifierVersion":"0.1.0+ad90ce4c"},{"checks":[{"durationMs":6516,"exitCode":0,"name":"build","output":"Compiling 95 files with Solc 0.8.26\nSolc 0.8.26 finished in 6.32s\nCompiler run successful!\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/SIMDTESTHook.sol:128:77\n    │\n128 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n    │                                                                             ━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTVault.sol:146:9\n    │\n146 │         emit StreamUpdated(rewardRate, periodFinish, queuedRewards);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:123:60\n    │\n123 │             if (params.amountSpecified > 0 && base + fee > 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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/SIMDTESTVault.sol:77:9\n   │\n77 │         emit Staked(msg.sender, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:123:68\n    │\n123 │             if (params.amountSpecified > 0 && base + fee > 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[incorrect-strict-equality]: dangerous strict equality check on an externally-influenced value\n   ╭▸ src/SIMDTESTVault.sol:75:13\n   │\n75 │         if (stakingToken.balanceOf(address(this)) - beforeBalance != amount) revert UnsupportedTransfer();\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/incorrect-strict-equality\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:128:63\n    │\n128 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 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:128:70\n    │\n128 │         return (IHooks.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/SIMDTESTVault.sol:91:13\n   │\n91 │             emit StreamUpdated(0, periodFinish, queuedRewards);\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/SIMDTESTVault.sol:94:9\n   │\n94 │         emit Unstaked(msg.sender, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTVault.sol:104:13\n    │\n104 │             emit RewardPaid(msg.sender, amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/SIMDTESTHook.sol:158:9\n    │\n158 │         emit FeesCharged(base, anti, staking);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/SIMDTESTHook.sol:147:56\n    │\n147 │             int256 expected = params.amountSpecified + int256(totalFee);\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[unused-return]: return value of an external call is not used\n    ╭▸ src/SIMDTESTHook.sol:152:13\n    │\n152 │             poolManager.donate(key, imdIs0 ? anti : 0, imdIs0 ? 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:159:68\n    │\n159 │         return (IHooks.afterSwap.selector, specified ? int128(0) : int128(int256(totalFee)));\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:159:75\n    │\n159 │         return (IHooks.afterSwap.selector, specified ? int128(0) : int128(int256(totalFee)));\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:186:16\n    │\n186 │         return uint256(value < 0 ? -value : value);\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/SIMDTESTVault.sol:120:9\n    │\n120 │         emit RewardNotified(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/SIMDTESTVault.sol:137:16\n    │\n137 │         return block.timestamp < periodFinish ? (periodFinish - block.timestamp) * rewardRate : 0;\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/Vault.t.sol:48:17\n   │\n48 │         vm.warp(block.timestamp + 100);\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/Vault.t.sol:77:17\n   │\n77 │         vm.warp(block.timestamp + DAY / 4);\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/Vault.t.sol:79:17\n   │\n79 │         vm.warp(block.timestamp + DAY / 2);\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/Vault.t.sol:111:17\n    │\n111 │         vm.warp(block.timestamp + 5 * DAY);\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/Vault.t.sol:115:17\n    │\n115 │         vm.warp(block.timestamp + DAY / 2);\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/Vault.t.sol:119:17\n    │\n119 │         vm.warp(block.timestamp + 5 * DAY);\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/Vault.t.sol:132:17\n    │\n132 │         vm.warp(block.timestamp + DAY / 2);\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/Vault.t.sol:262:17\n    │\n262 │         vm.warp(block.timestamp + delay);\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/VaultAdversarial.t.sol:70:17\n   │\n70 │         vm.warp(block.timestamp + delay);\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/VaultAdversarial.t.sol:124:17\n    │\n124 │         vm.warp(block.timestamp + 100 days);\n    │         ────────━━━━━━━━━━━━━━━──────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/VaultAdversarial.t.sol:126:17\n    │\n126 │         vm.warp(block.timestamp + 13);\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/VaultAdversarial.t.sol:131:17\n    │\n131 │         vm.warp(block.timestamp + 100 days);\n    │         ────────━━━━━━━━━━━━━━━──────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/VaultAdversarial.t.sol:134:17\n    │\n134 │         vm.warp(block.timestamp + DAY);\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/VaultAdversarial.t.sol:204:21\n    │\n204 │             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":6787,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/TokenAndRestrictions.t.sol:TokenAndRestrictionsTest\n[PASS] testNoAdministrativeSelectors() (gas: 827581)\n[PASS] testRuntimeOpcodesAndDeploymentSizeLimits() (gas: 4851996)\n[PASS] testTokenMetadataSupplyAndTransfers() (gas: 384062)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 44.08ms (13.18ms CPU time)\n\nRan 2 tests for test/Deployment.t.sol:DeploymentTest\n[PASS] testSaltFinderDeploysExactPredictedHook() (gas: 23978447)\nLogs:\n  CREATE2 salt:\n  0x00000000000000000000000000000000000000000000000000000000000055b3\n  Hook: 0x68EEF0499A3a18841ce30263D3B1E0BEB24d20cc\n\n[PASS] testSaltFinderEmptySearchFails() (gas: 2504479)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 62.45ms (31.15ms CPU time)\n\nRan 7 tests for test/HookBoundary.t.sol:HookIMDFirstBoundaryTest\n[PASS] testClockUsesBlocksRegardlessOfTimestampOrSwapCount() (gas: 541573)\n[PASS] testConstructorRejectsWrongAssetsAndMissingCode() (gas: 6206)\n[PASS] testFuzzCallbackArithmeticUpToInt128Limit(uint128,uint16,bool,bool) (runs: 1000, μ: 51697, ~: 52970)\nLogs:\n  Bound result 8388608\n  Bound result 32\n\n[PASS] testFuzzEveryPoolKeyComponentBoundInEveryCallback(uint8) (runs: 1000, μ: 106867, ~: 106393)\nLogs:\n  Bound result 0\n\n[PASS] testRejectsSignedEdgesBeforeNegationAndGrossUp() (gas: 148751)\n[PASS] testSettlementFailurePreservesAlreadyRunningRewardsAndLPFees() (gas: 1507979)\n[PASS] testUnopenedAfterSwapCannotDonateOrFundVault() (gas: 3925004)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 159.70ms (215.81ms CPU time)\n\nRan 7 tests for test/HookBoundary.t.sol:HookBoundaryTest\n[PASS] testClockUsesBlocksRegardlessOfTimestampOrSwapCount() (gas: 541729)\n[PASS] testConstructorRejectsWrongAssetsAndMissingCode() (gas: 6206)\n[PASS] testFuzzCallbackArithmeticUpToInt128Limit(uint128,uint16,bool,bool) (runs: 1000, μ: 51701, ~: 52959)\nLogs:\n  Bound result 6819871219889089911164\n  Bound result 0\n\n[PASS] testFuzzEveryPoolKeyComponentBoundInEveryCallback(uint8) (runs: 1000, μ: 107065, ~: 106632)\nLogs:\n  Bound result 0\n\n[PASS] testRejectsSignedEdgesBeforeNegationAndGrossUp() (gas: 148795)\n[PASS] testSettlementFailurePreservesAlreadyRunningRewardsAndLPFees() (gas: 1519224)\n[PASS] testUnopenedAfterSwapCannotDonateOrFundVault() (gas: 3925195)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 159.73ms (248.06ms CPU time)\n\nRan 20 tests for test/Hook.t.sol:HookTest\n[PASS] testAllSwapModesAfterDecay() (gas: 1755225)\n[PASS] testAllSwapModesAtOpening() (gas: 1803889)\n[PASS] testCannotResetOpeningOrAttachAnotherPool() (gas: 83474)\n[PASS] testConstructorRejectsBadConfigurationAndWrongFlags() (gas: 6151)\n[PASS] testDecayEveryBlockAndBothDirections() (gas: 11412096)\n[PASS] testDonationIsCollectibleByLP() (gas: 622092)\n[PASS] testFuzzFeesAndConservation(bool,bool,uint96,uint8) (runs: 1000, μ: 510876, ~: 504769)\nLogs:\n  Bound result 999999999999999999999931\n  Bound result 11\n\n[PASS] testIMDTransferFailureRollsBackDonation() (gas: 214121)\n[PASS] testInitializationAndPermissions() (gas: 97511)\n[PASS] testInitializerAndUnopenedPool() (gas: 4072664)\n[PASS] testInvalidSwapAmountFails() (gas: 146713)\n[PASS] testMissingLiquidityRevertsWithoutFees() (gas: 556791)\n[PASS] testPartialExactIMDOutputRevertsWithoutFees() (gas: 146954)\n[PASS] testPartialSpecifiedIMDRevertsWithoutTakingFees() (gas: 161583)\n[PASS] testPartialUnspecifiedIMDChargesOnlyExecutedAmount() (gas: 277060)\n[PASS] testRejectsWrongCurrencyFeeAndSpacing() (gas: 4046534)\n[PASS] testSettlementFailureRollsBackPoolAndRewards() (gas: 316806)\n[PASS] testSwapFeesBecomeTimeWeightedClaimableRewards() (gas: 912447)\n[PASS] testTinyFeesRoundDown() (gas: 403548)\n[PASS] testUnauthorizedCallbacks() (gas: 83711)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 160.37ms (155.90ms CPU time)\n\nRan 20 tests for test/Hook.t.sol:HookIMDFirstTest\n[PASS] testAllSwapModesAfterDecay() (gas: 1754650)\n[PASS] testAllSwapModesAtOpening() (gas: 1803150)\n[PASS] testCannotResetOpeningOrAttachAnotherPool() (gas: 83415)\n[PASS] testConstructorRejectsBadConfigurationAndWrongFlags() (gas: 6151)\n[PASS] testDecayEveryBlockAndBothDirections() (gas: 11407785)\n[PASS] testDonationIsCollectibleByLP() (gas: 628227)\n[PASS] testFuzzFeesAndConservation(bool,bool,uint96,uint8) (runs: 1000, μ: 510562, ~: 509868)\nLogs:\n  Bound result 2335\n  Bound result 4\n\n[PASS] testIMDTransferFailureRollsBackDonation() (gas: 220397)\n[PASS] testInitializationAndPermissions() (gas: 97511)\n[PASS] testInitializerAndUnopenedPool() (gas: 4072653)\n[PASS] testInvalidSwapAmountFails() (gas: 146042)\n[PASS] testMissingLiquidityRevertsWithoutFees() (gas: 563208)\n[PASS] testPartialExactIMDOutputRevertsWithoutFees() (gas: 141045)\n[PASS] testPartialSpecifiedIMDRevertsWithoutTakingFees() (gas: 167566)\n[PASS] testPartialUnspecifiedIMDChargesOnlyExecutedAmount() (gas: 270995)\n[PASS] testRejectsWrongCurrencyFeeAndSpacing() (gas: 4046534)\n[PASS] testSettlementFailureRollsBackPoolAndRewards() (gas: 305069)\n[PASS] testSwapFeesBecomeTimeWeightedClaimableRewards() (gas: 918642)\n[PASS] testTinyFeesRoundDown() (gas: 410069)\n[PASS] testUnauthorizedCallbacks() (gas: 83472)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 161.00ms (123.55ms CPU time)\n\nRan 16 tests for test/Vault.t.sol:VaultTest\n[PASS] testDirectTokenDonationsDoNotChangePrincipalOrEarned() (gas: 567052)\n[PASS] testFalseTransferAndTaxedStakeRevertAtomically() (gas: 390849)\n[PASS] testFlashStakeEarnsNoRewards() (gas: 831542)\n[PASS] testFuzzConservation(uint96,uint96,uint96,uint32) (runs: 1000, μ: 994759, ~: 1002704)\nLogs:\n  Bound result 157848365416\n  Bound result 865454041163762521897\n  Bound result 50581800969281538\n  Bound result 6666\n\n[PASS] testInvalidConstructor() (gas: 6182)\n[PASS] testInvalidStakeAndWithdrawal() (gas: 197032)\n[PASS] testLateStakeCannotCapturePastRewards() (gas: 637215)\n[PASS] testNoStakerQueueAndPauseResume() (gas: 1088060)\n[PASS] testProportionalStakeSizes() (gas: 699922)\n[PASS] testReentrancyOnStakeUnstakeAndRewardTransferIsBlocked() (gas: 855378)\n[PASS] testRepeatedFundingPreservesVestedAndFutureRewards() (gas: 618634)\n[PASS] testStaggeredStakeDurationAndWithdrawal() (gas: 794272)\n[PASS] testStakeUnstakeAndClaimWithoutLockup() (gas: 781029)\n[PASS] testTinyFundingIsQueuedWithoutDivisionLoss() (gas: 614843)\n[PASS] testTransferFailurePreservesWithdrawalAndClaimAccounting() (gas: 882191)\n[PASS] testUnauthenticatedAndUnfundedNotifications() (gas: 313384)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 161.24ms (165.90ms CPU time)\n\nRan 8 tests for test/VaultAdversarial.t.sol:VaultAdversarialTest\n[PASS] testAllMutatingReentrantCallsBlockedDuringClaim() (gas: 1961149)\n[PASS] testConstructorRejectsRewardAddressWithoutCode() (gas: 8235)\n[PASS] testEmptyQueueRemainderSurvivesRepeatedExitAndRestake() (gas: 1202022)\n[PASS] testFuzzFullSupplyStakeAndOneWeiRewardRate(uint32) (runs: 1000, μ: 638448, ~: 646571)\nLogs:\n  Bound result 120\n\n[PASS] testFuzzTimeWeightedRewardsAcrossJoinWithdrawalAndRefill(uint96,uint96,uint96,uint32,uint96) (runs: 1000, μ: 1365706, ~: 1372185)\nLogs:\n  Bound result 4406059680285517\n  Bound result 366525466626683180484150\n  Bound result 17258170938134684\n  Bound result 6185\n  Bound result 3730539368308804986\n\n[PASS] testRejectedNotificationCannotCheckpointOrExtendExistingStream() (gas: 771067)\n[PASS] testRejectedRewardTransferAfterFullExitCanBeRetried() (gas: 721293)\n[PASS] testRejectedStakePreservesAlreadyEarnedRewardsAndPrincipal() (gas: 723166)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 161.19ms (288.25ms CPU time)\n\nRan 1 test for test/VaultInvariant.t.sol:VaultInvariantTest\n[PASS]\nVaultInvariantTest invariants:\n[PASS] invariantPrincipalFullyBacked\n[PASS] invariantRewardsConservedAndSolvent\n VaultInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| VaultHandler | advance  | 3253  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | claim    | 3302  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | fund     | 3287  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | stake    | 3287  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| VaultHandler | unstake  | 3255  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 601\n  Bound result 6724\n  Bound result 10000\n  Bound result 30\n  Bound result 300\n  Bound result 939\n  Bound result 2422\n  Bound result 2777\n  Bound result 491\n  Bound result 12132\n  Bound result 2902472270800205\n  Bound result 10\n  Bound result 3070\n  Bound result 854895829366287153649\n  Bound result 256\n  Bound result 4872\n  Bound result 2637\n  Bound result 10\n  Bound result 2015\n  Bound result 3957502250\n  Bound result 4998\n  Bound result 715\n  Bound result 4763\n  Bound result 1\n  Bound result 2731\n  Bound result 225\n  Bound result 2926\n  Bound result 2236\n  Bound result 4322\n  Bound result 5467\n  Bound result 3539\n  Bound result 4660\n  Bound result 5136\n  Bound result 60\n  Bound result 3188052988\n  Bound result 598\n  Bound result 91\n  Bound result 18446744073709551614\n  Bound result 2902472270806372\n  Bound result 4109\n  Bound result 2704\n  Bound result 3957502251\n  Bound result 86398\n  Bound result 4813\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.18s (2.16s CPU time)\n\nRan 1 test for test/LaunchInvariant.t.sol:LaunchInvariantTest\n[PASS]\nLaunchInvariantTest invariants:\n[PASS] invariantClosedSystemConservesBothCurrenciesAndSettlesEverySwap\n[PASS] invariantPrincipalAndRewardsRemainBacked\n LaunchInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+---------------+-------+---------+----------╮\n| Contract      | Selector      | Calls | Reverts | Discards |\n+============================================================+\n| LaunchHandler | advance       | 2389  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | claim         | 2320  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | collectLP     | 2309  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | donateToVault | 2348  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | stake         | 2227  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | swap          | 2403  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | unstake       | 2388  | 0       | 0        |\n╰---------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 100000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 51816880588029389934\n  Bound result 51816880591596527153\n  Bound result 1\n  Bound result 7711\n  Bound result 3458\n  Bound result 429281758975731071\n  Bound result 8175\n  Bound result 11455\n  Bound result 220550044752101\n  Bound result 1\n  Bound result 12215\n  Bound result 14980\n  Bound result 13905\n  Bound result 8806\n  Bound result 6944\n  Bound result 17564\n  Bound result 13849\n  Bound result 27805297748\n  Bound result 1\n  Bound result 5260\n  Bound result 9770\n  Bound result 3\n  Bound result 86394\n  Bound result 27835183955873\n  Bound result 1\n  Bound result 49589\n  Bound result 15431\n  Bound result 12551\n  Bound result 1\n  Bound result 8450\n  Bound result 5113\n  Bound result 70764\n  Bound result 0\n  Bound result 2663\n  Bound result 661\n  Bound result 427679556812186524878\n  Bound result 10884\n  Bound result 16250\n  Bound result 999948183091545414205320\n  Bound result 12168\n  Bound result 2383\n  Bound result 96664527\n  Bound result 10223272276297012906\n  Bound result 7929\n  Bound result 522854404\n  Bound result 645\n  Bound result 974\n  Bound result 10910\n  Bound result 415955170\n  Bound result 20\n  Bound result 9223372036854775807\n  Bound result 3\n  Bound result 2119\n  Bound result 14462\n  Bound result 37959847135770285810\n  Bound result 999938959719508975399165\n  Bound result 27805248290\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.17s (6.13s CPU time)\n\nRan 1 test for test/LaunchInvariant.t.sol:LaunchIMDFirstInvariantTest\n[PASS]\nLaunchIMDFirstInvariantTest invariants:\n[PASS] invariantClosedSystemConservesBothCurrenciesAndSettlesEverySwap\n[PASS] invariantPrincipalAndRewardsRemainBacked\n LaunchIMDFirstInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------+---------------+-------+---------+----------╮\n| Contract      | Selector      | Calls | Reverts | Discards |\n+============================================================+\n| LaunchHandler | advance       | 2389  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | claim         | 2320  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | collectLP     | 2309  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | donateToVault | 2348  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | stake         | 2227  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | swap          | 2403  | 0       | 0        |\n|---------------+---------------+-------+---------+----------|\n| LaunchHandler | unstake       | 2388  | 0       | 0        |\n╰---------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 100000000000000000000\n  Bound result 1000000000000000000000\n  Bound result 3360\n  Bound result 6560\n  Bound result 3\n  Bound result 7711\n  Bound result 3457\n  Bound result 10747\n  Bound result 429281758975731071\n  Bound result 18881\n  Bound result 1524507274\n  Bound result 220550044752101\n  Bound result 1\n  Bound result 3430\n  Bound result 3033974658\n  Bound result 391255412550230885\n  Bound result 12920\n  Bound result 17565\n  Bound result 84\n  Bound result 27805297748\n  Bound result 1\n  Bound result 5260\n  Bound result 3869952580\n  Bound result 0\n  Bound result 86394\n  Bound result 27835183955873\n  Bound result 0\n  Bound result 49589\n  Bound result 4227495888\n  Bound result 4834\n  Bound result 3\n  Bound result 149\n  Bound result 15036\n  Bound result 70764\n  Bound result 0\n  Bound result 5782\n  Bound result 3792478064\n  Bound result 3558\n  Bound result 427679556812186524878\n  Bound result 10966\n  Bound result 16242\n  Bound result 9531317964230768655\n  Bound result 12231\n  Bound result 2959\n  Bound result 15428\n  Bound result 10800506906542787735\n  Bound result 681374999996998484605\n  Bound result 637\n  Bound result 3792180441\n  Bound result 975\n  Bound result 2828\n  Bound result 718\n  Bound result 20\n  Bound result 2305843009213693951\n  Bound result 3\n  Bound result 2121\n  Bound result 345963678037307652042653\n  Bound result 346052877530402633764353\n  Bound result 7225474959244570612\n  Bound result 681375000021011537837\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 6.66s (6.63s CPU time)\n\nRan 11 test suites in 6.67s (16.07s CPU time): 86 tests passed, 0 failed, 0 skipped (86 total tests)\n","passed":true},{"durationMs":71,"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)\",\"SIMDTESTVault.claim()\",\"SIMDTESTVault.notifyRewardAmount(uint256)\",\"SIMDTESTVault.stake(uint256)\",\"SIMDTESTVault.unstake(uint256)\"],\"files\":{\".gitignore\":4,\"DEPENDENCIES.md\":14,\"README.md\":106,\"docs/REVIEW.md\":47,\"foundry.toml\":30,\"script/HookAddress.s.sol\":36,\"src/SIMDTEST.sol\":11,\"src/SIMDTESTHook.sol\":188,\"src/SIMDTESTVault.sol\":148,\"test/ADVERSARIAL.md\":36,\"test/Deployment.t.sol\":32,\"test/Hook.t.sol\":337,\"test/HookBoundary.t.sol\":195,\"test/LaunchInvariant.t.sol\":303,\"test/TokenAndRestrictions.t.sol\":84,\"test/Vault.t.sol\":280,\"test/VaultAdversarial.t.sol\":262,\"test/VaultInvariant.t.sol\":105,\"test/helpers/HookFixture.sol\":93,\"test/helpers/MockERC20.sol\":56,\"test/helpers/PoolRouter.sol\":58},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"cbd7b239e6fb9cb0024c101e043ac20a2cf78bf26f26d3056d2436a555087e6f","verifiedTreeHash":"d5b518d78b1fa1bf4888fcc095b1f0a5995bcb85","verifierVersion":"0.1.0+ad90ce4c"}]}