liquid-sdk 1.3.0 → 1.3.2
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/README.md +4 -9
- package/dist/index.d.mts +34 -2
- package/dist/index.d.ts +34 -2
- package/dist/index.js +48 -11
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +48 -11
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/constants.ts","../src/utils/encoding.ts","../src/utils/context.ts","../src/abis/LiquidFactory.ts","../src/abis/LiquidFeeLocker.ts","../src/abis/LiquidHookDynamicFeeV2.ts","../src/abis/LiquidVault.ts","../src/abis/LiquidSniperAuctionV2.ts","../src/abis/LiquidSniperUtilV2.ts","../src/abis/LiquidAirdropV2.ts","../src/abis/LiquidPoolExtensionAllowlist.ts","../src/abis/LiquidMevBlockDelay.ts","../src/abis/LiquidLpLocker.ts","../src/abis/LiquidToken.ts","../src/abis/ERC20.ts","../src/abis/LiquidUniv4EthDevBuy.ts","../src/utils/tick-math.ts","../src/utils/positions.ts"],"sourcesContent":["export { LiquidSDK } from \"./client\";\nexport { ADDRESSES, EXTERNAL, FEE, TOKEN, DEFAULT_CHAIN, DEFAULT_CHAIN_ID, DEFAULT_RPC_URL, POOL_POSITIONS, DEFAULTS } from \"./constants\";\nexport type { PoolPosition } from \"./constants\";\nexport {\n LiquidFactoryAbi,\n LiquidFeeLockerAbi,\n LiquidHookDynamicFeeV2Abi,\n LiquidVaultAbi,\n LiquidSniperAuctionV2Abi,\n LiquidSniperUtilV2Abi,\n LiquidAirdropV2Abi,\n LiquidPoolExtensionAllowlistAbi,\n LiquidMevBlockDelayAbi,\n LiquidLpLockerAbi,\n LiquidTokenAbi,\n LiquidUniv4EthDevBuyAbi,\n ERC20Abi,\n} from \"./abis\";\nexport {\n getTickFromMarketCapETH,\n getTickFromMarketCapUSD,\n getTickFromMarketCapStable,\n marketCapFromTickETH,\n marketCapFromTickUSD,\n createPositions,\n createPositionsUSD,\n createDefaultPositions,\n describePositions,\n DEFAULT_TRANCHES_USD,\n encodeStaticFeePoolData,\n encodeDynamicFeePoolData,\n encodeSniperAuctionData,\n buildContext,\n buildMetadata,\n parseContext,\n parseMetadata,\n} from \"./utils\";\nexport type {\n MarketCapTranche,\n MarketCapTrancheUSD,\n PositionConfig,\n PositionArrays,\n DynamicFeeConfig,\n SniperAuctionConfig,\n LiquidContext,\n LiquidMetadata,\n SocialMediaUrl,\n} from \"./utils\";\nexport type {\n AirdropInfo,\n DeployTokenParams,\n DeployTokenResult,\n DeploymentConfig,\n DeploymentInfo,\n DevBuyParams,\n ExtensionConfig,\n GetTokensOptions,\n LiquidSDKConfig,\n LockerConfig,\n MevModuleConfig,\n PoolConfig,\n PoolDynamicConfigVars,\n PoolDynamicFeeVars,\n PoolKey,\n SniperAuctionFeeConfig,\n SniperAuctionState,\n TokenConfig,\n TokenCreatedEvent,\n TokenRewardInfo,\n VaultAllocation,\n} from \"./types\";\n","import {\n type Address,\n type Hash,\n type Hex,\n type PublicClient,\n type WalletClient,\n decodeEventLog,\n encodeAbiParameters,\n encodePacked,\n keccak256,\n getAddress,\n parseAbiItem,\n zeroAddress,\n} from \"viem\";\nimport { base } from \"viem/chains\";\nimport { ADDRESSES, EXTERNAL, DEFAULT_CHAIN_ID, DEFAULTS, POOL_POSITIONS, FEE, TOKEN } from \"./constants\";\nimport { encodeStaticFeePoolData, encodeSniperAuctionData } from \"./utils/encoding\";\nimport { buildContext } from \"./utils/context\";\nimport { LiquidFactoryAbi } from \"./abis/LiquidFactory\";\nimport { LiquidFeeLockerAbi } from \"./abis/LiquidFeeLocker\";\nimport { LiquidHookDynamicFeeV2Abi } from \"./abis/LiquidHookDynamicFeeV2\";\nimport { LiquidVaultAbi } from \"./abis/LiquidVault\";\nimport { LiquidSniperAuctionV2Abi } from \"./abis/LiquidSniperAuctionV2\";\nimport { LiquidSniperUtilV2Abi } from \"./abis/LiquidSniperUtilV2\";\nimport { LiquidAirdropV2Abi } from \"./abis/LiquidAirdropV2\";\nimport { LiquidPoolExtensionAllowlistAbi } from \"./abis/LiquidPoolExtensionAllowlist\";\nimport { LiquidMevBlockDelayAbi } from \"./abis/LiquidMevBlockDelay\";\nimport { LiquidLpLockerAbi } from \"./abis/LiquidLpLocker\";\nimport { LiquidTokenAbi } from \"./abis/LiquidToken\";\nimport { ERC20Abi } from \"./abis/ERC20\";\nimport type {\n AirdropInfo,\n DeployTokenParams,\n DeployTokenResult,\n DevBuyParams,\n DeploymentInfo,\n DeploymentConfig,\n ExtensionConfig,\n GetTokensOptions,\n LiquidSDKConfig,\n PoolDynamicConfigVars,\n PoolDynamicFeeVars,\n SniperAuctionFeeConfig,\n SniperAuctionState,\n TokenCreatedEvent,\n TokenRewardInfo,\n VaultAllocation,\n} from \"./types\";\n\nexport class LiquidSDK {\n public readonly publicClient: PublicClient;\n public readonly walletClient?: WalletClient;\n\n constructor(config: LiquidSDKConfig) {\n this.publicClient = config.publicClient;\n this.walletClient = config.walletClient;\n }\n\n // ── Dev Buy Helper ───────────────────────────────────────────────\n\n /**\n * Build an ExtensionConfig for a dev buy (buy tokens with ETH at launch).\n * The paired token must be WETH for simple dev buys.\n */\n buildDevBuyExtension(devBuy: DevBuyParams): ExtensionConfig {\n // Encode Univ4EthDevBuyExtensionData struct:\n // { PoolKey pairedTokenPoolKey, uint128 pairedTokenAmountOutMinimum, address recipient }\n // For WETH-paired tokens, pairedTokenPoolKey is zeroed out (not used)\n const extensionData = encodeAbiParameters(\n [\n {\n type: \"tuple\",\n components: [\n {\n type: \"tuple\",\n name: \"pairedTokenPoolKey\",\n components: [\n { type: \"address\", name: \"currency0\" },\n { type: \"address\", name: \"currency1\" },\n { type: \"uint24\", name: \"fee\" },\n { type: \"int24\", name: \"tickSpacing\" },\n { type: \"address\", name: \"hooks\" },\n ],\n },\n { type: \"uint128\", name: \"pairedTokenAmountOutMinimum\" },\n { type: \"address\", name: \"recipient\" },\n ],\n },\n ],\n [\n {\n pairedTokenPoolKey: {\n currency0: zeroAddress,\n currency1: zeroAddress,\n fee: 0,\n tickSpacing: 0,\n hooks: zeroAddress,\n },\n pairedTokenAmountOutMinimum: 0n,\n recipient: devBuy.recipient,\n },\n ]\n );\n\n return {\n extension: ADDRESSES.UNIV4_ETH_DEV_BUY,\n msgValue: devBuy.ethAmount,\n extensionBps: 0,\n extensionData,\n };\n }\n\n // ── Validation ─────────────────────────────────────────────────\n\n /**\n * Validate a DeploymentConfig before sending to the contract.\n * Catches common mistakes client-side with clear error messages.\n */\n private validateDeploymentConfig(config: DeploymentConfig): void {\n const { lockerConfig, extensionConfigs } = config;\n const { tickSpacing } = config.poolConfig;\n\n // Position arrays must be the same length\n const posLen = lockerConfig.tickLower.length;\n if (\n lockerConfig.tickUpper.length !== posLen ||\n lockerConfig.positionBps.length !== posLen\n ) {\n throw new Error(\n `tickLower (${posLen}), tickUpper (${lockerConfig.tickUpper.length}), ` +\n `and positionBps (${lockerConfig.positionBps.length}) arrays must be the same length`\n );\n }\n\n if (posLen === 0) {\n throw new Error(\"At least one position is required\");\n }\n\n if (posLen > 7) {\n throw new Error(`Maximum 7 positions allowed, got ${posLen}`);\n }\n\n // positionBps must sum to 10000\n const posBpsSum = lockerConfig.positionBps.reduce((s, b) => s + b, 0);\n if (posBpsSum !== FEE.BPS) {\n throw new Error(\n `positionBps must sum to ${FEE.BPS} (100%), got ${posBpsSum}`\n );\n }\n\n // Each position: tickLower < tickUpper\n for (let i = 0; i < posLen; i++) {\n if (lockerConfig.tickLower[i] >= lockerConfig.tickUpper[i]) {\n throw new Error(\n `Position ${i}: tickLower (${lockerConfig.tickLower[i]}) must be less than tickUpper (${lockerConfig.tickUpper[i]})`\n );\n }\n }\n\n // Ticks must be multiples of tickSpacing\n for (let i = 0; i < posLen; i++) {\n if (lockerConfig.tickLower[i] % tickSpacing !== 0) {\n throw new Error(\n `Position ${i}: tickLower (${lockerConfig.tickLower[i]}) is not a multiple of tickSpacing (${tickSpacing})`\n );\n }\n if (lockerConfig.tickUpper[i] % tickSpacing !== 0) {\n throw new Error(\n `Position ${i}: tickUpper (${lockerConfig.tickUpper[i]}) is not a multiple of tickSpacing (${tickSpacing})`\n );\n }\n }\n\n // All tickLower must be >= starting tick\n const startingTick = config.poolConfig.tickIfToken0IsLiquid;\n for (let i = 0; i < posLen; i++) {\n if (lockerConfig.tickLower[i] < startingTick) {\n throw new Error(\n `Position ${i}: tickLower (${lockerConfig.tickLower[i]}) is below the starting tick (${startingTick})`\n );\n }\n }\n\n // At least one position must start at the starting tick\n const touchesStart = lockerConfig.tickLower.some(\n (t) => t === startingTick\n );\n if (!touchesStart) {\n throw new Error(\n `At least one position's tickLower must equal tickIfToken0IsLiquid (${startingTick})`\n );\n }\n\n // Reward arrays must be the same length\n const rwdLen = lockerConfig.rewardAdmins.length;\n if (\n lockerConfig.rewardRecipients.length !== rwdLen ||\n lockerConfig.rewardBps.length !== rwdLen\n ) {\n throw new Error(\n `rewardAdmins (${rwdLen}), rewardRecipients (${lockerConfig.rewardRecipients.length}), ` +\n `and rewardBps (${lockerConfig.rewardBps.length}) arrays must be the same length`\n );\n }\n\n if (rwdLen === 0) {\n throw new Error(\"At least one reward recipient is required\");\n }\n\n // rewardBps must sum to 10000\n const rwdBpsSum = lockerConfig.rewardBps.reduce((s, b) => s + b, 0);\n if (rwdBpsSum !== FEE.BPS) {\n throw new Error(\n `rewardBps must sum to ${FEE.BPS} (100%), got ${rwdBpsSum}`\n );\n }\n\n // Extensions count limit\n if (extensionConfigs.length > TOKEN.MAX_EXTENSIONS) {\n throw new Error(\n `Maximum ${TOKEN.MAX_EXTENSIONS} extensions allowed, got ${extensionConfigs.length}`\n );\n }\n\n // Total extension bps must not exceed max\n const extBpsSum = extensionConfigs.reduce(\n (s, e) => s + e.extensionBps,\n 0\n );\n if (extBpsSum > TOKEN.MAX_EXTENSION_BPS) {\n throw new Error(\n `Total extensionBps (${extBpsSum}) exceeds maximum (${TOKEN.MAX_EXTENSION_BPS})`\n );\n }\n }\n\n // ── Token Deployment ─────────────────────────────────────────────\n\n async deployToken(params: DeployTokenParams): Promise<DeployTokenResult> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for deployToken\");\n }\n\n const account = this.walletClient.account.address;\n\n const deploymentConfig: DeploymentConfig = {\n tokenConfig: {\n tokenAdmin: params.tokenAdmin ?? account,\n name: params.name,\n symbol: params.symbol,\n salt:\n params.salt ??\n keccak256(\n encodePacked(\n [\"string\", \"string\", \"uint256\"],\n [params.name, params.symbol, BigInt(Date.now())]\n )\n ),\n image: params.image ?? \"\",\n metadata: params.metadata ?? \"\",\n context: params.context ?? buildContext(),\n originatingChainId: BigInt(DEFAULT_CHAIN_ID),\n },\n poolConfig: {\n hook: params.hook ?? DEFAULTS.HOOK,\n pairedToken: params.pairedToken ?? EXTERNAL.WETH,\n tickIfToken0IsLiquid:\n params.tickIfToken0IsLiquid ?? DEFAULTS.TICK_IF_TOKEN0_IS_LIQUID,\n tickSpacing: params.tickSpacing ?? DEFAULTS.TICK_SPACING,\n poolData:\n params.poolData ??\n encodeStaticFeePoolData(\n DEFAULTS.LIQUID_FEE_BPS,\n DEFAULTS.PAIRED_FEE_BPS,\n ),\n },\n lockerConfig: {\n locker: params.locker ?? DEFAULTS.LOCKER,\n rewardAdmins: params.rewardAdmins ?? [account],\n rewardRecipients: params.rewardRecipients ?? [account],\n rewardBps: params.rewardBps ?? [10000],\n tickLower:\n params.tickLower ??\n POOL_POSITIONS.Liquid.map((p) => p.tickLower),\n tickUpper:\n params.tickUpper ??\n POOL_POSITIONS.Liquid.map((p) => p.tickUpper),\n positionBps:\n params.positionBps ??\n POOL_POSITIONS.Liquid.map((p) => p.positionBps),\n lockerData: params.lockerData ?? \"0x\",\n },\n mevModuleConfig: {\n mevModule: params.mevModule ?? DEFAULTS.MEV_MODULE,\n mevModuleData:\n params.mevModuleData ??\n encodeSniperAuctionData({\n startingFee: DEFAULTS.SNIPER_STARTING_FEE,\n endingFee: DEFAULTS.SNIPER_ENDING_FEE,\n secondsToDecay: DEFAULTS.SNIPER_SECONDS_TO_DECAY,\n }),\n },\n extensionConfigs: [...(params.extensions ?? [])],\n };\n\n // Append dev buy extension if specified\n if (params.devBuy) {\n deploymentConfig.extensionConfigs.push(\n this.buildDevBuyExtension(params.devBuy)\n );\n }\n\n // ── Client-side validation ────────────────────────────────────\n this.validateDeploymentConfig(deploymentConfig);\n\n // Calculate total msg.value from extensions\n const msgValue = deploymentConfig.extensionConfigs.reduce(\n (sum, ext) => sum + ext.msgValue,\n 0n\n );\n\n const txHash = await this.walletClient.writeContract({\n address: ADDRESSES.FACTORY,\n abi: LiquidFactoryAbi,\n functionName: \"deployToken\",\n args: [deploymentConfig],\n value: msgValue,\n chain: base,\n account: this.walletClient.account,\n });\n\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n // Parse TokenCreated event from logs\n const tokenCreatedLog = receipt.logs.find((log) => {\n try {\n const decoded = decodeEventLog({\n abi: LiquidFactoryAbi,\n data: log.data,\n topics: log.topics,\n });\n return decoded.eventName === \"TokenCreated\";\n } catch {\n return false;\n }\n });\n\n if (!tokenCreatedLog) {\n throw new Error(\"TokenCreated event not found in transaction receipt\");\n }\n\n const decoded = decodeEventLog({\n abi: LiquidFactoryAbi,\n data: tokenCreatedLog.data,\n topics: tokenCreatedLog.topics,\n });\n\n const args = decoded.args as any;\n\n return {\n tokenAddress: getAddress(args.tokenAddress),\n txHash,\n event: {\n msgSender: args.msgSender,\n tokenAddress: args.tokenAddress,\n tokenAdmin: args.tokenAdmin,\n tokenImage: args.tokenImage,\n tokenName: args.tokenName,\n tokenSymbol: args.tokenSymbol,\n tokenMetadata: args.tokenMetadata,\n tokenContext: args.tokenContext,\n startingTick: args.startingTick,\n poolHook: args.poolHook,\n poolId: args.poolId,\n pairedToken: args.pairedToken,\n locker: args.locker,\n mevModule: args.mevModule,\n extensionsSupply: args.extensionsSupply,\n extensions: args.extensions,\n },\n };\n }\n\n // ── Token Info ────────────────────────────────────────────────────\n\n async getDeploymentInfo(tokenAddress: Address): Promise<DeploymentInfo> {\n const result = await this.publicClient.readContract({\n address: ADDRESSES.FACTORY,\n abi: LiquidFactoryAbi,\n functionName: \"tokenDeploymentInfo\",\n args: [tokenAddress],\n });\n\n const data = result as any;\n return {\n token: data.token,\n hook: data.hook,\n locker: data.locker,\n extensions: data.extensions,\n };\n }\n\n async getTokenInfo(tokenAddress: Address) {\n const [name, symbol, decimals, totalSupply] = await Promise.all([\n this.publicClient.readContract({\n address: tokenAddress,\n abi: ERC20Abi,\n functionName: \"name\",\n }),\n this.publicClient.readContract({\n address: tokenAddress,\n abi: ERC20Abi,\n functionName: \"symbol\",\n }),\n this.publicClient.readContract({\n address: tokenAddress,\n abi: ERC20Abi,\n functionName: \"decimals\",\n }),\n this.publicClient.readContract({\n address: tokenAddress,\n abi: ERC20Abi,\n functionName: \"totalSupply\",\n }),\n ]);\n\n const deployment = await this.getDeploymentInfo(tokenAddress);\n\n return {\n address: tokenAddress,\n name: name as string,\n symbol: symbol as string,\n decimals: decimals as number,\n totalSupply: totalSupply as bigint,\n deployment,\n };\n }\n\n // ── Pool Info ─────────────────────────────────────────────────────\n\n async getPoolConfig(\n poolId: Hex,\n hookAddress?: Address\n ): Promise<PoolDynamicConfigVars> {\n const hook = hookAddress ?? ADDRESSES.HOOK_DYNAMIC_FEE_V2;\n const result = await this.publicClient.readContract({\n address: hook,\n abi: LiquidHookDynamicFeeV2Abi,\n functionName: \"poolConfigVars\",\n args: [poolId],\n });\n\n const data = result as any;\n return {\n baseFee: data.baseFee,\n maxLpFee: data.maxLpFee,\n referenceTickFilterPeriod: data.referenceTickFilterPeriod,\n resetPeriod: data.resetPeriod,\n resetTickFilter: data.resetTickFilter,\n feeControlNumerator: data.feeControlNumerator,\n decayFilterBps: data.decayFilterBps,\n };\n }\n\n async getPoolFeeState(\n poolId: Hex,\n hookAddress?: Address\n ): Promise<PoolDynamicFeeVars> {\n const hook = hookAddress ?? ADDRESSES.HOOK_DYNAMIC_FEE_V2;\n const result = await this.publicClient.readContract({\n address: hook,\n abi: LiquidHookDynamicFeeV2Abi,\n functionName: \"poolFeeVars\",\n args: [poolId],\n });\n\n const data = result as any;\n return {\n referenceTick: data.referenceTick,\n resetTick: data.resetTick,\n resetTickTimestamp: data.resetTickTimestamp,\n lastSwapTimestamp: data.lastSwapTimestamp,\n appliedVR: data.appliedVR,\n prevVA: data.prevVA,\n };\n }\n\n async getPoolCreationTimestamp(\n poolId: Hex,\n hookAddress?: Address\n ): Promise<bigint> {\n const hook = hookAddress ?? ADDRESSES.HOOK_DYNAMIC_FEE_V2;\n return (await this.publicClient.readContract({\n address: hook,\n abi: LiquidHookDynamicFeeV2Abi,\n functionName: \"poolCreationTimestamp\",\n args: [poolId],\n })) as bigint;\n }\n\n async isLiquidToken0(\n poolId: Hex,\n hookAddress?: Address\n ): Promise<boolean> {\n const hook = hookAddress ?? ADDRESSES.HOOK_DYNAMIC_FEE_V2;\n return (await this.publicClient.readContract({\n address: hook,\n abi: LiquidHookDynamicFeeV2Abi,\n functionName: \"liquidIsToken0\",\n args: [poolId],\n })) as boolean;\n }\n\n // ── Fee Claims ────────────────────────────────────────────────────\n\n async getAvailableFees(\n feeOwner: Address,\n tokenAddress: Address\n ): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.FEE_LOCKER,\n abi: LiquidFeeLockerAbi,\n functionName: \"availableFees\",\n args: [feeOwner, tokenAddress],\n })) as bigint;\n }\n\n async getFeesToClaim(\n feeOwner: Address,\n tokenAddress: Address\n ): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.FEE_LOCKER,\n abi: LiquidFeeLockerAbi,\n functionName: \"feesToClaim\",\n args: [feeOwner, tokenAddress],\n })) as bigint;\n }\n\n async claimFees(feeOwner: Address, tokenAddress: Address): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for claimFees\");\n }\n\n return await this.walletClient.writeContract({\n address: ADDRESSES.FEE_LOCKER,\n abi: LiquidFeeLockerAbi,\n functionName: \"claim\",\n args: [feeOwner, tokenAddress],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n // ── Vault ─────────────────────────────────────────────────────────\n\n async getVaultAllocation(\n tokenAddress: Address\n ): Promise<VaultAllocation> {\n const result = await this.publicClient.readContract({\n address: ADDRESSES.VAULT,\n abi: LiquidVaultAbi,\n functionName: \"allocation\",\n args: [tokenAddress],\n });\n\n const data = result as any;\n return {\n token: data[0] ?? data.token,\n amountTotal: data[1] ?? data.amountTotal,\n amountClaimed: data[2] ?? data.amountClaimed,\n lockupEndTime: data[3] ?? data.lockupEndTime,\n vestingEndTime: data[4] ?? data.vestingEndTime,\n admin: data[5] ?? data.admin,\n };\n }\n\n async getVaultClaimable(tokenAddress: Address): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.VAULT,\n abi: LiquidVaultAbi,\n functionName: \"amountAvailableToClaim\",\n args: [tokenAddress],\n })) as bigint;\n }\n\n async claimVault(tokenAddress: Address): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for claimVault\");\n }\n\n return await this.walletClient.writeContract({\n address: ADDRESSES.VAULT,\n abi: LiquidVaultAbi,\n functionName: \"claim\",\n args: [tokenAddress],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n // ── Factory Status ────────────────────────────────────────────────\n\n async isFactoryDeprecated(): Promise<boolean> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.FACTORY,\n abi: LiquidFactoryAbi,\n functionName: \"deprecated\",\n })) as boolean;\n }\n\n async isLockerEnabled(\n locker: Address,\n hook: Address\n ): Promise<boolean> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.FACTORY,\n abi: LiquidFactoryAbi,\n functionName: \"enabledLockers\",\n args: [locker, hook],\n })) as boolean;\n }\n\n // ── Sniper Auction ─────────────────────────────────────────────────\n\n async getAuctionState(poolId: Hex): Promise<SniperAuctionState> {\n const [nextAuctionBlock, round, gasPeg, currentFee] = await Promise.all([\n this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"nextAuctionBlock\",\n args: [poolId],\n }),\n this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"round\",\n args: [poolId],\n }),\n this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"gasPeg\",\n args: [poolId],\n }),\n this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"getFee\",\n args: [poolId],\n }),\n ]);\n\n return {\n nextAuctionBlock: nextAuctionBlock as bigint,\n round: round as bigint,\n gasPeg: gasPeg as bigint,\n currentFee: currentFee as number,\n };\n }\n\n async getAuctionFeeConfig(poolId: Hex): Promise<SniperAuctionFeeConfig> {\n const result = await this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"feeConfig\",\n args: [poolId],\n });\n\n const data = result as any;\n return {\n startingFee: Array.isArray(data) ? data[0] : data.startingFee,\n endingFee: Array.isArray(data) ? data[1] : data.endingFee,\n secondsToDecay: Array.isArray(data) ? data[2] : data.secondsToDecay,\n };\n }\n\n async getAuctionDecayStartTime(poolId: Hex): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"poolDecayStartTime\",\n args: [poolId],\n })) as bigint;\n }\n\n async getAuctionMaxRounds(): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"maxRounds\",\n })) as bigint;\n }\n\n async getAuctionGasPriceForBid(\n auctionGasPeg: bigint,\n desiredBidAmount: bigint\n ): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.SNIPER_UTIL_V2,\n abi: LiquidSniperUtilV2Abi,\n functionName: \"getTxGasPriceForBidAmount\",\n args: [auctionGasPeg, desiredBidAmount],\n })) as bigint;\n }\n\n // ── Airdrop ─────────────────────────────────────────────────────────\n\n async getAirdropInfo(tokenAddress: Address): Promise<AirdropInfo> {\n const result = await this.publicClient.readContract({\n address: ADDRESSES.AIRDROP_V2,\n abi: LiquidAirdropV2Abi,\n functionName: \"airdrops\",\n args: [tokenAddress],\n });\n\n const data = result as any;\n return {\n admin: Array.isArray(data) ? data[0] : data.admin,\n merkleRoot: Array.isArray(data) ? data[1] : data.merkleRoot,\n totalSupply: Array.isArray(data) ? data[2] : data.totalSupply,\n totalClaimed: Array.isArray(data) ? data[3] : data.totalClaimed,\n lockupEndTime: Array.isArray(data) ? data[4] : data.lockupEndTime,\n vestingEndTime: Array.isArray(data) ? data[5] : data.vestingEndTime,\n adminClaimTime: Array.isArray(data) ? data[6] : data.adminClaimTime,\n adminClaimed: Array.isArray(data) ? data[7] : data.adminClaimed,\n };\n }\n\n async getAirdropClaimable(\n tokenAddress: Address,\n recipient: Address,\n allocatedAmount: bigint\n ): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.AIRDROP_V2,\n abi: LiquidAirdropV2Abi,\n functionName: \"amountAvailableToClaim\",\n args: [tokenAddress, recipient, allocatedAmount],\n })) as bigint;\n }\n\n async claimAirdrop(\n tokenAddress: Address,\n recipient: Address,\n allocatedAmount: bigint,\n proof: Hex[]\n ): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for claimAirdrop\");\n }\n\n return await this.walletClient.writeContract({\n address: ADDRESSES.AIRDROP_V2,\n abi: LiquidAirdropV2Abi,\n functionName: \"claim\",\n args: [tokenAddress, recipient, allocatedAmount, proof],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n // ── LP Locker ───────────────────────────────────────────────────────\n\n async getTokenRewards(\n tokenAddress: Address,\n lockerAddress?: Address\n ): Promise<TokenRewardInfo> {\n const locker = lockerAddress ?? DEFAULTS.LOCKER;\n const result = await this.publicClient.readContract({\n address: locker,\n abi: LiquidLpLockerAbi,\n functionName: \"tokenRewards\",\n args: [tokenAddress],\n });\n\n const data = result as any;\n return {\n token: data.token,\n poolKey: data.poolKey,\n positionId: data.positionId,\n numPositions: data.numPositions,\n rewardBps: [...data.rewardBps],\n rewardAdmins: [...data.rewardAdmins],\n rewardRecipients: [...data.rewardRecipients],\n };\n }\n\n async collectRewards(\n tokenAddress: Address,\n lockerAddress?: Address\n ): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for collectRewards\");\n }\n\n const locker = lockerAddress ?? DEFAULTS.LOCKER;\n return await this.walletClient.writeContract({\n address: locker,\n abi: LiquidLpLockerAbi,\n functionName: \"collectRewards\",\n args: [tokenAddress],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n async collectRewardsWithoutUnlock(\n tokenAddress: Address,\n lockerAddress?: Address\n ): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\n \"walletClient with account required for collectRewardsWithoutUnlock\"\n );\n }\n\n const locker = lockerAddress ?? DEFAULTS.LOCKER;\n return await this.walletClient.writeContract({\n address: locker,\n abi: LiquidLpLockerAbi,\n functionName: \"collectRewardsWithoutUnlock\",\n args: [tokenAddress],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n async updateRewardRecipient(\n tokenAddress: Address,\n rewardIndex: bigint,\n newRecipient: Address,\n lockerAddress?: Address\n ): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\n \"walletClient with account required for updateRewardRecipient\"\n );\n }\n\n const locker = lockerAddress ?? DEFAULTS.LOCKER;\n return await this.walletClient.writeContract({\n address: locker,\n abi: LiquidLpLockerAbi,\n functionName: \"updateRewardRecipient\",\n args: [tokenAddress, rewardIndex, newRecipient],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n // ── Pool Extension Allowlist ────────────────────────────────────────\n\n async isExtensionEnabled(extensionAddress: Address): Promise<boolean> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.POOL_EXTENSION_ALLOWLIST,\n abi: LiquidPoolExtensionAllowlistAbi,\n functionName: \"enabledExtensions\",\n args: [extensionAddress],\n })) as boolean;\n }\n\n // ── MEV Block Delay ─────────────────────────────────────────────────\n\n async getMevBlockDelay(): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.MEV_BLOCK_DELAY,\n abi: LiquidMevBlockDelayAbi,\n functionName: \"blockDelay\",\n })) as bigint;\n }\n\n async getPoolUnlockTime(poolId: Hex): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.MEV_BLOCK_DELAY,\n abi: LiquidMevBlockDelayAbi,\n functionName: \"poolUnlockTime\",\n args: [poolId],\n })) as bigint;\n }\n\n // ── Token Metadata Updates ──────────────────────────────────────────\n\n /**\n * Update a token's image. Must be called by the token admin.\n */\n async updateImage(tokenAddress: Address, newImage: string): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for updateImage\");\n }\n\n return await this.walletClient.writeContract({\n address: tokenAddress,\n abi: LiquidTokenAbi,\n functionName: \"updateImage\",\n args: [newImage],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n /**\n * Update a token's metadata. Must be called by the token admin.\n */\n async updateMetadata(\n tokenAddress: Address,\n newMetadata: string\n ): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for updateMetadata\");\n }\n\n return await this.walletClient.writeContract({\n address: tokenAddress,\n abi: LiquidTokenAbi,\n functionName: \"updateMetadata\",\n args: [newMetadata],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n // ── Token Discovery ─────────────────────────────────────────────────\n\n /**\n * Get all tokens deployed by a specific address by querying TokenCreated events.\n * @param deployer - The address that deployed the tokens (msgSender)\n * @param fromBlock - Starting block to search from (defaults to 0n)\n * @param toBlock - Ending block to search to (defaults to 'latest')\n */\n async getDeployedTokens(\n deployer: Address,\n fromBlock?: bigint,\n toBlock?: bigint | \"latest\"\n ): Promise<TokenCreatedEvent[]> {\n return this.getTokens({ deployer, fromBlock, toBlock });\n }\n\n /**\n * Query TokenCreated events with optional filtering.\n *\n * Use this for token discovery, indexing, or building token lists.\n * Returns events in chronological order with block numbers for pagination.\n *\n * @example\n * // Get all tokens\n * const allTokens = await sdk.getTokens();\n *\n * // Get tokens by deployer\n * const myTokens = await sdk.getTokens({ deployer: myAddress });\n *\n * // Paginate with block ranges\n * const page1 = await sdk.getTokens({ fromBlock: 20000000n, toBlock: 20100000n });\n * const page2 = await sdk.getTokens({ fromBlock: 20100001n, toBlock: 20200000n });\n */\n async getTokens(options?: GetTokensOptions): Promise<TokenCreatedEvent[]> {\n const logs = await this.publicClient.getLogs({\n address: ADDRESSES.FACTORY,\n event: parseAbiItem(\n \"event TokenCreated(address msgSender, address indexed tokenAddress, address indexed tokenAdmin, string tokenImage, string tokenName, string tokenSymbol, string tokenMetadata, string tokenContext, int24 startingTick, address poolHook, bytes32 poolId, address pairedToken, address locker, address mevModule, uint256 extensionsSupply, address[] extensions)\"\n ),\n fromBlock: options?.fromBlock ?? 0n,\n toBlock: options?.toBlock ?? \"latest\",\n });\n\n const deployer = options?.deployer;\n\n return logs\n .filter((log) => {\n if (!deployer) return true;\n // msgSender is not indexed, so we filter client-side\n const sender = (log.args as any).msgSender;\n return sender && getAddress(sender) === getAddress(deployer);\n })\n .map((log) => {\n const args = log.args as any;\n return {\n msgSender: args.msgSender,\n tokenAddress: args.tokenAddress,\n tokenAdmin: args.tokenAdmin,\n tokenImage: args.tokenImage,\n tokenName: args.tokenName,\n tokenSymbol: args.tokenSymbol,\n tokenMetadata: args.tokenMetadata,\n tokenContext: args.tokenContext,\n startingTick: args.startingTick,\n poolHook: args.poolHook,\n poolId: args.poolId,\n pairedToken: args.pairedToken,\n locker: args.locker,\n mevModule: args.mevModule,\n extensionsSupply: args.extensionsSupply,\n extensions: args.extensions,\n blockNumber: log.blockNumber,\n };\n });\n }\n\n /**\n * Look up a single token's on-chain event data by contract address.\n *\n * Returns the full TokenCreated event including metadata, context, poolId,\n * hook, locker, extensions — everything a wallet or aggregator needs to\n * display the token. Returns `null` if not found.\n *\n * This is indexed on-chain (tokenAddress is indexed in the event), so it's\n * a single RPC call regardless of how many tokens exist.\n */\n async getTokenEvent(tokenAddress: Address): Promise<TokenCreatedEvent | null> {\n const logs = await this.publicClient.getLogs({\n address: ADDRESSES.FACTORY,\n event: parseAbiItem(\n \"event TokenCreated(address msgSender, address indexed tokenAddress, address indexed tokenAdmin, string tokenImage, string tokenName, string tokenSymbol, string tokenMetadata, string tokenContext, int24 startingTick, address poolHook, bytes32 poolId, address pairedToken, address locker, address mevModule, uint256 extensionsSupply, address[] extensions)\"\n ),\n args: { tokenAddress },\n fromBlock: 0n,\n toBlock: \"latest\",\n });\n\n if (logs.length === 0) return null;\n\n const log = logs[0];\n const args = log.args as any;\n return {\n msgSender: args.msgSender,\n tokenAddress: args.tokenAddress,\n tokenAdmin: args.tokenAdmin,\n tokenImage: args.tokenImage,\n tokenName: args.tokenName,\n tokenSymbol: args.tokenSymbol,\n tokenMetadata: args.tokenMetadata,\n tokenContext: args.tokenContext,\n startingTick: args.startingTick,\n poolHook: args.poolHook,\n poolId: args.poolId,\n pairedToken: args.pairedToken,\n locker: args.locker,\n mevModule: args.mevModule,\n extensionsSupply: args.extensionsSupply,\n extensions: args.extensions,\n blockNumber: log.blockNumber,\n };\n }\n}\n","import { type Address } from \"viem\";\nimport { base } from \"viem/chains\";\n\n// ── Production addresses (Base mainnet) ──────────────────────────────\n\nexport const ADDRESSES = {\n FACTORY: \"0x0000003482fe299E72d4908368044A8A173BE576\" as Address,\n POOL_EXTENSION_ALLOWLIST:\n \"0x000003Afb1b070F037D2871eE0A6b8c8f53F7B77\" as Address,\n FEE_LOCKER: \"0x000008B9242b7e4432f6c4b1EeAD93562f9Cc94d\" as Address,\n LP_LOCKER: \"0x00000548732DfA56Be1257cE44D0CFc3B46dDb2A\" as Address,\n LP_LOCKER_FEE_CONVERSION:\n \"0x00000547518784420CEeF761fb18D884bb908102\" as Address,\n VAULT: \"0x000001c5263F4d64CdC343cDA9C8bF961CF8376c\" as Address,\n HOOK_DYNAMIC_FEE_V2:\n \"0x2A2F73CDDa098d639bd8Bbcd7dF2bf24E06728cC\" as Address,\n HOOK_STATIC_FEE_V2:\n \"0xb2401c5369AaCF62F8d615623C7F68F84da428Cc\" as Address,\n SNIPER_AUCTION_V2:\n \"0x000007b64003ee07a69576F98859a0a36b854260\" as Address,\n SNIPER_UTIL_V2: \"0x000003Ee0cb9B0C82C6C7FCB7b81a9883F285270\" as Address,\n MEV_BLOCK_DELAY: \"0x0000035D83588954F3c581c3A66251b3F06AD5e4\" as Address,\n AIRDROP_V2: \"0x00000C222442512b08446D33dd9754a7F260BE79\" as Address,\n UNIV4_ETH_DEV_BUY:\n \"0x00000d7DE1f0A3FA7957F5d8A2b97B0E24e5783D\" as Address,\n LIQUID_DEPLOYER_LIB:\n \"0x00000f88b2d37A2006F2F0C8552d22E0b8945202\" as Address,\n} as const;\n\n// ── External protocol addresses (Base mainnet) ──────────────────────\n\nexport const EXTERNAL = {\n POOL_MANAGER: \"0x498581fF718922c3f8e6A244956aF099B2652b2b\" as Address,\n WETH: \"0x4200000000000000000000000000000000000006\" as Address,\n UNIVERSAL_ROUTER:\n \"0x6fF5693b99212Da76ad316178A184AB56D299b43\" as Address,\n PERMIT2: \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as Address,\n} as const;\n\n// ── Fee constants ────────────────────────────────────────────────────\n\nexport const FEE = {\n /** Fee denominator used by Uniswap v4 (1,000,000 = 100%) */\n DENOMINATOR: 1_000_000,\n /** Protocol fee numerator: 200,000 / 1,000,000 = 20% of LP fees */\n PROTOCOL_FEE_NUMERATOR: 200_000,\n /** Max LP fee: 10% (100,000 / 1,000,000) */\n MAX_LP_FEE: 100_000,\n /** Max MEV fee: 80% (800,000 / 1,000,000) */\n MAX_MEV_FEE: 800_000,\n /** BPS denominator for token supply splits */\n BPS: 10_000,\n} as const;\n\n// ── Token constants ──────────────────────────────────────────────────\n\nexport const TOKEN = {\n /** Total supply for every token: 100 billion with 18 decimals */\n SUPPLY: 100_000_000_000n * 10n ** 18n,\n DECIMALS: 18,\n MAX_EXTENSIONS: 10,\n MAX_EXTENSION_BPS: 9000,\n} as const;\n\n// ── Pool position presets ────────────────────────────────────────────\n\nexport interface PoolPosition {\n tickLower: number;\n tickUpper: number;\n positionBps: number;\n}\n\n/**\n * Pre-built position configurations.\n *\n * - **Standard**: Single position covering full range (~$20K → $1.5B).\n * Default starting tick -230400 (≈10 ETH market cap).\n *\n * - **Liquid**: 3-tranche default for Liquid Protocol.\n * Hardcoded for ≈10 ETH start at ~$2070/ETH.\n * For dynamic market cap targets, use `createPositionsUSD()` instead.\n *\n * Note: positionBps must sum to 10,000 (100%).\n */\nexport const POOL_POSITIONS = {\n /** Single position, 100% of liquidity in one range */\n Standard: [\n {\n tickLower: -230400, // ~10 ETH / ~$20K\n tickUpper: -120000, // ~$1.5B\n positionBps: 10_000,\n },\n ] as PoolPosition[],\n\n /** 3-tranche Liquid default (hardcoded for ~10 ETH start, ~$2070/ETH) */\n Liquid: [\n {\n tickLower: -230400, // ~$20K starting\n tickUpper: -198600, // ~$500K\n positionBps: 4_000, // 40%\n },\n {\n tickLower: -198600, // ~$500K\n tickUpper: -168600, // ~$10M\n positionBps: 5_000, // 50%\n },\n {\n tickLower: -168600, // ~$10M\n tickUpper: -122600, // ~$1B\n positionBps: 1_000, // 10%\n },\n ] as PoolPosition[],\n} as const;\n\n// ── Default deploy configuration ────────────────────────────────────\n\n/**\n * Liquid protocol defaults.\n *\n * - Hook: Static fee V2, 1% on buys only (fees in ETH), 0% on sells\n * - MEV: Sniper Auction V2 — 80% → 40% decaying over 32 seconds\n * - Tick spacing: 200\n * - Starting tick: -230400 (≈10 ETH market cap)\n * - Positions: 3-tranche Liquid default (40/50/10)\n */\nexport const DEFAULTS = {\n HOOK: ADDRESSES.HOOK_STATIC_FEE_V2,\n /** LP Locker with fee conversion (converts fees to ETH before distributing) */\n LOCKER: ADDRESSES.LP_LOCKER_FEE_CONVERSION,\n TICK_SPACING: 200,\n TICK_IF_TOKEN0_IS_LIQUID: -230400,\n /** Static fee on buys (ETH → token): 1% (100 bps). Fees collected in ETH. */\n PAIRED_FEE_BPS: 100,\n /** Static fee on sells (token → ETH): 0%. No fees in liquid token. */\n LIQUID_FEE_BPS: 0,\n /** MEV module: Sniper Auction V2 */\n MEV_MODULE: ADDRESSES.SNIPER_AUCTION_V2,\n /** Sniper auction starting fee: 80% (800,000 uniBps) */\n SNIPER_STARTING_FEE: 800_000,\n /** Sniper auction ending fee: 40% (400,000 uniBps) */\n SNIPER_ENDING_FEE: 400_000,\n /** Sniper auction decay period: 32 seconds */\n SNIPER_SECONDS_TO_DECAY: 32,\n} as const;\n\n// ── Chain ────────────────────────────────────────────────────────────\n\nexport const DEFAULT_CHAIN = base;\nexport const DEFAULT_CHAIN_ID = 8453;\nexport const DEFAULT_RPC_URL = \"https://base.drpc.org\";\n","/**\n * ABI encoding helpers for pool data, fee configs, and MEV module data.\n */\n\nimport { type Hex, encodeAbiParameters, zeroAddress } from \"viem\";\n\n// ── Pool Initialization Data (V2 hooks two-layer encoding) ──────────\n\n/**\n * ABI for the outer PoolInitializationData struct used by V2 hooks.\n * Wraps fee data with optional pool extension info.\n */\nconst PoolInitializationDataAbi = [\n {\n type: \"tuple\",\n components: [\n { name: \"extension\", type: \"address\" },\n { name: \"extensionData\", type: \"bytes\" },\n { name: \"feeData\", type: \"bytes\" },\n ],\n },\n] as const;\n\n/**\n * ABI for static fee init data: [uint24 liquidFee, uint24 pairedFee]\n * Values are in uniBps (bps * 100, where 1_000_000 = 100%).\n */\nconst StaticFeeInitAbi = [\n { type: \"uint24\" },\n { type: \"uint24\" },\n] as const;\n\n/**\n * ABI for the sniper auction init data struct.\n */\nconst SniperAuctionInitAbi = [\n {\n type: \"tuple\",\n components: [\n { name: \"startingFee\", type: \"uint24\" },\n { name: \"endingFee\", type: \"uint24\" },\n { name: \"secondsToDecay\", type: \"uint256\" },\n ],\n },\n] as const;\n\n// ── Static Fee Encoding ─────────────────────────────────────────────\n\n/**\n * Encode pool data for the static fee V2 hook.\n *\n * Uses two-layer encoding:\n * 1. Inner: static fee params [liquidFee, pairedFee] in uniBps\n * 2. Outer: PoolInitializationData wrapper\n *\n * @param liquidFeeBps - Fee when swapping for the liquid token (in bps, e.g. 100 = 1%)\n * @param pairedFeeBps - Fee when swapping for the paired token (in bps, e.g. 100 = 1%)\n * @param extension - Optional pool extension address (defaults to zero)\n * @param extensionData - Optional pool extension init data (defaults to \"0x\")\n * @returns Encoded poolData hex string\n *\n * @example\n * ```ts\n * // 1% fee both directions (default)\n * const poolData = encodeStaticFeePoolData(100, 100);\n * ```\n */\nexport function encodeStaticFeePoolData(\n liquidFeeBps: number,\n pairedFeeBps: number,\n extension: `0x${string}` = zeroAddress,\n extensionData: Hex = \"0x\",\n): Hex {\n // Convert bps → uniBps (multiply by 100)\n const feeData = encodeAbiParameters(StaticFeeInitAbi, [\n liquidFeeBps * 100,\n pairedFeeBps * 100,\n ]);\n\n return encodeAbiParameters(PoolInitializationDataAbi, [\n {\n extension,\n extensionData,\n feeData,\n },\n ]);\n}\n\n// ── Dynamic Fee Encoding ────────────────────────────────────────────\n\n/**\n * ABI for dynamic fee init data.\n */\nconst DynamicFeeInitAbi = [\n { type: \"uint24\" }, // baseFee (uniBps)\n { type: \"uint24\" }, // maxFee (uniBps)\n { type: \"uint256\" }, // referenceTickFilterPeriod\n { type: \"uint256\" }, // resetPeriod\n { type: \"int24\" }, // resetTickFilter\n { type: \"uint256\" }, // feeControlNumerator\n { type: \"uint24\" }, // decayFilterBps\n] as const;\n\nexport interface DynamicFeeConfig {\n /** Base LP fee in bps (e.g. 100 = 1%) */\n baseFeeBps: number;\n /** Max LP fee in bps (e.g. 500 = 5%) */\n maxFeeBps: number;\n /** Reference tick filter period in seconds */\n referenceTickFilterPeriod: number;\n /** Reset period in seconds */\n resetPeriod: number;\n /** Reset tick filter (tick units) */\n resetTickFilter: number;\n /** Fee control numerator (scaling constant) */\n feeControlNumerator: bigint;\n /** Decay filter in bps */\n decayFilterBps: number;\n}\n\n/**\n * Encode pool data for the dynamic fee V2 hook.\n *\n * @param config - Dynamic fee configuration\n * @param extension - Optional pool extension address\n * @param extensionData - Optional pool extension init data\n * @returns Encoded poolData hex string\n */\nexport function encodeDynamicFeePoolData(\n config: DynamicFeeConfig,\n extension: `0x${string}` = zeroAddress,\n extensionData: Hex = \"0x\",\n): Hex {\n const feeData = encodeAbiParameters(DynamicFeeInitAbi, [\n config.baseFeeBps * 100,\n config.maxFeeBps * 100,\n BigInt(config.referenceTickFilterPeriod),\n BigInt(config.resetPeriod),\n config.resetTickFilter,\n config.feeControlNumerator,\n config.decayFilterBps,\n ]);\n\n return encodeAbiParameters(PoolInitializationDataAbi, [\n {\n extension,\n extensionData,\n feeData,\n },\n ]);\n}\n\n// ── Sniper Auction MEV Encoding ─────────────────────────────────────\n\nexport interface SniperAuctionConfig {\n /** Starting fee in uniBps (e.g. 800_000 = 80%) */\n startingFee: number;\n /** Ending fee in uniBps (e.g. 400_000 = 40%) */\n endingFee: number;\n /** Seconds for fee to decay from starting to ending */\n secondsToDecay: number;\n}\n\n/**\n * Encode MEV module data for the Sniper Auction V2.\n *\n * @param config - Sniper auction fee configuration\n * @returns Encoded mevModuleData hex string\n *\n * @example\n * ```ts\n * // 80% → 40% over 32 seconds (default)\n * const mevData = encodeSniperAuctionData({\n * startingFee: 800_000,\n * endingFee: 400_000,\n * secondsToDecay: 32,\n * });\n * ```\n */\nexport function encodeSniperAuctionData(config: SniperAuctionConfig): Hex {\n if (config.startingFee <= config.endingFee) {\n throw new Error(\"startingFee must be greater than endingFee\");\n }\n if (config.secondsToDecay <= 0) {\n throw new Error(\"secondsToDecay must be positive\");\n }\n\n return encodeAbiParameters(SniperAuctionInitAbi, [\n {\n startingFee: config.startingFee,\n endingFee: config.endingFee,\n secondsToDecay: BigInt(config.secondsToDecay),\n },\n ]);\n}\n","// ── Context & Metadata schemas ──────────────────────────────────────\n//\n// Structured JSON for the on-chain `context` and `metadata` fields.\n// Wallets (Rainbow, Coinbase) and aggregators (Matcha, 0x) read these\n// to show attribution and token info.\n//\n// No Zod — plain TS types + lightweight runtime validation.\n\n// ── Types ───────────────────────────────────────────────────────────\n\n/** Provenance — who launched the token and from where. */\nexport interface LiquidContext {\n /** System that deployed the token (e.g. \"SDK\", \"Rainbow Wallet\", \"Liquid CLI\") */\n interface: string;\n /** Social platform origin (e.g. \"Farcaster\", \"Twitter\") */\n platform?: string;\n /** Social post/message ID that triggered the deploy */\n messageId?: string;\n /** User ID on the originating platform */\n id?: string;\n}\n\n/** Social media link for token metadata. */\nexport interface SocialMediaUrl {\n platform: string;\n url: string;\n}\n\n/** Token info for aggregators and explorers. */\nexport interface LiquidMetadata {\n /** Token/project description */\n description?: string;\n /** Social media links */\n socialMediaUrls?: SocialMediaUrl[];\n /** Audit report URLs */\n auditUrls?: string[];\n}\n\n// ── Builders ────────────────────────────────────────────────────────\n\n/**\n * Build a JSON string for the on-chain `context` field.\n *\n * @example\n * buildContext({ interface: \"My App\", platform: \"Farcaster\" })\n * // '{\"interface\":\"My App\",\"platform\":\"Farcaster\"}'\n */\nexport function buildContext(input?: Partial<LiquidContext>): string {\n const ctx: LiquidContext = {\n interface: input?.interface ?? \"SDK\",\n };\n if (input?.platform !== undefined) ctx.platform = input.platform;\n if (input?.messageId !== undefined) ctx.messageId = input.messageId;\n if (input?.id !== undefined) ctx.id = input.id;\n return JSON.stringify(ctx);\n}\n\n/**\n * Build a JSON string for the on-chain `metadata` field.\n *\n * @example\n * buildMetadata({ description: \"A cool token\" })\n * // '{\"description\":\"A cool token\"}'\n */\nexport function buildMetadata(input?: Partial<LiquidMetadata>): string {\n if (!input) return \"{}\";\n\n const meta: Record<string, unknown> = {};\n if (input.description !== undefined) meta.description = input.description;\n if (input.socialMediaUrls !== undefined && input.socialMediaUrls.length > 0) {\n meta.socialMediaUrls = input.socialMediaUrls;\n }\n if (input.auditUrls !== undefined && input.auditUrls.length > 0) {\n meta.auditUrls = input.auditUrls;\n }\n return JSON.stringify(meta);\n}\n\n// ── Parsers ─────────────────────────────────────────────────────────\n\n/**\n * Parse a context JSON string back into a typed object.\n * Returns `null` if the string is empty or not valid JSON.\n */\nexport function parseContext(contextString: string): LiquidContext | null {\n if (!contextString || contextString === \"\") return null;\n try {\n const parsed = JSON.parse(contextString);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n return {\n interface: typeof parsed.interface === \"string\" ? parsed.interface : \"unknown\",\n ...(typeof parsed.platform === \"string\" && { platform: parsed.platform }),\n ...(typeof parsed.messageId === \"string\" && { messageId: parsed.messageId }),\n ...(typeof parsed.id === \"string\" && { id: parsed.id }),\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Parse a metadata JSON string back into a typed object.\n * Returns `null` if the string is empty or not valid JSON.\n */\nexport function parseMetadata(metadataString: string): LiquidMetadata | null {\n if (!metadataString || metadataString === \"\") return null;\n try {\n const parsed = JSON.parse(metadataString);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n const result: LiquidMetadata = {};\n if (typeof parsed.description === \"string\") {\n result.description = parsed.description;\n }\n if (Array.isArray(parsed.socialMediaUrls)) {\n result.socialMediaUrls = parsed.socialMediaUrls.filter(\n (item: unknown) =>\n typeof item === \"object\" &&\n item !== null &&\n typeof (item as SocialMediaUrl).platform === \"string\" &&\n typeof (item as SocialMediaUrl).url === \"string\"\n );\n }\n if (Array.isArray(parsed.auditUrls)) {\n result.auditUrls = parsed.auditUrls.filter(\n (item: unknown) => typeof item === \"string\"\n );\n }\n return result;\n } catch {\n return null;\n }\n}\n","export const LiquidFactoryAbi = [\n {\n type: \"function\",\n name: \"deployToken\",\n inputs: [\n {\n name: \"deploymentConfig\",\n type: \"tuple\",\n components: [\n {\n name: \"tokenConfig\",\n type: \"tuple\",\n components: [\n { name: \"tokenAdmin\", type: \"address\" },\n { name: \"name\", type: \"string\" },\n { name: \"symbol\", type: \"string\" },\n { name: \"salt\", type: \"bytes32\" },\n { name: \"image\", type: \"string\" },\n { name: \"metadata\", type: \"string\" },\n { name: \"context\", type: \"string\" },\n { name: \"originatingChainId\", type: \"uint256\" },\n ],\n },\n {\n name: \"poolConfig\",\n type: \"tuple\",\n components: [\n { name: \"hook\", type: \"address\" },\n { name: \"pairedToken\", type: \"address\" },\n { name: \"tickIfToken0IsLiquid\", type: \"int24\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"poolData\", type: \"bytes\" },\n ],\n },\n {\n name: \"lockerConfig\",\n type: \"tuple\",\n components: [\n { name: \"locker\", type: \"address\" },\n { name: \"rewardAdmins\", type: \"address[]\" },\n { name: \"rewardRecipients\", type: \"address[]\" },\n { name: \"rewardBps\", type: \"uint16[]\" },\n { name: \"tickLower\", type: \"int24[]\" },\n { name: \"tickUpper\", type: \"int24[]\" },\n { name: \"positionBps\", type: \"uint16[]\" },\n { name: \"lockerData\", type: \"bytes\" },\n ],\n },\n {\n name: \"mevModuleConfig\",\n type: \"tuple\",\n components: [\n { name: \"mevModule\", type: \"address\" },\n { name: \"mevModuleData\", type: \"bytes\" },\n ],\n },\n {\n name: \"extensionConfigs\",\n type: \"tuple[]\",\n components: [\n { name: \"extension\", type: \"address\" },\n { name: \"msgValue\", type: \"uint256\" },\n { name: \"extensionBps\", type: \"uint16\" },\n { name: \"extensionData\", type: \"bytes\" },\n ],\n },\n ],\n },\n ],\n outputs: [{ name: \"tokenAddress\", type: \"address\" }],\n stateMutability: \"payable\",\n },\n {\n type: \"function\",\n name: \"tokenDeploymentInfo\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"token\", type: \"address\" },\n { name: \"hook\", type: \"address\" },\n { name: \"locker\", type: \"address\" },\n { name: \"extensions\", type: \"address[]\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"deploymentInfoForToken\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [\n { name: \"token\", type: \"address\" },\n { name: \"hook\", type: \"address\" },\n { name: \"locker\", type: \"address\" },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"deprecated\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"TOKEN_SUPPLY\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"BPS\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"teamFeeRecipient\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"enabledLockers\",\n inputs: [\n { name: \"locker\", type: \"address\" },\n { name: \"hook\", type: \"address\" },\n ],\n outputs: [{ name: \"enabled\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"event\",\n name: \"TokenCreated\",\n inputs: [\n { name: \"msgSender\", type: \"address\", indexed: false },\n { name: \"tokenAddress\", type: \"address\", indexed: true },\n { name: \"tokenAdmin\", type: \"address\", indexed: true },\n { name: \"tokenImage\", type: \"string\", indexed: false },\n { name: \"tokenName\", type: \"string\", indexed: false },\n { name: \"tokenSymbol\", type: \"string\", indexed: false },\n { name: \"tokenMetadata\", type: \"string\", indexed: false },\n { name: \"tokenContext\", type: \"string\", indexed: false },\n { name: \"startingTick\", type: \"int24\", indexed: false },\n { name: \"poolHook\", type: \"address\", indexed: false },\n { name: \"poolId\", type: \"bytes32\", indexed: false },\n { name: \"pairedToken\", type: \"address\", indexed: false },\n { name: \"locker\", type: \"address\", indexed: false },\n { name: \"mevModule\", type: \"address\", indexed: false },\n { name: \"extensionsSupply\", type: \"uint256\", indexed: false },\n { name: \"extensions\", type: \"address[]\", indexed: false },\n ],\n anonymous: false,\n },\n] as const;\n","export const LiquidFeeLockerAbi = [\n {\n type: \"function\",\n name: \"availableFees\",\n inputs: [\n { name: \"feeOwner\", type: \"address\" },\n { name: \"token\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"feesToClaim\",\n inputs: [\n { name: \"feeOwner\", type: \"address\" },\n { name: \"token\", type: \"address\" },\n ],\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"claim\",\n inputs: [\n { name: \"feeOwner\", type: \"address\" },\n { name: \"token\", type: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n","export const LiquidHookDynamicFeeV2Abi = [\n {\n type: \"function\",\n name: \"liquidIsToken0\",\n inputs: [{ name: \"\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolConfigVars\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"baseFee\", type: \"uint24\" },\n { name: \"maxLpFee\", type: \"uint24\" },\n { name: \"referenceTickFilterPeriod\", type: \"uint256\" },\n { name: \"resetPeriod\", type: \"uint256\" },\n { name: \"resetTickFilter\", type: \"int24\" },\n { name: \"feeControlNumerator\", type: \"uint256\" },\n { name: \"decayFilterBps\", type: \"uint24\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolFeeVars\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"referenceTick\", type: \"int24\" },\n { name: \"resetTick\", type: \"int24\" },\n { name: \"resetTickTimestamp\", type: \"uint256\" },\n { name: \"lastSwapTimestamp\", type: \"uint256\" },\n { name: \"appliedVR\", type: \"uint24\" },\n { name: \"prevVA\", type: \"uint24\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolCreationTimestamp\",\n inputs: [{ name: \"\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"protocolFee\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"factory\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolManager\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"locker\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"mevModule\",\n inputs: [{ name: \"\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"mevModuleEnabled\",\n inputs: [{ name: \"\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidVaultAbi = [\n {\n type: \"function\",\n name: \"allocation\",\n inputs: [{ name: \"\", type: \"address\" }],\n outputs: [\n { name: \"token\", type: \"address\" },\n { name: \"amountTotal\", type: \"uint256\" },\n { name: \"amountClaimed\", type: \"uint256\" },\n { name: \"lockupEndTime\", type: \"uint256\" },\n { name: \"vestingEndTime\", type: \"uint256\" },\n { name: \"admin\", type: \"address\" },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"amountAvailableToClaim\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"claim\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n","export const LiquidSniperAuctionV2Abi = [\n {\n type: \"function\",\n name: \"nextAuctionBlock\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"nextAuctionBlock\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"round\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"round\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"gasPeg\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"gasPeg\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"feeConfig\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [\n { name: \"startingFee\", type: \"uint24\" },\n { name: \"endingFee\", type: \"uint24\" },\n { name: \"secondsToDecay\", type: \"uint256\" },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getFee\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolDecayStartTime\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"poolDecayStartTime\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"maxRounds\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"blocksBetweenAuction\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"blocksBetweenDeploymentAndFirstAuction\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"paymentPerGasUnit\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidSniperUtilV2Abi = [\n {\n type: \"function\",\n name: \"bidInAuction\",\n inputs: [\n {\n name: \"swapParams\",\n type: \"tuple\",\n components: [\n {\n name: \"poolKey\",\n type: \"tuple\",\n components: [\n { name: \"currency0\", type: \"address\" },\n { name: \"currency1\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"hooks\", type: \"address\" },\n ],\n },\n { name: \"zeroForOne\", type: \"bool\" },\n { name: \"amountIn\", type: \"uint128\" },\n { name: \"amountOutMinimum\", type: \"uint128\" },\n { name: \"hookData\", type: \"bytes\" },\n ],\n },\n { name: \"round\", type: \"uint256\" },\n ],\n outputs: [],\n stateMutability: \"payable\",\n },\n {\n type: \"function\",\n name: \"getTxGasPriceForBidAmount\",\n inputs: [\n { name: \"auctionGasPeg\", type: \"uint256\" },\n { name: \"desiredBidAmount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"txGasPrice\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidAirdropV2Abi = [\n {\n type: \"function\",\n name: \"airdrops\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [\n { name: \"admin\", type: \"address\" },\n { name: \"merkleRoot\", type: \"bytes32\" },\n { name: \"totalSupply\", type: \"uint256\" },\n { name: \"totalClaimed\", type: \"uint256\" },\n { name: \"lockupEndTime\", type: \"uint256\" },\n { name: \"vestingEndTime\", type: \"uint256\" },\n { name: \"adminClaimTime\", type: \"uint256\" },\n { name: \"adminClaimed\", type: \"bool\" },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"amountAvailableToClaim\",\n inputs: [\n { name: \"token\", type: \"address\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"allocatedAmount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"claim\",\n inputs: [\n { name: \"token\", type: \"address\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"allocatedAmount\", type: \"uint256\" },\n { name: \"proof\", type: \"bytes32[]\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"CLAIM_EXPIRATION_INTERVAL\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"MIN_LOCKUP_DURATION\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidPoolExtensionAllowlistAbi = [\n {\n type: \"function\",\n name: \"enabledExtensions\",\n inputs: [{ name: \"extension\", type: \"address\" }],\n outputs: [{ name: \"enabled\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidMevBlockDelayAbi = [\n {\n type: \"function\",\n name: \"blockDelay\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolUnlockTime\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidLpLockerAbi = [\n {\n type: \"function\",\n name: \"tokenRewards\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"token\", type: \"address\" },\n {\n name: \"poolKey\",\n type: \"tuple\",\n components: [\n { name: \"currency0\", type: \"address\" },\n { name: \"currency1\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"hooks\", type: \"address\" },\n ],\n },\n { name: \"positionId\", type: \"uint256\" },\n { name: \"numPositions\", type: \"uint256\" },\n { name: \"rewardBps\", type: \"uint16[]\" },\n { name: \"rewardAdmins\", type: \"address[]\" },\n { name: \"rewardRecipients\", type: \"address[]\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"collectRewards\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"collectRewardsWithoutUnlock\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"updateRewardAdmin\",\n inputs: [\n { name: \"token\", type: \"address\" },\n { name: \"rewardIndex\", type: \"uint256\" },\n { name: \"newAdmin\", type: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"updateRewardRecipient\",\n inputs: [\n { name: \"token\", type: \"address\" },\n { name: \"rewardIndex\", type: \"uint256\" },\n { name: \"newRecipient\", type: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"version\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidTokenAbi = [\n {\n type: \"function\",\n name: \"updateImage\",\n inputs: [{ name: \"image_\", type: \"string\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"updateMetadata\",\n inputs: [{ name: \"metadata_\", type: \"string\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"updateAdmin\",\n inputs: [{ name: \"admin_\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"event\",\n name: \"UpdateImage\",\n inputs: [{ name: \"image\", type: \"string\", indexed: false }],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"UpdateMetadata\",\n inputs: [{ name: \"metadata\", type: \"string\", indexed: false }],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"UpdateAdmin\",\n inputs: [\n { name: \"oldAdmin\", type: \"address\", indexed: false },\n { name: \"newAdmin\", type: \"address\", indexed: false },\n ],\n anonymous: false,\n },\n] as const;\n","export const ERC20Abi = [\n {\n type: \"function\",\n name: \"name\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"symbol\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"decimals\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"totalSupply\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"balanceOf\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"allowance\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"approve\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"transfer\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n] as const;\n","export const LiquidUniv4EthDevBuyAbi = [\n {\n type: \"constructor\",\n inputs: [\n { name: \"factory_\", type: \"address\" },\n { name: \"weth_\", type: \"address\" },\n { name: \"universalRouter_\", type: \"address\" },\n { name: \"permit2_\", type: \"address\" },\n ],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"factory\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"weth\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"universalRouter\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"permit2\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"receiveTokens\",\n inputs: [\n {\n name: \"deploymentConfig\",\n type: \"tuple\",\n components: [\n {\n name: \"tokenConfig\",\n type: \"tuple\",\n components: [\n { name: \"tokenAdmin\", type: \"address\" },\n { name: \"name\", type: \"string\" },\n { name: \"symbol\", type: \"string\" },\n { name: \"salt\", type: \"bytes32\" },\n { name: \"image\", type: \"string\" },\n { name: \"metadata\", type: \"string\" },\n { name: \"context\", type: \"string\" },\n { name: \"originatingChainId\", type: \"uint256\" },\n ],\n },\n {\n name: \"poolConfig\",\n type: \"tuple\",\n components: [\n { name: \"hook\", type: \"address\" },\n { name: \"pairedToken\", type: \"address\" },\n { name: \"tickIfToken0IsLiquid\", type: \"int24\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"poolData\", type: \"bytes\" },\n ],\n },\n {\n name: \"lockerConfig\",\n type: \"tuple\",\n components: [\n { name: \"locker\", type: \"address\" },\n { name: \"rewardAdmins\", type: \"address[]\" },\n { name: \"rewardRecipients\", type: \"address[]\" },\n { name: \"rewardBps\", type: \"uint16[]\" },\n { name: \"tickLower\", type: \"int24[]\" },\n { name: \"tickUpper\", type: \"int24[]\" },\n { name: \"positionBps\", type: \"uint16[]\" },\n { name: \"lockerData\", type: \"bytes\" },\n ],\n },\n {\n name: \"mevModuleConfig\",\n type: \"tuple\",\n components: [\n { name: \"mevModule\", type: \"address\" },\n { name: \"mevModuleData\", type: \"bytes\" },\n ],\n },\n {\n name: \"extensionConfigs\",\n type: \"tuple[]\",\n components: [\n { name: \"extension\", type: \"address\" },\n { name: \"msgValue\", type: \"uint256\" },\n { name: \"extensionBps\", type: \"uint16\" },\n { name: \"extensionData\", type: \"bytes\" },\n ],\n },\n ],\n },\n {\n name: \"tokenPoolKey\",\n type: \"tuple\",\n components: [\n { name: \"currency0\", type: \"address\" },\n { name: \"currency1\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"hooks\", type: \"address\" },\n ],\n },\n { name: \"token\", type: \"address\" },\n { name: \"extensionSupply\", type: \"uint256\" },\n { name: \"extensionIndex\", type: \"uint256\" },\n ],\n outputs: [],\n stateMutability: \"payable\",\n },\n {\n type: \"function\",\n name: \"supportsInterface\",\n inputs: [{ name: \"interfaceId\", type: \"bytes4\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"pure\",\n },\n {\n type: \"event\",\n name: \"EthDevBuy\",\n inputs: [\n { name: \"token\", type: \"address\", indexed: true },\n { name: \"user\", type: \"address\", indexed: true },\n { name: \"ethAmount\", type: \"uint256\", indexed: false },\n { name: \"tokenAmount\", type: \"uint256\", indexed: false },\n ],\n anonymous: false,\n },\n { type: \"error\", name: \"InvalidEthDevBuyPercentage\", inputs: [] },\n { type: \"error\", name: \"InvalidMsgValue\", inputs: [] },\n { type: \"error\", name: \"InvalidPairedTokenPoolKey\", inputs: [] },\n { type: \"error\", name: \"ReentrancyGuardReentrantCall\", inputs: [] },\n { type: \"error\", name: \"Unauthorized\", inputs: [] },\n] as const;\n","/**\n * Tick ↔ market cap conversion utilities for Uniswap V4 concentrated liquidity.\n *\n * All tokens have 100B supply (10^11) with 18 decimals.\n * Price per token = marketCap / totalSupply.\n * Tick = log(price) / log(1.0001), aligned to tickSpacing.\n */\n\nconst LOG_BASE = Math.log(1.0001);\nconst DEFAULT_TICK_SPACING = 200;\n\n/**\n * Total human-readable supply for every Liquid token: 100 billion.\n * Used to derive price-per-token from market cap.\n */\nconst TOTAL_SUPPLY = 1e11; // 100,000,000,000\n\n/**\n * Convert an ETH-denominated market cap to a Uniswap V4 tick.\n *\n * @param marketCapETH - Market cap in ETH (e.g. 10 for a 10 ETH starting cap)\n * @param tickSpacing - Tick spacing to align to (default 200)\n * @returns Tick value (int24) aligned to tickSpacing\n *\n * @example\n * ```ts\n * getTickFromMarketCapETH(10) // → -230400 (≈10 ETH market cap)\n * getTickFromMarketCapETH(200) // → -200200 (≈200 ETH)\n * ```\n */\nexport function getTickFromMarketCapETH(\n marketCapETH: number,\n tickSpacing: number = DEFAULT_TICK_SPACING,\n): number {\n if (marketCapETH <= 0) throw new Error(\"marketCapETH must be positive\");\n const price = marketCapETH / TOTAL_SUPPLY; // WETH per token\n const rawTick = Math.log(price) / LOG_BASE;\n return Math.floor(rawTick / tickSpacing) * tickSpacing;\n}\n\n/**\n * Convert a USD-denominated market cap to a Uniswap V4 tick.\n *\n * @param marketCapUSD - Market cap in USD (e.g. 500_000 for $500K)\n * @param ethPriceUSD - Current ETH price in USD (e.g. 2070)\n * @param tickSpacing - Tick spacing to align to (default 200)\n * @returns Tick value (int24) aligned to tickSpacing\n *\n * @example\n * ```ts\n * getTickFromMarketCapUSD(500_000, 2070) // tick for $500K market cap\n * getTickFromMarketCapUSD(10_000_000, 2070) // tick for $10M market cap\n * ```\n */\nexport function getTickFromMarketCapUSD(\n marketCapUSD: number,\n ethPriceUSD: number,\n tickSpacing: number = DEFAULT_TICK_SPACING,\n): number {\n if (ethPriceUSD <= 0) throw new Error(\"ethPriceUSD must be positive\");\n return getTickFromMarketCapETH(marketCapUSD / ethPriceUSD, tickSpacing);\n}\n\n/**\n * Convert a tick back to an ETH-denominated market cap.\n *\n * @param tick - Uniswap V4 tick value\n * @returns Market cap in ETH\n *\n * @example\n * ```ts\n * marketCapFromTickETH(-230400) // ≈ 10 ETH\n * ```\n */\nexport function marketCapFromTickETH(tick: number): number {\n const price = Math.pow(1.0001, tick);\n return price * TOTAL_SUPPLY;\n}\n\n/**\n * Convert a tick to a USD-denominated market cap.\n *\n * @param tick - Uniswap V4 tick value\n * @param ethPriceUSD - Current ETH price in USD\n * @returns Market cap in USD\n */\nexport function marketCapFromTickUSD(tick: number, ethPriceUSD: number): number {\n return marketCapFromTickETH(tick) * ethPriceUSD;\n}\n\n/**\n * Convert a market cap in a stablecoin to a tick.\n * Supports any stablecoin decimal count (6 for USDC, 18 for DAI, etc.)\n *\n * @param marketCap - Market cap in stablecoin units\n * @param stableDecimals - Decimals of the stablecoin (e.g. 6 for USDC)\n * @param tickSpacing - Tick spacing (default 200)\n * @returns Tick value aligned to tickSpacing\n */\nexport function getTickFromMarketCapStable(\n marketCap: number,\n stableDecimals: number,\n tickSpacing: number = DEFAULT_TICK_SPACING,\n): number {\n if (marketCap <= 0) throw new Error(\"marketCap must be positive\");\n // price = (marketCap * 10^stableDecimals) / 10^29\n const price = marketCap / Math.pow(10, 29 - stableDecimals);\n const rawTick = Math.log(price) / LOG_BASE;\n return Math.floor(rawTick / tickSpacing) * tickSpacing;\n}\n","/**\n * Multi-tranche liquidity position builder.\n *\n * Creates position arrays (tickLower[], tickUpper[], positionBps[]) from\n * market cap milestones. Percentages represent share of the *pool supply*\n * (i.e. after dev buy, airdrop, and vault allocations are deducted).\n */\n\nimport { getTickFromMarketCapETH, getTickFromMarketCapUSD } from \"./tick-math\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface MarketCapTranche {\n /** Upper bound market cap in ETH for this tranche */\n upperMarketCapETH: number;\n /** Percentage of pool supply allocated to this tranche (1-100) */\n supplyPct: number;\n}\n\nexport interface MarketCapTrancheUSD {\n /** Upper bound market cap in USD for this tranche */\n upperMarketCapUSD: number;\n /** Percentage of pool supply allocated to this tranche (1-100) */\n supplyPct: number;\n}\n\nexport interface PositionConfig {\n tickLower: number;\n tickUpper: number;\n positionBps: number;\n}\n\nexport interface PositionArrays {\n tickLower: number[];\n tickUpper: number[];\n positionBps: number[];\n}\n\n// ── Default tranches ─────────────────────────────────────────────────\n\n/**\n * Default Liquid tranches (USD-denominated).\n *\n * - Starting → $500K market cap: 40% of pool supply\n * - $500K → $10M market cap: 50% of pool supply\n * - $10M → $1B market cap: 10% of pool supply\n */\nexport const DEFAULT_TRANCHES_USD: MarketCapTrancheUSD[] = [\n { upperMarketCapUSD: 500_000, supplyPct: 40 },\n { upperMarketCapUSD: 10_000_000, supplyPct: 50 },\n { upperMarketCapUSD: 1_000_000_000, supplyPct: 10 },\n];\n\n// ── Builders ─────────────────────────────────────────────────────────\n\n/**\n * Build position arrays from ETH-denominated market cap tranches.\n *\n * @param startingMarketCapETH - Initial market cap in ETH (determines the starting tick)\n * @param tranches - Array of tranches with upper market cap bounds and supply percentages\n * @param tickSpacing - Tick spacing (default 200)\n * @returns Position arrays ready to pass to `deployToken()`\n *\n * @example\n * ```ts\n * const positions = createPositions(10, [\n * { upperMarketCapETH: 241.5, supplyPct: 40 }, // ~$500K at $2070/ETH\n * { upperMarketCapETH: 4830, supplyPct: 50 }, // ~$10M\n * { upperMarketCapETH: 483050, supplyPct: 10 }, // ~$1B\n * ]);\n * // → { tickLower: [-230400, -198600, -168600],\n * // tickUpper: [-198600, -168600, -122400],\n * // positionBps: [4000, 5000, 1000] }\n * ```\n */\nexport function createPositions(\n startingMarketCapETH: number,\n tranches: MarketCapTranche[],\n tickSpacing: number = 200,\n): PositionArrays {\n if (tranches.length === 0) throw new Error(\"At least one tranche is required\");\n if (tranches.length > 7) throw new Error(\"Maximum 7 positions allowed\");\n\n const totalPct = tranches.reduce((sum, t) => sum + t.supplyPct, 0);\n if (Math.abs(totalPct - 100) > 0.01) {\n throw new Error(`Tranche percentages must sum to 100, got ${totalPct}`);\n }\n\n // Validate tranches are ordered by ascending market cap\n for (let i = 1; i < tranches.length; i++) {\n if (tranches[i].upperMarketCapETH <= tranches[i - 1].upperMarketCapETH) {\n throw new Error(\"Tranches must be ordered by ascending upperMarketCapETH\");\n }\n }\n\n const startingTick = getTickFromMarketCapETH(startingMarketCapETH, tickSpacing);\n\n const tickLower: number[] = [];\n const tickUpper: number[] = [];\n const positionBps: number[] = [];\n\n let prevTick = startingTick;\n\n for (const tranche of tranches) {\n const upperTick = getTickFromMarketCapETH(tranche.upperMarketCapETH, tickSpacing);\n\n if (upperTick <= prevTick) {\n throw new Error(\n `Tranche upper market cap ${tranche.upperMarketCapETH} ETH resolves to tick ${upperTick}, ` +\n `which is not above previous tick ${prevTick}. Increase the market cap or reduce tick spacing.`\n );\n }\n\n tickLower.push(prevTick);\n tickUpper.push(upperTick);\n positionBps.push(Math.round(tranche.supplyPct * 100)); // pct → bps\n\n prevTick = upperTick;\n }\n\n return { tickLower, tickUpper, positionBps };\n}\n\n/**\n * Build position arrays from USD-denominated market cap tranches.\n * Convenience wrapper that converts USD → ETH using the provided ETH price.\n *\n * @param startingMarketCapUSD - Initial market cap in USD\n * @param ethPriceUSD - Current ETH price in USD\n * @param tranches - Array of tranches with upper USD market cap bounds\n * @param tickSpacing - Tick spacing (default 200)\n * @returns Position arrays ready to pass to `deployToken()`\n *\n * @example\n * ```ts\n * const positions = createPositionsUSD(20_000, 2070, [\n * { upperMarketCapUSD: 500_000, supplyPct: 40 },\n * { upperMarketCapUSD: 10_000_000, supplyPct: 50 },\n * { upperMarketCapUSD: 1_000_000_000, supplyPct: 10 },\n * ]);\n * ```\n */\nexport function createPositionsUSD(\n startingMarketCapUSD: number,\n ethPriceUSD: number,\n tranches: MarketCapTrancheUSD[],\n tickSpacing: number = 200,\n): PositionArrays {\n if (ethPriceUSD <= 0) throw new Error(\"ethPriceUSD must be positive\");\n\n const ethTranches: MarketCapTranche[] = tranches.map((t) => ({\n upperMarketCapETH: t.upperMarketCapUSD / ethPriceUSD,\n supplyPct: t.supplyPct,\n }));\n\n return createPositions(\n startingMarketCapUSD / ethPriceUSD,\n ethTranches,\n tickSpacing,\n );\n}\n\n/**\n * Build default Liquid positions using the standard 3-tranche split.\n *\n * - Starting → $500K: 40% of pool supply\n * - $500K → $10M: 50% of pool supply\n * - $10M → $1B: 10% of pool supply\n *\n * @param startingMarketCapUSD - Initial market cap in USD (e.g. 20_000 for ~10 ETH)\n * @param ethPriceUSD - Current ETH price in USD\n * @param tickSpacing - Tick spacing (default 200)\n *\n * @example\n * ```ts\n * const positions = createDefaultPositions(20_000, 2070);\n * const tx = await sdk.deployToken({\n * name: \"MyToken\",\n * symbol: \"MTK\",\n * ...positions,\n * });\n * ```\n */\nexport function createDefaultPositions(\n startingMarketCapUSD: number,\n ethPriceUSD: number,\n tickSpacing: number = 200,\n): PositionArrays & { tickIfToken0IsLiquid: number } {\n const positions = createPositionsUSD(\n startingMarketCapUSD,\n ethPriceUSD,\n DEFAULT_TRANCHES_USD,\n tickSpacing,\n );\n\n return {\n ...positions,\n tickIfToken0IsLiquid: positions.tickLower[0],\n };\n}\n\n/**\n * Describe positions as human-readable market cap ranges.\n * Useful for displaying position info in UIs.\n *\n * @param positions - Position arrays\n * @param ethPriceUSD - Optional ETH price for USD display\n */\nexport function describePositions(\n positions: PositionArrays,\n ethPriceUSD?: number,\n): Array<{\n index: number;\n tickLower: number;\n tickUpper: number;\n supplyPct: number;\n marketCapLowerETH: number;\n marketCapUpperETH: number;\n marketCapLowerUSD?: number;\n marketCapUpperUSD?: number;\n}> {\n return positions.tickLower.map((_, i) => {\n const lowerETH = Math.pow(1.0001, positions.tickLower[i]) * 1e11;\n const upperETH = Math.pow(1.0001, positions.tickUpper[i]) * 1e11;\n return {\n index: i,\n tickLower: positions.tickLower[i],\n tickUpper: positions.tickUpper[i],\n supplyPct: positions.positionBps[i] / 100,\n marketCapLowerETH: lowerETH,\n marketCapUpperETH: upperETH,\n ...(ethPriceUSD != null && {\n marketCapLowerUSD: lowerETH * ethPriceUSD,\n marketCapUpperUSD: upperETH * ethPriceUSD,\n }),\n };\n });\n}\n"],"mappings":"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","names":["import_viem","import_chains","decoded"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/constants.ts","../src/utils/encoding.ts","../src/utils/context.ts","../src/abis/LiquidFactory.ts","../src/abis/LiquidFeeLocker.ts","../src/abis/LiquidHookDynamicFeeV2.ts","../src/abis/LiquidVault.ts","../src/abis/LiquidSniperAuctionV2.ts","../src/abis/LiquidSniperUtilV2.ts","../src/abis/LiquidAirdropV2.ts","../src/abis/LiquidPoolExtensionAllowlist.ts","../src/abis/LiquidMevBlockDelay.ts","../src/abis/LiquidLpLocker.ts","../src/abis/LiquidToken.ts","../src/abis/ERC20.ts","../src/abis/LiquidUniv4EthDevBuy.ts","../src/utils/tick-math.ts","../src/utils/positions.ts"],"sourcesContent":["export { LiquidSDK } from \"./client\";\nexport { ADDRESSES, EXTERNAL, FEE, TOKEN, DEFAULT_CHAIN, DEFAULT_CHAIN_ID, DEFAULT_RPC_URL, POOL_POSITIONS, DEFAULTS } from \"./constants\";\nexport type { PoolPosition } from \"./constants\";\nexport {\n LiquidFactoryAbi,\n LiquidFeeLockerAbi,\n LiquidHookDynamicFeeV2Abi,\n LiquidVaultAbi,\n LiquidSniperAuctionV2Abi,\n LiquidSniperUtilV2Abi,\n LiquidAirdropV2Abi,\n LiquidPoolExtensionAllowlistAbi,\n LiquidMevBlockDelayAbi,\n LiquidLpLockerAbi,\n LiquidTokenAbi,\n LiquidUniv4EthDevBuyAbi,\n ERC20Abi,\n} from \"./abis\";\nexport {\n getTickFromMarketCapETH,\n getTickFromMarketCapUSD,\n getTickFromMarketCapStable,\n marketCapFromTickETH,\n marketCapFromTickUSD,\n createPositions,\n createPositionsUSD,\n createDefaultPositions,\n describePositions,\n DEFAULT_TRANCHES_USD,\n encodeStaticFeePoolData,\n encodeDynamicFeePoolData,\n encodeSniperAuctionData,\n encodeFeeConversionLockerData,\n FeePreference,\n buildContext,\n buildMetadata,\n parseContext,\n parseMetadata,\n} from \"./utils\";\nexport type {\n MarketCapTranche,\n MarketCapTrancheUSD,\n PositionConfig,\n PositionArrays,\n DynamicFeeConfig,\n SniperAuctionConfig,\n LiquidContext,\n LiquidMetadata,\n SocialMediaUrl,\n} from \"./utils\";\nexport type {\n AirdropInfo,\n DeployTokenParams,\n DeployTokenResult,\n DeploymentConfig,\n DeploymentInfo,\n DevBuyParams,\n ExtensionConfig,\n GetTokensOptions,\n LiquidSDKConfig,\n LockerConfig,\n MevModuleConfig,\n PoolConfig,\n PoolDynamicConfigVars,\n PoolDynamicFeeVars,\n PoolKey,\n SniperAuctionFeeConfig,\n SniperAuctionState,\n TokenConfig,\n TokenCreatedEvent,\n TokenRewardInfo,\n VaultAllocation,\n} from \"./types\";\n","import {\n type Address,\n type Hash,\n type Hex,\n type PublicClient,\n type WalletClient,\n createPublicClient,\n http,\n decodeEventLog,\n encodeAbiParameters,\n encodePacked,\n keccak256,\n getAddress,\n parseAbiItem,\n zeroAddress,\n} from \"viem\";\nimport { base } from \"viem/chains\";\nimport { ADDRESSES, EXTERNAL, DEFAULT_CHAIN_ID, DEFAULTS, POOL_POSITIONS, FEE, TOKEN } from \"./constants\";\nimport { encodeStaticFeePoolData, encodeSniperAuctionData, encodeFeeConversionLockerData, FeePreference } from \"./utils/encoding\";\nimport { buildContext } from \"./utils/context\";\nimport { LiquidFactoryAbi } from \"./abis/LiquidFactory\";\nimport { LiquidFeeLockerAbi } from \"./abis/LiquidFeeLocker\";\nimport { LiquidHookDynamicFeeV2Abi } from \"./abis/LiquidHookDynamicFeeV2\";\nimport { LiquidVaultAbi } from \"./abis/LiquidVault\";\nimport { LiquidSniperAuctionV2Abi } from \"./abis/LiquidSniperAuctionV2\";\nimport { LiquidSniperUtilV2Abi } from \"./abis/LiquidSniperUtilV2\";\nimport { LiquidAirdropV2Abi } from \"./abis/LiquidAirdropV2\";\nimport { LiquidPoolExtensionAllowlistAbi } from \"./abis/LiquidPoolExtensionAllowlist\";\nimport { LiquidMevBlockDelayAbi } from \"./abis/LiquidMevBlockDelay\";\nimport { LiquidLpLockerAbi } from \"./abis/LiquidLpLocker\";\nimport { LiquidTokenAbi } from \"./abis/LiquidToken\";\nimport { ERC20Abi } from \"./abis/ERC20\";\nimport type {\n AirdropInfo,\n DeployTokenParams,\n DeployTokenResult,\n DevBuyParams,\n DeploymentInfo,\n DeploymentConfig,\n ExtensionConfig,\n GetTokensOptions,\n LiquidSDKConfig,\n PoolDynamicConfigVars,\n PoolDynamicFeeVars,\n SniperAuctionFeeConfig,\n SniperAuctionState,\n TokenCreatedEvent,\n TokenRewardInfo,\n VaultAllocation,\n} from \"./types\";\n\nexport class LiquidSDK {\n public readonly publicClient: PublicClient;\n public readonly walletClient?: WalletClient;\n\n constructor(config: LiquidSDKConfig) {\n this.publicClient = config.publicClient ?? createPublicClient({\n chain: base,\n transport: http(),\n });\n this.walletClient = config.walletClient;\n }\n\n // ── Dev Buy Helper ───────────────────────────────────────────────\n\n /**\n * Build an ExtensionConfig for a dev buy (buy tokens with ETH at launch).\n * The paired token must be WETH for simple dev buys.\n */\n buildDevBuyExtension(devBuy: DevBuyParams): ExtensionConfig {\n // Encode Univ4EthDevBuyExtensionData struct:\n // { PoolKey pairedTokenPoolKey, uint128 pairedTokenAmountOutMinimum, address recipient }\n // For WETH-paired tokens, pairedTokenPoolKey is zeroed out (not used)\n const extensionData = encodeAbiParameters(\n [\n {\n type: \"tuple\",\n components: [\n {\n type: \"tuple\",\n name: \"pairedTokenPoolKey\",\n components: [\n { type: \"address\", name: \"currency0\" },\n { type: \"address\", name: \"currency1\" },\n { type: \"uint24\", name: \"fee\" },\n { type: \"int24\", name: \"tickSpacing\" },\n { type: \"address\", name: \"hooks\" },\n ],\n },\n { type: \"uint128\", name: \"pairedTokenAmountOutMinimum\" },\n { type: \"address\", name: \"recipient\" },\n ],\n },\n ],\n [\n {\n pairedTokenPoolKey: {\n currency0: zeroAddress,\n currency1: zeroAddress,\n fee: 0,\n tickSpacing: 0,\n hooks: zeroAddress,\n },\n pairedTokenAmountOutMinimum: 0n,\n recipient: devBuy.recipient,\n },\n ]\n );\n\n return {\n extension: ADDRESSES.UNIV4_ETH_DEV_BUY,\n msgValue: devBuy.ethAmount,\n extensionBps: 0,\n extensionData,\n };\n }\n\n // ── Validation ─────────────────────────────────────────────────\n\n /**\n * Validate a DeploymentConfig before sending to the contract.\n * Catches common mistakes client-side with clear error messages.\n */\n private validateDeploymentConfig(config: DeploymentConfig): void {\n const { lockerConfig, extensionConfigs } = config;\n const { tickSpacing } = config.poolConfig;\n\n // Position arrays must be the same length\n const posLen = lockerConfig.tickLower.length;\n if (\n lockerConfig.tickUpper.length !== posLen ||\n lockerConfig.positionBps.length !== posLen\n ) {\n throw new Error(\n `tickLower (${posLen}), tickUpper (${lockerConfig.tickUpper.length}), ` +\n `and positionBps (${lockerConfig.positionBps.length}) arrays must be the same length`\n );\n }\n\n if (posLen === 0) {\n throw new Error(\"At least one position is required\");\n }\n\n if (posLen > 7) {\n throw new Error(`Maximum 7 positions allowed, got ${posLen}`);\n }\n\n // positionBps must sum to 10000\n const posBpsSum = lockerConfig.positionBps.reduce((s, b) => s + b, 0);\n if (posBpsSum !== FEE.BPS) {\n throw new Error(\n `positionBps must sum to ${FEE.BPS} (100%), got ${posBpsSum}`\n );\n }\n\n // Each position: tickLower < tickUpper\n for (let i = 0; i < posLen; i++) {\n if (lockerConfig.tickLower[i] >= lockerConfig.tickUpper[i]) {\n throw new Error(\n `Position ${i}: tickLower (${lockerConfig.tickLower[i]}) must be less than tickUpper (${lockerConfig.tickUpper[i]})`\n );\n }\n }\n\n // Ticks must be multiples of tickSpacing\n for (let i = 0; i < posLen; i++) {\n if (lockerConfig.tickLower[i] % tickSpacing !== 0) {\n throw new Error(\n `Position ${i}: tickLower (${lockerConfig.tickLower[i]}) is not a multiple of tickSpacing (${tickSpacing})`\n );\n }\n if (lockerConfig.tickUpper[i] % tickSpacing !== 0) {\n throw new Error(\n `Position ${i}: tickUpper (${lockerConfig.tickUpper[i]}) is not a multiple of tickSpacing (${tickSpacing})`\n );\n }\n }\n\n // All tickLower must be >= starting tick\n const startingTick = config.poolConfig.tickIfToken0IsLiquid;\n for (let i = 0; i < posLen; i++) {\n if (lockerConfig.tickLower[i] < startingTick) {\n throw new Error(\n `Position ${i}: tickLower (${lockerConfig.tickLower[i]}) is below the starting tick (${startingTick})`\n );\n }\n }\n\n // At least one position must start at the starting tick\n const touchesStart = lockerConfig.tickLower.some(\n (t) => t === startingTick\n );\n if (!touchesStart) {\n throw new Error(\n `At least one position's tickLower must equal tickIfToken0IsLiquid (${startingTick})`\n );\n }\n\n // Reward arrays must be the same length\n const rwdLen = lockerConfig.rewardAdmins.length;\n if (\n lockerConfig.rewardRecipients.length !== rwdLen ||\n lockerConfig.rewardBps.length !== rwdLen\n ) {\n throw new Error(\n `rewardAdmins (${rwdLen}), rewardRecipients (${lockerConfig.rewardRecipients.length}), ` +\n `and rewardBps (${lockerConfig.rewardBps.length}) arrays must be the same length`\n );\n }\n\n if (rwdLen === 0) {\n throw new Error(\"At least one reward recipient is required\");\n }\n\n // rewardBps must sum to 10000\n const rwdBpsSum = lockerConfig.rewardBps.reduce((s, b) => s + b, 0);\n if (rwdBpsSum !== FEE.BPS) {\n throw new Error(\n `rewardBps must sum to ${FEE.BPS} (100%), got ${rwdBpsSum}`\n );\n }\n\n // Extensions count limit\n if (extensionConfigs.length > TOKEN.MAX_EXTENSIONS) {\n throw new Error(\n `Maximum ${TOKEN.MAX_EXTENSIONS} extensions allowed, got ${extensionConfigs.length}`\n );\n }\n\n // Total extension bps must not exceed max\n const extBpsSum = extensionConfigs.reduce(\n (s, e) => s + e.extensionBps,\n 0\n );\n if (extBpsSum > TOKEN.MAX_EXTENSION_BPS) {\n throw new Error(\n `Total extensionBps (${extBpsSum}) exceeds maximum (${TOKEN.MAX_EXTENSION_BPS})`\n );\n }\n }\n\n // ── Token Deployment ─────────────────────────────────────────────\n\n async deployToken(params: DeployTokenParams): Promise<DeployTokenResult> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for deployToken\");\n }\n\n const account = this.walletClient.account.address;\n\n const deploymentConfig: DeploymentConfig = {\n tokenConfig: {\n tokenAdmin: params.tokenAdmin ?? account,\n name: params.name,\n symbol: params.symbol,\n salt:\n params.salt ??\n keccak256(\n encodePacked(\n [\"string\", \"string\", \"uint256\"],\n [params.name, params.symbol, BigInt(Date.now())]\n )\n ),\n image: params.image ?? \"\",\n metadata: params.metadata ?? \"\",\n context: params.context ?? buildContext(),\n originatingChainId: BigInt(DEFAULT_CHAIN_ID),\n },\n poolConfig: {\n hook: params.hook ?? DEFAULTS.HOOK,\n pairedToken: params.pairedToken ?? EXTERNAL.WETH,\n tickIfToken0IsLiquid:\n params.tickIfToken0IsLiquid ?? DEFAULTS.TICK_IF_TOKEN0_IS_LIQUID,\n tickSpacing: params.tickSpacing ?? DEFAULTS.TICK_SPACING,\n poolData:\n params.poolData ??\n encodeStaticFeePoolData(\n DEFAULTS.LIQUID_FEE_BPS,\n DEFAULTS.PAIRED_FEE_BPS,\n ),\n },\n lockerConfig: (() => {\n const locker = params.locker ?? DEFAULTS.LOCKER;\n const rewardRecipients = params.rewardRecipients ?? [account];\n const rewardBps = params.rewardBps ?? [10000];\n\n // Auto-encode lockerData for fee conversion locker:\n // one FeePreference.Paired entry per reward recipient (fees → ETH)\n let lockerData = params.lockerData ?? \"0x\";\n if (lockerData === \"0x\" && getAddress(locker) === getAddress(ADDRESSES.LP_LOCKER_FEE_CONVERSION)) {\n lockerData = encodeFeeConversionLockerData(\n rewardRecipients.map(() => FeePreference.Paired),\n );\n }\n\n return {\n locker,\n rewardAdmins: params.rewardAdmins ?? [account],\n rewardRecipients,\n rewardBps,\n tickLower:\n params.tickLower ??\n POOL_POSITIONS.Liquid.map((p) => p.tickLower),\n tickUpper:\n params.tickUpper ??\n POOL_POSITIONS.Liquid.map((p) => p.tickUpper),\n positionBps:\n params.positionBps ??\n POOL_POSITIONS.Liquid.map((p) => p.positionBps),\n lockerData,\n };\n })(),\n mevModuleConfig: {\n mevModule: params.mevModule ?? DEFAULTS.MEV_MODULE,\n mevModuleData:\n params.mevModuleData ??\n encodeSniperAuctionData({\n startingFee: DEFAULTS.SNIPER_STARTING_FEE,\n endingFee: DEFAULTS.SNIPER_ENDING_FEE,\n secondsToDecay: DEFAULTS.SNIPER_SECONDS_TO_DECAY,\n }),\n },\n extensionConfigs: [...(params.extensions ?? [])],\n };\n\n // Append dev buy extension if specified\n if (params.devBuy) {\n deploymentConfig.extensionConfigs.push(\n this.buildDevBuyExtension(params.devBuy)\n );\n }\n\n // ── Client-side validation ────────────────────────────────────\n this.validateDeploymentConfig(deploymentConfig);\n\n // Calculate total msg.value from extensions\n const msgValue = deploymentConfig.extensionConfigs.reduce(\n (sum, ext) => sum + ext.msgValue,\n 0n\n );\n\n const txHash = await this.walletClient.writeContract({\n address: ADDRESSES.FACTORY,\n abi: LiquidFactoryAbi,\n functionName: \"deployToken\",\n args: [deploymentConfig],\n value: msgValue,\n chain: base,\n account: this.walletClient.account,\n });\n\n const receipt = await this.publicClient.waitForTransactionReceipt({\n hash: txHash,\n });\n\n // Parse TokenCreated event from logs\n const tokenCreatedLog = receipt.logs.find((log) => {\n try {\n const decoded = decodeEventLog({\n abi: LiquidFactoryAbi,\n data: log.data,\n topics: log.topics,\n });\n return decoded.eventName === \"TokenCreated\";\n } catch {\n return false;\n }\n });\n\n if (!tokenCreatedLog) {\n throw new Error(\"TokenCreated event not found in transaction receipt\");\n }\n\n const decoded = decodeEventLog({\n abi: LiquidFactoryAbi,\n data: tokenCreatedLog.data,\n topics: tokenCreatedLog.topics,\n });\n\n const args = decoded.args as any;\n\n return {\n tokenAddress: getAddress(args.tokenAddress),\n txHash,\n event: {\n msgSender: args.msgSender,\n tokenAddress: args.tokenAddress,\n tokenAdmin: args.tokenAdmin,\n tokenImage: args.tokenImage,\n tokenName: args.tokenName,\n tokenSymbol: args.tokenSymbol,\n tokenMetadata: args.tokenMetadata,\n tokenContext: args.tokenContext,\n startingTick: args.startingTick,\n poolHook: args.poolHook,\n poolId: args.poolId,\n pairedToken: args.pairedToken,\n locker: args.locker,\n mevModule: args.mevModule,\n extensionsSupply: args.extensionsSupply,\n extensions: args.extensions,\n },\n };\n }\n\n // ── Token Info ────────────────────────────────────────────────────\n\n async getDeploymentInfo(tokenAddress: Address): Promise<DeploymentInfo> {\n const result = await this.publicClient.readContract({\n address: ADDRESSES.FACTORY,\n abi: LiquidFactoryAbi,\n functionName: \"tokenDeploymentInfo\",\n args: [tokenAddress],\n });\n\n const data = result as any;\n return {\n token: data.token,\n hook: data.hook,\n locker: data.locker,\n extensions: data.extensions,\n };\n }\n\n async getTokenInfo(tokenAddress: Address) {\n const [name, symbol, decimals, totalSupply] = await Promise.all([\n this.publicClient.readContract({\n address: tokenAddress,\n abi: ERC20Abi,\n functionName: \"name\",\n }),\n this.publicClient.readContract({\n address: tokenAddress,\n abi: ERC20Abi,\n functionName: \"symbol\",\n }),\n this.publicClient.readContract({\n address: tokenAddress,\n abi: ERC20Abi,\n functionName: \"decimals\",\n }),\n this.publicClient.readContract({\n address: tokenAddress,\n abi: ERC20Abi,\n functionName: \"totalSupply\",\n }),\n ]);\n\n const deployment = await this.getDeploymentInfo(tokenAddress);\n\n return {\n address: tokenAddress,\n name: name as string,\n symbol: symbol as string,\n decimals: decimals as number,\n totalSupply: totalSupply as bigint,\n deployment,\n };\n }\n\n // ── Pool Info ─────────────────────────────────────────────────────\n\n async getPoolConfig(\n poolId: Hex,\n hookAddress?: Address\n ): Promise<PoolDynamicConfigVars> {\n const hook = hookAddress ?? ADDRESSES.HOOK_DYNAMIC_FEE_V2;\n const result = await this.publicClient.readContract({\n address: hook,\n abi: LiquidHookDynamicFeeV2Abi,\n functionName: \"poolConfigVars\",\n args: [poolId],\n });\n\n const data = result as any;\n return {\n baseFee: data.baseFee,\n maxLpFee: data.maxLpFee,\n referenceTickFilterPeriod: data.referenceTickFilterPeriod,\n resetPeriod: data.resetPeriod,\n resetTickFilter: data.resetTickFilter,\n feeControlNumerator: data.feeControlNumerator,\n decayFilterBps: data.decayFilterBps,\n };\n }\n\n async getPoolFeeState(\n poolId: Hex,\n hookAddress?: Address\n ): Promise<PoolDynamicFeeVars> {\n const hook = hookAddress ?? ADDRESSES.HOOK_DYNAMIC_FEE_V2;\n const result = await this.publicClient.readContract({\n address: hook,\n abi: LiquidHookDynamicFeeV2Abi,\n functionName: \"poolFeeVars\",\n args: [poolId],\n });\n\n const data = result as any;\n return {\n referenceTick: data.referenceTick,\n resetTick: data.resetTick,\n resetTickTimestamp: data.resetTickTimestamp,\n lastSwapTimestamp: data.lastSwapTimestamp,\n appliedVR: data.appliedVR,\n prevVA: data.prevVA,\n };\n }\n\n async getPoolCreationTimestamp(\n poolId: Hex,\n hookAddress?: Address\n ): Promise<bigint> {\n const hook = hookAddress ?? ADDRESSES.HOOK_DYNAMIC_FEE_V2;\n return (await this.publicClient.readContract({\n address: hook,\n abi: LiquidHookDynamicFeeV2Abi,\n functionName: \"poolCreationTimestamp\",\n args: [poolId],\n })) as bigint;\n }\n\n async isLiquidToken0(\n poolId: Hex,\n hookAddress?: Address\n ): Promise<boolean> {\n const hook = hookAddress ?? ADDRESSES.HOOK_DYNAMIC_FEE_V2;\n return (await this.publicClient.readContract({\n address: hook,\n abi: LiquidHookDynamicFeeV2Abi,\n functionName: \"liquidIsToken0\",\n args: [poolId],\n })) as boolean;\n }\n\n // ── Fee Claims ────────────────────────────────────────────────────\n\n async getAvailableFees(\n feeOwner: Address,\n tokenAddress: Address\n ): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.FEE_LOCKER,\n abi: LiquidFeeLockerAbi,\n functionName: \"availableFees\",\n args: [feeOwner, tokenAddress],\n })) as bigint;\n }\n\n async getFeesToClaim(\n feeOwner: Address,\n tokenAddress: Address\n ): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.FEE_LOCKER,\n abi: LiquidFeeLockerAbi,\n functionName: \"feesToClaim\",\n args: [feeOwner, tokenAddress],\n })) as bigint;\n }\n\n async claimFees(feeOwner: Address, tokenAddress: Address): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for claimFees\");\n }\n\n return await this.walletClient.writeContract({\n address: ADDRESSES.FEE_LOCKER,\n abi: LiquidFeeLockerAbi,\n functionName: \"claim\",\n args: [feeOwner, tokenAddress],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n // ── Vault ─────────────────────────────────────────────────────────\n\n async getVaultAllocation(\n tokenAddress: Address\n ): Promise<VaultAllocation> {\n const result = await this.publicClient.readContract({\n address: ADDRESSES.VAULT,\n abi: LiquidVaultAbi,\n functionName: \"allocation\",\n args: [tokenAddress],\n });\n\n const data = result as any;\n return {\n token: data[0] ?? data.token,\n amountTotal: data[1] ?? data.amountTotal,\n amountClaimed: data[2] ?? data.amountClaimed,\n lockupEndTime: data[3] ?? data.lockupEndTime,\n vestingEndTime: data[4] ?? data.vestingEndTime,\n admin: data[5] ?? data.admin,\n };\n }\n\n async getVaultClaimable(tokenAddress: Address): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.VAULT,\n abi: LiquidVaultAbi,\n functionName: \"amountAvailableToClaim\",\n args: [tokenAddress],\n })) as bigint;\n }\n\n async claimVault(tokenAddress: Address): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for claimVault\");\n }\n\n return await this.walletClient.writeContract({\n address: ADDRESSES.VAULT,\n abi: LiquidVaultAbi,\n functionName: \"claim\",\n args: [tokenAddress],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n // ── Factory Status ────────────────────────────────────────────────\n\n async isFactoryDeprecated(): Promise<boolean> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.FACTORY,\n abi: LiquidFactoryAbi,\n functionName: \"deprecated\",\n })) as boolean;\n }\n\n async isLockerEnabled(\n locker: Address,\n hook: Address\n ): Promise<boolean> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.FACTORY,\n abi: LiquidFactoryAbi,\n functionName: \"enabledLockers\",\n args: [locker, hook],\n })) as boolean;\n }\n\n // ── Sniper Auction ─────────────────────────────────────────────────\n\n async getAuctionState(poolId: Hex): Promise<SniperAuctionState> {\n const [nextAuctionBlock, round, gasPeg, currentFee] = await Promise.all([\n this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"nextAuctionBlock\",\n args: [poolId],\n }),\n this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"round\",\n args: [poolId],\n }),\n this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"gasPeg\",\n args: [poolId],\n }),\n this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"getFee\",\n args: [poolId],\n }),\n ]);\n\n return {\n nextAuctionBlock: nextAuctionBlock as bigint,\n round: round as bigint,\n gasPeg: gasPeg as bigint,\n currentFee: currentFee as number,\n };\n }\n\n async getAuctionFeeConfig(poolId: Hex): Promise<SniperAuctionFeeConfig> {\n const result = await this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"feeConfig\",\n args: [poolId],\n });\n\n const data = result as any;\n return {\n startingFee: Array.isArray(data) ? data[0] : data.startingFee,\n endingFee: Array.isArray(data) ? data[1] : data.endingFee,\n secondsToDecay: Array.isArray(data) ? data[2] : data.secondsToDecay,\n };\n }\n\n async getAuctionDecayStartTime(poolId: Hex): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"poolDecayStartTime\",\n args: [poolId],\n })) as bigint;\n }\n\n async getAuctionMaxRounds(): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.SNIPER_AUCTION_V2,\n abi: LiquidSniperAuctionV2Abi,\n functionName: \"maxRounds\",\n })) as bigint;\n }\n\n async getAuctionGasPriceForBid(\n auctionGasPeg: bigint,\n desiredBidAmount: bigint\n ): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.SNIPER_UTIL_V2,\n abi: LiquidSniperUtilV2Abi,\n functionName: \"getTxGasPriceForBidAmount\",\n args: [auctionGasPeg, desiredBidAmount],\n })) as bigint;\n }\n\n // ── Airdrop ─────────────────────────────────────────────────────────\n\n async getAirdropInfo(tokenAddress: Address): Promise<AirdropInfo> {\n const result = await this.publicClient.readContract({\n address: ADDRESSES.AIRDROP_V2,\n abi: LiquidAirdropV2Abi,\n functionName: \"airdrops\",\n args: [tokenAddress],\n });\n\n const data = result as any;\n return {\n admin: Array.isArray(data) ? data[0] : data.admin,\n merkleRoot: Array.isArray(data) ? data[1] : data.merkleRoot,\n totalSupply: Array.isArray(data) ? data[2] : data.totalSupply,\n totalClaimed: Array.isArray(data) ? data[3] : data.totalClaimed,\n lockupEndTime: Array.isArray(data) ? data[4] : data.lockupEndTime,\n vestingEndTime: Array.isArray(data) ? data[5] : data.vestingEndTime,\n adminClaimTime: Array.isArray(data) ? data[6] : data.adminClaimTime,\n adminClaimed: Array.isArray(data) ? data[7] : data.adminClaimed,\n };\n }\n\n async getAirdropClaimable(\n tokenAddress: Address,\n recipient: Address,\n allocatedAmount: bigint\n ): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.AIRDROP_V2,\n abi: LiquidAirdropV2Abi,\n functionName: \"amountAvailableToClaim\",\n args: [tokenAddress, recipient, allocatedAmount],\n })) as bigint;\n }\n\n async claimAirdrop(\n tokenAddress: Address,\n recipient: Address,\n allocatedAmount: bigint,\n proof: Hex[]\n ): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for claimAirdrop\");\n }\n\n return await this.walletClient.writeContract({\n address: ADDRESSES.AIRDROP_V2,\n abi: LiquidAirdropV2Abi,\n functionName: \"claim\",\n args: [tokenAddress, recipient, allocatedAmount, proof],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n // ── LP Locker ───────────────────────────────────────────────────────\n\n async getTokenRewards(\n tokenAddress: Address,\n lockerAddress?: Address\n ): Promise<TokenRewardInfo> {\n const locker = lockerAddress ?? DEFAULTS.LOCKER;\n const result = await this.publicClient.readContract({\n address: locker,\n abi: LiquidLpLockerAbi,\n functionName: \"tokenRewards\",\n args: [tokenAddress],\n });\n\n const data = result as any;\n return {\n token: data.token,\n poolKey: data.poolKey,\n positionId: data.positionId,\n numPositions: data.numPositions,\n rewardBps: [...data.rewardBps],\n rewardAdmins: [...data.rewardAdmins],\n rewardRecipients: [...data.rewardRecipients],\n };\n }\n\n async collectRewards(\n tokenAddress: Address,\n lockerAddress?: Address\n ): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for collectRewards\");\n }\n\n const locker = lockerAddress ?? DEFAULTS.LOCKER;\n return await this.walletClient.writeContract({\n address: locker,\n abi: LiquidLpLockerAbi,\n functionName: \"collectRewards\",\n args: [tokenAddress],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n async collectRewardsWithoutUnlock(\n tokenAddress: Address,\n lockerAddress?: Address\n ): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\n \"walletClient with account required for collectRewardsWithoutUnlock\"\n );\n }\n\n const locker = lockerAddress ?? DEFAULTS.LOCKER;\n return await this.walletClient.writeContract({\n address: locker,\n abi: LiquidLpLockerAbi,\n functionName: \"collectRewardsWithoutUnlock\",\n args: [tokenAddress],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n async updateRewardRecipient(\n tokenAddress: Address,\n rewardIndex: bigint,\n newRecipient: Address,\n lockerAddress?: Address\n ): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\n \"walletClient with account required for updateRewardRecipient\"\n );\n }\n\n const locker = lockerAddress ?? DEFAULTS.LOCKER;\n return await this.walletClient.writeContract({\n address: locker,\n abi: LiquidLpLockerAbi,\n functionName: \"updateRewardRecipient\",\n args: [tokenAddress, rewardIndex, newRecipient],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n // ── Pool Extension Allowlist ────────────────────────────────────────\n\n async isExtensionEnabled(extensionAddress: Address): Promise<boolean> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.POOL_EXTENSION_ALLOWLIST,\n abi: LiquidPoolExtensionAllowlistAbi,\n functionName: \"enabledExtensions\",\n args: [extensionAddress],\n })) as boolean;\n }\n\n // ── MEV Block Delay ─────────────────────────────────────────────────\n\n async getMevBlockDelay(): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.MEV_BLOCK_DELAY,\n abi: LiquidMevBlockDelayAbi,\n functionName: \"blockDelay\",\n })) as bigint;\n }\n\n async getPoolUnlockTime(poolId: Hex): Promise<bigint> {\n return (await this.publicClient.readContract({\n address: ADDRESSES.MEV_BLOCK_DELAY,\n abi: LiquidMevBlockDelayAbi,\n functionName: \"poolUnlockTime\",\n args: [poolId],\n })) as bigint;\n }\n\n // ── Token Metadata Updates ──────────────────────────────────────────\n\n /**\n * Update a token's image. Must be called by the token admin.\n */\n async updateImage(tokenAddress: Address, newImage: string): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for updateImage\");\n }\n\n return await this.walletClient.writeContract({\n address: tokenAddress,\n abi: LiquidTokenAbi,\n functionName: \"updateImage\",\n args: [newImage],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n /**\n * Update a token's metadata. Must be called by the token admin.\n */\n async updateMetadata(\n tokenAddress: Address,\n newMetadata: string\n ): Promise<Hash> {\n if (!this.walletClient?.account) {\n throw new Error(\"walletClient with account required for updateMetadata\");\n }\n\n return await this.walletClient.writeContract({\n address: tokenAddress,\n abi: LiquidTokenAbi,\n functionName: \"updateMetadata\",\n args: [newMetadata],\n chain: base,\n account: this.walletClient.account,\n });\n }\n\n // ── Token Discovery ─────────────────────────────────────────────────\n\n /**\n * Get all tokens deployed by a specific address by querying TokenCreated events.\n * @param deployer - The address that deployed the tokens (msgSender)\n * @param fromBlock - Starting block to search from (defaults to 0n)\n * @param toBlock - Ending block to search to (defaults to 'latest')\n */\n async getDeployedTokens(\n deployer: Address,\n fromBlock?: bigint,\n toBlock?: bigint | \"latest\"\n ): Promise<TokenCreatedEvent[]> {\n return this.getTokens({ deployer, fromBlock, toBlock });\n }\n\n /**\n * Query TokenCreated events with optional filtering.\n *\n * Use this for token discovery, indexing, or building token lists.\n * Returns events in chronological order with block numbers for pagination.\n *\n * @example\n * // Get all tokens\n * const allTokens = await sdk.getTokens();\n *\n * // Get tokens by deployer\n * const myTokens = await sdk.getTokens({ deployer: myAddress });\n *\n * // Paginate with block ranges\n * const page1 = await sdk.getTokens({ fromBlock: 20000000n, toBlock: 20100000n });\n * const page2 = await sdk.getTokens({ fromBlock: 20100001n, toBlock: 20200000n });\n */\n async getTokens(options?: GetTokensOptions): Promise<TokenCreatedEvent[]> {\n const logs = await this.publicClient.getLogs({\n address: ADDRESSES.FACTORY,\n event: parseAbiItem(\n \"event TokenCreated(address msgSender, address indexed tokenAddress, address indexed tokenAdmin, string tokenImage, string tokenName, string tokenSymbol, string tokenMetadata, string tokenContext, int24 startingTick, address poolHook, bytes32 poolId, address pairedToken, address locker, address mevModule, uint256 extensionsSupply, address[] extensions)\"\n ),\n fromBlock: options?.fromBlock ?? 0n,\n toBlock: options?.toBlock ?? \"latest\",\n });\n\n const deployer = options?.deployer;\n\n return logs\n .filter((log) => {\n if (!deployer) return true;\n // msgSender is not indexed, so we filter client-side\n const sender = (log.args as any).msgSender;\n return sender && getAddress(sender) === getAddress(deployer);\n })\n .map((log) => {\n const args = log.args as any;\n return {\n msgSender: args.msgSender,\n tokenAddress: args.tokenAddress,\n tokenAdmin: args.tokenAdmin,\n tokenImage: args.tokenImage,\n tokenName: args.tokenName,\n tokenSymbol: args.tokenSymbol,\n tokenMetadata: args.tokenMetadata,\n tokenContext: args.tokenContext,\n startingTick: args.startingTick,\n poolHook: args.poolHook,\n poolId: args.poolId,\n pairedToken: args.pairedToken,\n locker: args.locker,\n mevModule: args.mevModule,\n extensionsSupply: args.extensionsSupply,\n extensions: args.extensions,\n blockNumber: log.blockNumber,\n };\n });\n }\n\n /**\n * Look up a single token's on-chain event data by contract address.\n *\n * Returns the full TokenCreated event including metadata, context, poolId,\n * hook, locker, extensions — everything a wallet or aggregator needs to\n * display the token. Returns `null` if not found.\n *\n * This is indexed on-chain (tokenAddress is indexed in the event), so it's\n * a single RPC call regardless of how many tokens exist.\n */\n async getTokenEvent(tokenAddress: Address): Promise<TokenCreatedEvent | null> {\n const logs = await this.publicClient.getLogs({\n address: ADDRESSES.FACTORY,\n event: parseAbiItem(\n \"event TokenCreated(address msgSender, address indexed tokenAddress, address indexed tokenAdmin, string tokenImage, string tokenName, string tokenSymbol, string tokenMetadata, string tokenContext, int24 startingTick, address poolHook, bytes32 poolId, address pairedToken, address locker, address mevModule, uint256 extensionsSupply, address[] extensions)\"\n ),\n args: { tokenAddress },\n fromBlock: 0n,\n toBlock: \"latest\",\n });\n\n if (logs.length === 0) return null;\n\n const log = logs[0];\n const args = log.args as any;\n return {\n msgSender: args.msgSender,\n tokenAddress: args.tokenAddress,\n tokenAdmin: args.tokenAdmin,\n tokenImage: args.tokenImage,\n tokenName: args.tokenName,\n tokenSymbol: args.tokenSymbol,\n tokenMetadata: args.tokenMetadata,\n tokenContext: args.tokenContext,\n startingTick: args.startingTick,\n poolHook: args.poolHook,\n poolId: args.poolId,\n pairedToken: args.pairedToken,\n locker: args.locker,\n mevModule: args.mevModule,\n extensionsSupply: args.extensionsSupply,\n extensions: args.extensions,\n blockNumber: log.blockNumber,\n };\n }\n}\n","import { type Address } from \"viem\";\nimport { base } from \"viem/chains\";\n\n// ── Production addresses (Base mainnet) ──────────────────────────────\n\nexport const ADDRESSES = {\n FACTORY: \"0x0000003482fe299E72d4908368044A8A173BE576\" as Address,\n POOL_EXTENSION_ALLOWLIST:\n \"0x000003Afb1b070F037D2871eE0A6b8c8f53F7B77\" as Address,\n FEE_LOCKER: \"0x000008B9242b7e4432f6c4b1EeAD93562f9Cc94d\" as Address,\n LP_LOCKER: \"0x00000548732DfA56Be1257cE44D0CFc3B46dDb2A\" as Address,\n LP_LOCKER_FEE_CONVERSION:\n \"0x00000547518784420CEeF761fb18D884bb908102\" as Address,\n VAULT: \"0x000001c5263F4d64CdC343cDA9C8bF961CF8376c\" as Address,\n HOOK_DYNAMIC_FEE_V2:\n \"0x2A2F73CDDa098d639bd8Bbcd7dF2bf24E06728cC\" as Address,\n HOOK_STATIC_FEE_V2:\n \"0xb2401c5369AaCF62F8d615623C7F68F84da428Cc\" as Address,\n SNIPER_AUCTION_V2:\n \"0x000007b64003ee07a69576F98859a0a36b854260\" as Address,\n SNIPER_UTIL_V2: \"0x000003Ee0cb9B0C82C6C7FCB7b81a9883F285270\" as Address,\n MEV_BLOCK_DELAY: \"0x0000035D83588954F3c581c3A66251b3F06AD5e4\" as Address,\n AIRDROP_V2: \"0x00000C222442512b08446D33dd9754a7F260BE79\" as Address,\n UNIV4_ETH_DEV_BUY:\n \"0x00000d7DE1f0A3FA7957F5d8A2b97B0E24e5783D\" as Address,\n LIQUID_DEPLOYER_LIB:\n \"0x00000f88b2d37A2006F2F0C8552d22E0b8945202\" as Address,\n} as const;\n\n// ── External protocol addresses (Base mainnet) ──────────────────────\n\nexport const EXTERNAL = {\n POOL_MANAGER: \"0x498581fF718922c3f8e6A244956aF099B2652b2b\" as Address,\n WETH: \"0x4200000000000000000000000000000000000006\" as Address,\n UNIVERSAL_ROUTER:\n \"0x6fF5693b99212Da76ad316178A184AB56D299b43\" as Address,\n PERMIT2: \"0x000000000022D473030F116dDEE9F6B43aC78BA3\" as Address,\n} as const;\n\n// ── Fee constants ────────────────────────────────────────────────────\n\nexport const FEE = {\n /** Fee denominator used by Uniswap v4 (1,000,000 = 100%) */\n DENOMINATOR: 1_000_000,\n /** Protocol fee numerator: 200,000 / 1,000,000 = 20% of LP fees */\n PROTOCOL_FEE_NUMERATOR: 200_000,\n /** Max LP fee: 10% (100,000 / 1,000,000) */\n MAX_LP_FEE: 100_000,\n /** Max MEV fee: 80% (800,000 / 1,000,000) */\n MAX_MEV_FEE: 800_000,\n /** BPS denominator for token supply splits */\n BPS: 10_000,\n} as const;\n\n// ── Token constants ──────────────────────────────────────────────────\n\nexport const TOKEN = {\n /** Total supply for every token: 100 billion with 18 decimals */\n SUPPLY: 100_000_000_000n * 10n ** 18n,\n DECIMALS: 18,\n MAX_EXTENSIONS: 10,\n MAX_EXTENSION_BPS: 9000,\n} as const;\n\n// ── Pool position presets ────────────────────────────────────────────\n\nexport interface PoolPosition {\n tickLower: number;\n tickUpper: number;\n positionBps: number;\n}\n\n/**\n * Pre-built position configurations.\n *\n * - **Standard**: Single position covering full range (~$20K → $1.5B).\n * Default starting tick -230400 (≈10 ETH market cap).\n *\n * - **Liquid**: 3-tranche default for Liquid Protocol.\n * Hardcoded for ≈10 ETH start at ~$2070/ETH.\n * For dynamic market cap targets, use `createPositionsUSD()` instead.\n *\n * Note: positionBps must sum to 10,000 (100%).\n */\nexport const POOL_POSITIONS = {\n /** Single position, 100% of liquidity in one range */\n Standard: [\n {\n tickLower: -230400, // ~10 ETH / ~$20K\n tickUpper: -120000, // ~$1.5B\n positionBps: 10_000,\n },\n ] as PoolPosition[],\n\n /** 3-tranche Liquid default (hardcoded for ~10 ETH start, ~$2070/ETH) */\n Liquid: [\n {\n tickLower: -230400, // ~$20K starting\n tickUpper: -198600, // ~$500K\n positionBps: 4_000, // 40%\n },\n {\n tickLower: -198600, // ~$500K\n tickUpper: -168600, // ~$10M\n positionBps: 5_000, // 50%\n },\n {\n tickLower: -168600, // ~$10M\n tickUpper: -122600, // ~$1B\n positionBps: 1_000, // 10%\n },\n ] as PoolPosition[],\n} as const;\n\n// ── Default deploy configuration ────────────────────────────────────\n\n/**\n * Liquid protocol defaults.\n *\n * - Hook: Static fee V2, 1% on buys only (fees in ETH), 0% on sells\n * - MEV: Sniper Auction V2 — 80% → 40% decaying over 32 seconds\n * - Tick spacing: 200\n * - Starting tick: -230400 (≈10 ETH market cap)\n * - Positions: 3-tranche Liquid default (40/50/10)\n */\nexport const DEFAULTS = {\n HOOK: ADDRESSES.HOOK_STATIC_FEE_V2,\n /** LP Locker with fee conversion (converts fees to ETH before distributing) */\n LOCKER: ADDRESSES.LP_LOCKER_FEE_CONVERSION,\n TICK_SPACING: 200,\n TICK_IF_TOKEN0_IS_LIQUID: -230400,\n /** Static fee on buys (ETH → token): 1% (100 bps). Fees collected in ETH. */\n PAIRED_FEE_BPS: 100,\n /** Static fee on sells (token → ETH): 0%. No fees in liquid token. */\n LIQUID_FEE_BPS: 0,\n /** MEV module: Sniper Auction V2 */\n MEV_MODULE: ADDRESSES.SNIPER_AUCTION_V2,\n /** Sniper auction starting fee: 80% (800,000 uniBps) */\n SNIPER_STARTING_FEE: 800_000,\n /** Sniper auction ending fee: 40% (400,000 uniBps) */\n SNIPER_ENDING_FEE: 400_000,\n /** Sniper auction decay period: 32 seconds */\n SNIPER_SECONDS_TO_DECAY: 32,\n} as const;\n\n// ── Chain ────────────────────────────────────────────────────────────\n\nexport const DEFAULT_CHAIN = base;\nexport const DEFAULT_CHAIN_ID = 8453;\nexport const DEFAULT_RPC_URL = \"https://base.drpc.org\";\n","/**\n * ABI encoding helpers for pool data, fee configs, and MEV module data.\n */\n\nimport { type Hex, encodeAbiParameters, zeroAddress, type Address } from \"viem\";\n\n// ── Pool Initialization Data (V2 hooks two-layer encoding) ──────────\n\n/**\n * ABI for the outer PoolInitializationData struct used by V2 hooks.\n * Wraps fee data with optional pool extension info.\n */\nconst PoolInitializationDataAbi = [\n {\n type: \"tuple\",\n components: [\n { name: \"extension\", type: \"address\" },\n { name: \"extensionData\", type: \"bytes\" },\n { name: \"feeData\", type: \"bytes\" },\n ],\n },\n] as const;\n\n/**\n * ABI for static fee init data: [uint24 liquidFee, uint24 pairedFee]\n * Values are in uniBps (bps * 100, where 1_000_000 = 100%).\n */\nconst StaticFeeInitAbi = [\n { type: \"uint24\" },\n { type: \"uint24\" },\n] as const;\n\n/**\n * ABI for the sniper auction init data struct.\n */\nconst SniperAuctionInitAbi = [\n {\n type: \"tuple\",\n components: [\n { name: \"startingFee\", type: \"uint24\" },\n { name: \"endingFee\", type: \"uint24\" },\n { name: \"secondsToDecay\", type: \"uint256\" },\n ],\n },\n] as const;\n\n// ── Static Fee Encoding ─────────────────────────────────────────────\n\n/**\n * Encode pool data for the static fee V2 hook.\n *\n * Uses two-layer encoding:\n * 1. Inner: static fee params [liquidFee, pairedFee] in uniBps\n * 2. Outer: PoolInitializationData wrapper\n *\n * @param liquidFeeBps - Fee when swapping for the liquid token (in bps, e.g. 100 = 1%)\n * @param pairedFeeBps - Fee when swapping for the paired token (in bps, e.g. 100 = 1%)\n * @param extension - Optional pool extension address (defaults to zero)\n * @param extensionData - Optional pool extension init data (defaults to \"0x\")\n * @returns Encoded poolData hex string\n *\n * @example\n * ```ts\n * // 1% fee both directions (default)\n * const poolData = encodeStaticFeePoolData(100, 100);\n * ```\n */\nexport function encodeStaticFeePoolData(\n liquidFeeBps: number,\n pairedFeeBps: number,\n extension: `0x${string}` = zeroAddress,\n extensionData: Hex = \"0x\",\n): Hex {\n // Convert bps → uniBps (multiply by 100)\n const feeData = encodeAbiParameters(StaticFeeInitAbi, [\n liquidFeeBps * 100,\n pairedFeeBps * 100,\n ]);\n\n return encodeAbiParameters(PoolInitializationDataAbi, [\n {\n extension,\n extensionData,\n feeData,\n },\n ]);\n}\n\n// ── Dynamic Fee Encoding ────────────────────────────────────────────\n\n/**\n * ABI for dynamic fee init data.\n */\nconst DynamicFeeInitAbi = [\n { type: \"uint24\" }, // baseFee (uniBps)\n { type: \"uint24\" }, // maxFee (uniBps)\n { type: \"uint256\" }, // referenceTickFilterPeriod\n { type: \"uint256\" }, // resetPeriod\n { type: \"int24\" }, // resetTickFilter\n { type: \"uint256\" }, // feeControlNumerator\n { type: \"uint24\" }, // decayFilterBps\n] as const;\n\nexport interface DynamicFeeConfig {\n /** Base LP fee in bps (e.g. 100 = 1%) */\n baseFeeBps: number;\n /** Max LP fee in bps (e.g. 500 = 5%) */\n maxFeeBps: number;\n /** Reference tick filter period in seconds */\n referenceTickFilterPeriod: number;\n /** Reset period in seconds */\n resetPeriod: number;\n /** Reset tick filter (tick units) */\n resetTickFilter: number;\n /** Fee control numerator (scaling constant) */\n feeControlNumerator: bigint;\n /** Decay filter in bps */\n decayFilterBps: number;\n}\n\n/**\n * Encode pool data for the dynamic fee V2 hook.\n *\n * @param config - Dynamic fee configuration\n * @param extension - Optional pool extension address\n * @param extensionData - Optional pool extension init data\n * @returns Encoded poolData hex string\n */\nexport function encodeDynamicFeePoolData(\n config: DynamicFeeConfig,\n extension: `0x${string}` = zeroAddress,\n extensionData: Hex = \"0x\",\n): Hex {\n const feeData = encodeAbiParameters(DynamicFeeInitAbi, [\n config.baseFeeBps * 100,\n config.maxFeeBps * 100,\n BigInt(config.referenceTickFilterPeriod),\n BigInt(config.resetPeriod),\n config.resetTickFilter,\n config.feeControlNumerator,\n config.decayFilterBps,\n ]);\n\n return encodeAbiParameters(PoolInitializationDataAbi, [\n {\n extension,\n extensionData,\n feeData,\n },\n ]);\n}\n\n// ── Sniper Auction MEV Encoding ─────────────────────────────────────\n\nexport interface SniperAuctionConfig {\n /** Starting fee in uniBps (e.g. 800_000 = 80%) */\n startingFee: number;\n /** Ending fee in uniBps (e.g. 400_000 = 40%) */\n endingFee: number;\n /** Seconds for fee to decay from starting to ending */\n secondsToDecay: number;\n}\n\n/**\n * Encode MEV module data for the Sniper Auction V2.\n *\n * @param config - Sniper auction fee configuration\n * @returns Encoded mevModuleData hex string\n *\n * @example\n * ```ts\n * // 80% → 40% over 32 seconds (default)\n * const mevData = encodeSniperAuctionData({\n * startingFee: 800_000,\n * endingFee: 400_000,\n * secondsToDecay: 32,\n * });\n * ```\n */\nexport function encodeSniperAuctionData(config: SniperAuctionConfig): Hex {\n if (config.startingFee <= config.endingFee) {\n throw new Error(\"startingFee must be greater than endingFee\");\n }\n if (config.secondsToDecay <= 0) {\n throw new Error(\"secondsToDecay must be positive\");\n }\n\n return encodeAbiParameters(SniperAuctionInitAbi, [\n {\n startingFee: config.startingFee,\n endingFee: config.endingFee,\n secondsToDecay: BigInt(config.secondsToDecay),\n },\n ]);\n}\n\n// ── Fee Conversion Locker Data Encoding ─────────────────────────────\n\n/**\n * Fee preference for LP_LOCKER_FEE_CONVERSION.\n * Determines which token each reward recipient receives their fees in.\n *\n * - `Both` (0): No conversion, fees paid in whichever token accrues\n * - `Paired` (1): Convert fees to paired token (usually WETH)\n * - `Liquid` (2): Convert fees to the liquid token\n */\nexport enum FeePreference {\n Both = 0,\n Paired = 1,\n Liquid = 2,\n}\n\n/**\n * Encode lockerData for LP_LOCKER_FEE_CONVERSION.\n *\n * The fee conversion locker requires a `FeeIn[]` array with one entry per\n * reward recipient, specifying how each recipient wants their fees.\n *\n * @param feePreferences - Array of FeePreference values, one per reward recipient\n * @returns Encoded lockerData hex string\n *\n * @example\n * ```ts\n * // Single recipient, fees converted to ETH\n * const lockerData = encodeFeeConversionLockerData([FeePreference.Paired]);\n *\n * // Two recipients: first gets ETH, second gets the token\n * const lockerData = encodeFeeConversionLockerData([FeePreference.Paired, FeePreference.Liquid]);\n * ```\n */\nexport function encodeFeeConversionLockerData(\n feePreferences: FeePreference[],\n): Hex {\n // Encode as LpFeeConversionInfo struct: { FeeIn[] feePreference }\n return encodeAbiParameters(\n [\n {\n type: \"tuple\",\n components: [\n { name: \"feePreference\", type: \"uint8[]\" },\n ],\n },\n ],\n [{ feePreference: feePreferences }],\n );\n}\n","// ── Context & Metadata schemas ──────────────────────────────────────\n//\n// Structured JSON for the on-chain `context` and `metadata` fields.\n// Wallets (Rainbow, Coinbase) and aggregators (Matcha, 0x) read these\n// to show attribution and token info.\n//\n// No Zod — plain TS types + lightweight runtime validation.\n\n// ── Types ───────────────────────────────────────────────────────────\n\n/** Provenance — who launched the token and from where. */\nexport interface LiquidContext {\n /** System that deployed the token (e.g. \"SDK\", \"Rainbow Wallet\", \"Liquid CLI\") */\n interface: string;\n /** Social platform origin (e.g. \"Farcaster\", \"Twitter\") */\n platform?: string;\n /** Social post/message ID that triggered the deploy */\n messageId?: string;\n /** User ID on the originating platform */\n id?: string;\n}\n\n/** Social media link for token metadata. */\nexport interface SocialMediaUrl {\n platform: string;\n url: string;\n}\n\n/** Token info for aggregators and explorers. */\nexport interface LiquidMetadata {\n /** Token/project description */\n description?: string;\n /** Social media links */\n socialMediaUrls?: SocialMediaUrl[];\n /** Audit report URLs */\n auditUrls?: string[];\n}\n\n// ── Builders ────────────────────────────────────────────────────────\n\n/**\n * Build a JSON string for the on-chain `context` field.\n *\n * @example\n * buildContext({ interface: \"My App\", platform: \"Farcaster\" })\n * // '{\"interface\":\"My App\",\"platform\":\"Farcaster\"}'\n */\nexport function buildContext(input?: Partial<LiquidContext>): string {\n const ctx: LiquidContext = {\n interface: input?.interface ?? \"SDK\",\n };\n if (input?.platform !== undefined) ctx.platform = input.platform;\n if (input?.messageId !== undefined) ctx.messageId = input.messageId;\n if (input?.id !== undefined) ctx.id = input.id;\n return JSON.stringify(ctx);\n}\n\n/**\n * Build a JSON string for the on-chain `metadata` field.\n *\n * @example\n * buildMetadata({ description: \"A cool token\" })\n * // '{\"description\":\"A cool token\"}'\n */\nexport function buildMetadata(input?: Partial<LiquidMetadata>): string {\n if (!input) return \"{}\";\n\n const meta: Record<string, unknown> = {};\n if (input.description !== undefined) meta.description = input.description;\n if (input.socialMediaUrls !== undefined && input.socialMediaUrls.length > 0) {\n meta.socialMediaUrls = input.socialMediaUrls;\n }\n if (input.auditUrls !== undefined && input.auditUrls.length > 0) {\n meta.auditUrls = input.auditUrls;\n }\n return JSON.stringify(meta);\n}\n\n// ── Parsers ─────────────────────────────────────────────────────────\n\n/**\n * Parse a context JSON string back into a typed object.\n * Returns `null` if the string is empty or not valid JSON.\n */\nexport function parseContext(contextString: string): LiquidContext | null {\n if (!contextString || contextString === \"\") return null;\n try {\n const parsed = JSON.parse(contextString);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n return {\n interface: typeof parsed.interface === \"string\" ? parsed.interface : \"unknown\",\n ...(typeof parsed.platform === \"string\" && { platform: parsed.platform }),\n ...(typeof parsed.messageId === \"string\" && { messageId: parsed.messageId }),\n ...(typeof parsed.id === \"string\" && { id: parsed.id }),\n };\n } catch {\n return null;\n }\n}\n\n/**\n * Parse a metadata JSON string back into a typed object.\n * Returns `null` if the string is empty or not valid JSON.\n */\nexport function parseMetadata(metadataString: string): LiquidMetadata | null {\n if (!metadataString || metadataString === \"\") return null;\n try {\n const parsed = JSON.parse(metadataString);\n if (typeof parsed !== \"object\" || parsed === null) return null;\n const result: LiquidMetadata = {};\n if (typeof parsed.description === \"string\") {\n result.description = parsed.description;\n }\n if (Array.isArray(parsed.socialMediaUrls)) {\n result.socialMediaUrls = parsed.socialMediaUrls.filter(\n (item: unknown) =>\n typeof item === \"object\" &&\n item !== null &&\n typeof (item as SocialMediaUrl).platform === \"string\" &&\n typeof (item as SocialMediaUrl).url === \"string\"\n );\n }\n if (Array.isArray(parsed.auditUrls)) {\n result.auditUrls = parsed.auditUrls.filter(\n (item: unknown) => typeof item === \"string\"\n );\n }\n return result;\n } catch {\n return null;\n }\n}\n","export const LiquidFactoryAbi = [\n {\n type: \"function\",\n name: \"deployToken\",\n inputs: [\n {\n name: \"deploymentConfig\",\n type: \"tuple\",\n components: [\n {\n name: \"tokenConfig\",\n type: \"tuple\",\n components: [\n { name: \"tokenAdmin\", type: \"address\" },\n { name: \"name\", type: \"string\" },\n { name: \"symbol\", type: \"string\" },\n { name: \"salt\", type: \"bytes32\" },\n { name: \"image\", type: \"string\" },\n { name: \"metadata\", type: \"string\" },\n { name: \"context\", type: \"string\" },\n { name: \"originatingChainId\", type: \"uint256\" },\n ],\n },\n {\n name: \"poolConfig\",\n type: \"tuple\",\n components: [\n { name: \"hook\", type: \"address\" },\n { name: \"pairedToken\", type: \"address\" },\n { name: \"tickIfToken0IsLiquid\", type: \"int24\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"poolData\", type: \"bytes\" },\n ],\n },\n {\n name: \"lockerConfig\",\n type: \"tuple\",\n components: [\n { name: \"locker\", type: \"address\" },\n { name: \"rewardAdmins\", type: \"address[]\" },\n { name: \"rewardRecipients\", type: \"address[]\" },\n { name: \"rewardBps\", type: \"uint16[]\" },\n { name: \"tickLower\", type: \"int24[]\" },\n { name: \"tickUpper\", type: \"int24[]\" },\n { name: \"positionBps\", type: \"uint16[]\" },\n { name: \"lockerData\", type: \"bytes\" },\n ],\n },\n {\n name: \"mevModuleConfig\",\n type: \"tuple\",\n components: [\n { name: \"mevModule\", type: \"address\" },\n { name: \"mevModuleData\", type: \"bytes\" },\n ],\n },\n {\n name: \"extensionConfigs\",\n type: \"tuple[]\",\n components: [\n { name: \"extension\", type: \"address\" },\n { name: \"msgValue\", type: \"uint256\" },\n { name: \"extensionBps\", type: \"uint16\" },\n { name: \"extensionData\", type: \"bytes\" },\n ],\n },\n ],\n },\n ],\n outputs: [{ name: \"tokenAddress\", type: \"address\" }],\n stateMutability: \"payable\",\n },\n {\n type: \"function\",\n name: \"tokenDeploymentInfo\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"token\", type: \"address\" },\n { name: \"hook\", type: \"address\" },\n { name: \"locker\", type: \"address\" },\n { name: \"extensions\", type: \"address[]\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"deploymentInfoForToken\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [\n { name: \"token\", type: \"address\" },\n { name: \"hook\", type: \"address\" },\n { name: \"locker\", type: \"address\" },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"deprecated\",\n inputs: [],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"TOKEN_SUPPLY\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"BPS\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"teamFeeRecipient\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"enabledLockers\",\n inputs: [\n { name: \"locker\", type: \"address\" },\n { name: \"hook\", type: \"address\" },\n ],\n outputs: [{ name: \"enabled\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"event\",\n name: \"TokenCreated\",\n inputs: [\n { name: \"msgSender\", type: \"address\", indexed: false },\n { name: \"tokenAddress\", type: \"address\", indexed: true },\n { name: \"tokenAdmin\", type: \"address\", indexed: true },\n { name: \"tokenImage\", type: \"string\", indexed: false },\n { name: \"tokenName\", type: \"string\", indexed: false },\n { name: \"tokenSymbol\", type: \"string\", indexed: false },\n { name: \"tokenMetadata\", type: \"string\", indexed: false },\n { name: \"tokenContext\", type: \"string\", indexed: false },\n { name: \"startingTick\", type: \"int24\", indexed: false },\n { name: \"poolHook\", type: \"address\", indexed: false },\n { name: \"poolId\", type: \"bytes32\", indexed: false },\n { name: \"pairedToken\", type: \"address\", indexed: false },\n { name: \"locker\", type: \"address\", indexed: false },\n { name: \"mevModule\", type: \"address\", indexed: false },\n { name: \"extensionsSupply\", type: \"uint256\", indexed: false },\n { name: \"extensions\", type: \"address[]\", indexed: false },\n ],\n anonymous: false,\n },\n] as const;\n","export const LiquidFeeLockerAbi = [\n {\n type: \"function\",\n name: \"availableFees\",\n inputs: [\n { name: \"feeOwner\", type: \"address\" },\n { name: \"token\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"feesToClaim\",\n inputs: [\n { name: \"feeOwner\", type: \"address\" },\n { name: \"token\", type: \"address\" },\n ],\n outputs: [{ name: \"balance\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"claim\",\n inputs: [\n { name: \"feeOwner\", type: \"address\" },\n { name: \"token\", type: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n","export const LiquidHookDynamicFeeV2Abi = [\n {\n type: \"function\",\n name: \"liquidIsToken0\",\n inputs: [{ name: \"\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolConfigVars\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"baseFee\", type: \"uint24\" },\n { name: \"maxLpFee\", type: \"uint24\" },\n { name: \"referenceTickFilterPeriod\", type: \"uint256\" },\n { name: \"resetPeriod\", type: \"uint256\" },\n { name: \"resetTickFilter\", type: \"int24\" },\n { name: \"feeControlNumerator\", type: \"uint256\" },\n { name: \"decayFilterBps\", type: \"uint24\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolFeeVars\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"referenceTick\", type: \"int24\" },\n { name: \"resetTick\", type: \"int24\" },\n { name: \"resetTickTimestamp\", type: \"uint256\" },\n { name: \"lastSwapTimestamp\", type: \"uint256\" },\n { name: \"appliedVR\", type: \"uint24\" },\n { name: \"prevVA\", type: \"uint24\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolCreationTimestamp\",\n inputs: [{ name: \"\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"protocolFee\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"factory\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolManager\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"locker\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"mevModule\",\n inputs: [{ name: \"\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"mevModuleEnabled\",\n inputs: [{ name: \"\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidVaultAbi = [\n {\n type: \"function\",\n name: \"allocation\",\n inputs: [{ name: \"\", type: \"address\" }],\n outputs: [\n { name: \"token\", type: \"address\" },\n { name: \"amountTotal\", type: \"uint256\" },\n { name: \"amountClaimed\", type: \"uint256\" },\n { name: \"lockupEndTime\", type: \"uint256\" },\n { name: \"vestingEndTime\", type: \"uint256\" },\n { name: \"admin\", type: \"address\" },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"amountAvailableToClaim\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"claim\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n] as const;\n","export const LiquidSniperAuctionV2Abi = [\n {\n type: \"function\",\n name: \"nextAuctionBlock\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"nextAuctionBlock\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"round\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"round\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"gasPeg\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"gasPeg\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"feeConfig\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [\n { name: \"startingFee\", type: \"uint24\" },\n { name: \"endingFee\", type: \"uint24\" },\n { name: \"secondsToDecay\", type: \"uint256\" },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"getFee\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"uint24\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolDecayStartTime\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"poolDecayStartTime\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"maxRounds\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"blocksBetweenAuction\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"blocksBetweenDeploymentAndFirstAuction\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"paymentPerGasUnit\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidSniperUtilV2Abi = [\n {\n type: \"function\",\n name: \"bidInAuction\",\n inputs: [\n {\n name: \"swapParams\",\n type: \"tuple\",\n components: [\n {\n name: \"poolKey\",\n type: \"tuple\",\n components: [\n { name: \"currency0\", type: \"address\" },\n { name: \"currency1\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"hooks\", type: \"address\" },\n ],\n },\n { name: \"zeroForOne\", type: \"bool\" },\n { name: \"amountIn\", type: \"uint128\" },\n { name: \"amountOutMinimum\", type: \"uint128\" },\n { name: \"hookData\", type: \"bytes\" },\n ],\n },\n { name: \"round\", type: \"uint256\" },\n ],\n outputs: [],\n stateMutability: \"payable\",\n },\n {\n type: \"function\",\n name: \"getTxGasPriceForBidAmount\",\n inputs: [\n { name: \"auctionGasPeg\", type: \"uint256\" },\n { name: \"desiredBidAmount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"txGasPrice\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidAirdropV2Abi = [\n {\n type: \"function\",\n name: \"airdrops\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [\n { name: \"admin\", type: \"address\" },\n { name: \"merkleRoot\", type: \"bytes32\" },\n { name: \"totalSupply\", type: \"uint256\" },\n { name: \"totalClaimed\", type: \"uint256\" },\n { name: \"lockupEndTime\", type: \"uint256\" },\n { name: \"vestingEndTime\", type: \"uint256\" },\n { name: \"adminClaimTime\", type: \"uint256\" },\n { name: \"adminClaimed\", type: \"bool\" },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"amountAvailableToClaim\",\n inputs: [\n { name: \"token\", type: \"address\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"allocatedAmount\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"claim\",\n inputs: [\n { name: \"token\", type: \"address\" },\n { name: \"recipient\", type: \"address\" },\n { name: \"allocatedAmount\", type: \"uint256\" },\n { name: \"proof\", type: \"bytes32[]\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"CLAIM_EXPIRATION_INTERVAL\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"MIN_LOCKUP_DURATION\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidPoolExtensionAllowlistAbi = [\n {\n type: \"function\",\n name: \"enabledExtensions\",\n inputs: [{ name: \"extension\", type: \"address\" }],\n outputs: [{ name: \"enabled\", type: \"bool\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidMevBlockDelayAbi = [\n {\n type: \"function\",\n name: \"blockDelay\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"poolUnlockTime\",\n inputs: [{ name: \"poolId\", type: \"bytes32\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidLpLockerAbi = [\n {\n type: \"function\",\n name: \"tokenRewards\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [\n {\n name: \"\",\n type: \"tuple\",\n components: [\n { name: \"token\", type: \"address\" },\n {\n name: \"poolKey\",\n type: \"tuple\",\n components: [\n { name: \"currency0\", type: \"address\" },\n { name: \"currency1\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"hooks\", type: \"address\" },\n ],\n },\n { name: \"positionId\", type: \"uint256\" },\n { name: \"numPositions\", type: \"uint256\" },\n { name: \"rewardBps\", type: \"uint16[]\" },\n { name: \"rewardAdmins\", type: \"address[]\" },\n { name: \"rewardRecipients\", type: \"address[]\" },\n ],\n },\n ],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"collectRewards\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"collectRewardsWithoutUnlock\",\n inputs: [{ name: \"token\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"updateRewardAdmin\",\n inputs: [\n { name: \"token\", type: \"address\" },\n { name: \"rewardIndex\", type: \"uint256\" },\n { name: \"newAdmin\", type: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"updateRewardRecipient\",\n inputs: [\n { name: \"token\", type: \"address\" },\n { name: \"rewardIndex\", type: \"uint256\" },\n { name: \"newRecipient\", type: \"address\" },\n ],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"version\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n },\n] as const;\n","export const LiquidTokenAbi = [\n {\n type: \"function\",\n name: \"updateImage\",\n inputs: [{ name: \"image_\", type: \"string\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"updateMetadata\",\n inputs: [{ name: \"metadata_\", type: \"string\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"updateAdmin\",\n inputs: [{ name: \"admin_\", type: \"address\" }],\n outputs: [],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"event\",\n name: \"UpdateImage\",\n inputs: [{ name: \"image\", type: \"string\", indexed: false }],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"UpdateMetadata\",\n inputs: [{ name: \"metadata\", type: \"string\", indexed: false }],\n anonymous: false,\n },\n {\n type: \"event\",\n name: \"UpdateAdmin\",\n inputs: [\n { name: \"oldAdmin\", type: \"address\", indexed: false },\n { name: \"newAdmin\", type: \"address\", indexed: false },\n ],\n anonymous: false,\n },\n] as const;\n","export const ERC20Abi = [\n {\n type: \"function\",\n name: \"name\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"symbol\",\n inputs: [],\n outputs: [{ name: \"\", type: \"string\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"decimals\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint8\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"totalSupply\",\n inputs: [],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"balanceOf\",\n inputs: [{ name: \"account\", type: \"address\" }],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"allowance\",\n inputs: [\n { name: \"owner\", type: \"address\" },\n { name: \"spender\", type: \"address\" },\n ],\n outputs: [{ name: \"\", type: \"uint256\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"approve\",\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"transfer\",\n inputs: [\n { name: \"to\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n ],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"nonpayable\",\n },\n] as const;\n","export const LiquidUniv4EthDevBuyAbi = [\n {\n type: \"constructor\",\n inputs: [\n { name: \"factory_\", type: \"address\" },\n { name: \"weth_\", type: \"address\" },\n { name: \"universalRouter_\", type: \"address\" },\n { name: \"permit2_\", type: \"address\" },\n ],\n stateMutability: \"nonpayable\",\n },\n {\n type: \"function\",\n name: \"factory\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"weth\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"universalRouter\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"permit2\",\n inputs: [],\n outputs: [{ name: \"\", type: \"address\" }],\n stateMutability: \"view\",\n },\n {\n type: \"function\",\n name: \"receiveTokens\",\n inputs: [\n {\n name: \"deploymentConfig\",\n type: \"tuple\",\n components: [\n {\n name: \"tokenConfig\",\n type: \"tuple\",\n components: [\n { name: \"tokenAdmin\", type: \"address\" },\n { name: \"name\", type: \"string\" },\n { name: \"symbol\", type: \"string\" },\n { name: \"salt\", type: \"bytes32\" },\n { name: \"image\", type: \"string\" },\n { name: \"metadata\", type: \"string\" },\n { name: \"context\", type: \"string\" },\n { name: \"originatingChainId\", type: \"uint256\" },\n ],\n },\n {\n name: \"poolConfig\",\n type: \"tuple\",\n components: [\n { name: \"hook\", type: \"address\" },\n { name: \"pairedToken\", type: \"address\" },\n { name: \"tickIfToken0IsLiquid\", type: \"int24\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"poolData\", type: \"bytes\" },\n ],\n },\n {\n name: \"lockerConfig\",\n type: \"tuple\",\n components: [\n { name: \"locker\", type: \"address\" },\n { name: \"rewardAdmins\", type: \"address[]\" },\n { name: \"rewardRecipients\", type: \"address[]\" },\n { name: \"rewardBps\", type: \"uint16[]\" },\n { name: \"tickLower\", type: \"int24[]\" },\n { name: \"tickUpper\", type: \"int24[]\" },\n { name: \"positionBps\", type: \"uint16[]\" },\n { name: \"lockerData\", type: \"bytes\" },\n ],\n },\n {\n name: \"mevModuleConfig\",\n type: \"tuple\",\n components: [\n { name: \"mevModule\", type: \"address\" },\n { name: \"mevModuleData\", type: \"bytes\" },\n ],\n },\n {\n name: \"extensionConfigs\",\n type: \"tuple[]\",\n components: [\n { name: \"extension\", type: \"address\" },\n { name: \"msgValue\", type: \"uint256\" },\n { name: \"extensionBps\", type: \"uint16\" },\n { name: \"extensionData\", type: \"bytes\" },\n ],\n },\n ],\n },\n {\n name: \"tokenPoolKey\",\n type: \"tuple\",\n components: [\n { name: \"currency0\", type: \"address\" },\n { name: \"currency1\", type: \"address\" },\n { name: \"fee\", type: \"uint24\" },\n { name: \"tickSpacing\", type: \"int24\" },\n { name: \"hooks\", type: \"address\" },\n ],\n },\n { name: \"token\", type: \"address\" },\n { name: \"extensionSupply\", type: \"uint256\" },\n { name: \"extensionIndex\", type: \"uint256\" },\n ],\n outputs: [],\n stateMutability: \"payable\",\n },\n {\n type: \"function\",\n name: \"supportsInterface\",\n inputs: [{ name: \"interfaceId\", type: \"bytes4\" }],\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"pure\",\n },\n {\n type: \"event\",\n name: \"EthDevBuy\",\n inputs: [\n { name: \"token\", type: \"address\", indexed: true },\n { name: \"user\", type: \"address\", indexed: true },\n { name: \"ethAmount\", type: \"uint256\", indexed: false },\n { name: \"tokenAmount\", type: \"uint256\", indexed: false },\n ],\n anonymous: false,\n },\n { type: \"error\", name: \"InvalidEthDevBuyPercentage\", inputs: [] },\n { type: \"error\", name: \"InvalidMsgValue\", inputs: [] },\n { type: \"error\", name: \"InvalidPairedTokenPoolKey\", inputs: [] },\n { type: \"error\", name: \"ReentrancyGuardReentrantCall\", inputs: [] },\n { type: \"error\", name: \"Unauthorized\", inputs: [] },\n] as const;\n","/**\n * Tick ↔ market cap conversion utilities for Uniswap V4 concentrated liquidity.\n *\n * All tokens have 100B supply (10^11) with 18 decimals.\n * Price per token = marketCap / totalSupply.\n * Tick = log(price) / log(1.0001), aligned to tickSpacing.\n */\n\nconst LOG_BASE = Math.log(1.0001);\nconst DEFAULT_TICK_SPACING = 200;\n\n/**\n * Total human-readable supply for every Liquid token: 100 billion.\n * Used to derive price-per-token from market cap.\n */\nconst TOTAL_SUPPLY = 1e11; // 100,000,000,000\n\n/**\n * Convert an ETH-denominated market cap to a Uniswap V4 tick.\n *\n * @param marketCapETH - Market cap in ETH (e.g. 10 for a 10 ETH starting cap)\n * @param tickSpacing - Tick spacing to align to (default 200)\n * @returns Tick value (int24) aligned to tickSpacing\n *\n * @example\n * ```ts\n * getTickFromMarketCapETH(10) // → -230400 (≈10 ETH market cap)\n * getTickFromMarketCapETH(200) // → -200200 (≈200 ETH)\n * ```\n */\nexport function getTickFromMarketCapETH(\n marketCapETH: number,\n tickSpacing: number = DEFAULT_TICK_SPACING,\n): number {\n if (marketCapETH <= 0) throw new Error(\"marketCapETH must be positive\");\n const price = marketCapETH / TOTAL_SUPPLY; // WETH per token\n const rawTick = Math.log(price) / LOG_BASE;\n return Math.floor(rawTick / tickSpacing) * tickSpacing;\n}\n\n/**\n * Convert a USD-denominated market cap to a Uniswap V4 tick.\n *\n * @param marketCapUSD - Market cap in USD (e.g. 500_000 for $500K)\n * @param ethPriceUSD - Current ETH price in USD (e.g. 2070)\n * @param tickSpacing - Tick spacing to align to (default 200)\n * @returns Tick value (int24) aligned to tickSpacing\n *\n * @example\n * ```ts\n * getTickFromMarketCapUSD(500_000, 2070) // tick for $500K market cap\n * getTickFromMarketCapUSD(10_000_000, 2070) // tick for $10M market cap\n * ```\n */\nexport function getTickFromMarketCapUSD(\n marketCapUSD: number,\n ethPriceUSD: number,\n tickSpacing: number = DEFAULT_TICK_SPACING,\n): number {\n if (ethPriceUSD <= 0) throw new Error(\"ethPriceUSD must be positive\");\n return getTickFromMarketCapETH(marketCapUSD / ethPriceUSD, tickSpacing);\n}\n\n/**\n * Convert a tick back to an ETH-denominated market cap.\n *\n * @param tick - Uniswap V4 tick value\n * @returns Market cap in ETH\n *\n * @example\n * ```ts\n * marketCapFromTickETH(-230400) // ≈ 10 ETH\n * ```\n */\nexport function marketCapFromTickETH(tick: number): number {\n const price = Math.pow(1.0001, tick);\n return price * TOTAL_SUPPLY;\n}\n\n/**\n * Convert a tick to a USD-denominated market cap.\n *\n * @param tick - Uniswap V4 tick value\n * @param ethPriceUSD - Current ETH price in USD\n * @returns Market cap in USD\n */\nexport function marketCapFromTickUSD(tick: number, ethPriceUSD: number): number {\n return marketCapFromTickETH(tick) * ethPriceUSD;\n}\n\n/**\n * Convert a market cap in a stablecoin to a tick.\n * Supports any stablecoin decimal count (6 for USDC, 18 for DAI, etc.)\n *\n * @param marketCap - Market cap in stablecoin units\n * @param stableDecimals - Decimals of the stablecoin (e.g. 6 for USDC)\n * @param tickSpacing - Tick spacing (default 200)\n * @returns Tick value aligned to tickSpacing\n */\nexport function getTickFromMarketCapStable(\n marketCap: number,\n stableDecimals: number,\n tickSpacing: number = DEFAULT_TICK_SPACING,\n): number {\n if (marketCap <= 0) throw new Error(\"marketCap must be positive\");\n // price = (marketCap * 10^stableDecimals) / 10^29\n const price = marketCap / Math.pow(10, 29 - stableDecimals);\n const rawTick = Math.log(price) / LOG_BASE;\n return Math.floor(rawTick / tickSpacing) * tickSpacing;\n}\n","/**\n * Multi-tranche liquidity position builder.\n *\n * Creates position arrays (tickLower[], tickUpper[], positionBps[]) from\n * market cap milestones. Percentages represent share of the *pool supply*\n * (i.e. after dev buy, airdrop, and vault allocations are deducted).\n */\n\nimport { getTickFromMarketCapETH, getTickFromMarketCapUSD } from \"./tick-math\";\n\n// ── Types ────────────────────────────────────────────────────────────\n\nexport interface MarketCapTranche {\n /** Upper bound market cap in ETH for this tranche */\n upperMarketCapETH: number;\n /** Percentage of pool supply allocated to this tranche (1-100) */\n supplyPct: number;\n}\n\nexport interface MarketCapTrancheUSD {\n /** Upper bound market cap in USD for this tranche */\n upperMarketCapUSD: number;\n /** Percentage of pool supply allocated to this tranche (1-100) */\n supplyPct: number;\n}\n\nexport interface PositionConfig {\n tickLower: number;\n tickUpper: number;\n positionBps: number;\n}\n\nexport interface PositionArrays {\n tickLower: number[];\n tickUpper: number[];\n positionBps: number[];\n}\n\n// ── Default tranches ─────────────────────────────────────────────────\n\n/**\n * Default Liquid tranches (USD-denominated).\n *\n * - Starting → $500K market cap: 40% of pool supply\n * - $500K → $10M market cap: 50% of pool supply\n * - $10M → $1B market cap: 10% of pool supply\n */\nexport const DEFAULT_TRANCHES_USD: MarketCapTrancheUSD[] = [\n { upperMarketCapUSD: 500_000, supplyPct: 40 },\n { upperMarketCapUSD: 10_000_000, supplyPct: 50 },\n { upperMarketCapUSD: 1_000_000_000, supplyPct: 10 },\n];\n\n// ── Builders ─────────────────────────────────────────────────────────\n\n/**\n * Build position arrays from ETH-denominated market cap tranches.\n *\n * @param startingMarketCapETH - Initial market cap in ETH (determines the starting tick)\n * @param tranches - Array of tranches with upper market cap bounds and supply percentages\n * @param tickSpacing - Tick spacing (default 200)\n * @returns Position arrays ready to pass to `deployToken()`\n *\n * @example\n * ```ts\n * const positions = createPositions(10, [\n * { upperMarketCapETH: 241.5, supplyPct: 40 }, // ~$500K at $2070/ETH\n * { upperMarketCapETH: 4830, supplyPct: 50 }, // ~$10M\n * { upperMarketCapETH: 483050, supplyPct: 10 }, // ~$1B\n * ]);\n * // → { tickLower: [-230400, -198600, -168600],\n * // tickUpper: [-198600, -168600, -122400],\n * // positionBps: [4000, 5000, 1000] }\n * ```\n */\nexport function createPositions(\n startingMarketCapETH: number,\n tranches: MarketCapTranche[],\n tickSpacing: number = 200,\n): PositionArrays {\n if (tranches.length === 0) throw new Error(\"At least one tranche is required\");\n if (tranches.length > 7) throw new Error(\"Maximum 7 positions allowed\");\n\n const totalPct = tranches.reduce((sum, t) => sum + t.supplyPct, 0);\n if (Math.abs(totalPct - 100) > 0.01) {\n throw new Error(`Tranche percentages must sum to 100, got ${totalPct}`);\n }\n\n // Validate tranches are ordered by ascending market cap\n for (let i = 1; i < tranches.length; i++) {\n if (tranches[i].upperMarketCapETH <= tranches[i - 1].upperMarketCapETH) {\n throw new Error(\"Tranches must be ordered by ascending upperMarketCapETH\");\n }\n }\n\n const startingTick = getTickFromMarketCapETH(startingMarketCapETH, tickSpacing);\n\n const tickLower: number[] = [];\n const tickUpper: number[] = [];\n const positionBps: number[] = [];\n\n let prevTick = startingTick;\n\n for (const tranche of tranches) {\n const upperTick = getTickFromMarketCapETH(tranche.upperMarketCapETH, tickSpacing);\n\n if (upperTick <= prevTick) {\n throw new Error(\n `Tranche upper market cap ${tranche.upperMarketCapETH} ETH resolves to tick ${upperTick}, ` +\n `which is not above previous tick ${prevTick}. Increase the market cap or reduce tick spacing.`\n );\n }\n\n tickLower.push(prevTick);\n tickUpper.push(upperTick);\n positionBps.push(Math.round(tranche.supplyPct * 100)); // pct → bps\n\n prevTick = upperTick;\n }\n\n return { tickLower, tickUpper, positionBps };\n}\n\n/**\n * Build position arrays from USD-denominated market cap tranches.\n * Convenience wrapper that converts USD → ETH using the provided ETH price.\n *\n * @param startingMarketCapUSD - Initial market cap in USD\n * @param ethPriceUSD - Current ETH price in USD\n * @param tranches - Array of tranches with upper USD market cap bounds\n * @param tickSpacing - Tick spacing (default 200)\n * @returns Position arrays ready to pass to `deployToken()`\n *\n * @example\n * ```ts\n * const positions = createPositionsUSD(20_000, 2070, [\n * { upperMarketCapUSD: 500_000, supplyPct: 40 },\n * { upperMarketCapUSD: 10_000_000, supplyPct: 50 },\n * { upperMarketCapUSD: 1_000_000_000, supplyPct: 10 },\n * ]);\n * ```\n */\nexport function createPositionsUSD(\n startingMarketCapUSD: number,\n ethPriceUSD: number,\n tranches: MarketCapTrancheUSD[],\n tickSpacing: number = 200,\n): PositionArrays {\n if (ethPriceUSD <= 0) throw new Error(\"ethPriceUSD must be positive\");\n\n const ethTranches: MarketCapTranche[] = tranches.map((t) => ({\n upperMarketCapETH: t.upperMarketCapUSD / ethPriceUSD,\n supplyPct: t.supplyPct,\n }));\n\n return createPositions(\n startingMarketCapUSD / ethPriceUSD,\n ethTranches,\n tickSpacing,\n );\n}\n\n/**\n * Build default Liquid positions using the standard 3-tranche split.\n *\n * - Starting → $500K: 40% of pool supply\n * - $500K → $10M: 50% of pool supply\n * - $10M → $1B: 10% of pool supply\n *\n * @param startingMarketCapUSD - Initial market cap in USD (e.g. 20_000 for ~10 ETH)\n * @param ethPriceUSD - Current ETH price in USD\n * @param tickSpacing - Tick spacing (default 200)\n *\n * @example\n * ```ts\n * const positions = createDefaultPositions(20_000, 2070);\n * const tx = await sdk.deployToken({\n * name: \"MyToken\",\n * symbol: \"MTK\",\n * ...positions,\n * });\n * ```\n */\nexport function createDefaultPositions(\n startingMarketCapUSD: number,\n ethPriceUSD: number,\n tickSpacing: number = 200,\n): PositionArrays & { tickIfToken0IsLiquid: number } {\n const positions = createPositionsUSD(\n startingMarketCapUSD,\n ethPriceUSD,\n DEFAULT_TRANCHES_USD,\n tickSpacing,\n );\n\n return {\n ...positions,\n tickIfToken0IsLiquid: positions.tickLower[0],\n };\n}\n\n/**\n * Describe positions as human-readable market cap ranges.\n * Useful for displaying position info in UIs.\n *\n * @param positions - Position arrays\n * @param ethPriceUSD - Optional ETH price for USD display\n */\nexport function describePositions(\n positions: PositionArrays,\n ethPriceUSD?: number,\n): Array<{\n index: number;\n tickLower: number;\n tickUpper: number;\n supplyPct: number;\n marketCapLowerETH: number;\n marketCapUpperETH: number;\n marketCapLowerUSD?: number;\n marketCapUpperUSD?: number;\n}> {\n return positions.tickLower.map((_, i) => {\n const lowerETH = Math.pow(1.0001, positions.tickLower[i]) * 1e11;\n const upperETH = Math.pow(1.0001, positions.tickUpper[i]) * 1e11;\n return {\n index: i,\n tickLower: positions.tickLower[i],\n tickUpper: positions.tickUpper[i],\n supplyPct: positions.positionBps[i] / 100,\n marketCapLowerETH: lowerETH,\n marketCapUpperETH: upperETH,\n ...(ethPriceUSD != null && {\n marketCapLowerUSD: lowerETH * ethPriceUSD,\n marketCapUpperUSD: upperETH * ethPriceUSD,\n }),\n };\n });\n}\n"],"mappings":"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","names":["import_viem","import_chains","FeePreference","decoded"]}
|