{"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":"cbe454a2-ae64-43be-8981-f86bd284cf5c","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"3b6f759285a96121c2b20a52b8a6c237df2098aa8a40422b7194b9912fe16620","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","state":"accepted"}],"objective":"CONTINUE job 8c0d9340-589f-42c4-a7e7-a34df94a0662 as a source-only follow-up. Do not deploy, do not host, do not change launch.json addresses, do not open a new launch. Keep SPEC.md v4 economics. Fix the High/Low findings in-repo and leave forge green.\n\n1) HIGH: PvPadHook — add beforeAddLiquidity; revert unless sender is bound factory OR pool already registered/graduated. Flags 0x08cc. Still NO beforeInitialize. PoolManager-only ctor. Update HookMiner / tests for new flags. Prove TickLiquidityOverflow grief no longer blocks graduate().\n\n2) LOW: at GRADUATION_THRESHOLD reject sells OR auto-graduate on the filling buy. Prove dust sell cannot block graduate.\n\n3) LOW: createLaunch re-salts on UnexpectedPoolPrice (bounded) so poisoned pre-init cannot brick create; never seed at wrong price.\n\n4) Update Foundry tests/proofs; README note on hook flags. No Community Coins 80/10/10 redesign.\n\nDONE: PR (or commit) with failing→passing proofs for (1)(2), forge test green, short CHANGELOG of source fixes. Explicitly no on-chain redeploy in this continue.","parentJobId":"22a1e5c7-a34a-4949-be3d-8cb6417d261c","planHash":"fc0fd6a976f356f779ba1e3b2fbcc1456c97805003e65da641d6b7abbf18a11f","previousHash":"352199750fc2f510e51518977a66096cff096e879e2253b3871037aa311e9c1b","projectId":"22a1e5c7-a34a-4949-be3d-8cb6417d261c","publication":{"commit":"9007278e14dc99dc3882e5909e0f35ee5eb07309","deliveredAt":"2026-10-01T09:09:34.838Z","repoUrl":"https://github.com/identity-md-launches/launch-522-workflow-contract-stage-context"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"48d5b9ae874b8c0ffa7fd290d4a71e24d03048fbfda77ee55915d9ee2ea51d41","state":"completed","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"a81cf8f7732fd19b6ae97b830294d35b91f0788fc67f9e774d352e29942141e5","device":"3b260b68e9ad6a37","findings":[],"hash":"3b6f759285a96121c2b20a52b8a6c237df2098aa8a40422b7194b9912fe16620","nodeId":"3b0eee49-0a2a-44c6-bf2b-060bb035027b","outcome":"completed","summary":"The work is complete and verified. The only remaining 0x00cc mentions are the deliberate legacy references in tests and the protected manifest, which the README now flags as stale.\n\n## Summary\n\nAll four items of the continue job are implemented as source-only changes. Nothing was deployed, `launch.json` and all protected build files are untouched, and SPEC v4 economics are unchanged.\n\n**Verification results**\n\n| Check | Result |\n| --- | --- |\n| `forge build` | success |\n| `forge test` | 123 passed, 0 failed, 0 skipped |\n| `forge fmt --check` | clean |\n\n**1. HIGH, hook liquidity gate.** `PvPadHook` now enables `beforeAddLiquidity`, PoolManager-only, reverting `LiquidityClosed` unless the caller is the bound factory or the pool is already registered as graduated. Flags moved from 0x00cc to 0x08cc, exported as `REQUIRED_FLAGS` and mined by `HookMiner.findPvPadHook`. A legacy 0x00cc address now fails construction. Still no beforeInitialize, still PoolManager-only constructor. The inward-moving boundary scan stays as unreachable defense in depth.\n\n**2. LOW, threshold dust sell.** The sell gate at 4.2 ETH was already in the accepted source. I proved the failure mode with a scratch counterfactual curve (gate removed: a 99-wei sell un-filled the curve and the sweep reverted NotReady), then added a 256-run fuzz on the real factory fixture covering both sell overloads from one unit to the holder's full balance.\n\n**3. LOW, poisoned pre-init.** `createLaunch` and genesis construction scan up to 16 salts, skipping pools preinitialized at a foreign price and emitting `LaunchSaltRetried`. Attempt 0 keeps the original derivation. All 16 poisoned fails closed with no charge. The hard price check before initialize is retained, so no launch is ever seeded at the wrong price. `predictLaunchToken` exposes the selection to frontends.\n\n**Failing to passing proofs.** Before the fix, the recorded run showed the boundary deposit succeeding and the locked upper tick shifting to 887100. After the fix, the same scenario reverts and locks the full range. Details and test names are in CHANGELOG.md.\n\n**Files changed.** Four source files, seven test files (one new: `test/LaunchResalt.t.sol`), regenerated ABI exports for the hook and factory, README, `docs/ABI.md`, `test/README.md`, and a new CHANGELOG.md.\n\n**Open items for other roles**\n- The manifest notes still state the 0x00cc requirement. The manifest contributor must regenerate `launch.json` against this source before any deployment, since a salt mined for 0x00cc is now void.\n- I did not create a git commit, because the task rules forbid touching `.git/`. The working tree holds the full deliverable for the network's commit step.\n- Slither and Mythril were not run. Independent adversarial review before release is still required.","treeHash":"020b70ea6763169923695fb9a8a9c2c7b917fd47","usage":{"cachedInputTokens":3489609,"inputTokens":802,"model":"claude-fable-5-1","outputTokens":77463,"runtime":"claude","turns":94,"wallClockMs":1131189}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0256823ae36e7900","findings":[],"hash":"c27d9094afc43a3b0a7d16d79fbdb7f17aabde16492578df207f08746792b7fe","nodeId":"3b0eee49-0a2a-44c6-bf2b-060bb035027b","outcome":"failed","summary":"This content was flagged for possible cybersecurity risk. If this seems wrong, try rephrasing your request. If you’re doing authorized security work that requires more cyber permissive safeguards, apply for Daybreak access via https://platform.openai.com/settings/organization/status-and-access before retrying.","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":"gpt-6-astra","outputTokens":0,"runtime":"codex","turns":3,"wallClockMs":664049}}],"verification":[{"checks":[{"durationMs":7760,"exitCode":0,"name":"build","output":"Compiling 104 files with Solc 0.8.26\nSolc 0.8.26 finished in 7.56s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/CurveInvariant.t.sol:152:13:\n    |\n152 |             uint256 amount = balance == 0 ? 1 : bound(amountSeed, 1, balance);\n    |             ^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/CurveInvariant.t.sol:162:9:\n    |\n162 |         uint256 amount = bound(amountSeed, 1, balance);\n    |         ^^^^^^^^^^^^^^\n\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/CurveInvariant.t.sol:153:14:\n    |\n153 |             (uint256 quoted, uint256 quotedFee) = curve.quoteSell(amount);\n    |              ^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/CurveInvariant.t.sol:163:10:\n    |\n163 |         (uint256 quoted, uint256 quotedFee) = curve.quoteSell(amount);\n    |          ^^^^^^^^^^^^^^\n\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/CurveInvariant.t.sol:153:30:\n    |\n153 |             (uint256 quoted, uint256 quotedFee) = curve.quoteSell(amount);\n    |                              ^^^^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/CurveInvariant.t.sol:163:26:\n    |\n163 |         (uint256 quoted, uint256 quotedFee) = curve.quoteSell(amount);\n    |                          ^^^^^^^^^^^^^^^^^\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n   ╭▸ src/utils/HookMiner.sol:33:42\n   │\n33 │         bytes32 initCodeHash = keccak256(abi.encodePacked(creationCode, constructorArgs));\n   │                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/encode-packed-collision\n\nwarning[missing-events-access-control]: `expectedCallback` is changed without an event but is used for access control\n    ╭▸ src/PvPadFactory.sol:287:9\n    │\n287 │         expectedCallback = bytes32(0);\n    │         ━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PvPadFactory.sol:203:27\n    │\n203 │         if (attempt != 0) emit LaunchSaltRetried(launchId, attempt, token);\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/PvPadFactory.sol:193:9\n    │\n193 │         emit LaunchCreated(launchId, creator, token, curve, name, symbol);\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/PvPadFactory.sol:115:9\n    │\n115 │         emit LaunchMetadata(0, \"\");\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PvPadFactory.sol:111:33\n    │\n111 │           canonicalSqrtPriceX96 = uint160(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n112 │ ┃             Math.sqrt(FullMath.mulDiv(PvPadConstants.TOKEN_SUPPLY / 4, uint256(1) << 192, graduationThreshold))\n113 │ ┃         );\n    │ ┗━━━━━━━━━┛\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint160' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/hooks/PvPadHook.sol:145:9\n    │\n145 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/hooks/PvPadHook.sol:164:32\n    │\n164 │     ) external onlyPoolManager nonReentrant returns (bytes4, int128) {\n    │                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/hooks/PvPadHook.sol:170:69\n    │\n170 │             if (int256(delta.amount0()) != params.amountSpecified + int256(specifiedFee)) revert PartialFill();\n    │                                                                     ━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/hooks/PvPadHook.sol:193:13\n    │\n193 │         try escrow.recordTradeFeeNativeShares{value: amount, gas: 200_000}(creator, beneficiary, kingShare) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-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/hooks/PvPadHook.sol:194:13\n    │\n194 │             emit DeferredDelivered(address(escrow), creator, beneficiary, amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/BondingCurve.sol:216:13\n    │\n216 │             emit FeeDeferred(beneficiary, fee);\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/BondingCurve.sol:133:9\n    │\n133 │         emit Bought(recipient, grossInput, fee, tokensOut);\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/BondingCurve.sol:167:9\n    │\n167 │         emit Sold(msg.sender, amount, fee, ethOut);\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/BondingCurve.sol:179:13\n    │\n179 │             emit DeferredFeeFlushed(beneficiary, amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[missing-events-access-control]: `authorizedRecorders` is changed without an event but is used for access control\n   ╭▸ src/FeeEscrow.sol:46:9\n   │\n46 │         authorizedRecorders[recorder] = allowed;\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/BondingCurve.sol:237:22\n    │\n237 │         (bool ok,) = recipient.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/BondingCurve.sol:205:13\n    │\n205 │         if (block.timestamp > deadline) revert DeadlineExpired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/BondingCurve.sol:237:22\n    │\n237 │         (bool ok,) = recipient.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[missing-events-access-control]: `pendingUpdater` is changed without an event but is used for access control\n   ╭▸ src/WorkerSubsidy.sol:71:9\n   │\n71 │         pendingUpdater = newUpdater;\n   │         ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `updater` is changed without an event but is used for access control\n   ╭▸ src/WorkerSubsidy.sol:77:9\n   │\n77 │         updater = pendingUpdater;\n   │         ━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[missing-events-access-control]: `pendingUpdater` is changed without an event but is used for access control\n   ╭▸ src/WorkerSubsidy.sol:78:9\n   │\n78 │         pendingUpdater = address(0);\n   │         ━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/missing-events-access-control\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/hooks/PvPadHook.sol:215:13\n    │\n215 │         try binding.escrow.recordTradeFeeNativeFor{value: amount, gas: 200_000}(binding.creator, beneficiary, amount) {}\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-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/hooks/PvPadHook.sol:220:13\n    │\n220 │             emit FeeDeferred(address(binding.escrow), binding.creator, beneficiary, amount);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/hooks/PvPadHook.sol:231:16\n    │\n231 │         return uint256(amount < 0 ? -amount : amount);\n    │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/hooks/PvPadHook.sol:240:31\n    │\n240 │         if (magnitude + fee > uint256(uint128(type(int128).max))) revert AmountTooLarge();\n    │                               ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/hooks/PvPadHook.sol:240:39\n    │\n240 │         if (magnitude + fee > uint256(uint128(type(int128).max))) revert AmountTooLarge();\n    │                                       ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/hooks/PvPadHook.sol:248:21\n    │\n248 │         if (value > uint256(uint128(type(int128).max))) revert AmountTooLarge();\n    │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n   ╭▸ src/WorkerSubsidy.sol:87:98\n   │\n87 │     function setEpoch(bytes32 root, uint256 windowStart, uint256 windowEnd) external onlyUpdater nonReentrant {\n   │                                                                                                  ━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/WorkerSubsidy.sol:90:13\n   │\n90 │             windowStart < block.timestamp || windowEnd <= windowStart\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/hooks/PvPadHook.sol:248:29\n    │\n248 │         if (value > uint256(uint128(type(int128).max))) revert AmountTooLarge();\n    │                             ━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'uint128' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/hooks/PvPadHook.sol:249:16\n    │\n249 │         return int128(uint128(value));\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/hooks/PvPadHook.sol:249:23\n    │\n249 │         return int128(uint128(value));\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[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/WorkerSubsidy.sol:119:22\n    │\n119 │         (bool ok,) = payee.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `_status` is updated\n    ╭▸ src/WorkerSubsidy.sol:119:22\n    │\n119 │         (bool ok,) = payee.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkerSubsidy.sol:109:58\n    │\n109 │             e.root == bytes32(0) || recycled[epochId] || block.timestamp < e.windowStart\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/WorkerSubsidy.sol:110:20\n    │\n110 │                 || block.timestamp > e.windowEnd\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/PvPadFactory.sol:164:9\n    │\n164 │         emit LaunchMetadata(launchId, metadataURI);\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/WorkerSubsidy.sol:121:9\n    │\n121 │         emit WorkerClaimed(epochId, payee, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkerSubsidy.sol:127:58\n    │\n127 │         if (e.root == bytes32(0) || recycled[epochId] || block.timestamp <= e.windowEnd) {\n    │                                                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/PvPadFactory.sol:210:13\n    │\n210 │             poolManager.initialize(key, canonicalSqrtPriceX96);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n    ╭▸ src/PvPadFactory.sol:234:42\n    │\n234 │         bytes32 initCodeHash = keccak256(abi.encodePacked(type(PvPadToken).creationCode, abi.encode(name, symbol)));\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/KingOfThePad.sol:39:9\n   │\n39 │         emit KingClaimed(msg.sender, _beneficiary, msg.value, claimPrice);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PvPadFactory.sol:272:52\n    │\n272 │         (uint256 ethAmount, uint256 tokenAmount) = curve.sweepForGraduation();\n    │                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PvPadFactory.sol:276:9\n    │\n276 │         poolManager.unlock(data);\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/PvPadFactory.sol:279:9\n    │\n279 │         emit Graduated(launchId, poolId, price);\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/PvPadFactory.sol:276:9\n    │\n276 │         poolManager.unlock(data);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PvPadFactory.sol:307:9\n    │\n307 │         emit LiquidityRangeLocked(launchId, tickLower, tickUpper);\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/PvPadFactory.sol:308:9\n    │\n308 │         emit LiquidityLocked(launchId, liquidity, ethAmount - usedEth, tokenAmount - usedToken);\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/PvPadFactory.sol:301:33\n    │\n301 │         (BalanceDelta delta,) = poolManager.modifyLiquidity(key, params, \"\");\n    │                                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/PvPadFactory.sol:302:27\n    │\n302 │         uint256 usedEth = uint256(uint128(-delta.amount0()));\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/PvPadFactory.sol:302:35\n    │\n302 │         uint256 usedEth = uint256(uint128(-delta.amount0()));\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/PvPadFactory.sol:303:29\n    │\n303 │         uint256 usedToken = uint256(uint128(-delta.amount1()));\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/PvPadFactory.sol:303:37\n    │\n303 │         uint256 usedToken = uint256(uint128(-delta.amount1()));\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[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/PvPadFactory.sol:328:17\n    │\n328 │                 revert LiquidityRangeUnavailable();\n    │                 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/PvPadFactory.sol:333:41\n    │\n333 │             if (liquidity > maxPerTick) revert LiquidityRangeUnavailable();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/FeeEscrow.sol:106:22\n    │\n106 │         (bool ok,) = to.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/arbitrary-send-eth\n\nwarning[reentrancy-eth]: uncapped ETH transfer can be reentered before `pending` is updated\n    ╭▸ src/FeeEscrow.sol:106:22\n    │\n106 │         (bool ok,) = to.call{value: amount}(\"\");\n    │                      ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-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/FeeEscrow.sol:114:9\n    │\n114 │         emit FeeWithdrawn(msg.sender, currency, amount);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-events\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/FeesWorkers.t.sol:303:25\n    │\n303 │         uint256 start = block.timestamp + 100;\n    │                         ━━━━━━━━━━━━━━━\n    ‡\n311 │         vm.warp(end);\n    │         ──────────── `vm.warp` changes this environment here\n    │\n    ├ help: capture it with `vm.getBlockTimestamp()` instead\n    ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n   ╭▸ test/WorkerAdversarial.t.sol:79:25\n   │\n79 │         uint256 start = block.timestamp + 1;\n   │                         ━━━━━━━━━━━━━━━\n   ‡\n84 │         vm.warp(start);\n   │         ────────────── `vm.warp` changes this environment here\n   │\n   ├ help: capture it with `vm.getBlockTimestamp()` instead\n   ╰ help: https://getfoundry.sh/forge/linting/environment-read-across-mutation\n\n","passed":true},{"durationMs":9797,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 4 tests for test/TokenInvariant.t.sol:TokenBoundaryTest\n[PASS] test_failedTransferFromRestoresFiniteAllowance() (gas: 299718)\n[PASS] test_fullSupplyOneWeiAndZeroTransfersIncludingSelf() (gas: 467537)\n[PASS] test_maxApprovalSurvivesSpendAndCanBeRevoked() (gas: 373981)\n[PASS] test_zeroSpenderAndMaximumTransferRejected() (gas: 153316)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 980.79µs (1.37ms CPU time)\n\nRan 4 tests for test/CurveFactory.t.sol:FactoryConstructionTest\n[PASS] test_genesisIsAlreadyConfiguredAndMetadataImmutable() (gas: 2115132)\n[PASS] test_invalidFeesMetadataAndCallbackFailAtomically() (gas: 266416)\n[PASS] test_poisonedPredictedPoolIsSkippedAutomaticallyAndNeverSeeded() (gas: 4133473)\n[PASS] test_preinitializedCanonicalPriceCanLaunchSafely() (gas: 2068801)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 8.72ms (1.48ms CPU time)\n\nRan 6 tests for test/FactoryAdversarial.t.sol:FactoryAdversarialTest\n[PASS] testFuzz_inexactLaunchFeeNeverChangesState(uint256,bool) (runs: 256, μ: 69982, ~: 70275)\n[PASS] test_constructorRejectsMismatchedManagerAndWorkerPot() (gas: 4394709)\n[PASS] test_emptySymbolAndOverlongNameFailWithoutCharging() (gas: 99759)\n[PASS] test_failedWorkerFundingRollsBackEntireLaunchAndSameSaltCanRetry() (gas: 4204606)\n[PASS] test_maximumMetadataLengthsAndRepeatedSaltCreateIndependentLaunches() (gas: 4793211)\n[PASS] test_unknownAndUnfundedLaunchCannotGraduate() (gas: 125442)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 21.33ms (15.87ms CPU time)\n\nRan 10 tests for test/PvPadIntegration.t.sol:PvPadIntegrationTest\n[PASS] test_deploymentFloorRuntimeAndSupply() (gas: 17360424)\n[PASS] test_graduationFailureRollsBackReserveSweep() (gas: 868075)\n[PASS] test_graduationLocksFactoryPositionAndStopsCurve() (gas: 2366624)\n[PASS] test_partialFillETHSpecifiedRevertsWithoutLosingFunds() (gas: 978246)\n[PASS] test_pregraduationAndForeignPoolSwapsRejected() (gas: 229375)\n[PASS] test_realPoolAllFourSwapModesChargeETHAndConserveCredits() (gas: 1740297)\n[PASS] test_rejectingBeneficiaryDoesNotBlockCurveOrPool() (gas: 1285484)\n[PASS] test_secondLaunchCurveAndPostGraduationFeesShareKing() (gas: 3927645)\n[PASS] test_thresholdDustSellCannotInvalidatePermissionlessGraduation() (gas: 1010863)\n[PASS] test_unspecifiedETHPartialFillChargesOnlyExecution() (gas: 983757)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 45.63ms (45.01ms CPU time)\n\nRan 7 tests for test/LaunchResalt.t.sol:LaunchResaltTest\n[PASS] testFuzz_poisonDepthWithinBoundSelectsFirstCleanSalt(uint8,bytes32) (runs: 64, μ: 2514785, ~: 2369133)\n[PASS] test_canonicalPreinitializationKeepsAttemptZero() (gas: 2092225)\n[PASS] test_everyBoundedSaltPoisonedFailsClosedWithoutCharging() (gas: 3540426)\n[PASS] test_poisonedGenesisPoolResaltsInsideConstructor() (gas: 391129)\n[PASS] test_poisonedPredictedPoolSkipsToNextSaltAndNeverSeedsForeignPrice() (gas: 2211491)\n[PASS] test_predictionMatchesUnpoisonedCreateAndAdvancesWithLaunchCount() (gas: 2084963)\n[PASS] test_repeatedFrontRunningConsumesSuccessiveAttempts() (gas: 2280525)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 62.33ms (59.59ms CPU time)\n\nRan 20 tests for test/HookSecurity.t.sol:HookSecurityTest\n[PASS] testFuzz_exactEthOutputFeeIsOnePercentOfGrossEthOutput(uint128) (runs: 256, μ: 143292, ~: 147747)\n[PASS] testFuzz_exactTokenOutputFeeIsOnePercentOfGrossEthInput(uint128) (runs: 256, μ: 144069, ~: 148525)\n[PASS] testFuzz_feeConservationOnSpecifiedInput(uint128) (runs: 256, μ: 160595, ~: 165051)\n[PASS] test_afterSwapRejectsPartialSpecifiedFill() (gas: 65101)\n[PASS] test_beforeAddLiquidityAdmitsOnlyBoundFactoryUntilGraduation() (gas: 141346)\n[PASS] test_beforeAddLiquidityRejectsUnboundPoolsAndDirectCalls() (gas: 179628)\n[PASS] test_callbacksRequirePoolManager() (gas: 67421)\n[PASS] test_constructorRejectsWrongPermissionAddress() (gas: 14642)\n[PASS] test_deferredAggregationPreservesPerTradeRounding() (gas: 397326)\n[PASS] test_dustDoesNotCreateDeferredCredits() (gas: 93729)\n[PASS] test_extremeSpecifiedAmountRejectedCleanly() (gas: 63504)\n[PASS] test_feeDeliveryFailurePreservesFeeAndOriginalKing() (gas: 418925)\n[PASS] test_foreignEscrowRejected() (gas: 371106)\n[PASS] test_foreignRegistryCannotCaptureTokenPool() (gas: 44973)\n[PASS] test_hookUsesSwapAndAddLiquidityFlagsAndNoInitializationCallback() (gas: 46230)\n[PASS] test_legacySwapOnlyFlagAddressIsRejected() (gas: 83649606)\n[PASS] test_onlyCanonicalPoolCanBind() (gas: 41272)\n[PASS] test_poolCannotBeRebound() (gas: 50867)\n[PASS] test_preGraduationSwapRejected() (gas: 57113)\n[PASS] test_retryFailureKeepsDeferredCredit() (gas: 255429)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 68.65ms (142.66ms CPU time)\n\nRan 7 tests for test/CurveFactory.t.sol:CurveFactoryTest\n[PASS] testFuzz_capRefundsExcessAndEndsAtGraduationPrice(uint256) (runs: 256, μ: 446034, ~: 449491)\n[PASS] testFuzz_roundTripConservesAssetsAndChargesBothFees(uint256) (runs: 256, μ: 479667, ~: 479867)\n[PASS] test_failedFeeDeliveryPreservesOriginalKingAndPerTradeRounding() (gas: 600648)\n[PASS] test_failedRecipientRollsBackSaleAndReentrantRecipientCannotTrade() (gas: 860624)\n[PASS] test_failedRetryRetainsFeeAndGraduationCannotSweepIt() (gas: 495583)\n[PASS] test_graduationAuthorizationAndDonationsExcluded() (gas: 570740)\n[PASS] test_slippageDeadlineAndZeroRecipientRevertWithoutStateChange() (gas: 499182)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 81.69ms (62.47ms CPU time)\n\nRan 11 tests for test/WorkerAdversarial.t.sol:WorkerAdversarialTest\n[PASS] testCoincidentCreatorAndKingReceivesFullOddFeeOnce() (gas: 238381)\n[PASS] testFuzzAggregatedFeesMatchIndividualOddRounding(uint96,uint96) (runs: 512, μ: 260641, ~: 261010)\n[PASS] testFuzzEpochBudgetRemainsIsolatedWhenRootOverallocates(uint96,uint96) (runs: 512, μ: 715880, ~: 715871)\n[PASS] testFuzzInvalidExplicitSnapshotFeePreservesState(uint96) (runs: 512, μ: 93741, ~: 93916)\n[PASS] testFuzzKingOverbidDoesNotSetNextPriceOrRefundPreviousKing(uint96) (runs: 512, μ: 279867, ~: 280192)\n[PASS] testFuzzProofCannotBeReplayedIntoAnotherFundedEpoch(uint96) (runs: 512, μ: 593061, ~: 593045)\n[PASS] testMaxWindowStartAndEndAreInclusiveAndFullEpochRecyclesZero() (gas: 611087)\n[PASS] testOneWeiReceiveDonationAndZeroReceiveRollback() (gas: 93343)\n[PASS] testRejectingCallbackRollsBackNewCreditsAndPreservesOldWithdrawal() (gas: 760158)\n[PASS] testSupersededUpdaterCannotAcceptOrPublish() (gas: 269833)\n[PASS] testWithdrawalKeepsNewCreditRecordedDuringCallback() (gas: 761502)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 99.90ms (316.19ms CPU time)\n\nRan 16 tests for test/FeesWorkers.t.sol:FeesWorkersTest\n[PASS] testAggregatedDeferredSharesPreserveEveryOddWei() (gas: 370972)\n[PASS] testConstructorsRejectMissingDependencies() (gas: 3863)\n[PASS] testEscrowRejectingRecipientDoesNotLoseCredits() (gas: 858812)\n[PASS] testEscrowWithdrawalCannotReenterOrStealAnotherCredit() (gas: 798431)\n[PASS] testFeeRecorderAccessAndDepositValidation() (gas: 285733)\n[PASS] testFuzzFeeConservationAcrossCrowns(uint96,uint96,uint96) (runs: 256, μ: 753150, ~: 756813)\n[PASS] testKingStrictBidAndFullWorkerFunding() (gas: 390497)\n[PASS] testPreKingFeesAndDelayedDeliveryAlwaysBelongToFirstKing() (gas: 821243)\n[PASS] testWithdrawRejectsInvalidRecipientAndCurrency() (gas: 226909)\n[PASS] testWorkerCannotReenterClaim() (gas: 795213)\n[PASS] testWorkerClaimWindowBoundariesAndExpiryRecycling() (gas: 923539)\n[PASS] testWorkerEpochValidationDoesNotConsumePot() (gas: 460168)\n[PASS] testWorkerFailedPaymentRestoresClaimAndReserve() (gas: 927405)\n[PASS] testWorkerProofsRelayedClaimsDuplicatesAndBudgetIsolation() (gas: 881703)\n[PASS] testWorkerRejectsUnknownEpochZeroPayeeAndZeroAmount() (gas: 341214)\n[PASS] testWorkerUpdaterRotationIsExplicitTwoStep() (gas: 251049)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 99.81ms (103.09ms CPU time)\n\nRan 4 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 256, μ: 79333, ~: 79244)\n[PASS] test_allowanceAndFailureAtomicity() (gas: 231688)\n[PASS] test_noAdministrativeMintOrUpgradeSelectors() (gas: 132039)\n[PASS] test_supplyAndExactTransfer() (gas: 120830)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 189.27ms (189.69ms CPU time)\n\nRan 19 tests for test/GraduationLiquidity.t.sol:GraduationLiquidityTest\n[PASS] testFuzz_thresholdSellsOfAnySizeRevertAndGraduationProceeds(uint256,bool) (runs: 256, μ: 1005131, ~: 1004969)\n[PASS] test_defenseInDepthScanStillMovesSaturatedBoundaryInward() (gas: 740437)\n[PASS] test_deploymentFloorRuntimeAndSupply() (gas: 17361189)\n[PASS] test_graduationFailureRollsBackReserveSweep() (gas: 868061)\n[PASS] test_graduationLocksFactoryPositionAndStopsCurve() (gas: 2366747)\n[PASS] test_griefRejectedEvenWhenCurveIsAlreadyFullButNotYetGraduated() (gas: 2095569)\n[PASS] test_liquidityOpensAfterGraduationAndOwnPositionsStayRemovable() (gas: 3212323)\n[PASS] test_partialFillETHSpecifiedRevertsWithoutLosingFunds() (gas: 978352)\n[PASS] test_pregraduationAndForeignPoolSwapsRejected() (gas: 229395)\n[PASS] test_realPoolAllFourSwapModesChargeETHAndConserveCredits() (gas: 1740353)\n[PASS] test_rejectingBeneficiaryDoesNotBlockCurveOrPool() (gas: 1285482)\n[PASS] test_repeatedGriefAttemptsAcrossManyTicksStillLeaveFullRange() (gas: 3313003)\n[PASS] test_secondLaunchCurveAndPostGraduationFeesShareKing() (gas: 3927742)\n[PASS] test_thresholdDustSellCannotInvalidatePermissionlessGraduation() (gas: 1011152)\n[PASS] test_tickOverflowGriefOnLowerBoundaryIsRejectedBeforeGraduation() (gas: 2552471)\n[PASS] test_tickOverflowGriefOnUpperBoundaryIsRejectedBeforeGraduation() (gas: 2635010)\n[PASS] test_unavailableRangeRollsBackAndCanBeRetried() (gas: 126170257)\n[PASS] test_unboundPoolNamingThisHookNeverOpensLiquidity() (gas: 2360524)\n[PASS] test_unspecifiedETHPartialFillChargesOnlyExecution() (gas: 983800)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 189.32ms (279.70ms CPU time)\n\nRan 2 tests for test/AccountingInvariant.t.sol:FeeKingAccountingInvariantTest\n[PASS] invariant_feeEntitlementsAndKingBidsMatchIndependentLedger() (runs: 128, calls: 8192, reverts: 0)\n\n╭--------------------------+--------------------+-------+---------+----------╮\n| Contract                 | Selector           | Calls | Reverts | Discards |\n+============================================================================+\n| FeeKingAccountingHandler | assignUnassigned   | 1170  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | claimKing          | 1092  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | invalidKingBid     | 1166  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | recordFee          | 1239  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | toggleRecorder     | 1166  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | unauthorizedRecord | 1166  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | withdraw           | 1193  | 0       | 0        |\n╰--------------------------+--------------------+-------+---------+----------╯\n\n[PASS] testHandlerExercisesPreCrownAndCapturedCreditsAcrossCrowns() (gas: 1292706)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 680.33ms (680.85ms CPU time)\n\nRan 2 tests for test/AccountingInvariant.t.sol:WorkerAccountingInvariantTest\n[PASS] invariant_workerFundsAndEveryEpochMatchIndependentLedger() (runs: 128, calls: 8192, reverts: 0)\n\n╭-------------------------+----------------+-------+---------+----------╮\n| Contract                | Selector       | Calls | Reverts | Discards |\n+=======================================================================+\n| WorkerAccountingHandler | acceptUpdater  | 1015  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | advanceTime    | 999   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | claim          | 1028  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | donate         | 1048  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | invalidClaim   | 1035  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | openEpoch      | 1066  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | proposeUpdater | 1020  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | recycle        | 981   | 0       | 0        |\n╰-------------------------+----------------+-------+---------+----------╯\n\n[PASS] testHandlerExercisesClaimsOverlappingEpochsAndRecycledFunds() (gas: 2491868)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.10s (2.10s CPU time)\n\nRan 4 tests for test/HookInvariant.t.sol:HookInvariantTest\n[PASS]\nHookInvariantTest invariants:\n[PASS] invariant_graduationRemainsFinalAndPositionsRemainLocked\n[PASS] invariant_realPoolFeeCustodyAndBeneficiaryAccounting\n HookInvariantTest invariants (runs: 128, calls: 6144, reverts: 0)\n\n╭----------------------+----------------------+-------+---------+----------╮\n| Contract             | Selector             | Calls | Reverts | Discards |\n+==========================================================================+\n| HookInvariantHandler | attackLockedPosition | 877   | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| HookInvariantHandler | claimKing            | 879   | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| HookInvariantHandler | retry                | 864   | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| HookInvariantHandler | setDeliveryFailure   | 892   | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| HookInvariantHandler | swap                 | 1734  | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| HookInvariantHandler | withdraw             | 898   | 0       | 0        |\n╰----------------------+----------------------+-------+---------+----------╯\n\n[PASS] test_allFourModesPreserveAccountingWhenFeeDeliveryFails() (gas: 2151622)\n[PASS] test_fullRangeGraduationWithForeignPositionsRemainsLockedAcrossAllSwapModes() (gas: 2790755)\n[PASS] test_realPoolDeferredOddWeiKeepCreatorAndOriginalKingAcrossRetries() (gas: 1473838)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.57s (2.56s CPU time)\n\nRan 6 tests for test/CurveInvariant.t.sol:CurveInvariantTest\n[PASS]\nCurveInvariantTest invariants:\n[PASS] invariant_curveReservesEqualIndependentCashFlows\n[PASS] invariant_everyFeeIsBackedAndBelongsToItsCapturedBeneficiary\n[PASS] invariant_graduationIsTerminalAndOnlySweepsTradingReserves\n[PASS] invariant_supplyAndNativeAssetsAreConserved\n CurveInvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------------+------------------+-------+---------+----------╮\n| Contract             | Selector         | Calls | Reverts | Discards |\n+======================================================================+\n| CurveSequenceHandler | assignUnassigned | 920   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | buy              | 903   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | claimCrown       | 859   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | donate           | 895   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | flush            | 969   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | graduate         | 901   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | sell             | 913   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | setDelivery      | 938   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | withdraw         | 894   | 0       | 0        |\n╰----------------------+------------------+-------+---------+----------╯\n\n[PASS] testFuzz_fundedCurveRejectsBothSellOverloadsAtomically(uint256,bool) (runs: 256, μ: 1730299, ~: 1730111)\n[PASS] test_feeRoundingAtOneWeiAndHundredWeiBoundaries() (gas: 2568364)\n[PASS] test_handlerExercisesDeferredRoundingCrownChangesAndGraduation() (gas: 4004145)\n[PASS] test_handlerExercisesFundedTradingLockBeforeSweep() (gas: 3150847)\n[PASS] test_rejectedCapRefundRollsBackTokensReservesAndDeferredFees() (gas: 717304)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.63s (2.72s CPU time)\n\nRan 1 test for test/TokenInvariant.t.sol:TokenLedgerInvariantTest\n[PASS]\nTokenLedgerInvariantTest invariants:\n[PASS] invariant_allAllowancesMatchApprovalsAndSpending\n[PASS] invariant_fixedSupplyAndEveryHolderMatchesLedger\n TokenLedgerInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭--------------------+---------------------+-------+---------+----------╮\n| Contract           | Selector            | Calls | Reverts | Discards |\n+=======================================================================+\n| TokenLedgerHandler | approve             | 2723  | 0       | 0        |\n|--------------------+---------------------+-------+---------+----------|\n| TokenLedgerHandler | exceedAllowance     | 2795  | 0       | 0        |\n|--------------------+---------------------+-------+---------+----------|\n| TokenLedgerHandler | overspend           | 2663  | 0       | 0        |\n|--------------------+---------------------+-------+---------+----------|\n| TokenLedgerHandler | rejectZeroRecipient | 2794  | 0       | 0        |\n|--------------------+---------------------+-------+---------+----------|\n| TokenLedgerHandler | transfer            | 2664  | 0       | 0        |\n|--------------------+---------------------+-------+---------+----------|\n| TokenLedgerHandler | transferFrom        | 2745  | 0       | 0        |\n╰--------------------+---------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 9.67s (9.67s CPU time)\n\nRan 16 test suites in 9.67s (18.52s CPU time): 123 tests passed, 0 failed, 0 skipped (123 total tests)\n","passed":true},{"durationMs":118,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BondingCurve.buy(address)\",\"BondingCurve.buy(address,uint256,uint256)\",\"BondingCurve.flushDeferredFees(address)\",\"BondingCurve.receive()\",\"BondingCurve.sell(uint256,address)\",\"BondingCurve.sell(uint256,address,uint256,uint256)\",\"BondingCurve.sweepForGraduation()\",\"FeeEscrow.assignUnassigned()\",\"FeeEscrow.authorizeRecorder(address,bool)\",\"FeeEscrow.recordTradeFee(address,address,uint256)\",\"FeeEscrow.recordTradeFeeNative(address,uint256)\",\"FeeEscrow.recordTradeFeeNativeFor(address,address,uint256)\",\"FeeEscrow.recordTradeFeeNativeShares(address,address,uint256)\",\"FeeEscrow.withdraw(address,address)\",\"KingOfThePad.claimKing(address)\",\"LaunchToken.approve(address,uint256)\",\"LaunchToken.transfer(address,uint256)\",\"LaunchToken.transferFrom(address,address,uint256)\",\"PvPadFactory.createLaunch(string,string)\",\"PvPadFactory.createLaunch(string,string,bytes32)\",\"PvPadFactory.createLaunch(string,string,bytes32,string)\",\"PvPadFactory.graduate(uint256)\",\"PvPadFactory.receive()\",\"PvPadFactory.unlockCallback(bytes)\",\"PvPadHook.afterSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),int256,bytes)\",\"PvPadHook.beforeSwap(address,(address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PvPadHook.bindPool((address,address,uint24,int24,address),address,address)\",\"PvPadHook.receive()\",\"PvPadHook.retryDeferred(address,address,address)\",\"PvPadToken.approve(address,uint256)\",\"PvPadToken.transfer(address,uint256)\",\"PvPadToken.transferFrom(address,address,uint256)\",\"WorkerSubsidy.acceptUpdater()\",\"WorkerSubsidy.claimWorker(uint256,address,uint256,bytes32[])\",\"WorkerSubsidy.fundWorkers()\",\"WorkerSubsidy.proposeUpdater(address)\",\"WorkerSubsidy.receive()\",\"WorkerSubsidy.recycleExpiredEpoch(uint256)\",\"WorkerSubsidy.setEpoch(bytes32,uint256,uint256)\"],\"files\":{\".gitignore\":24,\"CHANGELOG.md\":68,\"DEPENDENCIES.json\":22,\"LICENSE\":21,\"README.md\":115,\"SPEC.md\":168,\"docs/ABI.md\":42,\"docs/abi/BondingCurve.json\":633,\"docs/abi/FeeEscrow.json\":380,\"docs/abi/KingOfThePad.json\":150,\"docs/abi/LaunchToken.json\":315,\"docs/abi/PvPadFactory.json\":853,\"docs/abi/PvPadHook.json\":1253,\"docs/abi/PvPadToken.json\":339,\"docs/abi/WorkerSubsidy.json\":476,\"foundry.toml\":21,\"launch.json\":40,\"src/BondingCurve.sol\":242,\"src/FeeEscrow.sol\":132,\"src/KingOfThePad.sol\":41,\"src/LaunchToken.sol\":11,\"src/PvPadFactory.sol\":345,\"src/PvPadToken.sol\":15,\"src/WorkerSubsidy.sol\":136,\"src/hooks/PvPadHook.sol\":302,\"src/libraries/PvPadConstants.sol\":34,\"src/utils/HookMiner.sol\":55,\"test/AccountingInvariant.t.sol\":426,\"test/CurveFactory.t.sol\":340,\"test/CurveInvariant.t.sol\":548,\"test/FactoryAdversarial.t.sol\":174,\"test/FeesWorkers.t.sol\":415,\"test/GraduationLiquidity.t.sol\":290,\"test/HookInvariant.t.sol\":445,\"test/HookSecurity.t.sol\":307,\"test/LaunchResalt.t.sol\":205,\"test/LaunchToken.t.sol\":66,\"test/PvPadIntegration.t.sol\":344,\"test/README.md\":32,\"test/TokenInvariant.t.sol\":239,\"test/WorkerAdversarial.t.sol\":249,\"tools/export_abis.py\":17},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":4747,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/hooks/PvPadHook.sol:182: PvPadHook.retryDeferred(FeeEscrow,address,address) (src/hooks/PvPadHook.sol#182-201) sends eth to arbitrary user\n[high/medium] arbitrary-send-eth at src/WorkerSubsidy.sol:103: WorkerSubsidy.claimWorker(uint256,address,uint256,bytes32[]) (src/WorkerSubsidy.sol#103-122) sends eth to arbitrary user\n[high/medium] reentrancy-eth at src/hooks/PvPadHook.sol:182: Reentrancy in PvPadHook.retryDeferred(FeeEscrow,address,address) (src/hooks/PvPadHook.sol#182-201):\n[high/medium] reentrancy-eth at src/FeeEscrow.sol:99: Reentrancy in FeeEscrow.withdraw(address,address) (src/FeeEscrow.sol#99-115):\n[high/medium] reentrancy-eth at src/BondingCurve.sol:171: Reentrancy in BondingCurve.flushDeferredFees(address) (src/BondingCurve.sol#171-187):\n[medium/medium] reentrancy-no-eth at src/PvPadFactory.sol:263: Reentrancy in PvPadFactory.graduate(uint256) (src/PvPadFactory.sol#263-280):\n[medium/medium] unused-return at src/PvPadFactory.sol:263: PvPadFactory.graduate(uint256) (src/PvPadFactory.sol#263-280) ignores return value by poolManager.unlock(data) (src/PvPadFactory.sol#276)\n[medium/medium] unused-return at src/PvPadFactory.sol:282: PvPadFactory.unlockCallback(bytes) (src/PvPadFactory.sol#282-310) ignores return value by (delta,None) = poolManager.modifyLiquidity(key,params,) (src/PvPadFactory.sol#301)\n[medium/medium] unused-return at src/PvPadFactory.sol:315: PvPadFactory._availableRange(PoolId,uint256,uint256) (src/PvPadFactory.sol#315-342) ignores return value by (lowerGross,None) = StateLibrary.getTickLiquidity(poolManager,poolId,tickLower) (src/PvPadFactory.sol#334)\n[medium/medium] unused-return at src/PvPadFactory.sol:207: PvPadFactory._initializeCanonicalPool(PoolKey,PoolId) (src/PvPadFactory.sol#207-214) ignores return value by (existingPrice,None,None,None) = StateLibrary.getSlot0(poolManager,poolId) (src/PvPadFactory.sol#208)\n[medium/medium] unused-return at src/PvPadFactory.sol:207: PvPadFactory._initializeCanonicalPool(PoolKey,PoolId) (src/PvPadFactory.sol#207-214) ignores return value by poolManager.initialize(key,canonicalSqrtPriceX96) (src/PvPadFactory.sol#210)\n[medium/medium] unused-return at src/PvPadFactory.sol:263: PvPadFactory.graduate(uint256) (src/PvPadFactory.sol#263-280) ignores return value by (price,None,None,None) = StateLibrary.getSlot0(poolManager,poolId) (src/PvPadFactory.sol#270)\n[medium/medium] unused-return at src/PvPadFactory.sol:229: PvPadFactory._selectSalt(uint256,address,string,string,bytes32) (src/PvPadFactory.sol#229-246) ignores return value by (existingPrice,None,None,None) = StateLibrary.getSlot0(poolManager,_poolKey(token).toId()) (src/PvPadFactory.sol#242)\n[medium/medium] unused-return at src/PvPadFactory.sol:315: PvPadFactory._availableRange(PoolId,uint256,uint256) (src/PvPadFactory.sol#315-342) ignores return value by (upperGross,None) = StateLibrary.getTickLiquidity(poolManager,poolId,tickUpper) (src/PvPadFactory.sol#335)\n[low/medium] reentrancy-benign at src/BondingCurve.sol:208: Reentrancy in BondingCurve._deliverFee(uint256) (src/BondingCurve.sol#208-218):\n[low/medium] reentrancy-benign at src/hooks/PvPadHook.sol:211: Reentrancy in PvPadHook._collect(PvPadHook.PoolBinding,uint256) (src/hooks/PvPadHook.sol#211-222):\n[low/medium] reentrancy-benign at src/FeeEscrow.sol:99: Reentrancy in FeeEscrow.withdraw(address,address) (src/FeeEscrow.sol#99-115):\n[low/medium] reentrancy-benign at src/PvPadFactory.sol:263: Reentrancy in PvPadFactory.graduate(uint256) (src/PvPadFactory.sol#263-280):\n[low/medium] reentrancy-benign at src/PvPadFactory.sol:263: Reentrancy in PvPadFactory.graduate(uint256) (src/PvPadFactory.sol#263-280):\n[low/medium] reentrancy-events at src/PvPadFactory.sol:168: Reentrancy in PvPadFactory._createLaunch(address,string,string,bytes32) (src/PvPadFactory.sol#168-194):\n[low/medium] reentrancy-events at src/PvPadFactory.sol:282: Reentrancy in PvPadFactory.unlockCallback(bytes) (src/PvPadFactory.sol#282-310):\n[low/medium] timestamp at src/WorkerSubsidy.sol:87: WorkerSubsidy.setEpoch(bytes32,uint256,uint256) (src/WorkerSubsidy.sol#87-100) uses timestamp for comparisons\n[low/medium] timestamp at src/BondingCurve.sol:202: BondingCurve._checkTrade(address,uint256) (src/BondingCurve.sol#202-206) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkerSubsidy.sol:103: WorkerSubsidy.claimWorker(uint256,address,uint256,bytes32[]) (src/WorkerSubsidy.sol#103-122) uses timestamp for comparisons\n[low/medium] timestamp at src/WorkerSubsidy.sol:125: WorkerSubsidy.recycleExpiredEpoch(uint256) (src/WorkerSubsidy.sol#125-135) uses timestamp for comparisons","passed":true},{"durationMs":822,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/PvPadFactory.sol:234: `abi.encodePacked()` Hash Collision (2 places)\n[high] contract-locks-ether at src/KingOfThePad.sol:9: Contract locks Ether without a withdraw function (2 places)\n[high] reentrancy-state-change at src/FeeEscrow.sol:106: Reentrancy: State change after external call (8 places)\n[low] internal-function-used-once at src/utils/HookMiner.sol:27: Internal Function Used Only Once\n[low] large-numeric-literal at src/LaunchToken.sol:9: Large Numeric Literal (4 places)\n[low] literal-instead-of-constant at src/hooks/PvPadHook.sol:176: Literal Instead of Constant (2 places)\n[low] non-reentrant-not-first at src/WorkerSubsidy.sol:87: `nonReentrant` is Not the First Modifier (3 places)\n[low] push-zero-opcode at src/BondingCurve.sol:2: PUSH0 Opcode (9 places)\n[low] require-revert-in-loop at src/PvPadFactory.sol:324: Loop Contains `require`/`revert`\n[low] state-change-without-event at src/BondingCurve.sol:189: State Change Without Event\n[low] unchecked-return at src/PvPadFactory.sol:114: Unchecked Return (3 places)\n[low] uninitialized-local-variable at src/utils/HookMiner.sol:35: Uninitialized Local Variable\n[low] unspecific-solidity-pragma at src/BondingCurve.sol:2: Unspecific Solidity Pragma (7 places)\n[low] unused-public-function at src/BondingCurve.sol:87: Public Function Not Used Internally (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3b6f759285a96121c2b20a52b8a6c237df2098aa8a40422b7194b9912fe16620","verifiedTreeHash":"020b70ea6763169923695fb9a8a9c2c7b917fd47","verifierVersion":"0.1.0+da6bdbe5"}]}