@byreal-io/byreal-clmm-sdk 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +341 -0
- package/dist/esm/client/chain.d.ts +227 -0
- package/dist/esm/client/chain.d.ts.map +1 -0
- package/dist/esm/client/chain.js +1123 -0
- package/dist/esm/client/chain.js.map +1 -0
- package/dist/esm/client/index.d.ts +4 -0
- package/dist/esm/client/index.d.ts.map +1 -0
- package/dist/esm/client/index.js +4 -0
- package/dist/esm/client/index.js.map +1 -0
- package/dist/esm/client/models.d.ts +160 -0
- package/dist/esm/client/models.d.ts.map +1 -0
- package/dist/esm/client/models.js +2 -0
- package/dist/esm/client/models.js.map +1 -0
- package/dist/esm/client/utils.d.ts +103 -0
- package/dist/esm/client/utils.d.ts.map +1 -0
- package/dist/esm/client/utils.js +238 -0
- package/dist/esm/client/utils.js.map +1 -0
- package/dist/esm/constants.d.ts +19 -0
- package/dist/esm/constants.d.ts.map +1 -0
- package/dist/esm/constants.js +27 -0
- package/dist/esm/constants.js.map +1 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/instructions/baseInstruction.d.ts +74 -0
- package/dist/esm/instructions/baseInstruction.d.ts.map +1 -0
- package/dist/esm/instructions/baseInstruction.js +577 -0
- package/dist/esm/instructions/baseInstruction.js.map +1 -0
- package/dist/esm/instructions/constants.d.ts +29 -0
- package/dist/esm/instructions/constants.d.ts.map +1 -0
- package/dist/esm/instructions/constants.js +32 -0
- package/dist/esm/instructions/constants.js.map +1 -0
- package/dist/esm/instructions/getRawData.d.ts +60 -0
- package/dist/esm/instructions/getRawData.d.ts.map +1 -0
- package/dist/esm/instructions/getRawData.js +105 -0
- package/dist/esm/instructions/getRawData.js.map +1 -0
- package/dist/esm/instructions/index.d.ts +9 -0
- package/dist/esm/instructions/index.d.ts.map +1 -0
- package/dist/esm/instructions/index.js +9 -0
- package/dist/esm/instructions/index.js.map +1 -0
- package/dist/esm/instructions/instruction.d.ts +137 -0
- package/dist/esm/instructions/instruction.d.ts.map +1 -0
- package/dist/esm/instructions/instruction.js +152 -0
- package/dist/esm/instructions/instruction.js.map +1 -0
- package/dist/esm/instructions/layout.d.ts +217 -0
- package/dist/esm/instructions/layout.d.ts.map +1 -0
- package/dist/esm/instructions/layout.js +203 -0
- package/dist/esm/instructions/layout.js.map +1 -0
- package/dist/esm/instructions/libs/marshmallow/bufferLayout.d.ts +107 -0
- package/dist/esm/instructions/libs/marshmallow/bufferLayout.d.ts.map +1 -0
- package/dist/esm/instructions/libs/marshmallow/bufferLayout.js +49 -0
- package/dist/esm/instructions/libs/marshmallow/bufferLayout.js.map +1 -0
- package/dist/esm/instructions/libs/marshmallow/index.d.ts +88 -0
- package/dist/esm/instructions/libs/marshmallow/index.d.ts.map +1 -0
- package/dist/esm/instructions/libs/marshmallow/index.js +256 -0
- package/dist/esm/instructions/libs/marshmallow/index.js.map +1 -0
- package/dist/esm/instructions/models.d.ts +39 -0
- package/dist/esm/instructions/models.d.ts.map +1 -0
- package/dist/esm/instructions/models.js +14 -0
- package/dist/esm/instructions/models.js.map +1 -0
- package/dist/esm/instructions/pda.d.ts +52 -0
- package/dist/esm/instructions/pda.d.ts.map +1 -0
- package/dist/esm/instructions/pda.js +47 -0
- package/dist/esm/instructions/pda.js.map +1 -0
- package/dist/esm/instructions/target/idl/byreal_amm_v3.json +7242 -0
- package/dist/esm/instructions/target/idl/byreal_amm_v3_test.json +7680 -0
- package/dist/esm/instructions/target/types/byreal_amm_v3.d.ts +5329 -0
- package/dist/esm/instructions/target/types/byreal_amm_v3.d.ts.map +1 -0
- package/dist/esm/instructions/target/types/byreal_amm_v3.js +2 -0
- package/dist/esm/instructions/target/types/byreal_amm_v3.js.map +1 -0
- package/dist/esm/instructions/target/types/raydium_amm_v3.d.ts +4149 -0
- package/dist/esm/instructions/target/types/raydium_amm_v3.d.ts.map +1 -0
- package/dist/esm/instructions/target/types/raydium_amm_v3.js +2 -0
- package/dist/esm/instructions/target/types/raydium_amm_v3.js.map +1 -0
- package/dist/esm/instructions/utils/binaryUtils.d.ts +11 -0
- package/dist/esm/instructions/utils/binaryUtils.d.ts.map +1 -0
- package/dist/esm/instructions/utils/binaryUtils.js +77 -0
- package/dist/esm/instructions/utils/binaryUtils.js.map +1 -0
- package/dist/esm/instructions/utils/fetchWalletTokenAccounts.d.ts +42 -0
- package/dist/esm/instructions/utils/fetchWalletTokenAccounts.d.ts.map +1 -0
- package/dist/esm/instructions/utils/fetchWalletTokenAccounts.js +63 -0
- package/dist/esm/instructions/utils/fetchWalletTokenAccounts.js.map +1 -0
- package/dist/esm/instructions/utils/getTickArrayBitmapExtension.d.ts +8 -0
- package/dist/esm/instructions/utils/getTickArrayBitmapExtension.d.ts.map +1 -0
- package/dist/esm/instructions/utils/getTickArrayBitmapExtension.js +22 -0
- package/dist/esm/instructions/utils/getTickArrayBitmapExtension.js.map +1 -0
- package/dist/esm/instructions/utils/getTickArrayInfo.d.ts +16 -0
- package/dist/esm/instructions/utils/getTickArrayInfo.d.ts.map +1 -0
- package/dist/esm/instructions/utils/getTickArrayInfo.js +75 -0
- package/dist/esm/instructions/utils/getTickArrayInfo.js.map +1 -0
- package/dist/esm/instructions/utils/index.d.ts +21 -0
- package/dist/esm/instructions/utils/index.d.ts.map +1 -0
- package/dist/esm/instructions/utils/index.js +21 -0
- package/dist/esm/instructions/utils/index.js.map +1 -0
- package/dist/esm/instructions/utils/liquidityMath.d.ts +30 -0
- package/dist/esm/instructions/utils/liquidityMath.d.ts.map +1 -0
- package/dist/esm/instructions/utils/liquidityMath.js +138 -0
- package/dist/esm/instructions/utils/liquidityMath.js.map +1 -0
- package/dist/esm/instructions/utils/mathUtils.d.ts +11 -0
- package/dist/esm/instructions/utils/mathUtils.d.ts.map +1 -0
- package/dist/esm/instructions/utils/mathUtils.js +36 -0
- package/dist/esm/instructions/utils/mathUtils.js.map +1 -0
- package/dist/esm/instructions/utils/models.d.ts +93 -0
- package/dist/esm/instructions/utils/models.d.ts.map +1 -0
- package/dist/esm/instructions/utils/models.js +13 -0
- package/dist/esm/instructions/utils/models.js.map +1 -0
- package/dist/esm/instructions/utils/poolStateUtils.d.ts +134 -0
- package/dist/esm/instructions/utils/poolStateUtils.d.ts.map +1 -0
- package/dist/esm/instructions/utils/poolStateUtils.js +137 -0
- package/dist/esm/instructions/utils/poolStateUtils.js.map +1 -0
- package/dist/esm/instructions/utils/poolUtils.d.ts +136 -0
- package/dist/esm/instructions/utils/poolUtils.d.ts.map +1 -0
- package/dist/esm/instructions/utils/poolUtils.js +219 -0
- package/dist/esm/instructions/utils/poolUtils.js.map +1 -0
- package/dist/esm/instructions/utils/position.d.ts +36 -0
- package/dist/esm/instructions/utils/position.d.ts.map +1 -0
- package/dist/esm/instructions/utils/position.js +86 -0
- package/dist/esm/instructions/utils/position.js.map +1 -0
- package/dist/esm/instructions/utils/sqrtPriceMath.d.ts +14 -0
- package/dist/esm/instructions/utils/sqrtPriceMath.d.ts.map +1 -0
- package/dist/esm/instructions/utils/sqrtPriceMath.js +168 -0
- package/dist/esm/instructions/utils/sqrtPriceMath.js.map +1 -0
- package/dist/esm/instructions/utils/swapMath.d.ts +48 -0
- package/dist/esm/instructions/utils/swapMath.d.ts.map +1 -0
- package/dist/esm/instructions/utils/swapMath.js +263 -0
- package/dist/esm/instructions/utils/swapMath.js.map +1 -0
- package/dist/esm/instructions/utils/tick.d.ts +106 -0
- package/dist/esm/instructions/utils/tick.d.ts.map +1 -0
- package/dist/esm/instructions/utils/tick.js +390 -0
- package/dist/esm/instructions/utils/tick.js.map +1 -0
- package/dist/esm/instructions/utils/tickArrayUtils.d.ts +50 -0
- package/dist/esm/instructions/utils/tickArrayUtils.d.ts.map +1 -0
- package/dist/esm/instructions/utils/tickArrayUtils.js +157 -0
- package/dist/esm/instructions/utils/tickArrayUtils.js.map +1 -0
- package/dist/esm/instructions/utils/tickMath.d.ts +18 -0
- package/dist/esm/instructions/utils/tickMath.d.ts.map +1 -0
- package/dist/esm/instructions/utils/tickMath.js +34 -0
- package/dist/esm/instructions/utils/tickMath.js.map +1 -0
- package/dist/esm/instructions/utils/tickarrayBitmap.d.ts +38 -0
- package/dist/esm/instructions/utils/tickarrayBitmap.d.ts.map +1 -0
- package/dist/esm/instructions/utils/tickarrayBitmap.js +157 -0
- package/dist/esm/instructions/utils/tickarrayBitmap.js.map +1 -0
- package/dist/esm/instructions/utils/transfer.d.ts +7 -0
- package/dist/esm/instructions/utils/transfer.d.ts.map +1 -0
- package/dist/esm/instructions/utils/transfer.js +78 -0
- package/dist/esm/instructions/utils/transfer.js.map +1 -0
- package/dist/esm/utils/accountInfo.d.ts +27 -0
- package/dist/esm/utils/accountInfo.d.ts.map +1 -0
- package/dist/esm/utils/accountInfo.js +80 -0
- package/dist/esm/utils/accountInfo.js.map +1 -0
- package/dist/esm/utils/checkV0TxSize.d.ts +8 -0
- package/dist/esm/utils/checkV0TxSize.d.ts.map +1 -0
- package/dist/esm/utils/checkV0TxSize.js +18 -0
- package/dist/esm/utils/checkV0TxSize.js.map +1 -0
- package/dist/esm/utils/estimateComputeUnits.d.ts +11 -0
- package/dist/esm/utils/estimateComputeUnits.d.ts.map +1 -0
- package/dist/esm/utils/estimateComputeUnits.js +48 -0
- package/dist/esm/utils/estimateComputeUnits.js.map +1 -0
- package/dist/esm/utils/generatePubKey.d.ts +10 -0
- package/dist/esm/utils/generatePubKey.d.ts.map +1 -0
- package/dist/esm/utils/generatePubKey.js +14 -0
- package/dist/esm/utils/generatePubKey.js.map +1 -0
- package/dist/esm/utils/index.d.ts +9 -0
- package/dist/esm/utils/index.d.ts.map +1 -0
- package/dist/esm/utils/index.js +11 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/token.d.ts +9 -0
- package/dist/esm/utils/token.d.ts.map +1 -0
- package/dist/esm/utils/token.js +16 -0
- package/dist/esm/utils/token.js.map +1 -0
- package/dist/esm/utils/transactionUtils.d.ts +84 -0
- package/dist/esm/utils/transactionUtils.d.ts.map +1 -0
- package/dist/esm/utils/transactionUtils.js +138 -0
- package/dist/esm/utils/transactionUtils.js.map +1 -0
- package/dist/esm/utils/validateAndParsePublicKey.d.ts +15 -0
- package/dist/esm/utils/validateAndParsePublicKey.d.ts.map +1 -0
- package/dist/esm/utils/validateAndParsePublicKey.js +42 -0
- package/dist/esm/utils/validateAndParsePublicKey.js.map +1 -0
- package/package.json +66 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import BN from 'bn.js';
|
|
2
|
+
export declare class LiquidityMath {
|
|
3
|
+
static addDelta(x: BN, y: BN): BN;
|
|
4
|
+
static getTokenAmountAFromLiquidity(sqrtPriceX64A: BN, sqrtPriceX64B: BN, liquidity: BN, roundUp: boolean): BN;
|
|
5
|
+
static getTokenAmountBFromLiquidity(sqrtPriceX64A: BN, sqrtPriceX64B: BN, liquidity: BN, roundUp: boolean): BN;
|
|
6
|
+
static getLiquidityFromTokenAmountA(sqrtPriceX64A: BN, sqrtPriceX64B: BN, amountA: BN, roundUp: boolean): BN;
|
|
7
|
+
static getLiquidityFromTokenAmountB(sqrtPriceX64A: BN, sqrtPriceX64B: BN, amountB: BN): BN;
|
|
8
|
+
static getLiquidityFromTokenAmounts(sqrtPriceCurrentX64: BN, sqrtPriceX64A: BN, sqrtPriceX64B: BN, amountA: BN, amountB: BN): BN;
|
|
9
|
+
static getAmountsFromLiquidity(sqrtPriceCurrentX64: BN, sqrtPriceX64A: BN, sqrtPriceX64B: BN, liquidity: BN, roundUp: boolean): {
|
|
10
|
+
amountA: BN;
|
|
11
|
+
amountB: BN;
|
|
12
|
+
};
|
|
13
|
+
static getAmountsFromLiquidityWithSlippage(sqrtPriceCurrentX64: BN, sqrtPriceX64A: BN, sqrtPriceX64B: BN, liquidity: BN, amountMax: boolean, roundUp: boolean, amountSlippage: number): {
|
|
14
|
+
amountSlippageA: BN;
|
|
15
|
+
amountSlippageB: BN;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Given a price range, calculate the required tokenB amount after investing a specified tokenA amount
|
|
19
|
+
*
|
|
20
|
+
* Similar implementation in raydium: getLiquidityAmountOutFromAmountIn
|
|
21
|
+
*/
|
|
22
|
+
static getAmountBFromAmountA(startSqrtPriceX64: BN, endSqrtPriceX64: BN, currentSqrtPriceX64: BN, amountA: BN): BN;
|
|
23
|
+
/**
|
|
24
|
+
* Given a price range, calculate the required tokenA amount after investing a specified tokenB amount
|
|
25
|
+
*
|
|
26
|
+
* Similar implementation in raydium: getLiquidityAmountOutFromAmountIn
|
|
27
|
+
*/
|
|
28
|
+
static getAmountAFromAmountB(startSqrtPriceX64: BN, endSqrtPriceX64: BN, currentSqrtPriceX64: BN, amountB: BN): BN;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=liquidityMath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquidityMath.d.ts","sourceRoot":"","sources":["../../../../src/instructions/utils/liquidityMath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,OAAO,CAAC;AAOvB,qBAAa,aAAa;WACV,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE;WAI1B,4BAA4B,CACxC,aAAa,EAAE,EAAE,EACjB,aAAa,EAAE,EAAE,EACjB,SAAS,EAAE,EAAE,EACb,OAAO,EAAE,OAAO,GACf,EAAE;WAiBS,4BAA4B,CACxC,aAAa,EAAE,EAAE,EACjB,aAAa,EAAE,EAAE,EACjB,SAAS,EAAE,EAAE,EACb,OAAO,EAAE,OAAO,GACf,EAAE;WAaS,4BAA4B,CAAC,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE;WAgBrG,4BAA4B,CAAC,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE;WAOnF,4BAA4B,CACxC,mBAAmB,EAAE,EAAE,EACvB,aAAa,EAAE,EAAE,EACjB,aAAa,EAAE,EAAE,EACjB,OAAO,EAAE,EAAE,EACX,OAAO,EAAE,EAAE,GACV,EAAE;WAgBS,uBAAuB,CACnC,mBAAmB,EAAE,EAAE,EACvB,aAAa,EAAE,EAAE,EACjB,aAAa,EAAE,EAAE,EACjB,SAAS,EAAE,EAAE,EACb,OAAO,EAAE,OAAO,GACf;QAAE,OAAO,EAAE,EAAE,CAAC;QAAC,OAAO,EAAE,EAAE,CAAA;KAAE;WAgCjB,mCAAmC,CAC/C,mBAAmB,EAAE,EAAE,EACvB,aAAa,EAAE,EAAE,EACjB,aAAa,EAAE,EAAE,EACjB,SAAS,EAAE,EAAE,EACb,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,MAAM,GACrB;QAAE,eAAe,EAAE,EAAE,CAAC;QAAC,eAAe,EAAE,EAAE,CAAA;KAAE;IAkB/C;;;;OAIG;WACW,qBAAqB,CACjC,iBAAiB,EAAE,EAAE,EACrB,eAAe,EAAE,EAAE,EACnB,mBAAmB,EAAE,EAAE,EACvB,OAAO,EAAE,EAAE,GACV,EAAE;IAgBL;;;;OAIG;WACW,qBAAqB,CACjC,iBAAiB,EAAE,EAAE,EACrB,eAAe,EAAE,EAAE,EACnB,mBAAmB,EAAE,EAAE,EACvB,OAAO,EAAE,EAAE,GACV,EAAE;CAcN"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import BN from 'bn.js';
|
|
2
|
+
import { Decimal } from 'decimal.js';
|
|
3
|
+
import { MaxU64, ONE, Q64, U64Resolution, ZERO } from '../constants.js';
|
|
4
|
+
import { MathUtils } from './mathUtils.js';
|
|
5
|
+
export class LiquidityMath {
|
|
6
|
+
static addDelta(x, y) {
|
|
7
|
+
return x.add(y);
|
|
8
|
+
}
|
|
9
|
+
static getTokenAmountAFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp) {
|
|
10
|
+
if (sqrtPriceX64A.gt(sqrtPriceX64B)) {
|
|
11
|
+
[sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];
|
|
12
|
+
}
|
|
13
|
+
if (!sqrtPriceX64A.gt(ZERO)) {
|
|
14
|
+
throw new Error('sqrtPriceX64A must greater than 0');
|
|
15
|
+
}
|
|
16
|
+
const numerator1 = liquidity.ushln(U64Resolution);
|
|
17
|
+
const numerator2 = sqrtPriceX64B.sub(sqrtPriceX64A);
|
|
18
|
+
return roundUp
|
|
19
|
+
? MathUtils.mulDivRoundingUp(MathUtils.mulDivCeil(numerator1, numerator2, sqrtPriceX64B), ONE, sqrtPriceX64A)
|
|
20
|
+
: MathUtils.mulDivFloor(numerator1, numerator2, sqrtPriceX64B).div(sqrtPriceX64A);
|
|
21
|
+
}
|
|
22
|
+
static getTokenAmountBFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp) {
|
|
23
|
+
if (sqrtPriceX64A.gt(sqrtPriceX64B)) {
|
|
24
|
+
[sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];
|
|
25
|
+
}
|
|
26
|
+
if (!sqrtPriceX64A.gt(ZERO)) {
|
|
27
|
+
throw new Error('sqrtPriceX64A must greater than 0');
|
|
28
|
+
}
|
|
29
|
+
return roundUp
|
|
30
|
+
? MathUtils.mulDivCeil(liquidity, sqrtPriceX64B.sub(sqrtPriceX64A), Q64)
|
|
31
|
+
: MathUtils.mulDivFloor(liquidity, sqrtPriceX64B.sub(sqrtPriceX64A), Q64);
|
|
32
|
+
}
|
|
33
|
+
static getLiquidityFromTokenAmountA(sqrtPriceX64A, sqrtPriceX64B, amountA, roundUp) {
|
|
34
|
+
if (sqrtPriceX64A.gt(sqrtPriceX64B)) {
|
|
35
|
+
[sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];
|
|
36
|
+
}
|
|
37
|
+
const numerator = amountA.mul(sqrtPriceX64A).mul(sqrtPriceX64B);
|
|
38
|
+
const denominator = sqrtPriceX64B.sub(sqrtPriceX64A);
|
|
39
|
+
const result = numerator.div(denominator);
|
|
40
|
+
if (roundUp) {
|
|
41
|
+
return MathUtils.mulDivRoundingUp(result, ONE, MaxU64);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return result.shrn(U64Resolution);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
static getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64B, amountB) {
|
|
48
|
+
if (sqrtPriceX64A.gt(sqrtPriceX64B)) {
|
|
49
|
+
[sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];
|
|
50
|
+
}
|
|
51
|
+
return MathUtils.mulDivFloor(amountB, MaxU64, sqrtPriceX64B.sub(sqrtPriceX64A));
|
|
52
|
+
}
|
|
53
|
+
static getLiquidityFromTokenAmounts(sqrtPriceCurrentX64, sqrtPriceX64A, sqrtPriceX64B, amountA, amountB) {
|
|
54
|
+
if (sqrtPriceX64A.gt(sqrtPriceX64B)) {
|
|
55
|
+
[sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];
|
|
56
|
+
}
|
|
57
|
+
if (sqrtPriceCurrentX64.lte(sqrtPriceX64A)) {
|
|
58
|
+
return LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceX64A, sqrtPriceX64B, amountA, false);
|
|
59
|
+
}
|
|
60
|
+
else if (sqrtPriceCurrentX64.lt(sqrtPriceX64B)) {
|
|
61
|
+
const liquidity0 = LiquidityMath.getLiquidityFromTokenAmountA(sqrtPriceCurrentX64, sqrtPriceX64B, amountA, false);
|
|
62
|
+
const liquidity1 = LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceCurrentX64, amountB);
|
|
63
|
+
return liquidity0.lt(liquidity1) ? liquidity0 : liquidity1;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
return LiquidityMath.getLiquidityFromTokenAmountB(sqrtPriceX64A, sqrtPriceX64B, amountB);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
static getAmountsFromLiquidity(sqrtPriceCurrentX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp) {
|
|
70
|
+
if (sqrtPriceX64A.gt(sqrtPriceX64B)) {
|
|
71
|
+
[sqrtPriceX64A, sqrtPriceX64B] = [sqrtPriceX64B, sqrtPriceX64A];
|
|
72
|
+
}
|
|
73
|
+
if (sqrtPriceCurrentX64.lte(sqrtPriceX64A)) {
|
|
74
|
+
return {
|
|
75
|
+
amountA: LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp),
|
|
76
|
+
amountB: new BN(0),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
else if (sqrtPriceCurrentX64.lt(sqrtPriceX64B)) {
|
|
80
|
+
const amountA = LiquidityMath.getTokenAmountAFromLiquidity(sqrtPriceCurrentX64, sqrtPriceX64B, liquidity, roundUp);
|
|
81
|
+
const amountB = LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64A, sqrtPriceCurrentX64, liquidity, roundUp);
|
|
82
|
+
return { amountA, amountB };
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
return {
|
|
86
|
+
amountA: new BN(0),
|
|
87
|
+
amountB: LiquidityMath.getTokenAmountBFromLiquidity(sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
static getAmountsFromLiquidityWithSlippage(sqrtPriceCurrentX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, amountMax, roundUp, amountSlippage) {
|
|
92
|
+
const { amountA, amountB } = LiquidityMath.getAmountsFromLiquidity(sqrtPriceCurrentX64, sqrtPriceX64A, sqrtPriceX64B, liquidity, roundUp);
|
|
93
|
+
const coefficient = amountMax ? 1 + amountSlippage : 1 - amountSlippage;
|
|
94
|
+
const amount0Slippage = new BN(new Decimal(amountA.toString()).mul(coefficient).toFixed(0));
|
|
95
|
+
const amount1Slippage = new BN(new Decimal(amountB.toString()).mul(coefficient).toFixed(0));
|
|
96
|
+
return {
|
|
97
|
+
amountSlippageA: amount0Slippage,
|
|
98
|
+
amountSlippageB: amount1Slippage,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Given a price range, calculate the required tokenB amount after investing a specified tokenA amount
|
|
103
|
+
*
|
|
104
|
+
* Similar implementation in raydium: getLiquidityAmountOutFromAmountIn
|
|
105
|
+
*/
|
|
106
|
+
static getAmountBFromAmountA(startSqrtPriceX64, endSqrtPriceX64, currentSqrtPriceX64, amountA) {
|
|
107
|
+
if (startSqrtPriceX64.gt(endSqrtPriceX64)) {
|
|
108
|
+
[startSqrtPriceX64, endSqrtPriceX64] = [endSqrtPriceX64, startSqrtPriceX64];
|
|
109
|
+
}
|
|
110
|
+
if (currentSqrtPriceX64.lte(startSqrtPriceX64)) {
|
|
111
|
+
return new BN(0);
|
|
112
|
+
}
|
|
113
|
+
if (currentSqrtPriceX64.gt(endSqrtPriceX64)) {
|
|
114
|
+
return new BN(0);
|
|
115
|
+
}
|
|
116
|
+
const liquidity = LiquidityMath.getLiquidityFromTokenAmountA(currentSqrtPriceX64, endSqrtPriceX64, amountA, false);
|
|
117
|
+
return LiquidityMath.getTokenAmountBFromLiquidity(startSqrtPriceX64, currentSqrtPriceX64, liquidity, true);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Given a price range, calculate the required tokenA amount after investing a specified tokenB amount
|
|
121
|
+
*
|
|
122
|
+
* Similar implementation in raydium: getLiquidityAmountOutFromAmountIn
|
|
123
|
+
*/
|
|
124
|
+
static getAmountAFromAmountB(startSqrtPriceX64, endSqrtPriceX64, currentSqrtPriceX64, amountB) {
|
|
125
|
+
if (startSqrtPriceX64.gt(endSqrtPriceX64)) {
|
|
126
|
+
[startSqrtPriceX64, endSqrtPriceX64] = [endSqrtPriceX64, startSqrtPriceX64];
|
|
127
|
+
}
|
|
128
|
+
if (currentSqrtPriceX64.lte(startSqrtPriceX64)) {
|
|
129
|
+
return new BN(0);
|
|
130
|
+
}
|
|
131
|
+
if (currentSqrtPriceX64.gt(endSqrtPriceX64)) {
|
|
132
|
+
return new BN(0);
|
|
133
|
+
}
|
|
134
|
+
const liquidity = LiquidityMath.getLiquidityFromTokenAmountB(startSqrtPriceX64, currentSqrtPriceX64, amountB);
|
|
135
|
+
return LiquidityMath.getTokenAmountAFromLiquidity(currentSqrtPriceX64, endSqrtPriceX64, liquidity, true);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=liquidityMath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"liquidityMath.js","sourceRoot":"","sources":["../../../../src/instructions/utils/liquidityMath.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import BN from 'bn.js';
|
|
2
|
+
import { Decimal } from 'decimal.js';
|
|
3
|
+
export declare class MathUtils {
|
|
4
|
+
static mulDivRoundingUp(a: BN, b: BN, denominator: BN): BN;
|
|
5
|
+
static mulDivFloor(a: BN, b: BN, denominator: BN): BN;
|
|
6
|
+
static mulDivCeil(a: BN, b: BN, denominator: BN): BN;
|
|
7
|
+
static x64ToDecimal(num: BN, decimalPlaces?: number): Decimal;
|
|
8
|
+
static decimalToX64(num: Decimal): BN;
|
|
9
|
+
static wrappingSubU128(n0: BN, n1: BN): BN;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=mathUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mathUtils.d.ts","sourceRoot":"","sources":["../../../../src/instructions/utils/mathUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,OAAO,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAIrC,qBAAa,SAAS;WACN,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE;WASnD,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE;WAO9C,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE;WAQ7C,YAAY,CAAC,GAAG,EAAE,EAAE,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO;WAItD,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,EAAE;WAI9B,eAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE;CAGlD"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import BN from 'bn.js';
|
|
2
|
+
import { Decimal } from 'decimal.js';
|
|
3
|
+
import { ONE, Q128, ZERO } from '../constants.js';
|
|
4
|
+
export class MathUtils {
|
|
5
|
+
static mulDivRoundingUp(a, b, denominator) {
|
|
6
|
+
const numerator = a.mul(b);
|
|
7
|
+
let result = numerator.div(denominator);
|
|
8
|
+
if (!numerator.mod(denominator).eq(ZERO)) {
|
|
9
|
+
result = result.add(ONE);
|
|
10
|
+
}
|
|
11
|
+
return result;
|
|
12
|
+
}
|
|
13
|
+
static mulDivFloor(a, b, denominator) {
|
|
14
|
+
if (denominator.eq(ZERO)) {
|
|
15
|
+
throw new Error('division by 0');
|
|
16
|
+
}
|
|
17
|
+
return a.mul(b).div(denominator);
|
|
18
|
+
}
|
|
19
|
+
static mulDivCeil(a, b, denominator) {
|
|
20
|
+
if (denominator.eq(ZERO)) {
|
|
21
|
+
throw new Error('division by 0');
|
|
22
|
+
}
|
|
23
|
+
const numerator = a.mul(b).add(denominator.sub(ONE));
|
|
24
|
+
return numerator.div(denominator);
|
|
25
|
+
}
|
|
26
|
+
static x64ToDecimal(num, decimalPlaces) {
|
|
27
|
+
return new Decimal(num.toString()).div(Decimal.pow(2, 64)).toDecimalPlaces(decimalPlaces);
|
|
28
|
+
}
|
|
29
|
+
static decimalToX64(num) {
|
|
30
|
+
return new BN(num.mul(Decimal.pow(2, 64)).floor().toFixed());
|
|
31
|
+
}
|
|
32
|
+
static wrappingSubU128(n0, n1) {
|
|
33
|
+
return n0.add(Q128).sub(n1).mod(Q128);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=mathUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mathUtils.js","sourceRoot":"","sources":["../../../../src/instructions/utils/mathUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,OAAO,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,OAAO,SAAS;IACb,MAAM,CAAC,gBAAgB,CAAC,CAAK,EAAE,CAAK,EAAE,WAAe;QAC1D,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,MAAM,CAAC,WAAW,CAAC,CAAK,EAAE,CAAK,EAAE,WAAe;QACrD,IAAI,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,CAAK,EAAE,CAAK,EAAE,WAAe;QACpD,IAAI,WAAW,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,OAAO,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACpC,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,GAAO,EAAE,aAAsB;QACxD,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;IAC5F,CAAC;IAEM,MAAM,CAAC,YAAY,CAAC,GAAY;QACrC,OAAO,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAEM,MAAM,CAAC,eAAe,CAAC,EAAM,EAAE,EAAM;QAC1C,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;CACF"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { PublicKey } from '@solana/web3.js';
|
|
2
|
+
import BN from 'bn.js';
|
|
3
|
+
import { Decimal } from 'decimal.js';
|
|
4
|
+
export interface ReturnTypeGetPriceAndTick {
|
|
5
|
+
tick: number;
|
|
6
|
+
price: Decimal;
|
|
7
|
+
}
|
|
8
|
+
export type Tick = {
|
|
9
|
+
tick: number;
|
|
10
|
+
liquidityNet: BN;
|
|
11
|
+
liquidityGross: BN;
|
|
12
|
+
feeGrowthOutsideX64A: BN;
|
|
13
|
+
feeGrowthOutsideX64B: BN;
|
|
14
|
+
rewardGrowthsOutsideX64: BN[];
|
|
15
|
+
};
|
|
16
|
+
export type TickArray = {
|
|
17
|
+
address: PublicKey;
|
|
18
|
+
poolId: PublicKey;
|
|
19
|
+
startTickIndex: number;
|
|
20
|
+
ticks: Tick[];
|
|
21
|
+
initializedTickCount: number;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Dynamic Tick Array type
|
|
25
|
+
* Uses sparse storage with a mapping table to track allocated tick positions
|
|
26
|
+
*/
|
|
27
|
+
export type DynTickArray = {
|
|
28
|
+
address: PublicKey;
|
|
29
|
+
poolId: PublicKey;
|
|
30
|
+
startTickIndex: number;
|
|
31
|
+
tickOffsetIndex: number[];
|
|
32
|
+
allocTickCount: number;
|
|
33
|
+
initializedTickCount: number;
|
|
34
|
+
ticks: Tick[];
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Unified Tick Array Container
|
|
38
|
+
* Discriminated union to handle both fixed and dynamic tick arrays
|
|
39
|
+
*/
|
|
40
|
+
export type TickArrayContainer = {
|
|
41
|
+
type: 'Fixed';
|
|
42
|
+
data: TickArray;
|
|
43
|
+
} | {
|
|
44
|
+
type: 'Dynamic';
|
|
45
|
+
data: DynTickArray;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Type guard to check if a container is a fixed tick array
|
|
49
|
+
*/
|
|
50
|
+
export declare function isFixedTickArray(container: TickArrayContainer): container is {
|
|
51
|
+
type: 'Fixed';
|
|
52
|
+
data: TickArray;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Type guard to check if a container is a dynamic tick array
|
|
56
|
+
*/
|
|
57
|
+
export declare function isDynamicTickArray(container: TickArrayContainer): container is {
|
|
58
|
+
type: 'Dynamic';
|
|
59
|
+
data: DynTickArray;
|
|
60
|
+
};
|
|
61
|
+
export type TickState = {
|
|
62
|
+
tick: number;
|
|
63
|
+
liquidityNet: BN;
|
|
64
|
+
liquidityGross: BN;
|
|
65
|
+
feeGrowthOutsideX64A: BN;
|
|
66
|
+
feeGrowthOutsideX64B: BN;
|
|
67
|
+
tickCumulativeOutside: BN;
|
|
68
|
+
secondsPerLiquidityOutsideX64: BN;
|
|
69
|
+
secondsOutside: number;
|
|
70
|
+
rewardGrowthsOutside: BN[];
|
|
71
|
+
};
|
|
72
|
+
export type TickArrayState = {
|
|
73
|
+
ammPool: PublicKey;
|
|
74
|
+
startTickIndex: number;
|
|
75
|
+
ticks: TickState[];
|
|
76
|
+
initializedTickCount: number;
|
|
77
|
+
};
|
|
78
|
+
export interface TickArrayBitmapExtensionType {
|
|
79
|
+
poolId: PublicKey;
|
|
80
|
+
exBitmapAddress: PublicKey;
|
|
81
|
+
positiveTickArrayBitmap: BN[][];
|
|
82
|
+
negativeTickArrayBitmap: BN[][];
|
|
83
|
+
}
|
|
84
|
+
export interface StepComputations {
|
|
85
|
+
sqrtPriceStartX64: BN;
|
|
86
|
+
tickNext: number;
|
|
87
|
+
initialized: boolean;
|
|
88
|
+
sqrtPriceNextX64: BN;
|
|
89
|
+
amountIn: BN;
|
|
90
|
+
amountOut: BN;
|
|
91
|
+
feeAmount: BN;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../src/instructions/utils/models.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type guard to check if a container is a fixed tick array
|
|
3
|
+
*/
|
|
4
|
+
export function isFixedTickArray(container) {
|
|
5
|
+
return container.type === 'Fixed';
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Type guard to check if a container is a dynamic tick array
|
|
9
|
+
*/
|
|
10
|
+
export function isDynamicTickArray(container) {
|
|
11
|
+
return container.type === 'Dynamic';
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../src/instructions/utils/models.ts"],"names":[],"mappings":"AA8CA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,SAA6B;IAC5D,OAAO,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAA6B;IAE7B,OAAO,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { Connection, PublicKey } from '@solana/web3.js';
|
|
2
|
+
import { IPoolLayout } from '../layout.js';
|
|
3
|
+
/**
|
|
4
|
+
* Pool State Utilities for querying pool information with decay fee support
|
|
5
|
+
*/
|
|
6
|
+
export declare class PoolStateUtils {
|
|
7
|
+
/**
|
|
8
|
+
* Check if the pool has decay fee enabled
|
|
9
|
+
* @param poolInfo Pool layout information
|
|
10
|
+
* @returns boolean indicating if decay fee is enabled
|
|
11
|
+
*/
|
|
12
|
+
static isDecayFeeEnabled(poolInfo: IPoolLayout): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Check if decay fee is enabled for selling mint0
|
|
15
|
+
* @param poolInfo Pool layout information
|
|
16
|
+
* @returns boolean indicating if decay fee is enabled for mint0 sell
|
|
17
|
+
*/
|
|
18
|
+
static isDecayFeeOnSellMint0(poolInfo: IPoolLayout): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Check if decay fee is enabled for selling mint1
|
|
21
|
+
* @param poolInfo Pool layout information
|
|
22
|
+
* @returns boolean indicating if decay fee is enabled for mint1 sell
|
|
23
|
+
*/
|
|
24
|
+
static isDecayFeeOnSellMint1(poolInfo: IPoolLayout): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Calculate the current decay fee rate based on the current time
|
|
27
|
+
* @param poolInfo Pool layout information
|
|
28
|
+
* @param currentTimestamp Current timestamp in seconds
|
|
29
|
+
* @returns Decay fee rate in hundredths of a bip (10^-6)
|
|
30
|
+
*/
|
|
31
|
+
static getDecayFeeRate(poolInfo: IPoolLayout, currentTimestamp: number): number;
|
|
32
|
+
/**
|
|
33
|
+
* Get comprehensive decay fee information for a pool
|
|
34
|
+
* @param poolInfo Pool layout information
|
|
35
|
+
* @param currentTimestamp Current timestamp in seconds
|
|
36
|
+
* @returns Object containing all decay fee related information
|
|
37
|
+
*/
|
|
38
|
+
static getDecayFeeInfo(poolInfo: IPoolLayout, currentTimestamp?: number): {
|
|
39
|
+
isEnabled: boolean;
|
|
40
|
+
onSellMint0: boolean;
|
|
41
|
+
onSellMint1: boolean;
|
|
42
|
+
initFeeRate: number;
|
|
43
|
+
decreaseRate: number;
|
|
44
|
+
decreaseInterval: number;
|
|
45
|
+
currentFeeRate: number;
|
|
46
|
+
openTime: any;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Get pool state with decay fee information from chain
|
|
50
|
+
* @param connection Solana connection
|
|
51
|
+
* @param poolId Pool address
|
|
52
|
+
* @param currentTimestamp Optional current timestamp
|
|
53
|
+
* @returns Pool information with decay fee details
|
|
54
|
+
*/
|
|
55
|
+
static getPoolStateWithDecayFee(connection: Connection, poolId: string | PublicKey, currentTimestamp?: number): Promise<{
|
|
56
|
+
decayFeeInfo: {
|
|
57
|
+
isEnabled: boolean;
|
|
58
|
+
onSellMint0: boolean;
|
|
59
|
+
onSellMint1: boolean;
|
|
60
|
+
initFeeRate: number;
|
|
61
|
+
decreaseRate: number;
|
|
62
|
+
decreaseInterval: number;
|
|
63
|
+
currentFeeRate: number;
|
|
64
|
+
openTime: any;
|
|
65
|
+
};
|
|
66
|
+
bump: number;
|
|
67
|
+
tickSpacing: number;
|
|
68
|
+
recentEpoch: BN;
|
|
69
|
+
ammConfig: PublicKey;
|
|
70
|
+
creator: PublicKey;
|
|
71
|
+
mintA: PublicKey;
|
|
72
|
+
mintB: PublicKey;
|
|
73
|
+
vaultA: PublicKey;
|
|
74
|
+
vaultB: PublicKey;
|
|
75
|
+
observationId: PublicKey;
|
|
76
|
+
mintDecimalsA: number;
|
|
77
|
+
mintDecimalsB: number;
|
|
78
|
+
liquidity: BN;
|
|
79
|
+
sqrtPriceX64: BN;
|
|
80
|
+
tickCurrent: number;
|
|
81
|
+
feeGrowthGlobalX64A: BN;
|
|
82
|
+
feeGrowthGlobalX64B: BN;
|
|
83
|
+
protocolFeesTokenA: BN;
|
|
84
|
+
protocolFeesTokenB: BN;
|
|
85
|
+
swapInAmountTokenA: BN;
|
|
86
|
+
swapOutAmountTokenB: BN;
|
|
87
|
+
swapInAmountTokenB: BN;
|
|
88
|
+
swapOutAmountTokenA: BN;
|
|
89
|
+
status: number;
|
|
90
|
+
openTime: BN;
|
|
91
|
+
rewardInfos: {
|
|
92
|
+
creator: PublicKey;
|
|
93
|
+
rewardState: number;
|
|
94
|
+
openTime: BN;
|
|
95
|
+
endTime: BN;
|
|
96
|
+
lastUpdateTime: BN;
|
|
97
|
+
emissionsPerSecondX64: BN;
|
|
98
|
+
rewardTotalEmissioned: BN;
|
|
99
|
+
rewardClaimed: BN;
|
|
100
|
+
tokenMint: PublicKey;
|
|
101
|
+
tokenVault: PublicKey;
|
|
102
|
+
rewardGrowthGlobalX64: BN;
|
|
103
|
+
}[];
|
|
104
|
+
tickArrayBitmap: BN[];
|
|
105
|
+
totalFeesTokenA: BN;
|
|
106
|
+
totalFeesClaimedTokenA: BN;
|
|
107
|
+
totalFeesTokenB: BN;
|
|
108
|
+
totalFeesClaimedTokenB: BN;
|
|
109
|
+
fundFeesTokenA: BN;
|
|
110
|
+
fundFeesTokenB: BN;
|
|
111
|
+
decayFeeFlag: number;
|
|
112
|
+
decayFeeInitFeeRate: number;
|
|
113
|
+
decayFeeDecreaseRate: number;
|
|
114
|
+
decayFeeDecreaseInterval: number;
|
|
115
|
+
padding1_1: number[];
|
|
116
|
+
padding1: BN[];
|
|
117
|
+
padding2: BN[];
|
|
118
|
+
currentPrice: number;
|
|
119
|
+
programId: PublicKey;
|
|
120
|
+
poolId: PublicKey;
|
|
121
|
+
}>;
|
|
122
|
+
/**
|
|
123
|
+
* Check if decay fee is currently active for a specific direction
|
|
124
|
+
* @param poolInfo Pool layout information
|
|
125
|
+
* @param zeroForOne True if swapping token0 for token1 (selling token0)
|
|
126
|
+
* @param currentTimestamp Current timestamp in seconds
|
|
127
|
+
* @returns Object with active status and current fee rate
|
|
128
|
+
*/
|
|
129
|
+
static getDecayFeeForDirection(poolInfo: IPoolLayout, zeroForOne: boolean, currentTimestamp?: number): {
|
|
130
|
+
isActive: boolean;
|
|
131
|
+
feeRate: number;
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=poolStateUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poolStateUtils.d.ts","sourceRoot":"","sources":["../../../../src/instructions/utils/poolStateUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGxD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C;;GAEG;AACH,qBAAa,cAAc;IACzB;;;;OAIG;IACH,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;IAIxD;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;IAI5D;;;;OAIG;IACH,MAAM,CAAC,qBAAqB,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO;IAI5D;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM;IAwC/E;;;;;OAKG;IACH,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAAE,MAAM;;;;;;;;;;IAevE;;;;;;OAMG;WACU,wBAAwB,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,gBAAgB,CAAC,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAkBnH;;;;;;OAMG;IACH,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,CAAC,EAAE,MAAM;;;;CA4BrG"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { RawDataUtils } from '../getRawData.js';
|
|
2
|
+
/**
|
|
3
|
+
* Pool State Utilities for querying pool information with decay fee support
|
|
4
|
+
*/
|
|
5
|
+
export class PoolStateUtils {
|
|
6
|
+
/**
|
|
7
|
+
* Check if the pool has decay fee enabled
|
|
8
|
+
* @param poolInfo Pool layout information
|
|
9
|
+
* @returns boolean indicating if decay fee is enabled
|
|
10
|
+
*/
|
|
11
|
+
static isDecayFeeEnabled(poolInfo) {
|
|
12
|
+
return (poolInfo.decayFeeFlag & (1 << 0)) !== 0;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Check if decay fee is enabled for selling mint0
|
|
16
|
+
* @param poolInfo Pool layout information
|
|
17
|
+
* @returns boolean indicating if decay fee is enabled for mint0 sell
|
|
18
|
+
*/
|
|
19
|
+
static isDecayFeeOnSellMint0(poolInfo) {
|
|
20
|
+
return (poolInfo.decayFeeFlag & (1 << 1)) !== 0;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Check if decay fee is enabled for selling mint1
|
|
24
|
+
* @param poolInfo Pool layout information
|
|
25
|
+
* @returns boolean indicating if decay fee is enabled for mint1 sell
|
|
26
|
+
*/
|
|
27
|
+
static isDecayFeeOnSellMint1(poolInfo) {
|
|
28
|
+
return (poolInfo.decayFeeFlag & (1 << 2)) !== 0;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Calculate the current decay fee rate based on the current time
|
|
32
|
+
* @param poolInfo Pool layout information
|
|
33
|
+
* @param currentTimestamp Current timestamp in seconds
|
|
34
|
+
* @returns Decay fee rate in hundredths of a bip (10^-6)
|
|
35
|
+
*/
|
|
36
|
+
static getDecayFeeRate(poolInfo, currentTimestamp) {
|
|
37
|
+
if (!this.isDecayFeeEnabled(poolInfo)) {
|
|
38
|
+
return 0;
|
|
39
|
+
}
|
|
40
|
+
// Pool is not open yet
|
|
41
|
+
if (currentTimestamp < poolInfo.openTime.toNumber()) {
|
|
42
|
+
return 0;
|
|
43
|
+
}
|
|
44
|
+
const intervalCount = Math.floor((currentTimestamp - poolInfo.openTime.toNumber()) / poolInfo.decayFeeDecreaseInterval);
|
|
45
|
+
const decayFeeDecreaseRate = poolInfo.decayFeeDecreaseRate * 10000; // Convert to basis points
|
|
46
|
+
const FEE_RATE_DENOMINATOR_VALUE = 1000000; // 10^6
|
|
47
|
+
const hundredthsOfABip = FEE_RATE_DENOMINATOR_VALUE;
|
|
48
|
+
let rate = hundredthsOfABip;
|
|
49
|
+
// Fast power calculation: (1 - x)^c
|
|
50
|
+
// where x = decayFeeDecreaseRate / 10^6, c = intervalCount
|
|
51
|
+
if (intervalCount > 0) {
|
|
52
|
+
let exp = intervalCount;
|
|
53
|
+
let base = hundredthsOfABip - decayFeeDecreaseRate;
|
|
54
|
+
while (exp > 0) {
|
|
55
|
+
if (exp % 2 === 1) {
|
|
56
|
+
rate = Math.ceil((rate * base) / hundredthsOfABip);
|
|
57
|
+
}
|
|
58
|
+
base = Math.ceil((base * base) / hundredthsOfABip);
|
|
59
|
+
exp = Math.floor(exp / 2);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Apply initial fee rate (convert from percentage)
|
|
63
|
+
rate = Math.ceil((rate * poolInfo.decayFeeInitFeeRate) / 100);
|
|
64
|
+
return rate;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Get comprehensive decay fee information for a pool
|
|
68
|
+
* @param poolInfo Pool layout information
|
|
69
|
+
* @param currentTimestamp Current timestamp in seconds
|
|
70
|
+
* @returns Object containing all decay fee related information
|
|
71
|
+
*/
|
|
72
|
+
static getDecayFeeInfo(poolInfo, currentTimestamp) {
|
|
73
|
+
const timestamp = currentTimestamp || Math.floor(Date.now() / 1000);
|
|
74
|
+
return {
|
|
75
|
+
isEnabled: this.isDecayFeeEnabled(poolInfo),
|
|
76
|
+
onSellMint0: this.isDecayFeeOnSellMint0(poolInfo),
|
|
77
|
+
onSellMint1: this.isDecayFeeOnSellMint1(poolInfo),
|
|
78
|
+
initFeeRate: poolInfo.decayFeeInitFeeRate, // Percentage (1 = 1%)
|
|
79
|
+
decreaseRate: poolInfo.decayFeeDecreaseRate, // Percentage (1 = 1%)
|
|
80
|
+
decreaseInterval: poolInfo.decayFeeDecreaseInterval, // Seconds
|
|
81
|
+
currentFeeRate: this.getDecayFeeRate(poolInfo, timestamp), // In hundredths of a bip (10^-6)
|
|
82
|
+
openTime: poolInfo.openTime.toNumber(),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get pool state with decay fee information from chain
|
|
87
|
+
* @param connection Solana connection
|
|
88
|
+
* @param poolId Pool address
|
|
89
|
+
* @param currentTimestamp Optional current timestamp
|
|
90
|
+
* @returns Pool information with decay fee details
|
|
91
|
+
*/
|
|
92
|
+
static async getPoolStateWithDecayFee(connection, poolId, currentTimestamp) {
|
|
93
|
+
const poolInfo = await RawDataUtils.getRawPoolInfoByPoolId({
|
|
94
|
+
connection,
|
|
95
|
+
poolId,
|
|
96
|
+
});
|
|
97
|
+
if (!poolInfo) {
|
|
98
|
+
throw new Error(`Pool not found: ${poolId}`);
|
|
99
|
+
}
|
|
100
|
+
const decayFeeInfo = this.getDecayFeeInfo(poolInfo, currentTimestamp);
|
|
101
|
+
return {
|
|
102
|
+
...poolInfo,
|
|
103
|
+
decayFeeInfo,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check if decay fee is currently active for a specific direction
|
|
108
|
+
* @param poolInfo Pool layout information
|
|
109
|
+
* @param zeroForOne True if swapping token0 for token1 (selling token0)
|
|
110
|
+
* @param currentTimestamp Current timestamp in seconds
|
|
111
|
+
* @returns Object with active status and current fee rate
|
|
112
|
+
*/
|
|
113
|
+
static getDecayFeeForDirection(poolInfo, zeroForOne, currentTimestamp) {
|
|
114
|
+
const timestamp = currentTimestamp || Math.floor(Date.now() / 1000);
|
|
115
|
+
if (!this.isDecayFeeEnabled(poolInfo)) {
|
|
116
|
+
return {
|
|
117
|
+
isActive: false,
|
|
118
|
+
feeRate: 0,
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const isActiveForDirection = zeroForOne
|
|
122
|
+
? this.isDecayFeeOnSellMint0(poolInfo)
|
|
123
|
+
: this.isDecayFeeOnSellMint1(poolInfo);
|
|
124
|
+
if (!isActiveForDirection) {
|
|
125
|
+
return {
|
|
126
|
+
isActive: false,
|
|
127
|
+
feeRate: 0,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const currentFeeRate = this.getDecayFeeRate(poolInfo, timestamp);
|
|
131
|
+
return {
|
|
132
|
+
isActive: true,
|
|
133
|
+
feeRate: currentFeeRate,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=poolStateUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poolStateUtils.js","sourceRoot":"","sources":["../../../../src/instructions/utils/poolStateUtils.ts"],"names":[],"mappings":"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"}
|