pons-client 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -55,10 +55,10 @@ var factoryAbi = parseAbi([
55
55
  "function transferCreatorFeeRecipient(address token, address newRecipient)",
56
56
  // ── Events ───────────────────────────────────────────────────────────────
57
57
  "event TokenLaunched(address indexed token, address indexed curve, address indexed deployer, address pairToken, uint256 launchConfigId, uint256 graduationThreshold)",
58
- "event LaunchSwept(address indexed token, uint256 sweptQuote, uint256 sweptTokens)",
59
- "event PoolGraduated(address indexed token, address indexed pool)",
60
- "event CreatorFeeRecipientChangeProposed(address indexed token, address indexed newRecipient, uint256 effectiveAt)",
61
- "event CreatorFeeRecipientUpdated(address indexed token, address indexed oldRecipient, address indexed newRecipient)"
58
+ "event LaunchSwept(address indexed token, uint256 quoteOut, uint256 tokenOut)",
59
+ "event PoolGraduated(address indexed token, uint256 positionId, uint256 tokenAmount, uint256 pairTokenAmount)",
60
+ "event CreatorFeeRecipientChangeProposed(address indexed token, address indexed currentRecipient, address indexed newRecipient, uint256 effectiveAt, uint256 expiresAt)",
61
+ "event CreatorFeeRecipientUpdated(address indexed token, address indexed previousRecipient, address indexed newRecipient)"
62
62
  ]);
