@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,390 @@
|
|
|
1
|
+
import BN from 'bn.js';
|
|
2
|
+
import { Decimal } from 'decimal.js';
|
|
3
|
+
import { TICK_ARRAY_SIZE, TICK_ARRAY_BITMAP_SIZE } from '../../constants.js';
|
|
4
|
+
import { MAX_TICK, MIN_TICK } from '../constants.js';
|
|
5
|
+
import { TickArrayBitmapExtensionUtils } from './tickarrayBitmap.js';
|
|
6
|
+
import { getPdaTickArrayAddress } from '../pda.js';
|
|
7
|
+
import { SqrtPriceMath } from './sqrtPriceMath.js';
|
|
8
|
+
import { TickMath } from './tickMath.js';
|
|
9
|
+
export class TickUtils {
|
|
10
|
+
// Calculate the address of the TickArray corresponding to the given tick index
|
|
11
|
+
static getTickArrayAddressByTick(programId, poolId, tickIndex, tickSpacing) {
|
|
12
|
+
const startIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);
|
|
13
|
+
const { publicKey: tickArrayAddress } = getPdaTickArrayAddress(programId, poolId, startIndex);
|
|
14
|
+
return tickArrayAddress;
|
|
15
|
+
}
|
|
16
|
+
// Calculate the offset of the given tick index within the corresponding TickArray
|
|
17
|
+
static getTickOffsetInArray(tickIndex, tickSpacing) {
|
|
18
|
+
if (tickIndex % tickSpacing != 0) {
|
|
19
|
+
throw new Error('tickIndex % tickSpacing not equal 0');
|
|
20
|
+
}
|
|
21
|
+
const startTickIndex = TickUtils.getTickArrayStartIndexByTick(tickIndex, tickSpacing);
|
|
22
|
+
const offsetInArray = Math.floor((tickIndex - startTickIndex) / tickSpacing);
|
|
23
|
+
if (offsetInArray < 0 || offsetInArray >= TICK_ARRAY_SIZE) {
|
|
24
|
+
throw new Error('tick offset in array overflow');
|
|
25
|
+
}
|
|
26
|
+
return offsetInArray;
|
|
27
|
+
}
|
|
28
|
+
// Calculate the index position of the TickArray corresponding to the given tick index in the bitmap.
|
|
29
|
+
static getTickArrayBitIndex(tickIndex, tickSpacing) {
|
|
30
|
+
const ticksInArray = TickQuery.tickCount(tickSpacing);
|
|
31
|
+
let startIndex = tickIndex / ticksInArray;
|
|
32
|
+
if (tickIndex < 0 && tickIndex % ticksInArray != 0) {
|
|
33
|
+
startIndex = Math.ceil(startIndex) - 1;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
startIndex = Math.floor(startIndex);
|
|
37
|
+
}
|
|
38
|
+
return startIndex;
|
|
39
|
+
}
|
|
40
|
+
// Calculate the start index of the TickArray corresponding to the given tick index
|
|
41
|
+
static getTickArrayStartIndexByTick(tickIndex, tickSpacing) {
|
|
42
|
+
return this.getTickArrayBitIndex(tickIndex, tickSpacing) * TickQuery.tickCount(tickSpacing);
|
|
43
|
+
}
|
|
44
|
+
// Calculate the offset of the TickArray corresponding to the given tick index in the default bitmap
|
|
45
|
+
static getTickArrayOffsetInBitmapByTick(tick, tickSpacing) {
|
|
46
|
+
const multiplier = tickSpacing * TICK_ARRAY_SIZE;
|
|
47
|
+
const compressed = Math.floor(tick / multiplier) + 512;
|
|
48
|
+
return Math.abs(compressed);
|
|
49
|
+
}
|
|
50
|
+
// Check if the TickArray corresponding to the given tick index has been initialized
|
|
51
|
+
static checkTickArrayIsInitialized(bitmap, tick, tickSpacing) {
|
|
52
|
+
const multiplier = tickSpacing * TICK_ARRAY_SIZE;
|
|
53
|
+
const compressed = Math.floor(tick / multiplier) + 512;
|
|
54
|
+
const bitPos = Math.abs(compressed);
|
|
55
|
+
return {
|
|
56
|
+
isInitialized: bitmap.testn(bitPos),
|
|
57
|
+
startIndex: (bitPos - 512) * multiplier,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// Calculate the start index of the next TickArray
|
|
61
|
+
// Can be ignored, referenced by nextInitializedTick, but nextInitializedTick is not used
|
|
62
|
+
static getNextTickArrayStartIndex(lastTickArrayStartIndex, tickSpacing, zeroForOne) {
|
|
63
|
+
return zeroForOne
|
|
64
|
+
? lastTickArrayStartIndex - tickSpacing * TICK_ARRAY_SIZE
|
|
65
|
+
: lastTickArrayStartIndex + tickSpacing * TICK_ARRAY_SIZE;
|
|
66
|
+
}
|
|
67
|
+
// Merge bitmaps of multiple TickArrays
|
|
68
|
+
static mergeTickArrayBitmap(bns) {
|
|
69
|
+
let b = new BN(0);
|
|
70
|
+
for (let i = 0; i < bns.length; i++) {
|
|
71
|
+
b = b.add(bns[i].shln(64 * i));
|
|
72
|
+
}
|
|
73
|
+
return b;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Search for initialized TickArrays around the current position to find the starting indices of a specified number of initialized TickArrays
|
|
77
|
+
*
|
|
78
|
+
* @param tickArrayBitmap - Main tick array bitmap used to mark initialized tick arrays
|
|
79
|
+
* @param exTickArrayBitmap - Extended tick array bitmap containing positive and negative direction extension bitmap information
|
|
80
|
+
* @param tickSpacing - Tick spacing
|
|
81
|
+
* @param tickArrayStartIndex - Starting tick array index for the search
|
|
82
|
+
* @param expectedCount - Expected number of initialized TickArrays to find
|
|
83
|
+
*
|
|
84
|
+
* @returns Array of initialized TickArray starting indices
|
|
85
|
+
*
|
|
86
|
+
* @description
|
|
87
|
+
* This function is used to locate active liquidity around the current price. It searches on both sides of the given starting position:
|
|
88
|
+
* - Search right (higher tick positions)
|
|
89
|
+
* - Search left (lower tick positions)
|
|
90
|
+
* By combining the search results from both directions, it provides the liquidity distribution around the current price
|
|
91
|
+
*/
|
|
92
|
+
static getInitializedTickArrayInRange(tickArrayBitmap, exTickArrayBitmap, tickSpacing, tickArrayStartIndex, expectedCount) {
|
|
93
|
+
const tickArrayOffset = Math.floor(tickArrayStartIndex / (tickSpacing * TICK_ARRAY_SIZE));
|
|
94
|
+
return [
|
|
95
|
+
// find right of currenct offset
|
|
96
|
+
...TickUtils.searchLowBitFromStart(tickArrayBitmap, exTickArrayBitmap, tickArrayOffset - 1, expectedCount, tickSpacing),
|
|
97
|
+
// find left of current offset
|
|
98
|
+
...TickUtils.searchHightBitFromStart(tickArrayBitmap, exTickArrayBitmap, tickArrayOffset, expectedCount, tickSpacing),
|
|
99
|
+
];
|
|
100
|
+
}
|
|
101
|
+
// Get start indices of all initialized TickArrays
|
|
102
|
+
// TODO: The TICK_ARRAY_BITMAP_SIZE passed in this function may not be able to retrieve all initialized TickArrays
|
|
103
|
+
static getAllInitializedTickArrayStartIndex(tickArrayBitmap, exTickArrayBitmap, tickSpacing) {
|
|
104
|
+
// find from offset 0 to 1024
|
|
105
|
+
return TickUtils.searchHightBitFromStart(tickArrayBitmap, exTickArrayBitmap, -7680, TICK_ARRAY_BITMAP_SIZE, tickSpacing);
|
|
106
|
+
}
|
|
107
|
+
// Get information of all initialized TickArrays
|
|
108
|
+
static getAllInitializedTickArrayInfo(programId, poolId, tickArrayBitmap, exTickArrayBitmap, tickSpacing) {
|
|
109
|
+
const result = [];
|
|
110
|
+
const allInitializedTickArrayIndex = TickUtils.getAllInitializedTickArrayStartIndex(tickArrayBitmap, exTickArrayBitmap, tickSpacing);
|
|
111
|
+
for (const startIndex of allInitializedTickArrayIndex) {
|
|
112
|
+
const { publicKey: address } = getPdaTickArrayAddress(programId, poolId, startIndex);
|
|
113
|
+
result.push({
|
|
114
|
+
tickArrayStartIndex: startIndex,
|
|
115
|
+
tickArrayAddress: address,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
// Get all initialized Ticks in the given TickArray
|
|
121
|
+
static getAllInitializedTickInTickArray(tickArray) {
|
|
122
|
+
return tickArray.ticks.filter((i) => i.liquidityGross.gtn(0));
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Search for initialized TickArrays to the left from the starting position
|
|
126
|
+
* Used to locate active liquidity near the current price
|
|
127
|
+
*/
|
|
128
|
+
static searchLowBitFromStart(tickArrayBitmap, exTickArrayBitmap, currentTickArrayBitStartIndex, expectedCount, tickSpacing) {
|
|
129
|
+
const tickArrayBitmaps = [
|
|
130
|
+
...[...exTickArrayBitmap.negativeTickArrayBitmap].reverse(),
|
|
131
|
+
tickArrayBitmap.slice(0, 8),
|
|
132
|
+
tickArrayBitmap.slice(8, 16),
|
|
133
|
+
...exTickArrayBitmap.positiveTickArrayBitmap,
|
|
134
|
+
].map((i) => TickUtils.mergeTickArrayBitmap(i));
|
|
135
|
+
const result = [];
|
|
136
|
+
while (currentTickArrayBitStartIndex >= -7680) {
|
|
137
|
+
const arrayIndex = Math.floor((currentTickArrayBitStartIndex + 7680) / 512);
|
|
138
|
+
const searchIndex = (currentTickArrayBitStartIndex + 7680) % 512;
|
|
139
|
+
if (tickArrayBitmaps[arrayIndex].testn(searchIndex))
|
|
140
|
+
result.push(currentTickArrayBitStartIndex);
|
|
141
|
+
currentTickArrayBitStartIndex--;
|
|
142
|
+
if (result.length === expectedCount)
|
|
143
|
+
break;
|
|
144
|
+
}
|
|
145
|
+
const tickCount = TickQuery.tickCount(tickSpacing);
|
|
146
|
+
return result.map((i) => i * tickCount);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Search for initialized TickArrays to the right from the starting position
|
|
150
|
+
* Used to locate active liquidity near the current price
|
|
151
|
+
*/
|
|
152
|
+
static searchHightBitFromStart(tickArrayBitmap, exTickArrayBitmap, currentTickArrayBitStartIndex, expectedCount, tickSpacing) {
|
|
153
|
+
const tickArrayBitmaps = [
|
|
154
|
+
...[...exTickArrayBitmap.negativeTickArrayBitmap].reverse(),
|
|
155
|
+
tickArrayBitmap.slice(0, 8),
|
|
156
|
+
tickArrayBitmap.slice(8, 16),
|
|
157
|
+
...exTickArrayBitmap.positiveTickArrayBitmap,
|
|
158
|
+
].map((i) => TickUtils.mergeTickArrayBitmap(i));
|
|
159
|
+
const result = [];
|
|
160
|
+
while (currentTickArrayBitStartIndex < 7680) {
|
|
161
|
+
const arrayIndex = Math.floor((currentTickArrayBitStartIndex + 7680) / 512);
|
|
162
|
+
const searchIndex = (currentTickArrayBitStartIndex + 7680) % 512;
|
|
163
|
+
if (tickArrayBitmaps[arrayIndex].testn(searchIndex))
|
|
164
|
+
result.push(currentTickArrayBitStartIndex);
|
|
165
|
+
currentTickArrayBitStartIndex++;
|
|
166
|
+
if (result.length === expectedCount)
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
const tickCount = TickQuery.tickCount(tickSpacing);
|
|
170
|
+
return result.map((i) => i * tickCount);
|
|
171
|
+
}
|
|
172
|
+
// Check if the given tick index is out of bounds
|
|
173
|
+
static checkIsOutOfBoundary(tick) {
|
|
174
|
+
return tick < MIN_TICK || tick > MAX_TICK;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get the next initialized Tick
|
|
178
|
+
* Used to locate active liquidity near the current price
|
|
179
|
+
* Now supports both fixed and dynamic tick arrays through the container pattern
|
|
180
|
+
*/
|
|
181
|
+
static nextInitTick(tickArrayCurrent, currentTickIndex, tickSpacing, zeroForOne, t) {
|
|
182
|
+
if (tickArrayCurrent.type === 'Fixed') {
|
|
183
|
+
return this._nextInitTickFixed(tickArrayCurrent.data, currentTickIndex, tickSpacing, zeroForOne, t);
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
return this._nextInitTickDynamic(tickArrayCurrent.data, currentTickIndex, tickSpacing, zeroForOne, t);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Fixed tick array implementation (original logic)
|
|
191
|
+
*/
|
|
192
|
+
static _nextInitTickFixed(tickArray, currentTickIndex, tickSpacing, zeroForOne, t) {
|
|
193
|
+
const currentTickArrayStartIndex = TickQuery.getArrayStartIndex(currentTickIndex, tickSpacing);
|
|
194
|
+
if (currentTickArrayStartIndex != tickArray.startTickIndex) {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
let offsetInArray = Math.floor((currentTickIndex - tickArray.startTickIndex) / tickSpacing);
|
|
198
|
+
if (zeroForOne) {
|
|
199
|
+
while (offsetInArray >= 0) {
|
|
200
|
+
if (tickArray.ticks[offsetInArray].liquidityGross.gtn(0)) {
|
|
201
|
+
return tickArray.ticks[offsetInArray];
|
|
202
|
+
}
|
|
203
|
+
offsetInArray = offsetInArray - 1;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
if (!t)
|
|
208
|
+
offsetInArray = offsetInArray + 1;
|
|
209
|
+
while (offsetInArray < TICK_ARRAY_SIZE) {
|
|
210
|
+
if (tickArray.ticks[offsetInArray].liquidityGross.gtn(0)) {
|
|
211
|
+
return tickArray.ticks[offsetInArray];
|
|
212
|
+
}
|
|
213
|
+
offsetInArray = offsetInArray + 1;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Dynamic tick array implementation
|
|
220
|
+
* Uses the mapping table (tickOffsetIndex) to find allocated ticks
|
|
221
|
+
*/
|
|
222
|
+
static _nextInitTickDynamic(dynTickArray, currentTickIndex, tickSpacing, zeroForOne, t) {
|
|
223
|
+
const currentTickArrayStartIndex = TickQuery.getArrayStartIndex(currentTickIndex, tickSpacing);
|
|
224
|
+
if (currentTickArrayStartIndex !== dynTickArray.startTickIndex) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
let offsetInArray = Math.floor((currentTickIndex - dynTickArray.startTickIndex) / tickSpacing);
|
|
228
|
+
if (zeroForOne) {
|
|
229
|
+
while (offsetInArray >= 0) {
|
|
230
|
+
// Check mapping table
|
|
231
|
+
const physicalIndex = dynTickArray.tickOffsetIndex[offsetInArray];
|
|
232
|
+
if (physicalIndex > 0) {
|
|
233
|
+
const tick = dynTickArray.ticks[physicalIndex - 1];
|
|
234
|
+
if (tick.liquidityGross.gtn(0)) {
|
|
235
|
+
return tick;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
offsetInArray = offsetInArray - 1;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
if (!t)
|
|
243
|
+
offsetInArray = offsetInArray + 1;
|
|
244
|
+
while (offsetInArray < TICK_ARRAY_SIZE) {
|
|
245
|
+
const physicalIndex = dynTickArray.tickOffsetIndex[offsetInArray];
|
|
246
|
+
if (physicalIndex > 0) {
|
|
247
|
+
const tick = dynTickArray.ticks[physicalIndex - 1];
|
|
248
|
+
if (tick.liquidityGross.gtn(0)) {
|
|
249
|
+
return tick;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
offsetInArray = offsetInArray + 1;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
return null;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Find the first initialized Tick in the given TickArray, where "first" is defined based on the trading direction (zeroForOne)
|
|
259
|
+
* Now supports both fixed and dynamic tick arrays through the container pattern
|
|
260
|
+
*/
|
|
261
|
+
static firstInitializedTick(tickArrayCurrent, zeroForOne) {
|
|
262
|
+
if (tickArrayCurrent.type === 'Fixed') {
|
|
263
|
+
return this._firstInitializedTickFixed(tickArrayCurrent.data, zeroForOne);
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
return this._firstInitializedTickDynamic(tickArrayCurrent.data, zeroForOne);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Fixed tick array implementation (original logic)
|
|
271
|
+
*/
|
|
272
|
+
static _firstInitializedTickFixed(tickArray, zeroForOne) {
|
|
273
|
+
if (zeroForOne) {
|
|
274
|
+
let i = TICK_ARRAY_SIZE - 1;
|
|
275
|
+
while (i >= 0) {
|
|
276
|
+
if (tickArray.ticks[i].liquidityGross.gtn(0)) {
|
|
277
|
+
return tickArray.ticks[i];
|
|
278
|
+
}
|
|
279
|
+
i = i - 1;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
let i = 0;
|
|
284
|
+
while (i < TICK_ARRAY_SIZE) {
|
|
285
|
+
if (tickArray.ticks[i].liquidityGross.gtn(0)) {
|
|
286
|
+
return tickArray.ticks[i];
|
|
287
|
+
}
|
|
288
|
+
i = i + 1;
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
throw Error(`firstInitializedTick check error: ${tickArray} - ${zeroForOne}`);
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Dynamic tick array implementation
|
|
295
|
+
* Uses the mapping table (tickOffsetIndex) to find the first allocated tick
|
|
296
|
+
*/
|
|
297
|
+
static _firstInitializedTickDynamic(dynTickArray, zeroForOne) {
|
|
298
|
+
if (zeroForOne) {
|
|
299
|
+
// Search from right to left (highest tick index first)
|
|
300
|
+
let i = TICK_ARRAY_SIZE - 1;
|
|
301
|
+
while (i >= 0) {
|
|
302
|
+
const physicalIndex = dynTickArray.tickOffsetIndex[i];
|
|
303
|
+
if (physicalIndex > 0) {
|
|
304
|
+
const tick = dynTickArray.ticks[physicalIndex - 1];
|
|
305
|
+
if (tick.liquidityGross.gtn(0)) {
|
|
306
|
+
return tick;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
i = i - 1;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
// Search from left to right (lowest tick index first)
|
|
314
|
+
let i = 0;
|
|
315
|
+
while (i < TICK_ARRAY_SIZE) {
|
|
316
|
+
const physicalIndex = dynTickArray.tickOffsetIndex[i];
|
|
317
|
+
if (physicalIndex > 0) {
|
|
318
|
+
const tick = dynTickArray.ticks[physicalIndex - 1];
|
|
319
|
+
if (tick.liquidityGross.gtn(0)) {
|
|
320
|
+
return tick;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
i = i + 1;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
throw Error(`firstInitializedTick check error: ${dynTickArray} - ${zeroForOne}`);
|
|
327
|
+
}
|
|
328
|
+
static getPriceAndTick({ poolInfo, price, baseIn, }) {
|
|
329
|
+
const _price = baseIn ? price : new Decimal(1).div(price);
|
|
330
|
+
const tick = TickMath.getTickWithPriceAndTickspacing(_price, poolInfo.tickSpacing, poolInfo.mintDecimalsA, poolInfo.mintDecimalsB);
|
|
331
|
+
const tickSqrtPriceX64 = SqrtPriceMath.getSqrtPriceX64FromTick(tick);
|
|
332
|
+
const tickPrice = SqrtPriceMath.sqrtPriceX64ToPrice(tickSqrtPriceX64, poolInfo.mintDecimalsA, poolInfo.mintDecimalsB);
|
|
333
|
+
return baseIn ? { tick, price: tickPrice } : { tick, price: new Decimal(1).div(tickPrice) };
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
export class TickQuery {
|
|
337
|
+
/**
|
|
338
|
+
* Find the next initialized TickArray
|
|
339
|
+
*/
|
|
340
|
+
static nextInitializedTickArray(tickIndex, tickSpacing, zeroForOne, tickArrayBitmap, exBitmapInfo) {
|
|
341
|
+
// First, include the array that contains tickIndex itself if initialized (handles boundary inclusively)
|
|
342
|
+
const startIndex = TickQuery.getArrayStartIndex(tickIndex, tickSpacing);
|
|
343
|
+
const merged = TickUtils.mergeTickArrayBitmap(tickArrayBitmap);
|
|
344
|
+
try {
|
|
345
|
+
const { isInitialized } = TickUtils.checkTickArrayIsInitialized(merged, startIndex, tickSpacing);
|
|
346
|
+
if (isInitialized)
|
|
347
|
+
return { isExist: true, nextStartIndex: startIndex };
|
|
348
|
+
}
|
|
349
|
+
catch {
|
|
350
|
+
/* ignore */
|
|
351
|
+
}
|
|
352
|
+
try {
|
|
353
|
+
const { isInitialized } = TickArrayBitmapExtensionUtils.checkTickArrayIsInit(startIndex, tickSpacing, exBitmapInfo);
|
|
354
|
+
if (isInitialized)
|
|
355
|
+
return { isExist: true, nextStartIndex: startIndex };
|
|
356
|
+
}
|
|
357
|
+
catch {
|
|
358
|
+
/* ignore */
|
|
359
|
+
}
|
|
360
|
+
// Otherwise, search outward in the given direction
|
|
361
|
+
const currentOffset = TickUtils.getTickArrayBitIndex(tickIndex, tickSpacing);
|
|
362
|
+
const result = zeroForOne
|
|
363
|
+
? TickUtils.searchLowBitFromStart(tickArrayBitmap, exBitmapInfo, currentOffset - 1, 1, tickSpacing)
|
|
364
|
+
: TickUtils.searchHightBitFromStart(tickArrayBitmap, exBitmapInfo, currentOffset + 1, 1, tickSpacing);
|
|
365
|
+
return result.length > 0 ? { isExist: true, nextStartIndex: result[0] } : { isExist: false, nextStartIndex: 0 };
|
|
366
|
+
}
|
|
367
|
+
// Calculate the start index of the TickArray corresponding to the given tick index
|
|
368
|
+
static getArrayStartIndex(tickIndex, tickSpacing) {
|
|
369
|
+
const ticksInArray = this.tickCount(tickSpacing);
|
|
370
|
+
const start = Math.floor(tickIndex / ticksInArray);
|
|
371
|
+
return start * ticksInArray;
|
|
372
|
+
}
|
|
373
|
+
// Check if the given tick index is a valid start index
|
|
374
|
+
static checkIsValidStartIndex(tickIndex, tickSpacing) {
|
|
375
|
+
if (TickUtils.checkIsOutOfBoundary(tickIndex)) {
|
|
376
|
+
if (tickIndex > MAX_TICK) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
// In extreme scenarios, tickIndex may be less than MIN_TICK
|
|
380
|
+
const minStartIndex = TickUtils.getTickArrayStartIndexByTick(MIN_TICK, tickSpacing);
|
|
381
|
+
return tickIndex == minStartIndex;
|
|
382
|
+
}
|
|
383
|
+
return tickIndex % this.tickCount(tickSpacing) == 0;
|
|
384
|
+
}
|
|
385
|
+
// Calculate the number of ticks contained in one tickarray
|
|
386
|
+
static tickCount(tickSpacing) {
|
|
387
|
+
return TICK_ARRAY_SIZE * tickSpacing;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
//# sourceMappingURL=tick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tick.js","sourceRoot":"","sources":["../../../../src/instructions/utils/tick.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { PublicKey } from '@solana/web3.js';
|
|
2
|
+
import { Tick, DynTickArray, TickArrayContainer } from './models.js';
|
|
3
|
+
/**
|
|
4
|
+
* Tick Array 工具类
|
|
5
|
+
* 处理固定和动态 Tick Array 的统一操作
|
|
6
|
+
*/
|
|
7
|
+
export declare class TickArrayUtils {
|
|
8
|
+
/**
|
|
9
|
+
* Discriminator 常量
|
|
10
|
+
* 这些值通过 Anchor 框架自动生成(SHA256("account:<StructName>") 的前 8 字节)
|
|
11
|
+
*/
|
|
12
|
+
private static readonly FIXED_TICK_ARRAY_DISCRIMINATOR;
|
|
13
|
+
private static readonly DYN_TICK_ARRAY_DISCRIMINATOR;
|
|
14
|
+
/**
|
|
15
|
+
* 识别 Tick Array 的类型
|
|
16
|
+
* @param accountData 账户数据
|
|
17
|
+
* @returns 'Fixed' 或 'Dynamic'
|
|
18
|
+
*/
|
|
19
|
+
static identifyTickArrayType(accountData: Buffer): 'Fixed' | 'Dynamic';
|
|
20
|
+
/**
|
|
21
|
+
* 解码动态 Tick Array
|
|
22
|
+
* @param accountData 账户数据
|
|
23
|
+
* @param address 账户地址(可选)
|
|
24
|
+
* @returns DynTickArray
|
|
25
|
+
*/
|
|
26
|
+
static decodeDynTickArray(accountData: Buffer, address?: PublicKey): DynTickArray;
|
|
27
|
+
/**
|
|
28
|
+
* 从容器中获取 Tick State
|
|
29
|
+
* @param container TickArrayContainer
|
|
30
|
+
* @param tickIndex Tick 索引
|
|
31
|
+
* @param tickSpacing Tick 间距
|
|
32
|
+
* @returns Tick 或 null(如果未分配)
|
|
33
|
+
*/
|
|
34
|
+
static getTickStateFromContainer(container: TickArrayContainer, tickIndex: number, tickSpacing: number): Tick | null;
|
|
35
|
+
/**
|
|
36
|
+
* 从动态 Tick Array 中获取 Tick State
|
|
37
|
+
* @param dynTickArray DynTickArray
|
|
38
|
+
* @param tickIndex Tick 索引
|
|
39
|
+
* @param tickSpacing Tick 间距
|
|
40
|
+
* @returns Tick 或 null(如果未分配)
|
|
41
|
+
*/
|
|
42
|
+
private static getTickStateFromDynArray;
|
|
43
|
+
/**
|
|
44
|
+
* Parse tick array account data into a container
|
|
45
|
+
* Supports both fixed and dynamic tick arrays
|
|
46
|
+
* @private
|
|
47
|
+
*/
|
|
48
|
+
static parseTickArrayContainer(accountData: Buffer, address: PublicKey): TickArrayContainer;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=tickArrayUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickArrayUtils.d.ts","sourceRoot":"","sources":["../../../../src/instructions/utils/tickArrayUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAIrE;;;GAGG;AACH,qBAAa,cAAc;IACzB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,8BAA8B,CAA0C;IAChG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,4BAA4B,CAA0C;IAE9F;;;;OAIG;WACW,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS;IAoB7E;;;;;OAKG;WACW,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS,GAAG,YAAY;IA0CxF;;;;;;OAMG;WACW,yBAAyB,CACrC,SAAS,EAAE,kBAAkB,EAC7B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,IAAI,GAAG,IAAI;IAWd;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,wBAAwB;IA8BvC;;;;OAIG;WACW,uBAAuB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,GAAG,kBAAkB;CA8BnG"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { PublicKey } from '@solana/web3.js';
|
|
2
|
+
import { DYN_TICK_ARRAY_HEADER_LEN, TICK_STATE_LEN } from '../../constants.js';
|
|
3
|
+
import { DynTickArrayLayout, TickArrayLayout, TickStateLayout } from '../layout.js';
|
|
4
|
+
import { TickUtils } from './tick.js';
|
|
5
|
+
import BN from 'bn.js';
|
|
6
|
+
/**
|
|
7
|
+
* Tick Array 工具类
|
|
8
|
+
* 处理固定和动态 Tick Array 的统一操作
|
|
9
|
+
*/
|
|
10
|
+
export class TickArrayUtils {
|
|
11
|
+
/**
|
|
12
|
+
* Discriminator 常量
|
|
13
|
+
* 这些值通过 Anchor 框架自动生成(SHA256("account:<StructName>") 的前 8 字节)
|
|
14
|
+
*/
|
|
15
|
+
static FIXED_TICK_ARRAY_DISCRIMINATOR = Buffer.from('c09b55cd31f9812a', 'hex');
|
|
16
|
+
static DYN_TICK_ARRAY_DISCRIMINATOR = Buffer.from('6a8b98247599b838', 'hex');
|
|
17
|
+
/**
|
|
18
|
+
* 识别 Tick Array 的类型
|
|
19
|
+
* @param accountData 账户数据
|
|
20
|
+
* @returns 'Fixed' 或 'Dynamic'
|
|
21
|
+
*/
|
|
22
|
+
static identifyTickArrayType(accountData) {
|
|
23
|
+
if (accountData.length < 8) {
|
|
24
|
+
throw new Error('Invalid tick array data: too short to contain discriminator');
|
|
25
|
+
}
|
|
26
|
+
const discriminator = accountData.slice(0, 8);
|
|
27
|
+
if (discriminator.equals(this.FIXED_TICK_ARRAY_DISCRIMINATOR)) {
|
|
28
|
+
return 'Fixed';
|
|
29
|
+
}
|
|
30
|
+
else if (discriminator.equals(this.DYN_TICK_ARRAY_DISCRIMINATOR)) {
|
|
31
|
+
return 'Dynamic';
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
throw new Error(`Unknown tick array discriminator: ${discriminator.toString('hex')}. ` +
|
|
35
|
+
`Expected Fixed: ${this.FIXED_TICK_ARRAY_DISCRIMINATOR.toString('hex')} ` +
|
|
36
|
+
`or Dynamic: ${this.DYN_TICK_ARRAY_DISCRIMINATOR.toString('hex')}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* 解码动态 Tick Array
|
|
41
|
+
* @param accountData 账户数据
|
|
42
|
+
* @param address 账户地址(可选)
|
|
43
|
+
* @returns DynTickArray
|
|
44
|
+
*/
|
|
45
|
+
static decodeDynTickArray(accountData, address) {
|
|
46
|
+
// DynTickArrayState Header 长度:8 (discriminator) + 208 (struct) = 216 bytes
|
|
47
|
+
if (accountData.length < DYN_TICK_ARRAY_HEADER_LEN) {
|
|
48
|
+
throw new Error(`Invalid dyn tick array data: expected at least ${DYN_TICK_ARRAY_HEADER_LEN} bytes, got ${accountData.length}`);
|
|
49
|
+
}
|
|
50
|
+
// 1. 解析 header
|
|
51
|
+
const headerData = accountData.slice(0, DYN_TICK_ARRAY_HEADER_LEN);
|
|
52
|
+
const header = DynTickArrayLayout.decode(headerData);
|
|
53
|
+
// 2. 验证数据长度
|
|
54
|
+
const expectedSize = DYN_TICK_ARRAY_HEADER_LEN + header.allocTickCount * TICK_STATE_LEN;
|
|
55
|
+
if (accountData.length !== expectedSize) {
|
|
56
|
+
throw new Error(`Invalid dyn tick array data size: expected ${expectedSize} bytes, got ${accountData.length}`);
|
|
57
|
+
}
|
|
58
|
+
// 3. 解析 TickState 数组
|
|
59
|
+
const ticksData = accountData.slice(DYN_TICK_ARRAY_HEADER_LEN);
|
|
60
|
+
const ticks = [];
|
|
61
|
+
for (let i = 0; i < header.allocTickCount; i++) {
|
|
62
|
+
const offset = i * TICK_STATE_LEN;
|
|
63
|
+
const tickData = ticksData.slice(offset, offset + TICK_STATE_LEN);
|
|
64
|
+
const tick = TickStateLayout.decode(tickData);
|
|
65
|
+
ticks.push(tick);
|
|
66
|
+
}
|
|
67
|
+
// 4. 构建结果
|
|
68
|
+
return {
|
|
69
|
+
address: address || PublicKey.default,
|
|
70
|
+
poolId: header.poolId,
|
|
71
|
+
startTickIndex: header.startTickIndex,
|
|
72
|
+
tickOffsetIndex: Array.from(header.tickOffsetIndex),
|
|
73
|
+
allocTickCount: header.allocTickCount,
|
|
74
|
+
initializedTickCount: header.initializedTickCount,
|
|
75
|
+
ticks,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* 从容器中获取 Tick State
|
|
80
|
+
* @param container TickArrayContainer
|
|
81
|
+
* @param tickIndex Tick 索引
|
|
82
|
+
* @param tickSpacing Tick 间距
|
|
83
|
+
* @returns Tick 或 null(如果未分配)
|
|
84
|
+
*/
|
|
85
|
+
static getTickStateFromContainer(container, tickIndex, tickSpacing) {
|
|
86
|
+
if (container.type === 'Fixed') {
|
|
87
|
+
// 固定 Tick Array: 直接数组访问
|
|
88
|
+
const offset = TickUtils.getTickOffsetInArray(tickIndex, tickSpacing);
|
|
89
|
+
return container.data.ticks[offset];
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
// 动态 Tick Array: 通过映射表访问
|
|
93
|
+
return this.getTickStateFromDynArray(container.data, tickIndex, tickSpacing);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 从动态 Tick Array 中获取 Tick State
|
|
98
|
+
* @param dynTickArray DynTickArray
|
|
99
|
+
* @param tickIndex Tick 索引
|
|
100
|
+
* @param tickSpacing Tick 间距
|
|
101
|
+
* @returns Tick 或 null(如果未分配)
|
|
102
|
+
*/
|
|
103
|
+
static getTickStateFromDynArray(dynTickArray, tickIndex, tickSpacing) {
|
|
104
|
+
// 1. 计算逻辑偏移 (0-59)
|
|
105
|
+
const logicalOffset = TickUtils.getTickOffsetInArray(tickIndex, tickSpacing);
|
|
106
|
+
// 2. 查映射表
|
|
107
|
+
const physicalIndexPlusOne = dynTickArray.tickOffsetIndex[logicalOffset];
|
|
108
|
+
// 3. 检查是否已分配
|
|
109
|
+
if (physicalIndexPlusOne === 0) {
|
|
110
|
+
return null; // 未分配
|
|
111
|
+
}
|
|
112
|
+
// 4. 计算实际索引 (position + 1 - 1 = position)
|
|
113
|
+
const actualIndex = physicalIndexPlusOne - 1;
|
|
114
|
+
// 5. 边界检查
|
|
115
|
+
if (actualIndex >= dynTickArray.ticks.length) {
|
|
116
|
+
throw new Error(`Tick state index out of bounds: ${actualIndex} >= ${dynTickArray.ticks.length}. ` +
|
|
117
|
+
`This indicates corrupted tick array data.`);
|
|
118
|
+
}
|
|
119
|
+
return dynTickArray.ticks[actualIndex];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Parse tick array account data into a container
|
|
123
|
+
* Supports both fixed and dynamic tick arrays
|
|
124
|
+
* @private
|
|
125
|
+
*/
|
|
126
|
+
static parseTickArrayContainer(accountData, address) {
|
|
127
|
+
const tickArrayType = this.identifyTickArrayType(accountData);
|
|
128
|
+
if (tickArrayType === 'Fixed') {
|
|
129
|
+
const decoded = TickArrayLayout.decode(accountData);
|
|
130
|
+
return {
|
|
131
|
+
type: 'Fixed',
|
|
132
|
+
data: {
|
|
133
|
+
address,
|
|
134
|
+
poolId: decoded.poolId,
|
|
135
|
+
startTickIndex: decoded.startTickIndex,
|
|
136
|
+
ticks: decoded.ticks.map((tick) => ({
|
|
137
|
+
tick: tick.tick,
|
|
138
|
+
liquidityNet: new BN(tick.liquidityNet.toString()),
|
|
139
|
+
liquidityGross: new BN(tick.liquidityGross.toString()),
|
|
140
|
+
feeGrowthOutsideX64A: new BN(tick.feeGrowthOutsideX64A.toString()),
|
|
141
|
+
feeGrowthOutsideX64B: new BN(tick.feeGrowthOutsideX64B.toString()),
|
|
142
|
+
rewardGrowthsOutsideX64: tick.rewardGrowthsOutsideX64.map((r) => new BN(r.toString())),
|
|
143
|
+
})),
|
|
144
|
+
initializedTickCount: decoded.initializedTickCount,
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
const decoded = this.decodeDynTickArray(accountData, address);
|
|
150
|
+
return {
|
|
151
|
+
type: 'Dynamic',
|
|
152
|
+
data: decoded,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=tickArrayUtils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickArrayUtils.js","sourceRoot":"","sources":["../../../../src/instructions/utils/tickArrayUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import BN from 'bn.js';
|
|
2
|
+
import { Decimal } from 'decimal.js';
|
|
3
|
+
export interface TickAlignedPriceDetails {
|
|
4
|
+
tick: number;
|
|
5
|
+
sqrtPriceX64: BN;
|
|
6
|
+
price: Decimal;
|
|
7
|
+
}
|
|
8
|
+
export declare class TickMath {
|
|
9
|
+
static getTickWithPriceAndTickspacing(price: Decimal, tickSpacing: number, mintDecimalsA: number, mintDecimalsB: number): number;
|
|
10
|
+
static getPriceFromTick(params: {
|
|
11
|
+
tick: number;
|
|
12
|
+
decimalsA: number;
|
|
13
|
+
decimalsB: number;
|
|
14
|
+
baseIn?: boolean;
|
|
15
|
+
}): Decimal;
|
|
16
|
+
static getTickAlignedPriceDetails(price: Decimal, tickSpacing: number, mintDecimalsA: number, mintDecimalsB: number): TickAlignedPriceDetails;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=tickMath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tickMath.d.ts","sourceRoot":"","sources":["../../../../src/instructions/utils/tickMath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,OAAO,CAAC;AACvB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAIrC,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AACD,qBAAa,QAAQ;WAEL,8BAA8B,CAC1C,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GACpB,MAAM;WAaK,gBAAgB,CAAC,MAAM,EAAE;QACrC,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,GAAG,OAAO;WASG,0BAA0B,CACtC,KAAK,EAAE,OAAO,EACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,EACrB,aAAa,EAAE,MAAM,GACpB,uBAAuB;CAU3B"}
|