@elemental-stv-core/sdk 0.2.0 → 0.3.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.
Files changed (70) hide show
  1. package/dist/elemental-lend/index.d.ts +2 -0
  2. package/dist/elemental-lend/index.d.ts.map +1 -1
  3. package/dist/elemental-lend/index.js +2 -0
  4. package/dist/elemental-lend/index.js.map +1 -1
  5. package/dist/elemental-lend/jupiter-lend.d.ts +4 -0
  6. package/dist/elemental-lend/jupiter-lend.d.ts.map +1 -1
  7. package/dist/elemental-lend/jupiter-lend.js +29 -1
  8. package/dist/elemental-lend/jupiter-lend.js.map +1 -1
  9. package/dist/elemental-lend/kamino-vault.d.ts +173 -0
  10. package/dist/elemental-lend/kamino-vault.d.ts.map +1 -0
  11. package/dist/elemental-lend/kamino-vault.js +460 -0
  12. package/dist/elemental-lend/kamino-vault.js.map +1 -0
  13. package/dist/elemental-lend/protocol-actions.d.ts +49 -0
  14. package/dist/elemental-lend/protocol-actions.d.ts.map +1 -0
  15. package/dist/elemental-lend/protocol-actions.js +228 -0
  16. package/dist/elemental-lend/protocol-actions.js.map +1 -0
  17. package/dist/jlpd-strategy/constants.d.ts +16 -0
  18. package/dist/jlpd-strategy/constants.d.ts.map +1 -1
  19. package/dist/jlpd-strategy/constants.js +28 -3
  20. package/dist/jlpd-strategy/constants.js.map +1 -1
  21. package/dist/jlpd-strategy/index.d.ts +3 -0
  22. package/dist/jlpd-strategy/index.d.ts.map +1 -1
  23. package/dist/jlpd-strategy/index.js +3 -0
  24. package/dist/jlpd-strategy/index.js.map +1 -1
  25. package/dist/jlpd-strategy/jlp-data.d.ts +73 -0
  26. package/dist/jlpd-strategy/jlp-data.d.ts.map +1 -0
  27. package/dist/jlpd-strategy/jlp-data.js +406 -0
  28. package/dist/jlpd-strategy/jlp-data.js.map +1 -0
  29. package/dist/jlpd-strategy/settle-yield.d.ts +54 -0
  30. package/dist/jlpd-strategy/settle-yield.d.ts.map +1 -0
  31. package/dist/jlpd-strategy/settle-yield.js +103 -0
  32. package/dist/jlpd-strategy/settle-yield.js.map +1 -0
  33. package/dist/jlpd-strategy/swap-jlp.d.ts +151 -0
  34. package/dist/jlpd-strategy/swap-jlp.d.ts.map +1 -0
  35. package/dist/jlpd-strategy/swap-jlp.js +429 -0
  36. package/dist/jlpd-strategy/swap-jlp.js.map +1 -0
  37. package/dist/p-stv-core/accounts.d.ts.map +1 -1
  38. package/dist/p-stv-core/accounts.js +14 -10
  39. package/dist/p-stv-core/accounts.js.map +1 -1
  40. package/dist/p-stv-core/constants.d.ts +3 -1
  41. package/dist/p-stv-core/constants.d.ts.map +1 -1
  42. package/dist/p-stv-core/constants.js +5 -3
  43. package/dist/p-stv-core/constants.js.map +1 -1
  44. package/dist/p-stv-core/index.d.ts +4 -0
  45. package/dist/p-stv-core/index.d.ts.map +1 -1
  46. package/dist/p-stv-core/index.js +4 -0
  47. package/dist/p-stv-core/index.js.map +1 -1
  48. package/dist/p-stv-core/instructions.d.ts +26 -0
  49. package/dist/p-stv-core/instructions.d.ts.map +1 -1
  50. package/dist/p-stv-core/instructions.js +37 -6
  51. package/dist/p-stv-core/instructions.js.map +1 -1
  52. package/dist/p-stv-core/prices.d.ts +21 -0
  53. package/dist/p-stv-core/prices.d.ts.map +1 -0
  54. package/dist/p-stv-core/prices.js +78 -0
  55. package/dist/p-stv-core/prices.js.map +1 -0
  56. package/dist/p-stv-core/remaining-accounts.d.ts +99 -0
  57. package/dist/p-stv-core/remaining-accounts.d.ts.map +1 -0
  58. package/dist/p-stv-core/remaining-accounts.js +262 -0
  59. package/dist/p-stv-core/remaining-accounts.js.map +1 -0
  60. package/dist/p-stv-core/send-tx.d.ts +56 -0
  61. package/dist/p-stv-core/send-tx.d.ts.map +1 -0
  62. package/dist/p-stv-core/send-tx.js +299 -0
  63. package/dist/p-stv-core/send-tx.js.map +1 -0
  64. package/dist/p-stv-core/sol-wrap.d.ts +35 -0
  65. package/dist/p-stv-core/sol-wrap.d.ts.map +1 -0
  66. package/dist/p-stv-core/sol-wrap.js +95 -0
  67. package/dist/p-stv-core/sol-wrap.js.map +1 -0
  68. package/dist/p-stv-core/types.d.ts +16 -1
  69. package/dist/p-stv-core/types.d.ts.map +1 -1
  70. package/package.json +1 -1
