pons-client 0.1.1 → 0.2.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.cjs CHANGED
@@ -25,6 +25,7 @@ var PHASE = {
25
25
  PoolCreated: 2,
26
26
  Rescued: 3
27
27
  };
28
+ var SNIPE_TAX_DECAY_SECS = 5n;
28
29
  var SNIPE_TAX_DECAY_NS = 5000000000n;
29
30
  var MAX_SNIPE_EXEMPTIONS = 32;
30
31
  var VESTING_DURATION_SECS = 157680000n;
@@ -1028,6 +1029,7 @@ exports.MIGRATION_CLAIM_WINDOW_SECS = MIGRATION_CLAIM_WINDOW_SECS;
1028
1029
  exports.PHASE = PHASE;
1029
1030
  exports.ROBINHOOD_CHAIN_ID = ROBINHOOD_CHAIN_ID;
1030
1031
  exports.SNIPE_TAX_DECAY_NS = SNIPE_TAX_DECAY_NS;
1032
+ exports.SNIPE_TAX_DECAY_SECS = SNIPE_TAX_DECAY_SECS;
1031
1033
  exports.VESTING_DURATION_SECS = VESTING_DURATION_SECS;
1032
1034
  exports.ZERO_ADDRESS = ZERO_ADDRESS;
1033
1035
  exports.amountIn = amountIn;
@@ -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","decodeEventLog","keccak256","encodeAbiParameters","parseAbiItem","createPublicClient","http","getAddress","formatEther","formatUnits"],"mappings":"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","file":"index.cjs","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 decays over 5 seconds (in nanoseconds) */\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","decodeEventLog","keccak256","encodeAbiParameters","parseAbiItem","createPublicClient","http","getAddress","formatEther","formatUnits"],"mappings":"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","file":"index.cjs","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"]}
package/dist/index.d.cts CHANGED
@@ -25,7 +25,13 @@ declare const PHASE: {
25
25
  readonly Rescued: 3;
26
26
  };
27
27
  type Phase = (typeof PHASE)[keyof typeof PHASE];
28
- /** Snipe tax decays over 5 seconds (in nanoseconds) */
28
+ /** Snipe tax decay window in EVM timestamp seconds (block.timestamp units) */
29
+ declare const SNIPE_TAX_DECAY_SECS: 5n;
30
+ /**
31
+ * Snipe tax decay window expressed in nanoseconds (5 seconds).
32
+ * @deprecated Use SNIPE_TAX_DECAY_SECS when comparing against block timestamps.
33
+ * This alias preserves its original nanosecond value for backward compatibility.
34
+ */
29
35
  declare const SNIPE_TAX_DECAY_NS: 5000000000n;
30
36
  /** Maximum number of snipe tax exemptions per launch */
31
37
  declare const MAX_SNIPE_EXEMPTIONS: 32;
@@ -1859,4 +1865,4 @@ declare function requireValidSlippage(slippageBps: number): void;
1859
1865
  */
1860
1866
  declare function minOutputWithSlippage(quoted: bigint, slippageBps: number): bigint;
1861
1867
 
1862
- export { ADDRESSES, BPS, type BuyQuote, type BuyResult, type BuybackModule, type CurveModule, type CurveReserves, type CurveState, type DeployedAddresses, type EventsModule, type FactoryModule, type FeeBalance, type FeePolicy, type FeeSweepEvent, type FeesModule, type LaunchConfig, type LaunchConfigWithId, type LaunchEvent, type LaunchedToken, MAX_SNIPE_EXEMPTIONS, MIGRATION_CLAIM_WINDOW_SECS, type MigrationEpoch, type MigrationModule, type MigrationStatus, PHASE, type PendingTakeover, type Phase, type PonsClient, type PonsClientConfig, type PonsWallet, type PoolKey, type PoolModule, type QuoteAsset, ROBINHOOD_CHAIN_ID, SNIPE_TAX_DECAY_NS, type SellQuote, type SellResult, type Socials, type TakeoverModule, type TakeoverProposalEvent, type TokenInfo, type TokenParams, type TradeEvent, VESTING_DURATION_SECS, type VestingState, ZERO_ADDRESS, amountIn, amountOut, applyBps, ceilDiv, createPonsClient, curveAbi, escrowAbi, factoryAbi, formatETH, formatTokenAmount, graduationProgress, hookAbi, isValidAddress, marginalPrice, minOutputWithSlippage, normalizeAddress, poolManagerAbi, requirePositiveAmount, requireValidAddress, requireValidCreatorTax, requireValidExemptions, requireValidSlippage, routerAbi, shortenAddress, subtractBps, tokenAbi, vaultAbi };
1868
+ export { ADDRESSES, BPS, type BuyQuote, type BuyResult, type BuybackModule, type CurveModule, type CurveReserves, type CurveState, type DeployedAddresses, type EventsModule, type FactoryModule, type FeeBalance, type FeePolicy, type FeeSweepEvent, type FeesModule, type LaunchConfig, type LaunchConfigWithId, type LaunchEvent, type LaunchedToken, MAX_SNIPE_EXEMPTIONS, MIGRATION_CLAIM_WINDOW_SECS, type MigrationEpoch, type MigrationModule, type MigrationStatus, PHASE, type PendingTakeover, type Phase, type PonsClient, type PonsClientConfig, type PonsWallet, type PoolKey, type PoolModule, type QuoteAsset, ROBINHOOD_CHAIN_ID, SNIPE_TAX_DECAY_NS, SNIPE_TAX_DECAY_SECS, type SellQuote, type SellResult, type Socials, type TakeoverModule, type TakeoverProposalEvent, type TokenInfo, type TokenParams, type TradeEvent, VESTING_DURATION_SECS, type VestingState, ZERO_ADDRESS, amountIn, amountOut, applyBps, ceilDiv, createPonsClient, curveAbi, escrowAbi, factoryAbi, formatETH, formatTokenAmount, graduationProgress, hookAbi, isValidAddress, marginalPrice, minOutputWithSlippage, normalizeAddress, poolManagerAbi, requirePositiveAmount, requireValidAddress, requireValidCreatorTax, requireValidExemptions, requireValidSlippage, routerAbi, shortenAddress, subtractBps, tokenAbi, vaultAbi };
package/dist/index.d.ts CHANGED
@@ -25,7 +25,13 @@ declare const PHASE: {
25
25
  readonly Rescued: 3;
26
26
  };
27
27
  type Phase = (typeof PHASE)[keyof typeof PHASE];
28
- /** Snipe tax decays over 5 seconds (in nanoseconds) */
28
+ /** Snipe tax decay window in EVM timestamp seconds (block.timestamp units) */
29
+ declare const SNIPE_TAX_DECAY_SECS: 5n;
30
+ /**
31
+ * Snipe tax decay window expressed in nanoseconds (5 seconds).
32
+ * @deprecated Use SNIPE_TAX_DECAY_SECS when comparing against block timestamps.
33
+ * This alias preserves its original nanosecond value for backward compatibility.
34
+ */
29
35
  declare const SNIPE_TAX_DECAY_NS: 5000000000n;
30
36
  /** Maximum number of snipe tax exemptions per launch */
31
37
  declare const MAX_SNIPE_EXEMPTIONS: 32;
@@ -1859,4 +1865,4 @@ declare function requireValidSlippage(slippageBps: number): void;
1859
1865
  */
1860
1866
  declare function minOutputWithSlippage(quoted: bigint, slippageBps: number): bigint;
1861
1867
 
