{"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":"d505332d-aa70-44d5-a674-ca1f44e72db7","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"73abd71de033eacd22525deb2b54dbb5bddae1fe6b5d59f570401202a7f72b36","dependsOn":["build_contract_project"],"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":"accepted"},{"acceptedSubmissionHash":"9d13a4c6c692beb6905f9a61c926390e59ddc7b30be6bd4de72f75d28c1f0765","dependsOn":["build_contract_project"],"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":"accepted"},{"acceptedSubmissionHash":"64338c7e823d154b1f671127e3b3571dc500fbeee1d0fde4b1dc752a240b79ce","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":"accepted"},{"acceptedSubmissionHash":"7222b02faea7b7600d8ef8a36a8d1e967f304822806bff9b00759988717f5015","dependsOn":["build_contract_project"],"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":"accepted"},{"acceptedSubmissionHash":"cd959544287bb2c8d76a1cece93fa34dcf215204b714c6f82a6fb1036f33c7f5","dependsOn":["build_contract_project"],"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":"accepted"},{"acceptedSubmissionHash":"ca0b6c05bcfc624b995cf18afc3ea175aa3504f6e945d201ac2ad808691ddcc0","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"be87e672deda0797377a8bc0b42058deeb0c6658ad5a012a061ed5e4d3f984ea","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"d115b5ac3a2caee8d180dd229104bc1e937436b2445caf6a845821afee1ddf27","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":"A launch-guard hook: for the first 24 hours after initialization, beforeSwap rejects any swap that buys more than 1% of the launch token's total supply; after that it allows everything. No owner.","parentJobId":null,"planHash":"cf1e404890321e3bc499b7bd24271384b7d210c545c04e3728188d7141ff470a","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"d505332d-aa70-44d5-a674-ca1f44e72db7","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-554-launch-guard-hook-first-24"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51338","feedbackHash":"7e3e0f0cbedbc98e922097207b22944fc9243c8b3a1c9dbebe3f765ab1e495c0","nodeKey":"audit_economics","submissionHash":"73abd71de033eacd22525deb2b54dbb5bddae1fe6b5d59f570401202a7f72b36","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51427","feedbackHash":"372528c6402e8f16f66853ebd051c12ffdcf68b674c2207520ef62885518e7b1","nodeKey":"audit_flow","submissionHash":"9d13a4c6c692beb6905f9a61c926390e59ddc7b30be6bd4de72f75d28c1f0765","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50957","feedbackHash":"d466ae0a28261e0954839d5b588ca5b4c1f43b848809083088eb8fa2ba26cf3a","nodeKey":"audit_judge","submissionHash":"a0608065c90f32179ddd444f8b1dd76c5be878852b429516d5163477705e8267","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51046","feedbackHash":"27b5221452133d4c02b59674b95e90f7626afe26b3b9dab1e3c242878e3c990b","nodeKey":"audit_judge","submissionHash":"bcff02692f1ef6df8d982e2aaa349ec63187713a4c5c93b003f2f6f2f6c65d09","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50955","feedbackHash":"42c5e60fb7906868a5658b16f3738f63db5fa2ddba72331b02bb1b704677029a","nodeKey":"audit_judge","submissionHash":"64338c7e823d154b1f671127e3b3571dc500fbeee1d0fde4b1dc752a240b79ce","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51018","feedbackHash":"c823127d0484eadbb80b85a264d2f8551524d781a967b30d4f93402aa3183345","nodeKey":"audit_math","submissionHash":"7222b02faea7b7600d8ef8a36a8d1e967f304822806bff9b00759988717f5015","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51345","feedbackHash":"96844963c9fb95605ce7e96ce139d960a8ee9350453fbc203d73a3cbadaff179","nodeKey":"audit_permissions","submissionHash":"cd959544287bb2c8d76a1cece93fa34dcf215204b714c6f82a6fb1036f33c7f5","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50962","feedbackHash":"65896ca99c83d842264dcef479ba1a415ef132a219761b41ce89bd62335267c6","nodeKey":"build_contract_project","submissionHash":"ca0b6c05bcfc624b995cf18afc3ea175aa3504f6e945d201ac2ad808691ddcc0","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51046","feedbackHash":"4bd5b0a5e2f045414fc4b29e41d18233a7132d2a9bfbd9264d793e1aa88d19b5","nodeKey":"manifest","submissionHash":"be87e672deda0797377a8bc0b42058deeb0c6658ad5a012a061ed5e4d3f984ea","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50959","feedbackHash":"6fcdd08c55ebd1e7ddd4eec340d203766d918b14e8dbc23afeb8676dcead91d8","nodeKey":"manifest","submissionHash":"84d3f2e2f030507574e1ad4a4a27b067a46f3e28e48d3acbe702452e81f39782","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50956","feedbackHash":"78567817d5e8db625617764d76199759855d63f649a2dfb718b2dba8655c143c","nodeKey":"manifest","submissionHash":"82342240ac5371e64bd0b2caaf84315f6126e75598231432bd43074dcbfcc3c8","tag1":"verification:checks","tag2":"acceptance-v2","value":0},{"agentId":"50962","feedbackHash":"2d804c50218e6f94c57bfb937d3f39b82858d4d483ce62f3b62f2d6db7c8057d","nodeKey":"write_foundry_tests","submissionHash":"d115b5ac3a2caee8d180dd229104bc1e937436b2445caf6a845821afee1ddf27","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"4b6bce0033c325de7d203d0f0dfefb8984af1f19b26016e870909dddfc4e2ae1","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"68104e14503948ea8bd8b06719230f3342cd6b9da439ead17c5b2b4421db5f22","device":"3f6a9bdd601cb99f","findings":[],"hash":"2cb761c5d74f2317a335da9b26a1c6df0256ca8262ec87a9fda4e151a180cfd2","nodeId":"139897a3-eb81-4431-917e-2d1f59d4a805","outcome":"completed","summary":"Added boundary and failure-path tests, plus stateful invariants for guard behavior, settlement, token balances, and allowances. All changes are under `test/`.\n\n`forge build` and `forge test` pass: **97 tests**, including **98,304 invariant calls**, with no failures or skips.\n\nNo reproducible defects found.","treeHash":"e9ffdc22708adbde79dcb506a004461409e9ab7e","usage":{"cachedInputTokens":1207296,"inputTokens":108303,"model":"gpt-6-astra","outputTokens":15928,"runtime":"codex","turns":6,"wallClockMs":569743}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"3c7630b22a73c1fb","findings":[{"citation":"resolved","description":"Settles prior finding ab0fcce42f1b70cd4553deced7c689a2b030fa6c2cdf7d632e570087708d70c1: not fixed. The author's answer agrees the deployment fails and disputes only that it can be repaired within a manifest-only assignment; that does not change the state of the tree. The manifest's second constructor argument is still the literal zero address, and src/LaunchGuardHook.sol:36-37 still reverts `if (address(manager).code.length == 0 || address(token) == address(0)) revert InvalidConfiguration();`. Only \"$poolManager\" is substituted by the deployer, so the launch transaction described by this manifest constructs the hook with token = 0x0, the constructor reverts with InvalidConfiguration() (selector 0xc52a9bd3), no hook code is deployed, and the pool cannot be initialized. The code change since the last round (deferring the token code / totalSupply read to _beforeInitialize) resolved the separate fresh-EVM admission issue and is correct, but it does not touch this binding. Resolution requires a verified LaunchToken address in constructorArgs[1] (predicted from the actual factory's CREATE nonce or CREATE2 salt and init-code hash), or a coordinated change to the hook binding and the deployer's substitution interface. The notes field documents the blocker but cannot substitute an address. Severity stays medium: no funds are at risk, but the launch as described cannot deploy.","line":5,"path":"launch.json","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {Hooks} from \"v4-core/src/libraries/Hooks.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency} from \"v4-core/src/types/Currency.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {LaunchGuardHook} from \"src/LaunchGuardHook.sol\";\nimport {LaunchToken} from \"src/LaunchToken.sol\";\n\n/// @notice Deploys the hook exactly as the manifest describes it: constructorArgs[0] resolved to the chain's\n/// PoolManager, constructorArgs[1] the literal 0x0000000000000000000000000000000000000000 from launch.json.\n/// Fails on the current tree because the constructor reverts InvalidConfiguration for a zero token; passes once\n/// the manifest binds a real token (or the hook/deployer agree on another binding).\ncontract ManifestZeroTokenBlockerTest is Test {\n    uint160 internal constant FLAGS = Hooks.BEFORE_INITIALIZE_FLAG | Hooks.BEFORE_SWAP_FLAG; // 0x2080\n    // launch.json: hook.constructorArgs[1]\n    address internal constant MANIFEST_TOKEN_ARG = 0x0000000000000000000000000000000000000000;\n    // launch.json: pool\n    address internal constant MANIFEST_PAIRED = 0x0000000000000000000000000000000000000000;\n    uint24 internal constant MANIFEST_FEE = 3000;\n    int24 internal constant MANIFEST_SPACING = 60;\n    uint160 internal constant MANIFEST_SQRT_PRICE = 79299443975792720780679863727831;\n\n    IPoolManager internal manager;\n\n    function setUp() public {\n        manager = IPoolManager(address(new PoolManager(address(this))));\n    }\n\n    function test_manifestConstructorArgsDeployHookAndInitializePool() public {\n        bytes memory creationCode = abi.encodePacked(\n            type(LaunchGuardHook).creationCode, abi.encode(manager, IERC20(MANIFEST_TOKEN_ARG))\n        );\n        address at = _create2AtFlags(creationCode);\n        assertTrue(at != address(0), \"manifest constructor args: hook deployment reverted\");\n        assertEq(address(LaunchGuardHook(at).launchToken()), MANIFEST_TOKEN_ARG);\n    }\n\n    /// @dev Positive control: the same bytes with a real LaunchToken deploy and initialize the manifest pool.\n    function test_control_realTokenDeploysAndInitializes() public {\n        LaunchToken token = new LaunchToken();\n        bytes memory creationCode =\n            abi.encodePacked(type(LaunchGuardHook).creationCode, abi.encode(manager, IERC20(address(token))));\n        address at = _create2AtFlags(creationCode);\n        assertTrue(at != address(0), \"control deployment reverted\");\n        PoolKey memory key = PoolKey(\n            Currency.wrap(MANIFEST_PAIRED),\n            Currency.wrap(address(token)),\n            MANIFEST_FEE,\n            MANIFEST_SPACING,\n            LaunchGuardHook(at)\n        );\n        vm.warp(1_000_000);\n        manager.initialize(key, MANIFEST_SQRT_PRICE);\n        assertEq(LaunchGuardHook(at).maxBuyAmount(), 10_000_000 ether);\n        assertEq(LaunchGuardHook(at).guardEndsAt(key.toId()), 1_086_400);\n    }\n\n    function _create2AtFlags(bytes memory creationCode) internal returns (address at) {\n        bytes32 initCodeHash = keccak256(creationCode);\n        for (uint256 i; i < 300_000; ++i) {\n            address predicted = address(\n                uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(this), bytes32(i), initCodeHash))))\n            );\n            if (uint160(predicted) & Hooks.ALL_HOOK_MASK != FLAGS) continue;\n            bytes32 salt = bytes32(i);\n            assembly (\"memory-safe\") {\n                at := create2(0, add(creationCode, 0x20), mload(creationCode), salt)\n            }\n            return at;\n        }\n        revert(\"no salt produced an address carrying the declared flags\");\n    }\n}","reproduction":"Fresh local EVM. Deploy PoolManager(address(this)). Take hook.constructorArgs from launch.json: resolve \"$poolManager\" to that manager and use constructorArgs[1] = 0x0000000000000000000000000000000000000000 verbatim. Build creation code abi.encodePacked(type(LaunchGuardHook).creationCode, abi.encode(manager, IERC20(address(0)))), mine a CREATE2 salt so the predicted address has flags 0x2080 (the manifest permissions beforeInitialize + beforeSwap), and create2 it. Expected: a hook deploys bound to the launch token. Actual: BaseHook address validation passes, then the constructor reverts 0xc52a9bd3 (InvalidConfiguration()) and create2 returns address(0). Positive control in the same test: identical bytes with a freshly deployed LaunchToken deploy successfully and manager.initialize with the manifest pool (currency0 native 0x0, currency1 GUARD, fee 3000, tickSpacing 60, sqrtPriceX96 79299443975792720780679863727831) at timestamp 1000000 succeeds with maxBuyAmount 10000000000000000000000000 and guardEndsAt 1086400. Ran: forge test --offline --match-path test/scratch/ManifestZeroTokenBlocker.t.sol -vvvv. Result: test_manifestConstructorArgsDeployHookAndInitializePool FAILS with 'manifest constructor args: hook deployment reverted' (trace shows [Revert] 0xc52a9bd3 in the constructor); test_control_realTokenDeploysAndInitializes PASSES.","severity":"medium","snippet":"    \"constructorArgs\": [\"$poolManager\", \"0x0000000000000000000000000000000000000000\"],","title":"Still open: launch.json binds the hook to address(0) as the launch token, so the manifest-described deployment reverts in the hook constructor"},{"citation":"resolved","description":"Three specialists reported the same root cause; merged here as one informational note. The guard is stateless across swaps: it keeps no per-pool, per-block, per-sender or per-transaction tally, so splitting an order into swaps of exactly maxBuyAmount buys any multiple of 1% in one transaction at the same total price plus a few thousand gas per extra call. This matches the brief ('rejects any swap that buys more than 1%') and README line 14 ('This is a per-swap limit'), so it is not a defect against the stated design and does not block the launch. Recorded so the requester can decide whether per-swap granularity is the intended guarantee; a cumulative per-pool/per-block counter would be a design change.","line":82,"path":"src/LaunchGuardHook.sol","reproduction":"Pool (quote token as currency0, GUARD as currency1, fee 3000, spacing 60, hook) initialized at timestamp 1000000 with full-range liquidity 1e26; maxBuyAmount == 10000000e18. Inside the window, a router calls manager.unlock once and in unlockCallback calls manager.swap(key, SwapParams(true, +10000000e18, MIN_SQRT_PRICE+1), '') five times, then settles. Expected if the cap were aggregate: revert. Actual: all five pass and the router receives exactly 50000000e18 GUARD (5% of supply) in one transaction, while the single swap with amountSpecified = +50000000e18 reverts. Ran test/scratch/InfoLeads.t.sol::test_fiveCappedSwapsInOneTxBuyFivePercent: PASS. The repository's own test_limitIsPerSwapNotPerWallet shows the two-swap version.","severity":"info","snippet":"                if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {","title":"Per-swap cap gives no aggregate protection: N capped swaps in one unlock buy N% of supply during the guard window (merged from audit_permissions, audit_flow, audit_economics)"},{"citation":"resolved","description":"Trust assumption, not a code defect. The only guard on beforeInitialize is BaseHook's onlyPoolManager; the sender argument is ignored and there is no deployer binding, which the no-owner brief requires. It is safe only because the launch factory deploys the hook and initializes its pool in one transaction (README step 4 and the platform description). If the deployer ever splits those steps, anyone can initialize the exact intended PoolKey at an arbitrary sqrtPriceX96 first; the factory's initialize then reverts with PoolAlreadyInitialized and the 24-hour window has already started at the outsider's chosen time. No change needed while atomic deployment is enforced.","line":47,"path":"src/LaunchGuardHook.sol","reproduction":"Deploy LaunchToken t2 and LaunchGuardHook h2 (CREATE2 at a 0x2080 address, args (manager, t2)); do not initialize. At timestamp 1500000, vm.prank(0xBAD); manager.initialize(PoolKey(native 0x0, t2, 3000, 60, h2), 2^96 * 100). Expected by the factory: only its own call sets the opening price. Actual: succeeds, h2.guardEndsAt(poolId) == 1586400, and the factory's manager.initialize(sameKey, 2^96) reverts. Ran test/scratch/InfoLeads.t.sol::test_outsiderInitializesIntendedPoolWhenDeploymentIsNotAtomic: PASS.","severity":"info","snippet":"    function _beforeInitialize(address, PoolKey calldata key, uint160) internal override returns (bytes4) {","title":"Initialization is permissionless by design: if hook deployment and pool initialization are ever split across transactions, an outsider can set the opening price and start the timer (from audit_permiss"}],"hash":"64338c7e823d154b1f671127e3b3571dc500fbeee1d0fde4b1dc752a240b79ce","nodeId":"3868a85f-5ad5-4dba-a1cf-6da6d2e7e05d","outcome":"completed","summary":"The review is complete and written to `.imd-findings.json`. No source, configuration or manifest file was changed; the only writes are the findings file and scratch tests under test/scratch/.\n\n**Prior finding: still open.** The manifest's second constructor argument is still the literal zero address, and the constructor at src/LaunchGuardHook.sol:36 still reverts on a zero token. I reran the reproduction from launch.json's actual values: the hook constructed with those arguments reverts with InvalidConfiguration (selector 0xc52a9bd3) and no code is deployed, while a positive control with a real LaunchToken deploys and initializes the manifest pool. The author's answer agrees the deployment fails and disputes only scope, which does not change the tree. It stays at medium with the failing scratch test attached as proof.\n\n**Specialist findings settled:**\n- The two medium reports that the constructor required token code are already fixed. Both attached proofs pass on this tree, so they were dropped.\n- Three reports of the per-swap cap aggregating across swaps were merged into one informational note. Reproduced: five capped swaps in one unlock buy 5% of supply. This matches the brief and README, so it is not a defect.\n- The permissionless initialization report was kept as an informational trust assumption, reproduced with an outsider initializing an un-initialized pool at its own price.\n- The gas overhead note was dropped as a documented non-defect that I did not re-measure.\n\n**Own pass:** traced the preview library against the vendored Pool.swap (fee derivation, exact-output 100% fee check, price-limit checks, tick clamping, liquidity transition sign, early stop) and found no divergence. The slither and aderyn leads are design choices, not defects. Full offline suite: 110 project and proof tests passed, with only my manifest-blocker scratch test failing as intended.\n\n**Coverage:** all 13 entry points answered as holds, plus rows for the manifest binding (finding 1), the dropped constructor finding, and the preview equivalence check.\n\nThe launch remains blocked on supplying a verified LaunchToken address in launch.json, or a coordinated hook and deployer change.","treeHash":null,"usage":{"cachedInputTokens":887544,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":19908,"runtime":"claude","turns":24,"wallClockMs":273076}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"30a6c1a419ef4f9c","findings":[{"citation":"resolved","description":"The constructor reverts InvalidConfiguration when address(token).code.length == 0 and then calls token.totalSupply(). The pinned admission floor (.imd/reads/protected/univ4_hook/Hook.protected.t.sol, setUp) deploys only a PoolManager (etched at IMD_POOL_MANAGER) and then CREATE2-deploys the attested creation code, which already carries the token address as a constructor argument. No contract exists at that token address in the harness, so create2 returns address(0) and setUp's require(at != address(0), \"hook deployment reverted\") fails, failing all three protected hook tests. The same precondition forces a strict token-before-hook ordering on the launch factory; a factory that precomputes the token address and deploys the hook first, or deploys both in a different order, reverts. The guard's math only needs the number 1e25 (1% of the fixed 1e27 supply); reading it from the token at construction is not required. Fix preserving behaviour: drop the code-length check for the token and derive the cap lazily (e.g. in _beforeInitialize, when the token must exist because the pool references it) or from the fixed supply constant, keeping the manager check.","line":35,"path":"src/LaunchGuardHook.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {Hooks} from \"v4-core/src/libraries/Hooks.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {LaunchGuardHook} from \"src/LaunchGuardHook.sol\";\n\n/// @notice Mirrors the admission floor's setUp: a manager exists, the hook is created from its creation\n/// code with the constructor arguments it was attested with, and nothing else is deployed. The token\n/// address baked into those arguments has no code in that environment.\ncontract HookConstructorWithoutTokenCodeTest is Test {\n    uint160 internal constant FLAGS = Hooks.BEFORE_INITIALIZE_FLAG | Hooks.BEFORE_SWAP_FLAG;\n\n    function test_hookDeploysWhenTokenHasNoCodeYet() public {\n        IPoolManager manager = IPoolManager(address(new PoolManager(address(this))));\n        address token = address(0x1234567890123456789012345678901234567890);\n        assertEq(token.code.length, 0, \"precondition: token address has no code\");\n\n        bytes memory creationCode =\n            abi.encodePacked(type(LaunchGuardHook).creationCode, abi.encode(manager, IERC20(token)));\n        bytes32 initCodeHash = keccak256(creationCode);\n\n        address at;\n        for (uint256 i; i < 300_000; ++i) {\n            address predicted = address(\n                uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(this), bytes32(i), initCodeHash))))\n            );\n            if (uint160(predicted) & Hooks.ALL_HOOK_MASK != FLAGS) continue;\n            bytes32 salt = bytes32(i);\n            assembly (\"memory-safe\") {\n                at := create2(0, add(creationCode, 0x20), mload(creationCode), salt)\n            }\n            break;\n        }\n        // Fails on the current code: the constructor reverts InvalidConfiguration because\n        // address(token).code.length == 0, so create2 returns address(0).\n        assertTrue(at != address(0), \"hook deployment reverted\");\n        assertEq(address(LaunchGuardHook(at).launchToken()), token);\n    }\n}","reproduction":"Environment: fresh EVM, PoolManager deployed, token address T = 0x1234567890123456789012345678901234567890 with no code (the harness situation). Call: CREATE2 of abi.encodePacked(type(LaunchGuardHook).creationCode, abi.encode(manager, T)) with a salt whose predicted address has flags 0x2080. Expected (for the floor to run): hook deploys, launchToken() == T. Actual: constructor reverts InvalidConfiguration at line 35 (code.length == 0), create2 returns address(0). The attached test fails on the current code with 'hook deployment reverted' and passes once the constructor no longer requires token code at construction time.","severity":"medium","snippet":"        if (address(manager).code.length == 0 || address(token).code.length == 0) {","title":"Hook constructor requires the launch token to already have code, so the attested creation code cannot be constructed in the admission floor harness (Hook.protected.t.sol) or in any environment where t"},{"citation":"resolved","description":"SwapPreview.outputAmount re-walks every tick word and initialized tick that Pool.swap will walk, through extsload. The early return (output > stopAbove) only shortens rejected swaps; an allowed swap always pays the full read-only traversal. Measured with a local PoolManager: tickSpacing 1 pool, only liquidity in [-800000,-700000], exact-input buy of 1e18 with limit MIN_SQRT_PRICE+1: guarded swap 30,306,602 gas vs 15,342,923 unguarded. tickSpacing 1 pool with 1000 one-tick positions below the price, exact-input buy of 5e24: 117,945,438 vs 80,800,384. In the README's benchmark configuration (single wide range) the overhead is ~55k gas. This is documented in the README and is not a correctness defect; it is recorded so routers and the deployer choose tick spacing and liquidity shape with the doubled traversal in mind.","line":77,"path":"src/LaunchGuardHook.sol","reproduction":"PoolKey(token0, token1, 3000, tickSpacing 1, hook), initialize at sqrtPrice 2^96, modifyLiquidity(-800000, -700000, 1e18), swap(zeroForOne=true, amountSpecified=-1e18, sqrtPriceLimitX96=MIN_SQRT_PRICE+1) during the guard vs after warp to +24h: identical output, gas 30.3M vs 15.3M.","severity":"info","snippet":"                    if (SwapPreview.outputAmount(poolManager, key, params, maxBuyAmount) > maxBuyAmount) {","title":"Guarded exact-input buys pay for a second full tick traversal; in sparse-liquidity or tick-dense pools the swap costs about 1.5x to 2x the unguarded swap"}],"hash":"7222b02faea7b7600d8ef8a36a8d1e967f304822806bff9b00759988717f5015","nodeId":"2fe8cbaf-7867-4d0b-be56-c4080c0c9071","outcome":"completed","summary":"Review complete. The findings are in `.imd-findings.json` at the repository root, with two findings and a sixteen-row coverage record. No tracked files were changed; only `test/scratch/` and the findings file were written.\n\n**Math area verdict: clean.** I checked the Math Precision, Boundary and Numerical Gap failure modes against the hook and the preview library, and found no arithmetic defect.\n\n- **Cap arithmetic** is exact. Total supply is 1e27, so the cap is 1e25 with no truncation. The cast of a positive exact-output amount to unsigned is safe.\n- **Exact-input boundary** is exact. A binary search on a live local pool found the input whose output is exactly the cap is allowed, and one more wei of input, producing cap plus one, is rejected.\n- **Preview fidelity.** I compared `SwapPreview.outputAmount` line by line with the pinned core swap loop and probed where fuzzing had not reached: tick spacing 32767 across a liquidity gap in both directions, protocol fee at its maximum with a zero LP fee, a dynamic-fee pool, a 100 percent LP fee, and a tight-limit partial exact-output fill. Every case matched core to the wei. Every revert the preview can raise is also a core revert, so the hook cannot block a swap core would accept.\n- **Time boundary** is the documented half-open window of 86400 seconds per pool ID, with no overflow and a nonzero sentinel even at timestamp zero.\n- **Static-analysis leads** did not hold up. The strict equalities are core's own loop semantics, and the aderyn reentrancy line is a constructor.\n\n**Findings reported**\n\n1. **Medium, outside my area.** The constructor reverts when the token address has no code. The pinned admission harness in `Hook.protected.t.sol` deploys only a pool manager before creating the hook from its attested creation code, so the hook cannot be constructed there and the whole protected hook floor fails in setUp. A proof test under `test/scratch/` fails on the current code with \"hook deployment reverted\". The fix is to stop requiring token code at construction, for example deriving the cap lazily or from the fixed supply constant.\n2. **Info.** Guarded exact-input buys pay a second full tick traversal. Measured on a tick-spacing-1 pool with distant liquidity, the guarded swap cost about twice the unguarded one. The README documents this; it is recorded for the deployer's choice of tick spacing and liquidity shape.\n\n**Not reported as defects:** the per-swap cap is trivially aggregated across swaps in one transaction, which matches the specification's wording and is noted in a coverage row instead.","treeHash":null,"usage":{"cachedInputTokens":1508818,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":41718,"runtime":"claude","turns":31,"wallClockMs":690513}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"789312fc56d3f446","findings":[{"citation":"resolved","description":"Economic-security / first-principles note, not a code defect. The hook enforces exactly what the assignment specifies (reject any single swap whose launch-token output exceeds totalSupply/100) and the README (line 14) states the limit is per swap. The guard is stateless across swaps: no per-pool, per-block, per-sender or per-transaction accounting exists, so a buyer splits a large purchase into N swaps of exactly maxBuyAmount inside one unlock. Measured cost of acquiring 40% of the supply during the guard in one transaction: ~980k gas total (about 24k gas per capped swap). The guard therefore does not slow a determined sniper; it only forces routers to split orders. Each swap still pays full price impact, so the economic effect is that of an ordinary unlimited buy executed in 40 steps. Reported so the author and judge can decide whether per-swap granularity is the intended guarantee (it is per the stated spec); if a stronger launch-protection guarantee is wanted, that is a design change (e.g. per-block or per-PoolId cumulative output accounting) and out of this hook's stated scope.","line":76,"path":"src/LaunchGuardHook.sol","reproduction":"State: hook deployed with LaunchToken (totalSupply 1e27, maxBuyAmount 1e25); pool (token/quote, fee 3000, spacing 60) initialized at sqrtPrice 2^96 at t=1_000_000 and seeded with 5e26 launch tokens of full-range liquidity. At any timestamp < 1_000_000 + 86_400, a router calls manager.unlock once and inside unlockCallback executes manager.swap(key, SwapParams(buyDirection, +1e25, extreme price limit), \"\") forty times, then settles the summed deltas. Expected by the spirit of a launch guard: the purchase is limited to ~1% of supply within the window. Actual: every call passes beforeSwap (exact output == cap is allowed at line 76), router receives 4e26 launch tokens (40% of total supply) in one transaction; test logged 'bought in one tx (tokens): 400000000.0', 'percent of total supply: 40'. The repository's own test_limitIsPerSwapNotPerWallet shows the two-swap version of the same behaviour.","severity":"info","snippet":"                if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {\n                    if (SwapPreview.outputAmount(poolManager, key, params, maxBuyAmount) > maxBuyAmount) {\n                        revert BuyLimitExceeded(maxBuyAmount);\n                    }\n                }","title":"Per-swap cap is aggregated trivially: one transaction buys 40% of supply inside the 24h window"}],"hash":"73abd71de033eacd22525deb2b54dbb5bddae1fe6b5d59f570401202a7f72b36","nodeId":"90903cc0-cd86-4a3b-b28a-a384415d120c","outcome":"completed","summary":"The economics audit is complete. The findings file is written and the working tree holds only that file beyond the original sources.\n\n**Result: no exploitable economic defect found.** The hook enforces the stated guarantee correctly. One informational note is recorded.\n\n**What I verified in the assigned area**\n\n- **Preview equals core.** The guard's decision for exact-input buys rests on `SwapPreview` reproducing `Pool.swap` output. I compared it line by line against the vendored core (fee selection, price-limit checks, bitmap traversal and clamping, step math, tick crossing) and ran a differential fuzz far broader than the repo's own: six tick spacings including 1 and 32767, LP fees across the full range, protocol fees, initial prices across the whole tick domain, positions at the usable extremes, both directions, exact in and out, random price limits. Across 5000 runs, with the last 2000 forcing a successful core swap on every run, outputs matched exactly and the preview never reverted where core accepted.\n- **Cap paths.** Exact output at or below the cap is bounded by core itself. Larger exact-output and all exact-input buys go through the equal preview. Sells, post-deadline swaps and partial fills behave as specified. The checked arithmetic in the preview cannot revert within the tick-spacing bounds core enforces.\n- **Token flow out of the pool.** Every path that hands launch tokens to a non-LP passes through `beforeSwap`. Liquidity removal returns only the LP's own position, donate only adds, and the self-call skip in `Hooks.beforeSwap` is unreachable because the hook never swaps and has no owner.\n- **Timer and token.** Per-pool deadline set once, not resettable, rolls back on failed initialization. The token is unmodified OpenZeppelin ERC20 with a fixed supply, so the constructor's supply read stays valid.\n\n**Informational finding recorded.** The cap is per swap and stateless across swaps, exactly as the spec and README say. A demonstration bought 40% of total supply inside the window in a single transaction by chaining forty capped exact-output swaps, at roughly 980k gas in total. This is the intended design rather than a code defect, so it is filed as `info` with the concrete reproduction for the judge to weigh.\n\n**Static-analysis leads** were checked and dismissed: the strict equalities and timestamp comparisons mirror core semantics, and the aderyn reentrancy line is a constructor with no reentrant surface.\n\n**Coverage.** All thirteen listed entry points have rows, plus four invariant rows. The eight non-enabled callbacks are unreachable from the manager and revert on direct calls. Scratch tests were removed after use.","treeHash":null,"usage":{"cachedInputTokens":1094956,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":37949,"runtime":"claude","turns":27,"wallClockMs":849183}},{"artifacts":[],"attempt":1,"bundleHash":"158b1b9e9364adfacd09dee15fb2680f715ea7e980b36f49e38f164eb3c9adc5","device":"bb0a3bf63233e5e5","findings":[],"hash":"82342240ac5371e64bd0b2caaf84315f6126e75598231432bd43074dcbfcc3c8","nodeId":"7fa922f2-e60b-4d2b-bac5-201da69fb233","outcome":"completed","summary":"Created `launch.json` with matching contracts, constructor arguments, permissions, native ETH pool parameters, and 1,808-character notes.\n\nSchema and implementation checks passed. `forge build` succeeded; all 72 tests passed. Only `launch.json` changed outside permitted scratch outputs.","treeHash":"59acb562e9a8fe3badfe61b19138b15cd53a02ab","usage":{"cachedInputTokens":271488,"inputTokens":50632,"model":"gpt-6-astra","outputTokens":5258,"runtime":"codex","turns":3,"wallClockMs":178983}},{"artifacts":[],"attempt":2,"bundleHash":"851e01bc356890ac319986a290ed9671aed05c15ff1023ac187603e13f9db9f6","device":"468e82a89b9bfe18","findings":[],"hash":"84d3f2e2f030507574e1ad4a4a27b067a46f3e28e48d3acbe702452e81f39782","nodeId":"7fa922f2-e60b-4d2b-bac5-201da69fb233","outcome":"completed","summary":"`launch.json` is written, schema-valid, and the only changed file in the tree. Build and the full test suite pass.\n\n**What the manifest declares**\n\n- `kind` is the first field, set to `univ4_hook`.\n- Hook `LaunchGuardHook` with permissions `beforeInitialize` and `beforeSwap`, which is exactly what `getHookPermissions` returns in `src/LaunchGuardHook.sol:44`. Address flags 0x2080.\n- Token `LaunchToken`, name \"Launch Guard\", symbol GUARD, 18 decimals, matching `src/LaunchToken.sol`.\n- Pool paired with native ETH (zero address), fee 3000, tick spacing 60. The opening price is the sqrtPriceX96 at tick 138180, computed with the vendored TickMath, about 1,001,800 GUARD per ETH. The source fixes no price, so the notes state this is a choice made for the manifest.\n- Constructor arguments are `\"$poolManager\"` followed by the zero address.\n\n**Why the second constructor argument is the zero address, and why that is a blocking gap.** The hook constructor is `(IPoolManager manager, IERC20 token)` and requires the token to have code so it can read total supply. The token only exists once the factory deploys it in the launch transaction. The prior attempt wrote `\"$token\"`, which the manifest check refuses because a univ4_hook constructor argument can only be `$poolManager`, a literal address, or an integer. No literal address can be correct ahead of time. The zero address is the only value that fails safely: the constructor reverts with `InvalidConfiguration` rather than binding the hook to a wrong token, so the deployer simulation stops instead of deploying something broken. The same constraint means the protected Hook floor, which constructs the attested creation code with no token present, cannot deploy this hook as built. The notes say all of this plainly and name the fix, which is a revision of the hook to learn the launch token from the pool key in `beforeInitialize`. That revision is outside this assignment's write scope.\n\n**Verification run**\n\n| Check | Result |\n| --- | --- |\n| forge build --offline | ok |\n| forge test --offline | 73 passed, 0 failed (72 project tests plus one scratch test) |\n| forge fmt --check on src and test | ok |\n| manifest validator (scratch script, all schema rules plus refinements) | valid, notes 3999 characters |\n\nThe scratch files under `test/scratch/` are the price printer and the validator; they are not part of the deliverable.","treeHash":"f3cf4668e5e6d84c732b40d3b80aa45dc3587527","usage":{"cachedInputTokens":1895258,"inputTokens":674,"model":"claude-fable-5-1","outputTokens":24663,"runtime":"claude","turns":32,"wallClockMs":354352}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5b9c505a673e1a8a","findings":[{"citation":"resolved","description":"The constructor refuses to deploy unless address(token) already has code, and then calls token.totalSupply() on it. The constructor arguments (manager, token) are part of the hook's creation code, which is what the launch pipeline attests and what the admission floor (.imd/reads/protected/univ4_hook/Hook.protected.t.sol) executes: that harness deploys only a fresh PoolManager (optionally etched at IMD_POOL_MANAGER) and then CREATE2-deploys the handed creation code with `require(at != address(0), \"hook deployment reverted\")`. Nothing places code at the token address in that EVM, so the CREATE2 returns address(0) and every protected hook test fails in setUp. The same dependency means the hook can only be deployed after the token in any environment, and the manifest schema offers no placeholder for a token address that is created in the same launch transaction (only \"$poolManager\" is resolved), so a literal predicted token address must be committed in advance and will be wrong if the factory's nonce or salt differs. The 1% cap itself does not need a live token at construction: LaunchToken has a fixed 1e27 supply, so the cap can be a constant, or totalSupply() can be read lazily in _beforeInitialize (where the pool key already proves the token exists) and stored per pool.","line":35,"path":"src/LaunchGuardHook.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {Hooks} from \"v4-core/src/libraries/Hooks.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {LaunchGuardHook} from \"src/LaunchGuardHook.sol\";\n\n/// @notice Mirrors the admission floor (Hook.protected.t.sol): a fresh PoolManager exists, the hook's\n/// creation code already carries its constructor arguments, and nothing else is deployed. The token\n/// address baked into the creation code has no code in that EVM. The hook must still deploy.\ncontract ConstructorRequiresTokenCodeTest is Test {\n    uint160 internal constant FLAGS = Hooks.BEFORE_INITIALIZE_FLAG | Hooks.BEFORE_SWAP_FLAG;\n\n    function test_hookDeploysWhenTokenAddressHasNoCodeYet() public {\n        IPoolManager manager = IPoolManager(address(new PoolManager(address(this))));\n        // The launch token's future address: known to the manifest, not yet deployed in this EVM.\n        address token = address(uint160(0xBEEF));\n        assertEq(token.code.length, 0);\n\n        bytes memory creationCode =\n            abi.encodePacked(type(LaunchGuardHook).creationCode, abi.encode(manager, IERC20(token)));\n        bytes32 initCodeHash = keccak256(creationCode);\n\n        address at;\n        bool found;\n        for (uint256 i; i < 300_000; ++i) {\n            address predicted = address(\n                uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(this), bytes32(i), initCodeHash))))\n            );\n            if (uint160(predicted) & Hooks.ALL_HOOK_MASK != FLAGS) continue;\n            found = true;\n            bytes32 salt = bytes32(i);\n            assembly (\"memory-safe\") {\n                at := create2(0, add(creationCode, 0x20), mload(creationCode), salt)\n            }\n            break;\n        }\n        assertTrue(found, \"no salt produced an address carrying the declared flags\");\n        assertTrue(at != address(0), \"hook deployment reverted: constructor requires token code\");\n        assertEq(uint160(at) & Hooks.ALL_HOOK_MASK, FLAGS);\n    }\n}","reproduction":"State: a fresh PoolManager exists; the launch token address is known but has no code (exactly the admission harness state). Call: creationCode = abi.encodePacked(type(LaunchGuardHook).creationCode, abi.encode(manager, IERC20(0xBEEF))); mine a CREATE2 salt whose predicted address has flag bits 0x2080; create2(0, creationCode, salt). Expected: a hook is deployed at the mined address. Actual: the constructor reverts InvalidConfiguration() at line 35-36 (address(token).code.length == 0) and create2 returns address(0). The scratch test test/scratch/ConstructorRequiresTokenCode.t.sol fails with 'hook deployment reverted: constructor requires token code' on the current code (forge test --match-path test/scratch/ConstructorRequiresTokenCode.t.sol).","severity":"medium","snippet":"        if (address(manager).code.length == 0 || address(token).code.length == 0) {\n            revert InvalidConfiguration();\n        }\n        uint256 limit = token.totalSupply() / 100;","title":"Hook constructor requires a deployed token contract, so the attested creation code cannot be instantiated by the admission harness or any environment where the launch token does not yet exist"},{"citation":"resolved","description":"The guard inspects only the current call's params and pool state; it keeps no per-transaction, per-block, per-sender or cumulative counter. A buyer (or a router batching inside one unlock) issues N swaps with amountSpecified = maxBuyAmount and receives N% of the supply within one block, which is the outcome the brief's 'rejects any swap that buys more than 1%' is presumably meant to prevent. This is documented in README.md as a per-swap limit and the brief literally says 'any swap', so it is recorded as a scope observation for the requester, not as a code defect; it needs a design decision (e.g. a per-block or per-pool cumulative limit) if a stronger guarantee is wanted.","line":76,"path":"src/LaunchGuardHook.sol","reproduction":"State: pool initialized at t0 with full-range liquidity 1e26 at price 1:1 (the suite's setUp), block.timestamp < t0 + 24h. Calls: in a single PoolActions.unlock, or simply two consecutive calls, manager.swap(key, SwapParams(buyDirection, int256(10_000_000 ether), limit), '') twice. Expected under a strict '1% of supply' reading: the second buy is rejected. Actual: both succeed and the caller receives 20_000_000 GUARD (2% of supply) in one block; test_limitIsPerSwapNotPerWallet in test/LaunchGuardHook.t.sol demonstrates exactly this and passes.","severity":"info","snippet":"                if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {\n                    if (SwapPreview.outputAmount(poolManager, key, params, maxBuyAmount) > maxBuyAmount) {\n                        revert BuyLimitExceeded(maxBuyAmount);\n                    }","title":"The 1% cap is enforced per swap call only; several swaps in one transaction or block buy an unbounded multiple of the cap during the guard window"}],"hash":"9d13a4c6c692beb6905f9a61c926390e59ddc7b30be6bd4de72f75d28c1f0765","nodeId":"097d64f5-d6d3-45b2-8583-22b3b8208b2c","outcome":"completed","summary":"The findings file is written and validated: both snippets match the tree, the proof fails on the current code, and the full existing suite passes. The review is complete.\n\n**Outcome.** Within the Execution Trace, Periphery and First Principles areas, the hook's swap-gating control flow holds. The only code defect I could substantiate is a deployment-time one, plus one scope observation.\n\n**Findings written to `.imd-findings.json`:**\n\n1. **Medium: the constructor needs a live token contract.** `LaunchGuardHook` refuses to deploy unless the token address already has code, then reads `totalSupply()` from it. Those constructor arguments are baked into the attested creation code, and the admission floor in `Hook.protected.t.sol` deploys only a PoolManager before running CREATE2 on that code. In that environment the token address is empty, the constructor reverts with `InvalidConfiguration`, and every protected hook test fails in setUp. The manifest schema also resolves only `$poolManager`, with no placeholder for a token created in the same launch transaction. The scratch proof at `test/scratch/ConstructorRequiresTokenCode.t.sol` reproduces this and currently fails. A constant cap derived from the fixed supply, or a lazy read in `beforeInitialize`, would remove the dependency without changing the 1% rule.\n\n2. **Info: the limit is per swap call.** Two consecutive exact-output buys of the cap in one block acquire 2% of supply. The README documents this and the brief says \"any swap\", so it is recorded as a design observation, not a defect.\n\n**What held under tracing.** The preview library reproduces the vendored `Pool.swap` loop step for step: fee composition with protocol fee, price-limit validation, bitmap traversal and clamping, tick crossing with liquidity net, and rounding. Checked arithmetic in the preview cannot diverge from core's unchecked blocks for reachable values. The exact-output-within-cap shortcut is sound because core never delivers more than the specified output. All ten unflagged callbacks are unreachable from the PoolManager and reject other callers. The token is unmodified OpenZeppelin ERC20 with a fixed supply.\n\n**Static-analysis leads** were checked and dropped: the strict equality on `endsAt == 0` is safe because a stored deadline is never zero, the timestamp comparisons are the intended 24-hour boundary, and the \"reentrancy\" in the constructor writes only immutables after a view call.\n\n**Coverage record.** All 13 listed entry points have rows, 12 `holds` and the constructor as `finding`, plus two invariant rows. Nothing was left `unreached`.","treeHash":null,"usage":{"cachedInputTokens":1124656,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":30505,"runtime":"claude","turns":23,"wallClockMs":565162}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0256823ae36e7900","findings":[{"citation":"resolved","description":"Prior finding dfc9122caeac5f3f5ce16e99c76c0d8506217ce00c6968688b0008c7447de00c remains unresolved. The author correctly identifies missing production token-address prediction inputs and does not dispute the deployment failure. The revised constructor at src/LaunchGuardHook.sol:36 still rejects address(token) == address(0). Only $poolManager is resolved by the supplied deployment interface; the literal zero second argument is not replaced with the deployed LaunchToken. Deferring the code/supply read fixes the separate fresh-EVM constructor issue but cannot fix this manifest binding. Therefore the manifest-described launch transaction cannot deploy its hook or initialize its pool. Supply a verified deterministic LaunchToken address using the actual production factory and CREATE nonce or CREATE2 salt/init-code hash, or separately revise the hook binding and deployment interface together. Notes and a local test token address do not resolve the missing production binding.","line":5,"path":"launch.json","reproduction":"Deploy PoolManager(address(this)) and LaunchToken in a fresh local EVM. Read launch.json hook.constructorArgs[1] (0x0000000000000000000000000000000000000000), resolve argument 0 to that manager, and form abi.encodePacked(type(LaunchGuardHook).creationCode, abi.encode(manager, IERC20(address(0)))). Mine a CREATE2 salt for the actual deployer such that predictedAddress & 0x3fff == 0x2080, then call new LaunchGuardHook{salt: salt}(manager, IERC20(address(0))). Expected: the manifest constructs a hook bound to the real launch token. Actual: address validation passes, then the constructor reverts InvalidConfiguration() (0xc52a9bd3) at src/LaunchGuardHook.sol:36-37 and no hook code is deployed. A positive control with the actual deployed LaunchToken instead of zero can initialize the manifest pool (native ETH, fee 3000, tickSpacing 60, sqrtPriceX96 79299443975792720780679863727831), with maxBuyAmount 10000000000000000000000000 and guardEndsAt 1086400 when initialized at timestamp 1000000. Executed the recreated author reproduction and positive control with forge test --offline --match-path test/scratch/ManifestConstructorProof.t.sol --out /tmp/imd-review-round2-out --cache-path /tmp/imd-review-round2-cache -vvvv: both tests passed, observing the exact constructor revert for the manifest argument and successful initialization for the real-token control; all five manifest input values came directly from launch.json through REVIEW_MANIFEST_* environment variables. Full offline regression run also passed: 112 tests (107 existing project tests plus the three unchanged constructor proofs and these two manifest checks), including 256 runs per fuzz test and 256 runs of depth 128 for each invariant suite. Passing expected-revert tests confirms the blocker; it does not establish deployment readiness.","severity":"medium","snippet":"    \"constructorArgs\": [\"$poolManager\", \"0x0000000000000000000000000000000000000000\"],","title":"Manifest still passes address(0) as the launch token and reverts deployment"}],"hash":"a0608065c90f32179ddd444f8b1dd76c5be878852b429516d5163477705e8267","nodeId":"3868a85f-5ad5-4dba-a1cf-6da6d2e7e05d","outcome":"completed","summary":"Wrote [.imd-findings.json](/home/imd-worker/.identitymd/work/d505332d-aa70-44d5-a674-ca1f44e72db7/3868a85f-5ad5-4dba-a1cf-6da6d2e7e05d/.imd-findings.json).\n\n- Constructor finding: fixed; all prior proofs pass.\n- Manifest finding: remains medium; zero token address still reverts deployment.\n- All 13 entry points covered; 112 tests passed offline.\n- No additional defects found. Temporary proofs removed.","treeHash":null,"usage":{"cachedInputTokens":1306240,"inputTokens":116376,"model":"gpt-6-astra","outputTokens":7592,"runtime":"codex","turns":5,"wallClockMs":343202}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"02ae6543274731ab","findings":[{"citation":"resolved","description":"Merged audit_math and audit_flow constructor findings. The supplied Hook.protected.t.sol deploys only PoolManager before CREATE2-deploying the attested hook creation code. The token address encoded in that code has no deployed contract in this fresh EVM. The constructor therefore reverts InvalidConfiguration, preventing all three protected hook checks from reaching their assertions. Removing only the code-length check is insufficient because the immediately following token.totalSupply() also requires a live token. Token-before-hook deployment is valid in isolation, but is incompatible with this required harness. Defer supply resolution to authenticated pool initialization or use the accompanying fixed-supply token constant, while preserving validation of the actual launch token.","line":35,"path":"src/LaunchGuardHook.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {Hooks} from \"v4-core/src/libraries/Hooks.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {LaunchGuardHook} from \"src/LaunchGuardHook.sol\";\n\n/// @notice Mirrors the admission floor (Hook.protected.t.sol): a fresh PoolManager exists, the hook's\n/// creation code already carries its constructor arguments, and nothing else is deployed. The token\n/// address baked into the creation code has no code in that EVM. The hook must still deploy.\ncontract ConstructorRequiresTokenCodeTest is Test {\n    uint160 internal constant FLAGS = Hooks.BEFORE_INITIALIZE_FLAG | Hooks.BEFORE_SWAP_FLAG;\n\n    function test_hookDeploysWhenTokenAddressHasNoCodeYet() public {\n        IPoolManager manager = IPoolManager(address(new PoolManager(address(this))));\n        // The launch token's future address: known to the manifest, not yet deployed in this EVM.\n        address token = address(uint160(0xBEEF));\n        assertEq(token.code.length, 0);\n\n        bytes memory creationCode =\n            abi.encodePacked(type(LaunchGuardHook).creationCode, abi.encode(manager, IERC20(token)));\n        bytes32 initCodeHash = keccak256(creationCode);\n\n        address at;\n        bool found;\n        for (uint256 i; i < 300_000; ++i) {\n            address predicted = address(\n                uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), address(this), bytes32(i), initCodeHash))))\n            );\n            if (uint160(predicted) & Hooks.ALL_HOOK_MASK != FLAGS) continue;\n            found = true;\n            bytes32 salt = bytes32(i);\n            assembly (\"memory-safe\") {\n                at := create2(0, add(creationCode, 0x20), mload(creationCode), salt)\n            }\n            break;\n        }\n        assertTrue(found, \"no salt produced an address carrying the declared flags\");\n        assertTrue(at != address(0), \"hook deployment reverted: constructor requires token code\");\n        assertEq(uint160(at) & Hooks.ALL_HOOK_MASK, FLAGS);\n    }\n}","reproduction":"Fresh EVM: deploy PoolManager(address(this)); set T = 0x000000000000000000000000000000000000bEEF and verify T.code.length == 0. Form abi.encodePacked(type(LaunchGuardHook).creationCode, abi.encode(manager, IERC20(T))). Mine a CREATE2 salt for the actual deployer such that predictedAddress & 0x3fff == 0x2080, then execute CREATE2 with this init code. Expected by the pinned admission floor: nonzero hook address so permission, runtime and callback-authentication tests can run. Actual: BaseHook address validation succeeds, then LaunchGuardHook.sol:35-36 reverts InvalidConfiguration; CREATE2 returns address(0) and the floor fails with \"hook deployment reverted\". Both attached specialist proofs exercise this same failure using T = 0xBEEF or T = 0x1234567890123456789012345678901234567890. Executed forge test --match-path \"test/scratch/Proof*.t.sol\" --out /tmp/imd-review-out --cache-path /tmp/imd-review-cache -vvv: both tests compiled and failed at their nonzero-deployment assertion; constructor revert data was 0xc52a9bd3 (InvalidConfiguration), after reaching a correctly flagged CREATE2 address. The attached proof is the 0xBEEF variant.","severity":"medium","snippet":"        if (address(manager).code.length == 0 || address(token).code.length == 0) {\n            revert InvalidConfiguration();\n        }\n        uint256 limit = token.totalSupply() / 100;\n        if (limit == 0) revert InvalidConfiguration();","title":"Eager token lookup prevents deployment in the required admission harness"},{"citation":"resolved","description":"The second constructor argument is a literal zero address, but LaunchGuardHook expects the deployed LaunchToken address. The specified deployment interface resolves only $poolManager; it does not substitute a token address for this zero literal. Thus even a factory that correctly deploys LaunchToken before the hook cannot deploy the manifest-described hook. The notes acknowledge the gap but have no deployment authority. This is distinct from the admission-harness issue: deferring totalSupply() does not make address(0) identify the launch token, and supplying the correct token address does not populate the fresh protected-test EVM. Supply the correct deterministically established LaunchToken address, or revise the hook binding and manifest together to an interface supported by the deployment service.","line":5,"path":"launch.json","reproduction":"Deploy a real local PoolManager and LaunchToken. Resolve launch.json constructorArgs[0] to that manager and leave constructorArgs[1] as its declared literal 0x0000000000000000000000000000000000000000. Mine a CREATE2 address with flags 0x2080 using abi.encodePacked(type(LaunchGuardHook).creationCode, abi.encode(manager, IERC20(address(0)))); deploy it. Expected: the accepted manifest constructs a hook bound to the newly deployed LaunchToken and the factory can initialize its pool. Actual: LaunchGuardHook.sol:35-36 reverts InvalidConfiguration because address(0).code.length == 0. The existing test_constructorRejectsMissingTokenCode in test/LaunchGuardConstructor.t.sol reproduces this exact zero-token call after deploying both manager and token and verifies the exact revert selector. No pool can be created by this launch transaction. Executed the original full Foundry suite with build/cache in /tmp: test_constructorRejectsMissingTokenCode passed by observing this expected InvalidConfiguration revert; all 97 original tests passed.","severity":"medium","snippet":"    \"constructorArgs\": [\"$poolManager\", \"0x0000000000000000000000000000000000000000\"],","title":"Manifest passes address(0) as the launch token and always reverts deployment"}],"hash":"bcff02692f1ef6df8d982e2aaa349ec63187713a4c5c93b003f2f6f2f6c65d09","nodeId":"3868a85f-5ad5-4dba-a1cf-6da6d2e7e05d","outcome":"completed","summary":"Recorded two medium findings in [.imd-findings.json](/home/imd-worker/.identitymd/work/d505332d-aa70-44d5-a674-ca1f44e72db7/3868a85f-5ad5-4dba-a1cf-6da6d2e7e05d/.imd-findings.json):\n\n- Constructor cannot deploy in the protected admission harness.\n- Manifest’s zero token address prevents launch deployment.\n\nSpecialist duplicates merged; all 13 entry points covered. All 97 original tests passed; both constructor proofs reproduced the failure. Production files remain unchanged.","treeHash":null,"usage":{"cachedInputTokens":2719616,"inputTokens":207377,"model":"gpt-6-astra","outputTokens":10753,"runtime":"codex","turns":6,"wallClockMs":416323}},{"artifacts":[],"attempt":1,"bundleHash":"324b9817e9b2ff487873c8a116e6788c906eb6a4425de9e7ee00756f2b58f41b","device":"02ae6543274731ab","findings":[],"hash":"be87e672deda0797377a8bc0b42058deeb0c6658ad5a012a061ed5e4d3f984ea","nodeId":"7fa922f2-e60b-4d2b-bac5-201da69fb233","outcome":"completed","summary":"The deployment failure is reproduced and remains unresolved: the verified LaunchToken deployment address is missing.\n\nCorrected `launch.json` notes and recorded the blocker in `.imd-responses.json`. Schema validation, `forge build`, and all 82 tests passed, including the failure reproducer. Completing the fix requires the verified token address.","treeHash":"c419201bf579ff6e1f5671d3243768e6bf172a4b","usage":{"cachedInputTokens":577152,"inputTokens":52803,"model":"gpt-6-astra","outputTokens":8340,"runtime":"codex","turns":6,"wallClockMs":329400}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0256823ae36e7900","findings":[],"hash":"c7f032f3690ce47e3b9ff0cba0c23f3e20d5fa28155da5586c6402854d18a5e6","nodeId":"7fa922f2-e60b-4d2b-bac5-201da69fb233","outcome":"no_change","summary":"Confirmed the deployment failure. Fixing it requires the verified production LaunchToken address or factory prediction inputs; neither was supplied.\n\nManifest unchanged. Recorded the unresolved finding in [.imd-responses.json](.imd-responses.json).\n\nSchema validation, `forge build`, and all 82 tests passed. Passing tests do not resolve the deployment blocker.","treeHash":null,"usage":{"cachedInputTokens":484608,"inputTokens":49854,"model":"gpt-6-astra","outputTokens":7160,"runtime":"codex","turns":5,"wallClockMs":260516}},{"artifacts":[],"attempt":1,"bundleHash":"af9c48a47b1510bb3d8ca619206049975e8cae42f20f964c0aa57f9d0f11cac8","device":"3f6a9bdd601cb99f","findings":[],"hash":"ca0b6c05bcfc624b995cf18afc3ea175aa3504f6e945d201ac2ad808691ddcc0","nodeId":"bd7605e2-8b13-48a9-8298-87719e89bce1","outcome":"completed","summary":"Fixed the reproduced constructor failure by deferring token validation and cap resolution to authenticated pool initialization. Added regression tests, updated deployment documentation, and recorded the finding as fixed in `.imd-responses.json`.\n\nPassed: `forge build`, all 80 project tests, the unchanged reviewer proof, and `forge fmt --check`.","treeHash":"bee75ce13887ad4af310601f602dc2763f24450d","usage":{"cachedInputTokens":661376,"inputTokens":64239,"model":"gpt-6-astra","outputTokens":8185,"runtime":"codex","turns":5,"wallClockMs":299082}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fba19b641cdd6f27","findings":[{"citation":"resolved","description":"Trust-gap note (access x economics), not a spec violation: the brief and README both define the guard per swap, and the code implements exactly that. The hook keeps no per-pool, per-block, per-sender or per-transaction tally, so the only cost of exceeding 1% of supply during the launch window is splitting the order. Because AMM output is path-independent apart from fees, which are proportional, five swaps of exactly maxBuyAmount in one PoolManager.unlock deliver the same tokens at the same total price as one 5% swap, plus a few thousand gas per extra call. A sniper bot therefore faces no economic deterrent in the first 24 hours; the guard only blocks naive single-call buyers. The README documents this limitation. Recorded so the author and launch policy can decide whether a per-swap limit is the intended guarantee; no code defect against the stated design. If a stronger guarantee is wanted, a per-pool per-block or per-sender cumulative counter in beforeSwap (still ownerless) would close it, at the cost of changing the agreed economic rule.","line":76,"path":"src/LaunchGuardHook.sol","reproduction":"State: pool (LaunchToken, Quote, fee 3000, spacing 60, hook) initialized at timestamp 1_000_000 with 100_000_000e18 full-range liquidity; maxBuyAmount = 10_000_000e18. Within the guard window, a router calls manager.unlock and inside unlockCallback calls manager.swap(key, {zeroForOne: buy direction, amountSpecified: +10_000_000e18, sqrtPriceLimitX96: extreme}) five times, then settles once. Expected if the guard were an aggregate cap: revert. Actual: all five succeed and the router receives exactly 50_000_000e18 LaunchToken (5% of supply) in one transaction, while a single swap with amountSpecified = +50_000_000e18 is rejected with BuyLimitExceeded(10_000_000e18). Verified with a scratch Foundry test (MultiSwapRouter, test_fiveSwapsOfCapInOneTxBuyFivePercent) against the vendored PoolManager.","severity":"info","snippet":"                if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {","title":"Per-swap cap gives no aggregate protection: N swaps of 1% inside one unlock buy N% in a single transaction"},{"citation":"resolved","description":"Access-control trust assumption, documented here so the deployment operator cannot miss it. The only guard on beforeInitialize is onlyPoolManager; the sender argument is ignored and there is no deployer binding, so any address may initialize any pool whose key names the hook and contains the launch token. This is required by the no-owner design and is safe only because the launch factory deploys the hook and initializes its pool in one transaction (README step 4, and the platform reference says the factory does so). If the deployer ever splits those into two transactions, an outsider can front-run the second with an arbitrary sqrtPriceX96 for the exact intended PoolKey: the factory's own initialize then reverts with PoolAlreadyInitialized, the guard window has already started at the attacker's chosen time, and liquidity seeded afterwards sits at the attacker's price. No code change is required if atomic deployment is enforced; otherwise the hook could bind the first initializer to the constructor's msg.sender without introducing an owner.","line":57,"path":"src/LaunchGuardHook.sol","reproduction":"State: LaunchToken t2 deployed; LaunchGuardHook h2 deployed via CREATE2 at a 0x2080-flagged address with (manager, t2); no pool initialized yet. Call sequence: (1) attacker 0xBAD calls manager.initialize({currency0/1 = sorted(t2, quote), fee 3000, tickSpacing 60, hooks h2}, sqrtPriceX96 = 2^96 * 100). Expected by the factory: only its own initialize sets the opening price. Actual: the call succeeds, h2.guardEndsAt(poolId) == block.timestamp + 86400, and the factory's subsequent manager.initialize(sameKey, 2^96) reverts. Verified with scratch test test_nonAtomicDeploymentLetsOutsiderInitializeIntendedPool. Not reachable when deployment and initialization share one transaction, which is the documented and platform-enforced flow.","severity":"info","snippet":"        uint256 endsAt = block.timestamp + GUARD_DURATION;\n        guardEndsAt[id] = endsAt;","title":"beforeInitialize is permissionless: a non-atomic deploy-then-initialize sequence lets an outsider set the intended pool's opening price and start its timer"}],"hash":"cd959544287bb2c8d76a1cece93fa34dcf215204b714c6f82a6fb1036f33c7f5","nodeId":"077b6fd0-d8cc-4101-bfc9-26fba2f26d08","outcome":"completed","summary":"Review complete. The findings file is written at `.imd-findings.json`, the scratch tests are removed, and no source files were changed.\n\n**Outcome: no permission defects found.** The hook's access model holds under the Access Control, Trust Gap and Asymmetry guides. I recorded two info-level trust assumptions, each with a concrete reproduction I executed against the vendored PoolManager.\n\n**What I verified**\n\n- Every callback is guarded by `onlyPoolManager` from BaseHook. Only beforeInitialize and beforeSwap are enabled, and the mined address flags match them. The other eight callbacks are stubs that revert and are never called.\n- `guardEndsAt` has one writer, reached only through PoolManager initialize, rejects re-initialization, and rolls back when the manager's own initialize fails.\n- The simulate/execute pair is symmetric. The preview reads the same slot0, liquidity, bitmap and tick-net values Pool.swap reads, composes protocol and LP fees identically, and reverts in the same price-limit and exact-output-with-100%-fee cases. Nothing runs between the hook call and the swap. I confirmed this also holds for dynamic-fee pools, where the LP fee stays zero because the hook never calls the fee updater.\n- The exact-output shortcut is sound: output can never exceed the specified amount, so skipping the preview at or below the cap cannot let a larger buy through.\n- The hook has no fallback or receive and never calls the manager except for static reads, so no path makes it the swap caller, which would skip its own beforeSwap.\n- The token is unmodified OpenZeppelin ERC20 with a fixed supply minted to the deployer.\n- Static-analysis leads: the strict equality is an intended sentinel that cannot be zero, the timestamp comparisons bound a 24-hour window where miner drift is immaterial, and the constructor's external call precedes only immutable writes on the project's own token.\n\n**Info findings recorded**\n\n1. The cap is per swap, as the brief specifies. Five swaps of exactly the cap inside one unlock buy 5% of supply in one transaction at the same price as one rejected 5% swap. Documented in the README, so this is a design limit, not a defect.\n2. beforeInitialize is permissionless. If deployment and initialization were ever split across transactions, an outsider could initialize the intended pool first at any price and start the timer. Safe under the documented and platform-enforced atomic flow.\n\n**Coverage** has a row for all 13 listed entry points plus four invariants. Nothing was left unreached.","treeHash":null,"usage":{"cachedInputTokens":1187430,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":34363,"runtime":"claude","turns":28,"wallClockMs":671224}},{"artifacts":[],"attempt":1,"bundleHash":"74b47f0b473aea570935f591b15154df045e9e0e2e2bb23ab6d1aa0b9710c88f","device":"3f6a9bdd601cb99f","findings":[],"hash":"d115b5ac3a2caee8d180dd229104bc1e937436b2445caf6a845821afee1ddf27","nodeId":"139897a3-eb81-4431-917e-2d1f59d4a805","outcome":"completed","summary":"Updated tests for deferred supply validation, preserving failure and boundary coverage and adding initialization rollback/retry checks.\n\n`forge build` and `forge test` pass: **107 tests**, including three invariant campaigns covering **98,304 random calls**.\n\nChanges are limited to `test/`.","treeHash":"bb27999871ba323f09fe0e0decdbb0a6aba2a959","usage":{"cachedInputTokens":1495808,"inputTokens":93502,"model":"gpt-6-astra","outputTokens":6871,"runtime":"codex","turns":5,"wallClockMs":320279}},{"artifacts":[],"attempt":1,"bundleHash":"1cc8272eb5c9357ee58ceade110101c5e04d02e0f08dc4b23f43015a51117b4b","device":"3f6a9bdd601cb99f","findings":[],"hash":"d5db2aa04992644c36f29d4e25e30dc8020e2f40b8ef376015eb131821581dc7","nodeId":"bd7605e2-8b13-48a9-8298-87719e89bce1","outcome":"completed","summary":"Implemented the no-owner launch guard, fixed-supply token, vendored dependencies, and deployment documentation.\n\nBoth swap types enforce the 1% output cap until exactly 24 hours after initialization.\n\nVerified with Solidity 0.8.26:\n\n- `forge build` passed\n- `forge test`: 72 passed\n- `forge fmt --check` passed","treeHash":"f0234fa949e5643124c83c2e1b9c55321417671f","usage":{"cachedInputTokens":1093376,"inputTokens":91851,"model":"gpt-6-astra","outputTokens":22956,"runtime":"codex","turns":7,"wallClockMs":760447}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0256823ae36e7900","findings":[],"hash":"dd3526b74e460ec156f86fdc7f3b1910435179f791d78d726bfee9f6633df212","nodeId":"3868a85f-5ad5-4dba-a1cf-6da6d2e7e05d","outcome":"failed","summary":"This content was flagged for possible cybersecurity risk. If this seems wrong, try rephrasing your request. If you’re doing authorized security work that requires more cyber permissive safeguards, apply for Daybreak access via https://platform.openai.com/settings/organization/status-and-access before retrying.","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":"gpt-6-astra","outputTokens":0,"runtime":"codex","turns":2,"wallClockMs":124234}}],"verification":[{"checks":[{"durationMs":53731,"exitCode":0,"name":"build","output":"Compiling 82 files with Solc 0.8.26\nSolc 0.8.26 finished in 53.54s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/LaunchGuardHook.sol:71:13\n   │\n71 │         if (block.timestamp < endsAt) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchGuardHook.sol:76:51\n   │\n76 │                 if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {\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":10123,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(uint96) (runs: 256, μ: 84709, ~: 85297)\nLogs:\n  Bound result 2903\n\n[PASS] test_allowanceAndTransferFrom() (gas: 157596)\n[PASS] test_fixedSupplyMetadataAndDeployerAllocation() (gas: 43878)\n[PASS] test_noMintOwnerPauseOrUpgradeEntryPoints() (gas: 126468)\n[PASS] test_runtimeHasNoEscapeHatches() (gas: 605835)\n[PASS] test_transferFailures() (gas: 56651)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 4.89ms (7.84ms CPU time)\n\nRan 40 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency0Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 302367, ~: 305138)\nLogs:\n  Bound result 21819529347\n  Bound result 243\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 152215, ~: 156070)\nLogs:\n  Bound result 7152\n  Bound result 200\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 866225, ~: 861472)\nLogs:\n  Bound result 208\n  Bound result 1\n  Bound result 2052023624443550330340\n  Bound result 6318\n\n[PASS] test_beforeSwapGas() (gas: 65445)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 54634\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 48636)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 68079)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 562227)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 839370)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 262280)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 129103)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 155163)\n[PASS] test_exactOutputAtCapAllowed() (gas: 146279)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 129494)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 81167)\n[PASS] test_finalSecondGuarded() (gas: 82470)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 492462)\n[PASS] test_fullFeeExactOutputCannotBePreviewed() (gas: 382099)\n[PASS] test_fullSupplyAndInt256ExtremesRespectActualPartialFill() (gas: 911220)\n[PASS] test_hookDataCannotBypassCap() (gas: 78847)\n[PASS] test_initializationAndPermissions() (gas: 59234)\n[PASS] test_initializationAtTimestampZero() (gas: 104173)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41815)\n[PASS] test_initializationRejectsWrongHookAndLeavesNoTimer() (gas: 64182)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 498448)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 279143)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 259942)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157242)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1787065)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 284655)\n[PASS] test_nativeCurrencyPair() (gas: 524469)\n[PASS] test_newPoolTimerStartsAtInitializationNotHookDeployment() (gas: 422020)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3132188)\n[PASS] test_oneWeiAndJustBelowCapBuys() (gas: 359144)\n[PASS] test_previewRejectsWrongSideAndOutOfRangeLimits() (gas: 156527)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 161847)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 264548)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 409253)\n[PASS] test_timerCannotBeReset() (gas: 55429)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47770)\n[PASS] test_zeroAmountReturnsNeutralHookResultButManagerRejects() (gas: 90837)\nSuite result: ok. 40 passed; 0 failed; 0 skipped; finished in 111.79ms (246.78ms CPU time)\n\nRan 40 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency1Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 319517, ~: 322521)\nLogs:\n  Bound result 17830\n  Bound result 255\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 156035, ~: 159985)\nLogs:\n  Bound result 31141059301280\n  Bound result 6938\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 865977, ~: 861440)\nLogs:\n  Bound result 96\n  Bound result 998\n  Bound result 148\n  Bound result 20000\n\n[PASS] test_beforeSwapGas() (gas: 72528)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 61729\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 48431)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 67887)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 572229)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 824232)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 266546)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 143259)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 165927)\n[PASS] test_exactOutputAtCapAllowed() (gas: 150409)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 140840)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 81284)\n[PASS] test_finalSecondGuarded() (gas: 88138)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 511289)\n[PASS] test_fullFeeExactOutputCannotBePreviewed() (gas: 381999)\n[PASS] test_fullSupplyAndInt256ExtremesRespectActualPartialFill() (gas: 955299)\n[PASS] test_hookDataCannotBypassCap() (gas: 85930)\n[PASS] test_initializationAndPermissions() (gas: 59234)\n[PASS] test_initializationAtTimestampZero() (gas: 104290)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41815)\n[PASS] test_initializationRejectsWrongHookAndLeavesNoTimer() (gas: 64182)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 498502)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 288105)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 263016)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157242)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1767297)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 288949)\n[PASS] test_nativeCurrencyPair() (gas: 524469)\n[PASS] test_newPoolTimerStartsAtInitializationNotHookDeployment() (gas: 427815)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3132188)\n[PASS] test_oneWeiAndJustBelowCapBuys() (gas: 361438)\n[PASS] test_previewRejectsWrongSideAndOutOfRangeLimits() (gas: 156412)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 168920)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 260120)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 409416)\n[PASS] test_timerCannotBeReset() (gas: 55546)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47578)\n[PASS] test_zeroAmountReturnsNeutralHookResultButManagerRejects() (gas: 90430)\nSuite result: ok. 40 passed; 0 failed; 0 skipped; finished in 112.97ms (220.32ms CPU time)\n\nRan 5 tests for test/LaunchGuardConstructor.t.sol:LaunchGuardConstructorTest\n[PASS] test_constructorFloorsOnePercentInTokenMinorUnits() (gas: 341596133)\n[PASS] test_constructorRejectsIncorrectAddressPermissions() (gas: 51561)\n[PASS] test_constructorRejectsMissingManagerCode() (gas: 30465968)\n[PASS] test_constructorRejectsMissingTokenCode() (gas: 26852945)\n[PASS] test_constructorRejectsZeroAndSubHundredSupply() (gas: 146260358)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 139.23ms (353.27ms CPU time)\n\nRan 2 tests for test/LaunchGuard.invariant.t.sol:GuardCurrency0InvariantTest\n[PASS] invariant_guardAndSettlementSurviveRandomSequences() (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------------+-------------+-------+---------+----------╮\n| Contract             | Selector    | Calls | Reverts | Discards |\n+=================================================================+\n| GuardSequenceHandler | advanceTime | 8061  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | fees        | 8345  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | liquidity   | 8180  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | swap        | 8182  | 0       | 0        |\n╰----------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 10682\n  Bound result 96\n  Bound result 0\n  Bound result 4000\n  Bound result 851\n  Bound result 298\n  Bound result 244\n  Bound result 193\n  Bound result 6541\n  Bound result 6454\n  Bound result 16823\n  Bound result 3283\n  Bound result 4\n  Bound result 7200\n  Bound result 134\n  Bound result 168\n  Bound result 3188\n  Bound result 255\n  Bound result 500\n  Bound result 131\n  Bound result 949\n  Bound result 2047\n  Bound result 15138\n  Bound result 1484\n  Bound result 14341\n  Bound result 123\n  Bound result 1016\n  Bound result 64\n  Bound result 244\n  Bound result 551\n  Bound result 28162514264337593543949542\n  Bound result 200\n  Bound result 19449852148893709520809729\n  Bound result 671\n  Bound result 254\n  Bound result 454\n  Bound result 804\n  Bound result 999\n  Bound result 41\n  Bound result 99999999999999999994538020\n  Bound result 461855584\n  Bound result 33084663689872170949483589\n  Bound result 395\n  Bound result 10203\n  Bound result 240\n  Bound result 12606\n  Bound result 0\n  Bound result 0\n  Bound result 284\n  Bound result 41\n  Bound result 3\n  Bound result 3845\n  Bound result 4691\n  Bound result 6000\n  Bound result 708\n  Bound result 1000\n  Bound result 1073\n  Bound result 6695\n  Bound result 4077\n  Bound result 187\n  Bound result 2000\n  Bound result 1809\n  Bound result 9005\n  Bound result 4888\n  Bound result 540\n  Bound result 14036\n  Bound result 9845\n  Bound result 511\n  Bound result 995\n  Bound result 3088\n  Bound result 366446893\n  Bound result 638\n  Bound result 2815\n  Bound result 15\n  Bound result 233177620\n  Bound result 997\n  Bound result 23\n  Bound result 1471\n  Bound result 1000\n  Bound result 41\n  Bound result 9469\n  Bound result 155\n  Bound result 19999999999999999999999999\n  Bound result 1\n  Bound result 28162514264337593543950334\n  Bound result 15882737686596145224041891\n  Bound result 830\n  Bound result 1072636043642859256744643\n  Bound result 0\n  Bound result 474\n  Bound result 3987\n  Bound result 34099323\n  Bound result 4000\n  Bound result 1932\n  Bound result 4606\n  Bound result 2\n  Bound result 123\n  Bound result 200\n  Bound result 197\n  Bound result 915\n  Bound result 1196\n  Bound result 338\n  Bound result 5537\n  Bound result 4000\n  Bound result 0\n  Bound result 8\n  Bound result 500\n  Bound result 2726972805\n  Bound result 97469325336006123445538661\n  Bound result 242\n  Bound result 4988\n  Bound result 4001\n  Bound result 99383916952811447147715756\n  Bound result 14322\n  Bound result 6335\n  Bound result 4001\n  Bound result 999\n  Bound result 231\n  Bound result 4975\n  Bound result 0\n  Bound result 832\n  Bound result 2019089570\n  Bound result 3091\n  Bound result 1\n  Bound result 418630441\n  Bound result 3951\n  Bound result 3520\n  Bound result 425\n  Bound result 345\n  Bound result 5869\n  Bound result 43\n  Bound result 191\n  Bound result 600\n  Bound result 6\n  Bound result 23\n  Bound result 3\n  Bound result 553388193561546335676\n  Bound result 6841\n  Bound result 10\n  Bound result 886\n  Bound result 2297\n  Bound result 12581\n  Bound result 2583\n  Bound result 516\n  Bound result 200\n  Bound result 7436\n  Bound result 2727\n  Bound result 701\n  Bound result 632\n  Bound result 705\n  Bound result 45038842895398042904625497\n  Bound result 3899\n  Bound result 15882737686596145224041890\n  Bound result 546\n  Bound result 441\n  Bound result 5\n  Bound result 200\n  Bound result 4\n  Bound result 3149\n  Bound result 531577931962768232104903\n  Bound result 5\n  Bound result 680\n  Bound result 7160\n  Bound result 15542\n  Bound result 4871\n  Bound result 543\n  Bound result 2368\n  Bound result 2010\n  Bound result 2526\n  Bound result 2\n  Bound result 16317529355\n  Bound result 500\n  Bound result 18\n  Bound result 644\n  Bound result 1\n  Bound result 5512\n  Bound result 3449\n  Bound result 4704\n  Bound result 1437\n  Bound result 3\n  Bound result 131551090863\n  Bound result 6263\n  Bound result 490\n  Bound result 469\n  Bound result 18\n  Bound result 6645\n  Bound result 3174\n  Bound result 4709\n  Bound result 3\n  Bound result 99\n  Bound result 34\n  Bound result 28162514264337593543950332\n  Bound result 594\n  Bound result 265\n\n[PASS] test_sequenceExercisesBothDecisionsAndExpiry() (gas: 2203428)\nLogs:\n  Bound result 4000\n  Bound result 1000000000000000000\n  Bound result 4000\n  Bound result 20000000000000000000000000\n  Bound result 100000000000000000000000000\n  Bound result 1000\n  Bound result 999\n  Bound result 4000\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 4000\n  Bound result 20000000000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.52s (9.48s CPU time)\n\nRan 2 tests for test/LaunchGuard.invariant.t.sol:GuardCurrency1InvariantTest\n[PASS] invariant_guardAndSettlementSurviveRandomSequences() (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------------+-------------+-------+---------+----------╮\n| Contract             | Selector    | Calls | Reverts | Discards |\n+=================================================================+\n| GuardSequenceHandler | advanceTime | 8061  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | fees        | 8345  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | liquidity   | 8180  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | swap        | 8182  | 0       | 0        |\n╰----------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 10572\n  Bound result 96\n  Bound result 0\n  Bound result 4000\n  Bound result 2336\n  Bound result 299\n  Bound result 243\n  Bound result 193\n  Bound result 6539\n  Bound result 3619\n  Bound result 16822\n  Bound result 230\n  Bound result 4\n  Bound result 7200\n  Bound result 134\n  Bound result 168\n  Bound result 2097\n  Bound result 255\n  Bound result 500\n  Bound result 650\n  Bound result 963\n  Bound result 5709\n  Bound result 1508384135\n  Bound result 3330\n  Bound result 13977\n  Bound result 123\n  Bound result 1016\n  Bound result 64\n  Bound result 244\n  Bound result 551\n  Bound result 28162514264337593543949542\n  Bound result 200\n  Bound result 3072\n  Bound result 420\n  Bound result 465\n  Bound result 328\n  Bound result 802\n  Bound result 999\n  Bound result 41\n  Bound result 99999999999999999999993432\n  Bound result 1360\n  Bound result 15556\n  Bound result 3941\n  Bound result 10150\n  Bound result 240\n  Bound result 13080\n  Bound result 0\n  Bound result 0\n  Bound result 299\n  Bound result 41\n  Bound result 3\n  Bound result 3843\n  Bound result 4727\n  Bound result 6000\n  Bound result 755\n  Bound result 1000\n  Bound result 1059\n  Bound result 6925\n  Bound result 4077\n  Bound result 187\n  Bound result 2000\n  Bound result 1667\n  Bound result 9090\n  Bound result 848\n  Bound result 4130\n  Bound result 14211\n  Bound result 9845\n  Bound result 511\n  Bound result 995\n  Bound result 3088\n  Bound result 366446892\n  Bound result 636\n  Bound result 2765\n  Bound result 15\n  Bound result 233177620\n  Bound result 997\n  Bound result 28\n  Bound result 400\n  Bound result 1000\n  Bound result 41\n  Bound result 10652\n  Bound result 6812\n  Bound result 1423\n  Bound result 1\n  Bound result 28162514264337593543950334\n  Bound result 99999999999999999999982995\n  Bound result 830\n  Bound result 1072636043642859256744643\n  Bound result 0\n  Bound result 474\n  Bound result 3987\n  Bound result 34099323\n  Bound result 4000\n  Bound result 334\n  Bound result 5742\n  Bound result 344\n  Bound result 123\n  Bound result 200\n  Bound result 865\n  Bound result 915\n  Bound result 5191\n  Bound result 14213509001999313124832244\n  Bound result 5360\n  Bound result 4195\n  Bound result 0\n  Bound result 8\n  Bound result 500\n  Bound result 3123\n  Bound result 97469325336006123445538661\n  Bound result 242\n  Bound result 4988\n  Bound result 8921\n  Bound result 1845258906410094015074850\n  Bound result 12571\n  Bound result 4129\n  Bound result 1776\n  Bound result 999\n  Bound result 155\n  Bound result 4975\n  Bound result 0\n  Bound result 832\n  Bound result 2019089570\n  Bound result 2917\n  Bound result 1\n  Bound result 2427\n  Bound result 2080\n  Bound result 2861\n  Bound result 374\n  Bound result 996\n  Bound result 3455\n  Bound result 424\n  Bound result 601\n  Bound result 600\n  Bound result 6\n  Bound result 23\n  Bound result 3\n  Bound result 553388193561546335676\n  Bound result 6841\n  Bound result 10\n  Bound result 8687\n  Bound result 2084\n  Bound result 12945\n  Bound result 2405\n  Bound result 1509\n  Bound result 200\n  Bound result 2631022646\n  Bound result 2727\n  Bound result 952\n  Bound result 806\n  Bound result 536\n  Bound result 3027350903588167515263416\n  Bound result 4741\n  Bound result 11886\n  Bound result 38\n  Bound result 254\n  Bound result 5\n  Bound result 710\n  Bound result 4\n  Bound result 1998\n  Bound result 16415213694279840518372341\n  Bound result 5\n  Bound result 680\n  Bound result 6834\n  Bound result 15190\n  Bound result 4688\n  Bound result 1889567282\n  Bound result 3144\n  Bound result 1465787572\n  Bound result 2526\n  Bound result 2\n  Bound result 16317529355\n  Bound result 500\n  Bound result 18\n  Bound result 509\n  Bound result 427\n  Bound result 4425\n  Bound result 2262\n  Bound result 2370\n  Bound result 2975\n  Bound result 3\n  Bound result 131551090863\n  Bound result 7033\n  Bound result 490\n  Bound result 469\n  Bound result 18\n  Bound result 704\n  Bound result 5234\n  Bound result 4819\n  Bound result 3\n  Bound result 99\n  Bound result 34\n  Bound result 28162514264337593543950332\n  Bound result 70\n  Bound result 85\n\n[PASS] test_sequenceExercisesBothDecisionsAndExpiry() (gas: 2176942)\nLogs:\n  Bound result 4000\n  Bound result 1000000000000000000\n  Bound result 4000\n  Bound result 20000000000000000000000000\n  Bound result 100000000000000000000000000\n  Bound result 1000\n  Bound result 999\n  Bound result 4000\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 4000\n  Bound result 20000000000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.90s (9.89s CPU time)\n\nRan 2 tests for test/LaunchToken.invariant.t.sol:LaunchTokenInvariantTest\n[PASS] invariant_balancesAndAllowancesMatchIndependentLedger() (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------------+------------------------+-------+---------+----------╮\n| Contract             | Selector               | Calls | Reverts | Discards |\n+============================================================================+\n| TokenSequenceHandler | approve                | 6648  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| TokenSequenceHandler | rejectOverspend        | 6612  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| TokenSequenceHandler | rejectRevokedAllowance | 6491  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| TokenSequenceHandler | transfer               | 6593  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| TokenSequenceHandler | transferFrom           | 6424  | 0       | 0        |\n╰----------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 6839145\n  Bound result 0\n  Bound result 184837681373609704004177424\n  Bound result 51\n  Bound result 0\n  Bound result 43\n  Bound result 17988584879005358297791943\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1328\n  Bound result 0\n  Bound result 0\n  Bound result 5328\n  Bound result 7200\n  Bound result 0\n  Bound result 0\n  Bound result 7200\n  Bound result 880831030\n  Bound result 35\n  Bound result 0\n  Bound result 5236\n  Bound result 841\n  Bound result 199\n  Bound result 0\n  Bound result 40\n  Bound result 887220\n  Bound result 235\n  Bound result 1959\n  Bound result 3\n  Bound result 0\n  Bound result 1\n  Bound result 3\n  Bound result 3163692635\n  Bound result 2233625728\n  Bound result 31536000\n  Bound result 0\n  Bound result 0\n  Bound result 6000\n  Bound result 1960\n  Bound result 151677095427932254129899026\n  Bound result 15590888567033886801442725\n  Bound result 0\n  Bound result 211959511290828545621575020\n  Bound result 110916117999536594946621701\n  Bound result 600\n  Bound result 1915\n  Bound result 7178014193\n  Bound result 0\n  Bound result 1\n  Bound result 0\n  Bound result 92683568723388506975858116\n  Bound result 5037\n  Bound result 86400\n\n[PASS] test_sequenceFullBalanceSelfTransferAndInfiniteApproval() (gas: 1662239)\nLogs:\n  Bound result 250000000000000000000000000\n  Bound result 250000000000000000000000000\n  Bound result 0\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.97s (9.97s CPU time)\n\nRan 7 test suites in 9.97s (29.76s CPU time): 97 tests passed, 0 failed, 0 skipped (97 total tests)\n","passed":true},{"durationMs":88,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchGuardHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"LaunchGuardHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"LaunchGuardHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"LaunchGuardHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":13,\"LICENSE\":21,\"README.md\":97,\"foundry.toml\":19,\"remappings.txt\":6,\"src/LaunchGuardHook.sol\":85,\"src/LaunchToken.sol\":11,\"src/libraries/SwapPreview.sol\":124,\"test/LaunchGuard.invariant.t.sol\":249,\"test/LaunchGuardConstructor.t.sol\":94,\"test/LaunchGuardHook.t.sol\":527,\"test/LaunchToken.invariant.t.sol\":141,\"test/LaunchToken.t.sol\":81,\"test/README.md\":47,\"test/helpers/PoolActions.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2cb761c5d74f2317a335da9b26a1c6df0256ca8262ec87a9fda4e151a180cfd2","verifiedTreeHash":"e9ffdc22708adbde79dcb506a004461409e9ab7e","verifierVersion":"0.1.0+da6bdbe5"},{"checks":[{"durationMs":16596,"exitCode":0,"name":"build","output":"Compiling 79 files with Solc 0.8.26\nSolc 0.8.26 finished in 16.46s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/LaunchGuardHook.sol:71:13\n   │\n71 │         if (block.timestamp < endsAt) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchGuardHook.sol:76:51\n   │\n76 │                 if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {\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":149,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(uint96) (runs: 256, μ: 84886, ~: 85291)\nLogs:\n  Bound result 76921505355397474714013314\n\n[PASS] test_allowanceAndTransferFrom() (gas: 157596)\n[PASS] test_fixedSupplyMetadataAndDeployerAllocation() (gas: 43878)\n[PASS] test_noMintOwnerPauseOrUpgradeEntryPoints() (gas: 126468)\n[PASS] test_runtimeHasNoEscapeHatches() (gas: 605835)\n[PASS] test_transferFailures() (gas: 56651)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 3.35ms (4.92ms CPU time)\n\nRan 33 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency1Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 320143, ~: 322487)\nLogs:\n  Bound result 21434088190825247781027\n  Bound result 1\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 156591, ~: 159829)\nLogs:\n  Bound result 5000000000000000000000000\n  Bound result 21705\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 864312, ~: 861114)\nLogs:\n  Bound result 37\n  Bound result 453\n  Bound result 4\n  Bound result 1\n\n[PASS] test_beforeSwapGas() (gas: 72396)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 61729\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 48374)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 67755)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 572229)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 824166)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 266414)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 143171)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 165927)\n[PASS] test_exactOutputAtCapAllowed() (gas: 150343)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 140823)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 81218)\n[PASS] test_finalSecondGuarded() (gas: 88006)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 511201)\n[PASS] test_hookDataCannotBypassCap() (gas: 85930)\n[PASS] test_initializationAndPermissions() (gas: 59102)\n[PASS] test_initializationAtTimestampZero() (gas: 104180)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41671)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 498392)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 287995)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 262950)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157088)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1767151)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 288883)\n[PASS] test_nativeCurrencyPair() (gas: 524337)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3131892)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 168985)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 259988)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 409284)\n[PASS] test_timerCannotBeReset() (gas: 55480)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47447)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 56.22ms (122.27ms CPU time)\n\nRan 33 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency0Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 302758, ~: 305072)\nLogs:\n  Bound result 982373836013828\n  Bound result 6752\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 152292, ~: 155920)\nLogs:\n  Bound result 21434088190825247781027\n  Bound result 1\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 865507, ~: 861196)\nLogs:\n  Bound result 3\n  Bound result 0\n  Bound result 18407\n  Bound result 5\n\n[PASS] test_beforeSwapGas() (gas: 65313)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 54634\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 48579)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 67947)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 562227)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 839304)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 262148)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 129015)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 155163)\n[PASS] test_exactOutputAtCapAllowed() (gas: 146213)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 129477)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 81101)\n[PASS] test_finalSecondGuarded() (gas: 82338)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 492374)\n[PASS] test_hookDataCannotBypassCap() (gas: 78847)\n[PASS] test_initializationAndPermissions() (gas: 59102)\n[PASS] test_initializationAtTimestampZero() (gas: 104063)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41671)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 498338)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 279033)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 259876)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157088)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1786919)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 284589)\n[PASS] test_nativeCurrencyPair() (gas: 524337)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3131892)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 161912)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 264416)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 409121)\n[PASS] test_timerCannotBeReset() (gas: 55363)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47639)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 57.80ms (127.38ms CPU time)\n\nRan 3 test suites in 58.54ms (117.36ms CPU time): 72 tests passed, 0 failed, 0 skipped (72 total tests)\n","passed":true},{"durationMs":43,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchGuardHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"LaunchGuardHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"LaunchGuardHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"LaunchGuardHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":13,\"LICENSE\":21,\"README.md\":97,\"foundry.toml\":19,\"launch.json\":21,\"remappings.txt\":6,\"src/LaunchGuardHook.sol\":85,\"src/LaunchToken.sol\":11,\"src/libraries/SwapPreview.sol\":124,\"test/LaunchGuardHook.t.sol\":448,\"test/LaunchToken.t.sol\":81,\"test/helpers/PoolActions.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"launch.json: constructor argument \"$token\" is neither an address nor an integer, and a launch manifest can express nothing else","evaluation":"checks","profile":"foundry","status":"rejected","submissionHash":"82342240ac5371e64bd0b2caaf84315f6126e75598231432bd43074dcbfcc3c8","verifiedTreeHash":"59acb562e9a8fe3badfe61b19138b15cd53a02ab","verifierVersion":"0.1.0+da6bdbe5"},{"checks":[{"durationMs":19756,"exitCode":0,"name":"build","output":"Compiling 79 files with Solc 0.8.26\nSolc 0.8.26 finished in 19.60s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/LaunchGuardHook.sol:71:13\n   │\n71 │         if (block.timestamp < endsAt) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchGuardHook.sol:76:51\n   │\n76 │                 if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {\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":195,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(uint96) (runs: 256, μ: 84793, ~: 85285)\nLogs:\n  Bound result 2732146574687441156156449\n\n[PASS] test_allowanceAndTransferFrom() (gas: 157596)\n[PASS] test_fixedSupplyMetadataAndDeployerAllocation() (gas: 43878)\n[PASS] test_noMintOwnerPauseOrUpgradeEntryPoints() (gas: 126468)\n[PASS] test_runtimeHasNoEscapeHatches() (gas: 605835)\n[PASS] test_transferFailures() (gas: 56651)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 3.90ms (6.05ms CPU time)\n\nRan 33 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency0Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 302114, ~: 305040)\nLogs:\n  Bound result 2765\n  Bound result 500\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 151785, ~: 155920)\nLogs:\n  Bound result 23914519433553444846\n  Bound result 13\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 867701, ~: 861122)\nLogs:\n  Bound result 242\n  Bound result 369\n  Bound result 340\n  Bound result 1577\n\n[PASS] test_beforeSwapGas() (gas: 65313)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 54634\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 48579)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 67947)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 562227)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 839304)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 262148)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 129015)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 155163)\n[PASS] test_exactOutputAtCapAllowed() (gas: 146213)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 129477)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 81101)\n[PASS] test_finalSecondGuarded() (gas: 82338)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 492374)\n[PASS] test_hookDataCannotBypassCap() (gas: 78847)\n[PASS] test_initializationAndPermissions() (gas: 59102)\n[PASS] test_initializationAtTimestampZero() (gas: 104063)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41671)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 498338)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 279033)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 259876)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157088)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1786919)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 284589)\n[PASS] test_nativeCurrencyPair() (gas: 524337)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3131892)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 161912)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 264416)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 409121)\n[PASS] test_timerCannotBeReset() (gas: 55363)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47639)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 65.81ms (144.72ms CPU time)\n\nRan 33 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency1Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 319274, ~: 322455)\nLogs:\n  Bound result 23914519433553444846\n  Bound result 5\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 155841, ~: 159829)\nLogs:\n  Bound result 382409608578\n  Bound result 422\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 867255, ~: 861098)\nLogs:\n  Bound result 24\n  Bound result 47\n  Bound result 5662498510311169720048478\n  Bound result 6\n\n[PASS] test_beforeSwapGas() (gas: 72396)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 61729\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 48374)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 67755)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 572229)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 824166)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 266414)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 143171)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 165927)\n[PASS] test_exactOutputAtCapAllowed() (gas: 150343)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 140823)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 81218)\n[PASS] test_finalSecondGuarded() (gas: 88006)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 511201)\n[PASS] test_hookDataCannotBypassCap() (gas: 85930)\n[PASS] test_initializationAndPermissions() (gas: 59102)\n[PASS] test_initializationAtTimestampZero() (gas: 104180)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41671)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 498392)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 287995)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 262950)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157088)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1767151)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 288883)\n[PASS] test_nativeCurrencyPair() (gas: 524337)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3131892)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 168985)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 259988)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 409284)\n[PASS] test_timerCannotBeReset() (gas: 55480)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47447)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 70.72ms (147.98ms CPU time)\n\nRan 3 test suites in 71.72ms (140.42ms CPU time): 72 tests passed, 0 failed, 0 skipped (72 total tests)\n","passed":true},{"durationMs":67,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchGuardHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"LaunchGuardHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"LaunchGuardHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"LaunchGuardHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":13,\"LICENSE\":21,\"README.md\":97,\"foundry.toml\":19,\"launch.json\":21,\"remappings.txt\":6,\"src/LaunchGuardHook.sol\":85,\"src/LaunchToken.sol\":11,\"src/libraries/SwapPreview.sol\":124,\"test/LaunchGuardHook.t.sol\":448,\"test/LaunchToken.t.sol\":81,\"test/helpers/PoolActions.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"84d3f2e2f030507574e1ad4a4a27b067a46f3e28e48d3acbe702452e81f39782","verifiedTreeHash":"f3cf4668e5e6d84c732b40d3b80aa45dc3587527","verifierVersion":"0.1.0+da6bdbe5"},{"checks":[{"durationMs":26644,"exitCode":0,"name":"build","output":"Compiling 79 files with Solc 0.8.26\nSolc 0.8.26 finished in 26.44s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/LaunchGuardHook.sol:77:13\n   │\n77 │         if (block.timestamp < endsAt) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchGuardHook.sol:82:51\n   │\n82 │                 if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {\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":263,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(uint96) (runs: 256, μ: 85054, ~: 85291)\nLogs:\n  Bound result 1872937118\n\n[PASS] test_allowanceAndTransferFrom() (gas: 157596)\n[PASS] test_fixedSupplyMetadataAndDeployerAllocation() (gas: 43878)\n[PASS] test_noMintOwnerPauseOrUpgradeEntryPoints() (gas: 126468)\n[PASS] test_runtimeHasNoEscapeHatches() (gas: 605835)\n[PASS] test_transferFailures() (gas: 56651)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 27.56ms (29.92ms CPU time)\n\nRan 37 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency1Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 321003, ~: 324632)\nLogs:\n  Bound result 7903\n  Bound result 256\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 158046, ~: 161993)\nLogs:\n  Bound result 7903\n  Bound result 10256\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 865303, ~: 861759)\nLogs:\n  Bound result 12\n  Bound result 607\n  Bound result 4\n  Bound result 17\n\n[PASS] test_beforeSwapGas() (gas: 74562)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 63829\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 50518)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 67843)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 576573)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 826310)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 266504)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 147415)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 168027)\n[PASS] test_exactOutputAtCapAllowed() (gas: 152487)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 145243)\n[PASS] test_failedFirstInitializationRollsBackCapAndTimer() (gas: 713047)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 83384)\n[PASS] test_finalSecondGuarded() (gas: 90293)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 515466)\n[PASS] test_hookDataCannotBypassCap() (gas: 88052)\n[PASS] test_hookDeploysBeforeTokenAndValidatesAtInitialization() (gas: 9206834)\n[PASS] test_initializationAndPermissions() (gas: 61296)\n[PASS] test_initializationAtTimestampZero() (gas: 106368)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41793)\n[PASS] test_initializationRejectsSupplyTooSmallForCap() (gas: 724175)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 502679)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 292360)\n[PASS] test_laterPoolsDoNotResolveSupplyAgain() (gas: 136034)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 267194)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157176)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1769339)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 288929)\n[PASS] test_nativeCurrencyPair() (gas: 530746)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3196665)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 171107)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 260078)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 413571)\n[PASS] test_timerCannotBeReset() (gas: 55526)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47492)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 94.87ms (282.24ms CPU time)\n\nRan 37 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency0Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 303489, ~: 307202)\nLogs:\n  Bound result 14066\n  Bound result 120\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 153529, ~: 158084)\nLogs:\n  Bound result 478\n  Bound result 171240\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 865363, ~: 861395)\nLogs:\n  Bound result 12\n  Bound result 607\n  Bound result 4\n  Bound result 17\n\n[PASS] test_beforeSwapGas() (gas: 67479)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 56734\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 50723)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 68035)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 566571)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 841448)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 262238)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 133259)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 157263)\n[PASS] test_exactOutputAtCapAllowed() (gas: 148357)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 133897)\n[PASS] test_failedFirstInitializationRollsBackCapAndTimer() (gas: 117285147)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 83267)\n[PASS] test_finalSecondGuarded() (gas: 84625)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 496639)\n[PASS] test_hookDataCannotBypassCap() (gas: 80969)\n[PASS] test_hookDeploysBeforeTokenAndValidatesAtInitialization() (gas: 9206834)\n[PASS] test_initializationAndPermissions() (gas: 61296)\n[PASS] test_initializationAtTimestampZero() (gas: 106251)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41793)\n[PASS] test_initializationRejectsSupplyTooSmallForCap() (gas: 117332540)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 502625)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 283398)\n[PASS] test_laterPoolsDoNotResolveSupplyAgain() (gas: 135917)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 264120)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157176)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1789107)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 284635)\n[PASS] test_nativeCurrencyPair() (gas: 530746)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3196665)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 164034)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 264506)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 413408)\n[PASS] test_timerCannotBeReset() (gas: 55409)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47684)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 107.06ms (537.38ms CPU time)\n\nRan 3 test suites in 108.01ms (229.49ms CPU time): 80 tests passed, 0 failed, 0 skipped (80 total tests)\n","passed":true},{"durationMs":81,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchGuardHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"LaunchGuardHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"LaunchGuardHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"LaunchGuardHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":13,\"LICENSE\":21,\"README.md\":97,\"foundry.toml\":19,\"launch.json\":21,\"remappings.txt\":6,\"src/LaunchGuardHook.sol\":91,\"src/LaunchToken.sol\":11,\"src/libraries/SwapPreview.sol\":124,\"test/LaunchGuardHook.t.sol\":537,\"test/LaunchToken.t.sol\":81,\"test/helpers/PoolActions.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"be87e672deda0797377a8bc0b42058deeb0c6658ad5a012a061ed5e4d3f984ea","verifiedTreeHash":"c419201bf579ff6e1f5671d3243768e6bf172a4b","verifierVersion":"0.1.0+da6bdbe5"},{"checks":[{"durationMs":17358,"exitCode":0,"name":"build","output":"Compiling 79 files with Solc 0.8.26\nSolc 0.8.26 finished in 17.23s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/LaunchGuardHook.sol:77:13\n   │\n77 │         if (block.timestamp < endsAt) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchGuardHook.sol:82:51\n   │\n82 │                 if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {\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":168,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(uint96) (runs: 256, μ: 84439, ~: 85279)\nLogs:\n  Bound result 18446744073709551614\n\n[PASS] test_allowanceAndTransferFrom() (gas: 157596)\n[PASS] test_fixedSupplyMetadataAndDeployerAllocation() (gas: 43878)\n[PASS] test_noMintOwnerPauseOrUpgradeEntryPoints() (gas: 126468)\n[PASS] test_runtimeHasNoEscapeHatches() (gas: 605835)\n[PASS] test_transferFailures() (gas: 56651)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 3.84ms (5.47ms CPU time)\n\nRan 37 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency1Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 320478, ~: 324632)\nLogs:\n  Bound result 3\n  Bound result 869\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 155831, ~: 161993)\nLogs:\n  Bound result 567873255\n  Bound result 85\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 866830, ~: 861915)\nLogs:\n  Bound result 102\n  Bound result 94\n  Bound result 15018249076507757\n  Bound result 5262\n\n[PASS] test_beforeSwapGas() (gas: 74562)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 63829\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 50518)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 67843)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 576573)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 826310)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 266504)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 147415)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 168027)\n[PASS] test_exactOutputAtCapAllowed() (gas: 152487)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 145243)\n[PASS] test_failedFirstInitializationRollsBackCapAndTimer() (gas: 713047)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 83384)\n[PASS] test_finalSecondGuarded() (gas: 90293)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 515466)\n[PASS] test_hookDataCannotBypassCap() (gas: 88052)\n[PASS] test_hookDeploysBeforeTokenAndValidatesAtInitialization() (gas: 9206834)\n[PASS] test_initializationAndPermissions() (gas: 61296)\n[PASS] test_initializationAtTimestampZero() (gas: 106368)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41793)\n[PASS] test_initializationRejectsSupplyTooSmallForCap() (gas: 724175)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 502679)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 292360)\n[PASS] test_laterPoolsDoNotResolveSupplyAgain() (gas: 136034)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 267194)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157176)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1769339)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 288929)\n[PASS] test_nativeCurrencyPair() (gas: 530746)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3196665)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 171107)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 260078)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 413571)\n[PASS] test_timerCannotBeReset() (gas: 55526)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47492)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 49.67ms (151.45ms CPU time)\n\nRan 37 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency0Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 302720, ~: 307209)\nLogs:\n  Bound result 5707\n  Bound result 4150\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 151231, ~: 158084)\nLogs:\n  Bound result 16980208229159328950406377\n  Bound result 38\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 865894, ~: 861583)\nLogs:\n  Bound result 157\n  Bound result 831\n  Bound result 5871\n  Bound result 1\n\n[PASS] test_beforeSwapGas() (gas: 67479)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 56734\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 50723)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 68035)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 566571)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 841448)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 262238)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 133259)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 157263)\n[PASS] test_exactOutputAtCapAllowed() (gas: 148357)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 133897)\n[PASS] test_failedFirstInitializationRollsBackCapAndTimer() (gas: 117285147)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 83267)\n[PASS] test_finalSecondGuarded() (gas: 84625)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 496639)\n[PASS] test_hookDataCannotBypassCap() (gas: 80969)\n[PASS] test_hookDeploysBeforeTokenAndValidatesAtInitialization() (gas: 9206834)\n[PASS] test_initializationAndPermissions() (gas: 61296)\n[PASS] test_initializationAtTimestampZero() (gas: 106251)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41793)\n[PASS] test_initializationRejectsSupplyTooSmallForCap() (gas: 117332540)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 502625)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 283398)\n[PASS] test_laterPoolsDoNotResolveSupplyAgain() (gas: 135917)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 264120)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157176)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1789107)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 284635)\n[PASS] test_nativeCurrencyPair() (gas: 530746)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3196665)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 164034)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 264506)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 413408)\n[PASS] test_timerCannotBeReset() (gas: 55409)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47684)\nSuite result: ok. 37 passed; 0 failed; 0 skipped; finished in 79.87ms (303.02ms CPU time)\n\nRan 3 test suites in 80.63ms (133.38ms CPU time): 80 tests passed, 0 failed, 0 skipped (80 total tests)\n","passed":true},{"durationMs":55,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchGuardHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"LaunchGuardHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"LaunchGuardHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"LaunchGuardHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":13,\"LICENSE\":21,\"README.md\":97,\"foundry.toml\":19,\"remappings.txt\":6,\"src/LaunchGuardHook.sol\":91,\"src/LaunchToken.sol\":11,\"src/libraries/SwapPreview.sol\":124,\"test/LaunchGuardHook.t.sol\":537,\"test/LaunchToken.t.sol\":81,\"test/helpers/PoolActions.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2443,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/LaunchGuardHook.sol:69: LaunchGuardHook._beforeSwap(address,PoolKey,SwapParams,bytes) (src/LaunchGuardHook.sol#69-90) uses a dangerous strict equality:\n[low/medium] timestamp at src/LaunchGuardHook.sol:47: LaunchGuardHook._beforeInitialize(address,PoolKey,uint160) (src/LaunchGuardHook.sol#47-67) uses timestamp for comparisons\n[low/medium] timestamp at src/LaunchGuardHook.sol:69: LaunchGuardHook._beforeSwap(address,PoolKey,SwapParams,bytes) (src/LaunchGuardHook.sol#69-90) uses timestamp for comparisons","passed":true},{"durationMs":488,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/LaunchToken.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/libraries/SwapPreview.sol:113: Literal Instead of Constant (2 places)\n[low] require-revert-in-loop at src/libraries/SwapPreview.sol:70: Loop Contains `require`/`revert`","passed":true},{"durationMs":6798,"exitCode":0,"name":"proof 0c2f2cc7b44d","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 6.27s\nCompiler run successful!\n\nRan 1 test for test/imd-proof-e198a917/Proof_0c2f2cc7b44d.t.sol:ConstructorRequiresTokenCodeTest\n[PASS] test_hookDeploysWhenTokenAddressHasNoCodeYet() (gas: 24356416)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 16.60ms (16.34ms CPU time)\n\nRan 1 test suite in 17.20ms (16.60ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"ca0b6c05bcfc624b995cf18afc3ea175aa3504f6e945d201ac2ad808691ddcc0","verifiedTreeHash":"bee75ce13887ad4af310601f602dc2763f24450d","verifierVersion":"0.1.0+da6bdbe5"},{"checks":[{"durationMs":34444,"exitCode":0,"name":"build","output":"Compiling 82 files with Solc 0.8.26\nSolc 0.8.26 finished in 34.31s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/LaunchGuardHook.sol:77:13\n   │\n77 │         if (block.timestamp < endsAt) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchGuardHook.sol:82:51\n   │\n82 │                 if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {\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":7127,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 44 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency1Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 321333, ~: 324698)\nLogs:\n  Bound result 3703\n  Bound result 1200\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 157496, ~: 162125)\nLogs:\n  Bound result 7417\n  Bound result 51966\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 865161, ~: 861563)\nLogs:\n  Bound result 801\n  Bound result 201\n  Bound result 4599\n  Bound result 10482\n\n[PASS] test_beforeSwapGas() (gas: 74694)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 63829\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 50575)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 67975)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 576573)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 826376)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 266636)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 147503)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 168027)\n[PASS] test_exactOutputAtCapAllowed() (gas: 152553)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 145260)\n[PASS] test_failedFirstInitializationRollsBackCapAndTimer() (gas: 713091)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 83450)\n[PASS] test_finalSecondGuarded() (gas: 90425)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 515554)\n[PASS] test_fullFeeExactOutputCannotBePreviewed() (gas: 386363)\n[PASS] test_fullSupplyAndInt256ExtremesRespectActualPartialFill() (gas: 961888)\n[PASS] test_hookDataCannotBypassCap() (gas: 88052)\n[PASS] test_hookDeploysBeforeTokenAndValidatesAtInitialization() (gas: 9206966)\n[PASS] test_initializationAndPermissions() (gas: 61428)\n[PASS] test_initializationAtTimestampZero() (gas: 106478)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41859)\n[PASS] test_initializationRejectsSupplyTooSmallForCap() (gas: 724263)\n[PASS] test_initializationRejectsWrongHookAndLeavesNoTimer() (gas: 64206)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 502789)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 292470)\n[PASS] test_laterPoolsDoNotResolveSupplyAgain() (gas: 136034)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 267260)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157330)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1769485)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 288995)\n[PASS] test_nativeCurrencyPair() (gas: 530878)\n[PASS] test_newPoolTimerStartsAtInitializationNotHookDeployment() (gas: 432202)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3196961)\n[PASS] test_oneWeiAndJustBelowCapBuys() (gas: 367804)\n[PASS] test_previewRejectsWrongSideAndOutOfRangeLimits() (gas: 164834)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 171042)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 260210)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 413703)\n[PASS] test_timerCannotBeReset() (gas: 55592)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47623)\n[PASS] test_zeroAmountReturnsNeutralHookResultButManagerRejects() (gas: 92574)\nSuite result: ok. 44 passed; 0 failed; 0 skipped; finished in 66.99ms (179.92ms CPU time)\n\nRan 7 tests for test/LaunchGuardConstructor.t.sol:LaunchGuardConstructorTest\n[PASS] test_constructorRejectsIncorrectAddressPermissions() (gas: 51616)\n[PASS] test_constructorRejectsMissingManagerCode() (gas: 34677653)\n[PASS] test_constructorRejectsZeroTokenAddress() (gas: 8164095)\n[PASS] test_initializationFloorsOnePercentInTokenMinorUnits() (gas: 125933796)\n[PASS] test_initializationRejectsMissingTokenCode() (gas: 2927216)\n[PASS] test_initializationRejectsZeroAndSubHundredSupply() (gas: 80231718)\n[PASS] test_revertingSupplyReadIsDeferredAndInitializationCanRetry() (gas: 66779088)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 70.53ms (210.55ms CPU time)\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(uint96) (runs: 256, μ: 84804, ~: 85303)\nLogs:\n  Bound result 1\n\n[PASS] test_allowanceAndTransferFrom() (gas: 157596)\n[PASS] test_fixedSupplyMetadataAndDeployerAllocation() (gas: 43878)\n[PASS] test_noMintOwnerPauseOrUpgradeEntryPoints() (gas: 126468)\n[PASS] test_runtimeHasNoEscapeHatches() (gas: 605835)\n[PASS] test_transferFailures() (gas: 56651)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 70.60ms (39.35ms CPU time)\n\nRan 44 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency0Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 304202, ~: 307283)\nLogs:\n  Bound result 2070\n  Bound result 8879\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 153429, ~: 158216)\nLogs:\n  Bound result 4055\n  Bound result 23215\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 864991, ~: 861529)\nLogs:\n  Bound result 15\n  Bound result 20\n  Bound result 3\n  Bound result 8\n\n[PASS] test_beforeSwapGas() (gas: 67611)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 56734\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 50780)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 68167)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 566571)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 841514)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 262370)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 133347)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 157263)\n[PASS] test_exactOutputAtCapAllowed() (gas: 148423)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 133914)\n[PASS] test_failedFirstInitializationRollsBackCapAndTimer() (gas: 117285191)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 83333)\n[PASS] test_finalSecondGuarded() (gas: 84757)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 496727)\n[PASS] test_fullFeeExactOutputCannotBePreviewed() (gas: 386463)\n[PASS] test_fullSupplyAndInt256ExtremesRespectActualPartialFill() (gas: 917809)\n[PASS] test_hookDataCannotBypassCap() (gas: 80969)\n[PASS] test_hookDeploysBeforeTokenAndValidatesAtInitialization() (gas: 9206966)\n[PASS] test_initializationAndPermissions() (gas: 61428)\n[PASS] test_initializationAtTimestampZero() (gas: 106361)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41859)\n[PASS] test_initializationRejectsSupplyTooSmallForCap() (gas: 117332628)\n[PASS] test_initializationRejectsWrongHookAndLeavesNoTimer() (gas: 64206)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 502735)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 283508)\n[PASS] test_laterPoolsDoNotResolveSupplyAgain() (gas: 135917)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 264186)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157330)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1789253)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 284701)\n[PASS] test_nativeCurrencyPair() (gas: 530878)\n[PASS] test_newPoolTimerStartsAtInitializationNotHookDeployment() (gas: 426407)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3196961)\n[PASS] test_oneWeiAndJustBelowCapBuys() (gas: 365510)\n[PASS] test_previewRejectsWrongSideAndOutOfRangeLimits() (gas: 164949)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 163969)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 264638)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 413540)\n[PASS] test_timerCannotBeReset() (gas: 55475)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47815)\n[PASS] test_zeroAmountReturnsNeutralHookResultButManagerRejects() (gas: 92981)\nSuite result: ok. 44 passed; 0 failed; 0 skipped; finished in 77.46ms (314.67ms CPU time)\n\nRan 2 tests for test/LaunchToken.invariant.t.sol:LaunchTokenInvariantTest\n[PASS] invariant_balancesAndAllowancesMatchIndependentLedger() (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------------+------------------------+-------+---------+----------╮\n| Contract             | Selector               | Calls | Reverts | Discards |\n+============================================================================+\n| TokenSequenceHandler | approve                | 6384  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| TokenSequenceHandler | rejectOverspend        | 6532  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| TokenSequenceHandler | rejectRevokedAllowance | 6587  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| TokenSequenceHandler | transfer               | 6546  | 0       | 0        |\n|----------------------+------------------------+-------+---------+----------|\n| TokenSequenceHandler | transferFrom           | 6719  | 0       | 0        |\n╰----------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 10000000000000000000000000\n  Bound result 70745666293553176047776452\n  Bound result 1889567282\n  Bound result 0\n  Bound result 2380\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 21193362862409383821248397\n  Bound result 248\n  Bound result 5267\n  Bound result 3294\n  Bound result 6010\n  Bound result 0\n  Bound result 1\n  Bound result 2086\n  Bound result 83268976216928950394901181\n  Bound result 59\n  Bound result 57100469594486046226003711\n  Bound result 0\n  Bound result 240\n  Bound result 28162514264337593542096726\n  Bound result 5169\n  Bound result 93108051016184754036228890\n  Bound result 1994\n  Bound result 1855\n  Bound result 2385\n  Bound result 14637881677548375200356177\n  Bound result 0\n  Bound result 6298\n  Bound result 19999999999999999999999996\n  Bound result 41\n  Bound result 7679\n  Bound result 4157\n  Bound result 999\n  Bound result 281\n  Bound result 1599\n  Bound result 2527\n  Bound result 3593\n  Bound result 4\n  Bound result 721\n  Bound result 31536000\n\n[PASS] test_sequenceFullBalanceSelfTransferAndInfiniteApproval() (gas: 1662239)\nLogs:\n  Bound result 250000000000000000000000000\n  Bound result 250000000000000000000000000\n  Bound result 0\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.84s (6.84s CPU time)\n\nRan 2 tests for test/LaunchGuard.invariant.t.sol:GuardCurrency1InvariantTest\n[PASS] invariant_guardAndSettlementSurviveRandomSequences() (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------------+-------------+-------+---------+----------╮\n| Contract             | Selector    | Calls | Reverts | Discards |\n+=================================================================+\n| GuardSequenceHandler | advanceTime | 8360  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | fees        | 8109  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | liquidity   | 8104  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | swap        | 8195  | 0       | 0        |\n╰----------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 95\n  Bound result 504\n  Bound result 4897\n  Bound result 240\n  Bound result 12\n  Bound result 5\n  Bound result 10272\n  Bound result 1000\n  Bound result 2696\n  Bound result 633\n  Bound result 5\n  Bound result 207644153024005457481999\n  Bound result 3215\n  Bound result 9034\n  Bound result 825\n  Bound result 123\n  Bound result 580\n  Bound result 38\n  Bound result 5209\n  Bound result 18\n  Bound result 417\n  Bound result 8686\n  Bound result 40\n  Bound result 242\n  Bound result 1646\n  Bound result 6517\n  Bound result 6597\n  Bound result 814\n  Bound result 193\n  Bound result 13658\n  Bound result 200\n  Bound result 208\n  Bound result 2874\n  Bound result 1293\n  Bound result 3524\n  Bound result 419\n  Bound result 839\n  Bound result 3600\n  Bound result 58180398758015949026342439\n  Bound result 471\n  Bound result 2462\n  Bound result 2202\n  Bound result 10204\n  Bound result 9718\n  Bound result 638\n  Bound result 10609\n  Bound result 1\n  Bound result 2857\n  Bound result 7189\n  Bound result 328\n  Bound result 969\n  Bound result 2221\n  Bound result 266\n  Bound result 1\n  Bound result 255\n  Bound result 1362\n  Bound result 120\n  Bound result 434\n  Bound result 96\n  Bound result 6186\n  Bound result 7161\n  Bound result 18\n  Bound result 881\n  Bound result 2021703694015996010595568\n  Bound result 82273\n  Bound result 14885\n  Bound result 25\n  Bound result 616\n  Bound result 15901334317981904408831113\n  Bound result 10945\n  Bound result 199\n  Bound result 18\n  Bound result 238\n  Bound result 2074\n  Bound result 3012\n  Bound result 975\n  Bound result 1946716762202\n  Bound result 2165\n  Bound result 2182\n  Bound result 599\n  Bound result 14\n  Bound result 1000\n  Bound result 12479\n  Bound result 6470\n  Bound result 40\n  Bound result 2835717307\n  Bound result 266\n  Bound result 95\n  Bound result 29999999999999999999986785\n  Bound result 99\n  Bound result 1\n  Bound result 378\n  Bound result 199\n  Bound result 255\n  Bound result 124848\n  Bound result 6086\n  Bound result 4759\n  Bound result 6735\n  Bound result 5192\n  Bound result 4505\n  Bound result 199\n  Bound result 356\n  Bound result 838\n  Bound result 670\n  Bound result 127\n  Bound result 1010744596256112074760549\n  Bound result 2882\n  Bound result 98974552055189994142386961\n  Bound result 2860\n  Bound result 79956825542407220\n  Bound result 7039\n  Bound result 18\n  Bound result 4722366482869645213696\n  Bound result 6929\n  Bound result 5673\n  Bound result 2112\n  Bound result 6000\n  Bound result 13564\n  Bound result 1436\n  Bound result 5558\n  Bound result 112\n  Bound result 5489\n  Bound result 2734\n  Bound result 29290874479340209271700954\n  Bound result 25350915038479951224\n  Bound result 3807\n  Bound result 915\n  Bound result 1\n  Bound result 17399\n  Bound result 3179\n  Bound result 126\n  Bound result 231\n  Bound result 518\n  Bound result 1440\n  Bound result 5\n  Bound result 160688916\n  Bound result 999\n  Bound result 518\n  Bound result 3384\n  Bound result 4262\n  Bound result 29999999999999999999984315\n  Bound result 11879\n  Bound result 96\n  Bound result 10\n  Bound result 123\n  Bound result 1112\n  Bound result 3\n  Bound result 531\n  Bound result 19\n  Bound result 470\n  Bound result 114\n  Bound result 513\n  Bound result 2862\n  Bound result 4594638\n  Bound result 999\n  Bound result 87114\n  Bound result 4306\n  Bound result 7241\n  Bound result 4815\n  Bound result 255\n  Bound result 6631\n  Bound result 1852\n  Bound result 2973\n  Bound result 7350\n  Bound result 6691\n  Bound result 3000\n  Bound result 15675843670461859945186657\n  Bound result 1837366888\n  Bound result 3110\n  Bound result 1907\n  Bound result 7862\n  Bound result 55752589591\n  Bound result 66\n  Bound result 715\n  Bound result 2\n  Bound result 150\n  Bound result 2854\n  Bound result 707\n  Bound result 127\n  Bound result 242\n  Bound result 12104\n  Bound result 200\n  Bound result 7025\n  Bound result 15\n  Bound result 65\n  Bound result 242\n  Bound result 157\n  Bound result 5732\n\n[PASS] test_sequenceExercisesBothDecisionsAndExpiry() (gas: 2183359)\nLogs:\n  Bound result 4000\n  Bound result 1000000000000000000\n  Bound result 4000\n  Bound result 20000000000000000000000000\n  Bound result 100000000000000000000000000\n  Bound result 1000\n  Bound result 999\n  Bound result 4000\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 4000\n  Bound result 20000000000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.88s (6.86s CPU time)\n\nRan 2 tests for test/LaunchGuard.invariant.t.sol:GuardCurrency0InvariantTest\n[PASS] invariant_guardAndSettlementSurviveRandomSequences() (runs: 256, calls: 32768, reverts: 0)\n\n╭----------------------+-------------+-------+---------+----------╮\n| Contract             | Selector    | Calls | Reverts | Discards |\n+=================================================================+\n| GuardSequenceHandler | advanceTime | 8360  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | fees        | 8109  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | liquidity   | 8104  | 0       | 0        |\n|----------------------+-------------+-------+---------+----------|\n| GuardSequenceHandler | swap        | 8195  | 0       | 0        |\n╰----------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 95\n  Bound result 555\n  Bound result 4898\n  Bound result 240\n  Bound result 12\n  Bound result 5\n  Bound result 14423199\n  Bound result 1000\n  Bound result 9239\n  Bound result 184\n  Bound result 5\n  Bound result 207644153024005457481998\n  Bound result 4216\n  Bound result 12277\n  Bound result 825\n  Bound result 123\n  Bound result 579\n  Bound result 38\n  Bound result 2881\n  Bound result 18\n  Bound result 932\n  Bound result 8686\n  Bound result 40\n  Bound result 242\n  Bound result 1688\n  Bound result 15183\n  Bound result 6696\n  Bound result 814\n  Bound result 193\n  Bound result 13627\n  Bound result 200\n  Bound result 208\n  Bound result 4346\n  Bound result 1293\n  Bound result 11541099515866486500396141\n  Bound result 450\n  Bound result 42\n  Bound result 3600\n  Bound result 58180398758015949026342439\n  Bound result 471\n  Bound result 9830\n  Bound result 4755\n  Bound result 726\n  Bound result 3788\n  Bound result 5006\n  Bound result 10490\n  Bound result 1\n  Bound result 2566\n  Bound result 7189\n  Bound result 327\n  Bound result 971\n  Bound result 4691\n  Bound result 266\n  Bound result 1\n  Bound result 255\n  Bound result 1364\n  Bound result 120\n  Bound result 4187895484\n  Bound result 96\n  Bound result 13468\n  Bound result 6776\n  Bound result 18\n  Bound result 2455\n  Bound result 7319890\n  Bound result 82273\n  Bound result 4105\n  Bound result 25\n  Bound result 616\n  Bound result 1025447944810010002854230\n  Bound result 4824\n  Bound result 199\n  Bound result 18\n  Bound result 238\n  Bound result 2074\n  Bound result 1049616\n  Bound result 975\n  Bound result 1946716762202\n  Bound result 4734\n  Bound result 2290\n  Bound result 599\n  Bound result 14\n  Bound result 1000\n  Bound result 3930\n  Bound result 6472\n  Bound result 40\n  Bound result 2835717307\n  Bound result 266\n  Bound result 95\n  Bound result 28162514264337593543950183\n  Bound result 99\n  Bound result 825976287\n  Bound result 377\n  Bound result 199\n  Bound result 255\n  Bound result 124848\n  Bound result 1637\n  Bound result 4759\n  Bound result 1208\n  Bound result 2976\n  Bound result 11449\n  Bound result 199\n  Bound result 354\n  Bound result 402\n  Bound result 670\n  Bound result 127\n  Bound result 29999999999999999999990450\n  Bound result 9457\n  Bound result 82274\n  Bound result 2860\n  Bound result 79956825542407220\n  Bound result 7072\n  Bound result 18\n  Bound result 15398\n  Bound result 6929\n  Bound result 5673\n  Bound result 6011\n  Bound result 6000\n  Bound result 5140\n  Bound result 10683\n  Bound result 1138\n  Bound result 286\n  Bound result 5489\n  Bound result 4237\n  Bound result 3035042146\n  Bound result 25350915038479951224\n  Bound result 6393\n  Bound result 915\n  Bound result 1\n  Bound result 59257604116583344933174186\n  Bound result 2810\n  Bound result 126\n  Bound result 333\n  Bound result 728\n  Bound result 1440\n  Bound result 5\n  Bound result 160688916\n  Bound result 999\n  Bound result 993\n  Bound result 1855\n  Bound result 3512\n  Bound result 28162514264337593543949082\n  Bound result 11852\n  Bound result 96\n  Bound result 10\n  Bound result 123\n  Bound result 7121\n  Bound result 314\n  Bound result 389\n  Bound result 19\n  Bound result 470\n  Bound result 681\n  Bound result 513\n  Bound result 2891\n  Bound result 8671\n  Bound result 999\n  Bound result 87114\n  Bound result 5157\n  Bound result 169\n  Bound result 6393\n  Bound result 255\n  Bound result 1631\n  Bound result 1076\n  Bound result 2973\n  Bound result 8648\n  Bound result 14295\n  Bound result 3000\n  Bound result 29999999999999999999991613\n  Bound result 79\n  Bound result 1290\n  Bound result 5888\n  Bound result 15625\n  Bound result 55752589591\n  Bound result 66\n  Bound result 715\n  Bound result 2\n  Bound result 400\n  Bound result 2854\n  Bound result 707\n  Bound result 127\n  Bound result 242\n  Bound result 12048\n  Bound result 200\n  Bound result 14367\n  Bound result 15\n  Bound result 65\n  Bound result 242\n  Bound result 157\n  Bound result 15643\n\n[PASS] test_sequenceExercisesBothDecisionsAndExpiry() (gas: 2209845)\nLogs:\n  Bound result 4000\n  Bound result 1000000000000000000\n  Bound result 4000\n  Bound result 20000000000000000000000000\n  Bound result 100000000000000000000000000\n  Bound result 1000\n  Bound result 999\n  Bound result 4000\n  Bound result 1000000000000000000\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 7200\n  Bound result 4000\n  Bound result 20000000000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.02s (7.00s CPU time)\n\nRan 7 test suites in 7.02s (21.03s CPU time): 107 tests passed, 0 failed, 0 skipped (107 total tests)\n","passed":true},{"durationMs":37,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchGuardHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"LaunchGuardHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"LaunchGuardHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"LaunchGuardHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":13,\"LICENSE\":21,\"README.md\":97,\"foundry.toml\":19,\"remappings.txt\":6,\"src/LaunchGuardHook.sol\":91,\"src/LaunchToken.sol\":11,\"src/libraries/SwapPreview.sol\":124,\"test/LaunchGuard.invariant.t.sol\":249,\"test/LaunchGuardConstructor.t.sol\":155,\"test/LaunchGuardHook.t.sol\":616,\"test/LaunchToken.invariant.t.sol\":141,\"test/LaunchToken.t.sol\":81,\"test/README.md\":48,\"test/helpers/PoolActions.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d115b5ac3a2caee8d180dd229104bc1e937436b2445caf6a845821afee1ddf27","verifiedTreeHash":"bb27999871ba323f09fe0e0decdbb0a6aba2a959","verifierVersion":"0.1.0+da6bdbe5"},{"checks":[{"durationMs":24461,"exitCode":0,"name":"build","output":"Compiling 79 files with Solc 0.8.26\nSolc 0.8.26 finished in 24.26s\nCompiler run successful!\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/LaunchGuardHook.sol:71:13\n   │\n71 │         if (block.timestamp < endsAt) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/LaunchGuardHook.sol:76:51\n   │\n76 │                 if (params.amountSpecified < 0 || uint256(params.amountSpecified) > maxBuyAmount) {\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":223,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 6 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(uint96) (runs: 256, μ: 85247, ~: 85291)\nLogs:\n  Bound result 6524029577703916680773\n\n[PASS] test_allowanceAndTransferFrom() (gas: 157596)\n[PASS] test_fixedSupplyMetadataAndDeployerAllocation() (gas: 43878)\n[PASS] test_noMintOwnerPauseOrUpgradeEntryPoints() (gas: 126468)\n[PASS] test_runtimeHasNoEscapeHatches() (gas: 605835)\n[PASS] test_transferFailures() (gas: 56651)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 4.56ms (6.65ms CPU time)\n\nRan 33 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency0Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 301793, ~: 305057)\nLogs:\n  Bound result 12585\n  Bound result 3\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 151503, ~: 155902)\nLogs:\n  Bound result 9893\n  Bound result 3975\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 867981, ~: 861570)\nLogs:\n  Bound result 17\n  Bound result 240\n  Bound result 1784\n  Bound result 18089\n\n[PASS] test_beforeSwapGas() (gas: 65313)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 54634\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 48579)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 67947)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 562227)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 839304)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 262148)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 129015)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 155163)\n[PASS] test_exactOutputAtCapAllowed() (gas: 146213)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 129477)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 81101)\n[PASS] test_finalSecondGuarded() (gas: 82338)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 492374)\n[PASS] test_hookDataCannotBypassCap() (gas: 78847)\n[PASS] test_initializationAndPermissions() (gas: 59102)\n[PASS] test_initializationAtTimestampZero() (gas: 104063)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41671)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 498338)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 279033)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 259876)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157088)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1786919)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 284589)\n[PASS] test_nativeCurrencyPair() (gas: 524337)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3131892)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 161912)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 264416)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 409121)\n[PASS] test_timerCannotBeReset() (gas: 55363)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47639)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 75.35ms (173.51ms CPU time)\n\nRan 33 tests for test/LaunchGuardHook.t.sol:LaunchTokenIsCurrency1Test\n[PASS] testFuzz_exactInputMatchesActualOutputDecision(uint96,uint16) (runs: 256, μ: 319028, ~: 322455)\nLogs:\n  Bound result 9891\n  Bound result 3976\n\n[PASS] testFuzz_exactOutputCap(uint96,uint32) (runs: 256, μ: 155077, ~: 159817)\nLogs:\n  Bound result 12583\n  Bound result 600\n\n[PASS] testFuzz_previewMatchesRealSwapsAcrossTicks(uint96,bool,bool,uint16,uint16,uint16) (runs: 256, μ: 867699, ~: 861381)\nLogs:\n  Bound result 664\n  Bound result 2\n  Bound result 1791\n  Bound result 51\n\n[PASS] test_beforeSwapGas() (gas: 72396)\nLogs:\n  beforeSwap exact-input buy gas (single active range): 61729\n\n[PASS] test_beforeSwapReturnsSelectorAndNoDeltasOrFee() (gas: 48374)\n[PASS] test_callbacksRejectUnauthorizedCallers() (gas: 67755)\n[PASS] test_differentPoolsHaveIndependentTimers() (gas: 572229)\n[PASS] test_emptyLiquidityProducesNoBuy() (gas: 824166)\n[PASS] test_exactDeadlineAllowsLargeBuys() (gas: 266414)\n[PASS] test_exactInputLargeBuyRejectedBeforeSwap() (gas: 143171)\n[PASS] test_exactInputSmallBuyAllowed() (gas: 165927)\n[PASS] test_exactOutputAtCapAllowed() (gas: 150343)\n[PASS] test_exactOutputOneUnitOverCapRejectedBeforeSwap() (gas: 140823)\n[PASS] test_failedInitializationRollsBackTimer() (gas: 81218)\n[PASS] test_finalSecondGuarded() (gas: 88006)\n[PASS] test_fullFeeExactInputHasZeroOutput() (gas: 511201)\n[PASS] test_hookDataCannotBypassCap() (gas: 85930)\n[PASS] test_initializationAndPermissions() (gas: 59102)\n[PASS] test_initializationAtTimestampZero() (gas: 104180)\n[PASS] test_initializationRejectsPoolWithoutLaunchToken() (gas: 41671)\n[PASS] test_inputUnitsAreNotComparedToLaunchTokenCap() (gas: 498392)\n[PASS] test_largeRequestWithSmallPartialFillAllowed() (gas: 287995)\n[PASS] test_limitIsPerSwapNotPerWallet() (gas: 262950)\n[PASS] test_liquidityCanBeRemovedDuringGuard() (gas: 157088)\n[PASS] test_liquidityGapAndNegativeTickTraversal() (gas: 1767151)\n[PASS] test_longAfterDeadlineAllowsBothDirections() (gas: 288883)\n[PASS] test_nativeCurrencyPair() (gas: 524337)\n[PASS] test_noOwnerPauseUpgradeOrRuntimeEscapeHatches() (gas: 3131892)\n[PASS] test_rejectedSwapLeavesBalancesAndPoolUnchanged() (gas: 168985)\n[PASS] test_sellsAboveCapAllowedForBothSwapTypes() (gas: 259988)\n[PASS] test_smallInputCanExceedOutputCap() (gas: 409284)\n[PASS] test_timerCannotBeReset() (gas: 55480)\n[PASS] test_uninitializedPoolCannotSkipGuard() (gas: 47447)\nSuite result: ok. 33 passed; 0 failed; 0 skipped; finished in 85.59ms (182.25ms CPU time)\n\nRan 3 test suites in 86.46ms (165.50ms CPU time): 72 tests passed, 0 failed, 0 skipped (72 total tests)\n","passed":true},{"durationMs":78,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"LaunchGuardHook.afterAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.afterInitialize(address,(address,address,uint24,int24,address),uint160,int24)\",\"LaunchGuardHook.afterRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),int256,int256,bytes)\",\"LaunchGuardHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"LaunchGuardHook.beforeAddLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeDonate(address,(address,address,uint24,int24,address),uint256,uint256,bytes)\",\"LaunchGuardHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"LaunchGuardHook.beforeRemoveLiquidity(address,(address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"LaunchGuardHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"DEPENDENCIES.md\":13,\"LICENSE\":21,\"README.md\":97,\"foundry.toml\":19,\"remappings.txt\":6,\"src/LaunchGuardHook.sol\":85,\"src/LaunchToken.sol\":11,\"src/libraries/SwapPreview.sol\":124,\"test/LaunchGuardHook.t.sol\":448,\"test/LaunchToken.t.sol\":81,\"test/helpers/PoolActions.sol\":78},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":3740,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/LaunchGuardHook.sol:63: LaunchGuardHook._beforeSwap(address,PoolKey,SwapParams,bytes) (src/LaunchGuardHook.sol#63-84) uses a dangerous strict equality:\n[low/medium] timestamp at src/LaunchGuardHook.sol:49: LaunchGuardHook._beforeInitialize(address,PoolKey,uint160) (src/LaunchGuardHook.sol#49-61) uses timestamp for comparisons\n[low/medium] timestamp at src/LaunchGuardHook.sol:63: LaunchGuardHook._beforeSwap(address,PoolKey,SwapParams,bytes) (src/LaunchGuardHook.sol#63-84) uses timestamp for comparisons","passed":true},{"durationMs":528,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/LaunchGuardHook.sol:38: Reentrancy: State change after external call\n[low] large-numeric-literal at src/LaunchToken.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/libraries/SwapPreview.sol:113: Literal Instead of Constant (2 places)\n[low] require-revert-in-loop at src/libraries/SwapPreview.sol:70: Loop Contains `require`/`revert`","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d5db2aa04992644c36f29d4e25e30dc8020e2f40b8ef376015eb131821581dc7","verifiedTreeHash":"f0234fa949e5643124c83c2e1b9c55321417671f","verifierVersion":"0.1.0+da6bdbe5"}]}