@@ -0,0 +1,406 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fetchJlpPoolDetails = fetchJlpPoolDetails;
4
+ exports.computeAddLiquidityFee = computeAddLiquidityFee;
5
+ exports.fetchJlpCustodyData = fetchJlpCustodyData;
6
+ const web3_js_1 = require("@solana/web3.js");
7
+ const constants_1 = require("./constants");
8
+ const CUSTODIES = [
9
+ {
10
+ name: "SOL",
11
+ address: new web3_js_1.PublicKey("7xS2gz2bTp3fwCC7knJvUWTEU9Tycczu6VhJYKgi1wdz"),
12
+ decimals: 9,
13
+ isStable: false,
14
+ mintAddress: "So11111111111111111111111111111111111111112",
15
+ },
16
+ {
17
+ name: "ETH",
18
+ address: new web3_js_1.PublicKey("AQCGyheWPLeo6Qp9WpYS9m3Qj479t7R636N9ey1rEjEn"),
19
+ decimals: 8,
20
+ isStable: false,
21
+ mintAddress: "7vfCXTUXx5WJV5JADk17DUJ4ksgau7utNKj4b963voxs",
22
+ },
23
+ {
24
+ name: "WBTC",
25
+ address: new web3_js_1.PublicKey("5Pv3gM9JrFFH883SWAhvJC9RPYmo8UNxuFtv5bMMALkm"),
26
+ decimals: 8,
27
+ isStable: false,
28
+ mintAddress: "3NZ9JMVBmGAqocybic2c7LQCJScmgsAZ6vQqTDzcqmJh",
29
+ },
30
+ {
31
+ name: "USDC",
32
+ address: new web3_js_1.PublicKey("G18jKKXQwBbrHeiK3C9MRXhkHsLHf7XgCSisykV46EZa"),
33
+ decimals: 6,
34
+ isStable: true,
35
+ mintAddress: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
36
+ },
37
+ {
38
+ name: "USDT",
39
+ address: new web3_js_1.PublicKey("4vkNeXiYEUizLdrpdPS1eC2mccyM4NUPRtERrk6ZETkk"),
40
+ decimals: 6,
41
+ isStable: true,
42
+ mintAddress: "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB",
43
+ },
44
+ ];
45
+ // ---------------------------------------------------------------------------
46
+ // Custody account byte offsets (Jupiter Perps on-chain layout)
47
+ // ---------------------------------------------------------------------------
48
+ const OFFSET_TARGET_RATIO_BPS = 206; // u64 LE, custody target weight (right before assets)
49
+ const OFFSET_ASSETS = 214;
50
+ const OFFSET_ASSETS_OWNED = OFFSET_ASSETS + 8;
51
+ const OFFSET_ASSETS_LOCKED = OFFSET_ASSETS + 16;
52
+ const OFFSET_ASSETS_GUARANTEED_USD = OFFSET_ASSETS + 24;
53
+ const OFFSET_ASSETS_GLOBAL_SHORT_SIZES = OFFSET_ASSETS + 32;
54
+ const OFFSET_ASSETS_GLOBAL_SHORT_AVG_PX = OFFSET_ASSETS + 40;
55
+ const OFFSET_DEBT = 1004;
56
+ const OFFSET_BORROW_LEND_INTERESTS_ACCRUED = 1020;
57
+ const SCALE_USD = 1e6;
58
+ const DEBT_MULTIPLIER = 1e9;
59
+ const JUPITER_PRICE_API = "https://lite-api.jup.ag/price/v3";
60
+ // ---------------------------------------------------------------------------
61
+ // Binary parsing helpers
62
+ // ---------------------------------------------------------------------------
63
+ function u64FromLE(buf, offset) {
64
+ let res = 0n;
65
+ for (let i = 0; i < 8; i++) {
66
+ res |= BigInt(buf[offset + i] ?? 0) << BigInt(8 * i);
67
+ }
68
+ return res;
69
+ }
70
+ function u128FromLE(buf, offset) {
71
+ let res = 0n;
72
+ for (let i = 0; i < 16; i++) {
73
+ res |= BigInt(buf[offset + i] ?? 0) << BigInt(8 * i);
74
+ }
75
+ return res;
76
+ }
77
+ // ---------------------------------------------------------------------------
78
+ // Data fetching
79
+ // ---------------------------------------------------------------------------
80
+ async function fetchAllCustodies(connection) {
81
+ const addresses = CUSTODIES.map((c) => c.address);
82
+ const infos = await connection.getMultipleAccountsInfo(addresses, "confirmed");
83
+ return CUSTODIES.map((cfg, i) => {
84
+ const info = infos[i];
85
+ if (!info || !info.data) {
86
+ throw new Error(`No account data for custody ${cfg.name}`);
87
+ }
88
+ const data = info.data;
89
+ // Read target ratio — validated post-parse by checking sum ≈ 10000
90
+ const targetRatio = data.length >= OFFSET_TARGET_RATIO_BPS + 8
91
+ ? Number(u64FromLE(data, OFFSET_TARGET_RATIO_BPS))
92
+ : 0;
93
+ return {
94
+ cfg,
95
+ owned: u64FromLE(data, OFFSET_ASSETS_OWNED),
96
+ locked: u64FromLE(data, OFFSET_ASSETS_LOCKED),
97
+ guaranteedUsd: u64FromLE(data, OFFSET_ASSETS_GUARANTEED_USD),
98
+ globalShortSizes: u64FromLE(data, OFFSET_ASSETS_GLOBAL_SHORT_SIZES),
99
+ globalShortAveragePrices: u64FromLE(data, OFFSET_ASSETS_GLOBAL_SHORT_AVG_PX),
100
+ debt: u128FromLE(data, OFFSET_DEBT),
101
+ borrowLendInterestsAccrued: u128FromLE(data, OFFSET_BORROW_LEND_INTERESTS_ACCRUED),
102
+ targetRatioBps: targetRatio <= 10000 ? targetRatio : 0,
103
+ };
104
+ });
105
+ }
106
+ async function fetchPrices() {
107
+ const ids = CUSTODIES.map((c) => c.mintAddress).join(",");
108
+ const url = `${JUPITER_PRICE_API}?ids=${ids}`;
109
+ const response = await fetch(url);
110
+ if (!response.ok) {
111
+ throw new Error(`Jupiter Price API error: ${response.status}`);
112
+ }
113
+ const json = (await response.json());
114
+ const prices = {};
115
+ for (const [mint, data] of Object.entries(json)) {
116
+ prices[mint] = data.usdPrice;
117
+ }
118
+ return prices;
119
+ }
120
+ function calculateDebtTokens(raw) {
121
+ if (raw.debt <= raw.borrowLendInterestsAccrued)
122
+ return 0;
123
+ const netDebt = raw.debt - raw.borrowLendInterestsAccrued;
124
+ return Number(netDebt) / DEBT_MULTIPLIER / 10 ** raw.cfg.decimals;
125
+ }
126
+ function calculateCustodyAum(raw, priceUsd) {
127
+ const { cfg } = raw;
128
+ const tokScale = 10 ** cfg.decimals;
129
+ const ownedTokens = Number(raw.owned) / tokScale;
130
+ const lockedTokens = Number(raw.locked) / tokScale;
131
+ const debtTokens = calculateDebtTokens(raw);
132
+ const guaranteedUsd = Number(raw.guaranteedUsd) / SCALE_USD;
133
+ const shortSizeUsd = Number(raw.globalShortSizes) / SCALE_USD;
134
+ const shortAvgPxUsd = Number(raw.globalShortAveragePrices) / SCALE_USD;
135
+ // theoreticallyOwned = owned + debt (debt = lent-out tokens the pool still owns)
136
+ const theoreticallyOwned = ownedTokens + debtTokens;
137
+ const netAssetsTokens = Math.max(theoreticallyOwned - lockedTokens, 0);
138
+ const netAssetsUsd = netAssetsTokens * priceUsd;
139
+ // Short PnL from pool perspective (pool is counterparty)
140
+ let shortPnLUsd = 0;
141
+ if (shortSizeUsd > 0 && shortAvgPxUsd > 0 && priceUsd > 0) {
142
+ shortPnLUsd = (shortSizeUsd * (priceUsd - shortAvgPxUsd)) / shortAvgPxUsd;
143
+ }
144
+ let aumUsd = guaranteedUsd + netAssetsUsd + shortPnLUsd;
145
+ if (aumUsd < 0)
146
+ aumUsd = 0;
147
+ return {
148
+ name: cfg.name,
149
+ aumUsd,
150
+ weightBps: 0, // set in second pass
151
+ priceUsd,
152
+ };
153
+ }
154
+ // ---------------------------------------------------------------------------
155
+ // Public API
156
+ // ---------------------------------------------------------------------------
157
+ /**
158
+ * Fetch JLP pool custody data and compute AUM breakdown with per-custody weights.
159
+ *
160
+ * Reads custody accounts on-chain and fetches prices from Jupiter's price API.
161
+ * Returns the total AUM in USD and per-custody breakdown including weight in basis points.
162
+ */
163
+ // ---------------------------------------------------------------------------
164
+ // Pool Account Fee Parsing
165
+ // ---------------------------------------------------------------------------
166
+ /**
167
+ * Parse Pool account to extract aumUsd (u128) using the dynamic offset logic
168
+ * from oracle.rs. Returns the offset just past aumUsd and the parsed value.
169
+ */
170
+ function parsePoolAumUsd(data) {
171
+ if (data.length < 28)
172
+ return null;
173
+ let offset = 8; // skip discriminator
174
+ // Skip name string (4-byte len + utf8)
175
+ if (data.length < offset + 4)
176
+ return null;
177
+ const nameLen = data.readUInt32LE(offset);
178
+ if (nameLen > 64)
179
+ return null;
180
+ offset += 4 + nameLen;
181
+ // Skip custodies vec (4-byte len + Pubkey[])
182
+ if (data.length < offset + 4)
183
+ return null;
184
+ const custodiesLen = data.readUInt32LE(offset);
185
+ if (custodiesLen > 16)
186
+ return null;
187
+ offset += 4 + custodiesLen * 32;
188
+ // Read aumUsd (u128)
189
+ if (data.length < offset + 16)
190
+ return null;
191
+ const aumUsd = u128FromLE(data, offset);
192
+ offset += 16;
193
+ return { aumUsd, afterAumOffset: offset };
194
+ }
195
+ /**
196
+ * Try to parse the Fees struct from the Pool account data.
197
+ *
198
+ * After aumUsd, the Pool struct has a Limit struct followed by a Fees struct.
199
+ * The Limit struct size varies by program version, so we try multiple skip
200
+ * sizes and validate the parsed fee values.
201
+ *
202
+ * Fees layout (8 x u64):
203
+ * [0] increasePositionBps
204
+ * [1] decreasePositionBps
205
+ * [2] addRemoveLiquidityBps
206
+ * [3] swapBps
207
+ * [4] taxBps
208
+ * [5] stableSwapBps
209
+ * [6] stableSwapTaxBps
210
+ * [7] protocolShareBps
211
+ */
212
+ function tryParsePoolFees(data, afterAumOffset) {
213
+ // Try different Limit struct sizes (2-5 u128 fields = 32-80 bytes)
214
+ for (const limitSize of [32, 48, 64, 80]) {
215
+ const feesStart = afterAumOffset + limitSize;
216
+ if (data.length < feesStart + 64)
217
+ continue;
218
+ const increasePos = Number(u64FromLE(data, feesStart));
219
+ const decreasePos = Number(u64FromLE(data, feesStart + 8));
220
+ const addRemLiq = Number(u64FromLE(data, feesStart + 16));
221
+ const swapBps = Number(u64FromLE(data, feesStart + 24));
222
+ const taxBps = Number(u64FromLE(data, feesStart + 32));
223
+ const stableSwap = Number(u64FromLE(data, feesStart + 40));
224
+ const stableSwapTax = Number(u64FromLE(data, feesStart + 48));
225
+ const protocolShare = Number(u64FromLE(data, feesStart + 56));
226
+ // All fee fields should be in [0, 1000] bps range
227
+ const allFees = [increasePos, decreasePos, addRemLiq, swapBps, taxBps,
228
+ stableSwap, stableSwapTax, protocolShare];
229
+ const allValid = allFees.every((f) => f >= 0 && f <= 1000);
230
+ // At least addRemLiq or swapBps should be non-zero
231
+ if (allValid && (addRemLiq > 0 || swapBps > 0)) {
232
+ return {
233
+ addRemoveLiquidityBps: addRemLiq,
234
+ swapBps,
235
+ taxBps,
236
+ stableSwapBps: stableSwap,
237
+ stableSwapTaxBps: stableSwapTax,
238
+ };
239
+ }
240
+ }
241
+ return null;
242
+ }
243
+ // ---------------------------------------------------------------------------
244
+ // Public: fetchJlpPoolDetails
245
+ // ---------------------------------------------------------------------------
246
+ /**
247
+ * Fetch full JLP pool details: fee parameters, per-custody target/current
248
+ * weights, pool AUM, and JLP price.
249
+ *
250
+ * Reads the Pool account for fees and aumUsd, Custody accounts for per-asset
251
+ * data including target weights, and the JLP mint for total supply.
252
+ */
253
+ async function fetchJlpPoolDetails(connection) {
254
+ const poolAddress = constants_1.JLP_POOL_ACCOUNT;
255
+ const jlpMintAddress = constants_1.JLP_MINT;
256
+ const custodyAddresses = CUSTODIES.map((c) => c.address);
257
+ // Fetch Pool, JLP Mint, all Custodies, and prices in parallel
258
+ const [poolInfo, mintInfo, custodyInfos, pricesByMint] = await Promise.all([
259
+ connection.getAccountInfo(poolAddress, "confirmed"),
260
+ connection.getAccountInfo(jlpMintAddress, "confirmed"),
261
+ connection.getMultipleAccountsInfo(custodyAddresses, "confirmed"),
262
+ fetchPrices(),
263
+ ]);
264
+ // Parse Pool aumUsd
265
+ if (!poolInfo?.data)
266
+ throw new Error("Failed to fetch JLP Pool account");
267
+ const poolData = poolInfo.data;
268
+ const poolParsed = parsePoolAumUsd(poolData);
269
+ if (!poolParsed)
270
+ throw new Error("Failed to parse JLP Pool aumUsd");
271
+ // Parse Pool fees (best-effort — returns null if layout unknown)
272
+ const fees = tryParsePoolFees(poolData, poolParsed.afterAumOffset);
273
+ // Parse JLP supply from mint account (offset 36, u64)
274
+ if (!mintInfo?.data || mintInfo.data.length < 44)
275
+ throw new Error("Failed to fetch JLP mint");
276
+ const mintData = mintInfo.data;
277
+ const jlpSupplyRaw = u64FromLE(mintData, 36);
278
+ const jlpSupply = Number(jlpSupplyRaw) / 1e6; // JLP has 6 decimals
279
+ // Pool AUM in USD (u128 scaled to 6 decimals)
280
+ const poolAumUsd = Number(poolParsed.aumUsd) / SCALE_USD;
281
+ // JLP price
282
+ const jlpPrice = jlpSupply > 0 ? poolAumUsd / jlpSupply : 0;
283
+ // Parse custody data with prices
284
+ const prices = {};
285
+ for (const cfg of CUSTODIES) {
286
+ const p = pricesByMint[cfg.mintAddress];
287
+ prices[cfg.name] = p ?? (cfg.isStable ? 1 : 0);
288
+ if (!p && !cfg.isStable) {
289
+ throw new Error(`Missing price for ${cfg.name}`);
290
+ }
291
+ }
292
+ const parsedCustodies = CUSTODIES.map((cfg, i) => {
293
+ const info = custodyInfos[i];
294
+ if (!info?.data)
295
+ throw new Error(`No account data for custody ${cfg.name}`);
296
+ const data = info.data;
297
+ return {
298
+ cfg,
299
+ owned: u64FromLE(data, OFFSET_ASSETS_OWNED),
300
+ locked: u64FromLE(data, OFFSET_ASSETS_LOCKED),
301
+ guaranteedUsd: u64FromLE(data, OFFSET_ASSETS_GUARANTEED_USD),
302
+ globalShortSizes: u64FromLE(data, OFFSET_ASSETS_GLOBAL_SHORT_SIZES),
303
+ globalShortAveragePrices: u64FromLE(data, OFFSET_ASSETS_GLOBAL_SHORT_AVG_PX),
304
+ debt: u128FromLE(data, OFFSET_DEBT),
305
+ borrowLendInterestsAccrued: u128FromLE(data, OFFSET_BORROW_LEND_INTERESTS_ACCRUED),
306
+ targetRatioBps: data.length >= OFFSET_TARGET_RATIO_BPS + 8
307
+ ? Number(u64FromLE(data, OFFSET_TARGET_RATIO_BPS))
308
+ : 0,
309
+ };
310
+ });
311
+ // Compute per-custody AUM
312
+ const aumResults = parsedCustodies.map((raw) => calculateCustodyAum(raw, prices[raw.cfg.name] ?? 1));
313
+ const totalAum = aumResults.reduce((sum, r) => sum + r.aumUsd, 0);
314
+ // Validate target ratios — sum should be ~10000
315
+ const targetSum = parsedCustodies.reduce((sum, c) => sum + c.targetRatioBps, 0);
316
+ const targetRatiosValid = targetSum >= 9900 && targetSum <= 10100;
317
+ const custodies = parsedCustodies.map((raw, i) => ({
318
+ mint: new web3_js_1.PublicKey(raw.cfg.mintAddress),
319
+ name: raw.cfg.name,
320
+ targetRatioBps: targetRatiosValid ? raw.targetRatioBps : 0,
321
+ currentRatioBps: totalAum > 0 ? Math.round((aumResults[i].aumUsd / totalAum) * 10000) : 0,
322
+ aumUsd: aumResults[i].aumUsd,
323
+ isStable: raw.cfg.isStable,
324
+ }));
325
+ return { fees, custodies, poolAumUsd, jlpPrice, jlpSupply };
326
+ }
327
+ // ---------------------------------------------------------------------------
328
+ // Public: computeAddLiquidityFee
329
+ // ---------------------------------------------------------------------------
330
+ /**
331
+ * Estimate the addLiquidity fee for depositing into a specific JLP custody.
332
+ *
333
+ * Implements the Jupiter Perps fee formula:
334
+ * - If deposit moves custody weight TOWARD target: rebate (fee < baseFee)
335
+ * - If deposit moves custody weight AWAY from target: tax (fee > baseFee)
336
+ *
337
+ * Formula:
338
+ * initDiff = |currentRatio - targetRatio|
339
+ * finalDiff = |newRatio - targetRatio|
340
+ * avgDiff = (initDiff + finalDiff) / 2
341
+ * if improving: fee = max(baseFee - taxBps * avgDiff / 10000, 0)
342
+ * if worsening: fee = baseFee + taxBps * avgDiff / 10000
343
+ */
344
+ function computeAddLiquidityFee(args) {
345
+ const { custodyAumUsd, poolAumUsd, targetRatioBps, depositUsd, fees, isStable } = args;
346
+ if (poolAumUsd <= 0 || targetRatioBps <= 0 || depositUsd <= 0) {
347
+ return { feeBps: fees.addRemoveLiquidityBps, isDiscount: false };
348
+ }
349
+ const baseFee = fees.addRemoveLiquidityBps;
350
+ const effectiveTaxBps = isStable ? fees.stableSwapTaxBps : fees.taxBps;
351
+ const currentRatio = (custodyAumUsd / poolAumUsd) * 10000;
352
+ const newCustodyAum = custodyAumUsd + depositUsd;
353
+ const newPoolAum = poolAumUsd + depositUsd;
354
+ const newRatio = (newCustodyAum / newPoolAum) * 10000;
355
+ const initDiff = Math.abs(currentRatio - targetRatioBps);
356
+ const finalDiff = Math.abs(newRatio - targetRatioBps);
357
+ const avgDiff = (initDiff + finalDiff) / 2;
358
+ if (finalDiff < initDiff) {
359
+ // Improving weight → rebate
360
+ const rebate = (effectiveTaxBps * avgDiff) / 10000;
361
+ return { feeBps: Math.max(baseFee - rebate, 0), isDiscount: true };
362
+ }
363
+ else {
364
+ // Worsening weight → penalty
365
+ const penalty = (effectiveTaxBps * avgDiff) / 10000;
366
+ return { feeBps: baseFee + penalty, isDiscount: false };
367
+ }
368
+ }
369
+ // ---------------------------------------------------------------------------
370
+ // Public: fetchJlpCustodyData (existing)
371
+ // ---------------------------------------------------------------------------
372
+ async function fetchJlpCustodyData(connection) {
373
+ const [custodies, pricesByMint] = await Promise.all([
374
+ fetchAllCustodies(connection),
375
+ fetchPrices(),
376
+ ]);
377
+ // Build price lookup by custody name
378
+ const prices = {};
379
+ for (const cfg of CUSTODIES) {
380
+ const price = pricesByMint[cfg.mintAddress];
381
+ if (price === undefined || price === null) {
382
+ if (cfg.isStable) {
383
+ prices[cfg.name] = 1;
384
+ }
385
+ else {
386
+ throw new Error(`Missing price for non-stable asset ${cfg.name} (mint: ${cfg.mintAddress})`);
387
+ }
388
+ }
389
+ else {
390
+ prices[cfg.name] = price;
391
+ }
392
+ }
393
+ // Calculate per-custody AUM
394
+ const results = custodies.map((raw) => calculateCustodyAum(raw, prices[raw.cfg.name] ?? 1));
395
+ const totalAumUsd = results.reduce((sum, r) => sum + r.aumUsd, 0);
396
+ // Set weights in basis points
397
+ for (const r of results) {
398
+ r.weightBps = totalAumUsd > 0 ? Math.round((r.aumUsd / totalAumUsd) * 10000) : 0;
399
+ }
400
+ return {
401
+ timestamp: new Date().toISOString(),
402
+ totalAumUsd,
403
+ custodies: results,
404
+ };
405
+ }
406
+ //# sourceMappingURL=jlp-data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jlp-data.js","sourceRoot":"","sources":["../../src/jlpd-strategy/jlp-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { PublicKey, TransactionInstruction } from "@solana/web3.js";
2
+ /** Arguments for building a settle_yield instruction with explicit accounts */
3
+ export interface CreateSettleYieldIxArgs {
4
+ config: PublicKey;
5
+ managerRole: PublicKey;
6
+ vaultJlpAta: PublicKey;
7
+ stv0: PublicKey;
8
+ stv1: PublicKey;
9
+ stv2: PublicKey;
10
+ stv3: PublicKey;
11
+ stv4: PublicKey;
12
+ dovesBtcUsd: PublicKey;
13
+ dovesEthUsd: PublicKey;
14
+ dovesSolUsd: PublicKey;
15
+ jlpPool: PublicKey;
16
+ jlpMintAccount: PublicKey;
17
+ manager: PublicKey;
18
+ }
19
+ /**
20
+ * Build the on-chain `settle_yield` instruction.
21
+ *
22
+ * settle_yield takes no params -- instruction data is just the 8-byte discriminator.
23
+ *
24
+ * Accounts (14 total):
25
+ * 0: config (JlpdConfig PDA)
26
+ * 1: manager_role (ManagerRole PDA)
27
+ * 2: vault_jlp_ata (JLP ATA owned by config)
28
+ * 3: stv_0 (BTC strategy_state, mut)
29
+ * 4: stv_1 (ETH strategy_state, mut)
30
+ * 5: stv_2 (SOL strategy_state, mut)
31
+ * 6: stv_3 (USDC strategy_state, mut)
32
+ * 7: stv_4 (JupUSD strategy_state, mut)
33
+ * 8: doves_btc_usd (oracle)
34
+ * 9: doves_eth_usd (oracle)
35
+ * 10: doves_sol_usd (oracle)
36
+ * 11: jlp_pool (Jupiter Perps Pool)
37
+ * 12: jlp_mint_account
38
+ * 13: manager (signer)
39
+ */
40
+ export declare function createSettleYieldIx(args: CreateSettleYieldIxArgs, programId?: PublicKey): TransactionInstruction;
41
+ /**
42
+ * Build a settle_yield instruction with automatic PDA derivation.
43
+ *
44
+ * Requires the 5 base asset mints in order: [BTC, ETH, SOL, USDC, JupUSD].
45
+ * These must match the `base_asset_mints` array on the JlpdConfig account.
46
+ */
47
+ export declare function buildSettleYieldIx(args: {
48
+ manager: PublicKey;
49
+ baseAssetMints: [PublicKey, PublicKey, PublicKey, PublicKey, PublicKey];
50
+ jlpMint?: PublicKey;
51
+ tokenProgram?: PublicKey;
52
+ programId?: PublicKey;
53
+ }): TransactionInstruction;
54
+ //# sourceMappingURL=settle-yield.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settle-yield.d.ts","sourceRoot":"","sources":["../../src/jlpd-strategy/settle-yield.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,sBAAsB,EAEvB,MAAM,iBAAiB,CAAC;AAqBzB,+EAA+E;AAC/E,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,SAAS,CAAC;IAClB,WAAW,EAAE,SAAS,CAAC;IACvB,WAAW,EAAE,SAAS,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,SAAS,CAAC;IACvB,WAAW,EAAE,SAAS,CAAC;IACvB,WAAW,EAAE,SAAS,CAAC;IACvB,OAAO,EAAE,SAAS,CAAC;IACnB,cAAc,EAAE,SAAS,CAAC;IAC1B,OAAO,EAAE,SAAS,CAAC;CACpB;AAmBD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,uBAAuB,EAC7B,SAAS,GAAE,SAAsB,GAChC,sBAAsB,CAwCxB;AAMD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACvC,OAAO,EAAE,SAAS,CAAC;IACnB,cAAc,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IACxE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GAAG,sBAAsB,CA0CzB"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSettleYieldIx = createSettleYieldIx;
4
+ exports.buildSettleYieldIx = buildSettleYieldIx;
5
+ const web3_js_1 = require("@solana/web3.js");
6
+ const spl_token_1 = require("@solana/spl-token");
7
+ const constants_1 = require("./constants");
8
+ const pda_1 = require("./pda");
9
+ // ---------------------------------------------------------------------------
10
+ // Helpers
11
+ // ---------------------------------------------------------------------------
12
+ /** Derive ATA address */
13
+ function findAta(mint, owner, tokenProgram) {
14
+ const [ata] = web3_js_1.PublicKey.findProgramAddressSync([owner.toBuffer(), tokenProgram.toBuffer(), mint.toBuffer()], spl_token_1.ASSOCIATED_TOKEN_PROGRAM_ID);
15
+ return ata;
16
+ }
17
+ // ---------------------------------------------------------------------------
18
+ // Low-level instruction builder
19
+ // ---------------------------------------------------------------------------
20
+ /**
21
+ * Build the on-chain `settle_yield` instruction.
22
+ *
23
+ * settle_yield takes no params -- instruction data is just the 8-byte discriminator.
24
+ *
25
+ * Accounts (14 total):
26
+ * 0: config (JlpdConfig PDA)
27
+ * 1: manager_role (ManagerRole PDA)
28
+ * 2: vault_jlp_ata (JLP ATA owned by config)
29
+ * 3: stv_0 (BTC strategy_state, mut)
30
+ * 4: stv_1 (ETH strategy_state, mut)
31
+ * 5: stv_2 (SOL strategy_state, mut)
32
+ * 6: stv_3 (USDC strategy_state, mut)
33
+ * 7: stv_4 (JupUSD strategy_state, mut)
34
+ * 8: doves_btc_usd (oracle)
35
+ * 9: doves_eth_usd (oracle)
36
+ * 10: doves_sol_usd (oracle)
37
+ * 11: jlp_pool (Jupiter Perps Pool)
38
+ * 12: jlp_mint_account
39
+ * 13: manager (signer)
40
+ */
41
+ function createSettleYieldIx(args, programId = constants_1.PROGRAM_ID) {
42
+ const { config, managerRole, vaultJlpAta, stv0, stv1, stv2, stv3, stv4, dovesBtcUsd, dovesEthUsd, dovesSolUsd, jlpPool, jlpMintAccount, manager, } = args;
43
+ // Instruction data: just the 8-byte discriminator (no params)
44
+ const data = Buffer.alloc(8);
45
+ constants_1.IX_SETTLE_YIELD.copy(data, 0);
46
+ const keys = [
47
+ { pubkey: config, isSigner: false, isWritable: false },
48
+ { pubkey: managerRole, isSigner: false, isWritable: false },
49
+ { pubkey: vaultJlpAta, isSigner: false, isWritable: false },
50
+ { pubkey: stv0, isSigner: false, isWritable: true },
51
+ { pubkey: stv1, isSigner: false, isWritable: true },
52
+ { pubkey: stv2, isSigner: false, isWritable: true },
53
+ { pubkey: stv3, isSigner: false, isWritable: true },
54
+ { pubkey: stv4, isSigner: false, isWritable: true },
55
+ { pubkey: dovesBtcUsd, isSigner: false, isWritable: false },
56
+ { pubkey: dovesEthUsd, isSigner: false, isWritable: false },
57
+ { pubkey: dovesSolUsd, isSigner: false, isWritable: false },
58
+ { pubkey: jlpPool, isSigner: false, isWritable: false },
59
+ { pubkey: jlpMintAccount, isSigner: false, isWritable: false },
60
+ { pubkey: manager, isSigner: true, isWritable: false },
61
+ ];
62
+ return new web3_js_1.TransactionInstruction({ keys, programId, data });
63
+ }
64
+ // ---------------------------------------------------------------------------
65
+ // High-level builder
66
+ // ---------------------------------------------------------------------------
67
+ /**
68
+ * Build a settle_yield instruction with automatic PDA derivation.
69
+ *
70
+ * Requires the 5 base asset mints in order: [BTC, ETH, SOL, USDC, JupUSD].
71
+ * These must match the `base_asset_mints` array on the JlpdConfig account.
72
+ */
73
+ function buildSettleYieldIx(args) {
74
+ const { manager, baseAssetMints, jlpMint = constants_1.JLP_MINT, tokenProgram = spl_token_1.TOKEN_PROGRAM_ID, programId = constants_1.PROGRAM_ID, } = args;
75
+ // Derive PDAs
76
+ const [config] = (0, pda_1.findJlpdConfigPda)(programId);
77
+ const [managerRole] = (0, pda_1.findManagerRolePda)(config, manager, programId);
78
+ // Derive strategy_state PDAs for all 5 base assets
79
+ const [stv0] = (0, pda_1.findStrategyStatePda)(baseAssetMints[0], programId);
80
+ const [stv1] = (0, pda_1.findStrategyStatePda)(baseAssetMints[1], programId);
81
+ const [stv2] = (0, pda_1.findStrategyStatePda)(baseAssetMints[2], programId);
82
+ const [stv3] = (0, pda_1.findStrategyStatePda)(baseAssetMints[3], programId);
83
+ const [stv4] = (0, pda_1.findStrategyStatePda)(baseAssetMints[4], programId);
84
+ // Derive vault JLP ATA (owned by config PDA)
85
+ const vaultJlpAta = findAta(jlpMint, config, tokenProgram);
86
+ return createSettleYieldIx({
87
+ config,
88
+ managerRole,
89
+ vaultJlpAta,
90
+ stv0,
91
+ stv1,
92
+ stv2,
93
+ stv3,
94
+ stv4,
95
+ dovesBtcUsd: constants_1.DOVES_BTC_USD,
96
+ dovesEthUsd: constants_1.DOVES_ETH_USD,
97
+ dovesSolUsd: constants_1.DOVES_SOL_USD,
98
+ jlpPool: constants_1.JLP_POOL_ACCOUNT,
99
+ jlpMintAccount: jlpMint,
100
+ manager,
101
+ }, programId);
102
+ }
103
+ //# sourceMappingURL=settle-yield.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settle-yield.js","sourceRoot":"","sources":["../../src/jlpd-strategy/settle-yield.ts"],"names":[],"mappings":"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"}