1862
- export { ADDRESSES, BPS, type BuyQuote, type BuyResult, type BuybackModule, type CurveModule, type CurveReserves, type CurveState, type DeployedAddresses, type EventsModule, type FactoryModule, type FeeBalance, type FeePolicy, type FeeSweepEvent, type FeesModule, type LaunchConfig, type LaunchConfigWithId, type LaunchEvent, type LaunchedToken, MAX_SNIPE_EXEMPTIONS, MIGRATION_CLAIM_WINDOW_SECS, type MigrationEpoch, type MigrationModule, type MigrationStatus, PHASE, type PendingTakeover, type Phase, type PonsClient, type PonsClientConfig, type PonsWallet, type PoolKey, type PoolModule, type QuoteAsset, ROBINHOOD_CHAIN_ID, SNIPE_TAX_DECAY_NS, type SellQuote, type SellResult, type Socials, type TakeoverModule, type TakeoverProposalEvent, type TokenInfo, type TokenParams, type TradeEvent, VESTING_DURATION_SECS, type VestingState, ZERO_ADDRESS, amountIn, amountOut, applyBps, ceilDiv, createPonsClient, curveAbi, escrowAbi, factoryAbi, formatETH, formatTokenAmount, graduationProgress, hookAbi, isValidAddress, marginalPrice, minOutputWithSlippage, normalizeAddress, poolManagerAbi, requirePositiveAmount, requireValidAddress, requireValidCreatorTax, requireValidExemptions, requireValidSlippage, routerAbi, shortenAddress, subtractBps, tokenAbi, vaultAbi };
1868
+ export { ADDRESSES, BPS, type BuyQuote, type BuyResult, type BuybackModule, type CurveModule, type CurveReserves, type CurveState, type DeployedAddresses, type EventsModule, type FactoryModule, type FeeBalance, type FeePolicy, type FeeSweepEvent, type FeesModule, type LaunchConfig, type LaunchConfigWithId, type LaunchEvent, type LaunchedToken, MAX_SNIPE_EXEMPTIONS, MIGRATION_CLAIM_WINDOW_SECS, type MigrationEpoch, type MigrationModule, type MigrationStatus, PHASE, type PendingTakeover, type Phase, type PonsClient, type PonsClientConfig, type PonsWallet, type PoolKey, type PoolModule, type QuoteAsset, ROBINHOOD_CHAIN_ID, SNIPE_TAX_DECAY_NS, SNIPE_TAX_DECAY_SECS, type SellQuote, type SellResult, type Socials, type TakeoverModule, type TakeoverProposalEvent, type TokenInfo, type TokenParams, type TradeEvent, VESTING_DURATION_SECS, type VestingState, ZERO_ADDRESS, amountIn, amountOut, applyBps, ceilDiv, createPonsClient, curveAbi, escrowAbi, factoryAbi, formatETH, formatTokenAmount, graduationProgress, hookAbi, isValidAddress, marginalPrice, minOutputWithSlippage, normalizeAddress, poolManagerAbi, requirePositiveAmount, requireValidAddress, requireValidCreatorTax, requireValidExemptions, requireValidSlippage, routerAbi, shortenAddress, subtractBps, tokenAbi, vaultAbi };
package/dist/index.js CHANGED
@@ -24,6 +24,7 @@ var PHASE = {
24
24
  PoolCreated: 2,
25
25
  Rescued: 3
26
26
  };
27
+ var SNIPE_TAX_DECAY_SECS = 5n;
27
28
  var SNIPE_TAX_DECAY_NS = 5000000000n;
28
29
  var MAX_SNIPE_EXEMPTIONS = 32;
29
30
  var VESTING_DURATION_SECS = 157680000n;
@@ -1016,6 +1017,6 @@ function shortenAddress(address) {
1016
1017
  return `${address.slice(0, 6)}...${address.slice(-4)}`;
1017
1018
  }
1018
1019
 
1019
- export { ADDRESSES, BPS, MAX_SNIPE_EXEMPTIONS, MIGRATION_CLAIM_WINDOW_SECS, PHASE, ROBINHOOD_CHAIN_ID, SNIPE_TAX_DECAY_NS, VESTING_DURATION_SECS, ZERO_ADDRESS, amountIn, amountOut, applyBps, ceilDiv, createPonsClient, curveAbi, escrowAbi, factoryAbi, formatETH, formatTokenAmount, graduationProgress, hookAbi, isValidAddress, marginalPrice, minOutputWithSlippage, normalizeAddress, poolManagerAbi, requirePositiveAmount, requireValidAddress, requireValidCreatorTax, requireValidExemptions, requireValidSlippage, routerAbi, shortenAddress, subtractBps, tokenAbi, vaultAbi };
1020
+ export { ADDRESSES, BPS, MAX_SNIPE_EXEMPTIONS, MIGRATION_CLAIM_WINDOW_SECS, PHASE, ROBINHOOD_CHAIN_ID, SNIPE_TAX_DECAY_NS, SNIPE_TAX_DECAY_SECS, VESTING_DURATION_SECS, ZERO_ADDRESS, amountIn, amountOut, applyBps, ceilDiv, createPonsClient, curveAbi, escrowAbi, factoryAbi, formatETH, formatTokenAmount, graduationProgress, hookAbi, isValidAddress, marginalPrice, minOutputWithSlippage, normalizeAddress, poolManagerAbi, requirePositiveAmount, requireValidAddress, requireValidCreatorTax, requireValidExemptions, requireValidSlippage, routerAbi, shortenAddress, subtractBps, tokenAbi, vaultAbi };
1020
1021
  //# sourceMappingURL=index.js.map
