@picon-finance/dlmm-sdk 1.3.0 → 1.5.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/README.md +8 -0
- package/dist/entities/bin_array.d.ts +1 -0
- package/dist/entities/bin_array.d.ts.map +1 -1
- package/dist/entities/bin_array.js +1 -0
- package/dist/entities/pool.d.ts +2 -0
- package/dist/entities/pool.d.ts.map +1 -1
- package/dist/entities/pool.js +2 -0
- package/dist/entities/position.d.ts +4 -0
- package/dist/entities/position.d.ts.map +1 -1
- package/dist/entities/position.js +30 -1
- package/package.json +1 -1
- package/src/entities/bin_array.ts +1 -0
- package/src/entities/pool.ts +3 -0
- package/src/entities/position.ts +37 -0
package/README.md
CHANGED
|
@@ -93,6 +93,14 @@ const closeIx = await position.close(ownerSigner);
|
|
|
93
93
|
console.log(position.data.lowerBinId, position.data.upperBinId);
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
+
`position.data.feeStates[i].feeOwedX`/`feeOwedY` is the fee already swept into the position (materialized by the last deposit/withdraw/claim_fee call), not the full claimable amount — fees earned since then aren't reflected until the next such call. `position.getPendingFee()` computes that remaining delta from the same cached position + bin array data (no RPC):
|
|
97
|
+
|
|
98
|
+
```ts
|
|
99
|
+
const { amountX: pendingFeeX, amountY: pendingFeeY } = position.getPendingFee();
|
|
100
|
+
const owedFeeX = position.data.feeStates.reduce((sum, feeState) => sum + feeState.feeOwedX, 0n);
|
|
101
|
+
// owedFeeX + pendingFeeX is the total a claimFee call would sweep right now.
|
|
102
|
+
```
|
|
103
|
+
|
|
96
104
|
Refresh a position's cached state after it changes on-chain (e.g. after a deposit lands):
|
|
97
105
|
|
|
98
106
|
```ts
|
|
@@ -6,6 +6,7 @@ export declare class BinArray {
|
|
|
6
6
|
private constructor();
|
|
7
7
|
get address(): Address<string>;
|
|
8
8
|
get data(): generated.BinArray;
|
|
9
|
+
get bins(): generated.Bin[];
|
|
9
10
|
refresh(data: Account<generated.BinArray>): Promise<void>;
|
|
10
11
|
refresh(config?: FetchAccountConfig): Promise<void>;
|
|
11
12
|
static loadAll(rpc: ReturnType<typeof createSolanaRpc>, pool: Address, indices: number[], programAddress: Address, config?: FetchAccountsConfig): Promise<BinArray[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin_array.d.ts","sourceRoot":"","sources":["../../src/entities/bin_array.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAEf,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAK/B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,qBAAa,QAAQ;;IAKnB,OAAO,eAQN;IAED,IAAW,OAAO,oBAAoC;IACtD,IAAW,IAAI,uBAAiC;
|
|
1
|
+
{"version":3,"file":"bin_array.d.ts","sourceRoot":"","sources":["../../src/entities/bin_array.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAEf,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAK/B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,qBAAa,QAAQ;;IAKnB,OAAO,eAQN;IAED,IAAW,OAAO,oBAAoC;IACtD,IAAW,IAAI,uBAAiC;IAChD,IAAW,IAAI,oBAA6B;IAE/B,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAQjE,OAAoB,OAAO,CACzB,GAAG,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,EACvC,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,cAAc,EAAE,OAAO,EACvB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAOrB;IAEY,MAAM,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,CAAC,CAUtE;CACF;AAED,wBAAsB,cAAc,CAClC,EACE,KAAK,EACL,IAAI,EACJ,KAAK,EACL,UAAiB,GAClB,EAAE;IACD,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,EACD,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,WAAW,CAAC,CAStB;AAED,wBAAsB,kBAAkB,CACtC,EACE,KAAK,EACL,IAAI,EACJ,OAAO,EACP,UAAiB,GAClB,EAAE;IACD,KAAK,EAAE,iBAAiB,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,EACD,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,WAAW,EAAE,CAAC,CAKxB;AAED,wBAAsB,mBAAmB,CACvC,KAAK,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACvC,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,wBAAsB,wBAAwB,CAC5C,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,EACvD,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,OAAO,EAAE,CAAC,CAIpB;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,EACvC,SAAS,EAAE,OAAO,EAAE,EACpB,MAAM,CAAC,EAAE,mBAAmB,0CAO7B;AAID,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,GAC3C,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAG/B"}
|
|
@@ -15,6 +15,7 @@ export class BinArray {
|
|
|
15
15
|
}
|
|
16
16
|
get address() { return this.#account.address; }
|
|
17
17
|
get data() { return this.#account.data; }
|
|
18
|
+
get bins() { return this.data.bins; }
|
|
18
19
|
async refresh(arg) {
|
|
19
20
|
if (!isAccount(arg)) {
|
|
20
21
|
arg = await generated.fetchBinArray(this.#rpc, this.address, arg);
|
package/dist/entities/pool.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export declare class Pool {
|
|
|
13
13
|
get activeBinId(): number;
|
|
14
14
|
get tokenMintX(): Address;
|
|
15
15
|
get tokenMintY(): Address;
|
|
16
|
+
get tokenDecimalsX(): number;
|
|
17
|
+
get tokenDecimalsY(): number;
|
|
16
18
|
get tokenVaultX(): Address;
|
|
17
19
|
get tokenVaultY(): Address;
|
|
18
20
|
get tokenProgramX(): Address;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/entities/pool.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEf,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAC/B,OAAO,EAAS,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAanD,OAAO,EACL,QAAQ,EAKT,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,qBAAa,IAAI;;IAQf,OAAO,eAYN;IAED,IAAW,GAAG,+5nBAAwB;IAEtC,IAAW,cAAc,YAAmC;IAC5D,IAAW,OAAO,oBAAoC;IACtD,IAAW,IAAI,mBAAiC;IAChD,IAAW,WAAW,WAAoC;IAE1D,IAAW,UAAU,YAAmC;IACxD,IAAW,UAAU,YAAmC;IAExD,IAAW,WAAW,YAAoC;IAC1D,IAAW,WAAW,YAAoC;IAE1D,IAAW,aAAa,YAAyC;IACjE,IAAW,aAAa,YAAyC;IAEpD,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAQpD,WAAW,CACtB,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,QAAQ,CAAC,CAEnB;IAEY,yBAAyB,CACpC,YAAY,EAAE,OAAO,EACrB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,QAAQ,CAAC,CAMnB;IAEY,8BAA8B,CACzC,aAAa,EAAE,OAAO,EAAE,EACxB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,QAAQ,EAAE,CAAC,CAMrB;IAEY,YAAY,CACvB,KAAK,EAAE,iBAAiB,EACxB,YAAY,EAAE,iBAAiB,EAC/B,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GACrE,OAAO,CAAC,WAAW,EAAE,CAAC,CAMxB;IAEY,aAAa,CACxB,KAAK,EAAE,iBAAiB,EACxB,YAAY,EAAE,OAAO,GACpB,OAAO,CAAC,WAAW,CAAC,CAKtB;IAEY,IAAI,CACf,IAAI,EAAE,iBAAiB,EACvB,EACE,IAAI,EACJ,QAAQ,EACR,YAAY,GACb,EAAE;QACD,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACtB,GACA,OAAO,CAAC,WAAW,EAAE,CAAC,CA2CxB;IAEY,KAAK,CAChB,EACE,IAAI,EACJ,QAAQ,EACR,oBAAoB,GACrB,EAAE;QACD,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,oBAAoB,EAAE,MAAM,CAAC;KAC9B,GACA,OAAO,CAAC,WAAW,CAAC,CA0BtB;IAEY,YAAY,CACvB,IAAI,EAAE,iBAAiB,EACvB,EACE,IAAI,EACJ,QAAQ,EACR,oBAAoB,GACrB,EAAE;QACD,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,oBAAoB,EAAE,MAAM,CAAC;KAC9B,GACA,OAAO,CAAC;QAAE,WAAW,EAAE,WAAW,CAAC;QAAC,YAAY,EAAE,WAAW,EAAE,CAAA;KAAE,CAAC,CAIpE;IAEY,IAAI,CACf,IAAI,EAAE,iBAAiB,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,WAAW,EAAE,CAAC,CAcxB;IAEY,mBAAmB,CAC9B,SAAS,EAAE,iBAAiB,EAC5B,gBAAgB,EAAE,SAAS,CAAC,gBAAgB,GAC3C,OAAO,CAAC,WAAW,CAAC,CAMtB;IAEY,gBAAgB,CAC3B,SAAS,EAAE,iBAAiB,EAC5B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,WAAW,CAAC,CAMtB;IAEY,gBAAgB,CAAC,SAAS,EAAE,iBAAiB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAgClF;IAED,OAAoB,IAAI,CACtB,GAAG,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,EACvC,OAAO,EAAE,OAAO,EAChB,cAAc,EAAE,OAAO,EACvB,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAWf;CACF;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EACrF,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,OAAO,CAAC,CAGlB;AAED,wBAAsB,UAAU,CAC9B,EACE,SAAS,EACT,OAAO,EACP,OAAO,EACP,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,GACd,EAAE;IACD,SAAS,EAAE,iBAAiB,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB,EACD,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,WAAW,CAAC,CAkBtB"}
|
|
1
|
+
{"version":3,"file":"pool.d.ts","sourceRoot":"","sources":["../../src/entities/pool.ts"],"names":[],"mappings":"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"}
|
package/dist/entities/pool.js
CHANGED
|
@@ -30,6 +30,8 @@ export class Pool {
|
|
|
30
30
|
get activeBinId() { return this.data.activeBinId; }
|
|
31
31
|
get tokenMintX() { return this.data.tokenMintX; }
|
|
32
32
|
get tokenMintY() { return this.data.tokenMintY; }
|
|
33
|
+
get tokenDecimalsX() { return this.#mintX.data.decimals; }
|
|
34
|
+
get tokenDecimalsY() { return this.#mintY.data.decimals; }
|
|
33
35
|
get tokenVaultX() { return this.data.tokenVaultX; }
|
|
34
36
|
get tokenVaultY() { return this.data.tokenVaultY; }
|
|
35
37
|
get tokenProgramX() { return this.#mintX.programAddress; }
|
|
@@ -13,6 +13,10 @@ export declare class Position {
|
|
|
13
13
|
lowerBinArray: Address;
|
|
14
14
|
upperBinArray?: Address | undefined;
|
|
15
15
|
};
|
|
16
|
+
getPendingFee(): {
|
|
17
|
+
amountX: bigint;
|
|
18
|
+
amountY: bigint;
|
|
19
|
+
};
|
|
16
20
|
refresh(data: [Account<generated.Position>, Account<generated.BinArray>[]]): Promise<void>;
|
|
17
21
|
refresh(config?: FetchAccountsConfig): Promise<void>;
|
|
18
22
|
depositByWeight(owner: TransactionSigner, { amountX, amountY, lowerBinId, binWeights, maxActiveBinSlippage, distributionMode, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../src/entities/position.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAGf,KAAK,OAAO,EACZ,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EAEzB,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAK/B,OAAO,
|
|
1
|
+
{"version":3,"file":"position.d.ts","sourceRoot":"","sources":["../../src/entities/position.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { decodeAccount, assertAccountExists, fetchEncodedAccounts, } from "@solana/kit";
|
|
2
2
|
import { generated } from "..";
|
|
3
3
|
import { findPositionTokenAccount, processAssociatedTokenAccountPair, } from "../utils/ata";
|
|
4
|
-
import { getBinArrayIndex, getPositionBinArrayIndices, } from "../utils/bin_location";
|
|
4
|
+
import { getBinIndex, getBinArrayIndex, getPositionBinArrayIndices, } from "../utils/bin_location";
|
|
5
5
|
import { assertRangeWithinRange, assertPositionBelongsToPool, } from "../utils/assert";
|
|
6
6
|
import { isUndefined } from "../utils/type_guards";
|
|
7
7
|
import { fetchInChunks } from "../utils/chunk";
|
|
@@ -25,6 +25,26 @@ export class Position {
|
|
|
25
25
|
const upperBinArray = this.#binArrays.length > 1 ? this.#binArrays[1].address : undefined;
|
|
26
26
|
return { lowerBinArray, upperBinArray };
|
|
27
27
|
}
|
|
28
|
+
getPendingFee() {
|
|
29
|
+
const { lowerBinId, upperBinId, feeStates } = this.data;
|
|
30
|
+
const lowerBinArrayIndex = getBinArrayIndex(lowerBinId);
|
|
31
|
+
return Array.from({ length: upperBinId - lowerBinId + 1 }, (_, i) => i)
|
|
32
|
+
.flatMap(i => {
|
|
33
|
+
const feeState = feeStates[i];
|
|
34
|
+
if (feeState.shares === 0n)
|
|
35
|
+
return [];
|
|
36
|
+
const binId = lowerBinId + i;
|
|
37
|
+
const binIndex = getBinIndex(binId);
|
|
38
|
+
const binArrayIndex = getBinArrayIndex(binId) - lowerBinArrayIndex;
|
|
39
|
+
const binArray = this.#binArrays[binArrayIndex];
|
|
40
|
+
const bin = binArray.bins[binIndex];
|
|
41
|
+
return bin.totalShares > 0n ? [{ feeState, bin }] : [];
|
|
42
|
+
})
|
|
43
|
+
.reduce((total, { feeState, bin }) => ({
|
|
44
|
+
amountX: total.amountX + earnedAmount(bin.feePerShareX, feeState.feePerShareCheckpointX, feeState.shares),
|
|
45
|
+
amountY: total.amountY + earnedAmount(bin.feePerShareY, feeState.feePerShareCheckpointY, feeState.shares),
|
|
46
|
+
}), { amountX: 0n, amountY: 0n });
|
|
47
|
+
}
|
|
28
48
|
async refresh(arg) {
|
|
29
49
|
if (!Array.isArray(arg)) {
|
|
30
50
|
arg = await fetchPositionWithBinArrays(this.#pool.rpc, this.address, this.#binArrays.map(b => b.address), arg);
|
|
@@ -246,3 +266,12 @@ function decodePosition(maybeAccount) {
|
|
|
246
266
|
assertAccountExists(maybeAccount);
|
|
247
267
|
return decodeAccount(maybeAccount, positionDecoder);
|
|
248
268
|
}
|
|
269
|
+
const U128_MODULUS = 1n << 128n;
|
|
270
|
+
const SCALE_OFFSET = 64n; // shares and fee-per-share are both Q64.64 — see fee_state.rs
|
|
271
|
+
// Mirrors fee_state.rs's earned_amount(): wrapping u128 subtraction (fee-per-share monotonically
|
|
272
|
+
// increases and wraps on overflow), then floor((current - checkpoint) * (shares >> 64) / 2^64).
|
|
273
|
+
function earnedAmount(feePerShareCurrent, feePerShareCheckpoint, shares) {
|
|
274
|
+
const delta = ((feePerShareCurrent - feePerShareCheckpoint) % U128_MODULUS + U128_MODULUS) % U128_MODULUS;
|
|
275
|
+
const naturalShares = shares >> SCALE_OFFSET;
|
|
276
|
+
return (delta * naturalShares) >> SCALE_OFFSET;
|
|
277
|
+
}
|
package/package.json
CHANGED
|
@@ -35,6 +35,7 @@ export class BinArray {
|
|
|
35
35
|
|
|
36
36
|
public get address() { return this.#account.address; }
|
|
37
37
|
public get data() { return this.#account.data; }
|
|
38
|
+
public get bins() { return this.data.bins; }
|
|
38
39
|
|
|
39
40
|
public async refresh(data: Account<generated.BinArray>): Promise<void>;
|
|
40
41
|
public async refresh(config?: FetchAccountConfig): Promise<void>;
|
package/src/entities/pool.ts
CHANGED
|
@@ -69,6 +69,9 @@ export class Pool {
|
|
|
69
69
|
public get tokenMintX() { return this.data.tokenMintX; }
|
|
70
70
|
public get tokenMintY() { return this.data.tokenMintY; }
|
|
71
71
|
|
|
72
|
+
public get tokenDecimalsX() { return this.#mintX.data.decimals; }
|
|
73
|
+
public get tokenDecimalsY() { return this.#mintY.data.decimals; }
|
|
74
|
+
|
|
72
75
|
public get tokenVaultX() { return this.data.tokenVaultX; }
|
|
73
76
|
public get tokenVaultY() { return this.data.tokenVaultY; }
|
|
74
77
|
|
package/src/entities/position.ts
CHANGED
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
processAssociatedTokenAccountPair,
|
|
18
18
|
} from "../utils/ata";
|
|
19
19
|
import {
|
|
20
|
+
getBinIndex,
|
|
20
21
|
getBinArrayIndex,
|
|
21
22
|
getPositionBinArrayIndices,
|
|
22
23
|
type BinIdRange,
|
|
@@ -64,6 +65,31 @@ export class Position {
|
|
|
64
65
|
return { lowerBinArray, upperBinArray };
|
|
65
66
|
}
|
|
66
67
|
|
|
68
|
+
public getPendingFee(): { amountX: bigint, amountY: bigint } {
|
|
69
|
+
const { lowerBinId, upperBinId, feeStates } = this.data;
|
|
70
|
+
const lowerBinArrayIndex = getBinArrayIndex(lowerBinId);
|
|
71
|
+
|
|
72
|
+
return Array.from({ length: upperBinId - lowerBinId + 1 }, (_, i) => i)
|
|
73
|
+
.flatMap(i => {
|
|
74
|
+
const feeState = feeStates[i]!;
|
|
75
|
+
if (feeState.shares === 0n) return [];
|
|
76
|
+
|
|
77
|
+
const binId = lowerBinId + i;
|
|
78
|
+
|
|
79
|
+
const binIndex = getBinIndex(binId);
|
|
80
|
+
const binArrayIndex = getBinArrayIndex(binId) - lowerBinArrayIndex;
|
|
81
|
+
|
|
82
|
+
const binArray = this.#binArrays[binArrayIndex];
|
|
83
|
+
const bin = binArray.bins[binIndex];
|
|
84
|
+
|
|
85
|
+
return bin.totalShares > 0n ? [{ feeState, bin }] : [];
|
|
86
|
+
})
|
|
87
|
+
.reduce((total, { feeState, bin }) => ({
|
|
88
|
+
amountX: total.amountX + earnedAmount(bin.feePerShareX, feeState.feePerShareCheckpointX, feeState.shares),
|
|
89
|
+
amountY: total.amountY + earnedAmount(bin.feePerShareY, feeState.feePerShareCheckpointY, feeState.shares),
|
|
90
|
+
}), { amountX: 0n, amountY: 0n });
|
|
91
|
+
}
|
|
92
|
+
|
|
67
93
|
public async refresh(data: [Account<generated.Position>, Account<generated.BinArray>[]]): Promise<void>;
|
|
68
94
|
public async refresh(config?: FetchAccountsConfig): Promise<void>;
|
|
69
95
|
public async refresh(arg?: [Account<generated.Position>, Account<generated.BinArray>[]] | FetchAccountsConfig) {
|
|
@@ -441,4 +467,15 @@ function decodePosition(
|
|
|
441
467
|
): Account<generated.Position> {
|
|
442
468
|
assertAccountExists(maybeAccount);
|
|
443
469
|
return decodeAccount(maybeAccount, positionDecoder);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
const U128_MODULUS = 1n << 128n;
|
|
473
|
+
const SCALE_OFFSET = 64n; // shares and fee-per-share are both Q64.64 — see fee_state.rs
|
|
474
|
+
|
|
475
|
+
// Mirrors fee_state.rs's earned_amount(): wrapping u128 subtraction (fee-per-share monotonically
|
|
476
|
+
// increases and wraps on overflow), then floor((current - checkpoint) * (shares >> 64) / 2^64).
|
|
477
|
+
function earnedAmount(feePerShareCurrent: bigint, feePerShareCheckpoint: bigint, shares: bigint): bigint {
|
|
478
|
+
const delta = ((feePerShareCurrent - feePerShareCheckpoint) % U128_MODULUS + U128_MODULUS) % U128_MODULUS;
|
|
479
|
+
const naturalShares = shares >> SCALE_OFFSET;
|
|
480
|
+
return (delta * naturalShares) >> SCALE_OFFSET;
|
|
444
481
|
}
|