UNPKG

@raydium-io/raydium-sdk-v2

Version:

An SDK for building applications on top of Raydium.

1 lines 17.3 kB
{"version":3,"sources":["../../../../src/raydium/clmm/libraries/bigNum.ts","../../../../src/raydium/clmm/libraries/constants.ts","../../../../src/raydium/clmm/libraries/sqrtPriceMath.ts"],"sourcesContent":["import BN from \"bn.js\"\nimport Decimal from \"decimal.js\"\nimport { BN_ONE, BN_ZERO, Q128, U128_MAX } from \"./constants\"\n\nexport function mask(bits: number): BN {\n return new BN(1).shln(bits).subn(1)\n}\n\nexport function checkedAdd(a: BN, b: BN, maxBits: number): BN {\n const result = a.add(b)\n const maxValue = mask(maxBits)\n if (result.gt(maxValue)) {\n throw new Error(`Addition overflow: result exceeds ${maxBits} bits`)\n }\n return result\n}\n\nexport function checkedSub(a: BN, b: BN): BN {\n if (a.lt(b)) {\n throw new Error(\"Subtraction underflow\")\n }\n return a.sub(b)\n}\n\nexport function checkedMul(a: BN, b: BN, maxBits: number): BN {\n const result = a.mul(b)\n const maxValue = mask(maxBits)\n if (result.gt(maxValue)) {\n throw new Error(`Multiplication overflow: result exceeds ${maxBits} bits`)\n }\n return result\n}\n\nexport function mulFull(a: BN, b: BN): [BN, BN] {\n const result = a.mul(b)\n const low = result.and(mask(128))\n const high = result.shrn(128)\n return [low, high]\n}\n\nexport function mulDivFloor(a: BN, b: BN, denominator: BN): BN {\n if (denominator.isZero()) {\n throw new Error(\"Division by zero\")\n }\n return a.mul(b).div(denominator)\n}\n\nexport function mulDivCeil(a: BN, b: BN, denominator: BN): BN {\n if (denominator.isZero()) {\n throw new Error(\"Division by zero\")\n }\n const product = a.mul(b)\n const quotient = product.div(denominator)\n const remainder = product.mod(denominator)\n\n if (remainder.isZero()) {\n return quotient\n }\n return quotient.addn(1)\n}\n\nexport function mulDivRound(a: BN, b: BN, denominator: BN, roundUp: boolean): BN {\n return roundUp ? mulDivCeil(a, b, denominator) : mulDivFloor(a, b, denominator)\n}\n\nexport function divRoundingUp(x: BN, y: BN) {\n return x.div(y).add(x.mod(y).isZero() ? BN_ZERO : BN_ONE)\n}\n\nexport function u128SaturatingAdd(a: BN, b: BN): BN {\n const result = a.add(b)\n return result.gt(U128_MAX) ? U128_MAX : result\n}\n\nexport function u128SaturatingSub(a: BN, b: BN): BN {\n return a.gt(b) ? a.sub(b) : new BN(0)\n}\n\nexport function u128CheckedMul(a: BN, b: BN): BN {\n const result = a.mul(b)\n if (result.gt(U128_MAX)) {\n throw new Error(\"U128 multiplication overflow\")\n }\n return result\n}\n\nexport const U256_MAX = new BN(1).shln(256).subn(1)\n\nexport function u256MulDivFloor(a: BN, b: BN, denominator: BN): BN {\n if (denominator.isZero()) {\n throw new Error(\"Division by zero\")\n }\n return a.mul(b).div(denominator)\n}\n\nexport function u256MulDivCeil(a: BN, b: BN, denominator: BN): BN {\n if (denominator.isZero()) {\n throw new Error(\"Division by zero\")\n }\n const product = a.mul(b)\n const quotient = product.div(denominator)\n const remainder = product.mod(denominator)\n\n if (remainder.isZero()) {\n return quotient\n }\n return quotient.addn(1)\n}\n\nexport function mostSignificantBit(n: BN): number {\n if (n.isZero()) {\n return -1\n }\n return n.bitLength() - 1\n}\n\nexport function leastSignificantBit(n: BN): number {\n if (n.isZero()) {\n return -1\n }\n\n let pos = 0\n let temp = n.clone()\n\n while (temp.and(new BN(1)).isZero()) {\n temp = temp.shrn(1)\n pos++\n }\n\n return pos\n}\n\nexport function isBitSet(n: BN, bit: number): boolean {\n return n.testn(bit)\n}\n\nexport function setBit(n: BN, bit: number): BN {\n return n.or(new BN(1).shln(bit))\n}\n\nexport function clearBit(n: BN, bit: number): BN {\n return n.and(new BN(1).shln(bit).notn(256))\n}\n\nexport function toggleBit(n: BN, bit: number): BN {\n return n.xor(new BN(1).shln(bit))\n}\n\nexport function toSignedI128(n: BN): BN {\n const signBit = new BN(1).shln(127)\n if (n.and(signBit).isZero()) {\n return n\n }\n return n.sub(new BN(1).shln(128))\n}\n\nexport function fromSignedI128(n: BN): BN {\n if (n.isNeg()) {\n return n.add(new BN(1).shln(128))\n }\n return n\n}\n\nexport function abs(n: BN): BN {\n return n.isNeg() ? n.neg() : n\n}\n\nexport function x64ToDecimal(num: BN, decimalPlaces?: number): Decimal {\n return new Decimal(num.toString()).div(Decimal.pow(2, 64)).toDecimalPlaces(decimalPlaces)\n}\n\nexport function decimalToX64(num: Decimal): BN {\n return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed())\n}\n\nexport function wrappingSubU128(n0: BN, n1: BN): BN {\n return n0.add(Q128).sub(n1).mod(Q128)\n}\n","import BN from \"bn.js\";\n\nexport const Q64 = new BN(1).shln(64);\n\nexport const RESOLUTION = 64;\n\nexport const Q128 = new BN(1).shln(128);\n\nexport const U64_MAX = new BN(1).shln(64).subn(1);\n\nexport const U128_MAX = new BN(1).shln(128).subn(1);\n\nexport const MIN_TICK = -443636;\n\nexport const MAX_TICK = 443636;\n\nexport const MIN_SQRT_PRICE_X64 = new BN(\"4295048016\");\n\nexport const MAX_SQRT_PRICE_X64 = new BN(\"79226673521066979257578248091\");\n\nexport const LOG_B_2_X32 = new BN(\"59543866431248\");\n\nexport const LOG_B_P_ERR_MARGIN_LOWER_X64 = new BN(\"184467440737095516\");\n\nexport const LOG_B_P_ERR_MARGIN_UPPER_X64 = new BN(\"15793534762490258745\");\n\nexport const BIT_PRECISION = 16;\n\nexport const TICK_ARRAY_BITMAP_SIZE = 512;\n\nexport const TICK_ARRAY_SIZE = 60;\n\nexport const MAGIC_SQRT_10001 = new BN(\"18446743708227953217\");\n\nexport const TICK_TO_SQRT_PRICE_FACTORS: { bit: number; factor: BN }[] = [\n { bit: 0, factor: new BN(\"fffcb933bd6fb800\", 16) }, // i=0\n { bit: 1, factor: new BN(\"fff97272373d4000\", 16) }, // i=1\n { bit: 2, factor: new BN(\"fff2e50f5f657000\", 16) }, // i=2\n { bit: 3, factor: new BN(\"ffe5caca7e10f000\", 16) }, // i=3\n { bit: 4, factor: new BN(\"ffcb9843d60f7000\", 16) }, // i=4\n { bit: 5, factor: new BN(\"ff973b41fa98e800\", 16) }, // i=5\n { bit: 6, factor: new BN(\"ff2ea16466c9b000\", 16) }, // i=6\n { bit: 7, factor: new BN(\"fe5dee046a9a3800\", 16) }, // i=7\n { bit: 8, factor: new BN(\"fcbe86c7900bb000\", 16) }, // i=8\n { bit: 9, factor: new BN(\"f987a7253ac65800\", 16) }, // i=9\n { bit: 10, factor: new BN(\"f3392b0822bb6000\", 16) }, // i=10\n { bit: 11, factor: new BN(\"e7159475a2caf000\", 16) }, // i=11\n { bit: 12, factor: new BN(\"d097f3bdfd2f2000\", 16) }, // i=12\n { bit: 13, factor: new BN(\"a9f746462d9f8000\", 16) }, // i=13\n { bit: 14, factor: new BN(\"70d869a156f31c00\", 16) }, // i=14\n { bit: 15, factor: new BN(\"31be135f97ed3200\", 16) }, // i=15\n { bit: 16, factor: new BN(\"9aa508b5b85a500\", 16) }, // i=16\n { bit: 17, factor: new BN(\"5d6af8dedc582c\", 16) }, // i=17\n { bit: 18, factor: new BN(\"2216e584f5fa\", 16) }, // i=18\n];\n\nexport const FEE_RATE_DENOMINATOR = 1_000_000;\n\nexport const MAX_FEE_RATE = 100_000;\n\nexport enum CollectFeeOn {\n FromInput = 0,\n TokenOnlyA = 1,\n TokenOnlyB = 2,\n}\n\n// export const FEE_RATE_DENOMINATOR_VALUE = 1_000_000;\n\nexport const MAX_FEE_RATE_NUMERATOR = 100_000;\nexport const VOLATILITY_ACCUMULATOR_SCALE = 10_000;\nexport const REDUCTION_FACTOR_DENOMINATOR = 10_000;\nexport const DYNAMIC_FEE_CONTROL_DENOMINATOR = 100_000;\n\nexport const TICK_ARRAY_SIZE_USIZE = 60;\n\nexport const REWARD_NUM = 3;\n\nexport const OBSERVATION_NUM = 100;\nexport const OBSERVATION_UPDATE_DURATION_DEFAULT = 15;\n\nexport const OPERATION_SIZE_USIZE = 10;\nexport const WHITE_MINT_SIZE_USIZE = 100;\n\nexport const EXTENSION_TICKARRAY_BITMAP_SIZE = 14;\n\nexport enum PoolStatusBitIndex {\n OpenPositionOrIncreaseLiquidity = 0,\n DecreaseLiquidity = 1,\n CollectFee = 2,\n CollectReward = 3,\n Swap = 4,\n LimitOrder = 5,\n}\n\nexport enum PoolStatusBitFlag {\n Enable = 0,\n Disable = 1,\n}\n\nexport enum RewardState {\n Uninitialized = 0,\n Initialized = 1,\n Opening = 2,\n Ended = 3,\n}\n\nexport enum UpdateAmmConfigParam {\n TradeFeeRate = 0,\n ProtocolFeeRate = 1,\n FundFeeRate = 2,\n NewOwner = 3,\n NewFundOwner = 4,\n}\n\nexport enum UpdateOperationAccountParam {\n UpdateOperationOwner = 0,\n RemoveOperationOwner = 1,\n UpdateWhitelistMint = 2,\n RemoveWhitelistMint = 3,\n}\n\nexport const BN_ZERO = new BN(0);\nexport const BN_ONE = new BN(1);\nexport const BN_NEGATIVE_ONE = new BN(-1);\n\nexport const mockV3CreatePoolInfo = {\n tvl: 0,\n volumeQuote: 0,\n mintAmountA: 0,\n mintAmountB: 0,\n rewardDefaultInfos: [],\n farmUpcomingCount: 0,\n farmOngoingCount: 0,\n farmFinishedCount: 0,\n\n day: {\n volume: 0,\n volumeQuote: 0,\n volumeFee: 0,\n apr: 0,\n feeApr: 0,\n priceMin: 0,\n priceMax: 0,\n rewardApr: [0],\n },\n week: {\n volume: 0,\n volumeQuote: 0,\n volumeFee: 0,\n apr: 0,\n feeApr: 0,\n priceMin: 0,\n priceMax: 0,\n rewardApr: [0],\n },\n month: {\n volume: 0,\n volumeQuote: 0,\n volumeFee: 0,\n apr: 0,\n feeApr: 0,\n priceMin: 0,\n priceMax: 0,\n rewardApr: [0],\n },\n pooltype: [],\n};\n\n/**\n * Get human-readable description for collectFeeOn value\n * CollectFeeOn enum values:\n * 0 = FromInput - fee collected from input token during swap\n * 1 = Token0Only - fee collected from token0\n * 2 = Token1Only - fee collected from token1\n */\nexport function getCollectFeeOnDescription(value: number): string {\n switch (value) {\n case 0:\n return \"0 (FromInput - fee from input token)\";\n case 1:\n return \"1 (Token0Only - fee from token0)\";\n case 2:\n return \"2 (Token1Only - fee from token1)\";\n default:\n return `${value} (unknown)`;\n }\n}\n\nexport const DYNAMIC_CONFIG_INDEX = 2;\nexport const U64_IGNORE_RANGE = new BN(\"18446744073700000000\");\n","import BN from \"bn.js\"\nimport { divRoundingUp, mulDivCeil, mulDivFloor } from \"./bigNum\"\nimport { BN_ONE, BN_ZERO, Q64, RESOLUTION } from \"./constants\"\n\nexport class SqrtPriceMath {\n static getNextSqrtPriceFromAmountARoundingUp(\n sqrtPriceX64: BN,\n liquidity: BN,\n amount: BN,\n add: boolean\n ): BN {\n if (amount.isZero()) {\n return sqrtPriceX64\n }\n\n const numerator = liquidity.shln(RESOLUTION)\n\n if (add) {\n const product = amount.mul(sqrtPriceX64)\n\n const denominator = numerator.add(product)\n\n if (denominator.gte(numerator)) {\n return mulDivCeil(numerator, sqrtPriceX64, denominator)\n }\n\n const quotient = mulDivFloor(numerator, BN_ONE, sqrtPriceX64)\n return mulDivCeil(numerator, BN_ONE, quotient.add(amount))\n } else {\n const product = amount.mul(sqrtPriceX64)\n\n if (numerator.lte(product)) {\n throw new Error(\"Insufficient liquidity for token0 removal\")\n }\n\n const denominator = numerator.sub(product)\n\n return mulDivCeil(numerator, sqrtPriceX64, denominator)\n }\n }\n\n static getNextSqrtPriceFromAmountBRoundingDown(\n sqrtPriceX64: BN,\n liquidity: BN,\n amount: BN,\n add: boolean\n ): BN {\n if (amount.isZero()) {\n return sqrtPriceX64\n }\n\n if (add) {\n const quotient = amount.shln(RESOLUTION).div(liquidity)\n return sqrtPriceX64.add(quotient)\n } else {\n const quotient = divRoundingUp(amount.shln(RESOLUTION), liquidity)\n return sqrtPriceX64.sub(quotient)\n }\n }\n\n static getNextSqrtPriceFromInput(\n sqrtPriceX64: BN,\n liquidity: BN,\n amountIn: BN,\n zeroForOne: boolean\n ): BN {\n if (!sqrtPriceX64.gt(BN_ZERO)) throw Error('sqrtPriceX64.gt(BN_ZERO)')\n if (!liquidity.gt(BN_ZERO)) throw Error('liquidity.gt(BN_ZERO)')\n\n if (zeroForOne) {\n return this.getNextSqrtPriceFromAmountARoundingUp(sqrtPriceX64, liquidity, amountIn, true)\n } else {\n return this.getNextSqrtPriceFromAmountBRoundingDown(sqrtPriceX64, liquidity, amountIn, true)\n }\n }\n\n static getNextSqrtPriceFromOutput(\n sqrtPriceX64: BN,\n liquidity: BN,\n amountIn: BN,\n zeroForOne: boolean\n ): BN {\n if (!sqrtPriceX64.gt(BN_ZERO)) throw Error('sqrtPriceX64.gt(BN_ZERO)')\n if (!liquidity.gt(BN_ZERO)) throw Error('liquidity.gt(BN_ZERO)')\n\n if (zeroForOne) {\n return this.getNextSqrtPriceFromAmountBRoundingDown(sqrtPriceX64, liquidity, amountIn, false)\n } else {\n return this.getNextSqrtPriceFromAmountARoundingUp(sqrtPriceX64, liquidity, amountIn, false)\n }\n }\n\n static getAmountADeltaUnsigned(\n sqrtPriceLowerX64: BN,\n sqrtPriceUpperX64: BN,\n liquidity: BN,\n roundUp: boolean\n ): BN {\n if (sqrtPriceLowerX64.gt(sqrtPriceUpperX64)) {\n [sqrtPriceLowerX64, sqrtPriceUpperX64] = [sqrtPriceUpperX64, sqrtPriceLowerX64]\n }\n\n const priceDelta = sqrtPriceUpperX64.sub(sqrtPriceLowerX64)\n const numerator = liquidity.mul(priceDelta).shln(64)\n\n const denominator = sqrtPriceLowerX64.mul(sqrtPriceUpperX64)\n\n if (roundUp) {\n return mulDivCeil(numerator, BN_ONE, denominator)\n } else {\n return mulDivFloor(numerator, BN_ONE, denominator)\n }\n }\n\n static getAmountBDeltaUnsigned(\n sqrtPriceLowerX64: BN,\n sqrtPriceUpperX64: BN,\n liquidity: BN,\n roundUp: boolean\n ): BN {\n if (sqrtPriceLowerX64.gt(sqrtPriceUpperX64)) {\n [sqrtPriceLowerX64, sqrtPriceUpperX64] = [sqrtPriceUpperX64, sqrtPriceLowerX64]\n }\n\n const priceDelta = sqrtPriceUpperX64.sub(sqrtPriceLowerX64)\n\n if (roundUp) {\n return mulDivCeil(liquidity, priceDelta, Q64)\n } else {\n return mulDivFloor(liquidity, priceDelta, Q64)\n }\n }\n}\n"],"mappings":"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","names":[]}