{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"5e569a31-ee5f-44e6-ab31-eff054268003","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"working"},{"acceptedSubmissionHash":"f68ed431914b8775f00d511d05e74c4dbb994a099f3754234c4259667700b35f","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"b6503de65ad02f845827887c23da4c3b56ccc5df7a459db263bae6e549d92f7f","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"working"},{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"failed"}],"objective":"Launch Panic Monkeys ($PANIC, ERC-20 name \"Panic Monkeys\", symbol \"PANIC\") with a Uniswap v4 hook. The hook punishes selling while the price is down and makes dip buying cheap.\n\nREFERENCE PRICE: the hook keeps its own 1-hour time-weighted average price (TWAP) of this pool. It records at most one observation per block, using the pool price before the first swap of that block, so trades in the current block can never move the reference. Drawdown = how far the price is below the reference, in percent. \"Down\" means drawdown of 5% or more.\n\nHOOK FEE (on top of the pool's base fee), taken in the paired currency (the non-PANIC side): from the input on buys (beforeSwap return delta), from the output on sells (afterSwap return delta).\n- Buys, judged on the price before the buy: 0% when drawdown < 5%; 1% when drawdown >= 5%.\n- Sells, judged on the price AFTER the sell: 2% when drawdown < 5%; 10% when 5% <= drawdown < 15%; 20% when 15% <= drawdown < 30%; 30% when drawdown >= 30%.\n- No exemptions for any address. Hook fee never exceeds 30%.\n\nFEE SPLIT of every hook fee: 60% accrues to a Panic Oracle Fund claimable only to a fixed oracle budget address (the paying wallet); 30% is donated to in-range liquidity providers with PoolManager.donate; 10% accrues to a burn bucket: a permissionless buybackAndBurn() swaps it for PANIC in this pool and sends the PANIC to 0x000000000000000000000000000000000000dEaD; it reverts if it would receive less than 98% of the PANIC implied by the 1-hour reference price, and spends at most a capped amount per call. Claim, donate and buybackAndBurn are permissionless functions anyone can call. No dust may stay stuck.\n\nADMIN: nobody can change fees, thresholds, splits or the reference window after deployment. No owner, no pause, no upgrade.\n\nREQUIRED TESTS: tiers switch exactly at 5%, 15%, 30% drawdown; a sell moving price from not-down to 20% down pays 20%; splitting one large sell into 10 small sells pays at least as much total tax; a buy and a sell in the same block cannot move the reference; after the price sits down but flat for 1 hour the panic tier no longer applies; the fee split sums to exactly 100%; hook fee capped at 30%; buybackAndBurn reverts when the price is more than 2% above the reference and all PANIC it buys ends at 0x...dEaD.","parentJobId":null,"planHash":"0b24892e9f33213c2fad25162dade4c32219cff800d62774fafd1c90b9a2c5dd","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"5e569a31-ee5f-44e6-ab31-eff054268003","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-898-launch-panic-monkeys-panic"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51297","feedbackHash":"1559b7b3f12651ce07b5452a38556ca12ddd4340c71d7c629c0fb7552dbf3351","nodeKey":"build_contract_project","submissionHash":"f68ed431914b8775f00d511d05e74c4dbb994a099f3754234c4259667700b35f","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"2bd81854ffac1dabafd4a9a7be1db183be4dcfe79a6f34bb020b9536330c9f6a","state":"blocked","submissions":[{"artifacts":[],"attempt":2,"bundleHash":null,"device":"5095407bdf7ee98a","findings":[],"hash":"69934e340fc8e1fa33153375e95fe78daa1a4337cdad75d77dbad14e5d3d8d0e","nodeId":"35cc8e8b-cba0-44fa-a8e0-ca6c62900a12","outcome":"failed","summary":"the task produced no changes; the agent's last message was: The execution environment still blocks this task:\n\n- Every shell command fails with `bwrap: No permissions to create a new namespace`.\n- File-editing attempts also fail.\n- Neither `forge build` nor `forge test` could start.\n\nNo deliverable files were changed. I couldn’t inspect the implementation or establish any contract findings. The sandbox must be repaired before I can implement and verify the tests.","treeHash":null,"usage":{"cachedInputTokens":116480,"inputTokens":17200,"model":"gpt-6-astra","outputTokens":1028,"runtime":"codex","turns":3,"wallClockMs":49737}},{"artifacts":[],"attempt":3,"bundleHash":null,"device":"a7785f55ff5b9988","findings":[],"hash":"b6d7362194f07af42c46f158f5d9cddf892fd43db40987d85e8d969e1dbfa7c9","nodeId":"35cc8e8b-cba0-44fa-a8e0-ca6c62900a12","outcome":"failed","summary":"the task produced no changes; the agent's last message was: Blocked by the execution environment: shell commands fail with `bwrap: setting up uid map: Permission denied`, and file edits also fail.\n\nI couldn’t read the implementation or add tests. Both `forge build` and `forge test` failed before starting. No files changed or contract findings established.\n\nThe sandbox must be repaired before this task can be completed.","treeHash":null,"usage":{"cachedInputTokens":88832,"inputTokens":16434,"model":"gpt-6-astra","outputTokens":1116,"runtime":"codex","turns":3,"wallClockMs":51606}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2122058046fede33","findings":[],"hash":"f68ae2462df64ff14f928b740404efa6920ce4aecbedde43e1b2ec7a73099100","nodeId":"35cc8e8b-cba0-44fa-a8e0-ca6c62900a12","outcome":"failed","summary":"the task produced no changes; the agent's last message was: Blocked by the execution environment: every shell command fails before running with `bwrap: No permissions to create a new namespace`.\n\nNo files were changed. I couldn’t read the supplied files, implement tests, or run `forge build` and `forge test`. The sandbox must be repaired before this assignment can be completed.","treeHash":null,"usage":{"cachedInputTokens":58112,"inputTokens":19270,"model":"gpt-6-astra","outputTokens":513,"runtime":"codex","turns":2,"wallClockMs":38203}},{"artifacts":[],"attempt":1,"bundleHash":"d193fb2ba6f4af529e09d55aec92cb43967abbdaa2bff299eaedaf73bfb9f2d6","device":"8df16409e9706163","findings":[],"hash":"f68ed431914b8775f00d511d05e74c4dbb994a099f3754234c4259667700b35f","nodeId":"af933276-4e5b-4e1b-bbe8-8622f02959c5","outcome":"completed","summary":"Implemented the token, TWAP hook, fee allocation, buyback, deployment helper, tests, and documentation.\n\nVerified: `forge build`, `forge test` (**40 passed**), and `forge fmt --check`.\n\n**One requirement remains unresolved:** post-sell tier taxation conflicts with split resistance. The implementation follows the explicit tiers and includes a real-pool counterexample. See [README](./README.md) and [conflict analysis](./docs/SPECIFICATION-CONFLICT.md). Full compliance requires resolving that contradiction.","treeHash":"4532a116b9bfa2ef46ee10b4447745d169b820ad","usage":{"cachedInputTokens":2070144,"inputTokens":114418,"model":"gpt-6-astra","outputTokens":35244,"runtime":"codex","turns":8,"wallClockMs":1262860}}],"verification":[{"checks":[{"durationMs":3409,"exitCode":0,"name":"build","output":"Compiling 88 files with Solc 0.8.26\nSolc 0.8.26 finished in 3.27s\nCompiler run successful!\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n   ╭▸ src/PanicHookDeployer.sol:26:16\n   │\n26 │           return abi.encodePacked(\n   │ ┏━━━━━━━━━━━━━━━━┛\n27 │ ┃             type(PanicHook).creationCode,\n28 │ ┃             abi.encode(\n29 │ ┃                 config.manager,\n   ‡ ┃\n36 │ ┃         );\n   │ ┗━━━━━━━━━┛\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/PanicHookDeployer.sol:83:9\n   │\n83 │         emit Deployed(address(hook), msg.sender);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n   ╭▸ src/PanicHookDeployer.sol:82:9\n   │\n82 │         config.manager.initialize(key, config.sqrtPriceX96);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[missing-zero-check]: address parameter is used in a state write or value transfer without a zero-address check\n   ╭▸ src/PanicHook.sol:69:9\n   │\n69 │         address panicToken,\n   │         ━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-zero-check\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/PanicHook.sol:78:38\n   │\n78 │                 || cap == 0 || cap > uint128(type(int128).max) || spacing < TickMath.MIN_TICK_SPACING\n   │                                      ━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/HourOracle.sol:28:25\n   │\n28 │         initializedAt = uint64(block.timestamp);\n   │                         ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/HourOracle.sol:30:39\n   │\n30 │         observations[0] = Observation(uint64(block.timestamp), 0);\n   │                                       ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/HourOracle.sol:34:48\n   │\n34 │         emit ObservationRecorded(block.number, uint64(block.timestamp), price);\n   │                                                ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/HourOracle.sol:41:13\n   │\n41 │         if (block.timestamp > last.timestamp) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/HourOracle.sol:49:9\n   │\n49 │         emit ObservationRecorded(block.number, uint64(block.timestamp), ref);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/HourOracle.sol:43:17\n   │\n43 │                 uint64(block.timestamp), last.cumulative + preSwapPrice * (block.timestamp - last.timestamp)\n   │                 ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/HourOracle.sol:49:48\n   │\n49 │         emit ObservationRecorded(block.number, uint64(block.timestamp), ref);\n   │                                                ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint64' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/HourOracle.sol:57:13\n   │\n57 │         if (age < WINDOW) return (nowCumulative + initialPrice * (WINDOW - age)) / WINDOW;\n   │             ━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/HourOracle.sol:60:13\n   │\n60 │         if (target >= last.timestamp) {\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/HourOracle.sol:68:21\n   │\n68 │                 if (observations[mid % CAPACITY].timestamp <= target) lo = mid;\n   │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n   ╭▸ src/HourOracle.sol:34:9\n   │\n34 │         emit ObservationRecorded(block.number, uint64(block.timestamp), price);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PanicHook.sol:204:9\n    │\n204 │         emit FeeAccrued(buy, fee, bps);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:159:29\n    │\n159 │             uint256 gross = uint256(-params.amountSpecified);\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:165:61\n    │\n165 │         return (this.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n    │                                                             ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:165:68\n    │\n165 │         return (this.beforeSwap.selector, toBeforeSwapDelta(int128(int256(fee)), 0), 0);\n    │                                                                    ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:180:34\n    │\n180 │             if (pairDelta > 0 || uint256(-int256(pairDelta)) != _expectedBuyInput) revert PartialBuy();\n    │                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:186:23\n    │\n186 │         uint256 fee = uint256(uint128(pairDelta)) * bps / 10_000;\n    │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:186:31\n    │\n186 │         uint256 fee = uint256(uint128(pairDelta)) * bps / 10_000;\n    │                               ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:188:42\n    │\n188 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                          ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:188:49\n    │\n188 │         return (this.afterSwap.selector, int128(int256(fee)));\n    │                                                 ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_entered` is updated\n    ╭▸ src/PanicHook.sol:213:9\n    │\n213 │         poolManager.unlock(abi.encode(uint8(0), amount));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PanicHook.sol:214:9\n    │\n214 │         emit OracleClaimed(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:210:22\n    │\n210 │         if (amount > uint256(int256(type(int128).max))) amount = uint256(int256(type(int128).max));\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:210:66\n    │\n210 │         if (amount > uint256(int256(type(int128).max))) amount = uint256(int256(type(int128).max));\n    │                                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/PanicHook.sol:213:9\n    │\n213 │         poolManager.unlock(abi.encode(uint8(0), amount));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_entered` is updated\n    ╭▸ src/PanicHook.sol:224:9\n    │\n224 │         poolManager.unlock(abi.encode(uint8(1), amount));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PanicHook.sol:225:9\n    │\n225 │         emit LiquidityDonated(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:220:22\n    │\n220 │         if (amount > uint256(int256(type(int128).max))) amount = uint256(int256(type(int128).max));\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:220:66\n    │\n220 │         if (amount > uint256(int256(type(int128).max))) amount = uint256(int256(type(int128).max));\n    │                                                                  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/PanicHook.sol:224:9\n    │\n224 │         poolManager.unlock(abi.encode(uint8(1), amount));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_entered` is updated\n    ╭▸ src/PanicHook.sol:239:29\n    │\n239 │         burned = abi.decode(poolManager.unlock(abi.encode(uint8(2), amount)), (uint256));\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PanicHook.sol:240:9\n    │\n240 │         emit BoughtAndBurned(amount, burned);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_entered` is updated\n    ╭▸ src/PanicHook.sol:252:9\n    │\n252 │         poolManager.unlock(abi.encode(uint8(3), amount, msg.sender));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PanicHook.sol:253:9\n    │\n253 │         emit BurnFunded(amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/PanicHook.sol:252:9\n    │\n252 │         poolManager.unlock(abi.encode(uint8(3), amount, msg.sender));\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/PanicHook.sol:263:13\n    │\n263 │             poolManager.donate(_key, panicIs0 ? 0 : amount, panicIs0 ? amount : 0, \"\");\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:296:29\n    │\n296 │                 !panicIs0, -int256(net), panicIs0 ? TickMath.MAX_SQRT_PRICE - 1 : TickMath.MIN_SQRT_PRICE + 1\n    │                             ━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:302:31\n    │\n302 │         if (pairDelta >= 0 || uint256(-int256(pairDelta)) != net || panicDelta <= 0) revert PartialBuy();\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:303:20\n    │\n303 │         received = uint256(uint128(panicDelta));\n    │                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PanicHook.sol:303:28\n    │\n303 │         received = uint256(uint128(panicDelta));\n    │                            ━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\n","passed":true},{"durationMs":525,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/PanicMath.t.sol:PanicMathTest\n[PASS] testFuzz_capAndSplitConservation(uint128,uint160,uint160) (runs: 256, μ: 7852, ~: 7950)\n[PASS] test_exactTierBoundaries() (gas: 12841)\n[PASS] test_oneUnitFeeHasNoUnallocatedDust() (gas: 4496)\n[PASS] test_priceOrientationAndDecimals() (gas: 7524)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.33ms (2.53ms CPU time)\n\nRan 1 test for test/PanicHook.t.sol:PanicCurrency1Test\n[PASS] test_reverseCurrencyOrderAndMaintenance() (gas: 1004859)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 4.27ms (1.55ms CPU time)\n\nRan 4 tests for test/PanicMonkeys.t.sol:PanicMonkeysTest\n[PASS] test_metadataAndSupply() (gas: 52601)\n[PASS] test_noAdminOrMintEntryPoints() (gas: 152278)\n[PASS] test_runtimeHasNoEscapeHatch() (gas: 763055)\n[PASS] test_transferAndAllowance() (gas: 223271)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 5.34ms (2.12ms CPU time)\n\nRan 3 tests for test/PanicHook.t.sol:PanicNativeTest\n[PASS] test_feeBearingBuyOnFreshTokenOnlyManager() (gas: 1220593)\n[PASS] test_nativeBudgetReentryIsBlocked() (gas: 921662)\n[PASS] test_rejectingEthBudgetCannotHaltTrading() (gas: 875565)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 14.34ms (2.86ms CPU time)\n\nRan 2 tests for test/PanicHookDeployer.t.sol:PanicHookDeployerTest\n[PASS] test_deployAndInitializeAtomically() (gas: 1040792767)\n[PASS] test_initializationFailureRollsBackDeployment() (gas: 31801235)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 22.32ms (31.29ms CPU time)\n\nRan 21 tests for test/PanicHook.t.sol:PanicHookTest\n[PASS] testFuzz_realSwapsConserveClaims(bool,uint96) (runs: 256, μ: 361844, ~: 418253)\nLogs:\n  Bound result 249999000000000000008871\n\n[PASS] test_buyAndSellCannotChangeSameBlockReference() (gas: 930702)\n[PASS] test_buyJudgedBeforeItRestoresPrice() (gas: 581884)\n[PASS] test_buybackActualOutputIncludesPoolFeeInMinimum() (gas: 442053)\n[PASS] test_buybackCallerLimitIsRespected() (gas: 475415)\n[PASS] test_buybackRevertsAboveReferenceAndRollsBack() (gas: 497103)\n[PASS] test_buybackSpendsLastBucketRemainderAndCanTopUpDust() (gas: 759860)\n[PASS] test_callbacksRefuseUnauthorizedCallers() (gas: 152740)\n[PASS] test_donationWithoutLiquidityRevertsWithoutLosingBucket() (gas: 619320)\n[PASS] test_exactOutputAndPartialBuysRevert() (gas: 239823)\n[PASS] test_failedOrShortTokenFundingRollsBack() (gas: 274957)\n[PASS] test_flatHourResetsPanicTier() (gas: 642335)\n[PASS] test_initializationAndPermissions() (gas: 37442)\n[PASS] test_invalidConstructorAndUninitializedUse() (gas: 3970734)\n[PASS] test_oracleBudgetHasNoFeeExemption() (gas: 514562)\n[PASS] test_permissionlessClaimDonationAndBuyback() (gas: 924491)\n[PASS] test_runtimeHasNoEscapeHatchesAndFitsSizeLimit() (gas: 5577822)\n[PASS] test_secondPoolAndWrongKeyRejected() (gas: 83163)\n[PASS] test_sellFromFlatToTwentyPercentDownUsesPostPrice() (gas: 454769)\n[PASS] test_specConflict_tenSmallSellsPayLessThanOneLargeSell() (gas: 2443643)\nLogs:\n  one sell tax: 21189092534644613321412\n  ten sells tax: 11677354016981352100772\n\n[PASS] test_zeroBucketsAndInvalidFunding() (gas: 466722)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 35.40ms (56.56ms CPU time)\n\nRan 4 tests for test/HourOracle.t.sol:HourOracleTest\n[PASS] testFuzz_weightedTwoIntervals(uint160,uint160,uint16) (runs: 256, μ: 213207, ~: 213122)\nLogs:\n  Bound result 79228162514264337593543950336\n  Bound result 1461501637330902918203684832716283019655932542975\n  Bound result 3082\n\n[PASS] test_arithmeticWindowAndInterpolation() (gas: 306460)\n[PASS] test_firstBlockFrozenAndFlatHour() (gas: 190746)\n[PASS] test_ringWrapRetainsWholeWindow() (gas: 377088028)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 406.25ms (414.05ms CPU time)\n\nRan 1 test for test/PanicInvariant.t.sol:PanicInvariantTest\n[PASS]\nPanicInvariantTest invariants:\n[PASS] invariant_claimsExactlyBackAllBuckets\n[PASS] invariant_conservationAcrossMaintenance\n PanicInvariantTest invariants (runs: 64, calls: 2048, reverts: 214)\n\n╭--------------+----------+-------+---------+----------╮\n| Contract     | Selector | Calls | Reverts | Discards |\n+======================================================+\n| PanicHandler | buyback  | 427   | 214     | 0        |\n|--------------+----------+-------+---------+----------|\n| PanicHandler | claim    | 407   | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| PanicHandler | donate   | 389   | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| PanicHandler | fund     | 414   | 0       | 0        |\n|--------------+----------+-------+---------+----------|\n| PanicHandler | trade    | 411   | 0       | 0        |\n╰--------------+----------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 48368654805579\n  Bound result 6184\n  Bound result 17580\n  Bound result 1999999999000010854\n  Bound result 12582911\n  Bound result 1999999999000003114\n  Bound result 887272\n  Bound result 574568338633144607\n  Bound result 3600\n  Bound result 119999999999999000010152\n  Bound result 3974\n  Bound result 4\n  Bound result 36132041197741795082259\n  Bound result 359541238\n  Bound result 13534\n  Bound result 1000\n  Bound result 119999999999999000003730\n  Bound result 2700\n  Bound result 2807011243\n  Bound result 96\n  Bound result 119999999999999000003726\n  Bound result 1999999999000000056\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 421.93ms (414.64ms CPU time)\n\nRan 8 test suites in 423.47ms (912.18ms CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":49,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PanicHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PanicHook.beforeInitialize(address,(address,address,uint24,int24,address),uint160)\",\"PanicHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PanicHook.buybackAndBurn()\",\"PanicHook.buybackAndBurn(uint256)\",\"PanicHook.claim()\",\"PanicHook.donate()\",\"PanicHook.fundBurn(uint256)\",\"PanicHook.unlockCallback(bytes)\",\"PanicHookDeployer.deploy((address,address,address,address,uint128,int24,uint160),bytes32)\",\"PanicMonkeys.approve(address,uint256)\",\"PanicMonkeys.transfer(address,uint256)\",\"PanicMonkeys.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"LICENSE\":21,\"README.md\":122,\"docs/DEPENDENCIES.md\":10,\"docs/SECURITY-REVIEW.md\":36,\"docs/SPECIFICATION-CONFLICT.md\":36,\"foundry.toml\":21,\"remappings.txt\":4,\"src/HookFlags.sol\":30,\"src/HourOracle.sol\":80,\"src/PanicHook.sol\":317,\"src/PanicHookDeployer.sol\":85,\"src/PanicMath.sol\":41,\"src/PanicMonkeys.sol\":11,\"test/HourOracle.t.sol\":78,\"test/PanicHook.t.sol\":536,\"test/PanicHookDeployer.t.sol\":73,\"test/PanicInvariant.t.sol\":110,\"test/PanicMath.t.sol\":51,\"test/PanicMonkeys.t.sol\":64,\"test/mocks/MockERC20.sol\":9},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":2137,"exitCode":0,"name":"slither","output":"[medium/high] incorrect-equality at src/PanicHook.sol:141: PanicHook.referencePrice() (src/PanicHook.sol#141-145) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/HourOracle.sol:52: HourOracle._reference(uint256) (src/HourOracle.sol#52-79) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/PanicHook.sol:195: PanicHook._accrue(uint256,bool,uint256,bool) (src/PanicHook.sol#195-205) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/HourOracle.sol:37: HourOracle._observe(uint256) (src/HourOracle.sol#37-50) uses a dangerous strict equality:\n[medium/medium] unused-return at src/PanicHook.sol:256: PanicHook.unlockCallback(bytes) (src/PanicHook.sol#256-281) ignores return value by poolManager.donate(_key,amount,0,) (src/PanicHook.sol#263)\n[medium/medium] unused-return at src/PanicHook.sol:135: PanicHook.spotPrice() (src/PanicHook.sol#135-139) ignores return value by (sqrtPriceX96,None,None,None) = poolManager.getSlot0(poolId) (src/PanicHook.sol#137)\n[medium/medium] unused-return at src/PanicHook.sol:256: PanicHook.unlockCallback(bytes) (src/PanicHook.sol#256-281) ignores return value by poolManager.donate(_key,0,amount,) (src/PanicHook.sol#263)\n[medium/medium] unused-return at src/PanicHook.sol:244: PanicHook.fundBurn(uint256) (src/PanicHook.sol#244-254) ignores return value by poolManager.unlock(abi.encode(uint8(3),amount,msg.sender)) (src/PanicHook.sol#252)\n[medium/medium] unused-return at src/PanicHook.sol:208: PanicHook.claim() (src/PanicHook.sol#208-215) ignores return value by poolManager.unlock(abi.encode(uint8(0),amount)) (src/PanicHook.sol#213)\n[medium/medium] unused-return at src/PanicHook.sol:218: PanicHook.donate() (src/PanicHook.sol#218-226) ignores return value by poolManager.unlock(abi.encode(uint8(1),amount)) (src/PanicHook.sol#224)\n[medium/medium] unused-return at src/PanicHookDeployer.sol:65: PanicHookDeployer.deploy(PanicHookDeployer.Config,bytes32) (src/PanicHookDeployer.sol#65-84) ignores return value by config.manager.initialize(key,config.sqrtPriceX96) (src/PanicHookDeployer.sol#82)\n[low/medium] reentrancy-events at src/PanicHookDeployer.sol:65: Reentrancy in PanicHookDeployer.deploy(PanicHookDeployer.Config,bytes32) (src/PanicHookDeployer.sol#65-84):\n[low/medium] reentrancy-events at src/PanicHook.sol:244: Reentrancy in PanicHook.fundBurn(uint256) (src/PanicHook.sol#244-254):\n[low/medium] reentrancy-events at src/PanicHook.sol:208: Reentrancy in PanicHook.claim() (src/PanicHook.sol#208-215):\n[low/medium] reentrancy-events at src/PanicHook.sol:218: Reentrancy in PanicHook.donate() (src/PanicHook.sol#218-226):\n[low/medium] reentrancy-events at src/PanicHook.sol:195: Reentrancy in PanicHook._accrue(uint256,bool,uint256,bool) (src/PanicHook.sol#195-205):\n[low/medium] reentrancy-events at src/PanicHook.sol:233: Reentrancy in PanicHook.buybackAndBurn(uint256) (src/PanicHook.sol#233-241):\n[low/medium] timestamp at src/HourOracle.sol:37: HourOracle._observe(uint256) (src/HourOracle.sol#37-50) uses timestamp for comparisons\n[low/medium] timestamp at src/PanicHook.sol:168: PanicHook.afterSwap(address,PoolKey,SwapParams,BalanceDelta,bytes) (src/PanicHook.sol#168-189) uses timestamp for comparisons\n[low/medium] timestamp at src/PanicHook.sol:283: PanicHook._buyback(uint256) (src/PanicHook.sol#283-308) uses timestamp for comparisons\n[low/medium] timestamp at src/HourOracle.sol:52: HourOracle._reference(uint256) (src/HourOracle.sol#52-79) uses timestamp for comparisons\n[low/medium] timestamp at src/PanicHook.sol:195: PanicHook._accrue(uint256,bool,uint256,bool) (src/PanicHook.sol#195-205) uses timestamp for comparisons","passed":true},{"durationMs":462,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PanicHookDeployer.sol:26: `abi.encodePacked()` Hash Collision\n[high] contract-locks-ether at src/PanicHook.sol:22: Contract locks Ether without a withdraw function\n[low] internal-function-used-once at src/HookFlags.sol:23: Internal Function Used Only Once\n[low] large-numeric-literal at src/PanicHook.sol:161: Large Numeric Literal (4 places)\n[low] literal-instead-of-constant at src/PanicHook.sol:161: Literal Instead of Constant (16 places)\n[low] unchecked-return at src/PanicHook.sol:213: Unchecked Return (6 places)\n[low] unused-public-function at src/PanicHook.sol:141: Public Function Not Used Internally","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"f68ed431914b8775f00d511d05e74c4dbb994a099f3754234c4259667700b35f","verifiedTreeHash":"4532a116b9bfa2ef46ee10b4447745d169b820ad","verifierVersion":"0.1.0+be003835"}]}