63
63
  var routerAbi = parseAbi([
64
64
  // ── Structs ──────────────────────────────────────────────────────────────
@@ -276,12 +276,11 @@ var curveAbi = parseAbi([
276
276
  // ── Events ───────────────────────────────────────────────────────────────
277
277
  "event CurveBuy(address indexed buyer, address indexed recipient, uint256 quoteIn, uint256 tokensOut, uint256 fee, uint256 tax)",
278
278
  "event CurveSell(address indexed seller, address indexed recipient, uint256 tokensIn, uint256 quoteOut, uint256 fee, uint256 tax)",
279
- "event CurveBuyRefunded(address indexed buyer, uint256 refundedQuote)",
280
- "event CurveCompleted(address indexed token)",
281
- "event CurveGraduated(address indexed token)",
282
- "event AutoGraduationFailed(address indexed token)",
283
- "event FeesSwept(uint256 quoteFees, uint256 tokenFees, uint256 buybackTokens)",
284
- "event BuybackLocked(address indexed token, uint256 quoteSpent, uint256 tokensLocked)"
279
+ "event CurveBuyRefunded(address indexed buyer, uint256 refund)",
280
+ "event CurveCompleted(address recipient, uint256 quoteOut, uint256 tokenOut)",
281
+ "event AutoGraduationFailed(address indexed token, uint256 gasRemaining)",
282
+ "event FeesSwept(uint256 protocolAmount, uint256 buybackAmount, uint256 creatorAmount)",
283
+ "event BuybackLocked(uint256 quoteSpent, uint256 tokensLocked)"
285
284
  ]);
286
285
 
287
286
  // src/utils/math.ts
@@ -494,10 +493,10 @@ var hookAbi = parseAbi([
494
493
  "function pendingFees(bytes32 poolId, address currency) view returns (uint256)",
495
494
  "function pendingCreatorTax(bytes32 poolId, address currency) view returns (uint256)",
496
495
  // ── Events ───────────────────────────────────────────────────────────────
497
- "event PoolRegistered(bytes32 indexed poolId, address indexed token, address indexed quoteToken)",
498
- "event PoolFeesSwept(bytes32 indexed poolId, uint256 quoteFees, uint256 tokenFees, uint256 buybackTokens)",
499
- "event PoolConversionSkipped(bytes32 indexed poolId, string reason)",
500
- "event PoolBuybackSkipped(bytes32 indexed poolId, string reason)"
496
+ "event PoolRegistered(bytes32 indexed poolId, address memecoin, address quoteToken, address creator)",
497
+ "event PoolFeesSwept(bytes32 indexed poolId, uint256 protocolAmount, uint256 buybackAmount, uint256 creatorAmount, uint256 tokensLocked)",
498
+ "event PoolConversionSkipped(bytes32 indexed poolId, uint256 retainedMemecoin)",
499
+ "event PoolBuybackSkipped(bytes32 indexed poolId, uint256 foldedBackQuote)"
501
500
  ]);
502
501
 
503
502
  // src/modules/pool/index.ts
@@ -554,9 +553,9 @@ var escrowAbi = parseAbi([
554
553
  "function claim()",
555
554
  "function claimToken(address token)",
556
555
  // ── Events ───────────────────────────────────────────────────────────────
557
- "event Credited(address indexed recipient, uint256 amount)",
556
+ "event Credited(address indexed recipient, address indexed depositor, uint256 amount)",
558
557
  "event Claimed(address indexed recipient, uint256 amount)",
559
- "event CreditedToken(address indexed recipient, address indexed token, uint256 amount)",
558
+ "event CreditedToken(address indexed recipient, address indexed token, address indexed depositor, uint256 amount)",
560
559
  "event ClaimedToken(address indexed recipient, address indexed token, uint256 amount)"
561
560
  ]);
562
561
 
@@ -653,8 +652,8 @@ var vaultAbi = parseAbi([
653
652
  // ── Write Functions ──────────────────────────────────────────────────────
654
653
  "function release(address token) returns (uint256 released)",
655
654
  // ── Events ───────────────────────────────────────────────────────────────
656
- "event Locked(address indexed token, uint256 amount, uint256 vestingStart)",
657
- "event Released(address indexed token, address indexed recipient, uint256 amount)"
655
+ "event Locked(address indexed token, address indexed depositor, uint256 amount, uint256 newVestingStart)",
656
+ "event Released(address indexed token, uint256 creatorAmount, uint256 protocolAmount)"
658
657
  ]);
659
658
 
660
659
  // src/modules/buyback/index.ts
@@ -792,15 +791,17 @@ function createEventsModule(publicClient, addresses) {
792
791
  const logs = await publicClient.getLogs({
793
792
  address: hook,
794
793
  event: parseAbiItem(
795
- "event PoolFeesSwept(bytes32 indexed poolId, uint256 quoteFees, uint256 tokenFees, uint256 buybackTokens)"
794
+ "event PoolFeesSwept(bytes32 indexed poolId, uint256 protocolAmount, uint256 buybackAmount, uint256 creatorAmount, uint256 tokensLocked)"
796
795
  ),
797
796
  fromBlock,
798
797
  toBlock
799
798
  });
800
799
  return logs.map((log) => ({
801
800
  poolId: log.args.poolId,
802
- quoteFees: log.args.quoteFees,
803
- tokenFees: log.args.tokenFees,
801
+ protocolAmount: log.args.protocolAmount,
802
+ buybackAmount: log.args.buybackAmount,
803
+ creatorAmount: log.args.creatorAmount,
804
+ tokensLocked: log.args.tokensLocked,
804
805
  blockNumber: log.blockNumber,
805
806
  transactionHash: log.transactionHash
806
807
  }));
@@ -809,15 +810,17 @@ function createEventsModule(publicClient, addresses) {
809
810
  const logs = await publicClient.getLogs({
810
811
  address: addresses.factory,
811
812
  event: parseAbiItem(
812
- "event CreatorFeeRecipientChangeProposed(address indexed token, address indexed newRecipient, uint256 effectiveAt)"
813
+ "event CreatorFeeRecipientChangeProposed(address indexed token, address indexed currentRecipient, address indexed newRecipient, uint256 effectiveAt, uint256 expiresAt)"
813
814
  ),
814
815
  fromBlock,
815
816
  toBlock
816
817
  });
817
818
  return logs.map((log) => ({
818
819
  token: log.args.token,
820
+ currentRecipient: log.args.currentRecipient,
819
821
  newRecipient: log.args.newRecipient,
820
822
  effectiveAt: log.args.effectiveAt,
823
+ expiresAt: log.args.expiresAt,
821
824
  blockNumber: log.blockNumber,
822
825
  transactionHash: log.transactionHash
823
826
  }));
@@ -993,8 +996,8 @@ var poolManagerAbi = parseAbi([
993
996
  "function getPool(PoolKey key) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFeesToken0, uint24 protocolFeesToken1, uint24 lpFeesToken0, uint24 lpFeesToken1)",
994
997
  "function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFeesToken0, uint24 protocolFeesToken1, uint24 lpFeesToken0, uint24 lpFeesToken1)",
995
998
  // ── Events ───────────────────────────────────────────────────────────────
996
- "event Swap(bytes32 indexed poolId, address indexed sender, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick)",
997
- "event Initialize(bytes32 indexed poolId, address indexed currency0, address indexed currency1, int24 tickSpacing, address hooks)"
999
+ "event Swap(bytes32 indexed poolId, address indexed sender, int128 amount0, int128 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick, uint24 fee)",
1000
+ "event Initialize(bytes32 indexed poolId, address indexed currency0, address indexed currency1, uint24 fee, int24 tickSpacing, address hooks, uint160 sqrtPriceX96, int24 tick)"
998
1001
  ]);
999
1002
  function normalizeAddress(address) {
1000
1003
  if (!address || address === ZERO_ADDRESS) return ZERO_ADDRESS;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/abis/factory.ts","../src/abis/router.ts","../src/utils/validation.ts","../src/modules/factory/index.ts","../src/abis/curve.ts","../src/utils/math.ts","../src/modules/curve/index.ts","../src/abis/hook.ts","../src/modules/pool/index.ts","../src/abis/escrow.ts","../src/modules/fees/index.ts","../src/abis/vault.ts","../src/modules/buyback/index.ts","../src/modules/events/index.ts","../src/modules/takeover/index.ts","../src/modules/migration/index.ts","../src/client.ts","../src/abis/token.ts","../src/abis/poolManager.ts","../src/utils/formatting.ts"],"names":["parseAbi","isAddress"],"mappings":"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","file":"index.js","sourcesContent":["import { type Address } from \"viem\";\n\n/** Robinhood Chain chain ID */\nexport const ROBINHOOD_CHAIN_ID = 4663 as const;\n\n/** Basis points denominator (100%) */\nexport const BPS = 10_000n as const;\n\n/** Zero address — used for native ETH pair */\nexport const ZERO_ADDRESS: Address = \"0x0000000000000000000000000000000000000000\";\n\n// ── Deployed Contract Addresses (Robinhood Chain) ──────────────────────────\n\nexport const ADDRESSES = {\n factory: \"0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e\" as Address,\n memeHook: \"0xE5e702641Ea86F4ae6cC3cDaeD2B886f976Be044\" as Address,\n feeEscrow: \"0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e\" as Address,\n buybackVault: \"0x42df2a798f82289E177311362e8f5ccC45c1219c\" as Address,\n launchLocker: \"0x267444D099b10fB5Ed7c3Cc7B7c767AdcA574952\" as Address,\n launchAndBuy: \"0xe33E9E479dF8802cb0866d5d05258bEc4cF62948\" as Address,\n launchDeployer: \"0x3711ceA4feaDE896C913C68F01Eda97Cb06D1A42\" as Address,\n graduationExecutor: \"0xC7819B64A1dAECD7eC19856d026cb14EfBd89046\" as Address,\n graduationGuard: \"0xf5695117b99B6f6401e67d4195BD653628176C6C\" as Address,\n} as const;\n\n// ── Launch Phases ──────────────────────────────────────────────────────────\n\nexport const PHASE = {\n NotGraduated: 0,\n Swept: 1,\n PoolCreated: 2,\n Rescued: 3,\n} as const;\n\nexport type Phase = (typeof PHASE)[keyof typeof PHASE];\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\n/** Snipe tax decay window in EVM timestamp seconds (block.timestamp units) */\nexport const SNIPE_TAX_DECAY_SECS = 5n as const;\n\n/**\n * Snipe tax decay window expressed in nanoseconds (5 seconds).\n * @deprecated Use SNIPE_TAX_DECAY_SECS when comparing against block timestamps.\n * This alias preserves its original nanosecond value for backward compatibility.\n */\nexport const SNIPE_TAX_DECAY_NS = 5_000_000_000n as const;\n\n/** Maximum number of snipe tax exemptions per launch */\nexport const MAX_SNIPE_EXEMPTIONS = 32 as const;\n\n/** Buyback vesting duration (5 years in seconds) */\nexport const VESTING_DURATION_SECS = 157_680_000n as const;\n\n/** Migration claim window (90 days in seconds) */\nexport const MIGRATION_CLAIM_WINDOW_SECS = 7_776_000n as const;\n","import { parseAbi } from \"viem\";\n\nexport const factoryAbi = parseAbi([\n // ── Structs ──────────────────────────────────────────────────────────────\n \"struct LaunchConfig { uint256 supply; uint256 curveFeeBps; uint256 phantomQuote; uint256 graduationThreshold; uint24 poolFee; int24 tickSpacing; bool enabled; }\",\n \"struct Socials { string twitter; string telegram; string discord; string website; string farcaster; }\",\n \"struct TokenParams { string name; string symbol; string logo; string description; Socials socials; address creatorFeeRecipient; uint16 creatorTaxBps; bool buybackEnabled; bytes32 expectedEconomics; bytes32 salt; }\",\n \"struct LaunchedToken { address token; address curve; address deployer; address creatorFeeRecipient; address pairToken; uint256 graduationThreshold; uint24 poolFee; int24 tickSpacing; uint16 creatorTaxBps; bool buybackEnabled; uint8 phase; uint256 sweptQuote; uint256 sweptTokens; uint256 sweptAt; bool exists; }\",\n \"struct FeePolicy { address protocolFeeRecipient; uint16 protocolFeeShareBps; uint16 buybackBurnBps; uint16 hookFeeBps; uint16 maxInternalPriceImpactBps; }\",\n\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function launchConfigCount() view returns (uint256)\",\n \"function getLaunchConfig(uint256 id) view returns (LaunchConfig)\",\n \"function getLaunchedToken(address token) view returns (LaunchedToken)\",\n \"function previewLaunchEconomics(uint256 launchConfigId, address pairToken) view returns (bytes32)\",\n \"function launchFee() view returns (uint256)\",\n \"function canLaunch(address launcher) view returns (bool)\",\n \"function maxCreatorTaxBps() view returns (uint16)\",\n \"function approvedPairTokens(address pairToken) view returns (bool)\",\n \"function pairTokenEconomics(address pairToken) view returns (uint256 phantomQuote, uint256 graduationThreshold, uint8 decimals)\",\n \"function getLaunchFeePolicy(address token) view returns (FeePolicy)\",\n \"function pendingCreatorFeeRecipient(address token) view returns (address recipient, uint256 effectiveAt, uint256 expiresAt)\",\n\n // ── Write Functions ──────────────────────────────────────────────────────\n \"function launchToken(TokenParams params, uint256 launchConfigId, address pairToken) payable returns (address token, address curve)\",\n \"function launchToken(TokenParams params, uint256 launchConfigId, address pairToken, address[] snipeTaxExemptions) payable returns (address token, address curve)\",\n \"function createGraduatedPool(address token)\",\n \"function transferCreatorFeeRecipient(address token, address newRecipient)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event TokenLaunched(address indexed token, address indexed curve, address indexed deployer, address pairToken, uint256 launchConfigId, uint256 graduationThreshold)\",\n \"event LaunchSwept(address indexed token, uint256 sweptQuote, uint256 sweptTokens)\",\n \"event PoolGraduated(address indexed token, address indexed pool)\",\n \"event CreatorFeeRecipientChangeProposed(address indexed token, address indexed newRecipient, uint256 effectiveAt)\",\n \"event CreatorFeeRecipientUpdated(address indexed token, address indexed oldRecipient, address indexed newRecipient)\",\n]);\n","import { parseAbi } from \"viem\";\n\nexport const routerAbi = parseAbi([\n // ── Structs ──────────────────────────────────────────────────────────────\n \"struct Socials { string twitter; string telegram; string discord; string website; string farcaster; }\",\n \"struct TokenParams { string name; string symbol; string logo; string description; Socials socials; address creatorFeeRecipient; uint16 creatorTaxBps; bool buybackEnabled; bytes32 expectedEconomics; bytes32 salt; }\",\n\n // ── Write Functions ──────────────────────────────────────────────────────\n \"function launchAndBuy(TokenParams params, uint256 launchConfigId, address pairToken, uint256 quoteIn, uint256 minTokensOut, address recipient, address[] snipeTaxExemptions) payable returns (address token, address curve, uint256 tokensOut)\",\n]);\n","import { type Address, isAddress } from \"viem\";\nimport { BPS, MAX_SNIPE_EXEMPTIONS } from \"../constants.js\";\n\n/**\n * Validate an Ethereum address. Throws if invalid.\n */\nexport function requireValidAddress(address: Address, label: string): void {\n if (!isAddress(address)) {\n throw new Error(`Invalid ${label} address: ${address}`);\n }\n}\n\n/**\n * Validate creator tax is within protocol bounds.\n */\nexport function requireValidCreatorTax(taxBps: number, maxBps: bigint): void {\n if (taxBps < 0) {\n throw new Error(\"Creator tax cannot be negative\");\n }\n if (BigInt(taxBps) > maxBps) {\n throw new Error(`Creator tax ${taxBps} bps exceeds protocol max ${maxBps} bps`);\n }\n}\n\n/**\n * Validate snipe tax exemption list length.\n */\nexport function requireValidExemptions(exemptions: Address[]): void {\n if (exemptions.length > MAX_SNIPE_EXEMPTIONS) {\n throw new Error(\n `Snipe tax exemption list too long: ${exemptions.length} (max ${MAX_SNIPE_EXEMPTIONS})`,\n );\n }\n}\n\n/**\n * Validate that a quote amount is positive.\n */\nexport function requirePositiveAmount(amount: bigint, label: string): void {\n if (amount <= 0n) {\n throw new Error(`${label} must be positive, got ${amount}`);\n }\n}\n\n/**\n * Validate slippage tolerance (0-10000 bps).\n */\nexport function requireValidSlippage(slippageBps: number): void {\n if (slippageBps < 0 || slippageBps > Number(BPS)) {\n throw new Error(`Invalid slippage: ${slippageBps} bps (must be 0-${BPS})`);\n }\n}\n\n/**\n * Compute minimum output from a quoted amount and slippage tolerance.\n */\nexport function minOutputWithSlippage(quoted: bigint, slippageBps: number): bigint {\n const tolerance = (quoted * BigInt(slippageBps)) / BPS;\n return quoted - tolerance;\n}\n","import { type Address, type Hex, type PublicClient } from \"viem\";\nimport { factoryAbi } from \"../../abis/factory.js\";\nimport { routerAbi } from \"../../abis/router.js\";\nimport { ZERO_ADDRESS } from \"../../constants.js\";\nimport type {\n FactoryModule,\n LaunchConfig,\n LaunchConfigWithId,\n LaunchedToken,\n PonsWallet,\n TokenParams,\n} from \"../../types.js\";\nimport {\n requireValidAddress,\n requireValidCreatorTax,\n requireValidExemptions,\n} from \"../../utils/validation.js\";\n\ntype ContractAddresses = { factory: Address; launchAndBuy: Address };\n\nexport function createFactoryModule(\n publicClient: PublicClient,\n wallet: PonsWallet | undefined,\n addresses: ContractAddresses,\n): FactoryModule {\n const read = async <T>(functionName: string, args?: readonly unknown[]): Promise<T> =>\n publicClient.readContract({\n address: addresses.factory,\n abi: factoryAbi,\n functionName: functionName as never,\n args: args as never,\n }) as Promise<T>;\n\n const write = async (\n functionName: string,\n args: readonly unknown[],\n value?: bigint,\n ): Promise<`0x${string}`> => {\n if (!wallet) throw new Error(\"Wallet required for write operations\");\n const { request } = await publicClient.simulateContract({\n address: addresses.factory,\n abi: factoryAbi,\n functionName: functionName as never,\n args: args as never,\n account: wallet.account!,\n value,\n });\n return wallet.writeContract(request);\n };\n\n return {\n async openLaunchConfigs(): Promise<LaunchConfigWithId[]> {\n const count = await read<bigint>(\"launchConfigCount\");\n const configs = await Promise.all(\n Array.from({ length: Number(count) }, (_, id) =>\n read<LaunchConfig>(\"getLaunchConfig\", [BigInt(id)]),\n ),\n );\n return configs\n .map((config, id): LaunchConfigWithId => ({\n id: BigInt(id),\n supply: config.supply,\n curveFeeBps: config.curveFeeBps,\n phantomQuote: config.phantomQuote,\n graduationThreshold: config.graduationThreshold,\n poolFee: config.poolFee,\n tickSpacing: config.tickSpacing,\n enabled: config.enabled,\n }))\n .filter((config) => config.enabled);\n },\n\n async getLaunchConfig(id: bigint): Promise<LaunchConfig> {\n return read<LaunchConfig>(\"getLaunchConfig\", [id]);\n },\n\n async getLaunchedToken(token: Address): Promise<LaunchedToken> {\n return read<LaunchedToken>(\"getLaunchedToken\", [token]);\n },\n\n async previewLaunchEconomics(configId: bigint, pairToken: Address): Promise<Hex> {\n return read<Hex>(\"previewLaunchEconomics\", [configId, pairToken]);\n },\n\n async launchFee(): Promise<bigint> {\n return read<bigint>(\"launchFee\");\n },\n\n async canLaunch(address: Address): Promise<boolean> {\n return read<boolean>(\"canLaunch\", [address]);\n },\n\n async maxCreatorTaxBps(): Promise<bigint> {\n return read<bigint>(\"maxCreatorTaxBps\");\n },\n\n async approvedPairTokens(pairToken: Address): Promise<boolean> {\n return read<boolean>(\"approvedPairTokens\", [pairToken]);\n },\n\n async pairTokenEconomics(pairToken: Address): Promise<{\n phantomQuote: bigint;\n graduationThreshold: bigint;\n decimals: number;\n }> {\n const result = await read<readonly [bigint, bigint, number]>(\"pairTokenEconomics\", [\n pairToken,\n ]);\n return {\n phantomQuote: result[0],\n graduationThreshold: result[1],\n decimals: Number(result[2]),\n };\n },\n\n async launchToken(\n params: TokenParams,\n configId: bigint,\n pairToken: Address,\n snipeTaxExemptions: Address[] = [],\n ): Promise<`0x${string}`> {\n requireValidAddress(pairToken, \"pairToken\");\n requireValidCreatorTax(params.creatorTaxBps, await this.maxCreatorTaxBps());\n requireValidExemptions(snipeTaxExemptions);\n\n const [expectedEconomics, launchFeeAmount] = await Promise.all([\n this.previewLaunchEconomics(configId, pairToken),\n this.launchFee(),\n ]);\n\n // Pin economics to prevent frontrunning\n const pinnedParams: TokenParams = {\n name: params.name,\n symbol: params.symbol,\n logo: params.logo,\n description: params.description,\n socials: params.socials,\n creatorFeeRecipient: params.creatorFeeRecipient,\n creatorTaxBps: params.creatorTaxBps,\n buybackEnabled: params.buybackEnabled,\n expectedEconomics,\n salt: params.salt,\n };\n\n if (snipeTaxExemptions.length > 0) {\n return write(\n \"launchToken\",\n [pinnedParams, configId, pairToken, snipeTaxExemptions],\n launchFeeAmount,\n );\n }\n\n return write(\"launchToken\", [pinnedParams, configId, pairToken], launchFeeAmount);\n },\n\n async launchAndBuy(\n params: TokenParams,\n configId: bigint,\n pairToken: Address,\n quoteIn: bigint,\n minTokensOut: bigint,\n recipient: Address,\n snipeTaxExemptions: Address[] = [],\n ): Promise<{\n hash: `0x${string}`;\n token: Address;\n curve: Address;\n tokensOut: bigint;\n }> {\n requireValidAddress(pairToken, \"pairToken\");\n requireValidAddress(recipient, \"recipient\");\n requireValidCreatorTax(params.creatorTaxBps, await this.maxCreatorTaxBps());\n requireValidExemptions(snipeTaxExemptions);\n\n if (!wallet) throw new Error(\"Wallet required for write operations\");\n\n const [expectedEconomics, launchFeeAmount] = await Promise.all([\n this.previewLaunchEconomics(configId, pairToken),\n this.launchFee(),\n ]);\n\n const pinnedParams: TokenParams = {\n name: params.name,\n symbol: params.symbol,\n logo: params.logo,\n description: params.description,\n socials: params.socials,\n creatorFeeRecipient: params.creatorFeeRecipient,\n creatorTaxBps: params.creatorTaxBps,\n buybackEnabled: params.buybackEnabled,\n expectedEconomics,\n salt: params.salt,\n };\n\n const value = pairToken === ZERO_ADDRESS ? launchFeeAmount + quoteIn : launchFeeAmount;\n\n const { request, result } = await publicClient.simulateContract({\n address: addresses.launchAndBuy,\n abi: routerAbi,\n functionName: \"launchAndBuy\",\n args: [\n pinnedParams,\n configId,\n pairToken,\n quoteIn,\n minTokensOut,\n recipient,\n snipeTaxExemptions,\n ],\n account: wallet.account!,\n value,\n });\n\n const hash = await wallet.writeContract(request);\n\n // Parse result to extract token and curve addresses\n const typedResult = result as unknown as readonly [Address, Address, bigint];\n\n return {\n hash,\n token: typedResult[0],\n curve: typedResult[1],\n tokensOut: typedResult[2],\n };\n },\n };\n}\n","import { parseAbi } from \"viem\";\n\nexport const curveAbi = parseAbi([\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function getReserves() view returns (uint256 quoteReserve, uint256 tokenReserve)\",\n \"function realQuoteReserve() view returns (uint256)\",\n \"function sellableTokens() view returns (uint256)\",\n \"function reservedTokens() view returns (uint256)\",\n \"function graduationThreshold() view returns (uint256)\",\n \"function readyToGraduate() view returns (bool)\",\n \"function graduated() view returns (bool)\",\n \"function feeBps() view returns (uint256)\",\n \"function creatorTaxBps() view returns (uint256)\",\n \"function buybackEnabled() view returns (bool)\",\n \"function isNativeQuote() view returns (bool)\",\n \"function pairToken() view returns (address)\",\n \"function currentSnipeTaxBps(address recipient) view returns (uint256)\",\n \"function quoteFeeBalance() view returns (uint256)\",\n \"function creatorTaxBalance() view returns (uint256)\",\n\n // ── Write Functions ──────────────────────────────────────────────────────\n \"function buy(uint256 quoteIn, uint256 minTokensOut, address recipient) payable returns (uint256 tokensOut)\",\n \"function sell(uint256 tokensIn, uint256 minQuoteOut, address recipient) returns (uint256 quoteOut)\",\n \"function sweepFees(uint256 minBuybackTokensOut)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event CurveBuy(address indexed buyer, address indexed recipient, uint256 quoteIn, uint256 tokensOut, uint256 fee, uint256 tax)\",\n \"event CurveSell(address indexed seller, address indexed recipient, uint256 tokensIn, uint256 quoteOut, uint256 fee, uint256 tax)\",\n \"event CurveBuyRefunded(address indexed buyer, uint256 refundedQuote)\",\n \"event CurveCompleted(address indexed token)\",\n \"event CurveGraduated(address indexed token)\",\n \"event AutoGraduationFailed(address indexed token)\",\n \"event FeesSwept(uint256 quoteFees, uint256 tokenFees, uint256 buybackTokens)\",\n \"event BuybackLocked(address indexed token, uint256 quoteSpent, uint256 tokensLocked)\",\n]);\n","import { BPS } from \"../constants.js\";\n\n/**\n * Ceiling division: ⌈a / b⌉\n */\nexport function ceilDiv(a: bigint, b: bigint): bigint {\n if (b === 0n) throw new Error(\"Division by zero\");\n return (a + b - 1n) / b;\n}\n\n/**\n * Constant product amountOut: given `inAmount` going in, compute how much\n * comes out. No fees applied — caller deducts fees before or after.\n *\n * Formula: out = (in * reserveOut) / (reserveIn + in)\n */\nexport function amountOut(inAmount: bigint, reserveIn: bigint, reserveOut: bigint): bigint {\n if (inAmount === 0n || reserveIn === 0n || reserveOut === 0n) return 0n;\n return (inAmount * reserveOut) / (reserveIn + inAmount);\n}\n\n/**\n * Constant product amountIn: given `outAmount` desired out, compute how much\n * must go in. Includes +1n rounding up.\n *\n * Formula: in = (out * reserveIn) / (reserveOut - out) + 1\n */\nexport function amountIn(outAmount: bigint, reserveIn: bigint, reserveOut: bigint): bigint {\n if (outAmount === 0n || reserveOut === 0n) return 0n;\n if (outAmount >= reserveOut) throw new Error(\"Output exceeds reserve\");\n return (outAmount * reserveIn) / (reserveOut - outAmount) + 1n;\n}\n\n/**\n * Apply a basis-point fee to an amount.\n * Returns the fee amount (not the net).\n */\nexport function applyBps(amount: bigint, bps: bigint): bigint {\n return (amount * bps) / BPS;\n}\n\n/**\n * Subtract a basis-point fee from an amount, returning the net.\n */\nexport function subtractBps(amount: bigint, bps: bigint): bigint {\n return amount - applyBps(amount, bps);\n}\n\n/**\n * Compute the marginal price of one token in the quote asset.\n * Returns a floating-point number for display purposes only.\n */\nexport function marginalPrice(quoteReserve: bigint, tokenReserve: bigint): number {\n if (tokenReserve === 0n) return 0;\n return Number(quoteReserve) / Number(tokenReserve);\n}\n\n/**\n * Compute graduation progress as a fraction (0..1).\n */\nexport function graduationProgress(raised: bigint, threshold: bigint): number {\n if (threshold === 0n) return 0;\n const clamped = raised > threshold ? threshold : raised;\n return Number(clamped) / Number(threshold);\n}\n","import { type Address, type PublicClient, decodeEventLog } from \"viem\";\nimport { curveAbi } from \"../../abis/curve.js\";\nimport { BPS } from \"../../constants.js\";\nimport type {\n BuyQuote,\n BuyResult,\n CurveReserves,\n CurveState,\n CurveModule,\n PonsWallet,\n SellQuote,\n SellResult,\n} from \"../../types.js\";\nimport { ceilDiv, amountOut, amountIn } from \"../../utils/math.js\";\n\ntype ContractAddresses = Record<string, Address>;\n\nexport function createCurveModule(\n publicClient: PublicClient,\n wallet: PonsWallet | undefined,\n _addresses: ContractAddresses,\n): CurveModule {\n const read = async <T>(\n contractAddress: Address,\n functionName: string,\n args?: readonly unknown[],\n ): Promise<T> =>\n publicClient.readContract({\n address: contractAddress,\n abi: curveAbi,\n functionName: functionName as never,\n args: args as never,\n }) as Promise<T>;\n\n const write = async (\n contractAddress: Address,\n functionName: string,\n args: readonly unknown[],\n value?: bigint,\n ): Promise<`0x${string}`> => {\n if (!wallet) throw new Error(\"Wallet required for write operations\");\n const { request } = await publicClient.simulateContract({\n address: contractAddress,\n abi: curveAbi,\n functionName: functionName as never,\n args: args as never,\n account: wallet.account!,\n value,\n });\n return wallet.writeContract(request);\n };\n\n return {\n async buy(\n curve: Address,\n quoteIn: bigint,\n minTokensOut: bigint,\n recipient: Address,\n value?: bigint,\n ): Promise<BuyResult> {\n const isNative = await read<boolean>(curve, \"isNativeQuote\");\n const sendValue = isNative ? quoteIn : (value ?? 0n);\n\n const hash = await write(curve, \"buy\", [quoteIn, minTokensOut, recipient], sendValue);\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n let tokensOut = 0n;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: curveAbi,\n eventName: \"CurveBuy\",\n data: log.data,\n topics: log.topics,\n });\n if (decoded.eventName === \"CurveBuy\") {\n tokensOut = decoded.args.tokensOut;\n break;\n }\n } catch {\n // Not our event, continue\n }\n }\n\n return { tokensOut, hash };\n },\n\n async sell(\n curve: Address,\n tokensIn: bigint,\n minQuoteOut: bigint,\n recipient: Address,\n ): Promise<SellResult> {\n const hash = await write(curve, \"sell\", [tokensIn, minQuoteOut, recipient]);\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n let quoteOut = 0n;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: curveAbi,\n eventName: \"CurveSell\",\n data: log.data,\n topics: log.topics,\n });\n if (decoded.eventName === \"CurveSell\") {\n quoteOut = decoded.args.quoteOut;\n break;\n }\n } catch {\n // Not our event, continue\n }\n }\n\n return { quoteOut, hash };\n },\n\n async quoteBuy(curve: Address, quoteIn: bigint, recipient: Address): Promise<BuyQuote> {\n const results = await Promise.all([\n read<readonly [bigint, bigint]>(curve, \"getReserves\"),\n read<bigint>(curve, \"sellableTokens\"),\n read<bigint>(curve, \"feeBps\"),\n read<bigint>(curve, \"creatorTaxBps\"),\n read<bigint>(curve, \"currentSnipeTaxBps\", [recipient]),\n ]);\n\n const reserves = results[0];\n const sellable = results[1];\n const feeBps = results[2];\n const creatorTaxBps = results[3];\n const rawSnipeBps = results[4];\n\n const quoteReserve = reserves[0];\n const tokenReserve = reserves[1];\n\n // Cap snipe tax so buyer always nets at least 1% of spend\n let snipeBps = rawSnipeBps;\n if (snipeBps > 0n) {\n const maxSnipeBps = BPS - feeBps - creatorTaxBps - 100n;\n if (snipeBps > maxSnipeBps) snipeBps = maxSnipeBps;\n }\n\n // Deduct all fees before pricing\n let spent = quoteIn;\n const fee = (spent * feeBps) / BPS;\n const tax = (spent * creatorTaxBps) / BPS;\n const snipeTax = (spent * snipeBps) / BPS;\n let tokensOut = amountOut(spent - fee - tax - snipeTax, quoteReserve, tokenReserve);\n\n // Clamp to sellable and refund excess\n if (tokensOut > sellable) {\n tokensOut = sellable;\n const net = amountIn(sellable, quoteReserve, tokenReserve);\n const totalBps = BPS - feeBps - creatorTaxBps - snipeBps;\n if (totalBps <= 0n) {\n // Fees consume entire input — return full amount as refund\n return { tokensOut, spent: 0n, refund: quoteIn };\n }\n const grossed = ceilDiv(net * BPS, totalBps);\n spent = grossed < quoteIn ? grossed : quoteIn;\n }\n\n return { tokensOut, spent, refund: quoteIn - spent };\n },\n\n async quoteSell(curve: Address, tokensIn: bigint): Promise<SellQuote> {\n const results = await Promise.all([\n read<readonly [bigint, bigint]>(curve, \"getReserves\"),\n read<bigint>(curve, \"feeBps\"),\n read<bigint>(curve, \"creatorTaxBps\"),\n ]);\n\n const reserves = results[0];\n const feeBps = results[1];\n const creatorTaxBps = results[2];\n\n const quoteReserve = reserves[0];\n const tokenReserve = reserves[1];\n\n // Price first, then deduct fees from output\n const gross = amountOut(tokensIn, tokenReserve, quoteReserve);\n const fee = (gross * feeBps) / BPS;\n const tax = (gross * creatorTaxBps) / BPS;\n return { quoteOut: gross - fee - tax };\n },\n\n async getState(curve: Address): Promise<CurveState> {\n const reserves = await read<readonly [bigint, bigint]>(curve, \"getReserves\");\n const [\n realQuoteReserve,\n sellableTokens,\n graduationThreshold,\n readyToGraduate,\n graduated,\n feeBps,\n creatorTaxBps,\n buybackEnabled,\n isNativeQuote,\n pairToken,\n ] = await Promise.all([\n read<bigint>(curve, \"realQuoteReserve\"),\n read<bigint>(curve, \"sellableTokens\"),\n read<bigint>(curve, \"graduationThreshold\"),\n read<boolean>(curve, \"readyToGraduate\"),\n read<boolean>(curve, \"graduated\"),\n read<bigint>(curve, \"feeBps\"),\n read<bigint>(curve, \"creatorTaxBps\"),\n read<boolean>(curve, \"buybackEnabled\"),\n read<boolean>(curve, \"isNativeQuote\"),\n read<Address>(curve, \"pairToken\"),\n ]);\n\n return {\n reserves: {\n quoteReserve: reserves[0],\n tokenReserve: reserves[1],\n },\n realQuoteReserve,\n sellableTokens,\n graduationThreshold,\n readyToGraduate,\n graduated,\n feeBps,\n creatorTaxBps,\n buybackEnabled,\n isNativeQuote,\n pairToken,\n };\n },\n\n async getReserves(curve: Address): Promise<CurveReserves> {\n const reserves = await read<readonly [bigint, bigint]>(curve, \"getReserves\");\n return { quoteReserve: reserves[0], tokenReserve: reserves[1] };\n },\n\n async sellableTokens(curve: Address): Promise<bigint> {\n return read<bigint>(curve, \"sellableTokens\");\n },\n\n async readyToGraduate(curve: Address): Promise<boolean> {\n return read<boolean>(curve, \"readyToGraduate\");\n },\n\n async currentSnipeTaxBps(curve: Address, recipient: Address): Promise<bigint> {\n return read<bigint>(curve, \"currentSnipeTaxBps\", [recipient]);\n },\n };\n}\n","import { parseAbi } from \"viem\";\n\nexport const hookAbi = parseAbi([\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function pendingFees(bytes32 poolId, address currency) view returns (uint256)\",\n \"function pendingCreatorTax(bytes32 poolId, address currency) view returns (uint256)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event PoolRegistered(bytes32 indexed poolId, address indexed token, address indexed quoteToken)\",\n \"event PoolFeesSwept(bytes32 indexed poolId, uint256 quoteFees, uint256 tokenFees, uint256 buybackTokens)\",\n \"event PoolConversionSkipped(bytes32 indexed poolId, string reason)\",\n \"event PoolBuybackSkipped(bytes32 indexed poolId, string reason)\",\n]);\n","import { type Address, type PublicClient, encodeAbiParameters, keccak256 } from \"viem\";\nimport { hookAbi } from \"../../abis/hook.js\";\nimport type { LaunchedToken, PoolKey, PoolModule } from \"../../types.js\";\n\ntype ContractAddresses = { memeHook: Address };\n\nexport function createPoolModule(\n publicClient: PublicClient,\n addresses: ContractAddresses,\n): PoolModule {\n return {\n buildPoolKey(launch: LaunchedToken): PoolKey {\n // Uniswap v4 sorts currencies by address. Native ETH (zero address)\n // always takes the currency0 slot.\n const [currency0, currency1] =\n launch.pairToken.toLowerCase() < launch.token.toLowerCase()\n ? [launch.pairToken, launch.token]\n : [launch.token, launch.pairToken];\n\n return {\n currency0,\n currency1,\n fee: launch.poolFee,\n tickSpacing: launch.tickSpacing,\n hooks: addresses.memeHook,\n };\n },\n\n getPoolId(launch: LaunchedToken): `0x${string}` {\n const poolKey = this.buildPoolKey(launch);\n return keccak256(\n encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint24\" },\n { type: \"int24\" },\n { type: \"address\" },\n ],\n [poolKey.currency0, poolKey.currency1, poolKey.fee, poolKey.tickSpacing, poolKey.hooks],\n ),\n );\n },\n\n async pendingFees(poolId: `0x${string}`, currency: Address): Promise<bigint> {\n return publicClient.readContract({\n address: addresses.memeHook,\n abi: hookAbi,\n functionName: \"pendingFees\",\n args: [poolId, currency],\n });\n },\n\n async pendingCreatorTax(poolId: `0x${string}`, currency: Address): Promise<bigint> {\n return publicClient.readContract({\n address: addresses.memeHook,\n abi: hookAbi,\n functionName: \"pendingCreatorTax\",\n args: [poolId, currency],\n });\n },\n };\n}\n","import { parseAbi } from \"viem\";\n\nexport const escrowAbi = parseAbi([\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function balanceOf(address recipient) view returns (uint256)\",\n \"function balanceOfToken(address recipient, address token) view returns (uint256)\",\n\n // ── Write Functions ──────────────────────────────────────────────────────\n \"function claim()\",\n \"function claimToken(address token)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event Credited(address indexed recipient, uint256 amount)\",\n \"event Claimed(address indexed recipient, uint256 amount)\",\n \"event CreditedToken(address indexed recipient, address indexed token, uint256 amount)\",\n \"event ClaimedToken(address indexed recipient, address indexed token, uint256 amount)\",\n]);\n","import { type Address, type PublicClient } from \"viem\";\nimport { escrowAbi } from \"../../abis/escrow.js\";\nimport { factoryAbi } from \"../../abis/factory.js\";\nimport { curveAbi } from \"../../abis/curve.js\";\nimport { hookAbi } from \"../../abis/hook.js\";\nimport type { FeesModule, FeePolicy, PonsWallet } from \"../../types.js\";\n\ntype ContractAddresses = { feeEscrow: Address; factory: Address; memeHook: Address };\n\nexport function createFesModule(\n publicClient: PublicClient,\n wallet: PonsWallet | undefined,\n addresses: ContractAddresses,\n): FeesModule {\n return {\n async getBalance(recipient: Address): Promise<bigint> {\n return publicClient.readContract({\n address: addresses.feeEscrow,\n abi: escrowAbi,\n functionName: \"balanceOf\",\n args: [recipient],\n });\n },\n\n async getERC20Balance(recipient: Address, token: Address): Promise<bigint> {\n return publicClient.readContract({\n address: addresses.feeEscrow,\n abi: escrowAbi,\n functionName: \"balanceOfToken\",\n args: [recipient, token],\n });\n },\n\n async claim(): Promise<`0x${string}`> {\n if (!wallet) throw new Error(\"Wallet required for claim\");\n const { request } = await publicClient.simulateContract({\n address: addresses.feeEscrow,\n abi: escrowAbi,\n functionName: \"claim\",\n account: wallet.account!,\n });\n return wallet.writeContract(request);\n },\n\n async claimToken(token: Address): Promise<`0x${string}`> {\n if (!wallet) throw new Error(\"Wallet required for claimToken\");\n const { request } = await publicClient.simulateContract({\n address: addresses.feeEscrow,\n abi: escrowAbi,\n functionName: \"claimToken\",\n args: [token],\n account: wallet.account!,\n });\n return wallet.writeContract(request);\n },\n\n async getUnsweptBalance(\n curve: Address,\n _creatorFeeRecipient: Address,\n ): Promise<{ pendingFees: bigint; pendingCreatorTax: bigint }> {\n const [pendingFees, pendingCreatorTax] = await Promise.all([\n publicClient.readContract({\n address: curve,\n abi: curveAbi,\n functionName: \"quoteFeeBalance\",\n }),\n publicClient.readContract({\n address: curve,\n abi: curveAbi,\n functionName: \"creatorTaxBalance\",\n }),\n ]);\n return { pendingFees, pendingCreatorTax };\n },\n\n async getHookPendingFees(\n poolId: `0x${string}`,\n quoteCurrency: Address,\n ): Promise<{ pendingFees: bigint; pendingCreatorTax: bigint }> {\n const [pendingFees, pendingCreatorTax] = await Promise.all([\n publicClient.readContract({\n address: addresses.memeHook,\n abi: hookAbi,\n functionName: \"pendingFees\",\n args: [poolId, quoteCurrency],\n }),\n publicClient.readContract({\n address: addresses.memeHook,\n abi: hookAbi,\n functionName: \"pendingCreatorTax\",\n args: [poolId, quoteCurrency],\n }),\n ]);\n return { pendingFees, pendingCreatorTax };\n },\n\n async getFeePolicy(token: Address): Promise<FeePolicy> {\n return publicClient.readContract({\n address: addresses.factory,\n abi: factoryAbi,\n functionName: \"getLaunchFeePolicy\",\n args: [token],\n });\n },\n };\n}\n","import { parseAbi } from \"viem\";\n\nexport const vaultAbi = parseAbi([\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function totalLocked(address token) view returns (uint256)\",\n \"function totalReleased(address token) view returns (uint256)\",\n \"function vestedAmount(address token) view returns (uint256)\",\n \"function releasable(address token) view returns (uint256)\",\n \"function vestingStart(address token) view returns (uint256)\",\n \"function VESTING_DURATION() view returns (uint256)\",\n\n // ── Write Functions ──────────────────────────────────────────────────────\n \"function release(address token) returns (uint256 released)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event Locked(address indexed token, uint256 amount, uint256 vestingStart)\",\n \"event Released(address indexed token, address indexed recipient, uint256 amount)\",\n]);\n","import { type Address, type PublicClient } from \"viem\";\nimport { vaultAbi } from \"../../abis/vault.js\";\nimport type { BuybackModule, PonsWallet, VestingState } from \"../../types.js\";\n\ntype ContractAddresses = { buybackVault: Address };\n\nexport function createBuybackModule(\n publicClient: PublicClient,\n wallet: PonsWallet | undefined,\n addresses: ContractAddresses,\n): BuybackModule {\n return {\n async getState(token: Address): Promise<VestingState> {\n const [totalLocked, totalReleased, vestedAmount, releasable, vestingStart, vestingDuration] =\n await Promise.all([\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"totalLocked\",\n args: [token],\n }),\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"totalReleased\",\n args: [token],\n }),\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"vestedAmount\",\n args: [token],\n }),\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"releasable\",\n args: [token],\n }),\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"vestingStart\",\n args: [token],\n }),\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"VESTING_DURATION\",\n }),\n ]);\n\n const progress = totalLocked > 0n ? Number(vestedAmount) / Number(totalLocked) : 0;\n\n return {\n totalLocked,\n totalReleased,\n vestedAmount,\n releasable,\n vestingStart,\n vestingDuration,\n progress,\n };\n },\n\n async release(token: Address): Promise<`0x${string}`> {\n if (!wallet) throw new Error(\"Wallet required for release\");\n const { request } = await publicClient.simulateContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"release\",\n args: [token],\n account: wallet.account!,\n });\n return wallet.writeContract(request);\n },\n };\n}\n","import { type Address, type PublicClient, parseAbiItem } from \"viem\";\nimport type {\n EventsModule,\n LaunchEvent,\n TradeEvent,\n FeeSweepEvent,\n TakeoverProposalEvent,\n} from \"../../types.js\";\n\ntype ContractAddresses = { factory: Address; memeHook: Address };\n\nexport function createEventsModule(\n publicClient: PublicClient,\n addresses: ContractAddresses,\n): EventsModule {\n return {\n async getLaunches(\n fromBlock: bigint,\n toBlock: bigint | \"latest\" = \"latest\",\n ): Promise<LaunchEvent[]> {\n const logs = await publicClient.getLogs({\n address: addresses.factory,\n event: parseAbiItem(\n \"event TokenLaunched(address indexed token, address indexed curve, address indexed deployer, address pairToken, uint256 launchConfigId, uint256 graduationThreshold)\",\n ),\n fromBlock,\n toBlock,\n });\n\n return logs.map((log) => ({\n token: log.args.token as Address,\n curve: log.args.curve as Address,\n deployer: log.args.deployer as Address,\n pairToken: log.args.pairToken as Address,\n launchConfigId: log.args.launchConfigId as bigint,\n graduationThreshold: log.args.graduationThreshold as bigint,\n blockNumber: log.blockNumber!,\n transactionHash: log.transactionHash,\n }));\n },\n\n async getTrades(\n curve: Address,\n fromBlock: bigint,\n toBlock: bigint | \"latest\" = \"latest\",\n ): Promise<TradeEvent[]> {\n const logs = await publicClient.getLogs({\n address: curve,\n events: [\n parseAbiItem(\n \"event CurveBuy(address indexed buyer, address indexed recipient, uint256 quoteIn, uint256 tokensOut, uint256 fee, uint256 tax)\",\n ),\n parseAbiItem(\n \"event CurveSell(address indexed seller, address indexed recipient, uint256 tokensIn, uint256 quoteOut, uint256 fee, uint256 tax)\",\n ),\n ],\n fromBlock,\n toBlock,\n });\n\n const events: TradeEvent[] = [];\n for (const log of logs) {\n if (log.eventName === \"CurveBuy\") {\n events.push({\n type: \"buy\",\n buyer: log.args.buyer as Address,\n recipient: log.args.recipient as Address,\n quoteIn: log.args.quoteIn as bigint,\n tokensOut: log.args.tokensOut as bigint,\n fee: log.args.fee as bigint,\n tax: log.args.tax as bigint,\n blockNumber: log.blockNumber!,\n transactionHash: log.transactionHash,\n });\n } else if (log.eventName === \"CurveSell\") {\n events.push({\n type: \"sell\",\n seller: log.args.seller as Address,\n recipient: log.args.recipient as Address,\n tokensIn: log.args.tokensIn as bigint,\n quoteOut: log.args.quoteOut as bigint,\n fee: log.args.fee as bigint,\n tax: log.args.tax as bigint,\n blockNumber: log.blockNumber!,\n transactionHash: log.transactionHash,\n });\n }\n }\n return events;\n },\n\n async getFeeSweeps(\n hook: Address,\n fromBlock: bigint,\n toBlock: bigint | \"latest\" = \"latest\",\n ): Promise<FeeSweepEvent[]> {\n const logs = await publicClient.getLogs({\n address: hook,\n event: parseAbiItem(\n \"event PoolFeesSwept(bytes32 indexed poolId, uint256 quoteFees, uint256 tokenFees, uint256 buybackTokens)\",\n ),\n fromBlock,\n toBlock,\n });\n\n return logs.map((log) => ({\n poolId: log.args.poolId as `0x${string}`,\n quoteFees: log.args.quoteFees as bigint,\n tokenFees: log.args.tokenFees as bigint,\n blockNumber: log.blockNumber!,\n transactionHash: log.transactionHash,\n }));\n },\n\n async getTakeoverProposals(\n fromBlock: bigint,\n toBlock: bigint | \"latest\" = \"latest\",\n ): Promise<TakeoverProposalEvent[]> {\n const logs = await publicClient.getLogs({\n address: addresses.factory,\n event: parseAbiItem(\n \"event CreatorFeeRecipientChangeProposed(address indexed token, address indexed newRecipient, uint256 effectiveAt)\",\n ),\n fromBlock,\n toBlock,\n });\n\n return logs.map((log) => ({\n token: log.args.token as Address,\n newRecipient: log.args.newRecipient as Address,\n effectiveAt: log.args.effectiveAt as bigint,\n blockNumber: log.blockNumber!,\n transactionHash: log.transactionHash,\n }));\n },\n };\n}\n","import { type Address, type PublicClient } from \"viem\";\nimport { factoryAbi } from \"../../abis/factory.js\";\nimport type { TakeoverModule, PendingTakeover } from \"../../types.js\";\nimport { ZERO_ADDRESS } from \"../../constants.js\";\n\ntype ContractAddresses = { factory: Address };\n\nexport function createTakeoverModule(\n publicClient: PublicClient,\n addresses: ContractAddresses,\n): TakeoverModule {\n return {\n async getPending(token: Address): Promise<PendingTakeover> {\n const [recipient, effectiveAt, expiresAt] = await publicClient.readContract({\n address: addresses.factory,\n abi: factoryAbi,\n functionName: \"pendingCreatorFeeRecipient\",\n args: [token],\n });\n\n const isPending = recipient !== ZERO_ADDRESS && effectiveAt > 0n && expiresAt > 0n;\n\n return {\n proposedRecipient: recipient,\n effectiveAt,\n expiresAt,\n isPending,\n };\n },\n };\n}\n","import { type Address, type PublicClient, parseAbi } from \"viem\";\nimport type { MigrationModule, MigrationStatus, MigrationEpoch, PonsWallet } from \"../../types.js\";\n\nconst migrationAbi = parseAbi([\n \"function mandate() view returns (uint256)\",\n \"function totalDeposited() view returns (uint256)\",\n \"function settled() view returns (bool)\",\n \"function claimable() view returns (bool)\",\n \"function epochCount() view returns (uint256)\",\n \"function getEpoch(uint256 index) view returns (uint256 rate, uint256 cap, uint256 deposited, bool closed)\",\n \"function deposit(uint256 amount)\",\n \"function claim()\",\n]);\n\ntype ContractAddresses = Record<string, Address>;\n\nexport function createMigrationModule(\n publicClient: PublicClient,\n wallet: PonsWallet | undefined,\n _addresses: ContractAddresses,\n): MigrationModule {\n return {\n async getStatus(migrationAddress: Address): Promise<MigrationStatus> {\n const mandate = await publicClient.readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"mandate\",\n });\n\n const totalDeposited = await publicClient.readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"totalDeposited\",\n });\n\n const settled = await publicClient.readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"settled\",\n });\n\n const claimable = await publicClient.readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"claimable\",\n });\n\n const epochCount = await publicClient.readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"epochCount\",\n });\n\n const epochPromises: Promise<MigrationEpoch>[] = [];\n for (let i = 0; i < Number(epochCount); i++) {\n epochPromises.push(\n publicClient\n .readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"getEpoch\",\n args: [BigInt(i)],\n })\n .then((result) => ({\n rate: result[0],\n cap: result[1],\n deposited: result[2],\n closed: result[3],\n })),\n );\n }\n\n const epochs = await Promise.all(epochPromises);\n\n return { mandate, totalDeposited, settled, claimable, epochs };\n },\n\n async deposit(migrationAddress: Address, amount: bigint): Promise<`0x${string}`> {\n if (!wallet) throw new Error(\"Wallet required for deposit\");\n const { request } = await publicClient.simulateContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"deposit\",\n args: [amount],\n account: wallet.account!,\n });\n return wallet.writeContract(request);\n },\n\n async claim(migrationAddress: Address): Promise<`0x${string}`> {\n if (!wallet) throw new Error(\"Wallet required for claim\");\n const { request } = await publicClient.simulateContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"claim\",\n account: wallet.account!,\n });\n return wallet.writeContract(request);\n },\n };\n}\n","import { type PublicClient, createPublicClient, decodeEventLog, http } from \"viem\";\nimport { ROBINHOOD_CHAIN_ID, ADDRESSES } from \"./constants.js\";\nimport type { PonsClientConfig, PonsWallet } from \"./types.js\";\nimport { createFactoryModule } from \"./modules/factory/index.js\";\nimport { createCurveModule } from \"./modules/curve/index.js\";\nimport { createPoolModule } from \"./modules/pool/index.js\";\nimport { createFesModule } from \"./modules/fees/index.js\";\nimport { createBuybackModule } from \"./modules/buyback/index.js\";\nimport { createEventsModule } from \"./modules/events/index.js\";\nimport { createTakeoverModule } from \"./modules/takeover/index.js\";\nimport { createMigrationModule } from \"./modules/migration/index.js\";\n\n/** Robinhood Chain definition for viem */\nconst robinhoodChain = {\n id: ROBINHOOD_CHAIN_ID,\n name: \"Robinhood Chain\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: { http: [\"https://rpc.robinhood.com\"] },\n },\n} as const;\n\nexport interface PonsClient {\n publicClient: PublicClient;\n wallet: PonsWallet | undefined;\n chainId: number;\n factory: ReturnType<typeof createFactoryModule>;\n curve: ReturnType<typeof createCurveModule>;\n pool: ReturnType<typeof createPoolModule>;\n fees: ReturnType<typeof createFesModule>;\n buyback: ReturnType<typeof createBuybackModule>;\n events: ReturnType<typeof createEventsModule>;\n takeover: ReturnType<typeof createTakeoverModule>;\n migration: ReturnType<typeof createMigrationModule>;\n}\n\n/** Type for the deployed addresses record */\nexport type DeployedAddresses = typeof ADDRESSES;\n\n/**\n * Create a typed Pons v2 client.\n *\n * @example\n * ```ts\n * import { createPonsClient } from '@robhdev/pons-client';\n *\n * // Read-only client\n * const pons = createPonsClient({ rpcUrl: 'https://...' });\n * const configs = await pons.factory.openLaunchConfigs();\n *\n * // Write client with wallet\n * const pons = createPonsClient({\n * rpcUrl: 'https://...',\n * wallet: walletClient,\n * });\n * await pons.factory.launchToken(params, 0n, ZERO_ADDRESS);\n * ```\n */\nexport function createPonsClient(config: PonsClientConfig): PonsClient {\n const chain = {\n ...robinhoodChain,\n id: config.chainId ?? ROBINHOOD_CHAIN_ID,\n };\n\n const publicClient: PublicClient =\n config.publicClient ??\n createPublicClient({\n chain,\n transport: http(config.rpcUrl),\n });\n\n const wallet = config.wallet;\n\n const addresses: DeployedAddresses = ADDRESSES;\n\n const factory = createFactoryModule(publicClient, wallet, addresses);\n const curve = createCurveModule(publicClient, wallet, addresses);\n const pool = createPoolModule(publicClient, addresses);\n const fees = createFesModule(publicClient, wallet, addresses);\n const buyback = createBuybackModule(publicClient, wallet, addresses);\n const events = createEventsModule(publicClient, addresses);\n const takeover = createTakeoverModule(publicClient, addresses);\n const migration = createMigrationModule(publicClient, wallet, addresses);\n\n return {\n publicClient,\n wallet,\n chainId: chain.id,\n factory,\n curve,\n pool,\n fees,\n buyback,\n events,\n takeover,\n migration,\n };\n}\n\nexport { decodeEventLog };\nexport type { PonsClientConfig, PonsWallet };\n","import { parseAbi } from \"viem\";\n\nexport const tokenAbi = parseAbi([\n // ── ERC-20 Standard ──────────────────────────────────────────────────────\n \"function name() view returns (string)\",\n \"function symbol() view returns (string)\",\n \"function decimals() view returns (uint8)\",\n \"function totalSupply() view returns (uint256)\",\n \"function balanceOf(address account) view returns (uint256)\",\n \"function transfer(address to, uint256 amount) returns (bool)\",\n \"function allowance(address owner, address spender) view returns (uint256)\",\n \"function approve(address spender, uint256 amount) returns (bool)\",\n \"function transferFrom(address from, address to, uint256 amount) returns (bool)\",\n\n // ── Pons Token Info ──────────────────────────────────────────────────────\n \"struct Socials { string twitter; string telegram; string discord; string website; string farcaster; }\",\n \"function getTokenInfo() view returns (address tokenDeployer, string tokenLogo, string tokenDescription, Socials tokenSocials)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event Transfer(address indexed from, address indexed to, uint256 value)\",\n \"event Approval(address indexed owner, address indexed spender, uint256 value)\",\n]);\n","import { parseAbi } from \"viem\";\n\nexport const poolManagerAbi = parseAbi([\n // ── Pool Key Struct ──────────────────────────────────────────────────────\n \"struct PoolKey { address currency0; address currency1; uint24 fee; int24 tickSpacing; address hooks; }\",\n\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function getPool(PoolKey key) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFeesToken0, uint24 protocolFeesToken1, uint24 lpFeesToken0, uint24 lpFeesToken1)\",\n \"function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFeesToken0, uint24 protocolFeesToken1, uint24 lpFeesToken0, uint24 lpFeesToken1)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event Swap(bytes32 indexed poolId, address indexed sender, int256 amount0, int256 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick)\",\n \"event Initialize(bytes32 indexed poolId, address indexed currency0, address indexed currency1, int24 tickSpacing, address hooks)\",\n]);\n","import { type Address, formatEther, formatUnits, getAddress, isAddress } from \"viem\";\nimport { ZERO_ADDRESS } from \"../constants.js\";\n\n/**\n * Normalize an address to checksummed form.\n * Returns ZERO_ADDRESS for nullish inputs.\n */\nexport function normalizeAddress(address?: Address | string | null): Address {\n if (!address || address === ZERO_ADDRESS) return ZERO_ADDRESS;\n return getAddress(address);\n}\n\n/**\n * Check if a value looks like a valid Ethereum address.\n */\nexport function isValidAddress(address: string): address is Address {\n try {\n return isAddress(address);\n } catch {\n return false;\n }\n}\n\n/**\n * Format a native ETH value (18 decimals) to a human-readable string.\n */\nexport function formatETH(value: bigint): string {\n return formatEther(value);\n}\n\n/**\n * Format a token amount using its decimal count.\n */\nexport function formatTokenAmount(value: bigint, decimals: number): string {\n return formatUnits(value, decimals);\n}\n\n/**\n * Parse a human-readable ETH string to bigint wei.\n * Uses viem's parseEther under the hood.\n */\nexport { parseEther, parseUnits } from \"viem\";\n\n/**\n * Shorten an address for display: 0x1234...5678\n */\nexport function shortenAddress(address: Address): string {\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/abis/factory.ts","../src/abis/router.ts","../src/utils/validation.ts","../src/modules/factory/index.ts","../src/abis/curve.ts","../src/utils/math.ts","../src/modules/curve/index.ts","../src/abis/hook.ts","../src/modules/pool/index.ts","../src/abis/escrow.ts","../src/modules/fees/index.ts","../src/abis/vault.ts","../src/modules/buyback/index.ts","../src/modules/events/index.ts","../src/modules/takeover/index.ts","../src/modules/migration/index.ts","../src/client.ts","../src/abis/token.ts","../src/abis/poolManager.ts","../src/utils/formatting.ts"],"names":["parseAbi","isAddress"],"mappings":"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","file":"index.js","sourcesContent":["import { type Address } from \"viem\";\n\n/** Robinhood Chain chain ID */\nexport const ROBINHOOD_CHAIN_ID = 4663 as const;\n\n/** Basis points denominator (100%) */\nexport const BPS = 10_000n as const;\n\n/** Zero address — used for native ETH pair */\nexport const ZERO_ADDRESS: Address = \"0x0000000000000000000000000000000000000000\";\n\n// ── Deployed Contract Addresses (Robinhood Chain) ──────────────────────────\n\nexport const ADDRESSES = {\n factory: \"0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e\" as Address,\n memeHook: \"0xE5e702641Ea86F4ae6cC3cDaeD2B886f976Be044\" as Address,\n feeEscrow: \"0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e\" as Address,\n buybackVault: \"0x42df2a798f82289E177311362e8f5ccC45c1219c\" as Address,\n launchLocker: \"0x267444D099b10fB5Ed7c3Cc7B7c767AdcA574952\" as Address,\n launchAndBuy: \"0xe33E9E479dF8802cb0866d5d05258bEc4cF62948\" as Address,\n launchDeployer: \"0x3711ceA4feaDE896C913C68F01Eda97Cb06D1A42\" as Address,\n graduationExecutor: \"0xC7819B64A1dAECD7eC19856d026cb14EfBd89046\" as Address,\n graduationGuard: \"0xf5695117b99B6f6401e67d4195BD653628176C6C\" as Address,\n} as const;\n\n// ── Launch Phases ──────────────────────────────────────────────────────────\n\nexport const PHASE = {\n NotGraduated: 0,\n Swept: 1,\n PoolCreated: 2,\n Rescued: 3,\n} as const;\n\nexport type Phase = (typeof PHASE)[keyof typeof PHASE];\n\n// ── Constants ──────────────────────────────────────────────────────────────\n\n/** Snipe tax decay window in EVM timestamp seconds (block.timestamp units) */\nexport const SNIPE_TAX_DECAY_SECS = 5n as const;\n\n/**\n * Snipe tax decay window expressed in nanoseconds (5 seconds).\n * @deprecated Use SNIPE_TAX_DECAY_SECS when comparing against block timestamps.\n * This alias preserves its original nanosecond value for backward compatibility.\n */\nexport const SNIPE_TAX_DECAY_NS = 5_000_000_000n as const;\n\n/** Maximum number of snipe tax exemptions per launch */\nexport const MAX_SNIPE_EXEMPTIONS = 32 as const;\n\n/** Buyback vesting duration (5 years in seconds) */\nexport const VESTING_DURATION_SECS = 157_680_000n as const;\n\n/** Migration claim window (90 days in seconds) */\nexport const MIGRATION_CLAIM_WINDOW_SECS = 7_776_000n as const;\n","import { parseAbi } from \"viem\";\n\nexport const factoryAbi = parseAbi([\n // ── Structs ──────────────────────────────────────────────────────────────\n \"struct LaunchConfig { uint256 supply; uint256 curveFeeBps; uint256 phantomQuote; uint256 graduationThreshold; uint24 poolFee; int24 tickSpacing; bool enabled; }\",\n \"struct Socials { string twitter; string telegram; string discord; string website; string farcaster; }\",\n \"struct TokenParams { string name; string symbol; string logo; string description; Socials socials; address creatorFeeRecipient; uint16 creatorTaxBps; bool buybackEnabled; bytes32 expectedEconomics; bytes32 salt; }\",\n \"struct LaunchedToken { address token; address curve; address deployer; address creatorFeeRecipient; address pairToken; uint256 graduationThreshold; uint24 poolFee; int24 tickSpacing; uint16 creatorTaxBps; bool buybackEnabled; uint8 phase; uint256 sweptQuote; uint256 sweptTokens; uint256 sweptAt; bool exists; }\",\n \"struct FeePolicy { address protocolFeeRecipient; uint16 protocolFeeShareBps; uint16 buybackBurnBps; uint16 hookFeeBps; uint16 maxInternalPriceImpactBps; }\",\n\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function launchConfigCount() view returns (uint256)\",\n \"function getLaunchConfig(uint256 id) view returns (LaunchConfig)\",\n \"function getLaunchedToken(address token) view returns (LaunchedToken)\",\n \"function previewLaunchEconomics(uint256 launchConfigId, address pairToken) view returns (bytes32)\",\n \"function launchFee() view returns (uint256)\",\n \"function canLaunch(address launcher) view returns (bool)\",\n \"function maxCreatorTaxBps() view returns (uint16)\",\n \"function approvedPairTokens(address pairToken) view returns (bool)\",\n \"function pairTokenEconomics(address pairToken) view returns (uint256 phantomQuote, uint256 graduationThreshold, uint8 decimals)\",\n \"function getLaunchFeePolicy(address token) view returns (FeePolicy)\",\n \"function pendingCreatorFeeRecipient(address token) view returns (address recipient, uint256 effectiveAt, uint256 expiresAt)\",\n\n // ── Write Functions ──────────────────────────────────────────────────────\n \"function launchToken(TokenParams params, uint256 launchConfigId, address pairToken) payable returns (address token, address curve)\",\n \"function launchToken(TokenParams params, uint256 launchConfigId, address pairToken, address[] snipeTaxExemptions) payable returns (address token, address curve)\",\n \"function createGraduatedPool(address token)\",\n \"function transferCreatorFeeRecipient(address token, address newRecipient)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event TokenLaunched(address indexed token, address indexed curve, address indexed deployer, address pairToken, uint256 launchConfigId, uint256 graduationThreshold)\",\n \"event LaunchSwept(address indexed token, uint256 quoteOut, uint256 tokenOut)\",\n \"event PoolGraduated(address indexed token, uint256 positionId, uint256 tokenAmount, uint256 pairTokenAmount)\",\n \"event CreatorFeeRecipientChangeProposed(address indexed token, address indexed currentRecipient, address indexed newRecipient, uint256 effectiveAt, uint256 expiresAt)\",\n \"event CreatorFeeRecipientUpdated(address indexed token, address indexed previousRecipient, address indexed newRecipient)\",\n]);\n","import { parseAbi } from \"viem\";\n\nexport const routerAbi = parseAbi([\n // ── Structs ──────────────────────────────────────────────────────────────\n \"struct Socials { string twitter; string telegram; string discord; string website; string farcaster; }\",\n \"struct TokenParams { string name; string symbol; string logo; string description; Socials socials; address creatorFeeRecipient; uint16 creatorTaxBps; bool buybackEnabled; bytes32 expectedEconomics; bytes32 salt; }\",\n\n // ── Write Functions ──────────────────────────────────────────────────────\n \"function launchAndBuy(TokenParams params, uint256 launchConfigId, address pairToken, uint256 quoteIn, uint256 minTokensOut, address recipient, address[] snipeTaxExemptions) payable returns (address token, address curve, uint256 tokensOut)\",\n]);\n","import { type Address, isAddress } from \"viem\";\nimport { BPS, MAX_SNIPE_EXEMPTIONS } from \"../constants.js\";\n\n/**\n * Validate an Ethereum address. Throws if invalid.\n */\nexport function requireValidAddress(address: Address, label: string): void {\n if (!isAddress(address)) {\n throw new Error(`Invalid ${label} address: ${address}`);\n }\n}\n\n/**\n * Validate creator tax is within protocol bounds.\n */\nexport function requireValidCreatorTax(taxBps: number, maxBps: bigint): void {\n if (taxBps < 0) {\n throw new Error(\"Creator tax cannot be negative\");\n }\n if (BigInt(taxBps) > maxBps) {\n throw new Error(`Creator tax ${taxBps} bps exceeds protocol max ${maxBps} bps`);\n }\n}\n\n/**\n * Validate snipe tax exemption list length.\n */\nexport function requireValidExemptions(exemptions: Address[]): void {\n if (exemptions.length > MAX_SNIPE_EXEMPTIONS) {\n throw new Error(\n `Snipe tax exemption list too long: ${exemptions.length} (max ${MAX_SNIPE_EXEMPTIONS})`,\n );\n }\n}\n\n/**\n * Validate that a quote amount is positive.\n */\nexport function requirePositiveAmount(amount: bigint, label: string): void {\n if (amount <= 0n) {\n throw new Error(`${label} must be positive, got ${amount}`);\n }\n}\n\n/**\n * Validate slippage tolerance (0-10000 bps).\n */\nexport function requireValidSlippage(slippageBps: number): void {\n if (slippageBps < 0 || slippageBps > Number(BPS)) {\n throw new Error(`Invalid slippage: ${slippageBps} bps (must be 0-${BPS})`);\n }\n}\n\n/**\n * Compute minimum output from a quoted amount and slippage tolerance.\n */\nexport function minOutputWithSlippage(quoted: bigint, slippageBps: number): bigint {\n const tolerance = (quoted * BigInt(slippageBps)) / BPS;\n return quoted - tolerance;\n}\n","import { type Address, type Hex, type PublicClient } from \"viem\";\nimport { factoryAbi } from \"../../abis/factory.js\";\nimport { routerAbi } from \"../../abis/router.js\";\nimport { ZERO_ADDRESS } from \"../../constants.js\";\nimport type {\n FactoryModule,\n LaunchConfig,\n LaunchConfigWithId,\n LaunchedToken,\n PonsWallet,\n TokenParams,\n} from \"../../types.js\";\nimport {\n requireValidAddress,\n requireValidCreatorTax,\n requireValidExemptions,\n} from \"../../utils/validation.js\";\n\ntype ContractAddresses = { factory: Address; launchAndBuy: Address };\n\nexport function createFactoryModule(\n publicClient: PublicClient,\n wallet: PonsWallet | undefined,\n addresses: ContractAddresses,\n): FactoryModule {\n const read = async <T>(functionName: string, args?: readonly unknown[]): Promise<T> =>\n publicClient.readContract({\n address: addresses.factory,\n abi: factoryAbi,\n functionName: functionName as never,\n args: args as never,\n }) as Promise<T>;\n\n const write = async (\n functionName: string,\n args: readonly unknown[],\n value?: bigint,\n ): Promise<`0x${string}`> => {\n if (!wallet) throw new Error(\"Wallet required for write operations\");\n const { request } = await publicClient.simulateContract({\n address: addresses.factory,\n abi: factoryAbi,\n functionName: functionName as never,\n args: args as never,\n account: wallet.account!,\n value,\n });\n return wallet.writeContract(request);\n };\n\n return {\n async openLaunchConfigs(): Promise<LaunchConfigWithId[]> {\n const count = await read<bigint>(\"launchConfigCount\");\n const configs = await Promise.all(\n Array.from({ length: Number(count) }, (_, id) =>\n read<LaunchConfig>(\"getLaunchConfig\", [BigInt(id)]),\n ),\n );\n return configs\n .map((config, id): LaunchConfigWithId => ({\n id: BigInt(id),\n supply: config.supply,\n curveFeeBps: config.curveFeeBps,\n phantomQuote: config.phantomQuote,\n graduationThreshold: config.graduationThreshold,\n poolFee: config.poolFee,\n tickSpacing: config.tickSpacing,\n enabled: config.enabled,\n }))\n .filter((config) => config.enabled);\n },\n\n async getLaunchConfig(id: bigint): Promise<LaunchConfig> {\n return read<LaunchConfig>(\"getLaunchConfig\", [id]);\n },\n\n async getLaunchedToken(token: Address): Promise<LaunchedToken> {\n return read<LaunchedToken>(\"getLaunchedToken\", [token]);\n },\n\n async previewLaunchEconomics(configId: bigint, pairToken: Address): Promise<Hex> {\n return read<Hex>(\"previewLaunchEconomics\", [configId, pairToken]);\n },\n\n async launchFee(): Promise<bigint> {\n return read<bigint>(\"launchFee\");\n },\n\n async canLaunch(address: Address): Promise<boolean> {\n return read<boolean>(\"canLaunch\", [address]);\n },\n\n async maxCreatorTaxBps(): Promise<bigint> {\n return read<bigint>(\"maxCreatorTaxBps\");\n },\n\n async approvedPairTokens(pairToken: Address): Promise<boolean> {\n return read<boolean>(\"approvedPairTokens\", [pairToken]);\n },\n\n async pairTokenEconomics(pairToken: Address): Promise<{\n phantomQuote: bigint;\n graduationThreshold: bigint;\n decimals: number;\n }> {\n const result = await read<readonly [bigint, bigint, number]>(\"pairTokenEconomics\", [\n pairToken,\n ]);\n return {\n phantomQuote: result[0],\n graduationThreshold: result[1],\n decimals: Number(result[2]),\n };\n },\n\n async launchToken(\n params: TokenParams,\n configId: bigint,\n pairToken: Address,\n snipeTaxExemptions: Address[] = [],\n ): Promise<`0x${string}`> {\n requireValidAddress(pairToken, \"pairToken\");\n requireValidCreatorTax(params.creatorTaxBps, await this.maxCreatorTaxBps());\n requireValidExemptions(snipeTaxExemptions);\n\n const [expectedEconomics, launchFeeAmount] = await Promise.all([\n this.previewLaunchEconomics(configId, pairToken),\n this.launchFee(),\n ]);\n\n // Pin economics to prevent frontrunning\n const pinnedParams: TokenParams = {\n name: params.name,\n symbol: params.symbol,\n logo: params.logo,\n description: params.description,\n socials: params.socials,\n creatorFeeRecipient: params.creatorFeeRecipient,\n creatorTaxBps: params.creatorTaxBps,\n buybackEnabled: params.buybackEnabled,\n expectedEconomics,\n salt: params.salt,\n };\n\n if (snipeTaxExemptions.length > 0) {\n return write(\n \"launchToken\",\n [pinnedParams, configId, pairToken, snipeTaxExemptions],\n launchFeeAmount,\n );\n }\n\n return write(\"launchToken\", [pinnedParams, configId, pairToken], launchFeeAmount);\n },\n\n async launchAndBuy(\n params: TokenParams,\n configId: bigint,\n pairToken: Address,\n quoteIn: bigint,\n minTokensOut: bigint,\n recipient: Address,\n snipeTaxExemptions: Address[] = [],\n ): Promise<{\n hash: `0x${string}`;\n token: Address;\n curve: Address;\n tokensOut: bigint;\n }> {\n requireValidAddress(pairToken, \"pairToken\");\n requireValidAddress(recipient, \"recipient\");\n requireValidCreatorTax(params.creatorTaxBps, await this.maxCreatorTaxBps());\n requireValidExemptions(snipeTaxExemptions);\n\n if (!wallet) throw new Error(\"Wallet required for write operations\");\n\n const [expectedEconomics, launchFeeAmount] = await Promise.all([\n this.previewLaunchEconomics(configId, pairToken),\n this.launchFee(),\n ]);\n\n const pinnedParams: TokenParams = {\n name: params.name,\n symbol: params.symbol,\n logo: params.logo,\n description: params.description,\n socials: params.socials,\n creatorFeeRecipient: params.creatorFeeRecipient,\n creatorTaxBps: params.creatorTaxBps,\n buybackEnabled: params.buybackEnabled,\n expectedEconomics,\n salt: params.salt,\n };\n\n const value = pairToken === ZERO_ADDRESS ? launchFeeAmount + quoteIn : launchFeeAmount;\n\n const { request, result } = await publicClient.simulateContract({\n address: addresses.launchAndBuy,\n abi: routerAbi,\n functionName: \"launchAndBuy\",\n args: [\n pinnedParams,\n configId,\n pairToken,\n quoteIn,\n minTokensOut,\n recipient,\n snipeTaxExemptions,\n ],\n account: wallet.account!,\n value,\n });\n\n const hash = await wallet.writeContract(request);\n\n // Parse result to extract token and curve addresses\n const typedResult = result as unknown as readonly [Address, Address, bigint];\n\n return {\n hash,\n token: typedResult[0],\n curve: typedResult[1],\n tokensOut: typedResult[2],\n };\n },\n };\n}\n","import { parseAbi } from \"viem\";\n\nexport const curveAbi = parseAbi([\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function getReserves() view returns (uint256 quoteReserve, uint256 tokenReserve)\",\n \"function realQuoteReserve() view returns (uint256)\",\n \"function sellableTokens() view returns (uint256)\",\n \"function reservedTokens() view returns (uint256)\",\n \"function graduationThreshold() view returns (uint256)\",\n \"function readyToGraduate() view returns (bool)\",\n \"function graduated() view returns (bool)\",\n \"function feeBps() view returns (uint256)\",\n \"function creatorTaxBps() view returns (uint256)\",\n \"function buybackEnabled() view returns (bool)\",\n \"function isNativeQuote() view returns (bool)\",\n \"function pairToken() view returns (address)\",\n \"function currentSnipeTaxBps(address recipient) view returns (uint256)\",\n \"function quoteFeeBalance() view returns (uint256)\",\n \"function creatorTaxBalance() view returns (uint256)\",\n\n // ── Write Functions ──────────────────────────────────────────────────────\n \"function buy(uint256 quoteIn, uint256 minTokensOut, address recipient) payable returns (uint256 tokensOut)\",\n \"function sell(uint256 tokensIn, uint256 minQuoteOut, address recipient) returns (uint256 quoteOut)\",\n \"function sweepFees(uint256 minBuybackTokensOut)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event CurveBuy(address indexed buyer, address indexed recipient, uint256 quoteIn, uint256 tokensOut, uint256 fee, uint256 tax)\",\n \"event CurveSell(address indexed seller, address indexed recipient, uint256 tokensIn, uint256 quoteOut, uint256 fee, uint256 tax)\",\n \"event CurveBuyRefunded(address indexed buyer, uint256 refund)\",\n \"event CurveCompleted(address recipient, uint256 quoteOut, uint256 tokenOut)\",\n \"event AutoGraduationFailed(address indexed token, uint256 gasRemaining)\",\n \"event FeesSwept(uint256 protocolAmount, uint256 buybackAmount, uint256 creatorAmount)\",\n \"event BuybackLocked(uint256 quoteSpent, uint256 tokensLocked)\",\n]);\n","import { BPS } from \"../constants.js\";\n\n/**\n * Ceiling division: ⌈a / b⌉\n */\nexport function ceilDiv(a: bigint, b: bigint): bigint {\n if (b === 0n) throw new Error(\"Division by zero\");\n return (a + b - 1n) / b;\n}\n\n/**\n * Constant product amountOut: given `inAmount` going in, compute how much\n * comes out. No fees applied — caller deducts fees before or after.\n *\n * Formula: out = (in * reserveOut) / (reserveIn + in)\n */\nexport function amountOut(inAmount: bigint, reserveIn: bigint, reserveOut: bigint): bigint {\n if (inAmount === 0n || reserveIn === 0n || reserveOut === 0n) return 0n;\n return (inAmount * reserveOut) / (reserveIn + inAmount);\n}\n\n/**\n * Constant product amountIn: given `outAmount` desired out, compute how much\n * must go in. Includes +1n rounding up.\n *\n * Formula: in = (out * reserveIn) / (reserveOut - out) + 1\n */\nexport function amountIn(outAmount: bigint, reserveIn: bigint, reserveOut: bigint): bigint {\n if (outAmount === 0n || reserveOut === 0n) return 0n;\n if (outAmount >= reserveOut) throw new Error(\"Output exceeds reserve\");\n return (outAmount * reserveIn) / (reserveOut - outAmount) + 1n;\n}\n\n/**\n * Apply a basis-point fee to an amount.\n * Returns the fee amount (not the net).\n */\nexport function applyBps(amount: bigint, bps: bigint): bigint {\n return (amount * bps) / BPS;\n}\n\n/**\n * Subtract a basis-point fee from an amount, returning the net.\n */\nexport function subtractBps(amount: bigint, bps: bigint): bigint {\n return amount - applyBps(amount, bps);\n}\n\n/**\n * Compute the marginal price of one token in the quote asset.\n * Returns a floating-point number for display purposes only.\n */\nexport function marginalPrice(quoteReserve: bigint, tokenReserve: bigint): number {\n if (tokenReserve === 0n) return 0;\n return Number(quoteReserve) / Number(tokenReserve);\n}\n\n/**\n * Compute graduation progress as a fraction (0..1).\n */\nexport function graduationProgress(raised: bigint, threshold: bigint): number {\n if (threshold === 0n) return 0;\n const clamped = raised > threshold ? threshold : raised;\n return Number(clamped) / Number(threshold);\n}\n","import { type Address, type PublicClient, decodeEventLog } from \"viem\";\nimport { curveAbi } from \"../../abis/curve.js\";\nimport { BPS } from \"../../constants.js\";\nimport type {\n BuyQuote,\n BuyResult,\n CurveReserves,\n CurveState,\n CurveModule,\n PonsWallet,\n SellQuote,\n SellResult,\n} from \"../../types.js\";\nimport { ceilDiv, amountOut, amountIn } from \"../../utils/math.js\";\n\ntype ContractAddresses = Record<string, Address>;\n\nexport function createCurveModule(\n publicClient: PublicClient,\n wallet: PonsWallet | undefined,\n _addresses: ContractAddresses,\n): CurveModule {\n const read = async <T>(\n contractAddress: Address,\n functionName: string,\n args?: readonly unknown[],\n ): Promise<T> =>\n publicClient.readContract({\n address: contractAddress,\n abi: curveAbi,\n functionName: functionName as never,\n args: args as never,\n }) as Promise<T>;\n\n const write = async (\n contractAddress: Address,\n functionName: string,\n args: readonly unknown[],\n value?: bigint,\n ): Promise<`0x${string}`> => {\n if (!wallet) throw new Error(\"Wallet required for write operations\");\n const { request } = await publicClient.simulateContract({\n address: contractAddress,\n abi: curveAbi,\n functionName: functionName as never,\n args: args as never,\n account: wallet.account!,\n value,\n });\n return wallet.writeContract(request);\n };\n\n return {\n async buy(\n curve: Address,\n quoteIn: bigint,\n minTokensOut: bigint,\n recipient: Address,\n value?: bigint,\n ): Promise<BuyResult> {\n const isNative = await read<boolean>(curve, \"isNativeQuote\");\n const sendValue = isNative ? quoteIn : (value ?? 0n);\n\n const hash = await write(curve, \"buy\", [quoteIn, minTokensOut, recipient], sendValue);\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n let tokensOut = 0n;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: curveAbi,\n eventName: \"CurveBuy\",\n data: log.data,\n topics: log.topics,\n });\n if (decoded.eventName === \"CurveBuy\") {\n tokensOut = decoded.args.tokensOut;\n break;\n }\n } catch {\n // Not our event, continue\n }\n }\n\n return { tokensOut, hash };\n },\n\n async sell(\n curve: Address,\n tokensIn: bigint,\n minQuoteOut: bigint,\n recipient: Address,\n ): Promise<SellResult> {\n const hash = await write(curve, \"sell\", [tokensIn, minQuoteOut, recipient]);\n\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n let quoteOut = 0n;\n\n for (const log of receipt.logs) {\n try {\n const decoded = decodeEventLog({\n abi: curveAbi,\n eventName: \"CurveSell\",\n data: log.data,\n topics: log.topics,\n });\n if (decoded.eventName === \"CurveSell\") {\n quoteOut = decoded.args.quoteOut;\n break;\n }\n } catch {\n // Not our event, continue\n }\n }\n\n return { quoteOut, hash };\n },\n\n async quoteBuy(curve: Address, quoteIn: bigint, recipient: Address): Promise<BuyQuote> {\n const results = await Promise.all([\n read<readonly [bigint, bigint]>(curve, \"getReserves\"),\n read<bigint>(curve, \"sellableTokens\"),\n read<bigint>(curve, \"feeBps\"),\n read<bigint>(curve, \"creatorTaxBps\"),\n read<bigint>(curve, \"currentSnipeTaxBps\", [recipient]),\n ]);\n\n const reserves = results[0];\n const sellable = results[1];\n const feeBps = results[2];\n const creatorTaxBps = results[3];\n const rawSnipeBps = results[4];\n\n const quoteReserve = reserves[0];\n const tokenReserve = reserves[1];\n\n // Cap snipe tax so buyer always nets at least 1% of spend\n let snipeBps = rawSnipeBps;\n if (snipeBps > 0n) {\n const maxSnipeBps = BPS - feeBps - creatorTaxBps - 100n;\n if (snipeBps > maxSnipeBps) snipeBps = maxSnipeBps;\n }\n\n // Deduct all fees before pricing\n let spent = quoteIn;\n const fee = (spent * feeBps) / BPS;\n const tax = (spent * creatorTaxBps) / BPS;\n const snipeTax = (spent * snipeBps) / BPS;\n let tokensOut = amountOut(spent - fee - tax - snipeTax, quoteReserve, tokenReserve);\n\n // Clamp to sellable and refund excess\n if (tokensOut > sellable) {\n tokensOut = sellable;\n const net = amountIn(sellable, quoteReserve, tokenReserve);\n const totalBps = BPS - feeBps - creatorTaxBps - snipeBps;\n if (totalBps <= 0n) {\n // Fees consume entire input — return full amount as refund\n return { tokensOut, spent: 0n, refund: quoteIn };\n }\n const grossed = ceilDiv(net * BPS, totalBps);\n spent = grossed < quoteIn ? grossed : quoteIn;\n }\n\n return { tokensOut, spent, refund: quoteIn - spent };\n },\n\n async quoteSell(curve: Address, tokensIn: bigint): Promise<SellQuote> {\n const results = await Promise.all([\n read<readonly [bigint, bigint]>(curve, \"getReserves\"),\n read<bigint>(curve, \"feeBps\"),\n read<bigint>(curve, \"creatorTaxBps\"),\n ]);\n\n const reserves = results[0];\n const feeBps = results[1];\n const creatorTaxBps = results[2];\n\n const quoteReserve = reserves[0];\n const tokenReserve = reserves[1];\n\n // Price first, then deduct fees from output\n const gross = amountOut(tokensIn, tokenReserve, quoteReserve);\n const fee = (gross * feeBps) / BPS;\n const tax = (gross * creatorTaxBps) / BPS;\n return { quoteOut: gross - fee - tax };\n },\n\n async getState(curve: Address): Promise<CurveState> {\n const reserves = await read<readonly [bigint, bigint]>(curve, \"getReserves\");\n const [\n realQuoteReserve,\n sellableTokens,\n graduationThreshold,\n readyToGraduate,\n graduated,\n feeBps,\n creatorTaxBps,\n buybackEnabled,\n isNativeQuote,\n pairToken,\n ] = await Promise.all([\n read<bigint>(curve, \"realQuoteReserve\"),\n read<bigint>(curve, \"sellableTokens\"),\n read<bigint>(curve, \"graduationThreshold\"),\n read<boolean>(curve, \"readyToGraduate\"),\n read<boolean>(curve, \"graduated\"),\n read<bigint>(curve, \"feeBps\"),\n read<bigint>(curve, \"creatorTaxBps\"),\n read<boolean>(curve, \"buybackEnabled\"),\n read<boolean>(curve, \"isNativeQuote\"),\n read<Address>(curve, \"pairToken\"),\n ]);\n\n return {\n reserves: {\n quoteReserve: reserves[0],\n tokenReserve: reserves[1],\n },\n realQuoteReserve,\n sellableTokens,\n graduationThreshold,\n readyToGraduate,\n graduated,\n feeBps,\n creatorTaxBps,\n buybackEnabled,\n isNativeQuote,\n pairToken,\n };\n },\n\n async getReserves(curve: Address): Promise<CurveReserves> {\n const reserves = await read<readonly [bigint, bigint]>(curve, \"getReserves\");\n return { quoteReserve: reserves[0], tokenReserve: reserves[1] };\n },\n\n async sellableTokens(curve: Address): Promise<bigint> {\n return read<bigint>(curve, \"sellableTokens\");\n },\n\n async readyToGraduate(curve: Address): Promise<boolean> {\n return read<boolean>(curve, \"readyToGraduate\");\n },\n\n async currentSnipeTaxBps(curve: Address, recipient: Address): Promise<bigint> {\n return read<bigint>(curve, \"currentSnipeTaxBps\", [recipient]);\n },\n };\n}\n","import { parseAbi } from \"viem\";\n\nexport const hookAbi = parseAbi([\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function pendingFees(bytes32 poolId, address currency) view returns (uint256)\",\n \"function pendingCreatorTax(bytes32 poolId, address currency) view returns (uint256)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event PoolRegistered(bytes32 indexed poolId, address memecoin, address quoteToken, address creator)\",\n \"event PoolFeesSwept(bytes32 indexed poolId, uint256 protocolAmount, uint256 buybackAmount, uint256 creatorAmount, uint256 tokensLocked)\",\n \"event PoolConversionSkipped(bytes32 indexed poolId, uint256 retainedMemecoin)\",\n \"event PoolBuybackSkipped(bytes32 indexed poolId, uint256 foldedBackQuote)\",\n]);\n","import { type Address, type PublicClient, encodeAbiParameters, keccak256 } from \"viem\";\nimport { hookAbi } from \"../../abis/hook.js\";\nimport type { LaunchedToken, PoolKey, PoolModule } from \"../../types.js\";\n\ntype ContractAddresses = { memeHook: Address };\n\nexport function createPoolModule(\n publicClient: PublicClient,\n addresses: ContractAddresses,\n): PoolModule {\n return {\n buildPoolKey(launch: LaunchedToken): PoolKey {\n // Uniswap v4 sorts currencies by address. Native ETH (zero address)\n // always takes the currency0 slot.\n const [currency0, currency1] =\n launch.pairToken.toLowerCase() < launch.token.toLowerCase()\n ? [launch.pairToken, launch.token]\n : [launch.token, launch.pairToken];\n\n return {\n currency0,\n currency1,\n fee: launch.poolFee,\n tickSpacing: launch.tickSpacing,\n hooks: addresses.memeHook,\n };\n },\n\n getPoolId(launch: LaunchedToken): `0x${string}` {\n const poolKey = this.buildPoolKey(launch);\n return keccak256(\n encodeAbiParameters(\n [\n { type: \"address\" },\n { type: \"address\" },\n { type: \"uint24\" },\n { type: \"int24\" },\n { type: \"address\" },\n ],\n [poolKey.currency0, poolKey.currency1, poolKey.fee, poolKey.tickSpacing, poolKey.hooks],\n ),\n );\n },\n\n async pendingFees(poolId: `0x${string}`, currency: Address): Promise<bigint> {\n return publicClient.readContract({\n address: addresses.memeHook,\n abi: hookAbi,\n functionName: \"pendingFees\",\n args: [poolId, currency],\n });\n },\n\n async pendingCreatorTax(poolId: `0x${string}`, currency: Address): Promise<bigint> {\n return publicClient.readContract({\n address: addresses.memeHook,\n abi: hookAbi,\n functionName: \"pendingCreatorTax\",\n args: [poolId, currency],\n });\n },\n };\n}\n","import { parseAbi } from \"viem\";\n\nexport const escrowAbi = parseAbi([\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function balanceOf(address recipient) view returns (uint256)\",\n \"function balanceOfToken(address recipient, address token) view returns (uint256)\",\n\n // ── Write Functions ──────────────────────────────────────────────────────\n \"function claim()\",\n \"function claimToken(address token)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event Credited(address indexed recipient, address indexed depositor, uint256 amount)\",\n \"event Claimed(address indexed recipient, uint256 amount)\",\n \"event CreditedToken(address indexed recipient, address indexed token, address indexed depositor, uint256 amount)\",\n \"event ClaimedToken(address indexed recipient, address indexed token, uint256 amount)\",\n]);\n","import { type Address, type PublicClient } from \"viem\";\nimport { escrowAbi } from \"../../abis/escrow.js\";\nimport { factoryAbi } from \"../../abis/factory.js\";\nimport { curveAbi } from \"../../abis/curve.js\";\nimport { hookAbi } from \"../../abis/hook.js\";\nimport type { FeesModule, FeePolicy, PonsWallet } from \"../../types.js\";\n\ntype ContractAddresses = { feeEscrow: Address; factory: Address; memeHook: Address };\n\nexport function createFesModule(\n publicClient: PublicClient,\n wallet: PonsWallet | undefined,\n addresses: ContractAddresses,\n): FeesModule {\n return {\n async getBalance(recipient: Address): Promise<bigint> {\n return publicClient.readContract({\n address: addresses.feeEscrow,\n abi: escrowAbi,\n functionName: \"balanceOf\",\n args: [recipient],\n });\n },\n\n async getERC20Balance(recipient: Address, token: Address): Promise<bigint> {\n return publicClient.readContract({\n address: addresses.feeEscrow,\n abi: escrowAbi,\n functionName: \"balanceOfToken\",\n args: [recipient, token],\n });\n },\n\n async claim(): Promise<`0x${string}`> {\n if (!wallet) throw new Error(\"Wallet required for claim\");\n const { request } = await publicClient.simulateContract({\n address: addresses.feeEscrow,\n abi: escrowAbi,\n functionName: \"claim\",\n account: wallet.account!,\n });\n return wallet.writeContract(request);\n },\n\n async claimToken(token: Address): Promise<`0x${string}`> {\n if (!wallet) throw new Error(\"Wallet required for claimToken\");\n const { request } = await publicClient.simulateContract({\n address: addresses.feeEscrow,\n abi: escrowAbi,\n functionName: \"claimToken\",\n args: [token],\n account: wallet.account!,\n });\n return wallet.writeContract(request);\n },\n\n async getUnsweptBalance(\n curve: Address,\n _creatorFeeRecipient: Address,\n ): Promise<{ pendingFees: bigint; pendingCreatorTax: bigint }> {\n const [pendingFees, pendingCreatorTax] = await Promise.all([\n publicClient.readContract({\n address: curve,\n abi: curveAbi,\n functionName: \"quoteFeeBalance\",\n }),\n publicClient.readContract({\n address: curve,\n abi: curveAbi,\n functionName: \"creatorTaxBalance\",\n }),\n ]);\n return { pendingFees, pendingCreatorTax };\n },\n\n async getHookPendingFees(\n poolId: `0x${string}`,\n quoteCurrency: Address,\n ): Promise<{ pendingFees: bigint; pendingCreatorTax: bigint }> {\n const [pendingFees, pendingCreatorTax] = await Promise.all([\n publicClient.readContract({\n address: addresses.memeHook,\n abi: hookAbi,\n functionName: \"pendingFees\",\n args: [poolId, quoteCurrency],\n }),\n publicClient.readContract({\n address: addresses.memeHook,\n abi: hookAbi,\n functionName: \"pendingCreatorTax\",\n args: [poolId, quoteCurrency],\n }),\n ]);\n return { pendingFees, pendingCreatorTax };\n },\n\n async getFeePolicy(token: Address): Promise<FeePolicy> {\n return publicClient.readContract({\n address: addresses.factory,\n abi: factoryAbi,\n functionName: \"getLaunchFeePolicy\",\n args: [token],\n });\n },\n };\n}\n","import { parseAbi } from \"viem\";\n\nexport const vaultAbi = parseAbi([\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function totalLocked(address token) view returns (uint256)\",\n \"function totalReleased(address token) view returns (uint256)\",\n \"function vestedAmount(address token) view returns (uint256)\",\n \"function releasable(address token) view returns (uint256)\",\n \"function vestingStart(address token) view returns (uint256)\",\n \"function VESTING_DURATION() view returns (uint256)\",\n\n // ── Write Functions ──────────────────────────────────────────────────────\n \"function release(address token) returns (uint256 released)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event Locked(address indexed token, address indexed depositor, uint256 amount, uint256 newVestingStart)\",\n \"event Released(address indexed token, uint256 creatorAmount, uint256 protocolAmount)\",\n]);\n","import { type Address, type PublicClient } from \"viem\";\nimport { vaultAbi } from \"../../abis/vault.js\";\nimport type { BuybackModule, PonsWallet, VestingState } from \"../../types.js\";\n\ntype ContractAddresses = { buybackVault: Address };\n\nexport function createBuybackModule(\n publicClient: PublicClient,\n wallet: PonsWallet | undefined,\n addresses: ContractAddresses,\n): BuybackModule {\n return {\n async getState(token: Address): Promise<VestingState> {\n const [totalLocked, totalReleased, vestedAmount, releasable, vestingStart, vestingDuration] =\n await Promise.all([\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"totalLocked\",\n args: [token],\n }),\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"totalReleased\",\n args: [token],\n }),\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"vestedAmount\",\n args: [token],\n }),\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"releasable\",\n args: [token],\n }),\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"vestingStart\",\n args: [token],\n }),\n publicClient.readContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"VESTING_DURATION\",\n }),\n ]);\n\n const progress = totalLocked > 0n ? Number(vestedAmount) / Number(totalLocked) : 0;\n\n return {\n totalLocked,\n totalReleased,\n vestedAmount,\n releasable,\n vestingStart,\n vestingDuration,\n progress,\n };\n },\n\n async release(token: Address): Promise<`0x${string}`> {\n if (!wallet) throw new Error(\"Wallet required for release\");\n const { request } = await publicClient.simulateContract({\n address: addresses.buybackVault,\n abi: vaultAbi,\n functionName: \"release\",\n args: [token],\n account: wallet.account!,\n });\n return wallet.writeContract(request);\n },\n };\n}\n","import { type Address, type PublicClient, parseAbiItem } from \"viem\";\nimport type {\n EventsModule,\n LaunchEvent,\n TradeEvent,\n FeeSweepEvent,\n TakeoverProposalEvent,\n} from \"../../types.js\";\n\ntype ContractAddresses = { factory: Address; memeHook: Address };\n\nexport function createEventsModule(\n publicClient: PublicClient,\n addresses: ContractAddresses,\n): EventsModule {\n return {\n async getLaunches(\n fromBlock: bigint,\n toBlock: bigint | \"latest\" = \"latest\",\n ): Promise<LaunchEvent[]> {\n const logs = await publicClient.getLogs({\n address: addresses.factory,\n event: parseAbiItem(\n \"event TokenLaunched(address indexed token, address indexed curve, address indexed deployer, address pairToken, uint256 launchConfigId, uint256 graduationThreshold)\",\n ),\n fromBlock,\n toBlock,\n });\n\n return logs.map((log) => ({\n token: log.args.token as Address,\n curve: log.args.curve as Address,\n deployer: log.args.deployer as Address,\n pairToken: log.args.pairToken as Address,\n launchConfigId: log.args.launchConfigId as bigint,\n graduationThreshold: log.args.graduationThreshold as bigint,\n blockNumber: log.blockNumber!,\n transactionHash: log.transactionHash,\n }));\n },\n\n async getTrades(\n curve: Address,\n fromBlock: bigint,\n toBlock: bigint | \"latest\" = \"latest\",\n ): Promise<TradeEvent[]> {\n const logs = await publicClient.getLogs({\n address: curve,\n events: [\n parseAbiItem(\n \"event CurveBuy(address indexed buyer, address indexed recipient, uint256 quoteIn, uint256 tokensOut, uint256 fee, uint256 tax)\",\n ),\n parseAbiItem(\n \"event CurveSell(address indexed seller, address indexed recipient, uint256 tokensIn, uint256 quoteOut, uint256 fee, uint256 tax)\",\n ),\n ],\n fromBlock,\n toBlock,\n });\n\n const events: TradeEvent[] = [];\n for (const log of logs) {\n if (log.eventName === \"CurveBuy\") {\n events.push({\n type: \"buy\",\n buyer: log.args.buyer as Address,\n recipient: log.args.recipient as Address,\n quoteIn: log.args.quoteIn as bigint,\n tokensOut: log.args.tokensOut as bigint,\n fee: log.args.fee as bigint,\n tax: log.args.tax as bigint,\n blockNumber: log.blockNumber!,\n transactionHash: log.transactionHash,\n });\n } else if (log.eventName === \"CurveSell\") {\n events.push({\n type: \"sell\",\n seller: log.args.seller as Address,\n recipient: log.args.recipient as Address,\n tokensIn: log.args.tokensIn as bigint,\n quoteOut: log.args.quoteOut as bigint,\n fee: log.args.fee as bigint,\n tax: log.args.tax as bigint,\n blockNumber: log.blockNumber!,\n transactionHash: log.transactionHash,\n });\n }\n }\n return events;\n },\n\n async getFeeSweeps(\n hook: Address,\n fromBlock: bigint,\n toBlock: bigint | \"latest\" = \"latest\",\n ): Promise<FeeSweepEvent[]> {\n const logs = await publicClient.getLogs({\n address: hook,\n event: parseAbiItem(\n \"event PoolFeesSwept(bytes32 indexed poolId, uint256 protocolAmount, uint256 buybackAmount, uint256 creatorAmount, uint256 tokensLocked)\",\n ),\n fromBlock,\n toBlock,\n });\n\n return logs.map((log) => ({\n poolId: log.args.poolId as `0x${string}`,\n protocolAmount: log.args.protocolAmount as bigint,\n buybackAmount: log.args.buybackAmount as bigint,\n creatorAmount: log.args.creatorAmount as bigint,\n tokensLocked: log.args.tokensLocked as bigint,\n blockNumber: log.blockNumber!,\n transactionHash: log.transactionHash,\n }));\n },\n\n async getTakeoverProposals(\n fromBlock: bigint,\n toBlock: bigint | \"latest\" = \"latest\",\n ): Promise<TakeoverProposalEvent[]> {\n const logs = await publicClient.getLogs({\n address: addresses.factory,\n event: parseAbiItem(\n \"event CreatorFeeRecipientChangeProposed(address indexed token, address indexed currentRecipient, address indexed newRecipient, uint256 effectiveAt, uint256 expiresAt)\",\n ),\n fromBlock,\n toBlock,\n });\n\n return logs.map((log) => ({\n token: log.args.token as Address,\n currentRecipient: log.args.currentRecipient as Address,\n newRecipient: log.args.newRecipient as Address,\n effectiveAt: log.args.effectiveAt as bigint,\n expiresAt: log.args.expiresAt as bigint,\n blockNumber: log.blockNumber!,\n transactionHash: log.transactionHash,\n }));\n },\n };\n}\n","import { type Address, type PublicClient } from \"viem\";\nimport { factoryAbi } from \"../../abis/factory.js\";\nimport type { TakeoverModule, PendingTakeover } from \"../../types.js\";\nimport { ZERO_ADDRESS } from \"../../constants.js\";\n\ntype ContractAddresses = { factory: Address };\n\nexport function createTakeoverModule(\n publicClient: PublicClient,\n addresses: ContractAddresses,\n): TakeoverModule {\n return {\n async getPending(token: Address): Promise<PendingTakeover> {\n const [recipient, effectiveAt, expiresAt] = await publicClient.readContract({\n address: addresses.factory,\n abi: factoryAbi,\n functionName: \"pendingCreatorFeeRecipient\",\n args: [token],\n });\n\n const isPending = recipient !== ZERO_ADDRESS && effectiveAt > 0n && expiresAt > 0n;\n\n return {\n proposedRecipient: recipient,\n effectiveAt,\n expiresAt,\n isPending,\n };\n },\n };\n}\n","import { type Address, type PublicClient, parseAbi } from \"viem\";\nimport type { MigrationModule, MigrationStatus, MigrationEpoch, PonsWallet } from \"../../types.js\";\n\nconst migrationAbi = parseAbi([\n \"function mandate() view returns (uint256)\",\n \"function totalDeposited() view returns (uint256)\",\n \"function settled() view returns (bool)\",\n \"function claimable() view returns (bool)\",\n \"function epochCount() view returns (uint256)\",\n \"function getEpoch(uint256 index) view returns (uint256 rate, uint256 cap, uint256 deposited, bool closed)\",\n \"function deposit(uint256 amount)\",\n \"function claim()\",\n]);\n\ntype ContractAddresses = Record<string, Address>;\n\nexport function createMigrationModule(\n publicClient: PublicClient,\n wallet: PonsWallet | undefined,\n _addresses: ContractAddresses,\n): MigrationModule {\n return {\n async getStatus(migrationAddress: Address): Promise<MigrationStatus> {\n const mandate = await publicClient.readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"mandate\",\n });\n\n const totalDeposited = await publicClient.readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"totalDeposited\",\n });\n\n const settled = await publicClient.readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"settled\",\n });\n\n const claimable = await publicClient.readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"claimable\",\n });\n\n const epochCount = await publicClient.readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"epochCount\",\n });\n\n const epochPromises: Promise<MigrationEpoch>[] = [];\n for (let i = 0; i < Number(epochCount); i++) {\n epochPromises.push(\n publicClient\n .readContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"getEpoch\",\n args: [BigInt(i)],\n })\n .then((result) => ({\n rate: result[0],\n cap: result[1],\n deposited: result[2],\n closed: result[3],\n })),\n );\n }\n\n const epochs = await Promise.all(epochPromises);\n\n return { mandate, totalDeposited, settled, claimable, epochs };\n },\n\n async deposit(migrationAddress: Address, amount: bigint): Promise<`0x${string}`> {\n if (!wallet) throw new Error(\"Wallet required for deposit\");\n const { request } = await publicClient.simulateContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"deposit\",\n args: [amount],\n account: wallet.account!,\n });\n return wallet.writeContract(request);\n },\n\n async claim(migrationAddress: Address): Promise<`0x${string}`> {\n if (!wallet) throw new Error(\"Wallet required for claim\");\n const { request } = await publicClient.simulateContract({\n address: migrationAddress,\n abi: migrationAbi,\n functionName: \"claim\",\n account: wallet.account!,\n });\n return wallet.writeContract(request);\n },\n };\n}\n","import { type PublicClient, createPublicClient, decodeEventLog, http } from \"viem\";\nimport { ROBINHOOD_CHAIN_ID, ADDRESSES } from \"./constants.js\";\nimport type { PonsClientConfig, PonsWallet } from \"./types.js\";\nimport { createFactoryModule } from \"./modules/factory/index.js\";\nimport { createCurveModule } from \"./modules/curve/index.js\";\nimport { createPoolModule } from \"./modules/pool/index.js\";\nimport { createFesModule } from \"./modules/fees/index.js\";\nimport { createBuybackModule } from \"./modules/buyback/index.js\";\nimport { createEventsModule } from \"./modules/events/index.js\";\nimport { createTakeoverModule } from \"./modules/takeover/index.js\";\nimport { createMigrationModule } from \"./modules/migration/index.js\";\n\n/** Robinhood Chain definition for viem */\nconst robinhoodChain = {\n id: ROBINHOOD_CHAIN_ID,\n name: \"Robinhood Chain\",\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: { http: [\"https://rpc.robinhood.com\"] },\n },\n} as const;\n\nexport interface PonsClient {\n publicClient: PublicClient;\n wallet: PonsWallet | undefined;\n chainId: number;\n factory: ReturnType<typeof createFactoryModule>;\n curve: ReturnType<typeof createCurveModule>;\n pool: ReturnType<typeof createPoolModule>;\n fees: ReturnType<typeof createFesModule>;\n buyback: ReturnType<typeof createBuybackModule>;\n events: ReturnType<typeof createEventsModule>;\n takeover: ReturnType<typeof createTakeoverModule>;\n migration: ReturnType<typeof createMigrationModule>;\n}\n\n/** Type for the deployed addresses record */\nexport type DeployedAddresses = typeof ADDRESSES;\n\n/**\n * Create a typed Pons v2 client.\n *\n * @example\n * ```ts\n * import { createPonsClient } from '@robhdev/pons-client';\n *\n * // Read-only client\n * const pons = createPonsClient({ rpcUrl: 'https://...' });\n * const configs = await pons.factory.openLaunchConfigs();\n *\n * // Write client with wallet\n * const pons = createPonsClient({\n * rpcUrl: 'https://...',\n * wallet: walletClient,\n * });\n * await pons.factory.launchToken(params, 0n, ZERO_ADDRESS);\n * ```\n */\nexport function createPonsClient(config: PonsClientConfig): PonsClient {\n const chain = {\n ...robinhoodChain,\n id: config.chainId ?? ROBINHOOD_CHAIN_ID,\n };\n\n const publicClient: PublicClient =\n config.publicClient ??\n createPublicClient({\n chain,\n transport: http(config.rpcUrl),\n });\n\n const wallet = config.wallet;\n\n const addresses: DeployedAddresses = ADDRESSES;\n\n const factory = createFactoryModule(publicClient, wallet, addresses);\n const curve = createCurveModule(publicClient, wallet, addresses);\n const pool = createPoolModule(publicClient, addresses);\n const fees = createFesModule(publicClient, wallet, addresses);\n const buyback = createBuybackModule(publicClient, wallet, addresses);\n const events = createEventsModule(publicClient, addresses);\n const takeover = createTakeoverModule(publicClient, addresses);\n const migration = createMigrationModule(publicClient, wallet, addresses);\n\n return {\n publicClient,\n wallet,\n chainId: chain.id,\n factory,\n curve,\n pool,\n fees,\n buyback,\n events,\n takeover,\n migration,\n };\n}\n\nexport { decodeEventLog };\nexport type { PonsClientConfig, PonsWallet };\n","import { parseAbi } from \"viem\";\n\nexport const tokenAbi = parseAbi([\n // ── ERC-20 Standard ──────────────────────────────────────────────────────\n \"function name() view returns (string)\",\n \"function symbol() view returns (string)\",\n \"function decimals() view returns (uint8)\",\n \"function totalSupply() view returns (uint256)\",\n \"function balanceOf(address account) view returns (uint256)\",\n \"function transfer(address to, uint256 amount) returns (bool)\",\n \"function allowance(address owner, address spender) view returns (uint256)\",\n \"function approve(address spender, uint256 amount) returns (bool)\",\n \"function transferFrom(address from, address to, uint256 amount) returns (bool)\",\n\n // ── Pons Token Info ──────────────────────────────────────────────────────\n \"struct Socials { string twitter; string telegram; string discord; string website; string farcaster; }\",\n \"function getTokenInfo() view returns (address tokenDeployer, string tokenLogo, string tokenDescription, Socials tokenSocials)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event Transfer(address indexed from, address indexed to, uint256 value)\",\n \"event Approval(address indexed owner, address indexed spender, uint256 value)\",\n]);\n","import { parseAbi } from \"viem\";\n\nexport const poolManagerAbi = parseAbi([\n // ── Pool Key Struct ──────────────────────────────────────────────────────\n \"struct PoolKey { address currency0; address currency1; uint24 fee; int24 tickSpacing; address hooks; }\",\n\n // ── Read Functions ───────────────────────────────────────────────────────\n \"function getPool(PoolKey key) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFeesToken0, uint24 protocolFeesToken1, uint24 lpFeesToken0, uint24 lpFeesToken1)\",\n \"function getSlot0(bytes32 poolId) view returns (uint160 sqrtPriceX96, int24 tick, uint24 protocolFeesToken0, uint24 protocolFeesToken1, uint24 lpFeesToken0, uint24 lpFeesToken1)\",\n\n // ── Events ───────────────────────────────────────────────────────────────\n \"event Swap(bytes32 indexed poolId, address indexed sender, int128 amount0, int128 amount1, uint160 sqrtPriceX96, uint128 liquidity, int24 tick, uint24 fee)\",\n \"event Initialize(bytes32 indexed poolId, address indexed currency0, address indexed currency1, uint24 fee, int24 tickSpacing, address hooks, uint160 sqrtPriceX96, int24 tick)\",\n]);\n","import { type Address, formatEther, formatUnits, getAddress, isAddress } from \"viem\";\nimport { ZERO_ADDRESS } from \"../constants.js\";\n\n/**\n * Normalize an address to checksummed form.\n * Returns ZERO_ADDRESS for nullish inputs.\n */\nexport function normalizeAddress(address?: Address | string | null): Address {\n if (!address || address === ZERO_ADDRESS) return ZERO_ADDRESS;\n return getAddress(address);\n}\n\n/**\n * Check if a value looks like a valid Ethereum address.\n */\nexport function isValidAddress(address: string): address is Address {\n try {\n return isAddress(address);\n } catch {\n return false;\n }\n}\n\n/**\n * Format a native ETH value (18 decimals) to a human-readable string.\n */\nexport function formatETH(value: bigint): string {\n return formatEther(value);\n}\n\n/**\n * Format a token amount using its decimal count.\n */\nexport function formatTokenAmount(value: bigint, decimals: number): string {\n return formatUnits(value, decimals);\n}\n\n/**\n * Parse a human-readable ETH string to bigint wei.\n * Uses viem's parseEther under the hood.\n */\nexport { parseEther, parseUnits } from \"viem\";\n\n/**\n * Shorten an address for display: 0x1234...5678\n */\nexport function shortenAddress(address: Address): string {\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pons-client",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Industry-standard TypeScript client for the Pons v2 token launch protocol on Robinhood Chain",
5
5
  "license": "MIT",
6
6
  "type": "module",