UNPKG

@raydium-io/raydium-sdk-v2

Version:

An SDK for building applications on top of Raydium.

1 lines 19 kB
{"version":3,"sources":["../../../../src/raydium/clmm/libraries/position.ts","../../../../src/raydium/clmm/libraries/bigNum.ts","../../../../src/raydium/clmm/libraries/constants.ts"],"sourcesContent":["import BN from 'bn.js';\n\nimport { TickLayout } from '../layout';\nimport { mulDivFloor, wrappingSubU128 } from './bigNum';\nimport { Q64 } from './constants';\n\nexport class PositionUtils {\n\n static getfeeGrowthInside(\n poolState: {\n tickCurrent: number,\n feeGrowthGlobalX64A: BN,\n feeGrowthGlobalX64B: BN,\n },\n tickLowerState: ReturnType<typeof TickLayout.decode>,\n tickUpperState: ReturnType<typeof TickLayout.decode>\n ): { feeGrowthInsideX64A: BN, feeGrowthInsideBX64: BN } {\n let feeGrowthBelowX64A = new BN(0)\n let feeGrowthBelowX64B = new BN(0)\n if (poolState.tickCurrent >= tickLowerState.tick) {\n feeGrowthBelowX64A = tickLowerState.feeGrowthOutsideX64A\n feeGrowthBelowX64B = tickLowerState.feeGrowthOutsideX64B\n } else {\n feeGrowthBelowX64A = wrappingSubU128(poolState.feeGrowthGlobalX64A, tickLowerState.feeGrowthOutsideX64A)\n feeGrowthBelowX64B = wrappingSubU128(poolState.feeGrowthGlobalX64B, tickLowerState.feeGrowthOutsideX64B)\n }\n\n let feeGrowthAboveX64A = new BN(0)\n let feeGrowthAboveX64B = new BN(0)\n if (poolState.tickCurrent < tickUpperState.tick) {\n feeGrowthAboveX64A = tickUpperState.feeGrowthOutsideX64A\n feeGrowthAboveX64B = tickUpperState.feeGrowthOutsideX64B\n } else {\n feeGrowthAboveX64A = wrappingSubU128(poolState.feeGrowthGlobalX64A, tickUpperState.feeGrowthOutsideX64A)\n feeGrowthAboveX64B = wrappingSubU128(poolState.feeGrowthGlobalX64B, tickUpperState.feeGrowthOutsideX64B)\n }\n\n const feeGrowthInsideX64A = wrappingSubU128(\n wrappingSubU128(poolState.feeGrowthGlobalX64A, feeGrowthBelowX64A),\n feeGrowthAboveX64A,\n )\n const feeGrowthInsideBX64 = wrappingSubU128(\n wrappingSubU128(poolState.feeGrowthGlobalX64B, feeGrowthBelowX64B),\n feeGrowthAboveX64B,\n )\n return { feeGrowthInsideX64A, feeGrowthInsideBX64 }\n }\n\n static GetPositionFees(\n ammPool: {\n tickCurrent: number,\n feeGrowthGlobalX64A: BN,\n feeGrowthGlobalX64B: BN,\n },\n positionState: {\n liquidity: BN\n feeGrowthInsideLastX64A: BN\n feeGrowthInsideLastX64B: BN\n tokenFeesOwedA: BN\n tokenFeesOwedB: BN\n },\n tickLowerState: ReturnType<typeof TickLayout.decode>,\n tickUpperState: ReturnType<typeof TickLayout.decode>,\n ): { tokenFeeAmountA: BN, tokenFeeAmountB: BN } {\n const { feeGrowthInsideX64A, feeGrowthInsideBX64 } = this.getfeeGrowthInside(\n ammPool,\n tickLowerState,\n tickUpperState,\n )\n\n const feeGrowthdeltaA = mulDivFloor(\n wrappingSubU128(feeGrowthInsideX64A, positionState.feeGrowthInsideLastX64A),\n positionState.liquidity,\n Q64,\n )\n const tokenFeeAmountA = positionState.tokenFeesOwedA.add(feeGrowthdeltaA)\n\n const feeGrowthdelta1 = mulDivFloor(\n wrappingSubU128(feeGrowthInsideBX64, positionState.feeGrowthInsideLastX64B),\n positionState.liquidity,\n Q64,\n )\n const tokenFeeAmountB = positionState.tokenFeesOwedB.add(feeGrowthdelta1)\n\n return { tokenFeeAmountA, tokenFeeAmountB }\n }\n\n static GetPositionRewards(\n ammPool: { tickCurrent: number, rewardInfos: { growthGlobalX64: BN }[] },\n positionState: { liquidity: BN, rewardInfos: { growthInsideLastX64: BN, rewardAmountOwed: BN }[] },\n tickLowerState: ReturnType<typeof TickLayout.decode>,\n tickUpperState: ReturnType<typeof TickLayout.decode>,\n ): BN[] {\n const rewards: BN[] = []\n\n const rewardGrowthsInside = this.getRewardGrowthInside(\n ammPool.tickCurrent,\n tickLowerState,\n tickUpperState,\n ammPool.rewardInfos,\n )\n for (let i = 0; i < rewardGrowthsInside.length; i++) {\n const rewardGrowthInside = rewardGrowthsInside[i]\n const currRewardInfo = positionState.rewardInfos[i]\n\n const rewardGrowthDelta = wrappingSubU128(rewardGrowthInside, currRewardInfo.growthInsideLastX64)\n const amountOwedDelta = mulDivFloor(rewardGrowthDelta, positionState.liquidity, Q64)\n const rewardAmountOwed = currRewardInfo.rewardAmountOwed.add(amountOwedDelta)\n rewards.push(rewardAmountOwed)\n }\n return rewards\n }\n\n static getRewardGrowthInside(\n tickCurrentIndex: number,\n tickLowerState: ReturnType<typeof TickLayout.decode>,\n tickUpperState: ReturnType<typeof TickLayout.decode>,\n rewardInfos: { growthGlobalX64: BN }[]\n ): BN[] {\n const rewardGrowthsInside: BN[] = []\n for (let i = 0; i < rewardInfos.length; i++) {\n let rewardGrowthsBelow = new BN(0)\n if (tickLowerState.liquidityGross.eqn(0)) {\n rewardGrowthsBelow = rewardInfos[i].growthGlobalX64\n } else if (tickCurrentIndex < tickLowerState.tick) {\n rewardGrowthsBelow = wrappingSubU128(rewardInfos[i].growthGlobalX64, tickLowerState.rewardGrowthsOutsideX64[i])\n } else {\n rewardGrowthsBelow = tickLowerState.rewardGrowthsOutsideX64[i]\n }\n\n let rewardGrowthsAbove = new BN(0)\n if (tickUpperState.liquidityGross.eqn(0)) {\n //\n } else if (tickCurrentIndex < tickUpperState.tick) {\n rewardGrowthsAbove = tickUpperState.rewardGrowthsOutsideX64[i]\n } else {\n rewardGrowthsAbove = wrappingSubU128(rewardInfos[i].growthGlobalX64, tickUpperState.rewardGrowthsOutsideX64[i])\n }\n\n rewardGrowthsInside.push(\n wrappingSubU128(\n wrappingSubU128(rewardInfos[i].growthGlobalX64, rewardGrowthsBelow),\n rewardGrowthsAbove,\n ),\n )\n }\n\n return rewardGrowthsInside\n }\n}\n","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"],"mappings":"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","names":[]}