1021
1022
  //# sourceMappingURL=index.js.map
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":";;;;;;AAGO,IAAM,kBAAA,GAAqB;AAG3B,IAAM,GAAA,GAAM;AAGZ,IAAM,YAAA,GAAwB;AAI9B,IAAM,SAAA,GAAY;AAAA,EACvB,OAAA,EAAS,4CAAA;AAAA,EACT,QAAA,EAAU,4CAAA;AAAA,EACV,SAAA,EAAW,4CAAA;AAAA,EACX,YAAA,EAAc,4CAAA;AAAA,EACd,YAAA,EAAc,4CAAA;AAAA,EACd,YAAA,EAAc,4CAAA;AAAA,EACd,cAAA,EAAgB,4CAAA;AAAA,EAChB,kBAAA,EAAoB,4CAAA;AAAA,EACpB,eAAA,EAAiB;AACnB;AAIO,IAAM,KAAA,GAAQ;AAAA,EACnB,YAAA,EAAc,CAAA;AAAA,EACd,KAAA,EAAO,CAAA;AAAA,EACP,WAAA,EAAa,CAAA;AAAA,EACb,OAAA,EAAS;AACX;AAOO,IAAM,kBAAA,GAAqB;AAG3B,IAAM,oBAAA,GAAuB;AAG7B,IAAM,qBAAA,GAAwB;AAG9B,IAAM,2BAAA,GAA8B;AC9CpC,IAAM,aAAa,QAAA,CAAS;AAAA;AAAA,EAEjC,kKAAA;AAAA,EACA,uGAAA;AAAA,EACA,uNAAA;AAAA,EACA,yTAAA;AAAA,EACA,4JAAA;AAAA;AAAA,EAGA,qDAAA;AAAA,EACA,kEAAA;AAAA,EACA,uEAAA;AAAA,EACA,mGAAA;AAAA,EACA,6CAAA;AAAA,EACA,0DAAA;AAAA,EACA,mDAAA;AAAA,EACA,oEAAA;AAAA,EACA,iIAAA;AAAA,EACA,qEAAA;AAAA,EACA,6HAAA;AAAA;AAAA,EAGA,oIAAA;AAAA,EACA,kKAAA;AAAA,EACA,6CAAA;AAAA,EACA,2EAAA;AAAA;AAAA,EAGA,qKAAA;AAAA,EACA,mFAAA;AAAA,EACA,kEAAA;AAAA,EACA,mHAAA;AAAA,EACA;AACF,CAAC;ACjCM,IAAM,YAAYA,QAAAA,CAAS;AAAA;AAAA,EAEhC,uGAAA;AAAA,EACA,uNAAA;AAAA;AAAA,EAGA;AACF,CAAC;ACHM,SAAS,mBAAA,CAAoB,SAAkB,KAAA,EAAqB;AACzE,EAAA,IAAI,CAAC,SAAA,CAAU,OAAO,CAAA,EAAG;AACvB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAW,KAAK,CAAA,UAAA,EAAa,OAAO,CAAA,CAAE,CAAA;AAAA,EACxD;AACF;AAKO,SAAS,sBAAA,CAAuB,QAAgB,MAAA,EAAsB;AAC3E,EAAA,IAAI,SAAS,CAAA,EAAG;AACd,IAAA,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAAA,EAClD;AACA,EAAA,IAAI,MAAA,CAAO,MAAM,CAAA,GAAI,MAAA,EAAQ;AAC3B,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,YAAA,EAAe,MAAM,CAAA,0BAAA,EAA6B,MAAM,CAAA,IAAA,CAAM,CAAA;AAAA,EAChF;AACF;AAKO,SAAS,uBAAuB,UAAA,EAA6B;AAClE,EAAA,IAAI,UAAA,CAAW,SAAS,oBAAA,EAAsB;AAC5C,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mCAAA,EAAsC,UAAA,CAAW,MAAM,CAAA,MAAA,EAAS,oBAAoB,CAAA,CAAA;AAAA,KACtF;AAAA,EACF;AACF;AAKO,SAAS,qBAAA,CAAsB,QAAgB,KAAA,EAAqB;AACzE,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,uBAAA,EAA0B,MAAM,CAAA,CAAE,CAAA;AAAA,EAC5D;AACF;AAKO,SAAS,qBAAqB,WAAA,EAA2B;AAC9D,EAAA,IAAI,WAAA,GAAc,CAAA,IAAK,WAAA,GAAc,MAAA,CAAO,GAAG,CAAA,EAAG;AAChD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,WAAW,CAAA,gBAAA,EAAmB,GAAG,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3E;AACF;AAKO,SAAS,qBAAA,CAAsB,QAAgB,WAAA,EAA6B;AACjF,EAAA,MAAM,SAAA,GAAa,MAAA,GAAS,MAAA,CAAO,WAAW,CAAA,GAAK,GAAA;AACnD,EAAA,OAAO,MAAA,GAAS,SAAA;AAClB;;;ACvCO,SAAS,mBAAA,CACd,YAAA,EACA,MAAA,EACA,SAAA,EACe;AACf,EAAA,MAAM,IAAA,GAAO,OAAU,YAAA,EAAsB,IAAA,KAC3C,aAAa,YAAA,CAAa;AAAA,IACxB,SAAS,SAAA,CAAU,OAAA;AAAA,IACnB,GAAA,EAAK,UAAA;AAAA,IACL,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAEH,EAAA,MAAM,KAAA,GAAQ,OACZ,YAAA,EACA,IAAA,EACA,KAAA,KAC2B;AAC3B,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,sCAAsC,CAAA;AACnE,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,aAAa,gBAAA,CAAiB;AAAA,MACtD,SAAS,SAAA,CAAU,OAAA;AAAA,MACnB,GAAA,EAAK,UAAA;AAAA,MACL,YAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,iBAAA,GAAmD;AACvD,MAAA,MAAM,KAAA,GAAQ,MAAM,IAAA,CAAa,mBAAmB,CAAA;AACpD,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,QAC5B,KAAA,CAAM,IAAA;AAAA,UAAK,EAAE,MAAA,EAAQ,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA,UAAG,CAAC,GAAG,EAAA,KACxC,IAAA,CAAmB,mBAAmB,CAAC,MAAA,CAAO,EAAE,CAAC,CAAC;AAAA;AACpD,OACF;AACA,MAAA,OAAO,OAAA,CACJ,GAAA,CAAI,CAAC,MAAA,EAAQ,EAAA,MAA4B;AAAA,QACxC,EAAA,EAAI,OAAO,EAAE,CAAA;AAAA,QACb,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,qBAAqB,MAAA,CAAO,mBAAA;AAAA,QAC5B,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAS,MAAA,CAAO;AAAA,QAChB,CAAA,CACD,MAAA,CAAO,CAAC,MAAA,KAAW,OAAO,OAAO,CAAA;AAAA,IACtC,CAAA;AAAA,IAEA,MAAM,gBAAgB,EAAA,EAAmC;AACvD,MAAA,OAAO,IAAA,CAAmB,iBAAA,EAAmB,CAAC,EAAE,CAAC,CAAA;AAAA,IACnD,CAAA;AAAA,IAEA,MAAM,iBAAiB,KAAA,EAAwC;AAC7D,MAAA,OAAO,IAAA,CAAoB,kBAAA,EAAoB,CAAC,KAAK,CAAC,CAAA;AAAA,IACxD,CAAA;AAAA,IAEA,MAAM,sBAAA,CAAuB,QAAA,EAAkB,SAAA,EAAkC;AAC/E,MAAA,OAAO,IAAA,CAAU,wBAAA,EAA0B,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAAA,IAClE,CAAA;AAAA,IAEA,MAAM,SAAA,GAA6B;AACjC,MAAA,OAAO,KAAa,WAAW,CAAA;AAAA,IACjC,CAAA;AAAA,IAEA,MAAM,UAAU,OAAA,EAAoC;AAClD,MAAA,OAAO,IAAA,CAAc,WAAA,EAAa,CAAC,OAAO,CAAC,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,MAAM,gBAAA,GAAoC;AACxC,MAAA,OAAO,KAAa,kBAAkB,CAAA;AAAA,IACxC,CAAA;AAAA,IAEA,MAAM,mBAAmB,SAAA,EAAsC;AAC7D,MAAA,OAAO,IAAA,CAAc,oBAAA,EAAsB,CAAC,SAAS,CAAC,CAAA;AAAA,IACxD,CAAA;AAAA,IAEA,MAAM,mBAAmB,SAAA,EAItB;AACD,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAwC,oBAAA,EAAsB;AAAA,QACjF;AAAA,OACD,CAAA;AACD,MAAA,OAAO;AAAA,QACL,YAAA,EAAc,OAAO,CAAC,CAAA;AAAA,QACtB,mBAAA,EAAqB,OAAO,CAAC,CAAA;AAAA,QAC7B,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,CAAC,CAAC;AAAA,OAC5B;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,WAAA,CACJ,MAAA,EACA,UACA,SAAA,EACA,kBAAA,GAAgC,EAAC,EACT;AACxB,MAAA,mBAAA,CAAoB,WAAW,WAAW,CAAA;AAC1C,MAAA,sBAAA,CAAuB,MAAA,CAAO,aAAA,EAAe,MAAM,IAAA,CAAK,kBAAkB,CAAA;AAC1E,MAAA,sBAAA,CAAuB,kBAAkB,CAAA;AAEzC,MAAA,MAAM,CAAC,iBAAA,EAAmB,eAAe,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC7D,IAAA,CAAK,sBAAA,CAAuB,QAAA,EAAU,SAAS,CAAA;AAAA,QAC/C,KAAK,SAAA;AAAU,OAChB,CAAA;AAGD,MAAA,MAAM,YAAA,GAA4B;AAAA,QAChC,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,qBAAqB,MAAA,CAAO,mBAAA;AAAA,QAC5B,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,gBAAgB,MAAA,CAAO,cAAA;AAAA,QACvB,iBAAA;AAAA,QACA,MAAM,MAAA,CAAO;AAAA,OACf;AAEA,MAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,QAAA,OAAO,KAAA;AAAA,UACL,aAAA;AAAA,UACA,CAAC,YAAA,EAAc,QAAA,EAAU,SAAA,EAAW,kBAAkB,CAAA;AAAA,UACtD;AAAA,SACF;AAAA,MACF;AAEA,MAAA,OAAO,MAAM,aAAA,EAAe,CAAC,cAAc,QAAA,EAAU,SAAS,GAAG,eAAe,CAAA;AAAA,IAClF,CAAA;AAAA,IAEA,MAAM,YAAA,CACJ,MAAA,EACA,QAAA,EACA,SAAA,EACA,SACA,YAAA,EACA,SAAA,EACA,kBAAA,GAAgC,EAAC,EAMhC;AACD,MAAA,mBAAA,CAAoB,WAAW,WAAW,CAAA;AAC1C,MAAA,mBAAA,CAAoB,WAAW,WAAW,CAAA;AAC1C,MAAA,sBAAA,CAAuB,MAAA,CAAO,aAAA,EAAe,MAAM,IAAA,CAAK,kBAAkB,CAAA;AAC1E,MAAA,sBAAA,CAAuB,kBAAkB,CAAA;AAEzC,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,sCAAsC,CAAA;AAEnE,MAAA,MAAM,CAAC,iBAAA,EAAmB,eAAe,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAC7D,IAAA,CAAK,sBAAA,CAAuB,QAAA,EAAU,SAAS,CAAA;AAAA,QAC/C,KAAK,SAAA;AAAU,OAChB,CAAA;AAED,MAAA,MAAM,YAAA,GAA4B;AAAA,QAChC,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,QAAQ,MAAA,CAAO,MAAA;AAAA,QACf,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,qBAAqB,MAAA,CAAO,mBAAA;AAAA,QAC5B,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,gBAAgB,MAAA,CAAO,cAAA;AAAA,QACvB,iBAAA;AAAA,QACA,MAAM,MAAA,CAAO;AAAA,OACf;AAEA,MAAA,MAAM,KAAA,GAAQ,SAAA,KAAc,YAAA,GAAe,eAAA,GAAkB,OAAA,GAAU,eAAA;AAEvE,MAAA,MAAM,EAAE,OAAA,EAAS,MAAA,EAAO,GAAI,MAAM,aAAa,gBAAA,CAAiB;AAAA,QAC9D,SAAS,SAAA,CAAU,YAAA;AAAA,QACnB,GAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAc,cAAA;AAAA,QACd,IAAA,EAAM;AAAA,UACJ,YAAA;AAAA,UACA,QAAA;AAAA,UACA,SAAA;AAAA,UACA,OAAA;AAAA,UACA,YAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB;AAAA,OACD,CAAA;AAED,MAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,aAAA,CAAc,OAAO,CAAA;AAG/C,MAAA,MAAM,WAAA,GAAc,MAAA;AAEpB,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,KAAA,EAAO,YAAY,CAAC,CAAA;AAAA,QACpB,KAAA,EAAO,YAAY,CAAC,CAAA;AAAA,QACpB,SAAA,EAAW,YAAY,CAAC;AAAA,OAC1B;AAAA,IACF;AAAA,GACF;AACF;AChOO,IAAM,WAAWA,QAAAA,CAAS;AAAA;AAAA,EAE/B,kFAAA;AAAA,EACA,oDAAA;AAAA,EACA,kDAAA;AAAA,EACA,kDAAA;AAAA,EACA,uDAAA;AAAA,EACA,gDAAA;AAAA,EACA,0CAAA;AAAA,EACA,0CAAA;AAAA,EACA,iDAAA;AAAA,EACA,+CAAA;AAAA,EACA,8CAAA;AAAA,EACA,6CAAA;AAAA,EACA,uEAAA;AAAA,EACA,mDAAA;AAAA,EACA,qDAAA;AAAA;AAAA,EAGA,4GAAA;AAAA,EACA,oGAAA;AAAA,EACA,iDAAA;AAAA;AAAA,EAGA,gIAAA;AAAA,EACA,kIAAA;AAAA,EACA,sEAAA;AAAA,EACA,6CAAA;AAAA,EACA,6CAAA;AAAA,EACA,mDAAA;AAAA,EACA,8EAAA;AAAA,EACA;AACF,CAAC;;;AC7BM,SAAS,OAAA,CAAQ,GAAW,CAAA,EAAmB;AACpD,EAAA,IAAI,CAAA,KAAM,EAAA,EAAI,MAAM,IAAI,MAAM,kBAAkB,CAAA;AAChD,EAAA,OAAA,CAAQ,CAAA,GAAI,IAAI,EAAA,IAAM,CAAA;AACxB;AAQO,SAAS,SAAA,CAAU,QAAA,EAAkB,SAAA,EAAmB,UAAA,EAA4B;AACzF,EAAA,IAAI,aAAa,EAAA,IAAM,SAAA,KAAc,EAAA,IAAM,UAAA,KAAe,IAAI,OAAO,EAAA;AACrE,EAAA,OAAQ,QAAA,GAAW,cAAe,SAAA,GAAY,QAAA,CAAA;AAChD;AAQO,SAAS,QAAA,CAAS,SAAA,EAAmB,SAAA,EAAmB,UAAA,EAA4B;AACzF,EAAA,IAAI,SAAA,KAAc,EAAA,IAAM,UAAA,KAAe,EAAA,EAAI,OAAO,EAAA;AAClD,EAAA,IAAI,SAAA,IAAa,UAAA,EAAY,MAAM,IAAI,MAAM,wBAAwB,CAAA;AACrE,EAAA,OAAQ,SAAA,GAAY,SAAA,IAAc,UAAA,GAAa,SAAA,CAAA,GAAa,EAAA;AAC9D;AAMO,SAAS,QAAA,CAAS,QAAgB,GAAA,EAAqB;AAC5D,EAAA,OAAQ,SAAS,GAAA,GAAO,GAAA;AAC1B;AAKO,SAAS,WAAA,CAAY,QAAgB,GAAA,EAAqB;AAC/D,EAAA,OAAO,MAAA,GAAS,QAAA,CAAS,MAAA,EAAQ,GAAG,CAAA;AACtC;AAMO,SAAS,aAAA,CAAc,cAAsB,YAAA,EAA8B;AAChF,EAAA,IAAI,YAAA,KAAiB,IAAI,OAAO,CAAA;AAChC,EAAA,OAAO,MAAA,CAAO,YAAY,CAAA,GAAI,MAAA,CAAO,YAAY,CAAA;AACnD;AAKO,SAAS,kBAAA,CAAmB,QAAgB,SAAA,EAA2B;AAC5E,EAAA,IAAI,SAAA,KAAc,IAAI,OAAO,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,MAAA,GAAS,SAAA,GAAY,SAAA,GAAY,MAAA;AACjD,EAAA,OAAO,MAAA,CAAO,OAAO,CAAA,GAAI,MAAA,CAAO,SAAS,CAAA;AAC3C;;;AC/CO,SAAS,iBAAA,CACd,YAAA,EACA,MAAA,EACA,UAAA,EACa;AACb,EAAA,MAAM,OAAO,OACX,eAAA,EACA,YAAA,EACA,IAAA,KAEA,aAAa,YAAA,CAAa;AAAA,IACxB,OAAA,EAAS,eAAA;AAAA,IACT,GAAA,EAAK,QAAA;AAAA,IACL,YAAA;AAAA,IACA;AAAA,GACD,CAAA;AAEH,EAAA,MAAM,KAAA,GAAQ,OACZ,eAAA,EACA,YAAA,EACA,MACA,KAAA,KAC2B;AAC3B,IAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,sCAAsC,CAAA;AACnE,IAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,aAAa,gBAAA,CAAiB;AAAA,MACtD,OAAA,EAAS,eAAA;AAAA,MACT,GAAA,EAAK,QAAA;AAAA,MACL,YAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB;AAAA,KACD,CAAA;AACD,IAAA,OAAO,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,GAAA,CACJ,KAAA,EACA,OAAA,EACA,YAAA,EACA,WACA,KAAA,EACoB;AACpB,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAc,KAAA,EAAO,eAAe,CAAA;AAC3D,MAAA,MAAM,SAAA,GAAY,QAAA,GAAW,OAAA,GAAW,KAAA,IAAS,EAAA;AAEjD,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,KAAA,EAAO,KAAA,EAAO,CAAC,OAAA,EAAS,YAAA,EAAc,SAAS,CAAA,EAAG,SAAS,CAAA;AAEpF,MAAA,MAAM,UAAU,MAAM,YAAA,CAAa,yBAAA,CAA0B,EAAE,MAAM,CAAA;AACrE,MAAA,IAAI,SAAA,GAAY,EAAA;AAEhB,MAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,IAAA,EAAM;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,UAAU,cAAA,CAAe;AAAA,YAC7B,GAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,UAAA;AAAA,YACX,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,QAAQ,GAAA,CAAI;AAAA,WACb,CAAA;AACD,UAAA,IAAI,OAAA,CAAQ,cAAc,UAAA,EAAY;AACpC,YAAA,SAAA,GAAY,QAAQ,IAAA,CAAK,SAAA;AACzB,YAAA;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,WAAW,IAAA,EAAK;AAAA,IAC3B,CAAA;AAAA,IAEA,MAAM,IAAA,CACJ,KAAA,EACA,QAAA,EACA,aACA,SAAA,EACqB;AACrB,MAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,KAAA,EAAO,QAAQ,CAAC,QAAA,EAAU,WAAA,EAAa,SAAS,CAAC,CAAA;AAE1E,MAAA,MAAM,UAAU,MAAM,YAAA,CAAa,yBAAA,CAA0B,EAAE,MAAM,CAAA;AACrE,MAAA,IAAI,QAAA,GAAW,EAAA;AAEf,MAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,IAAA,EAAM;AAC9B,QAAA,IAAI;AACF,UAAA,MAAM,UAAU,cAAA,CAAe;AAAA,YAC7B,GAAA,EAAK,QAAA;AAAA,YACL,SAAA,EAAW,WAAA;AAAA,YACX,MAAM,GAAA,CAAI,IAAA;AAAA,YACV,QAAQ,GAAA,CAAI;AAAA,WACb,CAAA;AACD,UAAA,IAAI,OAAA,CAAQ,cAAc,WAAA,EAAa;AACrC,YAAA,QAAA,GAAW,QAAQ,IAAA,CAAK,QAAA;AACxB,YAAA;AAAA,UACF;AAAA,QACF,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,OAAO,EAAE,UAAU,IAAA,EAAK;AAAA,IAC1B,CAAA;AAAA,IAEA,MAAM,QAAA,CAAS,KAAA,EAAgB,OAAA,EAAiB,SAAA,EAAuC;AACrF,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QAChC,IAAA,CAAgC,OAAO,aAAa,CAAA;AAAA,QACpD,IAAA,CAAa,OAAO,gBAAgB,CAAA;AAAA,QACpC,IAAA,CAAa,OAAO,QAAQ,CAAA;AAAA,QAC5B,IAAA,CAAa,OAAO,eAAe,CAAA;AAAA,QACnC,IAAA,CAAa,KAAA,EAAO,oBAAA,EAAsB,CAAC,SAAS,CAAC;AAAA,OACtD,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,QAAQ,CAAC,CAAA;AAC1B,MAAA,MAAM,QAAA,GAAW,QAAQ,CAAC,CAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,MAAA,MAAM,aAAA,GAAgB,QAAQ,CAAC,CAAA;AAC/B,MAAA,MAAM,WAAA,GAAc,QAAQ,CAAC,CAAA;AAE7B,MAAA,MAAM,YAAA,GAAe,SAAS,CAAC,CAAA;AAC/B,MAAA,MAAM,YAAA,GAAe,SAAS,CAAC,CAAA;AAG/B,MAAA,IAAI,QAAA,GAAW,WAAA;AACf,MAAA,IAAI,WAAW,EAAA,EAAI;AACjB,QAAA,MAAM,WAAA,GAAc,GAAA,GAAM,MAAA,GAAS,aAAA,GAAgB,IAAA;AACnD,QAAA,IAAI,QAAA,GAAW,aAAa,QAAA,GAAW,WAAA;AAAA,MACzC;AAGA,MAAA,IAAI,KAAA,GAAQ,OAAA;AACZ,MAAA,MAAM,GAAA,GAAO,QAAQ,MAAA,GAAU,GAAA;AAC/B,MAAA,MAAM,GAAA,GAAO,QAAQ,aAAA,GAAiB,GAAA;AACtC,MAAA,MAAM,QAAA,GAAY,QAAQ,QAAA,GAAY,GAAA;AACtC,MAAA,IAAI,YAAY,SAAA,CAAU,KAAA,GAAQ,MAAM,GAAA,GAAM,QAAA,EAAU,cAAc,YAAY,CAAA;AAGlF,MAAA,IAAI,YAAY,QAAA,EAAU;AACxB,QAAA,SAAA,GAAY,QAAA;AACZ,QAAA,MAAM,GAAA,GAAM,QAAA,CAAS,QAAA,EAAU,YAAA,EAAc,YAAY,CAAA;AACzD,QAAA,MAAM,QAAA,GAAW,GAAA,GAAM,MAAA,GAAS,aAAA,GAAgB,QAAA;AAChD,QAAA,IAAI,YAAY,EAAA,EAAI;AAElB,UAAA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,EAAA,EAAI,QAAQ,OAAA,EAAQ;AAAA,QACjD;AACA,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,GAAM,GAAA,EAAK,QAAQ,CAAA;AAC3C,QAAA,KAAA,GAAQ,OAAA,GAAU,UAAU,OAAA,GAAU,OAAA;AAAA,MACxC;AAEA,MAAA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,UAAU,KAAA,EAAM;AAAA,IACrD,CAAA;AAAA,IAEA,MAAM,SAAA,CAAU,KAAA,EAAgB,QAAA,EAAsC;AACpE,MAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QAChC,IAAA,CAAgC,OAAO,aAAa,CAAA;AAAA,QACpD,IAAA,CAAa,OAAO,QAAQ,CAAA;AAAA,QAC5B,IAAA,CAAa,OAAO,eAAe;AAAA,OACpC,CAAA;AAED,MAAA,MAAM,QAAA,GAAW,QAAQ,CAAC,CAAA;AAC1B,MAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,MAAA,MAAM,aAAA,GAAgB,QAAQ,CAAC,CAAA;AAE/B,MAAA,MAAM,YAAA,GAAe,SAAS,CAAC,CAAA;AAC/B,MAAA,MAAM,YAAA,GAAe,SAAS,CAAC,CAAA;AAG/B,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,QAAA,EAAU,YAAA,EAAc,YAAY,CAAA;AAC5D,MAAA,MAAM,GAAA,GAAO,QAAQ,MAAA,GAAU,GAAA;AAC/B,MAAA,MAAM,GAAA,GAAO,QAAQ,aAAA,GAAiB,GAAA;AACtC,MAAA,OAAO,EAAE,QAAA,EAAU,KAAA,GAAQ,GAAA,GAAM,GAAA,EAAI;AAAA,IACvC,CAAA;AAAA,IAEA,MAAM,SAAS,KAAA,EAAqC;AAClD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAgC,KAAA,EAAO,aAAa,CAAA;AAC3E,MAAA,MAAM;AAAA,QACJ,gBAAA;AAAA,QACA,cAAA;AAAA,QACA,mBAAA;AAAA,QACA,eAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,cAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF,GAAI,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QACpB,IAAA,CAAa,OAAO,kBAAkB,CAAA;AAAA,QACtC,IAAA,CAAa,OAAO,gBAAgB,CAAA;AAAA,QACpC,IAAA,CAAa,OAAO,qBAAqB,CAAA;AAAA,QACzC,IAAA,CAAc,OAAO,iBAAiB,CAAA;AAAA,QACtC,IAAA,CAAc,OAAO,WAAW,CAAA;AAAA,QAChC,IAAA,CAAa,OAAO,QAAQ,CAAA;AAAA,QAC5B,IAAA,CAAa,OAAO,eAAe,CAAA;AAAA,QACnC,IAAA,CAAc,OAAO,gBAAgB,CAAA;AAAA,QACrC,IAAA,CAAc,OAAO,eAAe,CAAA;AAAA,QACpC,IAAA,CAAc,OAAO,WAAW;AAAA,OACjC,CAAA;AAED,MAAA,OAAO;AAAA,QACL,QAAA,EAAU;AAAA,UACR,YAAA,EAAc,SAAS,CAAC,CAAA;AAAA,UACxB,YAAA,EAAc,SAAS,CAAC;AAAA,SAC1B;AAAA,QACA,gBAAA;AAAA,QACA,cAAA;AAAA,QACA,mBAAA;AAAA,QACA,eAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA,aAAA;AAAA,QACA,cAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,YAAY,KAAA,EAAwC;AACxD,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAgC,KAAA,EAAO,aAAa,CAAA;AAC3E,MAAA,OAAO,EAAE,cAAc,QAAA,CAAS,CAAC,GAAG,YAAA,EAAc,QAAA,CAAS,CAAC,CAAA,EAAE;AAAA,IAChE,CAAA;AAAA,IAEA,MAAM,eAAe,KAAA,EAAiC;AACpD,MAAA,OAAO,IAAA,CAAa,OAAO,gBAAgB,CAAA;AAAA,IAC7C,CAAA;AAAA,IAEA,MAAM,gBAAgB,KAAA,EAAkC;AACtD,MAAA,OAAO,IAAA,CAAc,OAAO,iBAAiB,CAAA;AAAA,IAC/C,CAAA;AAAA,IAEA,MAAM,kBAAA,CAAmB,KAAA,EAAgB,SAAA,EAAqC;AAC5E,MAAA,OAAO,IAAA,CAAa,KAAA,EAAO,oBAAA,EAAsB,CAAC,SAAS,CAAC,CAAA;AAAA,IAC9D;AAAA,GACF;AACF;ACvPO,IAAM,UAAUA,QAAAA,CAAS;AAAA;AAAA,EAE9B,+EAAA;AAAA,EACA,qFAAA;AAAA;AAAA,EAGA,iGAAA;AAAA,EACA,0GAAA;AAAA,EACA,oEAAA;AAAA,EACA;AACF,CAAC;;;ACNM,SAAS,gBAAA,CACd,cACA,SAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACL,aAAa,MAAA,EAAgC;AAG3C,MAAA,MAAM,CAAC,WAAW,SAAS,CAAA,GACzB,OAAO,SAAA,CAAU,WAAA,EAAY,GAAI,MAAA,CAAO,KAAA,CAAM,WAAA,KAC1C,CAAC,MAAA,CAAO,WAAW,MAAA,CAAO,KAAK,IAC/B,CAAC,MAAA,CAAO,KAAA,EAAO,MAAA,CAAO,SAAS,CAAA;AAErC,MAAA,OAAO;AAAA,QACL,SAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAK,MAAA,CAAO,OAAA;AAAA,QACZ,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,OAAO,SAAA,CAAU;AAAA,OACnB;AAAA,IACF,CAAA;AAAA,IAEA,UAAU,MAAA,EAAsC;AAC9C,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,YAAA,CAAa,MAAM,CAAA;AACxC,MAAA,OAAO,SAAA;AAAA,QACL,mBAAA;AAAA,UACE;AAAA,YACE,EAAE,MAAM,SAAA,EAAU;AAAA,YAClB,EAAE,MAAM,SAAA,EAAU;AAAA,YAClB,EAAE,MAAM,QAAA,EAAS;AAAA,YACjB,EAAE,MAAM,OAAA,EAAQ;AAAA,YAChB,EAAE,MAAM,SAAA;AAAU,WACpB;AAAA,UACA,CAAC,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,QAAQ,GAAA,EAAK,OAAA,CAAQ,WAAA,EAAa,OAAA,CAAQ,KAAK;AAAA;AACxF,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,MAAA,EAAuB,QAAA,EAAoC;AAC3E,MAAA,OAAO,aAAa,YAAA,CAAa;AAAA,QAC/B,SAAS,SAAA,CAAU,QAAA;AAAA,QACnB,GAAA,EAAK,OAAA;AAAA,QACL,YAAA,EAAc,aAAA;AAAA,QACd,IAAA,EAAM,CAAC,MAAA,EAAQ,QAAQ;AAAA,OACxB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,iBAAA,CAAkB,MAAA,EAAuB,QAAA,EAAoC;AACjF,MAAA,OAAO,aAAa,YAAA,CAAa;AAAA,QAC/B,SAAS,SAAA,CAAU,QAAA;AAAA,QACnB,GAAA,EAAK,OAAA;AAAA,QACL,YAAA,EAAc,mBAAA;AAAA,QACd,IAAA,EAAM,CAAC,MAAA,EAAQ,QAAQ;AAAA,OACxB,CAAA;AAAA,IACH;AAAA,GACF;AACF;AC5DO,IAAM,YAAYA,QAAAA,CAAS;AAAA;AAAA,EAEhC,8DAAA;AAAA,EACA,kFAAA;AAAA;AAAA,EAGA,kBAAA;AAAA,EACA,oCAAA;AAAA;AAAA,EAGA,2DAAA;AAAA,EACA,0DAAA;AAAA,EACA,uFAAA;AAAA,EACA;AACF,CAAC;;;ACPM,SAAS,eAAA,CACd,YAAA,EACA,MAAA,EACA,SAAA,EACY;AACZ,EAAA,OAAO;AAAA,IACL,MAAM,WAAW,SAAA,EAAqC;AACpD,MAAA,OAAO,aAAa,YAAA,CAAa;AAAA,QAC/B,SAAS,SAAA,CAAU,SAAA;AAAA,QACnB,GAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAc,WAAA;AAAA,QACd,IAAA,EAAM,CAAC,SAAS;AAAA,OACjB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,eAAA,CAAgB,SAAA,EAAoB,KAAA,EAAiC;AACzE,MAAA,OAAO,aAAa,YAAA,CAAa;AAAA,QAC/B,SAAS,SAAA,CAAU,SAAA;AAAA,QACnB,GAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAc,gBAAA;AAAA,QACd,IAAA,EAAM,CAAC,SAAA,EAAW,KAAK;AAAA,OACxB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,KAAA,GAAgC;AACpC,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,2BAA2B,CAAA;AACxD,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,aAAa,gBAAA,CAAiB;AAAA,QACtD,SAAS,SAAA,CAAU,SAAA;AAAA,QACnB,GAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAc,OAAA;AAAA,QACd,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,MAAM,WAAW,KAAA,EAAwC;AACvD,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,gCAAgC,CAAA;AAC7D,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,aAAa,gBAAA,CAAiB;AAAA,QACtD,SAAS,SAAA,CAAU,SAAA;AAAA,QACnB,GAAA,EAAK,SAAA;AAAA,QACL,YAAA,EAAc,YAAA;AAAA,QACd,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,QACZ,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,MAAM,iBAAA,CACJ,KAAA,EACA,oBAAA,EAC6D;AAC7D,MAAA,MAAM,CAAC,WAAA,EAAa,iBAAiB,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QACzD,aAAa,YAAA,CAAa;AAAA,UACxB,OAAA,EAAS,KAAA;AAAA,UACT,GAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,QACD,aAAa,YAAA,CAAa;AAAA,UACxB,OAAA,EAAS,KAAA;AAAA,UACT,GAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAc;AAAA,SACf;AAAA,OACF,CAAA;AACD,MAAA,OAAO,EAAE,aAAa,iBAAA,EAAkB;AAAA,IAC1C,CAAA;AAAA,IAEA,MAAM,kBAAA,CACJ,MAAA,EACA,aAAA,EAC6D;AAC7D,MAAA,MAAM,CAAC,WAAA,EAAa,iBAAiB,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QACzD,aAAa,YAAA,CAAa;AAAA,UACxB,SAAS,SAAA,CAAU,QAAA;AAAA,UACnB,GAAA,EAAK,OAAA;AAAA,UACL,YAAA,EAAc,aAAA;AAAA,UACd,IAAA,EAAM,CAAC,MAAA,EAAQ,aAAa;AAAA,SAC7B,CAAA;AAAA,QACD,aAAa,YAAA,CAAa;AAAA,UACxB,SAAS,SAAA,CAAU,QAAA;AAAA,UACnB,GAAA,EAAK,OAAA;AAAA,UACL,YAAA,EAAc,mBAAA;AAAA,UACd,IAAA,EAAM,CAAC,MAAA,EAAQ,aAAa;AAAA,SAC7B;AAAA,OACF,CAAA;AACD,MAAA,OAAO,EAAE,aAAa,iBAAA,EAAkB;AAAA,IAC1C,CAAA;AAAA,IAEA,MAAM,aAAa,KAAA,EAAoC;AACrD,MAAA,OAAO,aAAa,YAAA,CAAa;AAAA,QAC/B,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,GAAA,EAAK,UAAA;AAAA,QACL,YAAA,EAAc,oBAAA;AAAA,QACd,IAAA,EAAM,CAAC,KAAK;AAAA,OACb,CAAA;AAAA,IACH;AAAA,GACF;AACF;ACvGO,IAAM,WAAWA,QAAAA,CAAS;AAAA;AAAA,EAE/B,4DAAA;AAAA,EACA,8DAAA;AAAA,EACA,6DAAA;AAAA,EACA,2DAAA;AAAA,EACA,6DAAA;AAAA,EACA,oDAAA;AAAA;AAAA,EAGA,4DAAA;AAAA;AAAA,EAGA,2EAAA;AAAA,EACA;AACF,CAAC;;;ACXM,SAAS,mBAAA,CACd,YAAA,EACA,MAAA,EACA,SAAA,EACe;AACf,EAAA,OAAO;AAAA,IACL,MAAM,SAAS,KAAA,EAAuC;AACpD,MAAA,MAAM,CAAC,WAAA,EAAa,aAAA,EAAe,YAAA,EAAc,UAAA,EAAY,cAAc,eAAe,CAAA,GACxF,MAAM,OAAA,CAAQ,GAAA,CAAI;AAAA,QAChB,aAAa,YAAA,CAAa;AAAA,UACxB,SAAS,SAAA,CAAU,YAAA;AAAA,UACnB,GAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAc,aAAA;AAAA,UACd,IAAA,EAAM,CAAC,KAAK;AAAA,SACb,CAAA;AAAA,QACD,aAAa,YAAA,CAAa;AAAA,UACxB,SAAS,SAAA,CAAU,YAAA;AAAA,UACnB,GAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAc,eAAA;AAAA,UACd,IAAA,EAAM,CAAC,KAAK;AAAA,SACb,CAAA;AAAA,QACD,aAAa,YAAA,CAAa;AAAA,UACxB,SAAS,SAAA,CAAU,YAAA;AAAA,UACnB,GAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAc,cAAA;AAAA,UACd,IAAA,EAAM,CAAC,KAAK;AAAA,SACb,CAAA;AAAA,QACD,aAAa,YAAA,CAAa;AAAA,UACxB,SAAS,SAAA,CAAU,YAAA;AAAA,UACnB,GAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAc,YAAA;AAAA,UACd,IAAA,EAAM,CAAC,KAAK;AAAA,SACb,CAAA;AAAA,QACD,aAAa,YAAA,CAAa;AAAA,UACxB,SAAS,SAAA,CAAU,YAAA;AAAA,UACnB,GAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAc,cAAA;AAAA,UACd,IAAA,EAAM,CAAC,KAAK;AAAA,SACb,CAAA;AAAA,QACD,aAAa,YAAA,CAAa;AAAA,UACxB,SAAS,SAAA,CAAU,YAAA;AAAA,UACnB,GAAA,EAAK,QAAA;AAAA,UACL,YAAA,EAAc;AAAA,SACf;AAAA,OACF,CAAA;AAEH,MAAA,MAAM,QAAA,GAAW,cAAc,EAAA,GAAK,MAAA,CAAO,YAAY,CAAA,GAAI,MAAA,CAAO,WAAW,CAAA,GAAI,CAAA;AAEjF,MAAA,OAAO;AAAA,QACL,WAAA;AAAA,QACA,aAAA;AAAA,QACA,YAAA;AAAA,QACA,UAAA;AAAA,QACA,YAAA;AAAA,QACA,eAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,QAAQ,KAAA,EAAwC;AACpD,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAC1D,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,aAAa,gBAAA,CAAiB;AAAA,QACtD,SAAS,SAAA,CAAU,YAAA;AAAA,QACnB,GAAA,EAAK,QAAA;AAAA,QACL,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,QACZ,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,IACrC;AAAA,GACF;AACF;AClEO,SAAS,kBAAA,CACd,cACA,SAAA,EACc;AACd,EAAA,OAAO;AAAA,IACL,MAAM,WAAA,CACJ,SAAA,EACA,OAAA,GAA6B,QAAA,EACL;AACxB,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,OAAA,CAAQ;AAAA,QACtC,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,KAAA,EAAO,YAAA;AAAA,UACL;AAAA,SACF;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QACxB,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA;AAAA,QAChB,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA;AAAA,QAChB,QAAA,EAAU,IAAI,IAAA,CAAK,QAAA;AAAA,QACnB,SAAA,EAAW,IAAI,IAAA,CAAK,SAAA;AAAA,QACpB,cAAA,EAAgB,IAAI,IAAA,CAAK,cAAA;AAAA,QACzB,mBAAA,EAAqB,IAAI,IAAA,CAAK,mBAAA;AAAA,QAC9B,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,iBAAiB,GAAA,CAAI;AAAA,OACvB,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,SAAA,CACJ,KAAA,EACA,SAAA,EACA,UAA6B,QAAA,EACN;AACvB,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,OAAA,CAAQ;AAAA,QACtC,OAAA,EAAS,KAAA;AAAA,QACT,MAAA,EAAQ;AAAA,UACN,YAAA;AAAA,YACE;AAAA,WACF;AAAA,UACA,YAAA;AAAA,YACE;AAAA;AACF,SACF;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,MAAM,SAAuB,EAAC;AAC9B,MAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,QAAA,IAAI,GAAA,CAAI,cAAc,UAAA,EAAY;AAChC,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,IAAA,EAAM,KAAA;AAAA,YACN,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA;AAAA,YAChB,SAAA,EAAW,IAAI,IAAA,CAAK,SAAA;AAAA,YACpB,OAAA,EAAS,IAAI,IAAA,CAAK,OAAA;AAAA,YAClB,SAAA,EAAW,IAAI,IAAA,CAAK,SAAA;AAAA,YACpB,GAAA,EAAK,IAAI,IAAA,CAAK,GAAA;AAAA,YACd,GAAA,EAAK,IAAI,IAAA,CAAK,GAAA;AAAA,YACd,aAAa,GAAA,CAAI,WAAA;AAAA,YACjB,iBAAiB,GAAA,CAAI;AAAA,WACtB,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,GAAA,CAAI,SAAA,KAAc,WAAA,EAAa;AACxC,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,IAAA,EAAM,MAAA;AAAA,YACN,MAAA,EAAQ,IAAI,IAAA,CAAK,MAAA;AAAA,YACjB,SAAA,EAAW,IAAI,IAAA,CAAK,SAAA;AAAA,YACpB,QAAA,EAAU,IAAI,IAAA,CAAK,QAAA;AAAA,YACnB,QAAA,EAAU,IAAI,IAAA,CAAK,QAAA;AAAA,YACnB,GAAA,EAAK,IAAI,IAAA,CAAK,GAAA;AAAA,YACd,GAAA,EAAK,IAAI,IAAA,CAAK,GAAA;AAAA,YACd,aAAa,GAAA,CAAI,WAAA;AAAA,YACjB,iBAAiB,GAAA,CAAI;AAAA,WACtB,CAAA;AAAA,QACH;AAAA,MACF;AACA,MAAA,OAAO,MAAA;AAAA,IACT,CAAA;AAAA,IAEA,MAAM,YAAA,CACJ,IAAA,EACA,SAAA,EACA,UAA6B,QAAA,EACH;AAC1B,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,OAAA,CAAQ;AAAA,QACtC,OAAA,EAAS,IAAA;AAAA,QACT,KAAA,EAAO,YAAA;AAAA,UACL;AAAA,SACF;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QACxB,MAAA,EAAQ,IAAI,IAAA,CAAK,MAAA;AAAA,QACjB,SAAA,EAAW,IAAI,IAAA,CAAK,SAAA;AAAA,QACpB,SAAA,EAAW,IAAI,IAAA,CAAK,SAAA;AAAA,QACpB,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,iBAAiB,GAAA,CAAI;AAAA,OACvB,CAAE,CAAA;AAAA,IACJ,CAAA;AAAA,IAEA,MAAM,oBAAA,CACJ,SAAA,EACA,OAAA,GAA6B,QAAA,EACK;AAClC,MAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,OAAA,CAAQ;AAAA,QACtC,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,KAAA,EAAO,YAAA;AAAA,UACL;AAAA,SACF;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,MAAS;AAAA,QACxB,KAAA,EAAO,IAAI,IAAA,CAAK,KAAA;AAAA,QAChB,YAAA,EAAc,IAAI,IAAA,CAAK,YAAA;AAAA,QACvB,WAAA,EAAa,IAAI,IAAA,CAAK,WAAA;AAAA,QACtB,aAAa,GAAA,CAAI,WAAA;AAAA,QACjB,iBAAiB,GAAA,CAAI;AAAA,OACvB,CAAE,CAAA;AAAA,IACJ;AAAA,GACF;AACF;;;ACjIO,SAAS,oBAAA,CACd,cACA,SAAA,EACgB;AAChB,EAAA,OAAO;AAAA,IACL,MAAM,WAAW,KAAA,EAA0C;AACzD,MAAA,MAAM,CAAC,SAAA,EAAW,WAAA,EAAa,SAAS,CAAA,GAAI,MAAM,aAAa,YAAA,CAAa;AAAA,QAC1E,SAAS,SAAA,CAAU,OAAA;AAAA,QACnB,GAAA,EAAK,UAAA;AAAA,QACL,YAAA,EAAc,4BAAA;AAAA,QACd,IAAA,EAAM,CAAC,KAAK;AAAA,OACb,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,SAAA,KAAc,YAAA,IAAgB,WAAA,GAAc,MAAM,SAAA,GAAY,EAAA;AAEhF,MAAA,OAAO;AAAA,QACL,iBAAA,EAAmB,SAAA;AAAA,QACnB,WAAA;AAAA,QACA,SAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAAA,GACF;AACF;AC3BA,IAAM,eAAeA,QAAAA,CAAS;AAAA,EAC5B,2CAAA;AAAA,EACA,kDAAA;AAAA,EACA,wCAAA;AAAA,EACA,0CAAA;AAAA,EACA,8CAAA;AAAA,EACA,2GAAA;AAAA,EACA,kCAAA;AAAA,EACA;AACF,CAAC,CAAA;AAIM,SAAS,qBAAA,CACd,YAAA,EACA,MAAA,EACA,UAAA,EACiB;AACjB,EAAA,OAAO;AAAA,IACL,MAAM,UAAU,gBAAA,EAAqD;AACnE,MAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,QAC9C,OAAA,EAAS,gBAAA;AAAA,QACT,GAAA,EAAK,YAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAED,MAAA,MAAM,cAAA,GAAiB,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,QACrD,OAAA,EAAS,gBAAA;AAAA,QACT,GAAA,EAAK,YAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAED,MAAA,MAAM,OAAA,GAAU,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,QAC9C,OAAA,EAAS,gBAAA;AAAA,QACT,GAAA,EAAK,YAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAED,MAAA,MAAM,SAAA,GAAY,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,QAChD,OAAA,EAAS,gBAAA;AAAA,QACT,GAAA,EAAK,YAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,MAAM,YAAA,CAAa,YAAA,CAAa;AAAA,QACjD,OAAA,EAAS,gBAAA;AAAA,QACT,GAAA,EAAK,YAAA;AAAA,QACL,YAAA,EAAc;AAAA,OACf,CAAA;AAED,MAAA,MAAM,gBAA2C,EAAC;AAClD,MAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,UAAU,GAAG,CAAA,EAAA,EAAK;AAC3C,QAAA,aAAA,CAAc,IAAA;AAAA,UACZ,aACG,YAAA,CAAa;AAAA,YACZ,OAAA,EAAS,gBAAA;AAAA,YACT,GAAA,EAAK,YAAA;AAAA,YACL,YAAA,EAAc,UAAA;AAAA,YACd,IAAA,EAAM,CAAC,MAAA,CAAO,CAAC,CAAC;AAAA,WACjB,CAAA,CACA,IAAA,CAAK,CAAC,MAAA,MAAY;AAAA,YACjB,IAAA,EAAM,OAAO,CAAC,CAAA;AAAA,YACd,GAAA,EAAK,OAAO,CAAC,CAAA;AAAA,YACb,SAAA,EAAW,OAAO,CAAC,CAAA;AAAA,YACnB,MAAA,EAAQ,OAAO,CAAC;AAAA,WAClB,CAAE;AAAA,SACN;AAAA,MACF;AAEA,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AAE9C,MAAA,OAAO,EAAE,OAAA,EAAS,cAAA,EAAgB,OAAA,EAAS,WAAW,MAAA,EAAO;AAAA,IAC/D,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,gBAAA,EAA2B,MAAA,EAAwC;AAC/E,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,6BAA6B,CAAA;AAC1D,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,aAAa,gBAAA,CAAiB;AAAA,QACtD,OAAA,EAAS,gBAAA;AAAA,QACT,GAAA,EAAK,YAAA;AAAA,QACL,YAAA,EAAc,SAAA;AAAA,QACd,IAAA,EAAM,CAAC,MAAM,CAAA;AAAA,QACb,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,IACrC,CAAA;AAAA,IAEA,MAAM,MAAM,gBAAA,EAAmD;AAC7D,MAAA,IAAI,CAAC,MAAA,EAAQ,MAAM,IAAI,MAAM,2BAA2B,CAAA;AACxD,MAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,MAAM,aAAa,gBAAA,CAAiB;AAAA,QACtD,OAAA,EAAS,gBAAA;AAAA,QACT,GAAA,EAAK,YAAA;AAAA,QACL,YAAA,EAAc,OAAA;AAAA,QACd,SAAS,MAAA,CAAO;AAAA,OACjB,CAAA;AACD,MAAA,OAAO,MAAA,CAAO,cAAc,OAAO,CAAA;AAAA,IACrC;AAAA,GACF;AACF;;;ACvFA,IAAM,cAAA,GAAiB;AAAA,EACrB,EAAA,EAAI,kBAAA;AAAA,EACJ,IAAA,EAAM,iBAAA;AAAA,EACN,gBAAgB,EAAE,IAAA,EAAM,SAAS,MAAA,EAAQ,KAAA,EAAO,UAAU,EAAA,EAAG;AAAA,EAC7D,OAAA,EAAS;AAAA,IACP,OAAA,EAAS,EAAE,IAAA,EAAM,CAAC,2BAA2B,CAAA;AAAE;AAEnD,CAAA;AAsCO,SAAS,iBAAiB,MAAA,EAAsC;AACrE,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,GAAG,cAAA;AAAA,IACH,EAAA,EAAI,OAAO,OAAA,IAAW;AAAA,GACxB;AAEA,EAAA,MAAM,YAAA,GACJ,MAAA,CAAO,YAAA,IACP,kBAAA,CAAmB;AAAA,IACjB,KAAA;AAAA,IACA,SAAA,EAAW,IAAA,CAAK,MAAA,CAAO,MAAM;AAAA,GAC9B,CAAA;AAEH,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AAEtB,EAAA,MAAM,SAAA,GAA+B,SAAA;AAErC,EAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,YAAA,EAAc,MAAA,EAAQ,SAAS,CAAA;AACnE,EAAA,MAAM,KAAA,GAAQ,iBAAA,CAAkB,YAAA,EAAc,MAAiB,CAAA;AAC/D,EAAA,MAAM,IAAA,GAAO,gBAAA,CAAiB,YAAA,EAAc,SAAS,CAAA;AACrD,EAAA,MAAM,IAAA,GAAO,eAAA,CAAgB,YAAA,EAAc,MAAA,EAAQ,SAAS,CAAA;AAC5D,EAAA,MAAM,OAAA,GAAU,mBAAA,CAAoB,YAAA,EAAc,MAAA,EAAQ,SAAS,CAAA;AACnE,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,YAAA,EAAc,SAAS,CAAA;AACzD,EAAA,MAAM,QAAA,GAAW,oBAAA,CAAqB,YAAA,EAAc,SAAS,CAAA;AAC7D,EAAA,MAAM,SAAA,GAAY,qBAAA,CAAsB,YAAA,EAAc,MAAiB,CAAA;AAEvE,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAS,KAAA,CAAM,EAAA;AAAA,IACf,OAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,GACF;AACF;AC/FO,IAAM,WAAWA,QAAAA,CAAS;AAAA;AAAA,EAE/B,uCAAA;AAAA,EACA,yCAAA;AAAA,EACA,0CAAA;AAAA,EACA,+CAAA;AAAA,EACA,4DAAA;AAAA,EACA,8DAAA;AAAA,EACA,2EAAA;AAAA,EACA,kEAAA;AAAA,EACA,gFAAA;AAAA;AAAA,EAGA,uGAAA;AAAA,EACA,+HAAA;AAAA;AAAA,EAGA,yEAAA;AAAA,EACA;AACF,CAAC;ACnBM,IAAM,iBAAiBA,QAAAA,CAAS;AAAA;AAAA,EAErC,wGAAA;AAAA;AAAA,EAGA,+KAAA;AAAA,EACA,mLAAA;AAAA;AAAA,EAGA,iJAAA;AAAA,EACA;AACF,CAAC;ACNM,SAAS,iBAAiB,OAAA,EAA4C;AAC3E,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,KAAY,YAAA,EAAc,OAAO,YAAA;AACjD,EAAA,OAAO,WAAW,OAAO,CAAA;AAC3B;AAKO,SAAS,eAAe,OAAA,EAAqC;AAClE,EAAA,IAAI;AACF,IAAA,OAAOC,UAAU,OAAO,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKO,SAAS,UAAU,KAAA,EAAuB;AAC/C,EAAA,OAAO,YAAY,KAAK,CAAA;AAC1B;AAKO,SAAS,iBAAA,CAAkB,OAAe,QAAA,EAA0B;AACzE,EAAA,OAAO,WAAA,CAAY,OAAO,QAAQ,CAAA;AACpC;AAWO,SAAS,eAAe,OAAA,EAA0B;AACvD,EAAA,OAAO,CAAA,EAAG,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,GAAA,EAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA;AACtD","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 decays over 5 seconds (in nanoseconds) */\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 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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pons-client",
3
- "version": "0.1.1",
3
+ "version": "0.2.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",