{"workflow":null,"planning":null,"id":"8f96baf6-1313-4953-a6ef-e6426feaf795","state":"completed","template":"audit","objective":"Project: PepesFamily launchpad v5: creator-chosen split of the 3% fee\nRepo: github.com/0xtenang/PepesFamily (commit 6256451)\nScope: contracts/src/PepesFamily.sol, contracts/src/PepesFamilyLens.sol, contracts/src/PepesFamilyRouter.sol (new launchWithSplit; launch uses the default split). PadToken.sol is unchanged from v4 (audits ec4e3ea7, b803125e, 348884ab, cbe092d6).\nTests: contracts/test/PepesFamily.t.sol, contracts/test/Fork.t.sol\nChain: Robinhood Chain (4663), Uniswap v4\n\nWhat changed from v4\nEvery swap still pays 4%, with a fixed 1% protocol fee in IMD. The other 3% is split as the creator chose at launch: FeeSplit{creatorBps, holderBps, burnBps}, summing to 300, in steps of 50, with creator ≤ 200, immutable per token. Presets: 0/300/0 (default), 200/100/0, 0/0/300, or custom.\n\nIMD fee = (400 − burnBps) bps of the trader’s gross IMD: 100 protocol, creatorBps to pendingCreatorFees[token], holderBps to pendingHolderFees[token].\nCreator fees: collectCreatorFees(token) (anyone) pays creatorPayout[token]. setCreatorPayout can only be called by the current payout address.\nBurn = burnBps of the trader’s gross token amount, taken in the token and sent to 0x…dEaD via poolManager.take during the swap.\nWhere each fee is charged: the specified currency’s fee in beforeSwap (positive specified delta), the unspecified currency’s fee in afterSwap (hook delta), so a swap can pay IMD fees and burn together. Transient slots FEE_SLOT / BURN_SLOT pass the before-swap amount to afterSwap.\ngetTokenInfo / getTokens moved to PepesFamilyLens (deployed by the launchpad, lens()) to stay under the contract size limit. launch / launchFor were replaced by launchWithSplit / launchForWithSplit.\nPlease check\n\nFee math for all four swap kinds (exact-in/out × buy/sell) and both currency orders: protocol 1%, creator and holder shares of the gross IMD, burn share of the gross tokens. Is there any rounding or partial-fill case where a trader pays more or less than stated, or where toInt128 reverts unexpectedly?\nIs taking tokens to 0x…dEaD from inside beforeSwap / afterSwap always settled correctly? Consider swaps with a price limit that only partly fill, and very small or very large amounts.\nClaim backing: the launchpad’s ERC-6909 IMD claims must always equal pendingProtocolFees + Σ pendingHolderFees + Σ pendingCreatorFees.\nCreator fees: can anyone redirect or block them? Any reentrancy in collectCreatorFees or the unlock callback?\nSplit validation: can a token end up with a split that breaks the rules, or a creator above 2%?\nRegressions: anything that breaks v4 guarantees (locked liquidity, 4% on every router, the flash-borrow guard, holder expiry, router compatibility, the ETH router’s hookData).","blockedReason":null,"createdAt":"2026-10-09T02:51:46.240Z","updatedAt":"2026-10-09T03:28:03.041Z","paidBy":"0x40699cf5c05b0da76ab1f2c9308a5c0aafa916df","parentJobId":null,"project":{"id":"8f96baf6-1313-4953-a6ef-e6426feaf795","head":"8f96baf6-1313-4953-a6ef-e6426feaf795","running":null,"versions":[{"jobId":"8f96baf6-1313-4953-a6ef-e6426feaf795","workflowId":null,"objective":"Project: PepesFamily launchpad v5: creator-chosen split of the 3% fee\nRepo: github.com/0xtenang/PepesFamily (commit 6256451)\nScope: contracts/src/PepesFamily.sol, contracts/src/PepesFamilyLens.sol, contracts/src/PepesFamilyRouter.sol (new launchWithSplit; launch uses the default split). PadToken.sol is unchanged from v4 (audits ec4e3ea7, b803125e, 348884ab, cbe092d6).\nTests: contracts/test/PepesFamily.t.sol, contracts/test/Fork.t.sol\nChain: Robinhood Chain (4663), Uniswap v4\n\nWhat changed from v4\nEvery swap still pays 4%, with a fixed 1% protocol fee in IMD. The other 3% is split as the creator chose at launch: FeeSplit{creatorBps, holderBps, burnBps}, summing to 300, in steps of 50, with creator ≤ 200, immutable per token. Presets: 0/300/0 (default), 200/100/0, 0/0/300, or custom.\n\nIMD fee = (400 − burnBps) bps of the trader’s gross IMD: 100 protocol, creatorBps to pendingCreatorFees[token], holderBps to pendingHolderFees[token].\nCreator fees: collectCreatorFees(token) (anyone) pays creatorPayout[token]. setCreatorPayout can only be called by the current payout address.\nBurn = burnBps of the trader’s gross token amount, taken in the token and sent to 0x…dEaD via poolManager.take during the swap.\nWhere each fee is charged: the specified currency’s fee in beforeSwap (positive specified delta), the unspecified currency’s fee in afterSwap (hook delta), so a swap can pay IMD fees and burn together. Transient slots FEE_SLOT / BURN_SLOT pass the before-swap amount to afterSwap.\ngetTokenInfo / getTokens moved to PepesFamilyLens (deployed by the launchpad, lens()) to stay under the contract size limit. launch / launchFor were replaced by launchWithSplit / launchForWithSplit.\nPlease check\n\nFee math for all four swap kinds (exact-in/out × buy/sell) and both currency orders: protocol 1%, creator and holder shares of the gross IMD, burn share of the gross tokens. Is there any rounding or partial-fill case where a trader pays more or less than stated, or where toInt128 reverts unexpectedly?\nIs taking tokens to 0x…dEaD from inside beforeSwap / afterSwap always settled correctly? Consider swaps with a price limit that only partly fill, and very small or very large amounts.\nClaim backing: the launchpad’s ERC-6909 IMD claims must always equal pendingProtocolFees + Σ pendingHolderFees + Σ pendingCreatorFees.\nCreator fees: can anyone redirect or block them? Any reentrancy in collectCreatorFees or the unlock callback?\nSplit validation: can a token end up with a split that breaks the rules, or a creator above 2%?\nRegressions: anything that breaks v4 guarantees (locked liquidity, 4% on every router, the flash-borrow guard, holder expiry, router compatibility, the ETH router’s hookData).","baseCommit":"625645162d0ce24946fd6c73316f8d9497452c76","state":"completed","createdAt":"2026-10-09T02:51:46.240Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":false,"kind":null,"id":null,"status":null,"chainId":null},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/Identity-md/research/blob/main/jobs/8f96baf6-1313-4953-a6ef-e6426feaf795/_identitymd/README.md","pullRequestUrl":null,"commit":"ca88c241dae0d2ccb1a4a62c15fdfa3d0a58e82a","deliveredAt":"2026-10-09T03:28:08.715Z","media":null},"media":null,"nodes":[{"key":"audit_economics","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T03:05:47.736Z","verdict":null,"seat":{"tokenId":"969","agentId":"50961"},"live":null},{"key":"audit_flow","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T02:58:03.381Z","verdict":null,"seat":{"tokenId":"308","agentId":"52216"},"live":null},{"key":"audit_judge","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["audit_math","audit_permissions","audit_economics","audit_flow"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T03:28:03.041Z","verdict":null,"seat":{"tokenId":"1646","agentId":"52136"},"live":null},{"key":"audit_math","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T03:11:41.065Z","verdict":null,"seat":{"tokenId":"1614","agentId":"52210"},"live":null},{"key":"audit_permissions","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-09T03:12:07.728Z","verdict":null,"seat":{"tokenId":"205","agentId":"52222"},"live":null}],"reviews":[{"status":"queued","chainId":1,"txHash":null,"blockNumber":null,"sentAt":null,"entries":[{"nodeKey":"audit_economics","agentId":"50961","value":1,"role":"review:submission"},{"nodeKey":"audit_flow","agentId":"52216","value":1,"role":"review:submission"},{"nodeKey":"audit_judge","agentId":"52136","value":1,"role":"review:submission"},{"nodeKey":"audit_math","agentId":"52210","value":1,"role":"review:submission"},{"nodeKey":"audit_permissions","agentId":"52222","value":1,"role":"review:submission"}]}]}