{"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":"f472bf73-4394-423d-930b-79aedef155d3","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"bab25f6a324847ea3cc154dd38513c69a388cea917c9d70def3c31ba91e47aab","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":"SOURCE-ONLY CONTINUE — no redeploy, no site, no new economics.\n\nParent job: b8f68a19-42b0-428e-80af-0582d26a2805 (Blocked: protected_invariants / project constructor failed).\nTip / tree: identity-md-launches/launch-522-workflow-contract-stage-context (post build+manifest+audits on this job). Keep SPEC.md v4. Do NOT use Community Coins 80/10/10 · 20 ETH template.\n\nGOAL (code only): unblock deployability of genesis against the judge MEDIUM #3 — pre-poison of the 16 predictable genesis Uni v4 candidate pools must NOT make PvPadFactory constructor revert forever.\n\nREQUIRED FIX:\n- Anyone can PoolManager.initialize the 16 predicted genesis (ETH, token_n, fee 0, spacing 60, shared PvPadHook) keys at a foreign price before factory CREATE2 exists; _selectSalt then UnexpectedPoolPrice and every same-address retry fails.\n- Prefer a fix that keeps constructor signature / launch.json schema if possible: e.g. allow the factory (registry) to move a zero-liquidity pre-init pool to the canonical sqrt price so genesis can still land, OR mix non-precomputable entropy into genesis salt derivation so candidates cannot be enumerated before the deploy tx, OR another SPEC-compatible approach that never accepts a foreign price for the graduated/genesis pool.\n- Keep MAX_SALT_ATTEMPTS / createLaunch re-salt behavior for later launches.\n- Attach / update Foundry proof: GenesisPoison-style test must PASS after the fix (poison all 16 → factory still deploys at predicted address with canonical price). Do not drop existing grief proofs (beforeAddLiquidity LiquidityClosed, threshold sell block, hook flags 0x08cc).\n\nDO NOT CHANGE:\n- Hook flags 0x08cc; beforeAddLiquidity gate; NO beforeInitialize; PoolManager-only hook ctor.\n- Fee 1% / King-Worker / multi-token factory / graduate @ 4.2 ETH / locked full-range LP.\n- Do not “fix” mined-salt or Sepolia-fork floor issues in Solidity by relaxing HookAddressNotValid or skipping PoolManager init — those are service/admission notes for the NEXT fresh workflow.open.\n\nDONE when:\n1. forge test green (include poison proof + prior suite).\n2. PR merged describing the genesis-poison fix.\n3. Short note in README/CHANGELOG: remaining admission needs mined 0x08cc salt + Sepolia-fork floor with live PoolManager — out of scope for this continue.","parentJobId":"b72dfb6a-d2bb-498f-a827-9c16bf14f142","planHash":"c934022e7a226433b82509987f49008071aab554bfc49fcbc3058325a472ca27","previousHash":"91e053753d927a514c96f24eb37563a5cd9533cba4603c5e8f94172b05f25a2e","projectId":"b72dfb6a-d2bb-498f-a827-9c16bf14f142","publication":{"commit":"13cd1131e20024899e0f0943722cab01ad87ff38","deliveredAt":"2026-10-01T12:06:13.236Z","repoUrl":"https://github.com/identity-md-launches/launch-565-workflow-contract-stage-context"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"e1b3df731ba5e70c475183f6a83976cabf829e976d5cdc41dd3bb546f6bc8f15","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"ebd7f2fe4f1fcda73850d8d9cdf2a399b58f1bdb34c84b1a40f1de7fea26609d","device":"468e82a89b9bfe18","findings":[],"hash":"bab25f6a324847ea3cc154dd38513c69a388cea917c9d70def3c31ba91e47aab","nodeId":"b6c9faa9-1dda-4d3d-a875-7675068188f4","outcome":"completed","summary":"The work is complete and verified.\n\n**Outcome.** The tree this job continues already carries the genesis-poison fix from the reviewed revision: `PvPadHook.realignPool` moves a bound, liquidity-free pool to the canonical price with a zero-value swap, and the factory uses it when all 16 bounded salt candidates are poisoned, then re-reads the price as a hard stop. I re-verified that fix against the judge's exact scenario and found no source change needed. The constructor signature, `MAX_SALT_ATTEMPTS`, the `createLaunch` re-salt order, hook flags 0x08cc, the liquidity gate, the absent `beforeInitialize` and the manifest schema are all untouched.\n\n**What I added.**\n- `test/GenesisPoison.t.sol`, a 7-test suite modelled on the finding. A service-style CREATE2 deployer announces the factory address, an attacker initializes all 16 genesis candidate pools at a foreign price before the deploy, and the factory still lands at the predicted address with genesis on candidate 0 at the canonical price, zero liquidity, both realign events emitted, no ETH or tokens moved, siblings left at the attacker's price, then graduates full range and charges the 1% fee. A 64-run fuzz covers foreign prices on both sides of canonical out to the v4 extremes.\n- Failure paths in the same file: canonical preinitialization is accepted with no realignment, partial poison re-salts inside the constructor, strangers cannot realign or re-initialize, the realigned pool stays closed to swaps and liquidity through a direct PoolManager probe, the factory cannot realign an unbound sibling, a realignment that leaves a foreign price aborts the deploy with the CREATE2 address still free and the same salt retries, and later launches keep the bounded re-salt.\n- CHANGELOG entry describing the fix, the proof and the remaining admission items. README now points to the proof and states that the mined 0x08cc hook salt and the Sepolia-fork floor with a live PoolManager are out of scope here and belong to the next fresh `workflow.open`. The test index gained a row.\n\n**Verification.** All checks pass on the pinned compiler.\n\n| Check | Result |\n| --- | --- |\n| `forge build` | ok |\n| `forge test` | 167 passed, 0 failed, 21 suites |\n| `forge fmt --check` | clean |\n| `tools/export_abis.py --check` | all 8 ABIs match |\n\n**Not done here.** I did not commit or open the pull request. The network's worker submits the tree and raises the PR, and the CHANGELOG entry is written to serve as its description. `launch.json` and the ABI exports are unchanged because no interface changed.","treeHash":"b3fd99f39fa1bdf73ea12e1390ac062c208faa54","usage":{"cachedInputTokens":1607353,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":32615,"runtime":"claude","turns":29,"wallClockMs":506703}}],"verification":[{"checks":[{"durationMs":13778,"exitCode":0,"name":"build","output":"Compiling 111 files with Solc 0.8.26\nSolc 0.8.26 finished in 13.49s\nCompiler run successful with warnings:\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/CurveInvariant.t.sol:151:13:\n    |\n151 |             uint256 amount = balance == 0 ? 1 : bound(amountSeed, 1, balance);\n    |             ^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/CurveInvariant.t.sol:161:9:\n    |\n161 |         uint256 amount = bound(amountSeed, 1, balance);\n    |         ^^^^^^^^^^^^^^\n\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/CurveInvariant.t.sol:152:14:\n    |\n152 |             (uint256 quoted, uint256 quotedFee) = curve.quoteSell(amount);\n    |              ^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/CurveInvariant.t.sol:162:10:\n    |\n162 |         (uint256 quoted, uint256 quotedFee) = curve.quoteSell(amount);\n    |          ^^^^^^^^^^^^^^\n\nWarning (2519): This declaration shadows an existing declaration.\n   --> test/CurveInvariant.t.sol:152:30:\n    |\n152 |             (uint256 quoted, uint256 quotedFee) = curve.quoteSell(amount);\n    |                              ^^^^^^^^^^^^^^^^^\nNote: The shadowed declaration is here:\n   --> test/CurveInvariant.t.sol:162:26:\n    |\n162 |         (uint256 quoted, uint256 quotedFee) = curve.quoteSell(amount);\n    |                          ^^^^^^^^^^^^^^^^^\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[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]: `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[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n   ╭▸ src/WorkerSubsidy.sol:89:98\n   │\n89 │     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:92:13\n   │\n92 │             windowStart < block.timestamp || windowStart - block.timestamp > PvPadConstants.MAX_EPOCH_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/WorkerSubsidy.sol:92:46\n   │\n92 │             windowStart < block.timestamp || windowStart - block.timestamp > PvPadConstants.MAX_EPOCH_WINDOW\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/WorkerSubsidy.sol:121:22\n    │\n121 │         (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:121:22\n    │\n121 │         (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:111:58\n    │\n111 │             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:112:20\n    │\n112 │                 || 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/WorkerSubsidy.sol:123:9\n    │\n123 │         emit WorkerClaimed(epochId, payee, amount);\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/hooks/PvPadHook.sol:144:9\n    │\n144 │         poolManager.unlock(data);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/WorkerSubsidy.sol:129:58\n    │\n129 │         if (e.root == bytes32(0) || recycled[epochId] || 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/hooks/PvPadHook.sol:148:9\n    │\n148 │         emit PoolRealigned(id, current, targetSqrtPriceX96);\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/hooks/PvPadHook.sol:144:9\n    │\n144 │         poolManager.unlock(data);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/hooks/PvPadHook.sol:189:9\n    │\n189 │         nonReentrant\n    │         ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\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[non-reentrant-not-first]: `nonReentrant` is not the first modifier\n    ╭▸ src/hooks/PvPadHook.sol:208:32\n    │\n208 │     ) external onlyPoolManager nonReentrant returns (bytes4, int128) {\n    │                                ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/non-reentrant-not-first\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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/hooks/PvPadHook.sol:214:69\n    │\n214 │             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:237:13\n    │\n237 │         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/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/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-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/hooks/PvPadHook.sol:238:13\n    │\n238 │             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: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]: `expectedCallback` is changed without an event but is used for access control\n    ╭▸ src/PvPadFactory.sol:306:9\n    │\n306 │         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:207:27\n    │\n207 │         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:223:9\n    │\n223 │         emit LaunchPoolRealigned(launchId, existingPrice);\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:197:9\n    │\n197 │         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:119:9\n    │\n119 │         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:115:33\n    │\n115 │           canonicalSqrtPriceX96 = uint160(\n    │ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n116 │ ┃             Math.sqrt(FullMath.mulDiv(PvPadConstants.TOKEN_SUPPLY / 4, uint256(1) << 192, graduationThreshold))\n117 │ ┃         );\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[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[arbitrary-send-eth]: ETH is sent to a user-controlled destination; restrict the destination or the caller\n    ╭▸ src/hooks/PvPadHook.sol:259:13\n    │\n259 │         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:264:13\n    │\n264 │             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:275:16\n    │\n275 │         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:284:31\n    │\n284 │         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:284:39\n    │\n284 │         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:292:21\n    │\n292 │         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[unsafe-typecast]: typecast can truncate values\n    ╭▸ src/hooks/PvPadHook.sol:292:29\n    │\n292 │         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:293:16\n    │\n293 │         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:293:23\n    │\n293 │         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[reentrancy-events]: event emitted after an external call; reentrancy can reorder or fabricate logs that off-chain consumers rely on\n    ╭▸ src/PvPadFactory.sol:168:9\n    │\n168 │         emit LaunchMetadata(launchId, metadataURI);\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:216:13\n    │\n216 │             poolManager.initialize(key, canonicalSqrtPriceX96);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/PvPadFactory.sol:264:46\n    │\n264 │         return (fallbackSalt, fallbackToken, fallbackAttempt);\n    │                                              ━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/PvPadFactory.sol:264:17\n    │\n264 │         return (fallbackSalt, fallbackToken, fallbackAttempt);\n    │                 ━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[uninitialized-local]: local variable is read before being initialized\n    ╭▸ src/PvPadFactory.sol:261:17\n    │\n261 │             if (fallbackToken == address(0)) (fallbackSalt, fallbackToken, fallbackAttempt) = (salt, token, attempt);\n    │                 ━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/uninitialized-local\n\nwarning[encode-packed-collision]: `abi.encodePacked()` called with multiple dynamic type arguments; hash collisions possible\n    ╭▸ src/PvPadFactory.sol:248:42\n    │\n248 │         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-no-eth]: external call can be reentered before `_status` is updated\n    ╭▸ src/PvPadFactory.sol:291:52\n    │\n291 │         (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:295:9\n    │\n295 │         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:298:9\n    │\n298 │         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:295:9\n    │\n295 │         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:326:9\n    │\n326 │         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:327:9\n    │\n327 │         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:320:33\n    │\n320 │         (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:321:27\n    │\n321 │         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:321:35\n    │\n321 │         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:322:29\n    │\n322 │         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:322:37\n    │\n322 │         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:347:17\n    │\n347 │                 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:352:41\n    │\n352 │             if (liquidity > maxPerTick) revert LiquidityRangeUnavailable();\n    │                                         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[environment-read-across-mutation]: `block.timestamp` may be reused across `vm.warp`\n    ╭▸ test/FeesWorkers.t.sol:326:25\n    │\n326 │         uint256 start = block.timestamp + 100;\n    │                         ━━━━━━━━━━━━━━━\n    ‡\n334 │         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":12177,"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 1.56ms (1.49ms CPU time)\n\nRan 3 tests for test/ProjectDeployment.t.sol:ProjectDeploymentTest\n[PASS] test_constructorOnlyCreate2DeploymentConfiguresGenesisAndSecondLaunch() (gas: 11077387)\n[PASS] test_mineHookSaltScriptMatchesTheDeployedHookAndUnminedSaltsFail() (gas: 9125218)\nLogs:\n  PvPadHook CREATE2 evidence\n    deployer        0x1d1499e622D69689cdf9004d05Ec547d650Ff211\n    poolManager     0x2e234DAe75C793f67A35089C9d99245E1C58470b\n    initCodeHash    0x196279f3d8079a90b82091d4d79de236c01a5d4d7402eaaad2985ec046d50a44\n    salt            0x00000000000000000000000000000000000000000000000000000000000010e2\n    predicted hook  0x606A74Bda1A7637B39fa0152BFa09B830D7B08Cc\n    address flags   2252\n\n[PASS] test_miswiredConstructorFailsWithoutMovingSupplyAndSameSaltCanRetry() (gas: 8907793)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 38.64ms (14.05ms CPU time)\n\nRan 4 tests for test/LaunchToken.t.sol:LaunchTokenTest\n[PASS] testFuzz_transferConservesSupply(uint256) (runs: 256, μ: 79063, ~: 79220)\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 71.93ms (76.10ms CPU time)\n\nRan 7 tests for test/CurveFactory.t.sol:CurveFactoryTest\n[PASS] testFuzz_capRefundsExcessAndEndsAtGraduationPrice(uint256) (runs: 256, μ: 444558, ~: 448935)\n[PASS] testFuzz_roundTripConservesAssetsAndChargesBothFees(uint256) (runs: 256, μ: 479621, ~: 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 87.08ms (99.56ms CPU time)\n\nRan 4 tests for test/CurveFactory.t.sol:FactoryConstructionTest\n[PASS] test_genesisIsAlreadyConfiguredAndMetadataImmutable() (gas: 2113040)\n[PASS] test_invalidFeesMetadataAndCallbackFailAtomically() (gas: 266416)\n[PASS] test_poisonedPredictedPoolIsSkippedAutomaticallyAndNeverSeeded() (gas: 4129360)\n[PASS] test_preinitializedCanonicalPriceCanLaunchSafely() (gas: 2066720)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 103.08ms (2.08ms CPU time)\n\nRan 3 tests for test/PoolRealign.t.sol:PoolRealignTest\n[PASS] test_onlyTheBoundFactoryCanRealignAndOnlyAnEmptyMispricedPool() (gas: 994570)\n[PASS] test_realignedPoolGraduatesAndTradesWithFeesLikeAnyOther() (gas: 4528431)\n[PASS] test_unlockCallbackAcceptsOnlyThePoolManagerDuringARealignment() (gas: 111004)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 111.11ms (4.28ms CPU time)\n\nRan 10 tests for test/PvPadIntegration.t.sol:PvPadIntegrationTest\n[PASS] test_deploymentFloorRuntimeAndSupply() (gas: 18647744)\n[PASS] test_graduationFailureRollsBackReserveSweep() (gas: 872455)\n[PASS] test_graduationLocksFactoryPositionAndStopsCurve() (gas: 2368826)\n[PASS] test_partialFillETHSpecifiedRevertsWithoutLosingFunds() (gas: 980426)\n[PASS] test_pregraduationAndForeignPoolSwapsRejected() (gas: 229367)\n[PASS] test_realPoolAllFourSwapModesChargeETHAndConserveCredits() (gas: 1742447)\n[PASS] test_rejectingBeneficiaryDoesNotBlockCurveOrPool() (gas: 1287664)\n[PASS] test_secondLaunchCurveAndPostGraduationFeesShareKing() (gas: 3929913)\n[PASS] test_thresholdDustSellCannotInvalidatePermissionlessGraduation() (gas: 1013053)\n[PASS] test_unspecifiedETHPartialFillChargesOnlyExecution() (gas: 985937)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 157.17ms (63.22ms CPU time)\n\nRan 7 tests for test/FactoryAdversarial.t.sol:FactoryAdversarialTest\n[PASS] testFuzz_inexactLaunchFeeNeverChangesState(uint256,bool) (runs: 256, μ: 69789, ~: 70253)\n[PASS] test_constructorRejectsMismatchedManagerAndWorkerPot() (gas: 4394687)\n[PASS] test_emptySymbolAndOverlongNameFailWithoutCharging() (gas: 99737)\n[PASS] test_failedWorkerFundingRollsBackEntireLaunchAndSameSaltCanRetry() (gas: 4200444)\n[PASS] test_maximumMetadataLengthsAndRepeatedSaltCreateIndependentLaunches() (gas: 4789005)\n[PASS] test_strayEthToFactoryOrCurveIsRejectedWhileGraduationSweepStillWorks() (gas: 770954)\n[PASS] test_unknownAndUnfundedLaunchCannotGraduate() (gas: 125531)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 198.44ms (18.89ms CPU time)\n\nRan 7 tests for test/GenesisPoison.t.sol:GenesisPoisonTest\n[PASS] testFuzz_genesisPoisonedAtAnyForeignPricesDeploysAtCanonicalPrice(uint160,bool) (runs: 64, μ: 9899159, ~: 9875856)\n[PASS] test_allSixteenGenesisCandidatesPoisonedBeforeCreate2StillDeploysAtPredictedAddress() (gas: 11360232)\n[PASS] test_genesisCandidatePreinitializedAtCanonicalPriceIsAcceptedWithoutRealignment() (gas: 8181515)\n[PASS] test_laterLaunchesKeepBoundedResaltAfterPoisonedGenesis() (gas: 11507162)\n[PASS] test_partialGenesisPoisonResaltsInsideTheConstructorAtThePredictedAddress() (gas: 8655839)\n[PASS] test_realignedGenesisCannotBeMovedReinitializedOrOpenedByAnyone() (gas: 9813722)\n[PASS] test_realignmentThatLeavesAForeignPriceAbortsTheDeployAndTheSameSaltRetries() (gas: 13186990)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 359.69ms (351.98ms CPU time)\n\nRan 16 tests for test/LaunchResalt.t.sol:LaunchResaltTest\n[PASS] testFuzz_allCandidatesPoisonedAtMixedPricesRecoversWithoutMovingValue(uint160,bytes32,bool) (runs: 128, μ: 4520896, ~: 4560887)\n[PASS] testFuzz_poisonDepthWithinBoundSelectsFirstCleanSalt(uint8,bytes32) (runs: 64, μ: 2482126, ~: 2441201)\n[PASS] test_canonicalPreinitializationKeepsAttemptZero() (gas: 2090161)\n[PASS] test_everyBoundedSaltPoisonedRealignsFirstCandidateAndNeverSeedsForeignPrice() (gas: 4420656)\n[PASS] test_everyGenesisCandidatePoisonedStillConstructsAtCanonicalPrice() (gas: 1278413)\n[PASS] test_factoryRejectsRecoveryThatDidNotRestoreCanonicalPriceAndCanRetry() (gas: 6478372)\n[PASS] test_freshUserSaltStillEscapesPoisonedDerivations() (gas: 3011968)\n[PASS] test_missingRealignmentCallbackRollsBackLaunchAndCanRetry() (gas: 6512399)\n[PASS] test_nonzeroRealignmentDeltaRollsBackLaunchAndCanRetry() (gas: 6515627)\n[PASS] test_poisonedGenesisPoolResaltsInsideConstructor() (gas: 391321)\n[PASS] test_poisonedPredictedPoolSkipsToNextSaltAndNeverSeedsForeignPrice() (gas: 2209722)\n[PASS] test_predictionMatchesUnpoisonedCreateAndAdvancesWithLaunchCount() (gas: 2082985)\n[PASS] test_realignmentFromExtremeForeignPricesInBothDirections() (gas: 6979348)\n[PASS] test_repeatedFrontRunningConsumesSuccessiveAttempts() (gas: 2278888)\n[PASS] test_workerFailureAfterRealignmentRestoresPoisonedPriceAndCanRetry() (gas: 6674982)\n[PASS] test_zeroDeltaWithoutPriceMovementRollsBackLaunchAndCanRetry() (gas: 6518700)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 361.45ms (339.64ms CPU time)\n\nRan 20 tests for test/HookSecurity.t.sol:HookSecurityTest\n[PASS] testFuzz_exactEthOutputFeeIsOnePercentOfGrossEthOutput(uint128) (runs: 256, μ: 137896, ~: 147737)\n[PASS] testFuzz_exactTokenOutputFeeIsOnePercentOfGrossEthInput(uint128) (runs: 256, μ: 138700, ~: 148549)\n[PASS] testFuzz_feeConservationOnSpecifiedInput(uint128) (runs: 256, μ: 155226, ~: 165075)\n[PASS] test_afterSwapRejectsPartialSpecifiedFill() (gas: 65125)\n[PASS] test_beforeAddLiquidityAdmitsOnlyBoundFactoryUntilGraduation() (gas: 141346)\n[PASS] test_beforeAddLiquidityRejectsUnboundPoolsAndDirectCalls() (gas: 179650)\n[PASS] test_callbacksRequirePoolManager() (gas: 67467)\n[PASS] test_constructorRejectsWrongPermissionAddress() (gas: 17194)\n[PASS] test_deferredAggregationPreservesPerTradeRounding() (gas: 397396)\n[PASS] test_dustDoesNotCreateDeferredCredits() (gas: 93753)\n[PASS] test_extremeSpecifiedAmountRejectedCleanly() (gas: 63506)\n[PASS] test_feeDeliveryFailurePreservesFeeAndOriginalKing() (gas: 419015)\n[PASS] test_foreignEscrowRejected() (gas: 371029)\n[PASS] test_foreignRegistryCannotCaptureTokenPool() (gas: 44896)\n[PASS] test_hookUsesSwapAndAddLiquidityFlagsAndNoInitializationCallback() (gas: 46296)\n[PASS] test_legacySwapOnlyFlagAddressIsRejected() (gas: 2813758)\n[PASS] test_onlyCanonicalPoolCanBind() (gas: 41195)\n[PASS] test_poolCannotBeRebound() (gas: 50768)\n[PASS] test_preGraduationSwapRejected() (gas: 57115)\n[PASS] test_retryFailureKeepsDeferredCredit() (gas: 255475)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 373.36ms (290.10ms CPU time)\n\nRan 11 tests for test/WorkerAdversarial.t.sol:WorkerAdversarialTest\n[PASS] testCoincidentCreatorAndKingReceivesFullOddFeeOnce() (gas: 238381)\n[PASS] testFuzzAggregatedFeesMatchIndividualOddRounding(uint96,uint96) (runs: 512, μ: 260643, ~: 261022)\n[PASS] testFuzzEpochBudgetRemainsIsolatedWhenRootOverallocates(uint96,uint96) (runs: 512, μ: 716080, ~: 716071)\n[PASS] testFuzzInvalidExplicitSnapshotFeePreservesState(uint96) (runs: 512, μ: 93737, ~: 93892)\n[PASS] testFuzzKingOverbidDoesNotSetNextPriceOrRefundPreviousKing(uint96) (runs: 512, μ: 279851, ~: 279790)\n[PASS] testFuzzProofCannotBeReplayedIntoAnotherFundedEpoch(uint96) (runs: 512, μ: 593260, ~: 593267)\n[PASS] testMaxWindowStartAndEndAreInclusiveAndFullEpochRecyclesZero() (gas: 611186)\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 375.11ms (986.41ms CPU time)\n\nRan 17 tests for test/FeesWorkers.t.sol:FeesWorkersTest\n[PASS] testAggregatedDeferredSharesPreserveEveryOddWei() (gas: 370972)\n[PASS] testConstructorsRejectMissingDependencies() (gas: 3863)\n[PASS] testEscrowRejectingRecipientDoesNotLoseCredits() (gas: 858834)\n[PASS] testEscrowWithdrawalCannotReenterOrStealAnotherCredit() (gas: 798431)\n[PASS] testFeeRecorderAccessAndDepositValidation() (gas: 285733)\n[PASS] testFuzzFeeConservationAcrossCrowns(uint96,uint96,uint96) (runs: 256, μ: 752755, ~: 756837)\n[PASS] testKingStrictBidAndFullWorkerFunding() (gas: 390497)\n[PASS] testPreKingFeesAndDelayedDeliveryAlwaysBelongToFirstKing() (gas: 821243)\n[PASS] testWithdrawRejectsInvalidRecipientAndCurrency() (gas: 226909)\n[PASS] testWorkerCannotReenterClaim() (gas: 795246)\n[PASS] testWorkerClaimWindowBoundariesAndExpiryRecycling() (gas: 923759)\n[PASS] testWorkerEpochStartBoundedByMaxWindowKeepsPotRecoverable() (gas: 440792)\n[PASS] testWorkerEpochValidationDoesNotConsumePot() (gas: 521608)\n[PASS] testWorkerFailedPaymentRestoresClaimAndReserve() (gas: 927504)\n[PASS] testWorkerProofsRelayedClaimsDuplicatesAndBudgetIsolation() (gas: 881901)\n[PASS] testWorkerRejectsUnknownEpochZeroPayeeAndZeroAmount() (gas: 341313)\n[PASS] testWorkerUpdaterRotationIsExplicitTwoStep() (gas: 251049)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 375.05ms (74.89ms CPU time)\n\nRan 16 tests for test/CurveMathProperties.t.sol:CurveMathPropertiesTest\n[PASS] testFuzz_aHolderCanAlwaysExitTheWholeCirculatingSupply(uint256) (runs: 512, μ: 394404, ~: 397132)\n[PASS] testFuzz_everyInputBelowTheCapStaysStrictlyBelowTheThreshold(uint256,uint256) (runs: 512, μ: 388256, ~: 396056)\n[PASS] testFuzz_excessOverTheCapIsRefundedToTheSenderNotTheRecipient(uint256,uint256) (runs: 512, μ: 396580, ~: 400484)\n[PASS] testFuzz_feeFreeDustRoundTripNeverProfits(uint256,uint256) (runs: 512, μ: 419313, ~: 428778)\n[PASS] testFuzz_graduationSeedsThePoolAtTheCurvePriceWithWeiLevelDust(uint256,uint256,uint256) (runs: 512, μ: 1111141, ~: 1125197)\n[PASS] testFuzz_laterBuyersNeverGetABetterPrice(uint256,uint256) (runs: 512, μ: 407678, ~: 415600)\n[PASS] testFuzz_marginalPriceNeverFallsBelowTheOpeningPrice(uint256) (runs: 512, μ: 226765, ~: 238997)\n[PASS] testFuzz_maxBuyInputIsTheSmallestGrossInputThatFillsTheCurve(uint256) (runs: 512, μ: 523735, ~: 528921)\n[PASS] testFuzz_quoteBuyEqualsExecutionFromAnyPriorState(uint256,uint256) (runs: 512, μ: 402280, ~: 407537)\n[PASS] testFuzz_quoteSellEqualsExecutionFromAnyPriorState(uint256,uint256) (runs: 512, μ: 352328, ~: 392861)\n[PASS] testFuzz_roundTripOfAnySizeNeverProfits(uint256,uint256) (runs: 512, μ: 463433, ~: 496129)\n[PASS] testFuzz_sellWithoutApprovalOrBalanceRollsBackReserves(uint256,uint256) (runs: 512, μ: 296782, ~: 338565)\n[PASS] testFuzz_sellingMoreThanWasEverBoughtIsRejectedEvenWithTheBalance(uint256) (runs: 512, μ: 494941, ~: 505648)\n[PASS] testFuzz_slippageAndDeadlineGuardsRejectWithoutStateChange(uint256,uint256) (runs: 512, μ: 693156, ~: 744035)\n[PASS] test_openingCapIsFourPointTwoFourEtherAndFillsExactly() (gas: 260939)\n[PASS] test_openingEdgesOneWeiAndNinetyNineWei() (gas: 209265)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 416.41ms (2.79s CPU time)\n\nRan 19 tests for test/GraduationLiquidity.t.sol:GraduationLiquidityTest\n[PASS] testFuzz_thresholdSellsOfAnySizeRevertAndGraduationProceeds(uint256,bool) (runs: 256, μ: 1007315, ~: 1007159)\n[PASS] test_defenseInDepthScanStillMovesSaturatedBoundaryInward() (gas: 742627)\n[PASS] test_deploymentFloorRuntimeAndSupply() (gas: 18648509)\n[PASS] test_graduationFailureRollsBackReserveSweep() (gas: 872441)\n[PASS] test_graduationLocksFactoryPositionAndStopsCurve() (gas: 2368949)\n[PASS] test_griefRejectedEvenWhenCurveIsAlreadyFullButNotYetGraduated() (gas: 2097771)\n[PASS] test_liquidityOpensAfterGraduationAndOwnPositionsStayRemovable() (gas: 3214551)\n[PASS] test_partialFillETHSpecifiedRevertsWithoutLosingFunds() (gas: 980532)\n[PASS] test_pregraduationAndForeignPoolSwapsRejected() (gas: 229387)\n[PASS] test_realPoolAllFourSwapModesChargeETHAndConserveCredits() (gas: 1742503)\n[PASS] test_rejectingBeneficiaryDoesNotBlockCurveOrPool() (gas: 1287662)\n[PASS] test_repeatedGriefAttemptsAcrossManyTicksStillLeaveFullRange() (gas: 3315313)\n[PASS] test_secondLaunchCurveAndPostGraduationFeesShareKing() (gas: 3930010)\n[PASS] test_thresholdDustSellCannotInvalidatePermissionlessGraduation() (gas: 1013342)\n[PASS] test_tickOverflowGriefOnLowerBoundaryIsRejectedBeforeGraduation() (gas: 2554685)\n[PASS] test_tickOverflowGriefOnUpperBoundaryIsRejectedBeforeGraduation() (gas: 2637214)\n[PASS] test_unavailableRangeRollsBackAndCanBeRetried() (gas: 126174637)\n[PASS] test_unboundPoolNamingThisHookNeverOpensLiquidity() (gas: 2362750)\n[PASS] test_unspecifiedETHPartialFillChargesOnlyExecution() (gas: 985980)\nSuite result: ok. 19 passed; 0 failed; 0 skipped; finished in 494.37ms (671.21ms 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   | 1179  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | claimKing          | 1144  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | invalidKingBid     | 1171  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | recordFee          | 1178  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | toggleRecorder     | 1195  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | unauthorizedRecord | 1160  | 0       | 0        |\n|--------------------------+--------------------+-------+---------+----------|\n| FeeKingAccountingHandler | withdraw           | 1165  | 0       | 0        |\n╰--------------------------+--------------------+-------+---------+----------╯\n\n[PASS] testHandlerExercisesPreCrownAndCapturedCreditsAcrossCrowns() (gas: 1292706)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 868.83ms (868.31ms 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  | 1064  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | advanceTime    | 983   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | claim          | 1058  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | donate         | 1043  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | invalidClaim   | 998   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | openEpoch      | 1016  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | proposeUpdater | 974   | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| WorkerAccountingHandler | recycle        | 1056  | 0       | 0        |\n╰-------------------------+----------------+-------+---------+----------╯\n\n[PASS] testHandlerExercisesClaimsOverlappingEpochsAndRecycledFunds() (gas: 2492066)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 2.38s (2.38s 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 | 884   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | buy              | 868   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | claimCrown       | 959   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | donate           | 871   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | flush            | 908   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | graduate         | 912   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | sell             | 964   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | setDelivery      | 931   | 0       | 0        |\n|----------------------+------------------+-------+---------+----------|\n| CurveSequenceHandler | withdraw         | 895   | 0       | 0        |\n╰----------------------+------------------+-------+---------+----------╯\n\n[PASS] testFuzz_fundedCurveRejectsBothSellOverloadsAtomically(uint256,bool) (runs: 256, μ: 1718293, ~: 1718136)\n[PASS] test_feeRoundingAtOneWeiAndHundredWeiBoundaries() (gas: 2556401)\n[PASS] test_handlerExercisesDeferredRoundingCrownChangesAndGraduation() (gas: 3972869)\n[PASS] test_handlerExercisesFundedTradingLockBeforeSweep() (gas: 3107520)\n[PASS] test_rejectedCapRefundRollsBackTokensReservesAndDeferredFees() (gas: 717326)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 2.85s (3.19s 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 | 816   | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| HookInvariantHandler | claimKing            | 848   | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| HookInvariantHandler | retry                | 922   | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| HookInvariantHandler | setDeliveryFailure   | 898   | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| HookInvariantHandler | swap                 | 1796  | 0       | 0        |\n|----------------------+----------------------+-------+---------+----------|\n| HookInvariantHandler | withdraw             | 864   | 0       | 0        |\n╰----------------------+----------------------+-------+---------+----------╯\n\n[PASS] test_allFourModesPreserveAccountingWhenFeeDeliveryFails() (gas: 2151903)\n[PASS] test_fullRangeGraduationWithForeignPositionsRemainsLockedAcrossAllSwapModes() (gas: 2791283)\n[PASS] test_realPoolDeferredOddWeiKeepCreatorAndOriginalKingAcrossRetries() (gas: 1474190)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 2.88s (2.79s CPU time)\n\nRan 4 tests for test/SystemLifecycleInvariant.t.sol:SystemLifecycleInvariantTest\n[PASS]\nSystemLifecycleInvariantTest invariants:\n[PASS] invariant_curveCustodyEqualsReservesRetainedFeesAndDonations\n[PASS] invariant_everyFeeWeiIsDeliveredDeferredOrWithdrawnExactlyOnce\n[PASS] invariant_everyLaunchTokenIsHeldByAKnownParty\n[PASS] invariant_graduationIsFinalAndPoolsMatchTheLedger\n[PASS] invariant_workerPotAndCrownFollowTheFrozenEconomics\n SystemLifecycleInvariantTest invariants (runs: 96, calls: 4608, reverts: 0)\n\n╭------------------------+-----------------------+-------+---------+----------╮\n| Contract               | Selector              | Calls | Reverts | Discards |\n+=============================================================================+\n| SystemLifecycleHandler | assignUnassigned      | 223   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | buy                   | 673   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | claimKing             | 210   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | createLaunch          | 209   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | donateEthToCurve      | 220   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | donateTokensToCurve   | 231   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | flushCurve            | 226   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | fundWorkers           | 219   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | graduate              | 458   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | poisonAndCreateLaunch | 221   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | probeRejections       | 218   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | retryHook             | 237   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | sell                  | 428   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | setOutage             | 212   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | swap                  | 409   | 0       | 0        |\n|------------------------+-----------------------+-------+---------+----------|\n| SystemLifecycleHandler | withdraw              | 214   | 0       | 0        |\n╰------------------------+-----------------------+-------+---------+----------╯\n\n[PASS] test_curveAndPoolFeesReachTheSameKing() (gas: 4218645)\n[PASS] test_handlerDrivesEveryLifecycleTransition() (gas: 10824694)\n[PASS] test_recoveredLaunchesPreserveLivePoolReservesAndDeferredFees() (gas: 15258750)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.45s (4.30s 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             | 2700  | 0       | 0        |\n|--------------------+---------------------+-------+---------+----------|\n| TokenLedgerHandler | exceedAllowance     | 2737  | 0       | 0        |\n|--------------------+---------------------+-------+---------+----------|\n| TokenLedgerHandler | overspend           | 2717  | 0       | 0        |\n|--------------------+---------------------+-------+---------+----------|\n| TokenLedgerHandler | rejectZeroRecipient | 2704  | 0       | 0        |\n|--------------------+---------------------+-------+---------+----------|\n| TokenLedgerHandler | transfer            | 2728  | 0       | 0        |\n|--------------------+---------------------+-------+---------+----------|\n| TokenLedgerHandler | transferFrom        | 2798  | 0       | 0        |\n╰--------------------+---------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 11.98s (11.97s CPU time)\n\nRan 21 test suites in 11.98s (28.93s CPU time): 167 tests passed, 0 failed, 0 skipped (167 total tests)\n","passed":true},{"durationMs":174,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"BondingCurve.buy(address)\",\"BondingCurve.buy(address,uint256,uint256)\",\"BondingCurve.flushDeferredFees(address)\",\"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.realignPool((address,address,uint24,int24,address),uint160)\",\"PvPadHook.receive()\",\"PvPadHook.retryDeferred(address,address,address)\",\"PvPadHook.unlockCallback(bytes)\",\"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\":25,\"CHANGELOG.md\":215,\"DEPENDENCIES.json\":22,\"LICENSE\":21,\"README.md\":136,\"SPEC.md\":168,\"docs/ABI.md\":44,\"docs/abi/BondingCurve.json\":629,\"docs/abi/FeeEscrow.json\":380,\"docs/abi/KingOfThePad.json\":150,\"docs/abi/LaunchToken.json\":315,\"docs/abi/PvPadFactory.json\":877,\"docs/abi/PvPadHook.json\":1362,\"docs/abi/PvPadToken.json\":339,\"docs/abi/WorkerSubsidy.json\":476,\"foundry.toml\":21,\"launch.json\":40,\"script/MineHookSalt.s.sol\":49,\"src/BondingCurve.sol\":242,\"src/FeeEscrow.sol\":132,\"src/KingOfThePad.sol\":41,\"src/LaunchToken.sol\":11,\"src/PvPadFactory.sol\":368,\"src/PvPadToken.sol\":15,\"src/WorkerSubsidy.sol\":138,\"src/hooks/PvPadHook.sol\":346,\"src/libraries/PvPadConstants.sol\":34,\"src/utils/HookMiner.sol\":55,\"test/AccountingInvariant.t.sol\":426,\"test/CurveFactory.t.sol\":340,\"test/CurveInvariant.t.sol\":552,\"test/CurveMathProperties.t.sol\":399,\"test/FactoryAdversarial.t.sol\":203,\"test/FeesWorkers.t.sol\":438,\"test/GenesisPoison.t.sol\":435,\"test/GraduationLiquidity.t.sol\":290,\"test/HookInvariant.t.sol\":445,\"test/HookSecurity.t.sol\":307,\"test/LaunchResalt.t.sol\":445,\"test/LaunchToken.t.sol\":66,\"test/PoolRealign.t.sol\":165,\"test/ProjectDeployment.t.sol\":167,\"test/PvPadIntegration.t.sol\":344,\"test/README.md\":43,\"test/SystemLifecycleInvariant.t.sol\":1112,\"test/TokenInvariant.t.sol\":239,\"test/WorkerAdversarial.t.sol\":249,\"tools/export_abis.py\":41},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"bab25f6a324847ea3cc154dd38513c69a388cea917c9d70def3c31ba91e47aab","verifiedTreeHash":"b3fd99f39fa1bdf73ea12e1390ac062c208faa54","verifierVersion":"0.1.0+da6bdbe5"}]}