@whetstone-research/doppler-sdk 1.0.0 → 1.0.1

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.
@@ -1,4 +1,4 @@
1
- import { MAX_SENTINEL_ALLOWLIST, MAX_ORACLE_OBSERVATIONS, ACCOUNT_DISCRIMINATORS, PROGRAM_ID, Q64_ONE, BPS_DENOM, TOKEN_PROGRAM_ID, INSTRUCTION_DISCRIMINATORS, ACCOUNT_ROLE_WRITABLE, ACCOUNT_ROLE_SIGNER, ACCOUNT_ROLE_READONLY, getPoolAddress, sortMints, getPositionAddress, getOracleAddress } from './chunk-3LTCKCJC.js';
1
+ import { MAX_SENTINEL_ALLOWLIST, MAX_ORACLE_OBSERVATIONS, ACCOUNT_DISCRIMINATORS, PROGRAM_ID, Q64_ONE, BPS_DENOM, TOKEN_PROGRAM_ID, INSTRUCTION_DISCRIMINATORS, ACCOUNT_ROLE_WRITABLE, ACCOUNT_ROLE_SIGNER, ACCOUNT_ROLE_READONLY, getPoolAddress, sortMints, getPositionAddress, getOracleAddress } from './chunk-T46KDO65.js';
2
2
  import { getAddressCodec, getBooleanCodec, getU8Codec, getU16Codec, getU32Codec, getU64Codec, getU128Codec, transformCodec, getArrayCodec, fixCodecSize, getBytesCodec, getStructCodec, getHiddenPrefixDecoder, getConstantDecoder, getOptionCodec, unwrapOption, mergeBytes } from '@solana/kit';
3
3
 
4
4
  var addressCodec = getAddressCodec();
@@ -532,15 +532,15 @@ async function fetchAllPools(rpc, config) {
532
532
  address: account.pubkey,
533
533
  account: pool
534
534
  });
535
- } catch (_e) {
535
+ } catch {
536
536
  console.warn(`Failed to decode pool account: ${account.pubkey}`);
537
537
  }
538
538
  }
539
539
  return pools;
540
540
  }
