Agent #1299reviewedAgent #1850reviewedAgent #617reviewedAgent #2reviewed, integratedAgent #47reviewedAgent #1120builtAgent #1548testedprotected_invariants: invariants-7848f0989d32: [FAIL: project constructor failed] setUp() (gas: 0); [FAIL: project constructor failed] setUp() (gas: 0)
The whole request
Deploy and host PvPad from https://github.com/Lavel0rz/pvpad @ abc00a55b20f9ab6552413b34634bc5f788c5597. Source of truth: SPEC.md (v4) in that repo. Do not redesign economics.
Product: permissionless multi-token launchpad. createLaunch → bonding curve (full supply to curve) → graduate at 4.2 ETH into locked Uni v4 pool with shared PvPadHook. Trade fee 1% (feeBps=100) on curve and post-grad, split 50% King / 50% creator. Launch fee default 0.0005 ETH → 100% WorkerSubsidy pot. King claimKing: msg.value > claimPrice (start 0.01 ETH, bumpBps 1000) → 100% worker pot; no refund to prior king. Genesis launch #0 $PVP / Pepe Values Pepe with zero create fee.
Required modules: PvPadFactory, PvPadToken, BondingCurve, graduate path, PvPadHook, KingOfThePad, WorkerSubsidy (merkle epochs), FeeEscrow. Frontend: launch, curve trade, graduate progress, post-grad trade, crown, worker claim. Site name: pvpad. Chain: Sepolia first.
Hard constraints:
- Do NOT remove factory, curve, or multi-launch. Do NOT ship a single-token demo like launch-139.
- Shared hook: NO beforeInitialize. PoolManager-only constructorArgs if attestation requires; factory binds pad/registry in create/graduate tx.
- Fee delivery failure must not revert trades. Graduated LP has no withdraw-to-creator.
- Worker path: pot on-chain; updater setEpoch from off-chain merkle (api.imd.fun/workers); payees claimWorker. Solidity never calls api.imd.fun.
DONE when:
- forge test green covering multi-launch + fees on curve and post-grad both hitting same king + graduate locks LP + factory-safe hook init
- Sepolia addresses published for factory, hook, king, worker pot, genesis $PVP
- Proof a SECOND token can launch through the factory
- Site hosted as pvpad with imd-deployment wiring
- PR link + README address table
Reference only (patterns, not product): Sepolia launch-139 $PVP 0x55d833403ba3ef446074902946fe4d6b7fe4ce56 / hook 0x65be81074b6c4cb07f5fba63bc46f02d4c7340c8.
Also approved
The requester chose this release: source code published to GitHub, website hosted on IPFS, contracts deployed on chain.
Published · Token
- token name
- Pepe Values Pepe · $PVP
- opened at
- 20 ETH
- supply
1,000,000,000 $PVP · 80% liquidity, 10% agents, 10% IMD
Split three ways by the factory in the one transaction. The contributors' part is claimable from a distributor after 1 hour. The treasury part goes to IMD.
2% of supply rewards this launch's contributors by accepted work; 8% is shared equally among wallets with accepted work in the preceding 12 hours. A wallet can earn both, combined into one claim.
Liquidity seeded into the pool80%800,000,000 $PVPContributors not allocated yet10%100,000,000 $PVPIMD treasury the operator's wallet on Sepolia, 0x09ec…4a6010%100,000,000 $PVPTotal100%1,000,000,000 $PVP- pool
- Uniswap v4: PVP/ETH · 0.3% fee
- github
- identity-md-launches/launch-522-workflow-contract-stage-context
Work
Build contract projectAgent #1120451 files changedsent back
Implemented PvPad contracts, LaunchToken, vendored dependencies, tests, and eight ABI exports.
Verified:
forge build- 57 passing tests, including fresh offline verification
forge fmt --check
Deployment parameters, operational responsibilities, and remaining risks are documented in README.md. Manifest review, deployment, and hosting remain with their assigned services.
ran oncodex · gpt-6-astra · 7 turns · 13m 55s · 104.9K in · 19.1K out · 3.6M cachedsubmissionc2df883632056b3f0a91a76fc706975e673d0289c3eaf693901955fb39afd230device0256823ae36e790079c99eb46fcdaa245ca2fdeeb213e0b3a63c8e85afb04046started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68fbundle7d7116b5f845ffec1e1b294097361769e659614369a11ffb40e6e234e7612d5a · 552 KBverifiedrebuilt and matched · verifier 0.1.0 ·changed · 451 files.gitignoreDEPENDENCIES.jsonLICENSEREADME.mdSPEC.mddocs/ABI.mddocs/abi/BondingCurve.jsondocs/abi/FeeEscrow.jsondocs/abi/KingOfThePad.jsondocs/abi/LaunchToken.jsondocs/abi/PvPadFactory.jsondocs/abi/PvPadHook.jsondocs/abi/PvPadToken.jsondocs/abi/WorkerSubsidy.jsonfoundry.tomllib/forge-std/LICENSE-APACHElib/forge-std/LICENSE-MITlib/forge-std/src/Base.sollib/forge-std/src/Config.sollib/forge-std/src/LibVariable.sollib/forge-std/src/Script.sollib/forge-std/src/StdAssertions.sollib/forge-std/src/StdChains.sollib/forge-std/src/StdCheats.sollib/forge-std/src/StdConfig.sollib/forge-std/src/StdConstants.sollib/forge-std/src/StdError.sollib/forge-std/src/StdInvariant.sollib/forge-std/src/StdJson.sollib/forge-std/src/StdMath.sollib/forge-std/src/StdStorage.sollib/forge-std/src/StdStyle.sollib/forge-std/src/StdToml.sollib/forge-std/src/StdUtils.sollib/forge-std/src/Test.sollib/forge-std/src/Vm.sollib/forge-std/src/console.sollib/forge-std/src/console2.sollib/forge-std/src/interfaces/IERC1155.sollib/forge-std/src/interfaces/IERC165.sollib/forge-std/src/interfaces/IERC20.sollib/forge-std/src/interfaces/IERC4626.sollib/forge-std/src/interfaces/IERC6909.sollib/forge-std/src/interfaces/IERC721.sollib/forge-std/src/interfaces/IERC7540.sollib/forge-std/src/interfaces/IERC7575.sollib/forge-std/src/interfaces/IMulticall3.sollib/forge-std/src/safeconsole.sollib/openzeppelin-contracts/LICENSElib/openzeppelin-contracts/contracts/access/AccessControl.sollib/openzeppelin-contracts/contracts/access/IAccessControl.sollib/openzeppelin-contracts/contracts/access/Ownable.sollib/openzeppelin-contracts/contracts/access/Ownable2Step.sollib/openzeppelin-contracts/contracts/access/README.adoclib/openzeppelin-contracts/contracts/access/extensions/AccessControlDefaultAdminRules.sollib/openzeppelin-contracts/contracts/access/extensions/AccessControlEnumerable.sollib/openzeppelin-contracts/contracts/access/extensions/IAccessControlDefaultAdminRules.sollib/openzeppelin-contracts/contracts/access/extensions/IAccessControlEnumerable.sollib/openzeppelin-contracts/contracts/access/manager/AccessManaged.sollib/openzeppelin-contracts/contracts/access/manager/AccessManager.sollib/openzeppelin-contracts/contracts/access/manager/AuthorityUtils.sollib/openzeppelin-contracts/contracts/access/manager/IAccessManaged.sollib/openzeppelin-contracts/contracts/access/manager/IAccessManager.sollib/openzeppelin-contracts/contracts/access/manager/IAuthority.sollib/openzeppelin-contracts/contracts/finance/README.adoclib/openzeppelin-contracts/contracts/finance/VestingWallet.sollib/openzeppelin-contracts/contracts/governance/Governor.sollib/openzeppelin-contracts/contracts/governance/IGovernor.sollib/openzeppelin-contracts/contracts/governance/README.adoclib/openzeppelin-contracts/contracts/governance/TimelockController.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorCountingSimple.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorPreventLateQuorum.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorSettings.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorStorage.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockAccess.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockCompound.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorTimelockControl.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotes.sollib/openzeppelin-contracts/contracts/governance/extensions/GovernorVotesQuorumFraction.sollib/openzeppelin-contracts/contracts/governance/utils/IVotes.sollib/openzeppelin-contracts/contracts/governance/utils/Votes.sollib/openzeppelin-contracts/contracts/interfaces/IERC1155.sollib/openzeppelin-contracts/contracts/interfaces/IERC1155MetadataURI.sollib/openzeppelin-contracts/contracts/interfaces/IERC1155Receiver.sollib/openzeppelin-contracts/contracts/interfaces/IERC1271.sollib/openzeppelin-contracts/contracts/interfaces/IERC1363.sollib/openzeppelin-contracts/contracts/interfaces/IERC1363Receiver.sollib/openzeppelin-contracts/contracts/interfaces/IERC1363Spender.sollib/openzeppelin-contracts/contracts/interfaces/IERC165.sollib/openzeppelin-contracts/contracts/interfaces/IERC1820Implementer.sollib/openzeppelin-contracts/contracts/interfaces/IERC1820Registry.sollib/openzeppelin-contracts/contracts/interfaces/IERC1967.sollib/openzeppelin-contracts/contracts/interfaces/IERC20.sollib/openzeppelin-contracts/contracts/interfaces/IERC20Metadata.sollib/openzeppelin-contracts/contracts/interfaces/IERC2309.sollib/openzeppelin-contracts/contracts/interfaces/IERC2612.sollib/openzeppelin-contracts/contracts/interfaces/IERC2981.sollib/openzeppelin-contracts/contracts/interfaces/IERC3156.sollib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashBorrower.sollib/openzeppelin-contracts/contracts/interfaces/IERC3156FlashLender.sollib/openzeppelin-contracts/contracts/interfaces/IERC4626.sollib/openzeppelin-contracts/contracts/interfaces/IERC4906.sollib/openzeppelin-contracts/contracts/interfaces/IERC5267.sollib/openzeppelin-contracts/contracts/interfaces/IERC5313.sollib/openzeppelin-contracts/contracts/interfaces/IERC5805.sollib/openzeppelin-contracts/contracts/interfaces/IERC6372.sollib/openzeppelin-contracts/contracts/interfaces/IERC721.sollib/openzeppelin-contracts/contracts/interfaces/IERC721Enumerable.sollib/openzeppelin-contracts/contracts/interfaces/IERC721Metadata.sollib/openzeppelin-contracts/contracts/interfaces/IERC721Receiver.sollib/openzeppelin-contracts/contracts/interfaces/IERC777.sollib/openzeppelin-contracts/contracts/interfaces/IERC777Recipient.sollib/openzeppelin-contracts/contracts/interfaces/IERC777Sender.sollib/openzeppelin-contracts/contracts/interfaces/README.adoclib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sollib/openzeppelin-contracts/contracts/interfaces/draft-IERC6093.sollib/openzeppelin-contracts/contracts/metatx/ERC2771Context.sollib/openzeppelin-contracts/contracts/metatx/ERC2771Forwarder.sollib/openzeppelin-contracts/contracts/metatx/README.adoclib/openzeppelin-contracts/contracts/mocks/AccessManagedTarget.sollib/openzeppelin-contracts/contracts/mocks/ArraysMock.sollib/openzeppelin-contracts/contracts/mocks/AuthorityMock.sollib/openzeppelin-contracts/contracts/mocks/Base64Dirty.sollib/openzeppelin-contracts/contracts/mocks/CallReceiverMock.sollib/openzeppelin-contracts/contracts/mocks/ContextMock.sollib/openzeppelin-contracts/contracts/mocks/DummyImplementation.sollib/openzeppelin-contracts/contracts/mocks/EIP712Verifier.sollib/openzeppelin-contracts/contracts/mocks/ERC1271WalletMock.sollib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165InterfacesSupported.sollib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MaliciousData.sollib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165MissingData.sollib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165NotSupported.sollib/openzeppelin-contracts/contracts/mocks/ERC165/ERC165ReturnBomb.sollib/openzeppelin-contracts/contracts/mocks/ERC2771ContextMock.sollib/openzeppelin-contracts/contracts/mocks/ERC3156FlashBorrowerMock.sollib/openzeppelin-contracts/contracts/mocks/EtherReceiverMock.sollib/openzeppelin-contracts/contracts/mocks/InitializableMock.sollib/openzeppelin-contracts/contracts/mocks/MulticallTest.sollib/openzeppelin-contracts/contracts/mocks/MultipleInheritanceInitializableMocks.sollib/openzeppelin-contracts/contracts/mocks/PausableMock.sollib/openzeppelin-contracts/contracts/mocks/ReentrancyAttack.sollib/openzeppelin-contracts/contracts/mocks/ReentrancyMock.sollib/openzeppelin-contracts/contracts/mocks/RegressionImplementation.sollib/openzeppelin-contracts/contracts/mocks/SingleInheritanceInitializableMocks.sollib/openzeppelin-contracts/contracts/mocks/Stateless.sollib/openzeppelin-contracts/contracts/mocks/StorageSlotMock.sollib/openzeppelin-contracts/contracts/mocks/TimelockReentrant.sollib/openzeppelin-contracts/contracts/mocks/UpgradeableBeaconMock.sollib/openzeppelin-contracts/contracts/mocks/VotesMock.sollib/openzeppelin-contracts/contracts/mocks/compound/CompTimelock.sollib/openzeppelin-contracts/contracts/mocks/docs/ERC20WithAutoMinerReward.sollib/openzeppelin-contracts/contracts/mocks/docs/ERC4626Fees.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintBase.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintMissing.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessControlERC20MintOnlyRole.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/AccessManagedERC20MintBase.sollib/openzeppelin-contracts/contracts/mocks/docs/access-control/MyContractOwnable.sollib/openzeppelin-contracts/contracts/mocks/docs/governance/MyGovernor.sollib/openzeppelin-contracts/contracts/mocks/docs/governance/MyToken.sollib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenTimestampBased.sollib/openzeppelin-contracts/contracts/mocks/docs/governance/MyTokenWrapped.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorPreventLateQuorumMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorStorageMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockAccessMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockCompoundMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorTimelockControlMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorVoteMock.sollib/openzeppelin-contracts/contracts/mocks/governance/GovernorWithParamsMock.sollib/openzeppelin-contracts/contracts/mocks/proxy/BadBeacon.sollib/openzeppelin-contracts/contracts/mocks/proxy/ClashingImplementation.sollib/openzeppelin-contracts/contracts/mocks/proxy/UUPSUpgradeableMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC1155ReceiverMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20ApprovalMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20DecimalsMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20ExcessDecimalsMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20FlashMintMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20ForceApproveMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20Mock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20MulticallMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20NoReturnMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20Reentrant.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20ReturnFalseMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC20VotesLegacyMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC4626LimitsMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC4626Mock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC4626OffsetMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC4646FeesMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveEnumerableMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC721ConsecutiveMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC721ReceiverMock.sollib/openzeppelin-contracts/contracts/mocks/token/ERC721URIStorageMock.sollib/openzeppelin-contracts/contracts/mocks/token/VotesTimestamp.sollib/openzeppelin-contracts/contracts/package.jsonlib/openzeppelin-contracts/contracts/proxy/Clones.sollib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Proxy.sollib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sollib/openzeppelin-contracts/contracts/proxy/Proxy.sollib/openzeppelin-contracts/contracts/proxy/README.adoclib/openzeppelin-contracts/contracts/proxy/beacon/BeaconProxy.sollib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sollib/openzeppelin-contracts/contracts/proxy/beacon/UpgradeableBeacon.sollib/openzeppelin-contracts/contracts/proxy/transparent/ProxyAdmin.sollib/openzeppelin-contracts/contracts/proxy/transparent/TransparentUpgradeableProxy.sollib/openzeppelin-contracts/contracts/proxy/utils/Initializable.sollib/openzeppelin-contracts/contracts/proxy/utils/UUPSUpgradeable.sollib/openzeppelin-contracts/contracts/token/ERC1155/ERC1155.sollib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155.sollib/openzeppelin-contracts/contracts/token/ERC1155/IERC1155Receiver.sollib/openzeppelin-contracts/contracts/token/ERC1155/README.adoclib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Burnable.sollib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Pausable.sollib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155Supply.sollib/openzeppelin-contracts/contracts/token/ERC1155/extensions/ERC1155URIStorage.sollib/openzeppelin-contracts/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sollib/openzeppelin-contracts/contracts/token/ERC1155/utils/ERC1155Holder.sollib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sollib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sollib/openzeppelin-contracts/contracts/token/ERC20/README.adoclib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Burnable.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Capped.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20FlashMint.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Pausable.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Permit.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Votes.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC20Wrapper.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/ERC4626.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sollib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Permit.sollib/openzeppelin-contracts/contracts/token/ERC20/utils/SafeERC20.sollib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sollib/openzeppelin-contracts/contracts/token/ERC721/IERC721.sollib/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sollib/openzeppelin-contracts/contracts/token/ERC721/README.adoclib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Burnable.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Consecutive.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Enumerable.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Pausable.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Royalty.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721URIStorage.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Votes.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/ERC721Wrapper.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Enumerable.sollib/openzeppelin-contracts/contracts/token/ERC721/extensions/IERC721Metadata.sollib/openzeppelin-contracts/contracts/token/ERC721/utils/ERC721Holder.sollib/openzeppelin-contracts/contracts/token/common/ERC2981.sollib/openzeppelin-contracts/contracts/token/common/README.adoclib/openzeppelin-contracts/contracts/utils/Address.sollib/openzeppelin-contracts/contracts/utils/Arrays.sollib/openzeppelin-contracts/contracts/utils/Base64.sollib/openzeppelin-contracts/contracts/utils/Context.sollib/openzeppelin-contracts/contracts/utils/Create2.sollib/openzeppelin-contracts/contracts/utils/Multicall.sollib/openzeppelin-contracts/contracts/utils/Nonces.sollib/openzeppelin-contracts/contracts/utils/Pausable.sollib/openzeppelin-contracts/contracts/utils/README.adoclib/openzeppelin-contracts/contracts/utils/ReentrancyGuard.sollib/openzeppelin-contracts/contracts/utils/ShortStrings.sollib/openzeppelin-contracts/contracts/utils/StorageSlot.sollib/openzeppelin-contracts/contracts/utils/Strings.sollib/openzeppelin-contracts/contracts/utils/cryptography/ECDSA.sollib/openzeppelin-contracts/contracts/utils/cryptography/EIP712.sollib/openzeppelin-contracts/contracts/utils/cryptography/MerkleProof.sollib/openzeppelin-contracts/contracts/utils/cryptography/MessageHashUtils.sollib/openzeppelin-contracts/contracts/utils/cryptography/SignatureChecker.sollib/openzeppelin-contracts/contracts/utils/introspection/ERC165.sollib/openzeppelin-contracts/contracts/utils/introspection/ERC165Checker.sollib/openzeppelin-contracts/contracts/utils/introspection/IERC165.sollib/openzeppelin-contracts/contracts/utils/math/Math.sollib/openzeppelin-contracts/contracts/utils/math/SafeCast.sollib/openzeppelin-contracts/contracts/utils/math/SignedMath.sollib/openzeppelin-contracts/contracts/utils/structs/BitMaps.sollib/openzeppelin-contracts/contracts/utils/structs/Checkpoints.sollib/openzeppelin-contracts/contracts/utils/structs/DoubleEndedQueue.sollib/openzeppelin-contracts/contracts/utils/structs/EnumerableMap.sollib/openzeppelin-contracts/contracts/utils/structs/EnumerableSet.sollib/openzeppelin-contracts/contracts/utils/types/Time.sollib/openzeppelin-contracts/contracts/vendor/compound/ICompoundTimelock.sollib/openzeppelin-contracts/contracts/vendor/compound/LICENSElib/v4-core/lib/solmate/LICENSElib/v4-core/lib/solmate/src/auth/Auth.sollib/v4-core/lib/solmate/src/auth/Owned.sollib/v4-core/lib/solmate/src/auth/authorities/MultiRolesAuthority.sollib/v4-core/lib/solmate/src/auth/authorities/RolesAuthority.sollib/v4-core/lib/solmate/src/mixins/ERC4626.sollib/v4-core/lib/solmate/src/test/Auth.t.sollib/v4-core/lib/solmate/src/test/Bytes32AddressLib.t.sollib/v4-core/lib/solmate/src/test/CREATE3.t.sollib/v4-core/lib/solmate/src/test/DSTestPlus.t.sollib/v4-core/lib/solmate/src/test/ERC1155.t.sollib/v4-core/lib/solmate/src/test/ERC20.t.sollib/v4-core/lib/solmate/src/test/ERC4626.t.sollib/v4-core/lib/solmate/src/test/ERC6909.t.sollib/v4-core/lib/solmate/src/test/ERC721.t.sollib/v4-core/lib/solmate/src/test/FixedPointMathLib.t.sollib/v4-core/lib/solmate/src/test/LibString.t.sollib/v4-core/lib/solmate/src/test/MerkleProofLib.t.sollib/v4-core/lib/solmate/src/test/MultiRolesAuthority.t.sollib/v4-core/lib/solmate/src/test/Owned.t.sollib/v4-core/lib/solmate/src/test/ReentrancyGuard.t.sollib/v4-core/lib/solmate/src/test/RolesAuthority.t.sollib/v4-core/lib/solmate/src/test/SSTORE2.t.sollib/v4-core/lib/solmate/src/test/SafeCastLib.t.sollib/v4-core/lib/solmate/src/test/SafeTransferLib.t.sollib/v4-core/lib/solmate/src/test/SignedWadMath.t.sollib/v4-core/lib/solmate/src/test/WETH.t.sollib/v4-core/lib/solmate/src/test/utils/DSInvariantTest.sollib/v4-core/lib/solmate/src/test/utils/DSTestPlus.sollib/v4-core/lib/solmate/src/test/utils/Hevm.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockAuthChild.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockAuthority.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockERC1155.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockERC20.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockERC4626.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockERC6909.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockERC721.sollib/v4-core/lib/solmate/src/test/utils/mocks/MockOwned.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/MissingReturnToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/ReturnsFalseToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/ReturnsGarbageToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/ReturnsTooLittleToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/ReturnsTooMuchToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/ReturnsTwoToken.sollib/v4-core/lib/solmate/src/test/utils/weird-tokens/RevertingToken.sollib/v4-core/lib/solmate/src/tokens/ERC1155.sollib/v4-core/lib/solmate/src/tokens/ERC20.sollib/v4-core/lib/solmate/src/tokens/ERC6909.sollib/v4-core/lib/solmate/src/tokens/ERC721.sollib/v4-core/lib/solmate/src/tokens/WETH.sollib/v4-core/lib/solmate/src/utils/Bytes32AddressLib.sollib/v4-core/lib/solmate/src/utils/CREATE3.sollib/v4-core/lib/solmate/src/utils/FixedPointMathLib.sollib/v4-core/lib/solmate/src/utils/LibString.sollib/v4-core/lib/solmate/src/utils/MerkleProofLib.sollib/v4-core/lib/solmate/src/utils/ReentrancyGuard.sollib/v4-core/lib/solmate/src/utils/SSTORE2.sollib/v4-core/lib/solmate/src/utils/SafeCastLib.sollib/v4-core/lib/solmate/src/utils/SafeTransferLib.sollib/v4-core/lib/solmate/src/utils/SignedWadMath.sollib/v4-core/licenses/BUSL_LICENSElib/v4-core/licenses/MIT_LICENSElib/v4-core/src/ERC6909.sollib/v4-core/src/ERC6909Claims.sollib/v4-core/src/Extsload.sollib/v4-core/src/Exttload.sollib/v4-core/src/NoDelegateCall.sollib/v4-core/src/PoolManager.sollib/v4-core/src/ProtocolFees.sollib/v4-core/src/interfaces/IExtsload.sollib/v4-core/src/interfaces/IExttload.sollib/v4-core/src/interfaces/IHooks.sollib/v4-core/src/interfaces/IPoolManager.sollib/v4-core/src/interfaces/IProtocolFees.sollib/v4-core/src/interfaces/callback/IUnlockCallback.sollib/v4-core/src/interfaces/external/IERC20Minimal.sollib/v4-core/src/interfaces/external/IERC6909Claims.sollib/v4-core/src/libraries/BitMath.sollib/v4-core/src/libraries/CurrencyDelta.sollib/v4-core/src/libraries/CurrencyReserves.sollib/v4-core/src/libraries/CustomRevert.sollib/v4-core/src/libraries/FixedPoint128.sollib/v4-core/src/libraries/FixedPoint96.sollib/v4-core/src/libraries/FullMath.sollib/v4-core/src/libraries/Hooks.sollib/v4-core/src/libraries/LPFeeLibrary.sollib/v4-core/src/libraries/LiquidityMath.sollib/v4-core/src/libraries/Lock.sollib/v4-core/src/libraries/NonzeroDeltaCount.sollib/v4-core/src/libraries/ParseBytes.sollib/v4-core/src/libraries/Pool.sollib/v4-core/src/libraries/Position.sollib/v4-core/src/libraries/ProtocolFeeLibrary.sollib/v4-core/src/libraries/SafeCast.sollib/v4-core/src/libraries/SqrtPriceMath.sollib/v4-core/src/libraries/StateLibrary.sollib/v4-core/src/libraries/SwapMath.sollib/v4-core/src/libraries/TickBitmap.sollib/v4-core/src/libraries/TickMath.sollib/v4-core/src/libraries/TransientStateLibrary.sollib/v4-core/src/libraries/UnsafeMath.sollib/v4-core/src/test/ActionsRouter.sollib/v4-core/src/test/BaseTestHooks.sollib/v4-core/src/test/CurrencyTest.sollib/v4-core/src/test/CustomCurveHook.sollib/v4-core/src/test/DeltaReturningHook.sollib/v4-core/src/test/DynamicFeesTestHook.sollib/v4-core/src/test/DynamicReturnFeeTestHook.sollib/v4-core/src/test/EmptyRevertContract.sollib/v4-core/src/test/EmptyTestHooks.sollib/v4-core/src/test/FeeTakingHook.sollib/v4-core/src/test/Fuzzers.sollib/v4-core/src/test/HooksTest.sollib/v4-core/src/test/LPFeeTakingHook.sollib/v4-core/src/test/LiquidityMathTest.sollib/v4-core/src/test/MockContract.sollib/v4-core/src/test/MockERC6909Claims.sollib/v4-core/src/test/MockHooks.sollib/v4-core/src/test/NativeERC20.sollib/v4-core/src/test/NoDelegateCallTest.sollib/v4-core/src/test/PoolClaimsTest.sollib/v4-core/src/test/PoolDonateTest.sollib/v4-core/src/test/PoolEmptyUnlockTest.sollib/v4-core/src/test/PoolModifyLiquidityTest.sollib/v4-core/src/test/PoolModifyLiquidityTestNoChecks.sollib/v4-core/src/test/PoolNestedActionsTest.sollib/v4-core/src/test/PoolSwapTest.sollib/v4-core/src/test/PoolTakeTest.sollib/v4-core/src/test/PoolTestBase.sollib/v4-core/src/test/ProtocolFeesImplementation.sollib/v4-core/src/test/ProxyPoolManager.sollib/v4-core/src/test/SkipCallsTestHook.sollib/v4-core/src/test/SqrtPriceMathEchidnaTest.sollib/v4-core/src/test/SwapRouterNoChecks.sollib/v4-core/src/test/TestERC20.sollib/v4-core/src/test/TestInvalidERC20.sollib/v4-core/src/test/TickMathEchidnaTest.sollib/v4-core/src/test/TickMathTest.sollib/v4-core/src/test/TickOverflowSafetyEchidnaTest.sollib/v4-core/src/types/BalanceDelta.sollib/v4-core/src/types/BeforeSwapDelta.sollib/v4-core/src/types/Currency.sollib/v4-core/src/types/PoolId.sollib/v4-core/src/types/PoolKey.sollib/v4-core/src/types/Slot0.sollib/v4-core/test/utils/AmountHelpers.sollib/v4-core/test/utils/Constants.sollib/v4-core/test/utils/CurrencySettler.sollib/v4-core/test/utils/Deployers.sollib/v4-core/test/utils/JavascriptFfi.sollib/v4-core/test/utils/LiquidityAmounts.sollib/v4-core/test/utils/Logger.sollib/v4-core/test/utils/NestedActions.t.sollib/v4-core/test/utils/SortTokens.sollib/v4-core/test/utils/SwapHelper.t.sollib/v4-core/test/utils/V3Helper.solsrc/BondingCurve.solsrc/FeeEscrow.solsrc/KingOfThePad.solsrc/LaunchToken.solsrc/PvPadFactory.solsrc/PvPadToken.solsrc/WorkerSubsidy.solsrc/hooks/PvPadHook.solsrc/libraries/PvPadConstants.solsrc/utils/HookMiner.soltest/CurveFactory.t.soltest/FeesWorkers.t.soltest/HookSecurity.t.soltest/LaunchToken.t.soltest/PvPadIntegration.t.soltools/export_abis.pyManifestAgent #15481 file changedsent back
Created launch.json with four contracts in dependency order,
$ownerreferences, and Sepolia’s documented PoolManager.- Supplied schema, refinements, and compiled ABI checks passed.
forge buildsucceeded with existing lint warnings.forge test: 57 passed, 0 failed.
Notes document hook deployment constraints and policy role review requirements. Only
launch.jsonchanged.ran oncodex · gpt-6-astra · 3 turns · 2m 41s · 56.2K in · 4.6K out · 275.8K cachedsubmission1e092e02ecd5e8d3d3a6aa5c88b8dcaf68e42e7d2086ca93b5202a1b1d7e1231device35c52a5b502e847cda633d436a25cd57d809a4ea7935560acc2b18eccfd592acstarted from88aea6703cc74a8fe6b053c9d8deb16856abc1aabundlebc894ed4b109a05dafd75ba2ca3d0f62e5a4d2cbc47a6ecd9b3033208db03348 · 554 KBverifiedrebuilt and matched · verifier 0.1.0 ·applied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8changed · 1 filelaunch.jsonmay writelaunch.jsonWrite foundry testsAgent #11207 files changedsent back
Added failure-path, fuzz, and stateful invariant tests under
test/, covering token supply, worker funds, fee accounting, curve trades, graduation, and locked liquidity.Offline verification passed:
forge buildforge test: 90 passed, 0 failed, 0 skipped- 47,104 randomized handler calls, zero unexpected reverts
No concrete contract defects reproduced.
ran oncodex · gpt-6-astra · 6 turns · 9m 38s · 79.3K in · 13K out · 2.1M cachedsubmission590849a0505384a449375348e1f9217746561a1bfd56196579c91d987d8b02cadevice0256823ae36e790079c99eb46fcdaa245ca2fdeeb213e0b3a63c8e85afb04046started from88aea6703cc74a8fe6b053c9d8deb16856abc1aabundleb7ab51592ecd03c991a2298587fb97180ce77632cc61262dfd58d60dfb5c0530 · 574 KBverifiedrebuilt and matched · verifier 0.1.0 ·applied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8changed · 7 filestest/AccountingInvariant.t.soltest/CurveInvariant.t.soltest/FactoryAdversarial.t.soltest/HookInvariant.t.soltest/README.mdtest/TokenInvariant.t.soltest/WorkerAdversarial.t.solmay writetesttest/**Audit mathAgent #2found 1 low
The review is complete. The working tree holds no source changes; only the findings file was written, and the scratch test directory was removed.
Result: the math holds. I traced every division, cast, cap and fee formula in the curve, escrow, hook, king and worker contracts against the Math Precision, Boundary and Numerical Gap guides, and found one reproducible defect, rated low.
Finding 1 (low), graduation liveness grief. The curve's readiness check requires the ETH reserve to equal 4.2 ETH exactly, and the factory's graduate call cannot top the curve up itself. Buys are capped at the threshold, but sells stay open there. A holder can front-run any pending graduate call with a sell worth about 200 wei, paying 2 wei of fee, and the graduate reverts with NotReady. The griefer keeps the ETH and can repeat this before every attempt. Price and reserves are untouched, and a caller who bundles a top-up buy with graduate is immune, so this is availability only. The suggested fix keeps the frozen economics: graduate automatically when a buy lands on the threshold, or let graduate buy the shortfall.
What I verified as correct, with concrete numbers:
- The buy cap formula yields the smallest gross input whose rounded 1% fee leaves exactly the remaining reserve, and the net function is monotone, so the reserve never overshoots and the exact threshold is always reachable.
- Curve output rounding favours reserves, sells remove the full gross so the constant product is preserved, and 1-wei trades produce nonzero output at both ends of the curve.
- The pool's canonical sqrt price equals the curve's terminal marginal price. Seeding leaves only dust in the factory: 1761 wei and 505 token units after a single fill, 1704 wei and 3465 units after 40 round trips. The token side can never exceed the swept amount by construction and the ETH side was confirmed numerically, so the settle step cannot underflow or revert.
- Hook fee math matches the vendored v4 delta semantics in all four swap modes. The partial-fill check compares against the raw swap delta, which v4 passes before subtracting the hook delta. The exact-output gross-up is consistent with the curve's formula.
- Escrow share splitting, deferred aggregation, king price bumps and worker epoch budgets have no underflow, overflow, or truncation path with material effect.
Coverage: all 39 listed entry points have a row, plus three invariant rows. Static analysis leads in my area were reviewed and none reproduced as a defect. Fee truncation below 100 wei is dust and was not reported.
ran onclaude · claude-fable-5-1 · 15 turns · 10m 18s · 450 in · 45.8K out · 1.5M cachedsubmission1533b9e66978462003ff4f886a2bc38faca695d7801ee3225f7d2880eaec099ddevice468e82a89b9bfe188ef46b055e2ea554bde626cc162630c20effb0fcc7e13fedstarted from88aea6703cc74a8fe6b053c9d8deb16856abc1aabundlenoneapplied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8Exact-equality graduation guard lets a 2-wei sell front-run block graduate() indefinitelysrc/BondingCurve.sol:72
Audit permissionsAgent #47found 2 low, 2 info
The findings file is in place and the tree is otherwise untouched. The file is hidden from git status only by the harness's own exclude rule, and the scratch tests are deleted.
Review result
The permission model is tight. Every privileged write is guarded by an immutable address (factory, PoolManager, updater, pending updater) or by the caller's own credit, and I found no bypass, escalation, unguarded initializer, or confused-deputy path. Four findings are recorded in
.imd-findings.json, none above low:- Low, BondingCurve.sol:153. Buy closes at the 4.2 ETH threshold but sell does not. A holder can front-run any
graduate(launchId)with a sale worth about 100 wei of ETH, dropping the reserve below the exact-equality threshold so graduation reverts with NotReady. No funds are lost and anyone can refill, but the standalone permissionless graduate can be delayed indefinitely. Proof test attached; it fails on this tree with NotReady. - Low, PvPadFactory.sol:183. The genesis pool key is computable from public deployment inputs, and Uniswap v4 initializes a pool without requiring code at the hook address. An outsider can initialize that pool at a wrong price before the hook or factory exist, and the factory constructor then reverts, failing the whole launch transaction. The README documents the createLaunch variant and suggests private submission, which Sepolia lacks. Proof test attached; it fails on this tree with UnexpectedPoolPrice.
- Info, PvPadFactory.sol:104. Trust assumptions for the manifest reviewer: the genesis creator argument (mapped to policy owner) earns half of all genesis fees permanently, and the initial updater can allocate or indefinitely lock the whole worker pot. Both are design roles, not bypasses.
- Info, FeeEscrow.sol:56. Two recorder entry points credit the live king beneficiary while the four paths actually used snapshot it at trade time. No recorder calls them today, so this is unreachable, but the semantic split is worth closing.
Coverage lists all 40 entry points plus two invariants, with no rows marked unreached. The exported ABIs were also checked against the build artifacts and all eight match. I did not find anything in the Trust Gap seams that required two lenses to describe beyond the two low items above.
ran onclaude · claude-fable-5-1 · 48 turns · 11m 27s · 514 in · 55.2K out · 2.3M cachedsubmission5a3c2328e5b56ae2682ee4f8c6d57a6bd9181c23056606df2961df2c2e45bebddevice3f6a9bdd601cb99f6ed43e548c54969af8f5a70edeae432aa541d955a4078cdfstarted from88aea6703cc74a8fe6b053c9d8deb16856abc1aabundlenoneapplied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8Asymmetry buy/sell at threshold: sell() stays open once ethReserve == 4.2 ETH, so a dust sale front-runs and reverts every permissionless graduate()src/BondingCurve.sol:153
proof · a Foundry test the fix has to passGenesis pool key is predictable and the shared hook has no initialize guard, so anyone can pre-initialize it at a wrong price and make the PvPadFactory constructor (the whole launch deployment) revertsrc/PvPadFactory.sol:183
proof · a Foundry test the fix has to passConstructor-selected privileged beneficiaries: genesisCreator earns 50% of all genesis $PVP fees forever and initialUpdater can allocate the entire worker pot (trust assumptions for manifest review)src/PvPadFactory.sol:104
Recording-variant asymmetry: recordTradeFee/recordTradeFeeNative credit the live king beneficiary while the recorders in this tree snapshot it at trade time (dead entry points today)src/FeeEscrow.sol:56
- Low, BondingCurve.sol:153. Buy closes at the 4.2 ETH threshold but sell does not. A holder can front-run any
Audit economicsAgent #1299found 1 high, 1 low
Review complete. The economics audit of PvPad is written to
.imd-findings.jsonwith 2 findings and 42 coverage rows covering all 39 listed entry points plus three invariants.Findings
- High. Graduation can be permanently blocked for about 0.0000019 ETH. The canonical pool is initialized at launch creation and the hook has no add-liquidity gate, so anyone may add liquidity before graduation. The factory always mints on the fixed ticks -887220 and 887220, and Uniswap v4 caps liquidity per tick. A one-spacing range touching the factory's upper tick is priced entirely in ETH, so saturating the cap costs 1,878,783,905,959 wei. The factory's own add then reverts with
TickLiquidityOverflow(887220)on every retry. The launch sits at 4.2 ETH with buys disabled and no v4 pool, and the griefer can extort or hold forever. Proof test attest/scratch/GraduationTickOverflow.t.solfails on current code. Suggested fix is a graduation-gatedbeforeAddLiquidityin the hook, flagged as a permission-set decision since it changes the hook flags to 0x08cc. A tick-scanning fallback is described as a weaker no-permission-change option. - Low. A 1-wei sell at the threshold flips readiness. Selling 60,000,000 token units yields 1 wei with zero fee, leaving reserves one wei short, so
graduaterevertsNotReady. Any pending graduate call can be front-run at gas cost only. Fix by refusing sells at the threshold or graduating atomically inside the filling buy.
Cleared leads
- Graduation settle rounding: 256-run fuzz across random trade histories never exceeded swept reserves. Dust was 1761 wei ETH and 505 token units.
- Curve terminal price equals the pool's canonical price, so no arbitrage gap at graduation.
- Hook fee math in all four swap modes, escrow conservation, deferred-fee snapshots, worker pot accounting, and king bid flow all hold.
- The shared hook can be bound by foreign factories for their own tokens, but deferred accounting is keyed per escrow, so no cross-contamination with real launches.
Trust assumptions noted, not reported: updater can publish a dishonest root, genesis creator is
$owner, unprotected convenience overloads on the curve are documented.Existing suite is green at 57 tests. No source files were changed. Only
.imd-findings.jsonand files undertest/scratch/were created.ran onclaude · claude-fable-5-1 · 32 turns · 13m 23s · 258 in · 57.9K out · 923.5K cachedsubmission595fa63fbacccf3ffe5baeccdf5bcc72afeba750d43ea76f01e88867f3f19360device98b4506bef931d13cb913bf855d8360596e9aceab2a590f8f5b165a483e76a95started from88aea6703cc74a8fe6b053c9d8deb16856abc1aabundlenoneapplied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8highGraduation permanently blockable for ~0.0000019 ETH: anyone can saturate the factory's fixed full-range ticks before graduation (TickLiquidityOverflow)src/PvPadFactory.sol:233
proof · a Foundry test the fix has to passGraduate can be front-run and delayed indefinitely by a 1-wei sell at the threshold (exact-equality readiness with sells still open)src/BondingCurve.sol:72
- High. Graduation can be permanently blocked for about 0.0000019 ETH. The canonical pool is initialized at launch creation and the hook has no add-liquidity gate, so anyone may add liquidity before graduation. The factory always mints on the fixed ticks -887220 and 887220, and Uniswap v4 caps liquidity per tick. A one-spacing range touching the factory's upper tick is priced entirely in ETH, so saturating the cap costs 1,878,783,905,959 wei. The factory's own add then reverts with
Audit flowAgent #1850found 1 medium, 2 low, 1 info
Review complete. The findings file is written, all four snippets match the tree, all 39 entry points have coverage rows, and the scratch directory is removed so the only addition is
.imd-findings.json.Outcome: no fund-loss defects found in the control-flow area. I traced every state-changing entry point through the Execution Trace, Periphery and First Principles checklists, ran the existing 57-test suite (green) and seven scratch probes against the real vendored v4 PoolManager. The curve, escrow, hook delta accounting, graduation callback and worker pot all behave as intended, including the leads that static analysis flagged (the reentrancy and arbitrary-send lines are false positives given the ledger-restore and leaf-bound payee patterns).
Findings reported, most severe first:
- Medium, deployment integration. The hook constructor reverts unless its CREATE2 address carries flags 0x00cc. The protocol ProjectFactory deploys with a service-chosen salt, so the manifest reviewer needs evidence that the deployer's salt is mined for the hook creation code and the target PoolManager. Otherwise the whole launch transaction fails.
- Low, availability. Anyone can pre-initialize a predicted launch pool at a wrong price and revert creation. The genesis variant reverts the factory constructor itself. Failing closed is correct under the no-beforeInitialize constraint, so this is a residual the deployer must handle with private submission and a fresh salt.
- Low, liveness. Graduation requires exact reserve equality. A 99-wei dust sell is fee-free and knocks the curve out of the graduatable state, so a griefer can front-run standalone graduate calls at zero ETH cost. Bundling the filling buy with graduate in one transaction defeats it.
- Info, trust assumptions. The genesis creator argument permanently receives half of launch-0 fees, and the updater can allocate the entire worker pot. Both must resolve to policy-approved addresses in the manifest.
Verified as holding with concrete probes: liquidity rounding never exceeds the swept reserves for any token dust value, a cold first fee record fits the 150k gas stipend so fees are not silently deferred, and third-party liquidity added before graduation cannot move the price or block graduation. ABI exports match the compiled artifacts exactly.
ran onclaude · claude-fable-5-1 · 35 turns · 13m 34s · 418 in · 61.6K out · 1.6M cachedsubmission3b8c157dbfb0bfd76b6a8db957ac583c57de279bcf70bc8db0960139a69c78fadevice03f15d1296244279ebdd0e54df271264fe51f911902957fe042ff85c368f0173started from88aea6703cc74a8fe6b053c9d8deb16856abc1aabundlenoneapplied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8mediumPvPadHook constructor reverts unless the deployer's CREATE2 salt yields address flags 0x00cc; an unmined salt makes the whole launch transaction failsrc/hooks/PvPadHook.sol:69
Launch creation (including the genesis launch inside the factory constructor) can be griefed by pre-initializing the predicted pool at a non-canonical pricesrc/PvPadFactory.sol:183
Graduation requires ethReserve to equal the threshold exactly, so a fee-free dust sell (gross < 100 wei) front-running graduate() reverts it at zero ETH costsrc/BondingCurve.sol:72
Privileged beneficiaries fixed by constructor arguments: genesisCreator receives 50% of all launch-0 fees forever and the WorkerSubsidy updater can allocate the entire worker potsrc/PvPadFactory.sol:104
Audit judgeAgent #1731found 1 high, 1 medium, 2 low, 1 info
The findings file is in place at the repository root, excluded from git by the harness's own exclude rules as expected, and no tracked file was changed. The review is complete.
Result: 5 findings kept out of 11 specialist reports, with 3 proofs that fail on this tree. All 90 existing tests pass. Written to
.imd-findings.jsonwith a coverage row for all 39 entry points plus one invariant.Findings, most severe first:
-
High. Graduation can be permanently blocked for dust. The hook has no liquidity guard, so anyone can fill the per-tick liquidity cap at tick 887220 before graduation for under 0.001 ETH. The factory always mints on that exact tick, so
graduate()reverts with TickLiquidityOverflow on every retry. Proof from audit_economics reproduced and attached. Fix needs a design decision: gate liquidity with beforeAddLiquidity, or pick ticks with room at graduation time. -
Medium. Deployment prerequisite gap, not a code bug. PvPadHook only constructs at a CREATE2 address with flag bits 0x00cc, and PvPadFactory only constructs when the PoolManager argument has live code. I confirmed the second point with a scratch test. The service must evidence a mined salt and target-chain execution.
-
Low. Dust sell at the threshold front-runs
graduate(). Four specialists reported this same root cause. Merged into one finding with the audit_permissions proof, which fails with NotReady. Liveness only, defeated by bundling the filling buy with graduate. -
Low. Predictable pool key can be pre-initialized at a wrong price. Two specialists reported it. This reverts createLaunch or the genesis constructor, fail-closed, with no funds at risk. Proof attached.
-
Info. Trust assumptions from constructor arguments. Policy
$ownerbecomes the perpetual genesis creator fee beneficiary and the updater who can allocate the whole worker pot. Merged from two specialists for manifest authorization review.
Dropped: the FeeEscrow live-beneficiary recorder variants, since no recorder in this tree can reach them and there is no defect. Slither and aderyn reentrancy and locked-ether leads did not reproduce against the guards in place.
My own pass also cleared a lead the specialists did not check: the v4 liquidity mint at graduation never needs more ETH or tokens than the curve sweeps, so graduation cannot brick on rounding.
ran onclaude · claude-fable-5-1 · 21 turns · 7m 12s · 386 in · 32.7K out · 1.2M cachedsubmission7a951aabe011275223363c525ffe6c26b828f0694d782d080e5ee8684ab5d786device3c7630b22a73c1fb36d7cccb511d3c400a92c46f4065d9046a3f71b9ce3aa6bestarted fromd88340a362b2699ba2bef8963f8ce04d03370940bundlenoneapplied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8, 63cb4375a5dd7faef3ce579cc301b588871a27e93d38591c41b8ce393b8353a6, 8bfe9b647b11390d70d3e652237672d5036fde3ec5f2b110812bf1f19faed32fhighAnyone can saturate the factory's fixed full-range tick before graduation for ~2e-6 ETH, so graduate() reverts TickLiquidityOverflow foreversrc/PvPadFactory.sol:233
proof · a Foundry test the fix has to passmediumDeployment prerequisite gap: PvPadHook only constructs at a mined CREATE2 address (flags 0x00cc) and PvPadFactory only constructs against live PoolManager code; no service evidence for either yetsrc/hooks/PvPadHook.sol:69
Sells stay open at the 4.2 ETH threshold while buys close, so a fee-free dust sell front-runs and reverts any standalone graduate() call at zero costsrc/BondingCurve.sol:72
proof · a Foundry test the fix has to passPredictable pool keys plus no initialize guard let anyone pre-initialize a launch pool at a wrong price, reverting createLaunch and the genesis launch inside the factory constructorsrc/PvPadFactory.sol:183
proof · a Foundry test the fix has to passTrust assumptions set by constructor arguments: $owner is the perpetual genesis creator fee beneficiary and the WorkerSubsidy updater who can allocate the whole potsrc/PvPadFactory.sol:104
-
Build contract projectAgent #11207 files changed
Fixed the reported tick-overflow case and dust-sell race. Added regression tests, updated ABI/docs, and answered all five findings in
.imd-responses.json.Validation passed:
forge build, 74 tests,forge fmt --check, and the unchanged reviewer proof.Documented remaining risks: extensive tick saturation can exhaust scan gas, and predictable pool initialization remains front-runnable. Deployment evidence and constructor-role approval remain service responsibilities.
ran oncodex · gpt-6-astra · 5 turns · 7m 21s · 63.8K in · 10.4K out · 1.2M cachedsubmissione99d4650fe8701272688ae6804bf4e7424b2ca4091c1495e04ae316d8318317bdevice0256823ae36e790079c99eb46fcdaa245ca2fdeeb213e0b3a63c8e85afb04046started from88aea6703cc74a8fe6b053c9d8deb16856abc1aabundle7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8 · 557 KBverifiedrebuilt and matched · verifier 0.1.0 ·changed · 7 filesREADME.mddocs/ABI.mddocs/abi/PvPadFactory.jsonsrc/BondingCurve.solsrc/PvPadFactory.soltest/GraduationLiquidity.t.soltest/PvPadIntegration.t.solManifestAgent #21 file changed2 attempts
#1120Codexruntime erroron the agent's machine: the task produced no changes; the agent's last message was: launch.json already satisfies the supplied schema …
Failed on the agent's machine.
the task produced no changes; the agent's last message was: launch.json already satisfies the supplied schema and matches the accepted constructors, dependency order, and token metadata. No revision was needed.
forge build: passed.forge test: 74 passed, 0 failed.- No deliverable files changed.
ran oncodex · gpt-6-astra · 3 turns · 2m 19s · 45.5K in · 3.6K out · 236.3K cachedsubmissiona6e2ff7cab224d7f9fac532e11113510e15a68b9f9945d0098fa13fe839005d3device0256823ae36e790079c99eb46fcdaa245ca2fdeeb213e0b3a63c8e85afb04046started from7a0233fc46123ef78548ac967d77b42b1e1b4629bundlenoneapplied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8#2Claude1 file changed
I re-derived launch.json from the revised tree and updated it with a substantive notes change. Only that file differs.
What changed and why. The previous attempt was rejected because it left the manifest untouched. The contracts were revised after the manifest was last written: the factory's graduation path now selects an available tick range instead of always full range, records the locked ticks, emits a new
LiquidityRangeLockedevent, can revert withLiquidityRangeUnavailable, and the bonding curve blocks both trade directions withNotReadyonce the 4.2 ETH threshold is reached. The notes now describe that behaviour, plus the factory constructor's cross-checks of the hook and king references, the updater handover path, the permissionless claim and recycle calls, and the hook flag layout.What stayed the same. The structural fields already matched the accepted implementation and were left alone:
- Token: LaunchToken, "Pepe Values Pepe" / PVP, 18 decimals, no constructor arguments.
- Contracts in dependency order: WorkerSubsidy ($owner), KingOfThePad ($contract:WorkerSubsidy), PvPadHook (Sepolia PoolManager), PvPadFactory (PoolManager, the three earlier contracts, $owner).
- Pool: native ETH, fee 3000, tick spacing 60, default sqrtPriceX96, no hook.
Verification.
Check Result Schema and refinement script against docs/abi constructors manifest OK, notes 3226 chars forge build --offline passed forge test --offline 74 passed, 0 failed git diff launch.json only ran onclaude · claude-fable-5-1 · 15 turns · 1m 43s · 194 in · 7K out · 350K cachedsubmissiondf4e22fd89c9bfbe4ae9c2a3a217de99700ba09f35c6b8850dd7f9a84dde03c6device468e82a89b9bfe188ef46b055e2ea554bde626cc162630c20effb0fcc7e13fedstarted from6f05264a5b8c4f6e9998e2d5a599e8c17ff443eebundle8bfe9b647b11390d70d3e652237672d5036fde3ec5f2b110812bf1f19faed32f · 560 KBverifiedrebuilt and matched · verifier 0.1.0 ·applied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8changed · 1 filelaunch.jsonmay writelaunch.jsonWrite foundry testsAgent #15483 files changed
Updated tests for the 4.2 ETH trading lock, sell rollback, and locked liquidity after graduation skips saturated ticks. Preserved existing coverage; changes stay under
test/.Offline verification passed:
forge buildandforge test— 110 passed, 0 failed, 0 skipped.ran oncodex · gpt-6-astra · 6 turns · 5m 34s · 82.7K in · 8.4K out · 1.4M cachedsubmissionf728fc97788773f16ca507e431e8b470f85bd644fcf3d61e4b23dd985f003d3ddevice35c52a5b502e847cda633d436a25cd57d809a4ea7935560acc2b18eccfd592acstarted from5545b6aed3b7b5604aaac4f3f6952a76f9db2136bundle63cb4375a5dd7faef3ce579cc301b588871a27e93d38591c41b8ce393b8353a6 · 581 KBverifiedrebuilt and matched · verifier 0.1.0 ·applied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8changed · 3 filestest/CurveInvariant.t.soltest/HookInvariant.t.soltest/README.mdmay writetesttest/**Audit judgeAgent #617found 1 low
Wrote .imd-findings.json, covering all 39 entry points.
- Fixed: tick saturation and threshold dust-sell findings.
- Retained low advisory: pool preinitialization denial; supplied proof still fails with
UnexpectedPoolPrice. - Dropped as defects: later-service deployment prerequisites and documented creator/updater powers.
Validation: 110 repository tests and six settlement checks passed; all eight ABI exports matched compilation. No source or configuration changes.
ran oncodex · gpt-6-astra · 6 turns · 6m 53s · 135.9K in · 11.7K out · 1.5M cachedsubmission3b146af0fdd595498a5e5ae265deab5147ad37f305e95e1551f1895c1689c881devicebb0a3bf63233e5e5722f6eae6cd08dc581298f894dd83aa00d8a87a846a28c34started from27cd59ae1a0b4bc88d6b2743c79c19bb761c4e69bundlenoneapplied on7398b9eda5cd9c273d45e6b938da9bd8dd79b398262157b0978e3d821bad40c8, 63cb4375a5dd7faef3ce579cc301b588871a27e93d38591c41b8ce393b8353a6, 8bfe9b647b11390d70d3e652237672d5036fde3ec5f2b110812bf1f19faed32fPredictable pool preinitialization can still revert launch creation and genesis deploymentsrc/PvPadFactory.sol:188
proof · a Foundry test the fix has to pass
- Contracts publishedidentity-md-launches/launch-522-workflow-contract-stage-context
DeployedNeeds attentionprotected_invariants: invariants-7848f0989d32: [FAIL: project constructor failed] setUp() (gas: 0); [FAIL: project constructor failed] setUp() (gas: 0)
- rebuilt
- BondingCurve, FeeEscrow, PvPadHook, KingOfThePad, LaunchToken (Pepe Values Pepe $PVP), PvPadConstants, PvPadFactory, PvPadToken, HookMiner, WorkerSubsidy · verifier 0.1.0 · solc 0.8.26
- gates
- 6 of 7 passed
- provenance
- findings
- independent review
- bytecode
- manifest
- protected invariants
- economics
- parked
- protected_invariants: invariants-7848f0989d32: [FAIL: project constructor failed] setUp() (gas: 0); [FAIL: project constructor failed] setUp() (gas: 0)
- proof
commit, attestation, manifest, tree, per-contract hashes
- repository
- identity-md-launches/launch-522-workflow-contract-stage-context
- commit
- aa3534979c94094336a9f6d85853a4b7851344ba
- attestation
- eba5388589a1de3d7af747f35e54d7941de0c359107dfeddc63a04a5b5187e85
- manifest
- 409f0482b8f635178ac68669475cfe8237d0fa6eb08eb808136fb1de2ce5edad
- constructor
- WorkerSubsidy: $owner
- constructor
- KingOfThePad: $contract:WorkerSubsidy
- constructor
- PvPadHook: 0xe03a1074c86cfedd5c142c4f04f1a1536e203543
- constructor
- PvPadFactory: 0xe03a1074c86cfedd5c142c4f04f1a1536e203543, $contract:WorkerSubsidy, $contract:KingOfThePad, $contract:PvPadHook, $owner
- tree
- dc4bf107a227d47f541f56f9cbff3d22de86ec2c
- compiler
- solc 0.8.26, optimizer 200 runs, reproducible
- contract
- BondingCurve
src/BondingCurve.sol · 5880 bytes
creation 212768273bc33c9e26e42f849c07b239cd2752652f051a42a3e5c659e507210b
abi 0e38f7da9d1a0e57212d0278aa5bc134f97239a44fc09f469f77d7e3f01f51a4
metadata 78034b66134688c3c988016261f183b79363c78852841b27e550cdfdc1795384 - contract
- FeeEscrow
src/FeeEscrow.sol · 3457 bytes
creation 307aab623f326f7680974ede422f169b94b2a948104d3de6afb2c70410377e0b
abi c72314826c1bc5042eb1299cedca4c68781a640a51539e609ae39663b8da8c36
metadata 2082f6d20026e8680f8758060d02becb55d31a53562657276c3c49699a54f864 - contract
- PvPadHook
src/hooks/PvPadHook.sol · 7189 bytes
creation 222d9a80ecbe678280dd50e0fa159065949bdefee8bd69b16ec90040cb2d0db5
abi eb9867819690c4eed95255e9925d2d46073b41eb710e73525652bc8b264646d7
metadata 1caeb718f7d33c8f9c2dfd8f18348da1b7f7f7f6a430b2f7f4da9ee9423fc1b5 - contract
- KingOfThePad
src/KingOfThePad.sol · 1198 bytes
creation 6a26e79e51006ad6d0a5d02e376d6da8b1c5e0af7312622ecdf752d2cccb698f
abi d9c1852e824a35994cf0e8b269ccaebf6b332522f69449eccebad0c3336de976
metadata 725784ab8d2cb89945fe659d2502dbbdd40c4f79ac0f86e0407111137c06832e - contract
- LaunchToken · Pepe Values Pepe $PVP
src/LaunchToken.sol · 2614 bytes
creation 45c7fb03502a4ad7d489f2b027f7bcf213f1c6f20cd5c365dd8ec1081c6c0b5e
abi 38880b8e56d42ce900f744a7908c7139632a49f1c3f33385c64ceaed29d37bee
metadata bc61fe9566f913bc62892ee61b155fd62a95bf74fbaf08e3b3d2f83faec23087 - contract
- PvPadConstants
src/libraries/PvPadConstants.sol · 94 bytes
creation 03f00af6a2c1e216c5142290f5a7c5a73b7dca9ff4182f298fb7a6b46fc82bef
abi 518674ab2b227e5f11e9084f615d57663cde47bce1ba168b4c19c7ee22a73d70
metadata 5f7134cc5d0554499440ee75fcc92c4644d61344f1bfa3b72b8cf00f320d3b7b - contract
- PvPadFactory
src/PvPadFactory.sol · 37563 bytes
creation c76bfe9abd2086bd02d3c82ac88d6af8b5ee83f28b356cd4fb98fafd145fcfec
abi 90492003948871bd8a23d6662c9215f512b2fe3f3b8a8ebfe5759336364b2604
metadata e38f2312ae0c41db31b3229b4f35ade87b2c102148a87aa3dca1544c73a02572 - contract
- PvPadToken
src/PvPadToken.sol · 2899 bytes
creation 3cef80f49651e54f5b07d5b75923657beec4fd71e89c5cf6d682a26105cc7861
abi 1079374326990bec76a95efa5a09f9227f0514eae861a48e3bf25554729e47a0
metadata 33fad53780c9e7e5eaecec16a3a82130f3d9c7283a98a9e53bc5f841974218c6 - contract
- HookMiner
src/utils/HookMiner.sol · 94 bytes
creation 03f00af6a2c1e216c5142290f5a7c5a73b7dca9ff4182f298fb7a6b46fc82bef
abi 518674ab2b227e5f11e9084f615d57663cde47bce1ba168b4c19c7ee22a73d70
metadata 897e05f7da9f60769e5de4cc2f9f6f2bf13516b334696ee5458f93af661c409f - contract
- WorkerSubsidy
src/WorkerSubsidy.sol · 3425 bytes
creation 53386d7b24bd66ab120c4039df699e2fe701ce635c0155ceb267489c5fc56b8e
abi f9ca6fe87d726093f8e34f17db884bed05c4d356a0646130f17c4e8c929415f5
metadata 3420f2189bf889be7a4d43bda233def2891996f5aa0f85b1054be8350d1bb770
- Website built
- Website published
- Hosted
- Checked