@cubee_ee/sdk 0.1.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 +110 -0
- package/dist/clients/AdminClient.d.ts +61 -0
- package/dist/clients/AdminClient.d.ts.map +1 -0
- package/dist/clients/AdminClient.js +196 -0
- package/dist/clients/AdminClient.js.map +1 -0
- package/dist/clients/CubeBackendClient.d.ts +67 -0
- package/dist/clients/CubeBackendClient.d.ts.map +1 -0
- package/dist/clients/CubeBackendClient.js +126 -0
- package/dist/clients/CubeBackendClient.js.map +1 -0
- package/dist/clients/CubicPoolClient.d.ts +73 -0
- package/dist/clients/CubicPoolClient.d.ts.map +1 -0
- package/dist/clients/CubicPoolClient.js +425 -0
- package/dist/clients/CubicPoolClient.js.map +1 -0
- package/dist/clients/PoolFactoryClient.d.ts +45 -0
- package/dist/clients/PoolFactoryClient.d.ts.map +1 -0
- package/dist/clients/PoolFactoryClient.js +83 -0
- package/dist/clients/PoolFactoryClient.js.map +1 -0
- package/dist/clients/RpcClient.d.ts +28 -0
- package/dist/clients/RpcClient.d.ts.map +1 -0
- package/dist/clients/RpcClient.js +58 -0
- package/dist/clients/RpcClient.js.map +1 -0
- package/dist/clients/SingleTokenDepositClient.d.ts +45 -0
- package/dist/clients/SingleTokenDepositClient.d.ts.map +1 -0
- package/dist/clients/SingleTokenDepositClient.js +63 -0
- package/dist/clients/SingleTokenDepositClient.js.map +1 -0
- package/dist/clients/index.d.ts +8 -0
- package/dist/clients/index.d.ts.map +1 -0
- package/dist/clients/index.js +24 -0
- package/dist/clients/index.js.map +1 -0
- package/dist/clients/tx-builders.d.ts +32 -0
- package/dist/clients/tx-builders.d.ts.map +1 -0
- package/dist/clients/tx-builders.js +398 -0
- package/dist/clients/tx-builders.js.map +1 -0
- package/dist/config/index.d.ts +60 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +59 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/networks.d.ts +10 -0
- package/dist/config/networks.d.ts.map +1 -0
- package/dist/config/networks.js +31 -0
- package/dist/config/networks.js.map +1 -0
- package/dist/config/tokens.d.ts +19 -0
- package/dist/config/tokens.d.ts.map +1 -0
- package/dist/config/tokens.js +43 -0
- package/dist/config/tokens.js.map +1 -0
- package/dist/idl/cubic_pool.json +2497 -0
- package/dist/idl/index.d.ts +975 -0
- package/dist/idl/index.d.ts.map +1 -0
- package/dist/idl/index.js +18 -0
- package/dist/idl/index.js.map +1 -0
- package/dist/idl/protocol_admin.json +1816 -0
- package/dist/idl/single_token_liquidity.json +745 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +136 -0
- package/dist/index.js.map +1 -0
- package/dist/math/cubicMath.d.ts +40 -0
- package/dist/math/cubicMath.d.ts.map +1 -0
- package/dist/math/cubicMath.js +75 -0
- package/dist/math/cubicMath.js.map +1 -0
- package/dist/math/fixedPoint.d.ts +14 -0
- package/dist/math/fixedPoint.d.ts.map +1 -0
- package/dist/math/fixedPoint.js +46 -0
- package/dist/math/fixedPoint.js.map +1 -0
- package/dist/math/index.d.ts +7 -0
- package/dist/math/index.d.ts.map +1 -0
- package/dist/math/index.js +23 -0
- package/dist/math/index.js.map +1 -0
- package/dist/math/logExp.d.ts +15 -0
- package/dist/math/logExp.d.ts.map +1 -0
- package/dist/math/logExp.js +91 -0
- package/dist/math/logExp.js.map +1 -0
- package/dist/math/singleToken.d.ts +53 -0
- package/dist/math/singleToken.d.ts.map +1 -0
- package/dist/math/singleToken.js +185 -0
- package/dist/math/singleToken.js.map +1 -0
- package/dist/math/slippage.d.ts +24 -0
- package/dist/math/slippage.d.ts.map +1 -0
- package/dist/math/slippage.js +54 -0
- package/dist/math/slippage.js.map +1 -0
- package/dist/math/weightedMath.d.ts +18 -0
- package/dist/math/weightedMath.d.ts.map +1 -0
- package/dist/math/weightedMath.js +45 -0
- package/dist/math/weightedMath.js.map +1 -0
- package/dist/parsers/borsh.d.ts +24 -0
- package/dist/parsers/borsh.d.ts.map +1 -0
- package/dist/parsers/borsh.js +80 -0
- package/dist/parsers/borsh.js.map +1 -0
- package/dist/parsers/events.d.ts +3 -0
- package/dist/parsers/events.d.ts.map +1 -0
- package/dist/parsers/events.js +172 -0
- package/dist/parsers/events.js.map +1 -0
- package/dist/parsers/index.d.ts +5 -0
- package/dist/parsers/index.d.ts.map +1 -0
- package/dist/parsers/index.js +21 -0
- package/dist/parsers/index.js.map +1 -0
- package/dist/parsers/mintAccount.d.ts +22 -0
- package/dist/parsers/mintAccount.d.ts.map +1 -0
- package/dist/parsers/mintAccount.js +22 -0
- package/dist/parsers/mintAccount.js.map +1 -0
- package/dist/parsers/poolAccount.d.ts +32 -0
- package/dist/parsers/poolAccount.d.ts.map +1 -0
- package/dist/parsers/poolAccount.js +88 -0
- package/dist/parsers/poolAccount.js.map +1 -0
- package/dist/types/events.d.ts +82 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +3 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/pool.d.ts +66 -0
- package/dist/types/pool.d.ts.map +1 -0
- package/dist/types/pool.js +3 -0
- package/dist/types/pool.js.map +1 -0
- package/dist/types/result.d.ts +23 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +11 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/tx.d.ts +80 -0
- package/dist/types/tx.d.ts.map +1 -0
- package/dist/types/tx.js +3 -0
- package/dist/types/tx.js.map +1 -0
- package/dist/utils/errors.d.ts +8 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +83 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/pda.d.ts +8 -0
- package/dist/utils/pda.d.ts.map +1 -0
- package/dist/utils/pda.js +27 -0
- package/dist/utils/pda.js.map +1 -0
- package/dist/utils/retry.d.ts +22 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +62 -0
- package/dist/utils/retry.js.map +1 -0
- package/package.json +54 -0
- package/src/clients/AdminClient.ts +254 -0
- package/src/clients/CubeBackendClient.ts +193 -0
- package/src/clients/CubicPoolClient.ts +492 -0
- package/src/clients/PoolFactoryClient.ts +102 -0
- package/src/clients/RpcClient.ts +78 -0
- package/src/clients/SingleTokenDepositClient.ts +91 -0
- package/src/clients/index.ts +7 -0
- package/src/clients/tx-builders.ts +538 -0
- package/src/config/index.ts +82 -0
- package/src/config/networks.ts +49 -0
- package/src/config/tokens.ts +52 -0
- package/src/idl/cubic_pool.json +2497 -0
- package/src/idl/index.ts +13 -0
- package/src/idl/protocol_admin.json +1816 -0
- package/src/idl/single_token_liquidity.json +745 -0
- package/src/index.ts +154 -0
- package/src/math/cubicMath.ts +89 -0
- package/src/math/fixedPoint.ts +39 -0
- package/src/math/index.ts +6 -0
- package/src/math/logExp.ts +82 -0
- package/src/math/singleToken.ts +250 -0
- package/src/math/slippage.ts +49 -0
- package/src/math/weightedMath.ts +48 -0
- package/src/parsers/borsh.ts +80 -0
- package/src/parsers/events.ts +172 -0
- package/src/parsers/index.ts +4 -0
- package/src/parsers/mintAccount.ts +37 -0
- package/src/parsers/poolAccount.ts +113 -0
- package/src/types/events.ts +100 -0
- package/src/types/index.ts +4 -0
- package/src/types/pool.ts +64 -0
- package/src/types/result.ts +45 -0
- package/src/types/tx.ts +87 -0
- package/src/utils/errors.ts +78 -0
- package/src/utils/index.ts +3 -0
- package/src/utils/pda.ts +58 -0
- package/src/utils/retry.ts +85 -0
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.computeAllocations = computeAllocations;
|
|
4
|
+
exports.computeTwoTokenOptimalAllocations = computeTwoTokenOptimalAllocations;
|
|
5
|
+
exports.capDepositAmountsToLpRatio = capDepositAmountsToLpRatio;
|
|
6
|
+
const fixedPoint_1 = require("./fixedPoint");
|
|
7
|
+
const cubicMath_1 = require("./cubicMath");
|
|
8
|
+
const slippage_1 = require("./slippage");
|
|
9
|
+
const config_1 = require("../config");
|
|
10
|
+
/**
|
|
11
|
+
* Port of stld `compute_allocations` from
|
|
12
|
+
* `contracts/programs/single-token-liquidity/src/math.rs`.
|
|
13
|
+
*
|
|
14
|
+
* W_i = weight_i * factBalance_i / virtBalance_i (dimensionless concentration).
|
|
15
|
+
* share_i = W_i / ΣW. amount_alloc[i] = amountIn * share_i.
|
|
16
|
+
*
|
|
17
|
+
* Integer truncation of per-token amounts routes the remainder to the
|
|
18
|
+
* input-token slot so Σ allocations == amountIn exactly.
|
|
19
|
+
*/
|
|
20
|
+
function computeAllocations(params) {
|
|
21
|
+
const { actualBalances, virtualBalances, weightsBps, amountIn, tokenInIndex } = params;
|
|
22
|
+
const n = actualBalances.length;
|
|
23
|
+
if (n !== virtualBalances.length || n !== weightsBps.length) {
|
|
24
|
+
throw new Error("computeAllocations: length mismatch");
|
|
25
|
+
}
|
|
26
|
+
if (tokenInIndex < 0 || tokenInIndex >= n) {
|
|
27
|
+
throw new Error("computeAllocations: tokenInIndex out of range");
|
|
28
|
+
}
|
|
29
|
+
const wScaled = [];
|
|
30
|
+
for (let i = 0; i < n; i++) {
|
|
31
|
+
if (virtualBalances[i] <= 0n) {
|
|
32
|
+
throw new Error(`computeAllocations: virtualBalance[${i}] must be positive`);
|
|
33
|
+
}
|
|
34
|
+
const w = (BigInt(weightsBps[i]) * actualBalances[i] * fixedPoint_1.ONE) / (virtualBalances[i] * 10000n);
|
|
35
|
+
wScaled.push(w);
|
|
36
|
+
}
|
|
37
|
+
const sumW = wScaled.reduce((a, b) => a + b, 0n);
|
|
38
|
+
if (sumW === 0n) {
|
|
39
|
+
throw new Error("computeAllocations: pool not seeded (ΣW = 0)");
|
|
40
|
+
}
|
|
41
|
+
const allocations = wScaled.map((w) => (amountIn * w) / sumW);
|
|
42
|
+
const sumAlloc = allocations.reduce((a, b) => a + b, 0n);
|
|
43
|
+
if (sumAlloc < amountIn) {
|
|
44
|
+
allocations[tokenInIndex] += amountIn - sumAlloc;
|
|
45
|
+
}
|
|
46
|
+
return { allocations, wScaled, sumW };
|
|
47
|
+
}
|
|
48
|
+
function swapFeeAmount(amount, swapFeeRate) {
|
|
49
|
+
return (amount * BigInt(swapFeeRate)) / BigInt(config_1.SWAP_FEE_PRECISION);
|
|
50
|
+
}
|
|
51
|
+
function amountAfterSwapFee(amount, swapFeeRate) {
|
|
52
|
+
const fee = swapFeeAmount(amount, swapFeeRate);
|
|
53
|
+
if (swapFeeRate > 0 && fee === 0n) {
|
|
54
|
+
throw new Error("computeTwoTokenOptimalAllocations: swap amount too small, fee rounds to zero");
|
|
55
|
+
}
|
|
56
|
+
return amount - fee;
|
|
57
|
+
}
|
|
58
|
+
function protocolFeeAmount(swapFee, protocolFeeRate) {
|
|
59
|
+
return (swapFee * BigInt(protocolFeeRate)) / BigInt(config_1.PROTOCOL_FEE_PRECISION);
|
|
60
|
+
}
|
|
61
|
+
function scoreTwoTokenSwap(params) {
|
|
62
|
+
const { actualBalances, virtualBalances, protocolFeesOwed, weightsBps, amountIn, tokenInIndex, swapToOther, swapFeeRate, protocolFeeRate, } = params;
|
|
63
|
+
const other = tokenInIndex === 0 ? 1 : 0;
|
|
64
|
+
const remainingInput = amountIn - swapToOther;
|
|
65
|
+
if (swapToOther <= 0n || remainingInput <= 0n)
|
|
66
|
+
return { score: 0n, amountOut: 0n };
|
|
67
|
+
let afterFee;
|
|
68
|
+
try {
|
|
69
|
+
afterFee = amountAfterSwapFee(swapToOther, swapFeeRate);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return { score: 0n, amountOut: 0n };
|
|
73
|
+
}
|
|
74
|
+
const swapFee = swapToOther - afterFee;
|
|
75
|
+
const protocolFee = protocolFeeAmount(swapFee, protocolFeeRate);
|
|
76
|
+
const inLp = (0, slippage_1.lpBalances)(actualBalances[tokenInIndex], virtualBalances[tokenInIndex], protocolFeesOwed[tokenInIndex]);
|
|
77
|
+
const outLp = (0, slippage_1.lpBalances)(actualBalances[other], virtualBalances[other], protocolFeesOwed[other]);
|
|
78
|
+
let amountOut;
|
|
79
|
+
try {
|
|
80
|
+
amountOut = (0, cubicMath_1.calcOutGivenIn)({
|
|
81
|
+
virtualBalanceIn: inLp.lpVirtual,
|
|
82
|
+
weightInBps: BigInt(weightsBps[tokenInIndex]),
|
|
83
|
+
virtualBalanceOut: outLp.lpVirtual,
|
|
84
|
+
weightOutBps: BigInt(weightsBps[other]),
|
|
85
|
+
amountIn: afterFee,
|
|
86
|
+
actualBalanceOut: outLp.lpActual,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return { score: 0n, amountOut: 0n };
|
|
91
|
+
}
|
|
92
|
+
if (amountOut <= 0n || amountOut >= outLp.lpActual)
|
|
93
|
+
return { score: 0n, amountOut };
|
|
94
|
+
const lpInAfter = inLp.lpActual + swapToOther - protocolFee;
|
|
95
|
+
const lpOutAfter = outLp.lpActual - amountOut;
|
|
96
|
+
if (lpInAfter <= 0n || lpOutAfter <= 0n)
|
|
97
|
+
return { score: 0n, amountOut };
|
|
98
|
+
const ratioIn = (remainingInput * fixedPoint_1.ONE) / lpInAfter;
|
|
99
|
+
const ratioOut = (amountOut * fixedPoint_1.ONE) / lpOutAfter;
|
|
100
|
+
return { score: ratioIn < ratioOut ? ratioIn : ratioOut, amountOut };
|
|
101
|
+
}
|
|
102
|
+
function computeTwoTokenOptimalAllocations(params) {
|
|
103
|
+
const { amountIn, tokenInIndex } = params;
|
|
104
|
+
if (amountIn <= 1n) {
|
|
105
|
+
throw new Error("computeTwoTokenOptimalAllocations: amountIn too small");
|
|
106
|
+
}
|
|
107
|
+
let low = 1n;
|
|
108
|
+
let high = amountIn - 1n;
|
|
109
|
+
for (let i = 0; i < 32 && low < high; i++) {
|
|
110
|
+
const mid = low + (high - low) / 2n;
|
|
111
|
+
const current = scoreTwoTokenSwap({ ...params, swapToOther: mid }).score;
|
|
112
|
+
const next = scoreTwoTokenSwap({
|
|
113
|
+
...params,
|
|
114
|
+
swapToOther: mid + 1n < amountIn ? mid + 1n : amountIn - 1n,
|
|
115
|
+
}).score;
|
|
116
|
+
if (next >= current)
|
|
117
|
+
low = mid + 1n;
|
|
118
|
+
else
|
|
119
|
+
high = mid;
|
|
120
|
+
}
|
|
121
|
+
const center = low < 1n ? 1n : low >= amountIn ? amountIn - 1n : low;
|
|
122
|
+
let bestSwap = center;
|
|
123
|
+
let bestScore = 0n;
|
|
124
|
+
const start = center > 8n ? center - 8n : 1n;
|
|
125
|
+
const end = center + 8n < amountIn ? center + 8n : amountIn - 1n;
|
|
126
|
+
for (let swapToOther = start; swapToOther <= end; swapToOther++) {
|
|
127
|
+
const { score, amountOut } = scoreTwoTokenSwap({ ...params, swapToOther });
|
|
128
|
+
if (amountOut > 0n && score > bestScore) {
|
|
129
|
+
bestScore = score;
|
|
130
|
+
bestSwap = swapToOther;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (bestScore === 0n) {
|
|
134
|
+
throw new Error("computeTwoTokenOptimalAllocations: amount too small");
|
|
135
|
+
}
|
|
136
|
+
const allocations = [0n, 0n];
|
|
137
|
+
const other = tokenInIndex === 0 ? 1 : 0;
|
|
138
|
+
allocations[tokenInIndex] = amountIn - bestSwap;
|
|
139
|
+
allocations[other] = bestSwap;
|
|
140
|
+
return { allocations, wScaled: [], sumW: bestScore };
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Mirror of stld `cap_deposit_amounts_to_lp_ratio`.
|
|
144
|
+
*
|
|
145
|
+
* `add_liquidity` mints BPT from the minimum ratio against LP-accessible
|
|
146
|
+
* balances (`actual - protocolFeesOwed`). Any helper-held amount above that
|
|
147
|
+
* common ratio would be donated, so the helper deposits the capped basket and
|
|
148
|
+
* refunds the rest.
|
|
149
|
+
*/
|
|
150
|
+
function capDepositAmountsToLpRatio(params) {
|
|
151
|
+
const { helperBalances, actualBalances, protocolFeesOwed } = params;
|
|
152
|
+
const n = helperBalances.length;
|
|
153
|
+
if (n !== actualBalances.length || n !== protocolFeesOwed.length) {
|
|
154
|
+
throw new Error("capDepositAmountsToLpRatio: length mismatch");
|
|
155
|
+
}
|
|
156
|
+
const lpBalancesForAdd = actualBalances.map((actual, i) => actual > protocolFeesOwed[i] ? actual - protocolFeesOwed[i] : 0n);
|
|
157
|
+
let ratioMin = null;
|
|
158
|
+
for (let i = 0; i < n; i++) {
|
|
159
|
+
if (actualBalances[i] > 0n && lpBalancesForAdd[i] === 0n) {
|
|
160
|
+
throw new Error("capDepositAmountsToLpRatio: live token has no LP claim");
|
|
161
|
+
}
|
|
162
|
+
if (lpBalancesForAdd[i] === 0n)
|
|
163
|
+
continue;
|
|
164
|
+
if (helperBalances[i] <= 0n) {
|
|
165
|
+
throw new Error("capDepositAmountsToLpRatio: amount too small");
|
|
166
|
+
}
|
|
167
|
+
const ratio = (helperBalances[i] * fixedPoint_1.ONE) / lpBalancesForAdd[i];
|
|
168
|
+
ratioMin = ratioMin === null || ratio < ratioMin ? ratio : ratioMin;
|
|
169
|
+
}
|
|
170
|
+
if (ratioMin === null || ratioMin === 0n) {
|
|
171
|
+
throw new Error("capDepositAmountsToLpRatio: amount too small");
|
|
172
|
+
}
|
|
173
|
+
const depositAmounts = lpBalancesForAdd.map((lp, i) => {
|
|
174
|
+
if (lp === 0n)
|
|
175
|
+
return 0n;
|
|
176
|
+
const amount = (lp * ratioMin) / fixedPoint_1.ONE;
|
|
177
|
+
if (amount <= 0n) {
|
|
178
|
+
throw new Error("capDepositAmountsToLpRatio: amount too small");
|
|
179
|
+
}
|
|
180
|
+
return amount > helperBalances[i] ? helperBalances[i] : amount;
|
|
181
|
+
});
|
|
182
|
+
const refundAmounts = helperBalances.map((balance, i) => balance > depositAmounts[i] ? balance - depositAmounts[i] : 0n);
|
|
183
|
+
return { depositAmounts, refundAmounts, lpBalancesForAdd };
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=singleToken.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"singleToken.js","sourceRoot":"","sources":["../../src/math/singleToken.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* min_out = expected * (SLIPPAGE_PRECISION - slippage_hbps) / SLIPPAGE_PRECISION.
|
|
3
|
+
* Matches `apply_slippage` in stld's math.rs.
|
|
4
|
+
*/
|
|
5
|
+
export declare function applySlippage(expected: bigint, slippageHbps: number): bigint;
|
|
6
|
+
/**
|
|
7
|
+
* fee = amount * rate / SWAP_FEE_PRECISION. Returns amount - fee.
|
|
8
|
+
* Matches `apply_swap_fee`.
|
|
9
|
+
*/
|
|
10
|
+
export declare function applySwapFee(amount: bigint, swapFeeRate: number): bigint;
|
|
11
|
+
/**
|
|
12
|
+
* LP-accessible balances: lp_actual = actual - pfo; lp_virtual scaled to
|
|
13
|
+
* match. Used by the off-chain single-token quote in `math/singleToken`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function lpBalances(actual: bigint, virtualBal: bigint, pfo: bigint): {
|
|
16
|
+
lpActual: bigint;
|
|
17
|
+
lpVirtual: bigint;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Price impact in hundredths of basis point: (spot - actual) / spot × 1_000_000.
|
|
21
|
+
* 0 if spot is 0.
|
|
22
|
+
*/
|
|
23
|
+
export declare function priceImpactHbps(spot: bigint, actual: bigint): number;
|
|
24
|
+
//# sourceMappingURL=slippage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slippage.d.ts","sourceRoot":"","sources":["../../src/math/slippage.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAM5E;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAOxE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAKnH;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAMpE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applySlippage = applySlippage;
|
|
4
|
+
exports.applySwapFee = applySwapFee;
|
|
5
|
+
exports.lpBalances = lpBalances;
|
|
6
|
+
exports.priceImpactHbps = priceImpactHbps;
|
|
7
|
+
const config_1 = require("../config");
|
|
8
|
+
/**
|
|
9
|
+
* min_out = expected * (SLIPPAGE_PRECISION - slippage_hbps) / SLIPPAGE_PRECISION.
|
|
10
|
+
* Matches `apply_slippage` in stld's math.rs.
|
|
11
|
+
*/
|
|
12
|
+
function applySlippage(expected, slippageHbps) {
|
|
13
|
+
if (slippageHbps < 0 || slippageHbps > config_1.SLIPPAGE_PRECISION) {
|
|
14
|
+
throw new Error(`slippage: ${slippageHbps} out of [0, ${config_1.SLIPPAGE_PRECISION}]`);
|
|
15
|
+
}
|
|
16
|
+
const keep = BigInt(config_1.SLIPPAGE_PRECISION - slippageHbps);
|
|
17
|
+
return (expected * keep) / BigInt(config_1.SLIPPAGE_PRECISION);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* fee = amount * rate / SWAP_FEE_PRECISION. Returns amount - fee.
|
|
21
|
+
* Matches `apply_swap_fee`.
|
|
22
|
+
*/
|
|
23
|
+
function applySwapFee(amount, swapFeeRate) {
|
|
24
|
+
if (swapFeeRate < 0)
|
|
25
|
+
throw new Error("swapFee: negative rate");
|
|
26
|
+
const fee = (amount * BigInt(swapFeeRate)) / BigInt(config_1.SWAP_FEE_PRECISION);
|
|
27
|
+
if (swapFeeRate > 0 && fee === 0n) {
|
|
28
|
+
throw new Error("swapFee: amount too small, fee rounds to zero");
|
|
29
|
+
}
|
|
30
|
+
return amount - fee;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* LP-accessible balances: lp_actual = actual - pfo; lp_virtual scaled to
|
|
34
|
+
* match. Used by the off-chain single-token quote in `math/singleToken`.
|
|
35
|
+
*/
|
|
36
|
+
function lpBalances(actual, virtualBal, pfo) {
|
|
37
|
+
const lpActual = actual >= pfo ? actual - pfo : 0n;
|
|
38
|
+
const lpVirtual = actual > 0n ? (virtualBal * lpActual) / actual : virtualBal;
|
|
39
|
+
return { lpActual, lpVirtual };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Price impact in hundredths of basis point: (spot - actual) / spot × 1_000_000.
|
|
43
|
+
* 0 if spot is 0.
|
|
44
|
+
*/
|
|
45
|
+
function priceImpactHbps(spot, actual) {
|
|
46
|
+
if (spot <= 0n)
|
|
47
|
+
return 0;
|
|
48
|
+
if (actual >= spot)
|
|
49
|
+
return 0;
|
|
50
|
+
const diff = spot - actual;
|
|
51
|
+
const hbps = (diff * BigInt(config_1.SLIPPAGE_PRECISION)) / spot;
|
|
52
|
+
return Number(hbps);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=slippage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slippage.js","sourceRoot":"","sources":["../../src/math/slippage.ts"],"names":[],"mappings":";;AAMA,sCAMC;AAMD,oCAOC;AAMD,gCAKC;AAMD,0CAMC;AAhDD,sCAAmE;AAEnE;;;GAGG;AACH,SAAgB,aAAa,CAAC,QAAgB,EAAE,YAAoB;IAClE,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,GAAG,2BAAkB,EAAE,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,aAAa,YAAY,eAAe,2BAAkB,GAAG,CAAC,CAAC;IACjF,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,2BAAkB,GAAG,YAAY,CAAC,CAAC;IACvD,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,2BAAkB,CAAC,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,MAAc,EAAE,WAAmB;IAC9D,IAAI,WAAW,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,2BAAkB,CAAC,CAAC;IACxE,IAAI,WAAW,GAAG,CAAC,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,MAAM,GAAG,GAAG,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAgB,UAAU,CAAC,MAAc,EAAE,UAAkB,EAAE,GAAW;IACxE,MAAM,QAAQ,GAAG,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,MAAM,SAAS,GACb,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,IAAY,EAAE,MAAc;IAC1D,IAAI,IAAI,IAAI,EAAE;QAAE,OAAO,CAAC,CAAC;IACzB,IAAI,MAAM,IAAI,IAAI;QAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,2BAAkB,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate a weight vector. Must sum exactly to 10_000 (WEIGHT_SCALE) and
|
|
3
|
+
* every entry must be in [MIN_WEIGHT, MAX_WEIGHT].
|
|
4
|
+
*/
|
|
5
|
+
export declare function validateWeights(weights: number[]): void;
|
|
6
|
+
/**
|
|
7
|
+
* Weighted spot price of token_out priced in token_in, normalised to 18
|
|
8
|
+
* decimals. Used only for display; on-chain quoting uses calcOutGivenIn.
|
|
9
|
+
*/
|
|
10
|
+
export declare function calcSpotPrice(params: {
|
|
11
|
+
balanceIn: bigint;
|
|
12
|
+
weightInBps: bigint;
|
|
13
|
+
balanceOut: bigint;
|
|
14
|
+
weightOutBps: bigint;
|
|
15
|
+
decimalsIn: number;
|
|
16
|
+
decimalsOut: number;
|
|
17
|
+
}): bigint;
|
|
18
|
+
//# sourceMappingURL=weightedMath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weightedMath.d.ts","sourceRoot":"","sources":["../../src/math/weightedMath.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,CAiBvD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,MAAM,CAWT"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateWeights = validateWeights;
|
|
4
|
+
exports.calcSpotPrice = calcSpotPrice;
|
|
5
|
+
const config_1 = require("../config");
|
|
6
|
+
/**
|
|
7
|
+
* Validate a weight vector. Must sum exactly to 10_000 (WEIGHT_SCALE) and
|
|
8
|
+
* every entry must be in [MIN_WEIGHT, MAX_WEIGHT].
|
|
9
|
+
*/
|
|
10
|
+
function validateWeights(weights) {
|
|
11
|
+
if (!Array.isArray(weights) || weights.length < 2) {
|
|
12
|
+
throw new Error("weightedMath: at least 2 weights required");
|
|
13
|
+
}
|
|
14
|
+
let sum = 0;
|
|
15
|
+
for (const w of weights) {
|
|
16
|
+
if (!Number.isInteger(w)) {
|
|
17
|
+
throw new Error("weightedMath: weights must be integers (bps)");
|
|
18
|
+
}
|
|
19
|
+
if (w < config_1.MIN_WEIGHT || w > config_1.MAX_WEIGHT) {
|
|
20
|
+
throw new Error(`weightedMath: weight ${w} out of [${config_1.MIN_WEIGHT}, ${config_1.MAX_WEIGHT}]`);
|
|
21
|
+
}
|
|
22
|
+
sum += w;
|
|
23
|
+
}
|
|
24
|
+
if (sum !== config_1.WEIGHT_SCALE) {
|
|
25
|
+
throw new Error(`weightedMath: weights sum to ${sum}, expected ${config_1.WEIGHT_SCALE}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Weighted spot price of token_out priced in token_in, normalised to 18
|
|
30
|
+
* decimals. Used only for display; on-chain quoting uses calcOutGivenIn.
|
|
31
|
+
*/
|
|
32
|
+
function calcSpotPrice(params) {
|
|
33
|
+
const { balanceIn, weightInBps, balanceOut, weightOutBps, decimalsIn, decimalsOut } = params;
|
|
34
|
+
const scaleIn = 10n ** BigInt(18 - decimalsIn);
|
|
35
|
+
const scaleOut = 10n ** BigInt(18 - decimalsOut);
|
|
36
|
+
const bI = balanceIn * scaleIn;
|
|
37
|
+
const bO = balanceOut * scaleOut;
|
|
38
|
+
if (bO === 0n || weightOutBps === 0n)
|
|
39
|
+
return 0n;
|
|
40
|
+
// price = (bI / wI) / (bO / wO)
|
|
41
|
+
const numer = bI * weightOutBps * 10n ** 18n;
|
|
42
|
+
const denom = bO * weightInBps;
|
|
43
|
+
return numer / denom;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=weightedMath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"weightedMath.js","sourceRoot":"","sources":["../../src/math/weightedMath.ts"],"names":[],"mappings":";;AAMA,0CAiBC;AAMD,sCAkBC;AA/CD,sCAAiE;AAEjE;;;GAGG;AACH,SAAgB,eAAe,CAAC,OAAiB;IAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,GAAG,mBAAU,IAAI,CAAC,GAAG,mBAAU,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,YAAY,mBAAU,KAAK,mBAAU,GAAG,CAAC,CAAC;QACrF,CAAC;QACD,GAAG,IAAI,CAAC,CAAC;IACX,CAAC;IACD,IAAI,GAAG,KAAK,qBAAY,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,cAAc,qBAAY,EAAE,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,aAAa,CAAC,MAO7B;IACC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;IAC7F,MAAM,OAAO,GAAG,GAAG,IAAI,MAAM,CAAC,EAAE,GAAG,UAAU,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,GAAG,IAAI,MAAM,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC;IACjD,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAAC;IAC/B,MAAM,EAAE,GAAG,UAAU,GAAG,QAAQ,CAAC;IACjC,IAAI,EAAE,KAAK,EAAE,IAAI,YAAY,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IAChD,gCAAgC;IAChC,MAAM,KAAK,GAAG,EAAE,GAAG,YAAY,GAAG,GAAG,IAAI,GAAG,CAAC;IAC7C,MAAM,KAAK,GAAG,EAAE,GAAG,WAAW,CAAC;IAC/B,OAAO,KAAK,GAAG,KAAK,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import BN from "bn.js";
|
|
2
|
+
import { PublicKey } from "@solana/web3.js";
|
|
3
|
+
/**
|
|
4
|
+
* Minimal Borsh-compatible reader. Enough to decode the Cube contract
|
|
5
|
+
* event structs (Pubkey × N, u8/u16/u32/u64/i64, bool, Vec<u64>,
|
|
6
|
+
* Vec<Pubkey>). Avoids pulling a borsh dep into the SDK's hot path.
|
|
7
|
+
*/
|
|
8
|
+
export declare class BorshReader {
|
|
9
|
+
private readonly buf;
|
|
10
|
+
private offset;
|
|
11
|
+
constructor(buf: Buffer);
|
|
12
|
+
remaining(): number;
|
|
13
|
+
skip(n: number): void;
|
|
14
|
+
u8(): number;
|
|
15
|
+
u16(): number;
|
|
16
|
+
u32(): number;
|
|
17
|
+
u64(): BN;
|
|
18
|
+
i64(): BN;
|
|
19
|
+
bool(): boolean;
|
|
20
|
+
pubkey(): PublicKey;
|
|
21
|
+
vecU64(): BN[];
|
|
22
|
+
vecPubkey(): PublicKey[];
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=borsh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"borsh.d.ts","sourceRoot":"","sources":["../../src/parsers/borsh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,OAAO,CAAC;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;GAIG;AACH,qBAAa,WAAW;IAEV,OAAO,CAAC,QAAQ,CAAC,GAAG;IADhC,OAAO,CAAC,MAAM,CAAK;gBACU,GAAG,EAAE,MAAM;IAExC,SAAS,IAAI,MAAM;IAInB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI;IAIrB,EAAE,IAAI,MAAM;IAMZ,GAAG,IAAI,MAAM;IAMb,GAAG,IAAI,MAAM;IAMb,GAAG,IAAI,EAAE;IAMT,GAAG,IAAI,EAAE;IAYT,IAAI,IAAI,OAAO;IAIf,MAAM,IAAI,SAAS;IAMnB,MAAM,IAAI,EAAE,EAAE;IAOd,SAAS,IAAI,SAAS,EAAE;CAMzB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.BorshReader = void 0;
|
|
7
|
+
const bn_js_1 = __importDefault(require("bn.js"));
|
|
8
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
9
|
+
/**
|
|
10
|
+
* Minimal Borsh-compatible reader. Enough to decode the Cube contract
|
|
11
|
+
* event structs (Pubkey × N, u8/u16/u32/u64/i64, bool, Vec<u64>,
|
|
12
|
+
* Vec<Pubkey>). Avoids pulling a borsh dep into the SDK's hot path.
|
|
13
|
+
*/
|
|
14
|
+
class BorshReader {
|
|
15
|
+
constructor(buf) {
|
|
16
|
+
this.buf = buf;
|
|
17
|
+
this.offset = 0;
|
|
18
|
+
}
|
|
19
|
+
remaining() {
|
|
20
|
+
return this.buf.length - this.offset;
|
|
21
|
+
}
|
|
22
|
+
skip(n) {
|
|
23
|
+
this.offset += n;
|
|
24
|
+
}
|
|
25
|
+
u8() {
|
|
26
|
+
const v = this.buf.readUInt8(this.offset);
|
|
27
|
+
this.offset += 1;
|
|
28
|
+
return v;
|
|
29
|
+
}
|
|
30
|
+
u16() {
|
|
31
|
+
const v = this.buf.readUInt16LE(this.offset);
|
|
32
|
+
this.offset += 2;
|
|
33
|
+
return v;
|
|
34
|
+
}
|
|
35
|
+
u32() {
|
|
36
|
+
const v = this.buf.readUInt32LE(this.offset);
|
|
37
|
+
this.offset += 4;
|
|
38
|
+
return v;
|
|
39
|
+
}
|
|
40
|
+
u64() {
|
|
41
|
+
const slice = this.buf.slice(this.offset, this.offset + 8);
|
|
42
|
+
this.offset += 8;
|
|
43
|
+
return new bn_js_1.default(slice, "le");
|
|
44
|
+
}
|
|
45
|
+
i64() {
|
|
46
|
+
const slice = this.buf.slice(this.offset, this.offset + 8);
|
|
47
|
+
this.offset += 8;
|
|
48
|
+
// i64 is two's complement little-endian — treat as signed.
|
|
49
|
+
const bn = new bn_js_1.default(slice, "le");
|
|
50
|
+
if (slice[7] & 0x80) {
|
|
51
|
+
// top bit set → negative: subtract 2^64
|
|
52
|
+
return bn.sub(new bn_js_1.default(2).pow(new bn_js_1.default(64)));
|
|
53
|
+
}
|
|
54
|
+
return bn;
|
|
55
|
+
}
|
|
56
|
+
bool() {
|
|
57
|
+
return this.u8() !== 0;
|
|
58
|
+
}
|
|
59
|
+
pubkey() {
|
|
60
|
+
const slice = this.buf.slice(this.offset, this.offset + 32);
|
|
61
|
+
this.offset += 32;
|
|
62
|
+
return new web3_js_1.PublicKey(slice);
|
|
63
|
+
}
|
|
64
|
+
vecU64() {
|
|
65
|
+
const len = this.u32();
|
|
66
|
+
const out = [];
|
|
67
|
+
for (let i = 0; i < len; i++)
|
|
68
|
+
out.push(this.u64());
|
|
69
|
+
return out;
|
|
70
|
+
}
|
|
71
|
+
vecPubkey() {
|
|
72
|
+
const len = this.u32();
|
|
73
|
+
const out = [];
|
|
74
|
+
for (let i = 0; i < len; i++)
|
|
75
|
+
out.push(this.pubkey());
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.BorshReader = BorshReader;
|
|
80
|
+
//# sourceMappingURL=borsh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"borsh.js","sourceRoot":"","sources":["../../src/parsers/borsh.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAuB;AACvB,6CAA4C;AAE5C;;;;GAIG;AACH,MAAa,WAAW;IAEtB,YAA6B,GAAW;QAAX,QAAG,GAAH,GAAG,CAAQ;QADhC,WAAM,GAAG,CAAC,CAAC;IACwB,CAAC;IAE5C,SAAS;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACvC,CAAC;IAED,IAAI,CAAC,CAAS;QACZ,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,EAAE;QACA,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,GAAG;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,OAAO,IAAI,eAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,GAAG;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACjB,2DAA2D;QAC3D,MAAM,EAAE,GAAG,IAAI,eAAE,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;YACpB,wCAAwC;YACxC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,eAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,eAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QAClB,OAAO,IAAI,mBAAS,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,MAAM;QACJ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAS,EAAE,CAAC;QACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS;QACP,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,GAAG,GAAgB,EAAE,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAvED,kCAuEC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/parsers/events.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAiCjD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,CA0BrE"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseCubicPoolEvents = parseCubicPoolEvents;
|
|
4
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
+
const borsh_1 = require("./borsh");
|
|
6
|
+
/**
|
|
7
|
+
* Anchor event log format (base64-encoded after `Program data:`):
|
|
8
|
+
* [ 8-byte discriminator | borsh-encoded event struct ]
|
|
9
|
+
*
|
|
10
|
+
* Discriminators for cubic-pool and single-token-liquidity are hard-coded
|
|
11
|
+
* here from the generated IDL. Never guess from event name — the Anchor
|
|
12
|
+
* macro actually uses `sha256("event:<Name>")[0..8]`, but for robustness
|
|
13
|
+
* we pin the bytes.
|
|
14
|
+
*/
|
|
15
|
+
// Cubic-pool event discriminators (from target/idl/cubic_pool.json):
|
|
16
|
+
const DISC = {
|
|
17
|
+
PoolInitialized: Buffer.from([100, 118, 173, 87, 12, 198, 254, 229]),
|
|
18
|
+
Swap: Buffer.from([81, 108, 227, 190, 205, 208, 10, 196]),
|
|
19
|
+
LiquidityAdded: Buffer.from([154, 26, 221, 108, 238, 64, 217, 161]),
|
|
20
|
+
LiquidityRemoved: Buffer.from([225, 105, 216, 39, 124, 116, 169, 189]),
|
|
21
|
+
ProtocolFeesCollected: Buffer.from([165, 34, 125, 155, 15, 86, 99, 191]),
|
|
22
|
+
SwapFeeRateUpdated: Buffer.from([101, 132, 24, 255, 91, 253, 227, 101]),
|
|
23
|
+
ProtocolFeeRateUpdated: Buffer.from([189, 56, 7, 65, 0, 95, 192, 6]),
|
|
24
|
+
PoolEnabledUpdated: Buffer.from([101, 47, 3, 240, 197, 181, 236, 142]),
|
|
25
|
+
SwapsEnabledUpdated: Buffer.from([55, 116, 118, 138, 102, 26, 227, 223]),
|
|
26
|
+
DebugLiquidityWithdrawn: Buffer.from([174, 59, 149, 22, 135, 129, 129, 83]),
|
|
27
|
+
PoolStateLog: Buffer.from([59, 254, 237, 111, 163, 10, 140, 224]),
|
|
28
|
+
PoolInfo: Buffer.from([207, 20, 87, 97, 251, 212, 234, 45]),
|
|
29
|
+
BannedExtensionsUpdated: Buffer.from([107, 126, 13, 149, 182, 108, 139, 202]),
|
|
30
|
+
// Stld:
|
|
31
|
+
SingleTokenDeposit: Buffer.from([215, 54, 137, 104, 219, 39, 164, 235]),
|
|
32
|
+
};
|
|
33
|
+
function parseCubicPoolEvents(logs) {
|
|
34
|
+
const out = [];
|
|
35
|
+
for (const line of logs) {
|
|
36
|
+
const m = line.match(/^Program data:\s+(.+)$/);
|
|
37
|
+
if (!m)
|
|
38
|
+
continue;
|
|
39
|
+
const buf = Buffer.from(m[1], "base64");
|
|
40
|
+
if (buf.length < 8)
|
|
41
|
+
continue;
|
|
42
|
+
const disc = buf.slice(0, 8);
|
|
43
|
+
const payload = buf.slice(8);
|
|
44
|
+
const name = matchDiscriminator(disc);
|
|
45
|
+
if (!name) {
|
|
46
|
+
out.push({ kind: "Unknown", name: "unknown", data: { disc: disc.toString("base64"), payload: payload.toString("base64") } });
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const ev = decodeEvent(name, payload);
|
|
51
|
+
if (ev)
|
|
52
|
+
out.push(ev);
|
|
53
|
+
}
|
|
54
|
+
catch (e) {
|
|
55
|
+
out.push({
|
|
56
|
+
kind: "Unknown",
|
|
57
|
+
name,
|
|
58
|
+
data: { error: String(e), payload: payload.toString("base64") },
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
function matchDiscriminator(d) {
|
|
65
|
+
for (const [name, bytes] of Object.entries(DISC)) {
|
|
66
|
+
if (bytes.equals(d))
|
|
67
|
+
return name;
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
function decodeEvent(name, buf) {
|
|
72
|
+
const r = new borsh_1.BorshReader(buf);
|
|
73
|
+
switch (name) {
|
|
74
|
+
case "Swap": {
|
|
75
|
+
const pool = r.pubkey();
|
|
76
|
+
const user = r.pubkey();
|
|
77
|
+
const tokenIn = r.pubkey();
|
|
78
|
+
const tokenOut = r.pubkey();
|
|
79
|
+
const amountIn = r.u64();
|
|
80
|
+
const amountOut = r.u64();
|
|
81
|
+
const feeAmount = r.u64();
|
|
82
|
+
const protocolFeeAmount = r.u64();
|
|
83
|
+
const timestamp = r.i64().toNumber();
|
|
84
|
+
return { kind: "Swap", pool, user, tokenIn, tokenOut, amountIn, amountOut, feeAmount, protocolFeeAmount, timestamp };
|
|
85
|
+
}
|
|
86
|
+
case "LiquidityAdded": {
|
|
87
|
+
const pool = r.pubkey();
|
|
88
|
+
const user = r.pubkey();
|
|
89
|
+
const tokenAmounts = r.vecU64();
|
|
90
|
+
const bptAmount = r.u64();
|
|
91
|
+
const timestamp = r.i64().toNumber();
|
|
92
|
+
return { kind: "LiquidityAdded", pool, user, tokenAmounts, bptAmount, timestamp };
|
|
93
|
+
}
|
|
94
|
+
case "LiquidityRemoved": {
|
|
95
|
+
const pool = r.pubkey();
|
|
96
|
+
const user = r.pubkey();
|
|
97
|
+
const bptAmount = r.u64();
|
|
98
|
+
const tokenAmounts = r.vecU64();
|
|
99
|
+
const timestamp = r.i64().toNumber();
|
|
100
|
+
return { kind: "LiquidityRemoved", pool, user, bptAmount, tokenAmounts, timestamp };
|
|
101
|
+
}
|
|
102
|
+
case "ProtocolFeesCollected": {
|
|
103
|
+
const pool = r.pubkey();
|
|
104
|
+
const authority = r.pubkey();
|
|
105
|
+
const tokenAmounts = r.vecU64();
|
|
106
|
+
const timestamp = r.i64().toNumber();
|
|
107
|
+
return { kind: "ProtocolFeesCollected", pool, authority, tokenAmounts, timestamp };
|
|
108
|
+
}
|
|
109
|
+
case "PoolInitialized": {
|
|
110
|
+
const pool = r.pubkey();
|
|
111
|
+
const config = r.pubkey();
|
|
112
|
+
const tokenCount = r.u8();
|
|
113
|
+
const bptMint = r.pubkey();
|
|
114
|
+
const timestamp = r.i64().toNumber();
|
|
115
|
+
return { kind: "PoolInitialized", pool, config, tokenCount, bptMint, timestamp };
|
|
116
|
+
}
|
|
117
|
+
case "PoolEnabledUpdated": {
|
|
118
|
+
const pool = r.pubkey();
|
|
119
|
+
const authority = r.pubkey();
|
|
120
|
+
const oldValue = r.bool();
|
|
121
|
+
const newValue = r.bool();
|
|
122
|
+
const timestamp = r.i64().toNumber();
|
|
123
|
+
return { kind: "PoolEnabledUpdated", pool, authority, oldValue, newValue, timestamp };
|
|
124
|
+
}
|
|
125
|
+
case "SwapsEnabledUpdated": {
|
|
126
|
+
const pool = r.pubkey();
|
|
127
|
+
const authority = r.pubkey();
|
|
128
|
+
const oldValue = r.bool();
|
|
129
|
+
const newValue = r.bool();
|
|
130
|
+
const timestamp = r.i64().toNumber();
|
|
131
|
+
return { kind: "SwapsEnabledUpdated", pool, authority, oldValue, newValue, timestamp };
|
|
132
|
+
}
|
|
133
|
+
case "SingleTokenDeposit": {
|
|
134
|
+
const helper = r.pubkey();
|
|
135
|
+
const pool = r.pubkey();
|
|
136
|
+
const user = r.pubkey();
|
|
137
|
+
const tokenInIndex = r.u8();
|
|
138
|
+
const amountIn = r.u64();
|
|
139
|
+
const slippageHundredthsBps = r.u32();
|
|
140
|
+
const allocations = r.vecU64();
|
|
141
|
+
const depositedAmounts = r.vecU64();
|
|
142
|
+
const bptReceived = r.u64();
|
|
143
|
+
const dustRefunded = r.u64();
|
|
144
|
+
const timestamp = r.i64().toNumber();
|
|
145
|
+
return {
|
|
146
|
+
kind: "SingleTokenDeposit",
|
|
147
|
+
helper,
|
|
148
|
+
pool,
|
|
149
|
+
user,
|
|
150
|
+
tokenInIndex,
|
|
151
|
+
amountIn,
|
|
152
|
+
slippageHundredthsBps,
|
|
153
|
+
allocations,
|
|
154
|
+
depositedAmounts,
|
|
155
|
+
bptReceived,
|
|
156
|
+
dustRefunded,
|
|
157
|
+
timestamp,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// Events we don't yet surface as typed — decode as Unknown so the
|
|
161
|
+
// caller gets the discriminator name and can act on it.
|
|
162
|
+
case "SwapFeeRateUpdated":
|
|
163
|
+
case "ProtocolFeeRateUpdated":
|
|
164
|
+
case "BannedExtensionsUpdated":
|
|
165
|
+
case "DebugLiquidityWithdrawn":
|
|
166
|
+
case "PoolStateLog":
|
|
167
|
+
case "PoolInfo":
|
|
168
|
+
return { kind: "Unknown", name, data: { raw: buf.toString("base64") } };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
void web3_js_1.PublicKey; // keep import used by types above via type inference
|
|
172
|
+
//# sourceMappingURL=events.js.map
|