541
- async function getPoolByMints(rpc, mintA, mintB, config) {
541
+ async function getPoolByMints(rpc, mint0, mint1, config) {
542
542
  const programId = config?.programId ?? PROGRAM_ID;
543
- const [poolAddress] = await getPoolAddress(mintA, mintB, programId);
543
+ const [poolAddress] = await getPoolAddress(mint0, mint1, programId);
544
544
  const pool = await fetchPool(rpc, poolAddress, config);
545
545
  if (!pool) {
546
546
  return null;
@@ -563,13 +563,13 @@ async function fetchPoolsBatch(rpc, addresses, config) {
563
563
  }
564
564
  return pools;
565
565
  }
566
- async function poolExists(rpc, mintA, mintB, config) {
567
- const result = await getPoolByMints(rpc, mintA, mintB, config);
566
+ async function poolExists(rpc, mint0, mint1, config) {
567
+ const result = await getPoolByMints(rpc, mint0, mint1, config);
568
568
  return result !== null;
569
569
  }
570
- async function getPoolAddressFromMints(mintA, mintB, programId = PROGRAM_ID) {
571
- const [token0, token1] = sortMints(mintA, mintB);
572
- const [poolAddress] = await getPoolAddress(mintA, mintB, programId);
570
+ async function getPoolAddressFromMints(mint0, mint1, programId = PROGRAM_ID) {
571
+ const [token0, token1] = sortMints(mint0, mint1);
572
+ const [poolAddress] = await getPoolAddress(mint0, mint1, programId);
573
573
  return {
574
574
  poolAddress,
575
575
  token0,
@@ -970,5 +970,5 @@ function comparePoolAndOraclePrices(pool, oracle) {
970
970
  }
971
971
 
972
972
  export { MAX_FEE_AMOUNT, calculateAccruedFees, calculateTwap, calculateTwapNumber, ceilDiv, collectProtocolFeesArgsCodec, comparePoolAndOraclePrices, computePrice0Q64, computePrice1Q64, consultTwap, createCollectFeesInstruction, createPositionArgsCodec, decodeAmmConfig, decodeOracleState, decodePool, decodePosition, encodeInstructionData, fetchAllPools, fetchOracle, fetchOraclesBatch, fetchPool, fetchPoolPositions, fetchPoolsBatch, fetchPosition, fetchPositionByParams, fetchPositionsBatch, fetchUserPositions, filterActivePositions, filterPoolsByMint, getAddLiquidityQuote, getK, getOracleAddressFromPool, getOracleAge, getOracleBufferStats, getOracleDeviation, getOracleForPool, getOracleSpotPrices, getPendingFees, getPoolAddressFromMints, getPoolByMints, getPositionAddressFromParams, getPositionValue, getRemoveLiquidityQuote, getSpotPrice0, getSpotPrice1, getSwapQuote, getSwapQuoteExactOut, getTvl, initializeConfigArgsCodec, initializeOracleArgsCodec, initializePoolArgsCodec, isOracleStale, isqrt, maxBigInt, minBigInt, numberToQ64, oracleConsultArgsCodec, poolExists, q64Div, q64Mul, q64ToNumber, quoteToNumeraireArgsCodec, ratioToNumber, removeLiquidityArgsCodec, setFeesArgsCodec, setRouteArgsCodec, setSentinelArgsCodec, sortPoolsByReserves, sortPositionsByShares, swapExactInArgsCodec, transferAdminArgsCodec };
973
- //# sourceMappingURL=chunk-RO6R66OM.js.map
974
- //# sourceMappingURL=chunk-RO6R66OM.js.map
973
+ //# sourceMappingURL=chunk-LIXSTCMM.js.map
974
+ //# sourceMappingURL=chunk-LIXSTCMM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/solana/core/codecs.ts","../src/solana/core/math.ts","../src/solana/instructions/collectFees.ts","../src/solana/client/pool.ts","../src/solana/client/position.ts","../src/solana/client/oracle.ts"],"names":["sharesOut","bytesToBase64","base64ToBytes"],"mappings":"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","file":"chunk-LIXSTCMM.js","sourcesContent":["/**\n * Borsh serialization/deserialization for CPMM accounts and instructions\n *\n * This module provides encoding/decoding utilities for program accounts\n * and instruction data using Borsh-compatible binary formats.\n */\n\nimport { getAddressCodec, type Address } from '@solana/kit';\nimport type { ReadonlyUint8Array } from '@solana/kit';\nimport {\n fixCodecSize,\n getArrayCodec,\n getBooleanCodec,\n getBytesCodec,\n getConstantDecoder,\n getHiddenPrefixDecoder,\n getOptionCodec,\n getStructCodec,\n getU8Codec,\n getU16Codec,\n getU32Codec,\n getU64Codec,\n getU128Codec,\n mergeBytes,\n transformCodec,\n unwrapOption,\n type Codec,\n} from '@solana/kit';\nimport {\n MAX_ORACLE_OBSERVATIONS,\n MAX_SENTINEL_ALLOWLIST,\n ACCOUNT_DISCRIMINATORS,\n} from './constants.js';\nimport type {\n AmmConfig,\n Pool,\n Position,\n OracleState,\n Observation,\n SwapExactInArgs,\n AddLiquidityArgs,\n RemoveLiquidityArgs,\n CollectFeesArgs,\n CollectProtocolFeesArgs,\n CreatePositionArgs,\n InitializeConfigArgs,\n InitializePoolArgs,\n InitializeOracleArgs,\n SetSentinelArgs,\n SetFeesArgs,\n SetRouteArgs,\n TransferAdminArgs,\n OracleConsultArgs,\n QuoteToNumeraireArgs,\n} from './types.js';\n\nconst addressCodec = getAddressCodec();\nconst boolCodec = getBooleanCodec();\nconst u8Codec = getU8Codec();\nconst u16Codec = getU16Codec();\nconst u32Codec = getU32Codec();\nconst u64Codec = getU64Codec();\nconst u128Codec = getU128Codec();\nconst u256Codec: Codec<bigint> = transformCodec(\n getArrayCodec(u64Codec, { size: 4 }),\n (value) => {\n if (value < 0n) {\n throw new Error('u256 cannot be negative');\n }\n if (value >> 256n !== 0n) {\n throw new Error('u256 overflow');\n }\n const mask = (1n << 64n) - 1n;\n return [\n value & mask,\n (value >> 64n) & mask,\n (value >> 128n) & mask,\n (value >> 192n) & mask,\n ];\n },\n (value) => {\n let out = 0n;\n for (let i = 0; i < 4; i += 1) {\n out |= value[i] << (64n * BigInt(i));\n }\n return out;\n },\n);\n\nconst reservedBytesCodec = transformCodec(\n fixCodecSize(getBytesCodec(), 7),\n (value: Uint8Array) => value,\n (value) => new Uint8Array(value),\n);\n\n// ============================================================================\n// Account Codecs\n// ============================================================================\n\nexport const observationCodec: Codec<Observation> = getStructCodec([\n ['timestamp', u32Codec],\n ['price0Cumulative', u256Codec],\n ['price1Cumulative', u256Codec],\n]);\n\nexport const ammConfigDataCodec: Codec<AmmConfig> = getStructCodec([\n ['admin', addressCodec],\n ['paused', boolCodec],\n ['numeraireMint', addressCodec],\n ['sentinelAllowlistLen', u8Codec],\n [\n 'sentinelAllowlist',\n getArrayCodec(addressCodec, { size: MAX_SENTINEL_ALLOWLIST }),\n ],\n ['maxSwapFeeBps', u16Codec],\n ['maxFeeSplitBps', u16Codec],\n ['maxRouteHops', u8Codec],\n ['protocolFeeEnabled', boolCodec],\n ['protocolFeeBps', u16Codec],\n ['version', u8Codec],\n ['reserved', reservedBytesCodec],\n]);\n\nexport const poolDataCodec: Codec<Pool> = getStructCodec([\n ['config', addressCodec],\n ['token0Mint', addressCodec],\n ['token1Mint', addressCodec],\n ['vault0', addressCodec],\n ['vault1', addressCodec],\n ['authority', addressCodec],\n ['bump', u8Codec],\n ['reserve0', u64Codec],\n ['reserve1', u64Codec],\n ['totalShares', u128Codec],\n ['swapFeeBps', u16Codec],\n ['feeSplitBps', u16Codec],\n ['feeGrowthGlobal0Q64', u128Codec],\n ['feeGrowthGlobal1Q64', u128Codec],\n ['feesUnclaimed0', u64Codec],\n ['feesUnclaimed1', u64Codec],\n ['sentinelProgram', addressCodec],\n ['sentinelFlags', u32Codec],\n ['numeraireMint', addressCodec],\n ['liquidityMeasureSide', u8Codec],\n ['routeNextPool', addressCodec],\n ['routeBridgeMint', addressCodec],\n ['kLast', u128Codec],\n ['protocolPosition', addressCodec],\n ['locked', u8Codec],\n ['version', u8Codec],\n ['reserved', reservedBytesCodec],\n]);\n\nexport const positionDataCodec: Codec<Position> = getStructCodec([\n ['pool', addressCodec],\n ['owner', addressCodec],\n ['positionId', u64Codec],\n ['shares', u128Codec],\n ['feeGrowthLast0Q64', u128Codec],\n ['feeGrowthLast1Q64', u128Codec],\n ['feeOwed0', u64Codec],\n ['feeOwed1', u64Codec],\n ['version', u8Codec],\n ['reserved', reservedBytesCodec],\n]);\n\nexport const oracleStateDataCodec: Codec<OracleState> = getStructCodec([\n ['pool', addressCodec],\n ['initialized', boolCodec],\n ['maxPriceChangeRatioQ64', u128Codec],\n ['lastSlot', u64Codec],\n ['truncPrice0Q64', u128Codec],\n ['truncPrice1Q64', u128Codec],\n ['deviation0Q64', u128Codec],\n ['deviation1Q64', u128Codec],\n ['price0Cumulative', u256Codec],\n ['price1Cumulative', u256Codec],\n ['lastTimestamp', u32Codec],\n ['lastObservationTimestamp', u32Codec],\n ['observationIntervalSec', u32Codec],\n ['observationIndex', u16Codec],\n [\n 'observations',\n getArrayCodec(observationCodec, { size: MAX_ORACLE_OBSERVATIONS }),\n ],\n ['version', u8Codec],\n ['reserved', reservedBytesCodec],\n]);\n\nconst ammConfigDecoder = getHiddenPrefixDecoder(ammConfigDataCodec, [\n getConstantDecoder(ACCOUNT_DISCRIMINATORS.AmmConfig),\n]);\nconst poolDecoder = getHiddenPrefixDecoder(poolDataCodec, [\n getConstantDecoder(ACCOUNT_DISCRIMINATORS.Pool),\n]);\nconst positionDecoder = getHiddenPrefixDecoder(positionDataCodec, [\n getConstantDecoder(ACCOUNT_DISCRIMINATORS.Position),\n]);\nconst oracleStateDecoder = getHiddenPrefixDecoder(oracleStateDataCodec, [\n getConstantDecoder(ACCOUNT_DISCRIMINATORS.OracleState),\n]);\n\n/**\n * Decode AmmConfig from raw account data (including discriminator)\n */\nexport function decodeAmmConfig(data: ReadonlyUint8Array): AmmConfig {\n return ammConfigDecoder.decode(data);\n}\n\n/**\n * Decode Pool from raw account data (including discriminator)\n */\nexport function decodePool(data: ReadonlyUint8Array): Pool {\n return poolDecoder.decode(data);\n}\n\n/**\n * Decode Position from raw account data (including discriminator)\n */\nexport function decodePosition(data: ReadonlyUint8Array): Position {\n return positionDecoder.decode(data);\n}\n\n/**\n * Decode OracleState from raw account data (including discriminator)\n */\nexport function decodeOracleState(data: ReadonlyUint8Array): OracleState {\n return oracleStateDecoder.decode(data);\n}\n\n// ============================================================================\n// Instruction Encoders\n// ============================================================================\n\n/**\n * Encode instruction data with discriminator prefix\n */\nexport function encodeInstructionData<T>(\n discriminator: Uint8Array,\n codec?: { encode: (args: T) => ReadonlyUint8Array | Uint8Array },\n args?: T,\n): Uint8Array {\n const encodedArgs = (() => {\n if (!codec) {\n return new Uint8Array();\n }\n if (args === undefined) {\n throw new Error('Instruction args are required for codec encoders');\n }\n return new Uint8Array(codec.encode(args));\n })();\n\n return mergeBytes([discriminator, encodedArgs]);\n}\n\ntype AddLiquidityArgsWithOracle = AddLiquidityArgs & { updateOracle?: boolean };\n\nconst optionAddressCodec: Codec<Address | null> = transformCodec(\n getOptionCodec(addressCodec, { prefix: u8Codec }),\n (value: Address | null) => value,\n (value) => unwrapOption(value),\n);\n\nexport const swapExactInArgsCodec = getStructCodec([\n ['amountIn', u64Codec],\n ['minAmountOut', u64Codec],\n ['direction', u8Codec],\n ['updateOracle', boolCodec],\n]) as Codec<SwapExactInArgs>;\n\nconst addLiquidityArgsWithOracleCodec: Codec<\n AddLiquidityArgs & { updateOracle: boolean }\n> = getStructCodec([\n ['amount0Max', u64Codec],\n ['amount1Max', u64Codec],\n ['minSharesOut', u128Codec],\n ['updateOracle', boolCodec],\n]);\n\nexport const addLiquidityArgsCodec: Codec<AddLiquidityArgsWithOracle> =\n transformCodec(\n addLiquidityArgsWithOracleCodec,\n (value: AddLiquidityArgsWithOracle) => ({\n ...value,\n updateOracle: value.updateOracle ?? false,\n }),\n (value) => value,\n );\n\nexport const removeLiquidityArgsCodec: Codec<RemoveLiquidityArgs> =\n getStructCodec([\n ['sharesIn', u128Codec],\n ['minAmount0Out', u64Codec],\n ['minAmount1Out', u64Codec],\n ['updateOracle', boolCodec],\n ]);\n\nexport const collectFeesArgsCodec: Codec<CollectFeesArgs> = getStructCodec([\n ['max0', u64Codec],\n ['max1', u64Codec],\n]);\n\nexport const collectProtocolFeesArgsCodec: Codec<CollectProtocolFeesArgs> =\n getStructCodec([\n ['max0', u64Codec],\n ['max1', u64Codec],\n ]);\n\nexport const createPositionArgsCodec: Codec<CreatePositionArgs> =\n getStructCodec([['positionId', u64Codec]]);\n\nexport const initializeConfigArgsCodec: Codec<InitializeConfigArgs> =\n getStructCodec([\n ['admin', addressCodec],\n ['numeraireMint', addressCodec],\n ['maxSwapFeeBps', u16Codec],\n ['maxFeeSplitBps', u16Codec],\n ['maxRouteHops', u8Codec],\n ['protocolFeeEnabled', boolCodec],\n ['protocolFeeBps', u16Codec],\n ['sentinelAllowlist', getArrayCodec(addressCodec, { size: u32Codec })],\n ]);\n\nexport const initializePoolArgsCodec: Codec<InitializePoolArgs> =\n getStructCodec([\n ['mintA', addressCodec],\n ['mintB', addressCodec],\n ['initialSwapFeeBps', u16Codec],\n ['initialFeeSplitBps', u16Codec],\n ['liquidityMeasureSide', u8Codec],\n ['numeraireMintOverride', optionAddressCodec],\n ]);\n\nexport const initializeOracleArgsCodec: Codec<InitializeOracleArgs> =\n getStructCodec([\n ['maxPriceChangeRatioQ64', u128Codec],\n ['observationIntervalSec', u32Codec],\n ['numObservations', u16Codec],\n ]);\n\nexport const setSentinelArgsCodec: Codec<SetSentinelArgs> = getStructCodec([\n ['sentinelProgram', addressCodec],\n ['sentinelFlags', u32Codec],\n]);\n\nexport const setFeesArgsCodec: Codec<SetFeesArgs> = getStructCodec([\n ['swapFeeBps', u16Codec],\n ['feeSplitBps', u16Codec],\n]);\n\nexport const setRouteArgsCodec: Codec<SetRouteArgs> = getStructCodec([\n ['routeNextPool', addressCodec],\n ['routeBridgeMint', addressCodec],\n]);\n\nexport const transferAdminArgsCodec: Codec<TransferAdminArgs> = getStructCodec([\n ['newAdmin', addressCodec],\n]);\n\nexport const oracleConsultArgsCodec: Codec<OracleConsultArgs> = getStructCodec([\n ['windowSeconds', u32Codec],\n]);\n\nexport const quoteToNumeraireArgsCodec: Codec<QuoteToNumeraireArgs> =\n getStructCodec([\n ['amount', u128Codec],\n ['side', u8Codec],\n ['maxHops', u8Codec],\n ['useTwap', boolCodec],\n ['windowSeconds', u32Codec],\n ]);\n\n/** Encode SwapExactIn args */\nexport function encodeSwapExactInArgs(args: SwapExactInArgs): Uint8Array {\n return new Uint8Array(swapExactInArgsCodec.encode(args));\n}\n\n/** Encode AddLiquidity args */\nexport function encodeAddLiquidityArgs(\n args: AddLiquidityArgsWithOracle,\n): Uint8Array {\n return new Uint8Array(addLiquidityArgsCodec.encode(args));\n}\n\n/** Encode RemoveLiquidity args */\nexport function encodeRemoveLiquidityArgs(\n args: RemoveLiquidityArgs,\n): Uint8Array {\n return new Uint8Array(removeLiquidityArgsCodec.encode(args));\n}\n\n/** Encode CollectFees args */\nexport function encodeCollectFeesArgs(args: CollectFeesArgs): Uint8Array {\n return new Uint8Array(collectFeesArgsCodec.encode(args));\n}\n\n/** Encode CollectProtocolFees args */\nexport function encodeCollectProtocolFeesArgs(\n args: CollectProtocolFeesArgs,\n): Uint8Array {\n return new Uint8Array(collectProtocolFeesArgsCodec.encode(args));\n}\n\n/** Encode CreatePosition args */\nexport function encodeCreatePositionArgs(args: CreatePositionArgs): Uint8Array {\n return new Uint8Array(createPositionArgsCodec.encode(args));\n}\n\n/** Encode InitializeConfig args */\nexport function encodeInitializeConfigArgs(\n args: InitializeConfigArgs,\n): Uint8Array {\n return new Uint8Array(initializeConfigArgsCodec.encode(args));\n}\n\n/** Encode InitializePool args */\nexport function encodeInitializePoolArgs(args: InitializePoolArgs): Uint8Array {\n return new Uint8Array(initializePoolArgsCodec.encode(args));\n}\n\n/** Encode InitializeOracle args */\nexport function encodeInitializeOracleArgs(\n args: InitializeOracleArgs,\n): Uint8Array {\n return new Uint8Array(initializeOracleArgsCodec.encode(args));\n}\n\n/** Encode SetSentinel args */\nexport function encodeSetSentinelArgs(args: SetSentinelArgs): Uint8Array {\n return new Uint8Array(setSentinelArgsCodec.encode(args));\n}\n\n/** Encode SetFees args */\nexport function encodeSetFeesArgs(args: SetFeesArgs): Uint8Array {\n return new Uint8Array(setFeesArgsCodec.encode(args));\n}\n\n/** Encode SetRoute args */\nexport function encodeSetRouteArgs(args: SetRouteArgs): Uint8Array {\n return new Uint8Array(setRouteArgsCodec.encode(args));\n}\n\n/** Encode TransferAdmin args */\nexport function encodeTransferAdminArgs(args: TransferAdminArgs): Uint8Array {\n return new Uint8Array(transferAdminArgsCodec.encode(args));\n}\n\n/** Encode OracleConsult args */\nexport function encodeOracleConsultArgs(args: OracleConsultArgs): Uint8Array {\n return new Uint8Array(oracleConsultArgsCodec.encode(args));\n}\n\n/** Encode QuoteToNumeraire args */\nexport function encodeQuoteToNumeraireArgs(\n args: QuoteToNumeraireArgs,\n): Uint8Array {\n return new Uint8Array(quoteToNumeraireArgsCodec.encode(args));\n}\n","import { BPS_DENOM, Q64_ONE } from './constants.js';\nimport type {\n Pool,\n SwapQuote,\n SwapQuoteExactOut,\n AddLiquidityQuote,\n RemoveLiquidityQuote,\n SwapDirection,\n} from './types.js';\n\n// ============================================================================\n// Q64.64 Fixed-Point Arithmetic\n// ============================================================================\n\n/**\n * Convert a Q64.64 fixed-point number to a decimal number\n */\nexport function q64ToNumber(q64: bigint): number {\n // Split into integer and fractional parts for precision\n const intPart = q64 >> 64n;\n const fracPart = q64 & ((1n << 64n) - 1n);\n return Number(intPart) + Number(fracPart) / Number(Q64_ONE);\n}\n\n/**\n * Convert a decimal number to Q64.64 fixed-point\n */\nexport function numberToQ64(n: number): bigint {\n const intPart = Math.floor(n);\n const fracPart = n - intPart;\n return (\n (BigInt(intPart) << 64n) + BigInt(Math.round(fracPart * Number(Q64_ONE)))\n );\n}\n\n/**\n * Multiply two Q64.64 numbers, returning Q64.64 result\n */\nexport function q64Mul(a: bigint, b: bigint): bigint {\n return (a * b) >> 64n;\n}\n\n/**\n * Divide two Q64.64 numbers, returning Q64.64 result\n */\nexport function q64Div(a: bigint, b: bigint): bigint {\n return (a << 64n) / b;\n}\n\n/**\n * Compute spot price (reserve1/reserve0) as Q64.64\n * Price of token0 denominated in token1\n */\nexport function computePrice0Q64(reserve0: bigint, reserve1: bigint): bigint {\n if (reserve0 === 0n) return 0n;\n return (reserve1 << 64n) / reserve0;\n}\n\n/**\n * Compute spot price (reserve0/reserve1) as Q64.64\n * Price of token1 denominated in token0\n */\nexport function computePrice1Q64(reserve0: bigint, reserve1: bigint): bigint {\n if (reserve1 === 0n) return 0n;\n return (reserve0 << 64n) / reserve1;\n}\n\n// ============================================================================\n// Integer Math Helpers\n// ============================================================================\n\n/**\n * Integer square root (floor)\n */\nexport function isqrt(n: bigint): bigint {\n if (n < 0n) throw new Error('isqrt: negative input');\n if (n === 0n) return 0n;\n\n let x = n;\n let y = (x + 1n) / 2n;\n\n while (y < x) {\n x = y;\n y = (x + n / x) / 2n;\n }\n\n return x;\n}\n\n/**\n * Ceiling division: ceil(a / b)\n */\nexport function ceilDiv(a: bigint, b: bigint): bigint {\n return (a + b - 1n) / b;\n}\n\n/**\n * Minimum of two bigints\n */\nexport function minBigInt(a: bigint, b: bigint): bigint {\n return a < b ? a : b;\n}\n\n/**\n * Maximum of two bigints\n */\nexport function maxBigInt(a: bigint, b: bigint): bigint {\n return a > b ? a : b;\n}\n\n/**\n * Convert a ratio of two bigints to a decimal number using Q64.64 precision\n */\nexport function ratioToNumber(numerator: bigint, denominator: bigint): number {\n if (denominator === 0n) return 0;\n const q64 = (numerator << 64n) / denominator;\n return q64ToNumber(q64);\n}\n\n// ============================================================================\n// Swap Quote Calculations\n// ============================================================================\n\n/**\n * Calculate swap output and fees for exact input amount\n *\n * Fee calculation (from spec):\n * - fee_total = floor(amount_in * fee_bps / 10_000)\n * - fee_dist = floor(fee_total * split_bps / 10_000)\n * - fee_comp = fee_total - fee_dist\n * - amount_in_eff = amount_in - fee_total\n *\n * CPMM output:\n * - amount_out = floor(amount_in_eff * reserve_out / (reserve_in + amount_in_eff))\n */\nexport function getSwapQuote(\n pool: Pool,\n amountIn: bigint,\n direction: SwapDirection,\n): SwapQuote {\n if (amountIn === 0n) {\n return {\n amountOut: 0n,\n feeTotal: 0n,\n feeDist: 0n,\n feeComp: 0n,\n priceImpact: 0,\n executionPrice: 0,\n };\n }\n\n // Get reserves based on direction\n const [reserveIn, reserveOut] =\n direction === 0\n ? [pool.reserve0, pool.reserve1]\n : [pool.reserve1, pool.reserve0];\n\n if (reserveIn === 0n || reserveOut === 0n) {\n throw new Error('Pool has zero liquidity');\n }\n\n // Calculate fees\n const feeTotal = (amountIn * BigInt(pool.swapFeeBps)) / BPS_DENOM;\n const feeDist = (feeTotal * BigInt(pool.feeSplitBps)) / BPS_DENOM;\n const feeComp = feeTotal - feeDist;\n const amountInEff = amountIn - feeTotal;\n\n // CPMM output calculation\n const amountOut = (amountInEff * reserveOut) / (reserveIn + amountInEff);\n\n // Calculate price impact\n const spotPrice = ratioToNumber(reserveOut, reserveIn);\n const executionPrice = ratioToNumber(amountOut, amountIn);\n const priceImpact =\n spotPrice === 0 ? 0 : Math.abs(spotPrice - executionPrice) / spotPrice;\n\n return {\n amountOut,\n feeTotal,\n feeDist,\n feeComp,\n priceImpact,\n executionPrice,\n };\n}\n\n/**\n * Calculate input amount needed for exact output (reverse quote)\n */\nexport function getSwapQuoteExactOut(\n pool: Pool,\n amountOut: bigint,\n direction: SwapDirection,\n): SwapQuoteExactOut {\n // Get reserves based on direction\n const [reserveIn, reserveOut] =\n direction === 0\n ? [pool.reserve0, pool.reserve1]\n : [pool.reserve1, pool.reserve0];\n\n if (reserveIn === 0n || reserveOut === 0n) {\n throw new Error('Pool has zero liquidity');\n }\n\n if (amountOut >= reserveOut) {\n throw new Error('Insufficient liquidity for output amount');\n }\n\n // Reverse CPMM formula:\n // amountOut = amountInEff * reserveOut / (reserveIn + amountInEff)\n // => amountInEff = amountOut * reserveIn / (reserveOut - amountOut)\n const amountInEff = ceilDiv(amountOut * reserveIn, reserveOut - amountOut);\n\n // Reverse fee calculation:\n // amountInEff = amountIn - feeTotal = amountIn * (1 - feeBps/10000)\n // => amountIn = amountInEff * 10000 / (10000 - feeBps)\n const amountIn = ceilDiv(\n amountInEff * BPS_DENOM,\n BPS_DENOM - BigInt(pool.swapFeeBps),\n );\n const feeTotal = amountIn - amountInEff;\n\n return { amountIn, feeTotal };\n}\n\n// ============================================================================\n// Liquidity Quote Calculations\n// ============================================================================\n\n/**\n * Calculate shares and actual amounts for adding liquidity\n *\n * From spec:\n * - If initial: shares = floor_sqrt(amount0 * amount1)\n * - Else: shares = min(amount0 * totalShares / reserve0, amount1 * totalShares / reserve1)\n */\nexport function getAddLiquidityQuote(\n pool: Pool,\n amount0Max: bigint,\n amount1Max: bigint,\n): AddLiquidityQuote {\n if (pool.totalShares === 0n) {\n // Initial liquidity deposit\n const rawShares = isqrt(amount0Max * amount1Max);\n if (rawShares === 0n) {\n throw new Error('Initial liquidity too small');\n }\n const sharesOut = rawShares;\n\n return {\n sharesOut,\n amount0: amount0Max,\n amount1: amount1Max,\n poolShare: ratioToNumber(sharesOut, rawShares),\n };\n }\n\n // Existing pool - calculate proportional deposit\n if (pool.reserve0 === 0n || pool.reserve1 === 0n) {\n throw new Error('Invalid pool state: zero reserves with non-zero shares');\n }\n\n // Calculate shares for each token amount\n const shares0 = (amount0Max * pool.totalShares) / pool.reserve0;\n const shares1 = (amount1Max * pool.totalShares) / pool.reserve1;\n const sharesOut = minBigInt(shares0, shares1);\n\n // Calculate actual amounts needed for exact ratio\n const amount0 = ceilDiv(sharesOut * pool.reserve0, pool.totalShares);\n const amount1 = ceilDiv(sharesOut * pool.reserve1, pool.totalShares);\n\n // Calculate pool share after deposit\n const newTotalShares = pool.totalShares + sharesOut;\n const poolShare = ratioToNumber(sharesOut, newTotalShares);\n\n return {\n sharesOut,\n amount0,\n amount1,\n poolShare,\n };\n}\n\n/**\n * Calculate token amounts for removing liquidity\n *\n * From spec:\n * - amount0 = shares * reserve0 / totalShares\n * - amount1 = shares * reserve1 / totalShares\n */\nexport function getRemoveLiquidityQuote(\n pool: Pool,\n sharesIn: bigint,\n): RemoveLiquidityQuote {\n if (pool.totalShares === 0n) {\n throw new Error('Pool has no shares');\n }\n if (sharesIn > pool.totalShares) {\n throw new Error('Shares exceed total supply');\n }\n\n const amount0 = (sharesIn * pool.reserve0) / pool.totalShares;\n const amount1 = (sharesIn * pool.reserve1) / pool.totalShares;\n\n return { amount0, amount1 };\n}\n\n// ============================================================================\n// Fee Growth Calculations\n// ============================================================================\n\n/**\n * Calculate accrued fees for a position\n *\n * From spec:\n * - delta = pool.fee_growth_global - position.fee_growth_last\n * - owed_inc = floor(position.shares * delta / 2^64)\n */\nexport function calculateAccruedFees(\n shares: bigint,\n feeGrowthLastQ64: bigint,\n feeGrowthGlobalQ64: bigint,\n): bigint {\n const delta = feeGrowthGlobalQ64 - feeGrowthLastQ64;\n return (shares * delta) >> 64n;\n}\n\n/**\n * Calculate pending fees for a position (both tokens)\n */\nexport function getPendingFees(\n pool: Pool,\n position: {\n shares: bigint;\n feeGrowthLast0Q64: bigint;\n feeGrowthLast1Q64: bigint;\n feeOwed0: bigint;\n feeOwed1: bigint;\n },\n): { pending0: bigint; pending1: bigint } {\n const accrued0 = calculateAccruedFees(\n position.shares,\n position.feeGrowthLast0Q64,\n pool.feeGrowthGlobal0Q64,\n );\n const accrued1 = calculateAccruedFees(\n position.shares,\n position.feeGrowthLast1Q64,\n pool.feeGrowthGlobal1Q64,\n );\n\n return {\n pending0: position.feeOwed0 + accrued0,\n pending1: position.feeOwed1 + accrued1,\n };\n}\n\n// ============================================================================\n// Price Helpers\n// ============================================================================\n\n/**\n * Calculate spot price of token0 in terms of token1\n */\nexport function getSpotPrice0(pool: Pool): number {\n if (pool.reserve0 === 0n) return 0;\n return q64ToNumber(computePrice0Q64(pool.reserve0, pool.reserve1));\n}\n\n/**\n * Calculate spot price of token1 in terms of token0\n */\nexport function getSpotPrice1(pool: Pool): number {\n if (pool.reserve1 === 0n) return 0;\n return q64ToNumber(computePrice1Q64(pool.reserve0, pool.reserve1));\n}\n\n/**\n * Calculate k (constant product invariant)\n */\nexport function getK(pool: Pool): bigint {\n return pool.reserve0 * pool.reserve1;\n}\n\n/**\n * Calculate pool TVL in terms of one token\n * @param pool Pool data\n * @param side 0 = denominate in token0, 1 = denominate in token1\n */\nexport function getTvl(pool: Pool, side: SwapDirection = 0): bigint {\n if (side === 0) {\n // TVL in token0: reserve0 + (reserve1 * price1)\n // where price1 = reserve0/reserve1 (price of 1 in terms of 0)\n // = reserve0 + reserve1 * reserve0 / reserve1 = 2 * reserve0\n return 2n * pool.reserve0;\n } else {\n // TVL in token1: reserve1 + (reserve0 * price0)\n return 2n * pool.reserve1;\n }\n}\n\n// ============================================================================\n// TWAP Helpers\n// ============================================================================\n\n/**\n * Calculate TWAP price from oracle observations\n *\n * TWAP = (cumulative_end - cumulative_start) / (timestamp_end - timestamp_start)\n */\nexport function calculateTwap(\n cumulativeStart: bigint,\n cumulativeEnd: bigint,\n timestampStart: number,\n timestampEnd: number,\n): bigint {\n const dt = BigInt(timestampEnd - timestampStart);\n if (dt === 0n) return 0n;\n\n // Handle wrapping (cumulative values can wrap around)\n const cumulativeDiff =\n cumulativeEnd >= cumulativeStart\n ? cumulativeEnd - cumulativeStart\n : (1n << 256n) - cumulativeStart + cumulativeEnd;\n\n return cumulativeDiff / dt;\n}\n\n/**\n * Calculate TWAP as a decimal number\n */\nexport function calculateTwapNumber(\n cumulativeStart: bigint,\n cumulativeEnd: bigint,\n timestampStart: number,\n timestampEnd: number,\n): number {\n const twapQ64 = calculateTwap(\n cumulativeStart,\n cumulativeEnd,\n timestampStart,\n timestampEnd,\n );\n return q64ToNumber(twapQ64);\n}\n","import type { Address } from '@solana/kit';\nimport type { Instruction, AccountMeta } from '@solana/kit';\nimport {\n PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n INSTRUCTION_DISCRIMINATORS,\n ACCOUNT_ROLE_READONLY,\n ACCOUNT_ROLE_WRITABLE,\n ACCOUNT_ROLE_SIGNER,\n} from '../core/constants.js';\nimport type { CollectFeesArgs } from '../core/types.js';\nimport { collectFeesArgsCodec, encodeInstructionData } from '../core/codecs.js';\n\n/**\n * Accounts required for collect_fees instruction\n */\nexport interface CollectFeesAccounts {\n /** Pool account (writable) */\n pool: Address;\n /** User's position account (writable) */\n position: Address;\n /** Position owner (signer) */\n owner: Address;\n /** Pool authority PDA (read-only) */\n authority: Address;\n /** Pool vault for token0 (writable) */\n vault0: Address;\n /** Pool vault for token1 (writable) */\n vault1: Address;\n /** Token0 mint (read-only) */\n token0Mint: Address;\n /** Token1 mint (read-only) */\n token1Mint: Address;\n /** User's token0 account (writable) */\n user0: Address;\n /** User's token1 account (writable) */\n user1: Address;\n /** SPL Token program */\n tokenProgram?: Address;\n}\n\n/**\n * Create a collect_fees instruction\n *\n * Collects accrued LP fees from a position. Fees are first accrued from the global\n * fee growth, then transferred from the pool vaults to the user's token accounts.\n * You can specify max amounts to partially collect fees.\n *\n * @param accounts - Required accounts for collecting fees\n * @param args - Instruction arguments (max0, max1)\n * @param programId - Program ID (defaults to CPMM program)\n * @returns Instruction to collect fees\n *\n * @example\n * ```ts\n * // Collect all accrued fees\n * const ix = createCollectFeesInstruction(\n * {\n * pool: poolAddress,\n * position: positionAddress,\n * owner: userPublicKey,\n * authority: authorityPda,\n * vault0: vault0Address,\n * vault1: vault1Address,\n * token0Mint: mint0,\n * token1Mint: mint1,\n * user0: userToken0Account,\n * user1: userToken1Account,\n * },\n * {\n * max0: BigInt('18446744073709551615'), // u64::MAX to collect all\n * max1: BigInt('18446744073709551615'),\n * }\n * );\n * ```\n */\nexport function createCollectFeesInstruction(\n accounts: CollectFeesAccounts,\n args: CollectFeesArgs,\n programId: Address = PROGRAM_ID,\n): Instruction {\n const {\n pool,\n position,\n owner,\n authority,\n vault0,\n vault1,\n token0Mint,\n token1Mint,\n user0,\n user1,\n tokenProgram = TOKEN_PROGRAM_ID,\n } = accounts;\n\n // Build account metas in order expected by the program\n // Order: pool, position, owner, authority, vault0, vault1,\n // token0_mint, token1_mint, user0, user1, token_program\n const keys: AccountMeta[] = [\n { address: pool, role: ACCOUNT_ROLE_WRITABLE },\n { address: position, role: ACCOUNT_ROLE_WRITABLE },\n { address: owner, role: ACCOUNT_ROLE_SIGNER },\n { address: authority, role: ACCOUNT_ROLE_READONLY },\n { address: vault0, role: ACCOUNT_ROLE_WRITABLE },\n { address: vault1, role: ACCOUNT_ROLE_WRITABLE },\n { address: token0Mint, role: ACCOUNT_ROLE_READONLY },\n { address: token1Mint, role: ACCOUNT_ROLE_READONLY },\n { address: user0, role: ACCOUNT_ROLE_WRITABLE },\n { address: user1, role: ACCOUNT_ROLE_WRITABLE },\n { address: tokenProgram, role: ACCOUNT_ROLE_READONLY },\n ];\n\n const data = encodeInstructionData(\n INSTRUCTION_DISCRIMINATORS.collectFees,\n collectFeesArgsCodec,\n args,\n );\n\n return {\n programAddress: programId,\n accounts: keys,\n data,\n };\n}\n\n/**\n * Convenience constant for collecting all fees (u64::MAX)\n */\nexport const MAX_FEE_AMOUNT = BigInt('18446744073709551615');\n","/**\n * Pool fetching and utility functions for the CPMM SDK\n */\n\nimport type { Address } from '@solana/kit';\nimport type { Rpc, GetAccountInfoApi } from '@solana/kit';\nimport type { Base64EncodedBytes } from '@solana/kit';\nimport type { GetProgramAccountsRpc } from '../core/rpc.js';\nimport type { Pool } from '../core/types.js';\nimport { decodePool } from '../core/codecs.js';\nimport { PROGRAM_ID, ACCOUNT_DISCRIMINATORS } from '../core/constants.js';\nimport { getPoolAddress, sortMints } from '../core/pda.js';\n\n// Browser-compatible base64 encoding/decoding utilities\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Configuration for fetching pools\n */\nexport interface FetchPoolsConfig {\n /** Program ID (defaults to CPMM program) */\n programId?: Address;\n /** Commitment level */\n commitment?: 'processed' | 'confirmed' | 'finalized';\n}\n\n/**\n * Pool with its address\n */\nexport interface PoolWithAddress {\n address: Address;\n account: Pool;\n}\n\ntype ProgramAccount = Readonly<{\n pubkey: Address;\n account: Readonly<{ data: [string, 'base64'] }>;\n}>;\n\n/**\n * Fetch and decode a single pool account\n *\n * @param rpc - Solana RPC client\n * @param address - Pool account address\n * @param config - Optional configuration\n * @returns Decoded pool data or null if not found\n *\n * @example\n * ```ts\n * const pool = await fetchPool(rpc, poolAddress);\n * if (pool) {\n * console.log(`Pool reserves: ${pool.reserve0} / ${pool.reserve1}`);\n * }\n * ```\n */\nexport async function fetchPool(\n rpc: Rpc<GetAccountInfoApi>,\n address: Address,\n config?: FetchPoolsConfig,\n): Promise<Pool | null> {\n const response = await rpc\n .getAccountInfo(address, {\n encoding: 'base64',\n commitment: config?.commitment,\n })\n .send();\n\n if (!response.value) {\n return null;\n }\n\n return decodePool(base64ToBytes(response.value.data[0]));\n}\n\n/**\n * Fetch all pool accounts for the CPMM program\n *\n * Uses getProgramAccounts with a discriminator filter for efficiency.\n *\n * @param rpc - Solana RPC client\n * @param config - Optional configuration\n * @returns Array of pools with their addresses\n *\n * @example\n * ```ts\n * const pools = await fetchAllPools(rpc);\n * console.log(`Found ${pools.length} pools`);\n * for (const { address, account } of pools) {\n * console.log(`Pool ${address}: ${account.token0Mint} / ${account.token1Mint}`);\n * }\n * ```\n */\nexport async function fetchAllPools(\n rpc: GetProgramAccountsRpc,\n config?: FetchPoolsConfig,\n): Promise<PoolWithAddress[]> {\n const programId = config?.programId ?? PROGRAM_ID;\n\n // Filter by Pool discriminator (first 8 bytes)\n const discriminatorFilter = {\n memcmp: {\n offset: 0n,\n bytes: bytesToBase64(ACCOUNT_DISCRIMINATORS.Pool) as Base64EncodedBytes,\n encoding: 'base64' as const,\n },\n };\n\n const response = (await rpc\n .getProgramAccounts(programId, {\n encoding: 'base64',\n commitment: config?.commitment,\n filters: [discriminatorFilter],\n })\n .send()) as unknown;\n\n const accounts = (\n Array.isArray(response)\n ? response\n : (response as { value: ProgramAccount[] }).value\n ) as ProgramAccount[];\n\n const pools: PoolWithAddress[] = [];\n\n for (const account of accounts) {\n try {\n const pool = decodePool(base64ToBytes(account.account.data[0]));\n pools.push({\n address: account.pubkey,\n account: pool,\n });\n } catch {\n // Skip accounts that fail to decode (shouldn't happen with proper filter)\n console.warn(`Failed to decode pool account: ${account.pubkey}`);\n }\n }\n\n return pools;\n}\n\n/**\n * Find a pool by its token pair mints\n *\n * Derives the pool PDA from the mints (automatically sorted) and fetches it.\n *\n * @param rpc - Solana RPC client\n * @param mint0 - First token mint\n * @param mint1 - Second token mint\n * @param config - Optional configuration\n * @returns Pool data with address, or null if not found\n *\n * @example\n * ```ts\n * const result = await getPoolByMints(rpc, usdcMint, wsolMint);\n * if (result) {\n * console.log(`Found pool at ${result.address}`);\n * console.log(`Swap fee: ${result.account.swapFeeBps} bps`);\n * }\n * ```\n */\nexport async function getPoolByMints(\n rpc: Rpc<GetAccountInfoApi>,\n mint0: Address,\n mint1: Address,\n config?: FetchPoolsConfig,\n): Promise<PoolWithAddress | null> {\n const programId = config?.programId ?? PROGRAM_ID;\n\n // Derive pool address (mints are sorted internally)\n const [poolAddress] = await getPoolAddress(mint0, mint1, programId);\n\n const pool = await fetchPool(rpc, poolAddress, config);\n\n if (!pool) {\n return null;\n }\n\n return {\n address: poolAddress,\n account: pool,\n };\n}\n\n/**\n * Get multiple pools by their addresses in a single batch request\n *\n * @param rpc - Solana RPC client\n * @param addresses - Array of pool addresses to fetch\n * @param config - Optional configuration\n * @returns Map of address to pool (missing pools are not included)\n *\n * @example\n * ```ts\n * const poolMap = await fetchPoolsBatch(rpc, [pool1, pool2, pool3]);\n * for (const [addr, pool] of poolMap) {\n * console.log(`Pool ${addr}: TVL = ${pool.reserve0 + pool.reserve1}`);\n * }\n * ```\n */\nexport async function fetchPoolsBatch(\n rpc: Rpc<GetAccountInfoApi>,\n addresses: Address[],\n config?: FetchPoolsConfig,\n): Promise<Map<Address, Pool>> {\n const pools = new Map<Address, Pool>();\n\n // Fetch all in parallel\n const results = await Promise.all(\n addresses.map((addr) => fetchPool(rpc, addr, config)),\n );\n\n for (let i = 0; i < addresses.length; i++) {\n const pool = results[i];\n if (pool) {\n pools.set(addresses[i], pool);\n }\n }\n\n return pools;\n}\n\n/**\n * Check if a pool exists for a token pair\n *\n * @param rpc - Solana RPC client\n * @param mint0 - First token mint\n * @param mint1 - Second token mint\n * @param config - Optional configuration\n * @returns true if pool exists, false otherwise\n */\nexport async function poolExists(\n rpc: Rpc<GetAccountInfoApi>,\n mint0: Address,\n mint1: Address,\n config?: FetchPoolsConfig,\n): Promise<boolean> {\n const result = await getPoolByMints(rpc, mint0, mint1, config);\n return result !== null;\n}\n\n/**\n * Get the pool address for a token pair without fetching\n *\n * @param mint0 - First token mint\n * @param mint1 - Second token mint\n * @param programId - Program ID (defaults to CPMM program)\n * @returns Pool address and sorted mints\n */\nexport async function getPoolAddressFromMints(\n mint0: Address,\n mint1: Address,\n programId: Address = PROGRAM_ID,\n): Promise<{\n poolAddress: Address;\n token0: Address;\n token1: Address;\n}> {\n const [token0, token1] = sortMints(mint0, mint1);\n const [poolAddress] = await getPoolAddress(mint0, mint1, programId);\n\n return {\n poolAddress,\n token0,\n token1,\n };\n}\n\n/**\n * Filter pools by a specific token mint\n *\n * @param pools - Array of pools to filter\n * @param mint - Token mint to filter by\n * @returns Pools that contain the specified mint\n */\nexport function filterPoolsByMint(\n pools: PoolWithAddress[],\n mint: Address,\n): PoolWithAddress[] {\n return pools.filter(\n ({ account }) => account.token0Mint === mint || account.token1Mint === mint,\n );\n}\n\n/**\n * Sort pools by total reserves (proxy for TVL)\n *\n * @param pools - Array of pools to sort\n * @param descending - Sort descending (highest first) if true\n * @returns Sorted array (does not mutate input)\n */\nexport function sortPoolsByReserves(\n pools: PoolWithAddress[],\n descending = true,\n): PoolWithAddress[] {\n return [...pools].sort((a, b) => {\n const totalA = a.account.reserve0 + a.account.reserve1;\n const totalB = b.account.reserve0 + b.account.reserve1;\n const cmp = totalA < totalB ? -1 : totalA > totalB ? 1 : 0;\n return descending ? -cmp : cmp;\n });\n}\n","/**\n * Position fetching and utility functions for the CPMM SDK\n */\n\nimport type { Address } from '@solana/kit';\nimport type { Rpc, GetAccountInfoApi } from '@solana/kit';\nimport type { GetProgramAccountsRpc } from '../core/rpc.js';\nimport type { Base58EncodedBytes, Base64EncodedBytes } from '@solana/kit';\nimport type { Position, Pool } from '../core/types.js';\nimport { decodePosition } from '../core/codecs.js';\nimport { PROGRAM_ID, ACCOUNT_DISCRIMINATORS } from '../core/constants.js';\nimport { getPositionAddress } from '../core/pda.js';\nimport { getPendingFees, ratioToNumber } from '../core/math.js';\n\n// Browser-compatible base64 encoding/decoding utilities\nfunction bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Configuration for fetching positions\n */\nexport interface FetchPositionsConfig {\n /** Program ID (defaults to CPMM program) */\n programId?: Address;\n /** Commitment level */\n commitment?: 'processed' | 'confirmed' | 'finalized';\n}\n\n/**\n * Position with its address\n */\nexport interface PositionWithAddress {\n address: Address;\n account: Position;\n}\n\ntype ProgramAccount = Readonly<{\n pubkey: Address;\n account: Readonly<{ data: [string, 'base64'] }>;\n}>;\n\n/**\n * Position value in underlying tokens\n */\nexport interface PositionValue {\n /** Amount of token0 the position is worth */\n amount0: bigint;\n /** Amount of token1 the position is worth */\n amount1: bigint;\n /** Pending uncollected fees in token0 */\n pendingFees0: bigint;\n /** Pending uncollected fees in token1 */\n pendingFees1: bigint;\n /** Total value in token0 (amount0 + pending0) */\n totalValue0: bigint;\n /** Total value in token1 (amount1 + pending1) */\n totalValue1: bigint;\n /** Share of pool as a decimal (0-1) */\n poolShare: number;\n}\n\n/**\n * Fetch and decode a single position account\n *\n * @param rpc - Solana RPC client\n * @param address - Position account address\n * @param config - Optional configuration\n * @returns Decoded position data or null if not found\n *\n * @example\n * ```ts\n * const position = await fetchPosition(rpc, positionAddress);\n * if (position) {\n * console.log(`Position shares: ${position.shares}`);\n * }\n * ```\n */\nexport async function fetchPosition(\n rpc: Rpc<GetAccountInfoApi>,\n address: Address,\n config?: FetchPositionsConfig,\n): Promise<Position | null> {\n const response = await rpc\n .getAccountInfo(address, {\n encoding: 'base64',\n commitment: config?.commitment,\n })\n .send();\n\n if (!response.value) {\n return null;\n }\n\n return decodePosition(base64ToBytes(response.value.data[0]));\n}\n\n/**\n * Fetch all positions for a specific owner\n *\n * @param rpc - Solana RPC client\n * @param owner - Owner address\n * @param pool - Optional pool address to filter by\n * @param config - Optional configuration\n * @returns Array of positions with their addresses\n *\n * @example\n * ```ts\n * // Get all positions for a user\n * const allPositions = await fetchUserPositions(rpc, userWallet);\n *\n * // Get positions for a specific pool\n * const poolPositions = await fetchUserPositions(rpc, userWallet, poolAddress);\n * ```\n */\nexport async function fetchUserPositions(\n rpc: GetProgramAccountsRpc,\n owner: Address,\n pool?: Address,\n config?: FetchPositionsConfig,\n): Promise<PositionWithAddress[]> {\n const programId = config?.programId ?? PROGRAM_ID;\n\n // Build filters\n const filters = [\n // Discriminator filter (first 8 bytes)\n {\n memcmp: {\n offset: 0n,\n bytes: bytesToBase64(\n ACCOUNT_DISCRIMINATORS.Position,\n ) as Base64EncodedBytes,\n encoding: 'base64' as const,\n },\n },\n // Owner filter (after 8-byte discriminator + 32-byte pool = offset 40)\n {\n memcmp: {\n offset: 40n,\n bytes: owner as unknown as Base58EncodedBytes,\n encoding: 'base58' as const,\n },\n },\n ];\n\n // Add pool filter if specified (after 8-byte discriminator = offset 8)\n if (pool) {\n filters.push({\n memcmp: {\n offset: 8n,\n bytes: pool as unknown as Base58EncodedBytes,\n encoding: 'base58' as const,\n },\n });\n }\n\n const response = (await rpc\n .getProgramAccounts(programId, {\n encoding: 'base64',\n commitment: config?.commitment,\n filters,\n })\n .send()) as unknown;\n\n const accounts = (\n Array.isArray(response)\n ? response\n : (response as { value: ProgramAccount[] }).value\n ) as ProgramAccount[];\n\n const positions: PositionWithAddress[] = [];\n\n for (const account of accounts) {\n try {\n const position = decodePosition(base64ToBytes(account.account.data[0]));\n positions.push({\n address: account.pubkey,\n account: position,\n });\n } catch {\n console.warn(`Failed to decode position account: ${account.pubkey}`);\n }\n }\n\n return positions;\n}\n\n/**\n * Fetch all positions for a specific pool\n *\n * @param rpc - Solana RPC client\n * @param pool - Pool address\n * @param config - Optional configuration\n * @returns Array of positions with their addresses\n */\nexport async function fetchPoolPositions(\n rpc: GetProgramAccountsRpc,\n pool: Address,\n config?: FetchPositionsConfig,\n): Promise<PositionWithAddress[]> {\n const programId = config?.programId ?? PROGRAM_ID;\n\n const filters = [\n // Discriminator filter\n {\n memcmp: {\n offset: 0n,\n bytes: bytesToBase64(\n ACCOUNT_DISCRIMINATORS.Position,\n ) as Base64EncodedBytes,\n encoding: 'base64' as const,\n },\n },\n // Pool filter (after 8-byte discriminator = offset 8)\n {\n memcmp: {\n offset: 8n,\n bytes: pool as unknown as Base58EncodedBytes,\n encoding: 'base58' as const,\n },\n },\n ];\n\n const response = (await rpc\n .getProgramAccounts(programId, {\n encoding: 'base64',\n commitment: config?.commitment,\n filters,\n })\n .send()) as unknown;\n\n const accounts = (\n Array.isArray(response)\n ? response\n : (response as { value: ProgramAccount[] }).value\n ) as ProgramAccount[];\n\n const positions: PositionWithAddress[] = [];\n\n for (const account of accounts) {\n try {\n const position = decodePosition(base64ToBytes(account.account.data[0]));\n positions.push({\n address: account.pubkey,\n account: position,\n });\n } catch {\n console.warn(`Failed to decode position account: ${account.pubkey}`);\n }\n }\n\n return positions;\n}\n\n/**\n * Calculate the value of a position in underlying tokens\n *\n * @param pool - Pool data\n * @param position - Position data\n * @returns Position value breakdown\n *\n * @example\n * ```ts\n * const pool = await fetchPool(rpc, poolAddress);\n * const position = await fetchPosition(rpc, positionAddress);\n *\n * if (pool && position) {\n * const value = getPositionValue(pool, position);\n * console.log(`Position worth ${value.amount0} token0 + ${value.amount1} token1`);\n * console.log(`Pool share: ${(value.poolShare * 100).toFixed(2)}%`);\n * }\n * ```\n */\nexport function getPositionValue(\n pool: Pool,\n position: Position,\n): PositionValue {\n if (pool.totalShares === 0n) {\n return {\n amount0: 0n,\n amount1: 0n,\n pendingFees0: 0n,\n pendingFees1: 0n,\n totalValue0: 0n,\n totalValue1: 0n,\n poolShare: 0,\n };\n }\n\n // Calculate underlying token amounts\n const amount0 = (position.shares * pool.reserve0) / pool.totalShares;\n const amount1 = (position.shares * pool.reserve1) / pool.totalShares;\n\n // Calculate pending fees\n const { pending0, pending1 } = getPendingFees(pool, position);\n\n // Calculate pool share\n const poolShare = ratioToNumber(position.shares, pool.totalShares);\n\n return {\n amount0,\n amount1,\n pendingFees0: pending0,\n pendingFees1: pending1,\n totalValue0: amount0 + pending0,\n totalValue1: amount1 + pending1,\n poolShare,\n };\n}\n\n/**\n * Derive and fetch a position by its deterministic parameters\n *\n * @param rpc - Solana RPC client\n * @param pool - Pool address\n * @param owner - Position owner\n * @param positionId - Position ID\n * @param config - Optional configuration\n * @returns Position with address or null if not found\n */\nexport async function fetchPositionByParams(\n rpc: Rpc<GetAccountInfoApi>,\n pool: Address,\n owner: Address,\n positionId: bigint,\n config?: FetchPositionsConfig,\n): Promise<PositionWithAddress | null> {\n const programId = config?.programId ?? PROGRAM_ID;\n const [address] = await getPositionAddress(\n pool,\n owner,\n positionId,\n programId,\n );\n\n const position = await fetchPosition(rpc, address, config);\n\n if (!position) {\n return null;\n }\n\n return {\n address,\n account: position,\n };\n}\n\n/**\n * Get the position address for given parameters without fetching\n *\n * @param pool - Pool address\n * @param owner - Position owner\n * @param positionId - Position ID\n * @param programId - Program ID (defaults to CPMM program)\n * @returns Position address\n */\nexport async function getPositionAddressFromParams(\n pool: Address,\n owner: Address,\n positionId: bigint,\n programId: Address = PROGRAM_ID,\n): Promise<Address> {\n const [address] = await getPositionAddress(\n pool,\n owner,\n positionId,\n programId,\n );\n return address;\n}\n\n/**\n * Batch fetch multiple positions\n *\n * @param rpc - Solana RPC client\n * @param addresses - Array of position addresses to fetch\n * @param config - Optional configuration\n * @returns Map of address to position (missing positions are not included)\n */\nexport async function fetchPositionsBatch(\n rpc: Rpc<GetAccountInfoApi>,\n addresses: Address[],\n config?: FetchPositionsConfig,\n): Promise<Map<Address, Position>> {\n const positions = new Map<Address, Position>();\n\n const results = await Promise.all(\n addresses.map((addr) => fetchPosition(rpc, addr, config)),\n );\n\n for (let i = 0; i < addresses.length; i++) {\n const position = results[i];\n if (position) {\n positions.set(addresses[i], position);\n }\n }\n\n return positions;\n}\n\n/**\n * Filter positions with non-zero shares\n *\n * @param positions - Array of positions to filter\n * @returns Positions with shares > 0\n */\nexport function filterActivePositions(\n positions: PositionWithAddress[],\n): PositionWithAddress[] {\n return positions.filter(({ account }) => account.shares > 0n);\n}\n\n/**\n * Sort positions by share amount\n *\n * @param positions - Array of positions to sort\n * @param descending - Sort descending (largest first) if true\n * @returns Sorted array (does not mutate input)\n */\nexport function sortPositionsByShares(\n positions: PositionWithAddress[],\n descending = true,\n): PositionWithAddress[] {\n return [...positions].sort((a, b) => {\n const cmp =\n a.account.shares < b.account.shares\n ? -1\n : a.account.shares > b.account.shares\n ? 1\n : 0;\n return descending ? -cmp : cmp;\n });\n}\n","/**\n * Oracle fetching and TWAP utility functions for the CPMM SDK\n */\n\nimport type { Address } from '@solana/kit';\nimport type { Rpc, GetAccountInfoApi } from '@solana/kit';\nimport type { OracleState, TwapResult, Pool } from '../core/types.js';\nimport { decodeOracleState } from '../core/codecs.js';\nimport { PROGRAM_ID } from '../core/constants.js';\nimport { getOracleAddress } from '../core/pda.js';\nimport { q64ToNumber } from '../core/math.js';\n\n// Browser-compatible base64 decoding\nfunction base64ToBytes(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Configuration for fetching oracles\n */\nexport interface FetchOracleConfig {\n /** Program ID (defaults to CPMM program) */\n programId?: Address;\n /** Commitment level */\n commitment?: 'processed' | 'confirmed' | 'finalized';\n}\n\n/**\n * Oracle with its address\n */\nexport interface OracleWithAddress {\n address: Address;\n account: OracleState;\n}\n\n/**\n * Fetch and decode an oracle state account\n *\n * @param rpc - Solana RPC client\n * @param address - Oracle account address\n * @param config - Optional configuration\n * @returns Decoded oracle state or null if not found\n *\n * @example\n * ```ts\n * const oracle = await fetchOracle(rpc, oracleAddress);\n * if (oracle) {\n * console.log(`Oracle initialized: ${oracle.initialized}`);\n * console.log(`Last update: ${oracle.lastTimestamp}`);\n * }\n * ```\n */\nexport async function fetchOracle(\n rpc: Rpc<GetAccountInfoApi>,\n address: Address,\n config?: FetchOracleConfig,\n): Promise<OracleState | null> {\n const response = await rpc\n .getAccountInfo(address, {\n encoding: 'base64',\n commitment: config?.commitment,\n })\n .send();\n\n if (!response.value) {\n return null;\n }\n\n return decodeOracleState(base64ToBytes(response.value.data[0]));\n}\n\n/**\n * Get the oracle for a specific pool\n *\n * Derives the oracle PDA from the pool address and fetches it.\n *\n * @param rpc - Solana RPC client\n * @param pool - Pool address\n * @param config - Optional configuration\n * @returns Oracle data with address, or null if not found/initialized\n *\n * @example\n * ```ts\n * const result = await getOracleForPool(rpc, poolAddress);\n * if (result) {\n * console.log(`Oracle at ${result.address}`);\n * const twap = consultTwap(result.account, 300); // 5-minute TWAP\n * console.log(`TWAP price: ${twap.price0}`);\n * }\n * ```\n */\nexport async function getOracleForPool(\n rpc: Rpc<GetAccountInfoApi>,\n pool: Address,\n config?: FetchOracleConfig,\n): Promise<OracleWithAddress | null> {\n const programId = config?.programId ?? PROGRAM_ID;\n const [oracleAddress] = await getOracleAddress(pool, programId);\n\n const oracle = await fetchOracle(rpc, oracleAddress, config);\n\n if (!oracle) {\n return null;\n }\n\n return {\n address: oracleAddress,\n account: oracle,\n };\n}\n\n/**\n * Get the oracle address for a pool without fetching\n *\n * @param pool - Pool address\n * @param programId - Program ID (defaults to CPMM program)\n * @returns Oracle address\n */\nexport async function getOracleAddressFromPool(\n pool: Address,\n programId: Address = PROGRAM_ID,\n): Promise<Address> {\n const [address] = await getOracleAddress(pool, programId);\n return address;\n}\n\n/**\n * Calculate TWAP price from oracle observations\n *\n * Finds the appropriate observations in the circular buffer and computes\n * the time-weighted average price over the specified window.\n *\n * @param oracle - Oracle state data\n * @param windowSeconds - TWAP window in seconds\n * @param currentTimestamp - Optional override for current time (seconds)\n * @returns TWAP prices for both directions, or null if insufficient data\n *\n * @example\n * ```ts\n * const oracle = await fetchOracle(rpc, oracleAddress);\n * if (oracle && oracle.initialized) {\n * // Get 5-minute TWAP\n * const twap = consultTwap(oracle, 300);\n * if (twap) {\n * console.log(`Token0 price: ${twap.price0} token1 per token0`);\n * console.log(`Token1 price: ${twap.price1} token0 per token1`);\n * }\n * }\n * ```\n */\nexport function consultTwap(\n oracle: OracleState,\n windowSeconds: number,\n currentTimestamp?: number,\n): TwapResult | null {\n if (!oracle.initialized || oracle.lastTimestamp === 0) {\n return null;\n }\n\n const nowTs = Math.max(0, Math.floor(currentTimestamp ?? Date.now() / 1000));\n const dtSinceLast = Math.max(0, nowTs - oracle.lastTimestamp);\n\n const cum0Now =\n oracle.price0Cumulative + oracle.truncPrice0Q64 * BigInt(dtSinceLast);\n const cum1Now =\n oracle.price1Cumulative + oracle.truncPrice1Q64 * BigInt(dtSinceLast);\n\n if (windowSeconds === 0) {\n return {\n price0Q64: oracle.truncPrice0Q64,\n price1Q64: oracle.truncPrice1Q64,\n price0: q64ToNumber(oracle.truncPrice0Q64),\n price1: q64ToNumber(oracle.truncPrice1Q64),\n };\n }\n\n const targetTs = Math.max(0, nowTs - windowSeconds);\n const sample = selectSample(oracle, targetTs);\n if (!sample) {\n return null;\n }\n\n const dt = Math.max(0, nowTs - sample.timestamp);\n if (dt === 0) {\n return null;\n }\n\n const price0Q64 = (cum0Now - sample.price0Cumulative) / BigInt(dt);\n const price1Q64 = (cum1Now - sample.price1Cumulative) / BigInt(dt);\n\n return {\n price0Q64,\n price1Q64,\n price0: q64ToNumber(price0Q64),\n price1: q64ToNumber(price1Q64),\n };\n}\n\nfunction selectSample(\n oracle: OracleState,\n targetTimestamp: number,\n): OracleState['observations'][number] | null {\n let best: OracleState['observations'][number] | null = null;\n const base = {\n timestamp: oracle.lastTimestamp,\n price0Cumulative: oracle.price0Cumulative,\n price1Cumulative: oracle.price1Cumulative,\n };\n\n if (base.timestamp !== 0 && base.timestamp <= targetTimestamp) {\n best = base;\n }\n\n for (const obs of oracle.observations) {\n if (obs.timestamp === 0) {\n continue;\n }\n if (obs.timestamp <= targetTimestamp) {\n if (!best || obs.timestamp > best.timestamp) {\n best = obs;\n }\n }\n }\n\n if (best) {\n return best;\n }\n\n let oldest: OracleState['observations'][number] | null =\n base.timestamp !== 0 ? base : null;\n for (const obs of oracle.observations) {\n if (obs.timestamp === 0) {\n continue;\n }\n if (!oldest || obs.timestamp < oldest.timestamp) {\n oldest = obs;\n }\n }\n\n return oldest;\n}\n\n/**\n * Get the current spot prices from oracle\n *\n * Uses the truncated (manipulation-resistant) prices stored in the oracle.\n *\n * @param oracle - Oracle state data\n * @returns Current truncated prices\n */\nexport function getOracleSpotPrices(oracle: OracleState): {\n price0Q64: bigint;\n price1Q64: bigint;\n price0: number;\n price1: number;\n} {\n return {\n price0Q64: oracle.truncPrice0Q64,\n price1Q64: oracle.truncPrice1Q64,\n price0: q64ToNumber(oracle.truncPrice0Q64),\n price1: q64ToNumber(oracle.truncPrice1Q64),\n };\n}\n\n/**\n * Get the price deviation metrics from oracle\n *\n * Deviation indicates how much the spot price has moved from the truncated price.\n * High deviation may indicate price manipulation or rapid market movement.\n *\n * @param oracle - Oracle state data\n * @returns Deviation values for both price directions\n */\nexport function getOracleDeviation(oracle: OracleState): {\n deviation0Q64: bigint;\n deviation1Q64: bigint;\n deviation0: number;\n deviation1: number;\n} {\n return {\n deviation0Q64: oracle.deviation0Q64,\n deviation1Q64: oracle.deviation1Q64,\n deviation0: q64ToNumber(oracle.deviation0Q64),\n deviation1: q64ToNumber(oracle.deviation1Q64),\n };\n}\n\n/**\n * Calculate the age of the oracle (time since last update)\n *\n * @param oracle - Oracle state data\n * @param currentTimestamp - Current timestamp (defaults to Date.now() / 1000)\n * @returns Age in seconds\n */\nexport function getOracleAge(\n oracle: OracleState,\n currentTimestamp?: number,\n): number {\n const now = currentTimestamp ?? Math.floor(Date.now() / 1000);\n return now - oracle.lastTimestamp;\n}\n\n/**\n * Check if oracle is stale (hasn't been updated recently)\n *\n * @param oracle - Oracle state data\n * @param maxAgeSeconds - Maximum acceptable age in seconds\n * @param currentTimestamp - Current timestamp (defaults to Date.now() / 1000)\n * @returns true if oracle is stale\n */\nexport function isOracleStale(\n oracle: OracleState,\n maxAgeSeconds: number,\n currentTimestamp?: number,\n): boolean {\n return getOracleAge(oracle, currentTimestamp) > maxAgeSeconds;\n}\n\n/**\n * Get observation buffer statistics\n *\n * @param oracle - Oracle state data\n * @returns Information about the observation buffer\n */\nexport function getOracleBufferStats(oracle: OracleState): {\n /** Total buffer capacity */\n capacity: number;\n /** Number of observations with data */\n filledCount: number;\n /** Current write index */\n currentIndex: number;\n /** Oldest observation timestamp (0 if not filled) */\n oldestTimestamp: number;\n /** Newest observation timestamp */\n newestTimestamp: number;\n /** Time span covered by observations */\n timeSpanSeconds: number;\n} {\n const observations = oracle.observations;\n const capacity = observations.length;\n const currentIndex = oracle.observationIndex;\n\n let filledCount = 0;\n let oldestTimestamp = 0;\n let newestTimestamp = 0;\n\n for (let i = 0; i < capacity; i++) {\n const obs = observations[i];\n if (obs.timestamp > 0) {\n filledCount++;\n if (oldestTimestamp === 0 || obs.timestamp < oldestTimestamp) {\n oldestTimestamp = obs.timestamp;\n }\n if (obs.timestamp > newestTimestamp) {\n newestTimestamp = obs.timestamp;\n }\n }\n }\n\n return {\n capacity,\n filledCount,\n currentIndex,\n oldestTimestamp,\n newestTimestamp,\n timeSpanSeconds:\n newestTimestamp > oldestTimestamp ? newestTimestamp - oldestTimestamp : 0,\n };\n}\n\n/**\n * Batch fetch oracles for multiple pools\n *\n * @param rpc - Solana RPC client\n * @param pools - Array of pool addresses\n * @param config - Optional configuration\n * @returns Map of pool address to oracle (missing oracles not included)\n */\nexport async function fetchOraclesBatch(\n rpc: Rpc<GetAccountInfoApi>,\n pools: Address[],\n config?: FetchOracleConfig,\n): Promise<Map<Address, OracleWithAddress>> {\n const programId = config?.programId ?? PROGRAM_ID;\n const oracles = new Map<Address, OracleWithAddress>();\n\n // Derive all oracle addresses\n const oracleAddresses = await Promise.all(\n pools.map((pool) => getOracleAddress(pool, programId)),\n );\n\n // Fetch all oracles in parallel\n const results = await Promise.all(\n oracleAddresses.map(([addr]) => fetchOracle(rpc, addr, config)),\n );\n\n for (let i = 0; i < pools.length; i++) {\n const oracle = results[i];\n if (oracle) {\n oracles.set(pools[i], {\n address: oracleAddresses[i][0],\n account: oracle,\n });\n }\n }\n\n return oracles;\n}\n\n/**\n * Calculate price from pool reserves and compare with oracle\n *\n * Useful for detecting price discrepancies or manipulation.\n *\n * @param pool - Pool data\n * @param oracle - Oracle data\n * @returns Comparison metrics\n */\nexport function comparePoolAndOraclePrices(\n pool: Pool,\n oracle: OracleState,\n): {\n /** Spot price from pool reserves (token1 per token0) */\n poolPrice0: number;\n /** Truncated price from oracle (token1 per token0) */\n oraclePrice0: number;\n /** Difference as percentage (positive = pool > oracle) */\n divergencePct: number;\n} {\n const poolPrice0 =\n pool.reserve0 > 0n ? Number(pool.reserve1) / Number(pool.reserve0) : 0;\n\n const oraclePrice0 = q64ToNumber(oracle.truncPrice0Q64);\n\n const divergencePct =\n oraclePrice0 > 0 ? ((poolPrice0 - oraclePrice0) / oraclePrice0) * 100 : 0;\n\n return {\n poolPrice0,\n oraclePrice0,\n divergencePct,\n };\n}\n"]}
@@ -2,10 +2,10 @@ import { address, getAddressCodec, getProgramDerivedAddress } from '@solana/kit'
2
2
 
3
3
  // src/solana/core/pda.ts
4
4
  var PROGRAM_ID = address(
5
- "3HSrGs4jj92CGt7mkfeeoMofrRGVPUcDX8djAnp4FoD6"
5
+ "9PSxVPoPfnbZ8Q1uQhgS6ZxvBjFboZtebNsu34umxkgQ"
6
6
  );
7
7
  var SENTINEL_PROGRAM_ID = address(
8
- "EYgA9DZYuYLRWjgTz98fVgSZwk55NYUEL589oSKcNHMs"
8
+ "2vJ1c62knEwZbxp3XdHB4RSmCfz55pA6tRkCho63gW7u"
9
9
  );
10
10
  var TOKEN_PROGRAM_ID = address(
11
11
  "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
@@ -16,6 +16,9 @@ var TOKEN_METADATA_PROGRAM_ID = address(
16
16
  var SYSTEM_PROGRAM_ID = address(
17
17
  "11111111111111111111111111111111"
18
18
  );
19
+ var ASSOCIATED_TOKEN_PROGRAM_ID = address(
20
+ "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
21
+ );
19
22
  var BPS_DENOM = 10000n;
20
23
  var Q64_ONE = 1n << 64n;
21
24
  var ACCOUNT_VERSION = 1;
@@ -202,15 +205,15 @@ var ACCOUNT_DISCRIMINATORS = {
202
205
  // src/solana/core/pda.ts
203
206
  var addressCodec = getAddressCodec();
204
207
  var textEncoder = new TextEncoder();
205
- function sortMints(mintA, mintB) {
206
- const bytesA = addressCodec.encode(mintA);
207
- const bytesB = addressCodec.encode(mintB);
208
+ function sortMints(mint0, mint1) {
209
+ const bytesA = addressCodec.encode(mint0);
210
+ const bytesB = addressCodec.encode(mint1);
208
211
  for (let i = 0; i < 32; i++) {
209
212
  if (bytesA[i] < bytesB[i]) {
210
- return [mintA, mintB];
213
+ return [mint0, mint1];
211
214
  }
212
215
  if (bytesA[i] > bytesB[i]) {
213
- return [mintB, mintA];
216
+ return [mint1, mint0];
214
217
  }
215
218
  }
216
219
  throw new Error("Mints are equal - cannot create pool with identical tokens");
@@ -230,8 +233,8 @@ async function getConfigAddress(programId = PROGRAM_ID) {
230
233
  seeds: [textEncoder.encode(SEED_CONFIG)]
231
234
  });
232
235
  }
233
- async function getPoolAddress(mintA, mintB, programId = PROGRAM_ID) {
234
- const [token0, token1] = sortMints(mintA, mintB);
236
+ async function getPoolAddress(mint0, mint1, programId = PROGRAM_ID) {
237
+ const [token0, token1] = sortMints(mint0, mint1);
235
238
  return getProgramDerivedAddress({
236
239
  programAddress: programId,
237
240
  seeds: [
@@ -276,8 +279,8 @@ async function getProtocolPositionAddress(pool, programId = PROGRAM_ID) {
276
279
  ]
277
280
  });
278
281
  }
279
- async function getPoolInitAddresses(mintA, mintB, programId = PROGRAM_ID) {
280
- const [token0, token1] = sortMints(mintA, mintB);
282
+ async function getPoolInitAddresses(mint0, mint1, programId = PROGRAM_ID) {
283
+ const [token0, token1] = sortMints(mint0, mint1);
281
284
  const [config, pool] = await Promise.all([
282
285
  getConfigAddress(programId),
283
286
  getPoolAddress(token0, token1, programId)
@@ -314,6 +317,6 @@ async function getLiquidityAddresses(pool, owner, positionId, programId = PROGRA
314
317
  return { config, authority, position, protocolPosition, oracle };
315
318
  }
316
319
 
317
- export { ACCOUNT_DISCRIMINATORS, ACCOUNT_ROLE_READONLY, ACCOUNT_ROLE_SIGNER, ACCOUNT_ROLE_WRITABLE, ACCOUNT_ROLE_WRITABLE_SIGNER, ACCOUNT_VERSION, BPS_DENOM, INSTRUCTION_DISCRIMINATORS, MAX_ORACLE_OBSERVATIONS, MAX_SENTINEL_ALLOWLIST, PROGRAM_ID, Q64_ONE, SEED_AUTHORITY, SEED_CONFIG, SEED_ORACLE, SEED_POOL, SEED_POSITION, SEED_PROTOCOL_POSITION, SENTINEL_NO_CHANGE, SENTINEL_PROGRAM_ID, SF_AFTER_ADD_LIQ, SF_AFTER_REMOVE_LIQ, SF_AFTER_SWAP, SF_BEFORE_ADD_LIQ, SF_BEFORE_REMOVE_LIQ, SF_BEFORE_SWAP, SYSTEM_PROGRAM_ID, TOKEN_METADATA_PROGRAM_ID, TOKEN_PROGRAM_ID, areMintsOrdered, getConfigAddress, getLiquidityAddresses, getOracleAddress, getPoolAddress, getPoolAuthorityAddress, getPoolInitAddresses, getPositionAddress, getProtocolPositionAddress, getSwapAddresses, sortMints };
318
- //# sourceMappingURL=chunk-3LTCKCJC.js.map
319
- //# sourceMappingURL=chunk-3LTCKCJC.js.map
320
+ export { ACCOUNT_DISCRIMINATORS, ACCOUNT_ROLE_READONLY, ACCOUNT_ROLE_SIGNER, ACCOUNT_ROLE_WRITABLE, ACCOUNT_ROLE_WRITABLE_SIGNER, ACCOUNT_VERSION, ASSOCIATED_TOKEN_PROGRAM_ID, BPS_DENOM, INSTRUCTION_DISCRIMINATORS, MAX_ORACLE_OBSERVATIONS, MAX_SENTINEL_ALLOWLIST, PROGRAM_ID, Q64_ONE, SEED_AUTHORITY, SEED_CONFIG, SEED_ORACLE, SEED_POOL, SEED_POSITION, SEED_PROTOCOL_POSITION, SENTINEL_NO_CHANGE, SENTINEL_PROGRAM_ID, SF_AFTER_ADD_LIQ, SF_AFTER_REMOVE_LIQ, SF_AFTER_SWAP, SF_BEFORE_ADD_LIQ, SF_BEFORE_REMOVE_LIQ, SF_BEFORE_SWAP, SYSTEM_PROGRAM_ID, TOKEN_METADATA_PROGRAM_ID, TOKEN_PROGRAM_ID, areMintsOrdered, getConfigAddress, getLiquidityAddresses, getOracleAddress, getPoolAddress, getPoolAuthorityAddress, getPoolInitAddresses, getPositionAddress, getProtocolPositionAddress, getSwapAddresses, sortMints };
321
+ //# sourceMappingURL=chunk-T46KDO65.js.map
322
+ //# sourceMappingURL=chunk-T46KDO65.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/solana/core/constants.ts","../src/solana/core/pda.ts"],"names":[],"mappings":"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","file":"chunk-T46KDO65.js","sourcesContent":["import { address, type Address } from '@solana/kit';\n\n/**\n * Program ID for the CPMM AMM\n */\nexport const PROGRAM_ID: Address = address(\n '9PSxVPoPfnbZ8Q1uQhgS6ZxvBjFboZtebNsu34umxkgQ',\n);\n\n/**\n * Program ID for the Sentinel program (deployed to devnet)\n */\nexport const SENTINEL_PROGRAM_ID: Address = address(\n '2vJ1c62knEwZbxp3XdHB4RSmCfz55pA6tRkCho63gW7u',\n);\n\n/**\n * SPL Token Program ID\n */\nexport const TOKEN_PROGRAM_ID: Address = address(\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n);\n\n/**\n * Metaplex Token Metadata Program ID\n */\nexport const TOKEN_METADATA_PROGRAM_ID: Address = address(\n 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s',\n);\n\n/**\n * System Program ID\n */\nexport const SYSTEM_PROGRAM_ID: Address = address(\n '11111111111111111111111111111111',\n);\n\n/**\n * SPL Associated Token Account Program ID\n */\nexport const ASSOCIATED_TOKEN_PROGRAM_ID: Address = address(\n 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',\n);\n\n// ============================================================================\n// Math Constants\n// ============================================================================\n\n/** Basis points denominator (10,000 = 100%) */\nexport const BPS_DENOM = 10_000n;\n\n/** Q64.64 fixed-point representation of 1.0 (2^64) */\nexport const Q64_ONE = 1n << 64n;\n\n/** Current account version */\nexport const ACCOUNT_VERSION = 1;\n\n// ============================================================================\n// Array Size Constants\n// ============================================================================\n\n/** Maximum number of programs in sentinel allowlist */\nexport const MAX_SENTINEL_ALLOWLIST = 32;\n\n/** Maximum number of oracle observations (TWAP buffer size) */\nexport const MAX_ORACLE_OBSERVATIONS = 64;\n\n// ============================================================================\n// PDA Seeds\n// ============================================================================\n\n/** Seed for AmmConfig PDA: ['config'] */\nexport const SEED_CONFIG = 'config';\n\n/** Seed prefix for Pool PDA: ['pool', token0_mint, token1_mint] */\nexport const SEED_POOL = 'pool';\n\n/** Seed prefix for pool authority PDA: ['authority', pool] */\nexport const SEED_AUTHORITY = 'authority';\n\n/** Seed prefix for Position PDA: ['position', pool, owner, position_id] */\nexport const SEED_POSITION = 'position';\n\n/** Seed prefix for OracleState PDA: ['oracle', pool] */\nexport const SEED_ORACLE = 'oracle';\n\n/** Seed prefix for protocol position PDA: ['protocol_position', pool] */\nexport const SEED_PROTOCOL_POSITION = 'protocol_position';\n\n// ============================================================================\n// Sentinel Flags\n// ============================================================================\n\n/** Sentinel hook: called before swap */\nexport const SF_BEFORE_SWAP = 1 << 0;\n\n/** Sentinel hook: called after swap */\nexport const SF_AFTER_SWAP = 1 << 1;\n\n/** Sentinel hook: called before add liquidity */\nexport const SF_BEFORE_ADD_LIQ = 1 << 2;\n\n/** Sentinel hook: called after add liquidity */\nexport const SF_AFTER_ADD_LIQ = 1 << 3;\n\n/** Sentinel hook: called before remove liquidity */\nexport const SF_BEFORE_REMOVE_LIQ = 1 << 4;\n\n/** Sentinel hook: called after remove liquidity */\nexport const SF_AFTER_REMOVE_LIQ = 1 << 5;\n\n/** Sentinel return value indicating \"no change\" to fee parameter */\nexport const SENTINEL_NO_CHANGE = 0xffff;\n\n// ============================================================================\n// Account Meta Roles (for AccountMeta)\n// ============================================================================\n\n/** Account is read-only (not writable, not signer) */\nexport const ACCOUNT_ROLE_READONLY = 0;\n\n/** Account is writable (not signer) */\nexport const ACCOUNT_ROLE_WRITABLE = 1;\n\n/** Account is a signer (not writable) */\nexport const ACCOUNT_ROLE_SIGNER = 2;\n\n/** Account is both writable and a signer */\nexport const ACCOUNT_ROLE_WRITABLE_SIGNER = 3;\n\n// ============================================================================\n// Instruction Discriminators (Anchor 8-byte hashes)\n// ============================================================================\n\n/**\n * Anchor instruction discriminator (first 8 bytes of SHA256(\"global:<instruction_name>\"))\n * These are computed at build time from the instruction names.\n */\nexport const INSTRUCTION_DISCRIMINATORS = {\n // SHA256(\"global:initialize_config\")[0:8]\n initializeConfig: new Uint8Array([\n 0xd0, 0x7f, 0x15, 0x01, 0xc2, 0xbe, 0xc4, 0x46,\n ]),\n // SHA256(\"global:initialize_pool\")[0:8]\n initializePool: new Uint8Array([\n 0x5f, 0xb4, 0x0a, 0xac, 0x54, 0xae, 0xe8, 0x28,\n ]),\n // SHA256(\"global:initialize_oracle\")[0:8]\n initializeOracle: new Uint8Array([\n 0x90, 0xdf, 0x83, 0x78, 0xc4, 0xfd, 0xb5, 0x63,\n ]),\n // SHA256(\"global:create_position\")[0:8]\n createPosition: new Uint8Array([\n 0x30, 0xd7, 0xc5, 0x99, 0x60, 0xcb, 0xb4, 0x85,\n ]),\n // SHA256(\"global:add_liquidity\")[0:8]\n addLiquidity: new Uint8Array([\n 0xb5, 0x9d, 0x59, 0x43, 0x8f, 0xb6, 0x34, 0x48,\n ]),\n // SHA256(\"global:remove_liquidity\")[0:8]\n removeLiquidity: new Uint8Array([\n 0x50, 0x55, 0xd1, 0x48, 0x18, 0xce, 0xb1, 0x6c,\n ]),\n // SHA256(\"global:swap_exact_in\")[0:8]\n swapExactIn: new Uint8Array([0x68, 0x68, 0x83, 0x56, 0xa1, 0xbd, 0xb4, 0xd8]),\n // SHA256(\"global:collect_fees\")[0:8]\n collectFees: new Uint8Array([0xa4, 0x98, 0xcf, 0x63, 0x1e, 0xba, 0x13, 0xb6]),\n // SHA256(\"global:collect_protocol_fees\")[0:8]\n collectProtocolFees: new Uint8Array([\n 0x16, 0x43, 0x17, 0x62, 0x96, 0xb2, 0x46, 0xdc,\n ]),\n // SHA256(\"global:close_position\")[0:8]\n closePosition: new Uint8Array([\n 0x7b, 0x86, 0x51, 0x00, 0x31, 0x44, 0x62, 0x62,\n ]),\n // SHA256(\"global:oracle_update\")[0:8]\n oracleUpdate: new Uint8Array([\n 0x55, 0xd1, 0xf8, 0x8e, 0xba, 0xf9, 0x78, 0xef,\n ]),\n // SHA256(\"global:oracle_consult\")[0:8]\n oracleConsult: new Uint8Array([\n 0xef, 0xed, 0xff, 0xb1, 0x8e, 0x48, 0x60, 0xaf,\n ]),\n // SHA256(\"global:quote_to_numeraire\")[0:8]\n quoteToNumeraire: new Uint8Array([\n 0x04, 0x8e, 0xf9, 0xf0, 0x81, 0x0f, 0x8f, 0x39,\n ]),\n // SHA256(\"global:set_sentinel\")[0:8]\n setSentinel: new Uint8Array([0x5e, 0xc8, 0x52, 0x81, 0x35, 0x95, 0xe8, 0x71]),\n // SHA256(\"global:set_fees\")[0:8]\n setFees: new Uint8Array([0x89, 0xb2, 0x31, 0x3a, 0x00, 0xf5, 0xf2, 0xbe]),\n // SHA256(\"global:set_route\")[0:8]\n setRoute: new Uint8Array([0xf4, 0xe7, 0x03, 0x54, 0xe9, 0x3d, 0x92, 0x95]),\n // SHA256(\"global:transfer_admin\")[0:8]\n transferAdmin: new Uint8Array([\n 0x2a, 0xf2, 0x42, 0x6a, 0xe4, 0x0a, 0x6f, 0x9c,\n ]),\n // SHA256(\"global:pause\")[0:8]\n pause: new Uint8Array([0xd3, 0x16, 0xdd, 0xfb, 0x4a, 0x79, 0xc1, 0x2f]),\n // SHA256(\"global:unpause\")[0:8]\n unpause: new Uint8Array([0xa9, 0x90, 0x04, 0x26, 0x0a, 0x8d, 0xbc, 0xff]),\n // SHA256(\"global:skim\")[0:8]\n skim: new Uint8Array([0xee, 0x78, 0xdd, 0x8a, 0x52, 0x3c, 0x64, 0xda]),\n} as const;\n\n// ============================================================================\n// Account Discriminators (Anchor 8-byte hashes)\n// ============================================================================\n\n/**\n * Anchor account discriminator (first 8 bytes of SHA256(\"account:<AccountName>\"))\n */\nexport const ACCOUNT_DISCRIMINATORS = {\n // SHA256(\"account:AmmConfig\")[0:8]\n AmmConfig: new Uint8Array([0xda, 0xf4, 0x21, 0x68, 0xcb, 0xcb, 0x2b, 0x6f]),\n // SHA256(\"account:Pool\")[0:8]\n Pool: new Uint8Array([0xf1, 0x9a, 0x6d, 0x04, 0x11, 0xb1, 0x6d, 0xbc]),\n // SHA256(\"account:Position\")[0:8]\n Position: new Uint8Array([0xaa, 0xbc, 0x8f, 0xe4, 0x7a, 0x40, 0xf7, 0xd0]),\n // SHA256(\"account:OracleState\")[0:8]\n OracleState: new Uint8Array([0x61, 0x9c, 0x9d, 0xbd, 0xc2, 0x49, 0x08, 0x0f]),\n} as const;\n","import {\n type Address,\n type ProgramDerivedAddress,\n getAddressCodec,\n getProgramDerivedAddress,\n} from '@solana/kit';\nimport {\n PROGRAM_ID,\n SEED_CONFIG,\n SEED_POOL,\n SEED_AUTHORITY,\n SEED_POSITION,\n SEED_ORACLE,\n SEED_PROTOCOL_POSITION,\n} from './constants.js';\n\nconst addressCodec = getAddressCodec();\nconst textEncoder = new TextEncoder();\n\n// ============================================================================\n// Token Sorting\n// ============================================================================\n\n/**\n * Sort two mints into canonical order (token0 < token1 by bytes)\n * This is required for Pool PDA derivation and instruction ordering.\n *\n * @param mint0 - First mint address\n * @param mint1 - Second mint address\n * @returns Tuple of [token0, token1] in canonical order\n * @throws Error if mints are equal\n */\nexport function sortMints(mint0: Address, mint1: Address): [Address, Address] {\n const bytesA = addressCodec.encode(mint0);\n const bytesB = addressCodec.encode(mint1);\n\n for (let i = 0; i < 32; i++) {\n if (bytesA[i] < bytesB[i]) {\n return [mint0, mint1];\n }\n if (bytesA[i] > bytesB[i]) {\n return [mint1, mint0];\n }\n }\n\n throw new Error('Mints are equal - cannot create pool with identical tokens');\n}\n\n/**\n * Check if mints are in canonical order\n */\nexport function areMintsOrdered(mint0: Address, mint1: Address): boolean {\n const bytes0 = addressCodec.encode(mint0);\n const bytes1 = addressCodec.encode(mint1);\n\n for (let i = 0; i < 32; i++) {\n if (bytes0[i] < bytes1[i]) return true;\n if (bytes0[i] > bytes1[i]) return false;\n }\n return false; // equal\n}\n\n// ============================================================================\n// PDA Derivation Functions\n// ============================================================================\n\n/**\n * Derive the AmmConfig PDA address\n * Seeds: ['config']\n */\nexport async function getConfigAddress(\n programId: Address = PROGRAM_ID,\n): Promise<ProgramDerivedAddress> {\n return getProgramDerivedAddress({\n programAddress: programId,\n seeds: [textEncoder.encode(SEED_CONFIG)],\n });\n}\n\n/**\n * Derive the Pool PDA address for a token pair\n * Seeds: ['pool', token0_mint, token1_mint]\n *\n * Note: Mints will be automatically sorted if not in canonical order.\n */\nexport async function getPoolAddress(\n mint0: Address,\n mint1: Address,\n programId: Address = PROGRAM_ID,\n): Promise<ProgramDerivedAddress> {\n const [token0, token1] = sortMints(mint0, mint1);\n return getProgramDerivedAddress({\n programAddress: programId,\n seeds: [\n textEncoder.encode(SEED_POOL),\n addressCodec.encode(token0),\n addressCodec.encode(token1),\n ],\n });\n}\n\n/**\n * Derive the Pool authority PDA (vault owner)\n * Seeds: ['authority', pool]\n */\nexport async function getPoolAuthorityAddress(\n pool: Address,\n programId: Address = PROGRAM_ID,\n): Promise<ProgramDerivedAddress> {\n return getProgramDerivedAddress({\n programAddress: programId,\n seeds: [textEncoder.encode(SEED_AUTHORITY), addressCodec.encode(pool)],\n });\n}\n\n/**\n * Derive the Position PDA address\n * Seeds: ['position', pool, owner, position_id_le_bytes]\n */\nexport async function getPositionAddress(\n pool: Address,\n owner: Address,\n positionId: bigint,\n programId: Address = PROGRAM_ID,\n): Promise<ProgramDerivedAddress> {\n const positionIdBytes = new Uint8Array(8);\n const view = new DataView(positionIdBytes.buffer);\n view.setBigUint64(0, positionId, true); // little-endian\n\n return getProgramDerivedAddress({\n programAddress: programId,\n seeds: [\n textEncoder.encode(SEED_POSITION),\n addressCodec.encode(pool),\n addressCodec.encode(owner),\n positionIdBytes,\n ],\n });\n}\n\n/**\n * Derive the OracleState PDA address\n * Seeds: ['oracle', pool]\n */\nexport async function getOracleAddress(\n pool: Address,\n programId: Address = PROGRAM_ID,\n): Promise<ProgramDerivedAddress> {\n return getProgramDerivedAddress({\n programAddress: programId,\n seeds: [textEncoder.encode(SEED_ORACLE), addressCodec.encode(pool)],\n });\n}\n\n/**\n * Derive the Protocol Position PDA address\n * Seeds: ['protocol_position', pool]\n */\nexport async function getProtocolPositionAddress(\n pool: Address,\n programId: Address = PROGRAM_ID,\n): Promise<ProgramDerivedAddress> {\n return getProgramDerivedAddress({\n programAddress: programId,\n seeds: [\n textEncoder.encode(SEED_PROTOCOL_POSITION),\n addressCodec.encode(pool),\n ],\n });\n}\n\n// ============================================================================\n// Batch PDA Derivation\n// ============================================================================\n\n/**\n * Derive all PDAs needed for pool initialization\n */\nexport async function getPoolInitAddresses(\n mint0: Address,\n mint1: Address,\n programId: Address = PROGRAM_ID,\n): Promise<{\n token0: Address;\n token1: Address;\n pool: ProgramDerivedAddress;\n authority: ProgramDerivedAddress;\n config: ProgramDerivedAddress;\n protocolPosition: ProgramDerivedAddress;\n}> {\n const [token0, token1] = sortMints(mint0, mint1);\n const [config, pool] = await Promise.all([\n getConfigAddress(programId),\n getPoolAddress(token0, token1, programId),\n ]);\n const [authority, protocolPosition] = await Promise.all([\n getPoolAuthorityAddress(pool[0], programId),\n getProtocolPositionAddress(pool[0], programId),\n ]);\n\n return {\n token0,\n token1,\n pool,\n authority,\n config,\n protocolPosition,\n };\n}\n\n/**\n * Derive all PDAs needed for swap operation\n */\nexport async function getSwapAddresses(\n pool: Address,\n programId: Address = PROGRAM_ID,\n): Promise<{\n config: ProgramDerivedAddress;\n authority: ProgramDerivedAddress;\n oracle: ProgramDerivedAddress;\n}> {\n const [config, authority, oracle] = await Promise.all([\n getConfigAddress(programId),\n getPoolAuthorityAddress(pool, programId),\n getOracleAddress(pool, programId),\n ]);\n\n return { config, authority, oracle };\n}\n\n/**\n * Derive all PDAs needed for liquidity operations\n */\nexport async function getLiquidityAddresses(\n pool: Address,\n owner: Address,\n positionId: bigint,\n programId: Address = PROGRAM_ID,\n): Promise<{\n config: ProgramDerivedAddress;\n authority: ProgramDerivedAddress;\n position: ProgramDerivedAddress;\n protocolPosition: ProgramDerivedAddress;\n oracle: ProgramDerivedAddress;\n}> {\n const [config, authority, position, protocolPosition, oracle] =\n await Promise.all([\n getConfigAddress(programId),\n getPoolAuthorityAddress(pool, programId),\n getPositionAddress(pool, owner, positionId, programId),\n getProtocolPositionAddress(pool, programId),\n getOracleAddress(pool, programId),\n ]);\n\n return { config, authority, position, protocolPosition, oracle };\n}\n"]}