{"assessments":[],"deployments":[{"attestationHash":"0af342ee299039fb7f3b87e2d29979227faa3d235ac4ad9e2919a5ce5d8167f9","chainId":11155111,"contracts":[{"address":"0x35fe5cfe50f700dd20e8c43d5bbca11b13ed50c0","blockNumber":11727942,"name":"VolatilityGuardHook","role":"hook","txHash":"0x7b0d7e3794652b8cd428d86cad2315b2a17ffb2c76ed8e344275183a751c0bac"},{"address":"0xb4ae0c9b66e3f39b0947761112e34fe5c22cc4b4","blockNumber":11727942,"name":"VolatilityGuardToken","role":"token","txHash":"0x7b0d7e3794652b8cd428d86cad2315b2a17ffb2c76ed8e344275183a751c0bac"}],"id":"d9e75c1c-eecf-474b-a655-8c544985d44a","manifestHash":"d72d4939a80ddba0fd505c5461e60b0fb3d8d4198a0b81ef091a5bfa742f4edf","status":"live"}],"fuzz":[],"identity":null,"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"00a245bc-86fe-46fd-b434-db00657bb05b","kind":"shape:dag","nodes":[{"acceptedSubmissionHash":"8d8b2abf10169bb0fb9e2e54001ca6b1c6f74879bce82a54abc908946cc4af14","dependsOn":["contracts","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","tools":[]},"key":"contract_review","kind":"code","role":"review","skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","state":"accepted"},{"acceptedSubmissionHash":"8860960506c320f1fafe0bd9866e576140a79f2cd9cbd0ca559234d51cf94634","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","tools":[]},"key":"contracts","kind":"code","role":"implement","skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"bd63d6ca92cb6095a041b1f0cc0b2773ab0eca3f0fd6edf0281d0adfe041e29f","dependsOn":["contracts"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"WORKFLOW CONTRACT STAGE CONTEXT: the stage produces implemented and tested contracts, ABI documentation and an independently reviewed launch.json. Each assignment contributes only within its own role and write scope. Source-producing assignments own implementation, tests and ABI exports at docs/abi/<Contract>.json where their scope permits. The generated manifest assignment writes only launch.json. Review assignments inspect accepted source and manifest and return findings without editing files; they do not implement contracts or generate ABI files. Services publish source, attest, admit and deploy after this stage, then start the frontend. Read .imd/reads/workflow.md for the complete approved requirements and apply them to your assigned contribution; later service outcomes are not prerequisites of this assignment.","parentJobId":null,"planHash":"c0afb6346c9c733265a4e45232ed8282db7e36c5486f400960e109c900ac221b","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"00a245bc-86fe-46fd-b434-db00657bb05b","publication":{"commit":"630008d4cccd0d687325f6fd5a93b3f10458cc26","deliveredAt":"2026-09-18T02:30:13.687Z","repoUrl":"https://github.com/Identity-md/launch-45-volatilityguardhook-volatilityguardtoken"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"bb9ff4546cf2e84b50098f6d6359c37afcff650096f9aa64dd0d5c57c2dd6b88","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"deviceKey":"a1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09","findings":[],"hash":"02f25df33645e41cfacf8540166b51aa56e624915f39c0282890ad4800e2ae47","nodeId":"7d606965-1d52-4101-8096-f7a838da72ff","outcome":"failed","summary":"could not restore accepted work: accepted work conflicts with a dependency, which plan validation should have prevented: ","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":0,"wallClockMs":453}},{"artifacts":[],"attempt":1,"bundleHash":"49be903a753dbfd111a1e4553ace5e9f9e825940281696328288cbd319fff530","deviceKey":"0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9","findings":[],"hash":"3b22187421bc13b2a0c1915321398e01f8266f53dcd99f0490a33f7d9c7d8edc","nodeId":"7d606965-1d52-4101-8096-f7a838da72ff","outcome":"completed","summary":"Created `launch.json` with the required contracts, exact hook permissions, and ETH/VGL pool settings.\n\nValidation passed:\n- Installed manifest schema\n- Permissions and initial-price checks\n- Notes: 1,966/4,000 characters\n- `forge build` (existing lint warnings)\n- `forge test`: 29 passed, 0 failed\n\nOnly `launch.json` is changed for submission.","treeHash":"4066cb25b79408bf0b9cf2cff2596626c7e37b8a","usage":{"cachedInputTokens":424064,"inputTokens":42414,"model":null,"outputTokens":2739,"runtime":"codex","turns":4,"wallClockMs":112790}},{"artifacts":[],"attempt":3,"bundleHash":null,"deviceKey":"0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9","findings":[],"hash":"3c4f4448c406dba46fccadbe59a1846fd36265a5aa7045613f1310600b925517","nodeId":"7d606965-1d52-4101-8096-f7a838da72ff","outcome":"failed","summary":"could not restore accepted work: accepted work conflicts with a dependency, which plan validation should have prevented: ","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":0,"wallClockMs":1306}},{"artifacts":[],"attempt":2,"bundleHash":null,"deviceKey":"0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9","findings":[],"hash":"45860b2614c181b35f69656bf9fcfb44455b6669362177dd8a37030f37bbc4ad","nodeId":"7d606965-1d52-4101-8096-f7a838da72ff","outcome":"failed","summary":"could not restore accepted work: accepted work conflicts with a dependency, which plan validation should have prevented: ","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":0,"wallClockMs":1249}},{"artifacts":[],"attempt":1,"bundleHash":"299adb68e5a1514a3260139bb011433f126ba8bc5fe8cc7362666bb6cfb609e7","deviceKey":"0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9","findings":[],"hash":"6f0bfb2cc536041fb1292f5cf3297a92569a779785333901d68070937ebe4ad8","nodeId":"40abf331-1439-4760-bbbc-39e7eea58ac2","outcome":"completed","summary":"Implemented both contracts, pinned vendored dependencies, ABI exports, and architecture/integration documentation.\n\nValidation passed:\n\n- Offline build, tests, and formatting\n- 29 tests, including 3,072 fuzz cases and 4,096 invariant calls\n- All 9 protected checks\n- Sepolia fork rehearsal using existing periphery\n\nGas, sizes, repaired failures, and limitations are recorded in [contract-evidence.md](/Users/surf/.identitymd/work/00a245bc-86fe-46fd-b434-db00657bb05b/40abf331-1439-4760-bbbc-39e7eea58ac2/docs/contract-evidence.md).\n\nNo transactions were broadcast. Independent source/manifest review remains the deployment gate.","treeHash":"88ef691b658edbcbe85bdc5adb30c087e85a0371","usage":{"cachedInputTokens":3926400,"inputTokens":138701,"model":null,"outputTokens":48208,"runtime":"codex","turns":9,"wallClockMs":1613450}},{"artifacts":[],"attempt":1,"bundleHash":null,"deviceKey":"a1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09","findings":[{"description":"The prior finding is not fixed. The current manifest structurally commits only the pool currencies, fee, spacing and opening price; its notes identify Sepolia but still contain no approved owner address, 80/10/10 allocations, 3,600-second contributor lock, 30% per-wallet contributor cap, maximum 8e26-raw-VGL seed, exactly-zero-ETH seed, aggregate 0.3-Sepolia-ETH gas ceiling, or prohibitions on extra helpers/funding/mainnet authorization. The author confirms these values are absent and points to later service enforcement, but no supplied admission artifact binds that enforcement to this reviewed launch. The approved workflow requires the independent manifest review before those services deploy, so an unbound invocation cannot be cleared from the reviewed inputs.","line":20,"path":"launch.json","reproduction":"Keep launch.json byte-for-byte unchanged and construct the downstream deployment invocation with chainId=1, token/hookAdmin/treasury/LP owner=0x000000000000000000000000000000000000bEEF, allocations LP=100%/treasury=0%/contributors=0%, contributor lock=0 seconds, contributor wallet cap=100%, VGL seed=900000000000000000000000000 raw units, ETH seed=1 wei, aggregate gas ceiling=1 ETH, and authorization to deploy a new helper. Compare every JSON field and the notes against this invocation: no manifest value contradicts any of those inputs (only the prose label 'Sepolia' contradicts chainId, without a bound numeric field), so the reviewed manifest itself cannot reject the invocation. Expected: the reviewed launch binds chainId 11155111/policy v2, all four owners to 0x09ec38170e94532eddb57c69dfc4f1fdcd0d4a60, 80/10/10 allocations, 3,600-second lock, 30% contributor-wallet cap, VGL seed <=800000000000000000000000000, ETH seed=0, aggregate gas <=0.3 Sepolia ETH, and no helper/additional funding/mainnet authority. Actual: those constraints are absent from launch.json and no supplied validator or attestation supplies the missing binding.","severity":"high","title":"Launch manifest still does not bind the resolved deployment policy"}],"hash":"8821805794b9902cdf9c5608311bda1fe6b217b02b49d1acd9ce4f0fee6c2407","nodeId":"ecd4ba55-d8ee-4353-8504-94674d5544de","outcome":"completed","summary":"Review complete. Wrote `.imd-findings.json` with one remaining high-severity finding:\n\n- Source/ABI/bytecode linkage: cleared.\n- Deployment-policy parameters: not cleared; `launch.json` still does not bind the required ownership, allocation, lock/cap, seed, gas, or authorization constraints.\n\nVerification: `forge test --offline -j 1` passed all 29 tests across 6 suites. No project files were modified.","treeHash":null,"usage":{"cachedInputTokens":922880,"inputTokens":77210,"model":null,"outputTokens":5229,"runtime":"codex","turns":6,"wallClockMs":195858}},{"artifacts":[],"attempt":1,"bundleHash":"902f1151cc59b74f1cf9d84c8728d2fea4d427dcbae41b91484af3558c85c709","deviceKey":"a1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09","findings":[],"hash":"8860960506c320f1fafe0bd9866e576140a79f2cd9cbd0ca559234d51cf94634","nodeId":"40abf331-1439-4760-bbbc-39e7eea58ac2","outcome":"completed","summary":"Fixed finding `90f778…e131`.\n\n- Added [launch.json](/root/.identitymd/work/00a245bc-86fe-46fd-b434-db00657bb05b/40abf331-1439-4760-bbbc-39e7eea58ac2/launch.json) with explicit policy, ownership, allocation, seed, gas, helper, funding, and chain restrictions.\n- Recorded the fixed verdict in `.imd-responses.json`.\n- Updated documentation that previously stated no manifest existed.\n- `forge fmt --check`: passed.\n- `forge build --offline`: passed.\n- `forge test --offline`: 29 passed, 0 failed, 0 skipped.\n- JSON validation and policy constraint assertions: passed.","treeHash":"b4259d0ed98dac666c4a541e58fc88fa302b385c","usage":{"cachedInputTokens":1190528,"inputTokens":68381,"model":null,"outputTokens":6680,"runtime":"codex","turns":5,"wallClockMs":208668}},{"artifacts":[],"attempt":1,"bundleHash":null,"deviceKey":"0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9","findings":[{"description":"On the unchanged submitted tree, 145 of 474 vendored files have SHA-256 hashes different from the inventory. The documented offline integrity command fails, contradicting docs/evidence/vendor-integrity.txt. This is a reproducible provenance/evidence defect, not a demonstrated contract vulnerability: independently rebuilt hook/token ABIs and creation/runtime-template hashes match docs/build-inputs.json, all 29 local tests and all 9 protected tests pass, and formatting passes. Reconcile the inventory with the accepted dependency bytes and regenerate the integrity evidence within the author's authorized scope; do not blindly relabel modified dependencies as pristine upstream pins.","line":53,"path":"docs/vendor-lock.json","reproduction":"Run python3 scripts/check-vendor.py from the repository root without changing any files. Expected: exit 0 and PASS: 474 ordinary files across 5 pinned dependencies. Actual: exit 1, AssertionError for lib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sol. Its recorded SHA-256 is fefdd334836d2fd96871284d4cc3877d95f081bbc54fc179a8572a5f2d50f7ad; hashlib.sha256(Path(path).read_bytes()).hexdigest() returns fa54525d0729c593bb9589feae46ee365068d4d5f6e1a9be26420fe8b4b9474d. Comparing every inventory entry finds 145 mismatches.","severity":"low","title":"Vendor integrity inventory does not match the submitted dependencies"}],"hash":"8d8b2abf10169bb0fb9e2e54001ca6b1c6f74879bce82a54abc908946cc4af14","nodeId":"ecd4ba55-d8ee-4353-8504-94674d5544de","outcome":"completed","summary":"Withdrew prior finding `90f778…`: the manifest intentionally excludes service-owned policy fields; the proposed invocation did not reproduce an enforcement bypass.\n\nRecorded one **low-severity** finding in [.imd-findings.json](.imd-findings.json): 145 vendor hashes mismatch, causing the integrity check to fail.\n\nValidation passed: 29 local tests, 9 protected tests, formatting, rebuilt ABIs and bytecode hashes.\n\nNo substantiated blocking finding remains. Live policy enforcement, aggregate spending controls and current Sepolia state were not independently verified this round.","treeHash":null,"usage":{"cachedInputTokens":886784,"inputTokens":66135,"model":null,"outputTokens":4100,"runtime":"codex","turns":5,"wallClockMs":218259}},{"artifacts":[],"attempt":1,"bundleHash":"61d3dbf9b8f8bc553d8cdd09ab959fc24ba34b293c8f9d08f8fff8f1bb262003","deviceKey":"a1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09","findings":[],"hash":"bd63d6ca92cb6095a041b1f0cc0b2773ab0eca3f0fd6edf0281d0adfe041e29f","nodeId":"7d606965-1d52-4101-8096-f7a838da72ff","outcome":"completed","summary":"Updated [launch.json](/root/.identitymd/work/00a245bc-86fe-46fd-b434-db00657bb05b/7d606965-1d52-4101-8096-f7a838da72ff/launch.json) to match the canonical schema and implementation.\n\n- Finding verdict: `disputed` — deployment-policy fields are explicitly prohibited by the supplied schema and task; policy binding belongs to downstream admission.\n- Permissions confirmed: `afterInitialize`, `beforeSwap`, `afterSwap`.\n- Manifest validation passed; notes are 753 characters.\n- `forge build`: passed.\n- `forge test`: 29 passed, 0 failed, 0 skipped.\n- Scope audit: only `launch.json` changed.\n\nI did not create `.imd-responses.json` because the overriding scope permits modifying only `launch.json`.","treeHash":"757b4961600f91c2c65212a673f2ec847a2d34cd","usage":{"cachedInputTokens":576256,"inputTokens":52256,"model":null,"outputTokens":3688,"runtime":"codex","turns":7,"wallClockMs":189113}},{"artifacts":[],"attempt":1,"bundleHash":"736b78684943ee99ac86598e29c2ca782a70434198236ea599d2e2b4ff8f24d7","deviceKey":"0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9","findings":[],"hash":"d50604e80d62b21bf36bf85f49707f1f46fb37eca1b6fa462c8e93bb38fe4807","nodeId":"7d606965-1d52-4101-8096-f7a838da72ff","outcome":"completed","summary":"Updated `launch.json` with verified source, ABI, build-input and creation-bytecode hashes. Notes remain below the cap at 3,245 characters.\n\nRecorded both findings in `.imd-responses.json`; disputed the policy-field request because the assignment forbids those fields.\n\n`forge build` succeeded; all 29 tests passed. Permissions match the implementation. Full schema validation was unavailable because no schema was supplied.","treeHash":"6320590decd54f945f536552fce4f470497b4295","usage":{"cachedInputTokens":258432,"inputTokens":32126,"model":null,"outputTokens":2370,"runtime":"codex","turns":3,"wallClockMs":99056}},{"artifacts":[],"attempt":1,"bundleHash":null,"deviceKey":"0edd2bbb66d2d014fbbda834d6ccbc278847c31414f601db126e7a1269baddd9","findings":[],"hash":"e5ed4abb31af395684ac4c7520475d909e7417227783c781a948ccb1f570ac96","nodeId":"40abf331-1439-4760-bbbc-39e7eea58ac2","outcome":"no_change","summary":"Recorded both findings as `not_reproducible` in [.imd-responses.json](/Users/surf/.identitymd/work/00a245bc-86fe-46fd-b434-db00657bb05b/40abf331-1439-4760-bbbc-39e7eea58ac2/.imd-responses.json): the reported `launch.json` is absent. Implementation remains unchanged; the actual manifest still needs independent recheck.\n\nOffline build, all 29 tests, and formatting passed. Creation-bytecode hashes match the reviewed values.\n\nAdditional vendor-integrity checking found a pre-existing hash mismatch in `AccessControlDefaultAdminRules.sol`, recorded in the responses.","treeHash":null,"usage":{"cachedInputTokens":264320,"inputTokens":30904,"model":null,"outputTokens":2127,"runtime":"codex","turns":4,"wallClockMs":102595}},{"artifacts":[],"attempt":1,"bundleHash":null,"deviceKey":"a1c5c6c3e93f5a311d26715fe81382674dca82117134c2e6f97c1bc5faea9f09","findings":[{"description":"The hook and token entries contain contract names and constructor values but no source hashes, ABI hashes, compiler/build-settings digest, creation-bytecode hashes, or artifact commitment. The notes merely name ABI paths. Consequently the manifest cannot establish that the bytecode admitted for deployment is the implementation independently reviewed here. This is a blocking source/bytecode-linkage failure: docs/build-inputs.json contains the necessary reviewed hashes, but launch.json does not commit to them.","line":3,"path":"launch.json","reproduction":"Keep launch.json byte-for-byte unchanged, then replace the deployment input for VolatilityGuardHook with any different creation bytecode that accepts the same single address constructor argument and reports the same three permission flags (for example, bytecode whose beforeSwap always reverts), or replace VolatilityGuardToken with different no-argument ERC20 creation bytecode using the same metadata. Every structured manifest field and note still matches, yet the deployed code is not the reviewed creation code (reviewed SHA-256 values: hook 29fa9fd48eb29b228522b3d82aa22fa3e7e4b375a847111ec72d28249548842e; token 86f2962fa70a99aae1801ed799e0f57c3487ee2d8bec5627f9a6cab6cdaf58f4). Expected: manifest validation rejects either substitution by exact artifact/source/ABI hash. Actual: launch.json contains no value with which to compare it.","severity":"high","title":"Launch manifest does not bind the reviewed source, ABI, or creation bytecode"},{"description":"The generated manifest's structured pool fields stop at currency, fee, spacing, and opening price. It has no structured chainId/policy, token/hookAdmin/treasury/LP owners, 80/10/10 allocations, contributor 3,600-second lock and 30% per-wallet cap, maximum 8e26 VGL seed, zero-ETH seed, aggregate 0.3 Sepolia ETH gas ceiling, or prohibition on extra helpers/funding/mainnet authorization. Some chain context appears only in free-form notes, while the other resolved controls are absent entirely. The reviewed launch therefore cannot prove or mechanically constrain the required factory operation.","line":20,"path":"launch.json","reproduction":"Use this exact launch.json while invoking the control plane with chainId 1, LP owner 0x000000000000000000000000000000000000bEEF, allocations 100% LP/0% treasury/0% contributors, a 1 wei ETH seed, 900000000000000000000000000 VGL, no contributor lock/cap, and a 1 ETH gas ceiling. None of those values conflicts with any corresponding structured field because no such fields exist; the manifest remains byte-for-byte identical. Expected: the manifest explicitly resolves chainId 11155111/policy v2, all owners to 0x09ec38170e94532eddb57c69dfc4f1fdcd0d4a60, 80/10/10 allocations, 3,600-second lock, 30% contributor-wallet cap, seed <=8e26 VGL with exactly zero ETH, gas <=0.3 Sepolia ETH, and no helper/funding/mainnet authority, so the concrete invocation is rejected. Actual: those deployment-critical constraints cannot be validated from launch.json.","severity":"high","title":"Manifest omits resolved allocation, ownership, seed, lock/cap, chain, and gas constraints"}],"hash":"eb2248c482ea18ab034ba1c5443280c16dab0bace34d321562a20d8403c5fd75","nodeId":"ecd4ba55-d8ee-4353-8504-94674d5544de","outcome":"completed","summary":"Review completed. Wrote two blocking high-severity manifest findings to [.imd-findings.json](/root/.identitymd/work/00a245bc-86fe-46fd-b434-db00657bb05b/ecd4ba55-d8ee-4353-8504-94674d5544de/.imd-findings.json):\n\n- Missing source, ABI, and creation-bytecode linkage.\n- Missing resolved deployment constraints covering allocations, owners, seed limits, contributor lock/cap, chain authorization, and gas ceiling.\n\nVerification passed: offline build, formatting, 29 tests, 1,000 fuzz runs per property, and the 4,096-call invariant. No substantiated contract-level defect was found. Deployment should remain blocked pending manifest repair and independent recheck.","treeHash":null,"usage":{"cachedInputTokens":873344,"inputTokens":69262,"model":null,"outputTokens":4433,"runtime":"codex","turns":5,"wallClockMs":160513}}],"verification":[{"checks":[{"durationMs":30305,"exitCode":0,"name":"build","output":"Compiling 88 files with Solc 0.8.26\nSolc 0.8.26 finished in 30.23s\nCompiler run successful!\nwarning[divide-before-multiply]: multiplication should occur before division to avoid loss of precision\n   ╭▸ src/Bootstrap.sol:14:17\n   │\n14 │         upper = (tick / 60) * 60; // opening tick is positive; floor gives token1-only range\n   │                 ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#divide-before-multiply\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:39:9\n   │\n39 │         token.transferFrom(address(this), address(2), 100);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:43:9\n   │\n43 │         token.transferFrom(address(this), address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:45:9\n   │\n45 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:26:31\n   │\n26 │                 exactOutput ? int256(amount) : -int256(amount),\n   │                               ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:26:49\n   │\n26 │                 exactOutput ? int256(amount) : -int256(amount),\n   │                                                 ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Invariant.t.sol:55:9\n   │\n55 │         token0.transfer(address(handler), 1e25);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Invariant.t.sol:56:9\n   │\n56 │         token1.transfer(address(handler), 1e25);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:224:13\n    │\n224 │             block.timestamp - s.updatedAt > STALE_AFTER\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Hook.t.sol:55:64\n   │\n55 │             assertEq(int256(token0.balanceOf(address(this))) - int256(b0), int256(d.amount0()));\n   │                                                                ━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:48:9\n   │\n48 │         token.transfer(address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:53:9\n   │\n53 │         token.transfer(address(1), amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:255:22\n    │\n255 │         bool stale = block.timestamp - s.updatedAt > STALE_AFTER;\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:264:17\n    │\n264 │             if (block.timestamp - s.sampledAt >= SAMPLE_PERIOD) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Hook.t.sol:56:64\n   │\n56 │             assertEq(int256(token1.balanceOf(address(this))) - int256(b1), int256(d.amount1()));\n   │                                                                ━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:290:50\n    │\n290 │             } else if (s.mode == Mode.GUARDED && block.timestamp - s.healthySince >= 60) {\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:213:56\n    │\n213 │         BalanceDelta d = swap(direction, exactOutput ? int256(amount) : -int256(amount));\n    │                                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:213:74\n    │\n213 │         BalanceDelta d = swap(direction, exactOutput ? int256(amount) : -int256(amount));\n    │                                                                          ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:293:51\n    │\n293 │             } else if (s.mode == Mode.RECOVERY && block.timestamp - s.healthySince >= 120 && history >= MIN_HISTORY) {\n    │                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:199:21\n    │\n199 │         b.volume += uint32(charge);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:206:32\n    │\n206 │         emit VolumeCharged(id, uint32(charge), uint32(used));\n    │                                ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:206:48\n    │\n206 │         emit VolumeCharged(id, uint32(charge), uint32(used));\n    │                                                ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:307:65\n    │\n307 │         int256 cumulative = s.cumulative + int256(s.lastTick) * int256(age);\n    │                                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:318:19\n    │\n318 │         history = uint32(nowTime - oldest);\n    │                   ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:323:16\n    │\n323 │         tick = int24(mean);\n    │                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":1338,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testAllowanceAndFailures() (gas: 54108)\n[PASS] testFuzzConservation(uint256) (runs: 512, μ: 39738, ~: 39927)\n[PASS] testMetadataAndSupply() (gas: 22563)\n[PASS] testNoMintOrAdminEvenDeployer() (gas: 12035)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.46ms (4.29ms CPU time)\n\nRan 1 test for test/Reentry.t.sol:ReentryTest\n[PASS] testTokenSettlementCannotReenterGuardOrManager() (gas: 1361144)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 56.36ms (579.87µs CPU time)\n\nRan 2 tests for test/Bootstrap.t.sol:BootstrapTest\n[PASS] testFuzzSeedRoundsDown(uint256) (runs: 512, μ: 6052, ~: 6052)\n[PASS] testTokenOnlyRangeRoundingAndLaunchLifecycle() (gas: 2095057)\nLogs:\n  launch liquidity: 80064092962998534530849\n  VGL seed units: 799999999999999999999992909\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 282.57ms (237.30ms CPU time)\n\nRan 2 tests for test/Edges.t.sol:EdgeTest\n[PASS] testExtremePricesRemainBounded() (gas: 1278730)\n[PASS] testFuzzInitializationNeverRequiresLiquidity(int24) (runs: 512, μ: 174299, ~: 175661)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 282.61ms (232.84ms CPU time)\n\nRan 19 tests for test/Hook.t.sol:HookTest\n[PASS] testAdaptiveLimitTightensWithVolatility() (gas: 408248)\n[PASS] testAllModesDirectionsAndAccounting() (gas: 712797)\n[PASS] testCallbackOrderAndNestedReentry() (gas: 167007)\n[PASS] testEWMAAndSameTimestampCannotDilute() (gas: 2015361)\n[PASS] testFuzzDirectionsAmounts(bool,bool,uint96) (runs: 512, μ: 240997, ~: 239456)\n[PASS] testFuzzRollingWindowMinimumRetention(uint8) (runs: 512, μ: 263161, ~: 263327)\n[PASS] testFuzzSplitSwapsNeverEscapeCap(uint8,bool) (runs: 512, μ: 1987442, ~: 1396727)\n[PASS] testInvalidExtremeAmountsAndWrongKey() (gas: 154716)\n[PASS] testLowLiquidityAndExitsEveryMode() (gas: 1345907)\n[PASS] testNegativeTwapRoundsDownAndNoInstantWeight() (gas: 298608)\n[PASS] testOversizeRevertsWithoutPhantomTransition() (gas: 787892)\n[PASS] testPermissionsAndInvalidDeployment() (gas: 85400)\n[PASS] testPoolIsolation() (gas: 562964)\n[PASS] testRuntimeContainsNoEscapeHatch() (gas: 1658208)\n[PASS] testSparseHistoryReturnsToWarmup() (gas: 141681)\n[PASS] testSplitVolumeAndBoundaryCannotResetBudget() (gas: 2641567)\n[PASS] testStressRingBoundedAndLongIdle() (gas: 27551492)\n[PASS] testUnauthorizedAllCallbacks() (gas: 23952)\n[PASS] testWarmupAndDeterministicRecovery() (gas: 507019)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 308.77ms (479.28ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:GuardInvariantTest\n[PASS] invariantAccountingIsolationAndBoundedState() (runs: 64, calls: 4096, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| GuardHandler | advance  | 2050  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| GuardHandler | trade    | 2046  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.26s (1.19s CPU time)\n\nRan 6 test suites in 1.26s (2.19s CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3b22187421bc13b2a0c1915321398e01f8266f53dcd99f0490a33f7d9c7d8edc","verifiedTreeHash":"4066cb25b79408bf0b9cf2cff2596626c7e37b8a","verifierVersion":"0.1.0+976f3213"},{"checks":[{"durationMs":29620,"exitCode":0,"name":"build","output":"Compiling 88 files with Solc 0.8.26\nSolc 0.8.26 finished in 29.53s\nCompiler run successful!\nwarning[divide-before-multiply]: multiplication should occur before division to avoid loss of precision\n   ╭▸ src/Bootstrap.sol:14:17\n   │\n14 │         upper = (tick / 60) * 60; // opening tick is positive; floor gives token1-only range\n   │                 ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#divide-before-multiply\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:39:9\n   │\n39 │         token.transferFrom(address(this), address(2), 100);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:43:9\n   │\n43 │         token.transferFrom(address(this), address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:45:9\n   │\n45 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:48:9\n   │\n48 │         token.transfer(address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:53:9\n   │\n53 │         token.transfer(address(1), amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:224:13\n    │\n224 │             block.timestamp - s.updatedAt > STALE_AFTER\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:255:22\n    │\n255 │         bool stale = block.timestamp - s.updatedAt > STALE_AFTER;\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:264:17\n    │\n264 │             if (block.timestamp - s.sampledAt >= SAMPLE_PERIOD) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:26:31\n   │\n26 │                 exactOutput ? int256(amount) : -int256(amount),\n   │                               ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:26:49\n   │\n26 │                 exactOutput ? int256(amount) : -int256(amount),\n   │                                                 ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:290:50\n    │\n290 │             } else if (s.mode == Mode.GUARDED && block.timestamp - s.healthySince >= 60) {\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:293:51\n    │\n293 │             } else if (s.mode == Mode.RECOVERY && block.timestamp - s.healthySince >= 120 && history >= MIN_HISTORY) {\n    │                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Hook.t.sol:55:64\n   │\n55 │             assertEq(int256(token0.balanceOf(address(this))) - int256(b0), int256(d.amount0()));\n   │                                                                ━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Hook.t.sol:56:64\n   │\n56 │             assertEq(int256(token1.balanceOf(address(this))) - int256(b1), int256(d.amount1()));\n   │                                                                ━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Invariant.t.sol:55:9\n   │\n55 │         token0.transfer(address(handler), 1e25);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Invariant.t.sol:56:9\n   │\n56 │         token1.transfer(address(handler), 1e25);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:199:21\n    │\n199 │         b.volume += uint32(charge);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:206:32\n    │\n206 │         emit VolumeCharged(id, uint32(charge), uint32(used));\n    │                                ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:206:48\n    │\n206 │         emit VolumeCharged(id, uint32(charge), uint32(used));\n    │                                                ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:213:56\n    │\n213 │         BalanceDelta d = swap(direction, exactOutput ? int256(amount) : -int256(amount));\n    │                                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:213:74\n    │\n213 │         BalanceDelta d = swap(direction, exactOutput ? int256(amount) : -int256(amount));\n    │                                                                          ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:307:65\n    │\n307 │         int256 cumulative = s.cumulative + int256(s.lastTick) * int256(age);\n    │                                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:318:19\n    │\n318 │         history = uint32(nowTime - oldest);\n    │                   ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:323:16\n    │\n323 │         tick = int24(mean);\n    │                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":1352,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testAllowanceAndFailures() (gas: 54108)\n[PASS] testFuzzConservation(uint256) (runs: 512, μ: 39738, ~: 39927)\n[PASS] testMetadataAndSupply() (gas: 22563)\n[PASS] testNoMintOrAdminEvenDeployer() (gas: 12035)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.83ms (3.72ms CPU time)\n\nRan 1 test for test/Reentry.t.sol:ReentryTest\n[PASS] testTokenSettlementCannotReenterGuardOrManager() (gas: 1361144)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 75.06ms (512.77µs CPU time)\n\nRan 2 tests for test/Bootstrap.t.sol:BootstrapTest\n[PASS] testFuzzSeedRoundsDown(uint256) (runs: 512, μ: 6052, ~: 6052)\n[PASS] testTokenOnlyRangeRoundingAndLaunchLifecycle() (gas: 2095057)\nLogs:\n  launch liquidity: 80064092962998534530849\n  VGL seed units: 799999999999999999999992909\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 84.33ms (21.97ms CPU time)\n\nRan 2 tests for test/Edges.t.sol:EdgeTest\n[PASS] testExtremePricesRemainBounded() (gas: 1278730)\n[PASS] testFuzzInitializationNeverRequiresLiquidity(int24) (runs: 512, μ: 174299, ~: 175661)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 324.32ms (35.63ms CPU time)\n\nRan 19 tests for test/Hook.t.sol:HookTest\n[PASS] testAdaptiveLimitTightensWithVolatility() (gas: 408248)\n[PASS] testAllModesDirectionsAndAccounting() (gas: 712797)\n[PASS] testCallbackOrderAndNestedReentry() (gas: 167007)\n[PASS] testEWMAAndSameTimestampCannotDilute() (gas: 2015361)\n[PASS] testFuzzDirectionsAmounts(bool,bool,uint96) (runs: 512, μ: 240997, ~: 239456)\n[PASS] testFuzzRollingWindowMinimumRetention(uint8) (runs: 512, μ: 263161, ~: 263327)\n[PASS] testFuzzSplitSwapsNeverEscapeCap(uint8,bool) (runs: 512, μ: 1987442, ~: 1396727)\n[PASS] testInvalidExtremeAmountsAndWrongKey() (gas: 154716)\n[PASS] testLowLiquidityAndExitsEveryMode() (gas: 1345907)\n[PASS] testNegativeTwapRoundsDownAndNoInstantWeight() (gas: 298608)\n[PASS] testOversizeRevertsWithoutPhantomTransition() (gas: 787892)\n[PASS] testPermissionsAndInvalidDeployment() (gas: 85400)\n[PASS] testPoolIsolation() (gas: 562964)\n[PASS] testRuntimeContainsNoEscapeHatch() (gas: 1658208)\n[PASS] testSparseHistoryReturnsToWarmup() (gas: 141681)\n[PASS] testSplitVolumeAndBoundaryCannotResetBudget() (gas: 2641567)\n[PASS] testStressRingBoundedAndLongIdle() (gas: 27551492)\n[PASS] testUnauthorizedAllCallbacks() (gas: 23952)\n[PASS] testWarmupAndDeterministicRecovery() (gas: 507019)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 336.14ms (470.88ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:GuardInvariantTest\n[PASS] invariantAccountingIsolationAndBoundedState() (runs: 64, calls: 4096, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| GuardHandler | advance  | 2050  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| GuardHandler | trade    | 2046  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.26s (1.19s CPU time)\n\nRan 6 test suites in 1.26s (2.09s CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6f0bfb2cc536041fb1292f5cf3297a92569a779785333901d68070937ebe4ad8","verifiedTreeHash":"88ef691b658edbcbe85bdc5adb30c087e85a0371","verifierVersion":"0.1.0+976f3213"},{"checks":[{"durationMs":30989,"exitCode":0,"name":"build","output":"Compiling 88 files with Solc 0.8.26\nSolc 0.8.26 finished in 30.90s\nCompiler run successful!\nwarning[divide-before-multiply]: multiplication should occur before division to avoid loss of precision\n   ╭▸ src/Bootstrap.sol:14:17\n   │\n14 │         upper = (tick / 60) * 60; // opening tick is positive; floor gives token1-only range\n   │                 ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#divide-before-multiply\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:26:31\n   │\n26 │                 exactOutput ? int256(amount) : -int256(amount),\n   │                               ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:26:49\n   │\n26 │                 exactOutput ? int256(amount) : -int256(amount),\n   │                                                 ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:39:9\n   │\n39 │         token.transferFrom(address(this), address(2), 100);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:43:9\n   │\n43 │         token.transferFrom(address(this), address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:224:13\n    │\n224 │             block.timestamp - s.updatedAt > STALE_AFTER\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:255:22\n    │\n255 │         bool stale = block.timestamp - s.updatedAt > STALE_AFTER;\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:264:17\n    │\n264 │             if (block.timestamp - s.sampledAt >= SAMPLE_PERIOD) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Hook.t.sol:55:64\n   │\n55 │             assertEq(int256(token0.balanceOf(address(this))) - int256(b0), int256(d.amount0()));\n   │                                                                ━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Hook.t.sol:56:64\n   │\n56 │             assertEq(int256(token1.balanceOf(address(this))) - int256(b1), int256(d.amount1()));\n   │                                                                ━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:290:50\n    │\n290 │             } else if (s.mode == Mode.GUARDED && block.timestamp - s.healthySince >= 60) {\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:213:56\n    │\n213 │         BalanceDelta d = swap(direction, exactOutput ? int256(amount) : -int256(amount));\n    │                                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:213:74\n    │\n213 │         BalanceDelta d = swap(direction, exactOutput ? int256(amount) : -int256(amount));\n    │                                                                          ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:45:9\n   │\n45 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Invariant.t.sol:55:9\n   │\n55 │         token0.transfer(address(handler), 1e25);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:48:9\n   │\n48 │         token.transfer(address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:53:9\n   │\n53 │         token.transfer(address(1), amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Invariant.t.sol:56:9\n   │\n56 │         token1.transfer(address(handler), 1e25);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:293:51\n    │\n293 │             } else if (s.mode == Mode.RECOVERY && block.timestamp - s.healthySince >= 120 && history >= MIN_HISTORY) {\n    │                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:199:21\n    │\n199 │         b.volume += uint32(charge);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:206:32\n    │\n206 │         emit VolumeCharged(id, uint32(charge), uint32(used));\n    │                                ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:206:48\n    │\n206 │         emit VolumeCharged(id, uint32(charge), uint32(used));\n    │                                                ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:307:65\n    │\n307 │         int256 cumulative = s.cumulative + int256(s.lastTick) * int256(age);\n    │                                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:318:19\n    │\n318 │         history = uint32(nowTime - oldest);\n    │                   ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:323:16\n    │\n323 │         tick = int24(mean);\n    │                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":1387,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testAllowanceAndFailures() (gas: 54108)\n[PASS] testFuzzConservation(uint256) (runs: 512, μ: 39738, ~: 39927)\n[PASS] testMetadataAndSupply() (gas: 22563)\n[PASS] testNoMintOrAdminEvenDeployer() (gas: 12035)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 5.80ms (5.70ms CPU time)\n\nRan 1 test for test/Reentry.t.sol:ReentryTest\n[PASS] testTokenSettlementCannotReenterGuardOrManager() (gas: 1361144)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 51.40ms (590.42µs CPU time)\n\nRan 2 tests for test/Bootstrap.t.sol:BootstrapTest\n[PASS] testFuzzSeedRoundsDown(uint256) (runs: 512, μ: 6052, ~: 6052)\n[PASS] testTokenOnlyRangeRoundingAndLaunchLifecycle() (gas: 2095057)\nLogs:\n  launch liquidity: 80064092962998534530849\n  VGL seed units: 799999999999999999999992909\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 264.44ms (210.97ms CPU time)\n\nRan 2 tests for test/Edges.t.sol:EdgeTest\n[PASS] testExtremePricesRemainBounded() (gas: 1278730)\n[PASS] testFuzzInitializationNeverRequiresLiquidity(int24) (runs: 512, μ: 174299, ~: 175661)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 319.90ms (268.41ms CPU time)\n\nRan 19 tests for test/Hook.t.sol:HookTest\n[PASS] testAdaptiveLimitTightensWithVolatility() (gas: 408248)\n[PASS] testAllModesDirectionsAndAccounting() (gas: 712797)\n[PASS] testCallbackOrderAndNestedReentry() (gas: 167007)\n[PASS] testEWMAAndSameTimestampCannotDilute() (gas: 2015361)\n[PASS] testFuzzDirectionsAmounts(bool,bool,uint96) (runs: 512, μ: 240997, ~: 239456)\n[PASS] testFuzzRollingWindowMinimumRetention(uint8) (runs: 512, μ: 263161, ~: 263327)\n[PASS] testFuzzSplitSwapsNeverEscapeCap(uint8,bool) (runs: 512, μ: 1987442, ~: 1396727)\n[PASS] testInvalidExtremeAmountsAndWrongKey() (gas: 154716)\n[PASS] testLowLiquidityAndExitsEveryMode() (gas: 1345907)\n[PASS] testNegativeTwapRoundsDownAndNoInstantWeight() (gas: 298608)\n[PASS] testOversizeRevertsWithoutPhantomTransition() (gas: 787892)\n[PASS] testPermissionsAndInvalidDeployment() (gas: 85400)\n[PASS] testPoolIsolation() (gas: 562964)\n[PASS] testRuntimeContainsNoEscapeHatch() (gas: 1658208)\n[PASS] testSparseHistoryReturnsToWarmup() (gas: 141681)\n[PASS] testSplitVolumeAndBoundaryCannotResetBudget() (gas: 2641567)\n[PASS] testStressRingBoundedAndLongIdle() (gas: 27551492)\n[PASS] testUnauthorizedAllCallbacks() (gas: 23952)\n[PASS] testWarmupAndDeterministicRecovery() (gas: 507019)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 319.98ms (462.42ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:GuardInvariantTest\n[PASS] invariantAccountingIsolationAndBoundedState() (runs: 64, calls: 4096, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| GuardHandler | advance  | 2050  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| GuardHandler | trade    | 2046  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.30s (1.23s CPU time)\n\nRan 6 test suites in 1.30s (2.26s CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8860960506c320f1fafe0bd9866e576140a79f2cd9cbd0ca559234d51cf94634","verifiedTreeHash":"b4259d0ed98dac666c4a541e58fc88fa302b385c","verifierVersion":"0.1.0+976f3213"},{"checks":[{"durationMs":30380,"exitCode":0,"name":"build","output":"Compiling 88 files with Solc 0.8.26\nSolc 0.8.26 finished in 30.30s\nCompiler run successful!\nwarning[divide-before-multiply]: multiplication should occur before division to avoid loss of precision\n   ╭▸ src/Bootstrap.sol:14:17\n   │\n14 │         upper = (tick / 60) * 60; // opening tick is positive; floor gives token1-only range\n   │                 ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#divide-before-multiply\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:39:9\n   │\n39 │         token.transferFrom(address(this), address(2), 100);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Hook.t.sol:55:64\n   │\n55 │             assertEq(int256(token0.balanceOf(address(this))) - int256(b0), int256(d.amount0()));\n   │                                                                ━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Hook.t.sol:56:64\n   │\n56 │             assertEq(int256(token1.balanceOf(address(this))) - int256(b1), int256(d.amount1()));\n   │                                                                ━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:26:31\n   │\n26 │                 exactOutput ? int256(amount) : -int256(amount),\n   │                               ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:26:49\n   │\n26 │                 exactOutput ? int256(amount) : -int256(amount),\n   │                                                 ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:224:13\n    │\n224 │             block.timestamp - s.updatedAt > STALE_AFTER\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:43:9\n   │\n43 │         token.transferFrom(address(this), address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:45:9\n   │\n45 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:48:9\n   │\n48 │         token.transfer(address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:53:9\n   │\n53 │         token.transfer(address(1), amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:213:56\n    │\n213 │         BalanceDelta d = swap(direction, exactOutput ? int256(amount) : -int256(amount));\n    │                                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Invariant.t.sol:55:9\n   │\n55 │         token0.transfer(address(handler), 1e25);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:213:74\n    │\n213 │         BalanceDelta d = swap(direction, exactOutput ? int256(amount) : -int256(amount));\n    │                                                                          ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Invariant.t.sol:56:9\n   │\n56 │         token1.transfer(address(handler), 1e25);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:255:22\n    │\n255 │         bool stale = block.timestamp - s.updatedAt > STALE_AFTER;\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:264:17\n    │\n264 │             if (block.timestamp - s.sampledAt >= SAMPLE_PERIOD) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:290:50\n    │\n290 │             } else if (s.mode == Mode.GUARDED && block.timestamp - s.healthySince >= 60) {\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:293:51\n    │\n293 │             } else if (s.mode == Mode.RECOVERY && block.timestamp - s.healthySince >= 120 && history >= MIN_HISTORY) {\n    │                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:199:21\n    │\n199 │         b.volume += uint32(charge);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:206:32\n    │\n206 │         emit VolumeCharged(id, uint32(charge), uint32(used));\n    │                                ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:206:48\n    │\n206 │         emit VolumeCharged(id, uint32(charge), uint32(used));\n    │                                                ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:307:65\n    │\n307 │         int256 cumulative = s.cumulative + int256(s.lastTick) * int256(age);\n    │                                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:318:19\n    │\n318 │         history = uint32(nowTime - oldest);\n    │                   ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:323:16\n    │\n323 │         tick = int24(mean);\n    │                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":1349,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testAllowanceAndFailures() (gas: 54108)\n[PASS] testFuzzConservation(uint256) (runs: 512, μ: 39738, ~: 39927)\n[PASS] testMetadataAndSupply() (gas: 22563)\n[PASS] testNoMintOrAdminEvenDeployer() (gas: 12035)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.30ms (4.25ms CPU time)\n\nRan 1 test for test/Reentry.t.sol:ReentryTest\n[PASS] testTokenSettlementCannotReenterGuardOrManager() (gas: 1361144)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 67.29ms (576.81µs CPU time)\n\nRan 2 tests for test/Edges.t.sol:EdgeTest\n[PASS] testExtremePricesRemainBounded() (gas: 1278730)\n[PASS] testFuzzInitializationNeverRequiresLiquidity(int24) (runs: 512, μ: 174299, ~: 175661)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 77.94ms (27.54ms CPU time)\n\nRan 2 tests for test/Bootstrap.t.sol:BootstrapTest\n[PASS] testFuzzSeedRoundsDown(uint256) (runs: 512, μ: 6052, ~: 6052)\n[PASS] testTokenOnlyRangeRoundingAndLaunchLifecycle() (gas: 2095057)\nLogs:\n  launch liquidity: 80064092962998534530849\n  VGL seed units: 799999999999999999999992909\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 256.85ms (206.40ms CPU time)\n\nRan 19 tests for test/Hook.t.sol:HookTest\n[PASS] testAdaptiveLimitTightensWithVolatility() (gas: 408248)\n[PASS] testAllModesDirectionsAndAccounting() (gas: 712797)\n[PASS] testCallbackOrderAndNestedReentry() (gas: 167007)\n[PASS] testEWMAAndSameTimestampCannotDilute() (gas: 2015361)\n[PASS] testFuzzDirectionsAmounts(bool,bool,uint96) (runs: 512, μ: 240997, ~: 239456)\n[PASS] testFuzzRollingWindowMinimumRetention(uint8) (runs: 512, μ: 263161, ~: 263327)\n[PASS] testFuzzSplitSwapsNeverEscapeCap(uint8,bool) (runs: 512, μ: 1987442, ~: 1396727)\n[PASS] testInvalidExtremeAmountsAndWrongKey() (gas: 154716)\n[PASS] testLowLiquidityAndExitsEveryMode() (gas: 1345907)\n[PASS] testNegativeTwapRoundsDownAndNoInstantWeight() (gas: 298608)\n[PASS] testOversizeRevertsWithoutPhantomTransition() (gas: 787892)\n[PASS] testPermissionsAndInvalidDeployment() (gas: 85400)\n[PASS] testPoolIsolation() (gas: 562964)\n[PASS] testRuntimeContainsNoEscapeHatch() (gas: 1658208)\n[PASS] testSparseHistoryReturnsToWarmup() (gas: 141681)\n[PASS] testSplitVolumeAndBoundaryCannotResetBudget() (gas: 2641567)\n[PASS] testStressRingBoundedAndLongIdle() (gas: 27551492)\n[PASS] testUnauthorizedAllCallbacks() (gas: 23952)\n[PASS] testWarmupAndDeterministicRecovery() (gas: 507019)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 312.72ms (454.36ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:GuardInvariantTest\n[PASS] invariantAccountingIsolationAndBoundedState() (runs: 64, calls: 4096, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| GuardHandler | advance  | 2050  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| GuardHandler | trade    | 2046  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.26s (1.20s CPU time)\n\nRan 6 test suites in 1.26s (1.98s CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"bd63d6ca92cb6095a041b1f0cc0b2773ab0eca3f0fd6edf0281d0adfe041e29f","verifiedTreeHash":"757b4961600f91c2c65212a673f2ec847a2d34cd","verifierVersion":"0.1.0+976f3213"},{"checks":[{"durationMs":29741,"exitCode":0,"name":"build","output":"Compiling 88 files with Solc 0.8.26\nSolc 0.8.26 finished in 29.67s\nCompiler run successful!\nwarning[divide-before-multiply]: multiplication should occur before division to avoid loss of precision\n   ╭▸ src/Bootstrap.sol:14:17\n   │\n14 │         upper = (tick / 60) * 60; // opening tick is positive; floor gives token1-only range\n   │                 ━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#divide-before-multiply\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:26:31\n   │\n26 │                 exactOutput ? int256(amount) : -int256(amount),\n   │                               ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Invariant.t.sol:26:49\n   │\n26 │                 exactOutput ? int256(amount) : -int256(amount),\n   │                                                 ━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Invariant.t.sol:55:9\n   │\n55 │         token0.transfer(address(handler), 1e25);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:39:9\n   │\n39 │         token.transferFrom(address(this), address(2), 100);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:43:9\n   │\n43 │         token.transferFrom(address(this), address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:45:9\n   │\n45 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:48:9\n   │\n48 │         token.transfer(address(2), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Hook.t.sol:55:64\n   │\n55 │             assertEq(int256(token0.balanceOf(address(this))) - int256(b0), int256(d.amount0()));\n   │                                                                ━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/Hook.t.sol:56:64\n   │\n56 │             assertEq(int256(token1.balanceOf(address(this))) - int256(b1), int256(d.amount1()));\n   │                                                                ━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Invariant.t.sol:56:9\n   │\n56 │         token1.transfer(address(handler), 1e25);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Token.t.sol:53:9\n   │\n53 │         token.transfer(address(1), amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:213:56\n    │\n213 │         BalanceDelta d = swap(direction, exactOutput ? int256(amount) : -int256(amount));\n    │                                                        ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:213:74\n    │\n213 │         BalanceDelta d = swap(direction, exactOutput ? int256(amount) : -int256(amount));\n    │                                                                          ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:224:13\n    │\n224 │             block.timestamp - s.updatedAt > STALE_AFTER\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:255:22\n    │\n255 │         bool stale = block.timestamp - s.updatedAt > STALE_AFTER;\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:264:17\n    │\n264 │             if (block.timestamp - s.sampledAt >= SAMPLE_PERIOD) {\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:290:50\n    │\n290 │             } else if (s.mode == Mode.GUARDED && block.timestamp - s.healthySince >= 60) {\n    │                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/VolatilityGuardHook.sol:293:51\n    │\n293 │             } else if (s.mode == Mode.RECOVERY && block.timestamp - s.healthySince >= 120 && history >= MIN_HISTORY) {\n    │                                                   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:199:21\n    │\n199 │         b.volume += uint32(charge);\n    │                     ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:206:32\n    │\n206 │         emit VolumeCharged(id, uint32(charge), uint32(used));\n    │                                ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:206:48\n    │\n206 │         emit VolumeCharged(id, uint32(charge), uint32(used));\n    │                                                ━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:307:65\n    │\n307 │         int256 cumulative = s.cumulative + int256(s.lastTick) * int256(age);\n    │                                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:318:19\n    │\n318 │         history = uint32(nowTime - oldest);\n    │                   ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint32' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/VolatilityGuardHook.sol:323:16\n    │\n323 │         tick = int24(mean);\n    │                ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int24' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\n","passed":true},{"durationMs":1300,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/Token.t.sol:TokenTest\n[PASS] testAllowanceAndFailures() (gas: 54108)\n[PASS] testFuzzConservation(uint256) (runs: 512, μ: 39738, ~: 39927)\n[PASS] testMetadataAndSupply() (gas: 22563)\n[PASS] testNoMintOrAdminEvenDeployer() (gas: 12035)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.37ms (4.30ms CPU time)\n\nRan 2 tests for test/Bootstrap.t.sol:BootstrapTest\n[PASS] testFuzzSeedRoundsDown(uint256) (runs: 512, μ: 6052, ~: 6052)\n[PASS] testTokenOnlyRangeRoundingAndLaunchLifecycle() (gas: 2095057)\nLogs:\n  launch liquidity: 80064092962998534530849\n  VGL seed units: 799999999999999999999992909\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 62.83ms (13.12ms CPU time)\n\nRan 2 tests for test/Edges.t.sol:EdgeTest\n[PASS] testExtremePricesRemainBounded() (gas: 1278730)\n[PASS] testFuzzInitializationNeverRequiresLiquidity(int24) (runs: 512, μ: 174299, ~: 175661)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 73.09ms (24.20ms CPU time)\n\nRan 1 test for test/Reentry.t.sol:ReentryTest\n[PASS] testTokenSettlementCannotReenterGuardOrManager() (gas: 1361144)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 80.37ms (632.06µs CPU time)\n\nRan 19 tests for test/Hook.t.sol:HookTest\n[PASS] testAdaptiveLimitTightensWithVolatility() (gas: 408248)\n[PASS] testAllModesDirectionsAndAccounting() (gas: 712797)\n[PASS] testCallbackOrderAndNestedReentry() (gas: 167007)\n[PASS] testEWMAAndSameTimestampCannotDilute() (gas: 2015361)\n[PASS] testFuzzDirectionsAmounts(bool,bool,uint96) (runs: 512, μ: 240997, ~: 239456)\n[PASS] testFuzzRollingWindowMinimumRetention(uint8) (runs: 512, μ: 263161, ~: 263327)\n[PASS] testFuzzSplitSwapsNeverEscapeCap(uint8,bool) (runs: 512, μ: 1987442, ~: 1396727)\n[PASS] testInvalidExtremeAmountsAndWrongKey() (gas: 154716)\n[PASS] testLowLiquidityAndExitsEveryMode() (gas: 1345907)\n[PASS] testNegativeTwapRoundsDownAndNoInstantWeight() (gas: 298608)\n[PASS] testOversizeRevertsWithoutPhantomTransition() (gas: 787892)\n[PASS] testPermissionsAndInvalidDeployment() (gas: 85400)\n[PASS] testPoolIsolation() (gas: 562964)\n[PASS] testRuntimeContainsNoEscapeHatch() (gas: 1658208)\n[PASS] testSparseHistoryReturnsToWarmup() (gas: 141681)\n[PASS] testSplitVolumeAndBoundaryCannotResetBudget() (gas: 2641567)\n[PASS] testStressRingBoundedAndLongIdle() (gas: 27551492)\n[PASS] testUnauthorizedAllCallbacks() (gas: 23952)\n[PASS] testWarmupAndDeterministicRecovery() (gas: 507019)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 343.83ms (452.06ms CPU time)\n\nRan 1 test for test/Invariant.t.sol:GuardInvariantTest\n[PASS] invariantAccountingIsolationAndBoundedState() (runs: 64, calls: 4096, reverts: 0)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| GuardHandler | advance  | 2050  | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| GuardHandler | trade    | 2046  | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.22s (1.16s CPU time)\n\nRan 6 test suites in 1.22s (1.78s CPU time): 29 tests passed, 0 failed, 0 skipped (29 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d50604e80d62b21bf36bf85f49707f1f46fb37eca1b6fa462c8e93bb38fe4807","verifiedTreeHash":"6320590decd54f945f536552fce4f470497b4295","verifierVersion":"0.1.0+976f3213"}]}