@1delta/margin-fetcher-sol 0.0.1 → 0.0.3
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 +63 -0
- package/dist/index.d.mts +718 -34
- package/dist/index.d.ts +718 -34
- package/dist/index.js +2835 -776
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2782 -745
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -104,9 +104,12 @@ __export(index_exports, {
|
|
|
104
104
|
HUMA_SEEDS: () => HUMA_SEEDS,
|
|
105
105
|
HttpError: () => HttpError,
|
|
106
106
|
JL_BPS: () => JL_BPS,
|
|
107
|
+
JL_EXCHANGE_PRICES_PRECISION: () => JL_EXCHANGE_PRICES_PRECISION,
|
|
107
108
|
JL_FACTOR_SCALE: () => JL_FACTOR_SCALE,
|
|
108
109
|
JL_ORACLE_DECIMALS: () => JL_ORACLE_DECIMALS,
|
|
109
110
|
JL_ORACLE_SCALE: () => JL_ORACLE_SCALE,
|
|
111
|
+
JL_VAULTS_ACCOUNTS_IDL: () => JL_VAULTS_ACCOUNTS_IDL,
|
|
112
|
+
JL_VAULT_AMOUNT_DECIMALS: () => JL_VAULT_AMOUNT_DECIMALS,
|
|
110
113
|
JUPITER_LEND_API_BASE: () => JUPITER_LEND_API_BASE,
|
|
111
114
|
JUPITER_LEND_KEYED_API_BASE: () => JUPITER_LEND_KEYED_API_BASE,
|
|
112
115
|
JUPITER_LEND_KEY_PREFIX: () => import_lender_registry2.JUPITER_LEND_KEY_PREFIX,
|
|
@@ -115,9 +118,11 @@ __export(index_exports, {
|
|
|
115
118
|
JUPITER_LEND_PROGRAMS: () => JUPITER_LEND_PROGRAMS,
|
|
116
119
|
JUPITER_PRICE_API_BASE: () => JUPITER_PRICE_API_BASE,
|
|
117
120
|
JUPITER_PRICE_KEYED_API_BASE: () => JUPITER_PRICE_KEYED_API_BASE,
|
|
121
|
+
JUP_DEX_PROGRAM: () => JUP_DEX_PROGRAM,
|
|
118
122
|
JUP_FLASHLOAN_IDL: () => JUP_FLASHLOAN_IDL,
|
|
119
123
|
JUP_FLASHLOAN_PROGRAMS: () => JUP_FLASHLOAN_PROGRAMS,
|
|
120
124
|
JUP_LIQUIDITY_PROGRAMS: () => JUP_LIQUIDITY_PROGRAMS,
|
|
125
|
+
JUP_VAULTS_PROGRAMS: () => JUP_VAULTS_PROGRAMS,
|
|
121
126
|
KAMINO_API_BASE: () => KAMINO_API_BASE,
|
|
122
127
|
KAMINO_KEY_PREFIX: () => import_lender_registry2.KAMINO_KEY_PREFIX,
|
|
123
128
|
KAMINO_MAIN_MARKET: () => KAMINO_MAIN_MARKET,
|
|
@@ -137,6 +142,7 @@ __export(index_exports, {
|
|
|
137
142
|
KLEND_RESERVE_SIZE: () => KLEND_RESERVE_SIZE,
|
|
138
143
|
KLEND_RESERVE_SLICE: () => KLEND_RESERVE_SLICE,
|
|
139
144
|
KLEND_U64_MAX: () => KLEND_U64_MAX,
|
|
145
|
+
KVAULT_PROGRAM_ID: () => KVAULT_PROGRAM_ID,
|
|
140
146
|
LENDER_BRAND_NAMES: () => LENDER_BRAND_NAMES,
|
|
141
147
|
LOANS_PAGE: () => LOANS_PAGE,
|
|
142
148
|
LOOPSCALE_ACCOUNT_DISCRIMINATORS: () => LOOPSCALE_ACCOUNT_DISCRIMINATORS,
|
|
@@ -224,7 +230,7 @@ __export(index_exports, {
|
|
|
224
230
|
SAVE_UNBORROWABLE_BORROW_FACTOR: () => SAVE_UNBORROWABLE_BORROW_FACTOR,
|
|
225
231
|
SAVE_WAD: () => SAVE_WAD,
|
|
226
232
|
SAVE_WALLET_POS_ID: () => SAVE_WALLET_POS_ID,
|
|
227
|
-
SECONDS_PER_YEAR: () =>
|
|
233
|
+
SECONDS_PER_YEAR: () => SECONDS_PER_YEAR2,
|
|
228
234
|
SETTLEMENT_BATCH_SIZE: () => SETTLEMENT_BATCH_SIZE,
|
|
229
235
|
SOLANA_CHAIN_ID: () => SOLANA_CHAIN_ID,
|
|
230
236
|
SOLSTICE_APP_API_BASE: () => SOLSTICE_APP_API_BASE,
|
|
@@ -267,6 +273,7 @@ __export(index_exports, {
|
|
|
267
273
|
convertJupiterLendOracleEntries: () => convertJupiterLendOracleEntries,
|
|
268
274
|
convertJupiterLendUserPositions: () => convertJupiterLendUserPositions,
|
|
269
275
|
convertJupiterLendVault: () => convertJupiterLendVault,
|
|
276
|
+
convertKaminoKvault: () => convertKaminoKvault,
|
|
270
277
|
convertKaminoLoans: () => convertKaminoLoans,
|
|
271
278
|
convertKaminoMarket: () => convertKaminoMarket,
|
|
272
279
|
convertKaminoOraclePrices: () => convertKaminoOraclePrices,
|
|
@@ -283,6 +290,7 @@ __export(index_exports, {
|
|
|
283
290
|
createExponentApi: () => createExponentApi,
|
|
284
291
|
createJupiterLendApi: () => createJupiterLendApi,
|
|
285
292
|
createKaminoApi: () => createKaminoApi,
|
|
293
|
+
createKaminoKvaultApi: () => createKaminoKvaultApi,
|
|
286
294
|
createLimiter: () => createLimiter,
|
|
287
295
|
createLoopscaleApi: () => createLoopscaleApi,
|
|
288
296
|
createMarketUid: () => createMarketUid,
|
|
@@ -292,6 +300,7 @@ __export(index_exports, {
|
|
|
292
300
|
createSolsticeAppApi: () => createSolsticeAppApi,
|
|
293
301
|
createWithSeed: () => createWithSeed,
|
|
294
302
|
decimalStringToI80F48: () => decimalStringToI80F48,
|
|
303
|
+
decimalStringToRaw: () => decimalStringToRaw,
|
|
295
304
|
decodeAccountingState: () => decodeAccountingState,
|
|
296
305
|
decodeController: () => decodeController,
|
|
297
306
|
decodeCooldownEscrow: () => decodeCooldownEscrow,
|
|
@@ -300,6 +309,7 @@ __export(index_exports, {
|
|
|
300
309
|
decodeHumaPoolConfig: () => decodeHumaPoolConfig,
|
|
301
310
|
decodeHumaPoolState: () => decodeHumaPoolState,
|
|
302
311
|
decodeHumaRedemptionRequest: () => decodeHumaRedemptionRequest,
|
|
312
|
+
decodeJlRateModel: () => decodeJlRateModel,
|
|
303
313
|
decodeJuniorUnlockShare: () => decodeJuniorUnlockShare,
|
|
304
314
|
decodeJupFlashloanAdmin: () => decodeJupFlashloanAdmin,
|
|
305
315
|
decodeKaminoObligation: () => decodeKaminoObligation,
|
|
@@ -344,6 +354,7 @@ __export(index_exports, {
|
|
|
344
354
|
fetchJupiterLendPublic: () => fetchJupiterLendPublic,
|
|
345
355
|
fetchJupiterLendUser: () => fetchJupiterLendUser,
|
|
346
356
|
fetchJupiterPrices: () => fetchJupiterPrices,
|
|
357
|
+
fetchKaminoKvaults: () => fetchKaminoKvaults,
|
|
347
358
|
fetchKaminoOracleEntries: () => fetchKaminoOracleEntries,
|
|
348
359
|
fetchKaminoOraclePrices: () => fetchKaminoOraclePrices,
|
|
349
360
|
fetchKaminoPublic: () => fetchKaminoPublic,
|
|
@@ -386,6 +397,8 @@ __export(index_exports, {
|
|
|
386
397
|
i80f48ToNumber: () => i80f48ToNumber,
|
|
387
398
|
isBorrowable: () => isBorrowable,
|
|
388
399
|
isEvmChainId: () => import_chain_registry.isEvmChainId,
|
|
400
|
+
isJlSmartCol: () => isJlSmartCol,
|
|
401
|
+
isJlSmartDebt: () => isJlSmartDebt,
|
|
389
402
|
isJupiterLend: () => import_lender_registry2.isJupiterLend,
|
|
390
403
|
isKamino: () => import_lender_registry2.isKamino,
|
|
391
404
|
isLenderBrand: () => isLenderBrand,
|
|
@@ -405,8 +418,17 @@ __export(index_exports, {
|
|
|
405
418
|
isSyntheticQuoteMint: () => isSyntheticQuoteMint,
|
|
406
419
|
isU64Max: () => isU64Max,
|
|
407
420
|
isUncapped: () => isUncapped,
|
|
421
|
+
jlLiquidityExchangePrices: () => jlLiquidityExchangePrices,
|
|
408
422
|
jlOraclePriceInBorrow: () => jlOraclePriceInBorrow,
|
|
409
423
|
jlOracleToFluidRaw: () => jlOracleToFluidRaw,
|
|
424
|
+
jlOverallTokenData: () => jlOverallTokenData,
|
|
425
|
+
jlUserBorrowData: () => jlUserBorrowData,
|
|
426
|
+
jlUserSupplyData: () => jlUserSupplyData,
|
|
427
|
+
jlVaultAdminPda: () => jlVaultAdminPda,
|
|
428
|
+
jlVaultConfigPda: () => jlVaultConfigPda,
|
|
429
|
+
jlVaultExchangePrices: () => jlVaultExchangePrices,
|
|
430
|
+
jlVaultStatePda: () => jlVaultStatePda,
|
|
431
|
+
jlVaultToRaw: () => jlVaultToRaw,
|
|
410
432
|
joinableBatch: () => joinableBatch,
|
|
411
433
|
juniorUnlockSharePda: () => juniorUnlockSharePda,
|
|
412
434
|
jupFlashBorrowPosition: () => jupFlashBorrowPosition,
|
|
@@ -425,6 +447,7 @@ __export(index_exports, {
|
|
|
425
447
|
kaminoCloseFactor: () => kaminoCloseFactor,
|
|
426
448
|
kaminoDefaultEntry: () => kaminoDefaultEntry,
|
|
427
449
|
kaminoGroupLabel: () => kaminoGroupLabel,
|
|
450
|
+
kaminoKvaultOriginRow: () => kaminoKvaultOriginRow,
|
|
428
451
|
kaminoMarketFromKey: () => import_lender_registry2.kaminoMarketFromKey,
|
|
429
452
|
kaminoMarketKey: () => import_lender_registry2.kaminoMarketKey,
|
|
430
453
|
kaminoOracleEntriesFromMarkets: () => kaminoOracleEntriesFromMarkets,
|
|
@@ -486,9 +509,12 @@ __export(index_exports, {
|
|
|
486
509
|
readHumaChainState: () => readHumaChainState,
|
|
487
510
|
readHumaLenderState: () => readHumaLenderState,
|
|
488
511
|
readHumaRedemptionRequests: () => readHumaRedemptionRequests,
|
|
512
|
+
readJlLayerIrms: () => readJlLayerIrms,
|
|
513
|
+
readJlNextVaultId: () => readJlNextVaultId,
|
|
489
514
|
readJupFlashAssets: () => readJupFlashAssets,
|
|
490
515
|
readJupFlashAvailable: () => readJupFlashAvailable,
|
|
491
516
|
readJupFlashloanAdmin: () => readJupFlashloanAdmin,
|
|
517
|
+
readJupiterLendVaultsOnchain: () => readJupiterLendVaultsOnchain,
|
|
492
518
|
readKlendElevationGroups: () => readKlendElevationGroups,
|
|
493
519
|
readKlendFlashFacts: () => readKlendFlashFacts,
|
|
494
520
|
readKlendLendingMarket: () => readKlendLendingMarket,
|
|
@@ -8373,6 +8399,8 @@ var RESERVE = {
|
|
|
8373
8399
|
maxLiquidationBonusBps: 4876,
|
|
8374
8400
|
originationFeeSf: 4896,
|
|
8375
8401
|
flashLoanFeeSf: 4904,
|
|
8402
|
+
// config.borrowRateCurve — 11 × CurvePoint { utilizationRateBps u32, borrowRateBps u32 }, after fees' 8 padding bytes
|
|
8403
|
+
borrowRateCurve: 4920,
|
|
8376
8404
|
borrowFactorPct: 5008,
|
|
8377
8405
|
depositLimit: 5016,
|
|
8378
8406
|
borrowLimit: 5024,
|
|
@@ -8515,6 +8543,14 @@ function readKlendReserveChain(reserve, data) {
|
|
|
8515
8543
|
debtWithdrawalCap: withdrawalCap(data, RESERVE.debtWithdrawalCap),
|
|
8516
8544
|
disableUsageAsCollOutsideEmode: data[RESERVE.disableUsageAsCollOutsideEmode] !== 0,
|
|
8517
8545
|
utilizationLimitBlockBorrowingAbovePct: data[RESERVE.utilizationLimitBlockBorrowingAbovePct],
|
|
8546
|
+
borrowRateCurve: Array.from({ length: 11 }, (_, i) => {
|
|
8547
|
+
const v = new DataView(data.buffer, data.byteOffset);
|
|
8548
|
+
const off = RESERVE.borrowRateCurve + 8 * i;
|
|
8549
|
+
return [
|
|
8550
|
+
v.getUint32(off, true) / 1e4,
|
|
8551
|
+
v.getUint32(off + 4, true) / 1e4
|
|
8552
|
+
];
|
|
8553
|
+
}),
|
|
8518
8554
|
borrowLimitOutsideElevationGroup: u64(
|
|
8519
8555
|
data,
|
|
8520
8556
|
RESERVE.borrowLimitOutsideElevationGroup
|
|
@@ -9011,6 +9047,15 @@ function exchangeRateOf(inp) {
|
|
|
9011
9047
|
if (!t || !s || t.num <= 0n || s.num <= 0n) return { num: 1n, den: 1n };
|
|
9012
9048
|
return { num: t.num * s.den, den: t.den * s.num };
|
|
9013
9049
|
}
|
|
9050
|
+
function dedupeKnots(knots) {
|
|
9051
|
+
const out = [];
|
|
9052
|
+
for (const k of knots) {
|
|
9053
|
+
const last = out[out.length - 1];
|
|
9054
|
+
if (last && last[0] === k[0] && last[1] === k[1]) continue;
|
|
9055
|
+
out.push(k);
|
|
9056
|
+
}
|
|
9057
|
+
return out;
|
|
9058
|
+
}
|
|
9014
9059
|
function convertKaminoReserve(inp, ctx) {
|
|
9015
9060
|
const { stats, metrics, detail, chain } = inp;
|
|
9016
9061
|
const mint = chain?.mint ?? stats.token;
|
|
@@ -9108,7 +9153,12 @@ function convertKaminoReserve(inp, ctx) {
|
|
|
9108
9153
|
interestRateBasis: stats.interestRateBasis,
|
|
9109
9154
|
protocolTakeRatePct: stats.protocolTakeRatePct,
|
|
9110
9155
|
hostFixedInterestRateBps: stats.hostFixedInterestRateBps,
|
|
9111
|
-
borrowCurve: detail.borrowCurve,
|
|
9156
|
+
borrowCurve: chain ? dedupeKnots(chain.borrowRateCurve) : detail.borrowCurve,
|
|
9157
|
+
borrowCurveSource: chain ? "chain" : "api",
|
|
9158
|
+
...stats.interestRateBasis === "legacy" && ctx.slotSeconds ? { slotSeconds: ctx.slotSeconds } : {},
|
|
9159
|
+
...chain ? {
|
|
9160
|
+
utilizationLimitBlockBorrowingAbovePct: chain.utilizationLimitBlockBorrowingAbovePct
|
|
9161
|
+
} : {},
|
|
9112
9162
|
autoDeleverage: stats.autoDeleverage,
|
|
9113
9163
|
source: chain ? "chain" : "api",
|
|
9114
9164
|
maxLiquidationBonus: chain ? chain.maxLiquidationBonusBps / 1e4 : num(detail.maxLiquidationBonus),
|
|
@@ -9154,6 +9204,7 @@ function convertKaminoMarket(inp) {
|
|
|
9154
9204
|
closeFactor,
|
|
9155
9205
|
chainMarket: inp.chainMarket,
|
|
9156
9206
|
slot: inp.slot,
|
|
9207
|
+
slotSeconds: inp.slotSeconds,
|
|
9157
9208
|
tokenList: inp.tokenList
|
|
9158
9209
|
});
|
|
9159
9210
|
data[row.marketUid] = row;
|
|
@@ -9169,6 +9220,7 @@ function convertKaminoMarket(inp) {
|
|
|
9169
9220
|
}
|
|
9170
9221
|
|
|
9171
9222
|
// src/lending/public-data/kamino/fetchPublic.ts
|
|
9223
|
+
var import_svm_kit2 = require("@1delta/svm-kit");
|
|
9172
9224
|
async function fetchKaminoPublic(opts = {}) {
|
|
9173
9225
|
const api = createKaminoApi(opts);
|
|
9174
9226
|
const { markets, metricsByMarket } = await listServedMarkets(api, opts);
|
|
@@ -9235,6 +9287,7 @@ async function fetchKaminoPublic(opts = {}) {
|
|
|
9235
9287
|
return false;
|
|
9236
9288
|
});
|
|
9237
9289
|
const rpc = opts.rpc;
|
|
9290
|
+
const slotSeconds = opts.slotSeconds ?? (rpc ? await (0, import_svm_kit2.measureSlotSeconds)(rpc) : void 0);
|
|
9238
9291
|
const chainReads = await Promise.all(
|
|
9239
9292
|
served.map(async (mr) => {
|
|
9240
9293
|
if (!rpc) return void 0;
|
|
@@ -9267,7 +9320,8 @@ async function fetchKaminoPublic(opts = {}) {
|
|
|
9267
9320
|
reserves,
|
|
9268
9321
|
...chain?.market ? { chainMarket: chain.market, slot: chain.slot } : {},
|
|
9269
9322
|
leveragePairs: mr.leveragePairs,
|
|
9270
|
-
tokenList: opts.tokenList
|
|
9323
|
+
tokenList: opts.tokenList,
|
|
9324
|
+
slotSeconds
|
|
9271
9325
|
});
|
|
9272
9326
|
out[conv.lenderKey] = {
|
|
9273
9327
|
chainId: conv.chainId,
|
|
@@ -9319,495 +9373,1074 @@ function createJupiterLendApi(opts = {}) {
|
|
|
9319
9373
|
// src/lending/public-data/jupiter-lend/convertPublic.ts
|
|
9320
9374
|
init_types();
|
|
9321
9375
|
init_lenders();
|
|
9322
|
-
var JL_FACTOR_SCALE = 1e3;
|
|
9323
|
-
var JL_BPS = 1e4;
|
|
9324
|
-
var JL_ORACLE_DECIMALS = 15;
|
|
9325
|
-
var JL_ORACLE_SCALE = 10 ** JL_ORACLE_DECIMALS;
|
|
9326
|
-
var FLUID_ORACLE_DECIMALS = 27;
|
|
9327
|
-
var FLUID_VAULT_TYPE_T1 = 1e4;
|
|
9328
|
-
var bpsToPercent = (v) => num(v) / 100;
|
|
9329
|
-
var jlOraclePriceInBorrow = (raw2) => num(raw2) / JL_ORACLE_SCALE;
|
|
9330
|
-
function jlOracleToFluidRaw(raw2, colDecimals, debtDecimals) {
|
|
9331
|
-
if (typeof raw2 !== "string" || !/^\d+$/.test(raw2)) return void 0;
|
|
9332
|
-
const exp = FLUID_ORACLE_DECIMALS - JL_ORACLE_DECIMALS + debtDecimals - colDecimals;
|
|
9333
|
-
const v = BigInt(raw2);
|
|
9334
|
-
return (exp >= 0 ? v * 10n ** BigInt(exp) : v / 10n ** BigInt(-exp)).toString();
|
|
9335
|
-
}
|
|
9336
|
-
function formatRawUnits(raw2, decimals) {
|
|
9337
|
-
let v;
|
|
9338
|
-
try {
|
|
9339
|
-
v = BigInt(raw2 ?? 0);
|
|
9340
|
-
} catch {
|
|
9341
|
-
return "0";
|
|
9342
|
-
}
|
|
9343
|
-
const neg = v < 0n;
|
|
9344
|
-
if (neg) v = -v;
|
|
9345
|
-
const base = 10n ** BigInt(decimals);
|
|
9346
|
-
const whole = v / base;
|
|
9347
|
-
const frac = (v % base).toString().padStart(decimals, "0").replace(/0+$/, "");
|
|
9348
|
-
return `${neg ? "-" : ""}${whole}${frac ? `.${frac}` : ""}`;
|
|
9349
|
-
}
|
|
9350
|
-
function deriveLayerTotals(vaults, earn) {
|
|
9351
|
-
const t = {};
|
|
9352
|
-
const slot = (mint, decimals) => t[mint] ??= { supply: 0n, borrow: 0n, decimals };
|
|
9353
|
-
for (const e of earn)
|
|
9354
|
-
slot(e.assetAddress, e.asset.decimals).supply += BigInt(
|
|
9355
|
-
e.liquiditySupplyData.supply || "0"
|
|
9356
|
-
);
|
|
9357
|
-
for (const v of vaults) {
|
|
9358
|
-
slot(v.supplyToken.address, v.supplyToken.decimals).supply += BigInt(
|
|
9359
|
-
v.liquiditySupplyData.supply || "0"
|
|
9360
|
-
);
|
|
9361
|
-
slot(v.borrowToken.address, v.borrowToken.decimals).borrow += BigInt(
|
|
9362
|
-
v.liquidityBorrowData.borrow || "0"
|
|
9363
|
-
);
|
|
9364
|
-
}
|
|
9365
|
-
return t;
|
|
9366
|
-
}
|
|
9367
|
-
var fmt = (raw2, decimals) => Number(raw2) / 10 ** decimals;
|
|
9368
|
-
var jupiterLendCurrency = (t, listed3) => {
|
|
9369
|
-
const base = listed3 ?? {
|
|
9370
|
-
chainId: SOLANA_CHAIN_ID,
|
|
9371
|
-
address: t.address,
|
|
9372
|
-
symbol: t.uiSymbol ?? t.symbol,
|
|
9373
|
-
name: t.name,
|
|
9374
|
-
decimals: t.decimals
|
|
9375
|
-
};
|
|
9376
|
-
return { ...base, assetGroup: base.assetGroup || `solana-${t.address}` };
|
|
9377
|
-
};
|
|
9378
|
-
function convertJupiterLendVault(market, v, opts = {}) {
|
|
9379
|
-
const lenderKey = (0, import_lender_registry2.jupiterLendVaultKey)(market, v.id);
|
|
9380
|
-
const sup = v.supplyToken;
|
|
9381
|
-
const bor = v.borrowToken;
|
|
9382
|
-
const supPrice = num(sup.price);
|
|
9383
|
-
const borPrice = num(bor.price);
|
|
9384
|
-
const ltv = num(v.collateralFactor) / JL_FACTOR_SCALE;
|
|
9385
|
-
const lt = num(v.liquidationThreshold) / JL_FACTOR_SCALE;
|
|
9386
|
-
const penalty = num(v.liquidationPenalty) / JL_BPS;
|
|
9387
|
-
const supAsset = jupiterLendCurrency(sup, opts.tokenList?.[sup.address]);
|
|
9388
|
-
const borAsset = jupiterLendCurrency(bor, opts.tokenList?.[bor.address]);
|
|
9389
|
-
const supSym = supAsset.symbol ?? sup.symbol;
|
|
9390
|
-
const borSym = borAsset.symbol ?? bor.symbol;
|
|
9391
|
-
const label = `${supSym} / ${borSym} \xB7 vault #${v.id}`;
|
|
9392
|
-
const intrinsic = (a) => opts.intrinsicYields?.[a.assetGroup] ?? 0;
|
|
9393
|
-
const layerOf = (mint) => {
|
|
9394
|
-
const l = opts.layer?.[mint];
|
|
9395
|
-
if (!l || l.supply === 0n) return { utilization: 0 };
|
|
9396
|
-
return {
|
|
9397
|
-
utilization: Number(l.borrow * 10000n / l.supply) / 1e4,
|
|
9398
|
-
irmTotalDeposits: fmt(l.supply, l.decimals),
|
|
9399
|
-
irmTotalDebt: fmt(l.borrow, l.decimals)
|
|
9400
|
-
};
|
|
9401
|
-
};
|
|
9402
|
-
const totalSupply = BigInt(v.totalSupply || "0");
|
|
9403
|
-
const withdrawLimit = BigInt(v.withdrawLimit || "0");
|
|
9404
|
-
const lockupRatio = totalSupply > 0n ? Number(withdrawLimit * 10000n / totalSupply) / 1e4 : 0;
|
|
9405
|
-
const supplyDeposits = fmt(v.totalSupply, sup.decimals);
|
|
9406
|
-
const borrowDebt = fmt(v.totalBorrow, bor.decimals);
|
|
9407
|
-
const borrowable = fmt(v.borrowable, bor.decimals);
|
|
9408
|
-
const collateralConfig = {
|
|
9409
|
-
category: 0,
|
|
9410
|
-
label,
|
|
9411
|
-
borrowCollateralFactor: ltv,
|
|
9412
|
-
collateralFactor: lt,
|
|
9413
|
-
borrowFactor: 1,
|
|
9414
|
-
liquidationPenalty: penalty,
|
|
9415
|
-
closeFactor: 1,
|
|
9416
|
-
collateralDisabled: false,
|
|
9417
|
-
debtDisabled: true
|
|
9418
|
-
};
|
|
9419
|
-
const debtConfig = {
|
|
9420
|
-
category: 0,
|
|
9421
|
-
label,
|
|
9422
|
-
borrowCollateralFactor: 0,
|
|
9423
|
-
collateralFactor: 0,
|
|
9424
|
-
borrowFactor: 1,
|
|
9425
|
-
liquidationPenalty: 0,
|
|
9426
|
-
closeFactor: 1,
|
|
9427
|
-
collateralDisabled: true,
|
|
9428
|
-
debtDisabled: false
|
|
9429
|
-
};
|
|
9430
|
-
const common = {
|
|
9431
|
-
totalDebtStable: "0",
|
|
9432
|
-
totalDebtStableUSD: 0,
|
|
9433
|
-
stableBorrowRate: 0,
|
|
9434
|
-
hasStable: false,
|
|
9435
|
-
isActive: true,
|
|
9436
|
-
isFrozen: false,
|
|
9437
|
-
debtCeiling: "0",
|
|
9438
|
-
closeFactor: 1,
|
|
9439
|
-
lockupRatio,
|
|
9440
|
-
rewards: []
|
|
9441
|
-
};
|
|
9442
|
-
const colUid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, sup.address);
|
|
9443
|
-
const debtUid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, bor.address);
|
|
9444
|
-
const collateralLeg = {
|
|
9445
|
-
...common,
|
|
9446
|
-
marketUid: colUid,
|
|
9447
|
-
name: `Collateral ${supSym}`,
|
|
9448
|
-
poolId: sup.address,
|
|
9449
|
-
underlying: sup.address,
|
|
9450
|
-
asset: supAsset,
|
|
9451
|
-
decimals: sup.decimals,
|
|
9452
|
-
totalDeposits: formatRawUnits(v.totalSupply, sup.decimals),
|
|
9453
|
-
totalDebt: "0",
|
|
9454
|
-
totalLiquidity: supplyDeposits,
|
|
9455
|
-
borrowLiquidity: 0,
|
|
9456
|
-
totalDepositsUSD: supplyDeposits * supPrice,
|
|
9457
|
-
totalDebtUSD: 0,
|
|
9458
|
-
totalLiquidityUSD: supplyDeposits * supPrice,
|
|
9459
|
-
borrowLiquidityUSD: 0,
|
|
9460
|
-
...layerOf(sup.address),
|
|
9461
|
-
depositRate: bpsToPercent(v.supplyRate),
|
|
9462
|
-
variableBorrowRate: 0,
|
|
9463
|
-
intrinsicYield: intrinsic(supAsset),
|
|
9464
|
-
liquidationBonus: penalty,
|
|
9465
|
-
config: { "0": collateralConfig },
|
|
9466
|
-
collateralActive: true,
|
|
9467
|
-
borrowingEnabled: false,
|
|
9468
|
-
depositsEnabled: true
|
|
9469
|
-
};
|
|
9470
|
-
const debtLeg = {
|
|
9471
|
-
...common,
|
|
9472
|
-
marketUid: debtUid,
|
|
9473
|
-
name: `Loan ${borSym}`,
|
|
9474
|
-
poolId: bor.address,
|
|
9475
|
-
underlying: bor.address,
|
|
9476
|
-
asset: borAsset,
|
|
9477
|
-
decimals: bor.decimals,
|
|
9478
|
-
totalDeposits: "0",
|
|
9479
|
-
totalDebt: formatRawUnits(v.totalBorrow, bor.decimals),
|
|
9480
|
-
totalLiquidity: borrowable,
|
|
9481
|
-
borrowLiquidity: borrowable,
|
|
9482
|
-
totalDepositsUSD: 0,
|
|
9483
|
-
totalDebtUSD: borrowDebt * borPrice,
|
|
9484
|
-
totalLiquidityUSD: borrowable * borPrice,
|
|
9485
|
-
borrowLiquidityUSD: borrowable * borPrice,
|
|
9486
|
-
...layerOf(bor.address),
|
|
9487
|
-
depositRate: 0,
|
|
9488
|
-
variableBorrowRate: bpsToPercent(v.borrowRate),
|
|
9489
|
-
intrinsicYield: intrinsic(borAsset),
|
|
9490
|
-
liquidationBonus: 0,
|
|
9491
|
-
originationFee: num(v.borrowFee) / 100,
|
|
9492
|
-
config: { "0": debtConfig },
|
|
9493
|
-
collateralActive: false,
|
|
9494
|
-
borrowingEnabled: true,
|
|
9495
|
-
depositsEnabled: false
|
|
9496
|
-
};
|
|
9497
|
-
const vault = {
|
|
9498
|
-
vaultAddress: v.address,
|
|
9499
|
-
vaultId: v.id,
|
|
9500
|
-
collateralAddress: sup.address,
|
|
9501
|
-
loanAddress: bor.address,
|
|
9502
|
-
collateralDecimals: sup.decimals,
|
|
9503
|
-
loanDecimals: bor.decimals,
|
|
9504
|
-
oracle: v.oracle,
|
|
9505
|
-
ltv,
|
|
9506
|
-
liquidationThreshold: lt,
|
|
9507
|
-
liquidationPenalty: penalty,
|
|
9508
|
-
oraclePriceOperate: jlOracleToFluidRaw(
|
|
9509
|
-
v.oraclePriceOperate,
|
|
9510
|
-
sup.decimals,
|
|
9511
|
-
bor.decimals
|
|
9512
|
-
),
|
|
9513
|
-
oraclePriceLiquidate: jlOracleToFluidRaw(
|
|
9514
|
-
v.oraclePriceLiquidate,
|
|
9515
|
-
sup.decimals,
|
|
9516
|
-
bor.decimals
|
|
9517
|
-
),
|
|
9518
|
-
isSmartCol: false,
|
|
9519
|
-
isSmartDebt: false,
|
|
9520
|
-
vaultType: FLUID_VAULT_TYPE_T1,
|
|
9521
|
-
collateral: {
|
|
9522
|
-
assets: [{ underlying: sup.address, decimals: sup.decimals }],
|
|
9523
|
-
dex: null,
|
|
9524
|
-
perShare: null
|
|
9525
|
-
},
|
|
9526
|
-
loan: {
|
|
9527
|
-
assets: [{ underlying: bor.address, decimals: bor.decimals }],
|
|
9528
|
-
dex: null,
|
|
9529
|
-
perShare: null
|
|
9530
|
-
}
|
|
9531
|
-
};
|
|
9532
|
-
const jupiterLendVault = {
|
|
9533
|
-
market,
|
|
9534
|
-
vaultId: v.id,
|
|
9535
|
-
address: v.address,
|
|
9536
|
-
type: v.type,
|
|
9537
|
-
supplyToken: sup.address,
|
|
9538
|
-
borrowToken: bor.address,
|
|
9539
|
-
supplyDecimals: sup.decimals,
|
|
9540
|
-
borrowDecimals: bor.decimals,
|
|
9541
|
-
collateralFactor: num(v.collateralFactor),
|
|
9542
|
-
liquidationThreshold: num(v.liquidationThreshold),
|
|
9543
|
-
liquidationMaxLimit: num(v.liquidationMaxLimit),
|
|
9544
|
-
withdrawalGap: num(v.withdrawalGap),
|
|
9545
|
-
liquidationPenalty: num(v.liquidationPenalty),
|
|
9546
|
-
borrowFee: num(v.borrowFee),
|
|
9547
|
-
supplyRateMagnifier: num(v.supplyRateMagnifier),
|
|
9548
|
-
borrowRateMagnifier: num(v.borrowRateMagnifier),
|
|
9549
|
-
supplyRateLiquidity: num(v.supplyRateLiquidity),
|
|
9550
|
-
borrowRateLiquidity: num(v.borrowRateLiquidity),
|
|
9551
|
-
minimumBorrowing: v.minimumBorrowing,
|
|
9552
|
-
totalPositions: v.totalPositions,
|
|
9553
|
-
borrowLimit: v.borrowLimit,
|
|
9554
|
-
borrowable: v.borrowable,
|
|
9555
|
-
withdrawLimit: v.withdrawLimit,
|
|
9556
|
-
withdrawable: v.withdrawable,
|
|
9557
|
-
oracle: v.oracle,
|
|
9558
|
-
oraclePrice: v.oraclePrice,
|
|
9559
|
-
oraclePriceOperate: v.oraclePriceOperate,
|
|
9560
|
-
oraclePriceLiquidate: v.oraclePriceLiquidate,
|
|
9561
|
-
oracleSources: v.oracleSources,
|
|
9562
|
-
oracleTimestamp: v.oracleTimestamp,
|
|
9563
|
-
liquiditySupplyData: v.liquiditySupplyData,
|
|
9564
|
-
liquidityBorrowData: v.liquidityBorrowData,
|
|
9565
|
-
topTick: v.topTick,
|
|
9566
|
-
metadata: v.metadata
|
|
9567
|
-
};
|
|
9568
|
-
return {
|
|
9569
|
-
lenderKey,
|
|
9570
|
-
chainId: SOLANA_CHAIN_ID,
|
|
9571
|
-
data: { [colUid]: collateralLeg, [debtUid]: debtLeg },
|
|
9572
|
-
params: { vault, jupiterLendVault }
|
|
9573
|
-
};
|
|
9574
|
-
}
|
|
9575
9376
|
|
|
9576
|
-
// src/lending/public-data/jupiter-lend/
|
|
9577
|
-
var
|
|
9377
|
+
// src/lending/public-data/jupiter-lend/onchain.ts
|
|
9378
|
+
var import_svm_kit4 = require("@1delta/svm-kit");
|
|
9578
9379
|
|
|
9579
|
-
// src/lending/public-data/jupiter-lend/idl/
|
|
9580
|
-
var
|
|
9581
|
-
address: "
|
|
9380
|
+
// src/lending/public-data/jupiter-lend/idl/vaults-accounts.json
|
|
9381
|
+
var vaults_accounts_default = {
|
|
9382
|
+
address: "jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi",
|
|
9582
9383
|
metadata: {
|
|
9583
|
-
name: "
|
|
9584
|
-
version: "0.1.
|
|
9384
|
+
name: "vaults",
|
|
9385
|
+
version: "0.1.5",
|
|
9585
9386
|
spec: "0.1.0",
|
|
9586
|
-
description: "
|
|
9387
|
+
description: "Account layouts only, vendored from the vaults program IDL (pos-indexer apps/sol-indexer/src/events/idl/jupiter-lend/vaults.json, v0.1.5) for the on-chain vault enumeration."
|
|
9587
9388
|
},
|
|
9588
|
-
instructions: [
|
|
9389
|
+
instructions: [],
|
|
9390
|
+
accounts: [
|
|
9589
9391
|
{
|
|
9590
|
-
name: "
|
|
9392
|
+
name: "Dex",
|
|
9591
9393
|
discriminator: [
|
|
9592
|
-
|
|
9593
|
-
|
|
9594
|
-
|
|
9595
|
-
|
|
9596
|
-
|
|
9597
|
-
|
|
9598
|
-
|
|
9599
|
-
|
|
9600
|
-
]
|
|
9601
|
-
accounts: [
|
|
9602
|
-
{
|
|
9603
|
-
name: "authority",
|
|
9604
|
-
signer: true
|
|
9605
|
-
},
|
|
9606
|
-
{
|
|
9607
|
-
name: "flashloan_admin",
|
|
9608
|
-
writable: true
|
|
9609
|
-
}
|
|
9610
|
-
],
|
|
9611
|
-
args: []
|
|
9394
|
+
236,
|
|
9395
|
+
30,
|
|
9396
|
+
181,
|
|
9397
|
+
80,
|
|
9398
|
+
209,
|
|
9399
|
+
217,
|
|
9400
|
+
25,
|
|
9401
|
+
163
|
|
9402
|
+
]
|
|
9612
9403
|
},
|
|
9613
9404
|
{
|
|
9614
|
-
name: "
|
|
9405
|
+
name: "TokenReserve",
|
|
9615
9406
|
discriminator: [
|
|
9616
|
-
|
|
9617
|
-
|
|
9618
|
-
|
|
9619
|
-
24,
|
|
9620
|
-
240,
|
|
9621
|
-
9,
|
|
9407
|
+
21,
|
|
9408
|
+
18,
|
|
9409
|
+
59,
|
|
9622
9410
|
135,
|
|
9623
|
-
|
|
9624
|
-
|
|
9625
|
-
|
|
9626
|
-
|
|
9627
|
-
name: "signer",
|
|
9628
|
-
writable: true,
|
|
9629
|
-
signer: true
|
|
9630
|
-
},
|
|
9631
|
-
{
|
|
9632
|
-
name: "flashloan_admin",
|
|
9633
|
-
writable: true
|
|
9634
|
-
},
|
|
9635
|
-
{
|
|
9636
|
-
name: "signer_borrow_token_account",
|
|
9637
|
-
writable: true
|
|
9638
|
-
},
|
|
9639
|
-
{
|
|
9640
|
-
name: "mint"
|
|
9641
|
-
},
|
|
9642
|
-
{
|
|
9643
|
-
name: "flashloan_token_reserves_liquidity",
|
|
9644
|
-
writable: true
|
|
9645
|
-
},
|
|
9646
|
-
{
|
|
9647
|
-
name: "flashloan_borrow_position_on_liquidity",
|
|
9648
|
-
writable: true
|
|
9649
|
-
},
|
|
9650
|
-
{
|
|
9651
|
-
name: "rate_model"
|
|
9652
|
-
},
|
|
9653
|
-
{
|
|
9654
|
-
name: "vault",
|
|
9655
|
-
writable: true
|
|
9656
|
-
},
|
|
9657
|
-
{
|
|
9658
|
-
name: "liquidity"
|
|
9659
|
-
},
|
|
9660
|
-
{
|
|
9661
|
-
name: "liquidity_program",
|
|
9662
|
-
relations: [
|
|
9663
|
-
"flashloan_admin"
|
|
9664
|
-
]
|
|
9665
|
-
},
|
|
9666
|
-
{
|
|
9667
|
-
name: "token_program"
|
|
9668
|
-
},
|
|
9669
|
-
{
|
|
9670
|
-
name: "associated_token_program",
|
|
9671
|
-
optional: true,
|
|
9672
|
-
address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
|
|
9673
|
-
},
|
|
9674
|
-
{
|
|
9675
|
-
name: "system_program",
|
|
9676
|
-
address: "11111111111111111111111111111111"
|
|
9677
|
-
},
|
|
9678
|
-
{
|
|
9679
|
-
name: "instruction_sysvar",
|
|
9680
|
-
address: "Sysvar1nstructions1111111111111111111111111"
|
|
9681
|
-
}
|
|
9682
|
-
],
|
|
9683
|
-
args: [
|
|
9684
|
-
{
|
|
9685
|
-
name: "amount",
|
|
9686
|
-
type: "u64"
|
|
9687
|
-
}
|
|
9411
|
+
120,
|
|
9412
|
+
20,
|
|
9413
|
+
31,
|
|
9414
|
+
12
|
|
9688
9415
|
]
|
|
9689
9416
|
},
|
|
9690
9417
|
{
|
|
9691
|
-
name: "
|
|
9418
|
+
name: "UserBorrowPosition",
|
|
9692
9419
|
discriminator: [
|
|
9693
|
-
|
|
9694
|
-
|
|
9695
|
-
|
|
9696
|
-
|
|
9697
|
-
|
|
9698
|
-
|
|
9699
|
-
|
|
9700
|
-
|
|
9701
|
-
],
|
|
9702
|
-
accounts: [
|
|
9703
|
-
{
|
|
9704
|
-
name: "signer",
|
|
9705
|
-
writable: true,
|
|
9706
|
-
signer: true
|
|
9707
|
-
},
|
|
9708
|
-
{
|
|
9709
|
-
name: "flashloan_admin",
|
|
9710
|
-
writable: true
|
|
9711
|
-
},
|
|
9712
|
-
{
|
|
9713
|
-
name: "signer_borrow_token_account",
|
|
9714
|
-
writable: true
|
|
9715
|
-
},
|
|
9716
|
-
{
|
|
9717
|
-
name: "mint"
|
|
9718
|
-
},
|
|
9719
|
-
{
|
|
9720
|
-
name: "flashloan_token_reserves_liquidity",
|
|
9721
|
-
writable: true
|
|
9722
|
-
},
|
|
9723
|
-
{
|
|
9724
|
-
name: "flashloan_borrow_position_on_liquidity",
|
|
9725
|
-
writable: true
|
|
9726
|
-
},
|
|
9727
|
-
{
|
|
9728
|
-
name: "rate_model"
|
|
9729
|
-
},
|
|
9730
|
-
{
|
|
9731
|
-
name: "vault",
|
|
9732
|
-
writable: true
|
|
9733
|
-
},
|
|
9734
|
-
{
|
|
9735
|
-
name: "liquidity"
|
|
9736
|
-
},
|
|
9737
|
-
{
|
|
9738
|
-
name: "liquidity_program",
|
|
9739
|
-
relations: [
|
|
9740
|
-
"flashloan_admin"
|
|
9741
|
-
]
|
|
9742
|
-
},
|
|
9743
|
-
{
|
|
9744
|
-
name: "token_program"
|
|
9745
|
-
},
|
|
9746
|
-
{
|
|
9747
|
-
name: "associated_token_program",
|
|
9748
|
-
optional: true,
|
|
9749
|
-
address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
|
|
9750
|
-
},
|
|
9751
|
-
{
|
|
9752
|
-
name: "system_program",
|
|
9753
|
-
address: "11111111111111111111111111111111"
|
|
9754
|
-
},
|
|
9755
|
-
{
|
|
9756
|
-
name: "instruction_sysvar",
|
|
9757
|
-
address: "Sysvar1nstructions1111111111111111111111111"
|
|
9758
|
-
}
|
|
9759
|
-
],
|
|
9760
|
-
args: [
|
|
9761
|
-
{
|
|
9762
|
-
name: "amount",
|
|
9763
|
-
type: "u64"
|
|
9764
|
-
}
|
|
9420
|
+
73,
|
|
9421
|
+
126,
|
|
9422
|
+
65,
|
|
9423
|
+
123,
|
|
9424
|
+
220,
|
|
9425
|
+
126,
|
|
9426
|
+
197,
|
|
9427
|
+
24
|
|
9765
9428
|
]
|
|
9766
9429
|
},
|
|
9767
9430
|
{
|
|
9768
|
-
name: "
|
|
9431
|
+
name: "UserSupplyPosition",
|
|
9769
9432
|
discriminator: [
|
|
9770
|
-
|
|
9433
|
+
202,
|
|
9434
|
+
219,
|
|
9435
|
+
136,
|
|
9436
|
+
118,
|
|
9437
|
+
61,
|
|
9438
|
+
177,
|
|
9439
|
+
21,
|
|
9440
|
+
146
|
|
9441
|
+
]
|
|
9442
|
+
},
|
|
9443
|
+
{
|
|
9444
|
+
name: "VaultAdmin",
|
|
9445
|
+
discriminator: [
|
|
9446
|
+
88,
|
|
9447
|
+
97,
|
|
9448
|
+
160,
|
|
9771
9449
|
117,
|
|
9772
|
-
|
|
9773
|
-
|
|
9774
|
-
|
|
9775
|
-
|
|
9776
|
-
|
|
9777
|
-
|
|
9778
|
-
|
|
9779
|
-
|
|
9780
|
-
|
|
9781
|
-
|
|
9782
|
-
|
|
9783
|
-
|
|
9784
|
-
|
|
9785
|
-
|
|
9786
|
-
|
|
9787
|
-
|
|
9788
|
-
|
|
9789
|
-
|
|
9790
|
-
|
|
9791
|
-
|
|
9792
|
-
|
|
9793
|
-
|
|
9794
|
-
|
|
9795
|
-
|
|
9796
|
-
|
|
9797
|
-
|
|
9798
|
-
|
|
9799
|
-
|
|
9800
|
-
|
|
9801
|
-
|
|
9802
|
-
|
|
9803
|
-
|
|
9804
|
-
|
|
9805
|
-
|
|
9806
|
-
|
|
9807
|
-
|
|
9808
|
-
|
|
9809
|
-
|
|
9810
|
-
|
|
9450
|
+
102,
|
|
9451
|
+
39,
|
|
9452
|
+
103,
|
|
9453
|
+
44
|
|
9454
|
+
]
|
|
9455
|
+
},
|
|
9456
|
+
{
|
|
9457
|
+
name: "VaultConfig",
|
|
9458
|
+
discriminator: [
|
|
9459
|
+
99,
|
|
9460
|
+
86,
|
|
9461
|
+
43,
|
|
9462
|
+
216,
|
|
9463
|
+
184,
|
|
9464
|
+
102,
|
|
9465
|
+
119,
|
|
9466
|
+
77
|
|
9467
|
+
]
|
|
9468
|
+
},
|
|
9469
|
+
{
|
|
9470
|
+
name: "VaultState",
|
|
9471
|
+
discriminator: [
|
|
9472
|
+
228,
|
|
9473
|
+
196,
|
|
9474
|
+
82,
|
|
9475
|
+
165,
|
|
9476
|
+
98,
|
|
9477
|
+
210,
|
|
9478
|
+
235,
|
|
9479
|
+
152
|
|
9480
|
+
]
|
|
9481
|
+
},
|
|
9482
|
+
{
|
|
9483
|
+
name: "Oracle",
|
|
9484
|
+
discriminator: [
|
|
9485
|
+
139,
|
|
9486
|
+
194,
|
|
9487
|
+
131,
|
|
9488
|
+
179,
|
|
9489
|
+
140,
|
|
9490
|
+
179,
|
|
9491
|
+
229,
|
|
9492
|
+
244
|
|
9493
|
+
]
|
|
9494
|
+
}
|
|
9495
|
+
],
|
|
9496
|
+
types: [
|
|
9497
|
+
{
|
|
9498
|
+
name: "Dex",
|
|
9499
|
+
docs: [
|
|
9500
|
+
"Core DEX pool state. One per trading pair.",
|
|
9501
|
+
"Uses zero_copy for efficient access without deserialization overhead."
|
|
9502
|
+
],
|
|
9503
|
+
serialization: "bytemuck",
|
|
9504
|
+
repr: {
|
|
9505
|
+
kind: "c",
|
|
9506
|
+
packed: true
|
|
9507
|
+
},
|
|
9508
|
+
type: {
|
|
9509
|
+
kind: "struct",
|
|
9510
|
+
fields: [
|
|
9511
|
+
{
|
|
9512
|
+
name: "dex_id",
|
|
9513
|
+
type: "u16"
|
|
9514
|
+
},
|
|
9515
|
+
{
|
|
9516
|
+
name: "re_entrancy",
|
|
9517
|
+
type: "u8"
|
|
9518
|
+
},
|
|
9519
|
+
{
|
|
9520
|
+
name: "token_0",
|
|
9521
|
+
type: "pubkey"
|
|
9522
|
+
},
|
|
9523
|
+
{
|
|
9524
|
+
name: "token_1",
|
|
9525
|
+
type: "pubkey"
|
|
9526
|
+
},
|
|
9527
|
+
{
|
|
9528
|
+
name: "token_0_decimals",
|
|
9529
|
+
type: "u8"
|
|
9530
|
+
},
|
|
9531
|
+
{
|
|
9532
|
+
name: "token_1_decimals",
|
|
9533
|
+
type: "u8"
|
|
9534
|
+
},
|
|
9535
|
+
{
|
|
9536
|
+
name: "last_to_last_stored_price",
|
|
9537
|
+
type: "u128"
|
|
9538
|
+
},
|
|
9539
|
+
{
|
|
9540
|
+
name: "last_stored_price",
|
|
9541
|
+
type: "u128"
|
|
9542
|
+
},
|
|
9543
|
+
{
|
|
9544
|
+
name: "center_price",
|
|
9545
|
+
type: "u128"
|
|
9546
|
+
},
|
|
9547
|
+
{
|
|
9548
|
+
name: "last_update_timestamp",
|
|
9549
|
+
type: "u64"
|
|
9550
|
+
},
|
|
9551
|
+
{
|
|
9552
|
+
name: "last_update_slot",
|
|
9553
|
+
type: "u64"
|
|
9554
|
+
},
|
|
9555
|
+
{
|
|
9556
|
+
name: "is_smart_collateral_enabled",
|
|
9557
|
+
type: "u8"
|
|
9558
|
+
},
|
|
9559
|
+
{
|
|
9560
|
+
name: "is_smart_debt_enabled",
|
|
9561
|
+
type: "u8"
|
|
9562
|
+
},
|
|
9563
|
+
{
|
|
9564
|
+
name: "fee",
|
|
9565
|
+
type: "u32"
|
|
9566
|
+
},
|
|
9567
|
+
{
|
|
9568
|
+
name: "revenue_cut",
|
|
9569
|
+
type: "u8"
|
|
9570
|
+
},
|
|
9571
|
+
{
|
|
9572
|
+
name: "percent_change_active",
|
|
9573
|
+
type: "u8"
|
|
9574
|
+
},
|
|
9575
|
+
{
|
|
9576
|
+
name: "upper_percent",
|
|
9577
|
+
type: "u32"
|
|
9578
|
+
},
|
|
9579
|
+
{
|
|
9580
|
+
name: "lower_percent",
|
|
9581
|
+
type: "u32"
|
|
9582
|
+
},
|
|
9583
|
+
{
|
|
9584
|
+
name: "threshold_change_active",
|
|
9585
|
+
type: "u8"
|
|
9586
|
+
},
|
|
9587
|
+
{
|
|
9588
|
+
name: "upper_shift_threshold_percent",
|
|
9589
|
+
type: "u16"
|
|
9590
|
+
},
|
|
9591
|
+
{
|
|
9592
|
+
name: "lower_shift_threshold_percent",
|
|
9593
|
+
type: "u16"
|
|
9594
|
+
},
|
|
9595
|
+
{
|
|
9596
|
+
name: "shifting_time",
|
|
9597
|
+
type: "u32"
|
|
9598
|
+
},
|
|
9599
|
+
{
|
|
9600
|
+
name: "center_price_address",
|
|
9601
|
+
type: "pubkey"
|
|
9602
|
+
},
|
|
9603
|
+
{
|
|
9604
|
+
name: "max_center_price",
|
|
9605
|
+
type: "u64"
|
|
9606
|
+
},
|
|
9607
|
+
{
|
|
9608
|
+
name: "min_center_price",
|
|
9609
|
+
type: "u64"
|
|
9610
|
+
},
|
|
9611
|
+
{
|
|
9612
|
+
name: "token_0_max_utilization",
|
|
9613
|
+
type: "u16"
|
|
9614
|
+
},
|
|
9615
|
+
{
|
|
9616
|
+
name: "token_1_max_utilization",
|
|
9617
|
+
type: "u16"
|
|
9618
|
+
},
|
|
9619
|
+
{
|
|
9620
|
+
name: "is_center_price_shift_active",
|
|
9621
|
+
type: "u8"
|
|
9622
|
+
},
|
|
9623
|
+
{
|
|
9624
|
+
name: "swap_and_arbitrage_paused",
|
|
9625
|
+
type: "u8"
|
|
9626
|
+
},
|
|
9627
|
+
{
|
|
9628
|
+
name: "total_supply_shares",
|
|
9629
|
+
type: "u64"
|
|
9630
|
+
},
|
|
9631
|
+
{
|
|
9632
|
+
name: "max_supply_shares",
|
|
9633
|
+
type: "u64"
|
|
9634
|
+
},
|
|
9635
|
+
{
|
|
9636
|
+
name: "total_borrow_shares",
|
|
9637
|
+
type: "u64"
|
|
9638
|
+
},
|
|
9639
|
+
{
|
|
9640
|
+
name: "max_borrow_shares",
|
|
9641
|
+
type: "u64"
|
|
9642
|
+
},
|
|
9643
|
+
{
|
|
9644
|
+
name: "range_old_upper_shift",
|
|
9645
|
+
type: "u32"
|
|
9646
|
+
},
|
|
9647
|
+
{
|
|
9648
|
+
name: "range_old_lower_shift",
|
|
9649
|
+
type: "u32"
|
|
9650
|
+
},
|
|
9651
|
+
{
|
|
9652
|
+
name: "range_shift_duration",
|
|
9653
|
+
type: "u32"
|
|
9654
|
+
},
|
|
9655
|
+
{
|
|
9656
|
+
name: "range_shift_start_timestamp",
|
|
9657
|
+
type: "u32"
|
|
9658
|
+
},
|
|
9659
|
+
{
|
|
9660
|
+
name: "threshold_old_upper_shift",
|
|
9661
|
+
type: "u16"
|
|
9662
|
+
},
|
|
9663
|
+
{
|
|
9664
|
+
name: "threshold_old_lower_shift",
|
|
9665
|
+
type: "u16"
|
|
9666
|
+
},
|
|
9667
|
+
{
|
|
9668
|
+
name: "threshold_shift_duration",
|
|
9669
|
+
type: "u32"
|
|
9670
|
+
},
|
|
9671
|
+
{
|
|
9672
|
+
name: "threshold_shift_start_timestamp",
|
|
9673
|
+
type: "u32"
|
|
9674
|
+
},
|
|
9675
|
+
{
|
|
9676
|
+
name: "threshold_shift_old_timestamp",
|
|
9677
|
+
type: "u32"
|
|
9678
|
+
},
|
|
9679
|
+
{
|
|
9680
|
+
name: "center_price_shift_start_timestamp",
|
|
9681
|
+
type: "u32"
|
|
9682
|
+
},
|
|
9683
|
+
{
|
|
9684
|
+
name: "center_price_shift_percent",
|
|
9685
|
+
type: "u32"
|
|
9686
|
+
},
|
|
9687
|
+
{
|
|
9688
|
+
name: "center_price_shift_time",
|
|
9689
|
+
type: "u32"
|
|
9690
|
+
},
|
|
9691
|
+
{
|
|
9692
|
+
name: "_reserved",
|
|
9693
|
+
type: {
|
|
9694
|
+
array: [
|
|
9695
|
+
"u8",
|
|
9696
|
+
32
|
|
9697
|
+
]
|
|
9698
|
+
}
|
|
9699
|
+
},
|
|
9700
|
+
{
|
|
9701
|
+
name: "bump",
|
|
9702
|
+
type: "u8"
|
|
9703
|
+
}
|
|
9704
|
+
]
|
|
9705
|
+
}
|
|
9706
|
+
},
|
|
9707
|
+
{
|
|
9708
|
+
name: "TokenReserve",
|
|
9709
|
+
docs: [
|
|
9710
|
+
"Token configuration and exchange prices"
|
|
9711
|
+
],
|
|
9712
|
+
serialization: "bytemuck",
|
|
9713
|
+
repr: {
|
|
9714
|
+
kind: "c",
|
|
9715
|
+
packed: true
|
|
9716
|
+
},
|
|
9717
|
+
type: {
|
|
9718
|
+
kind: "struct",
|
|
9719
|
+
fields: [
|
|
9720
|
+
{
|
|
9721
|
+
name: "mint",
|
|
9722
|
+
type: "pubkey"
|
|
9723
|
+
},
|
|
9724
|
+
{
|
|
9725
|
+
name: "vault",
|
|
9726
|
+
type: "pubkey"
|
|
9727
|
+
},
|
|
9728
|
+
{
|
|
9729
|
+
name: "borrow_rate",
|
|
9730
|
+
type: "u16"
|
|
9731
|
+
},
|
|
9732
|
+
{
|
|
9733
|
+
name: "fee_on_interest",
|
|
9734
|
+
type: "u16"
|
|
9735
|
+
},
|
|
9736
|
+
{
|
|
9737
|
+
name: "last_utilization",
|
|
9738
|
+
type: "u16"
|
|
9739
|
+
},
|
|
9740
|
+
{
|
|
9741
|
+
name: "last_update_timestamp",
|
|
9742
|
+
type: "u64"
|
|
9743
|
+
},
|
|
9744
|
+
{
|
|
9745
|
+
name: "supply_exchange_price",
|
|
9746
|
+
type: "u64"
|
|
9747
|
+
},
|
|
9748
|
+
{
|
|
9749
|
+
name: "borrow_exchange_price",
|
|
9750
|
+
type: "u64"
|
|
9751
|
+
},
|
|
9752
|
+
{
|
|
9753
|
+
name: "max_utilization",
|
|
9754
|
+
type: "u16"
|
|
9755
|
+
},
|
|
9756
|
+
{
|
|
9757
|
+
name: "total_supply_with_interest",
|
|
9758
|
+
type: "u64"
|
|
9759
|
+
},
|
|
9760
|
+
{
|
|
9761
|
+
name: "total_supply_interest_free",
|
|
9762
|
+
type: "u64"
|
|
9763
|
+
},
|
|
9764
|
+
{
|
|
9765
|
+
name: "total_borrow_with_interest",
|
|
9766
|
+
type: "u64"
|
|
9767
|
+
},
|
|
9768
|
+
{
|
|
9769
|
+
name: "total_borrow_interest_free",
|
|
9770
|
+
type: "u64"
|
|
9771
|
+
},
|
|
9772
|
+
{
|
|
9773
|
+
name: "total_claim_amount",
|
|
9774
|
+
type: "u64"
|
|
9775
|
+
},
|
|
9776
|
+
{
|
|
9777
|
+
name: "interacting_protocol",
|
|
9778
|
+
type: "pubkey"
|
|
9779
|
+
},
|
|
9780
|
+
{
|
|
9781
|
+
name: "interacting_timestamp",
|
|
9782
|
+
type: "u64"
|
|
9783
|
+
},
|
|
9784
|
+
{
|
|
9785
|
+
name: "interacting_balance",
|
|
9786
|
+
type: "u64"
|
|
9787
|
+
}
|
|
9788
|
+
]
|
|
9789
|
+
}
|
|
9790
|
+
},
|
|
9791
|
+
{
|
|
9792
|
+
name: "UserBorrowPosition",
|
|
9793
|
+
docs: [
|
|
9794
|
+
"User borrow position"
|
|
9795
|
+
],
|
|
9796
|
+
serialization: "bytemuck",
|
|
9797
|
+
repr: {
|
|
9798
|
+
kind: "c",
|
|
9799
|
+
packed: true
|
|
9800
|
+
},
|
|
9801
|
+
type: {
|
|
9802
|
+
kind: "struct",
|
|
9803
|
+
fields: [
|
|
9804
|
+
{
|
|
9805
|
+
name: "protocol",
|
|
9806
|
+
type: "pubkey"
|
|
9807
|
+
},
|
|
9808
|
+
{
|
|
9809
|
+
name: "mint",
|
|
9810
|
+
type: "pubkey"
|
|
9811
|
+
},
|
|
9812
|
+
{
|
|
9813
|
+
name: "with_interest",
|
|
9814
|
+
type: "u8"
|
|
9815
|
+
},
|
|
9816
|
+
{
|
|
9817
|
+
name: "amount",
|
|
9818
|
+
type: "u64"
|
|
9819
|
+
},
|
|
9820
|
+
{
|
|
9821
|
+
name: "debt_ceiling",
|
|
9822
|
+
type: "u64"
|
|
9823
|
+
},
|
|
9824
|
+
{
|
|
9825
|
+
name: "last_update",
|
|
9826
|
+
type: "u64"
|
|
9827
|
+
},
|
|
9828
|
+
{
|
|
9829
|
+
name: "expand_pct",
|
|
9830
|
+
type: "u16"
|
|
9831
|
+
},
|
|
9832
|
+
{
|
|
9833
|
+
name: "expand_duration",
|
|
9834
|
+
type: "u32"
|
|
9835
|
+
},
|
|
9836
|
+
{
|
|
9837
|
+
name: "base_debt_ceiling",
|
|
9838
|
+
type: "u64"
|
|
9839
|
+
},
|
|
9840
|
+
{
|
|
9841
|
+
name: "max_debt_ceiling",
|
|
9842
|
+
type: "u64"
|
|
9843
|
+
},
|
|
9844
|
+
{
|
|
9845
|
+
name: "status",
|
|
9846
|
+
type: "u8"
|
|
9847
|
+
}
|
|
9848
|
+
]
|
|
9849
|
+
}
|
|
9850
|
+
},
|
|
9851
|
+
{
|
|
9852
|
+
name: "UserSupplyPosition",
|
|
9853
|
+
docs: [
|
|
9854
|
+
"User supply position"
|
|
9855
|
+
],
|
|
9856
|
+
serialization: "bytemuck",
|
|
9857
|
+
repr: {
|
|
9858
|
+
kind: "c",
|
|
9859
|
+
packed: true
|
|
9860
|
+
},
|
|
9861
|
+
type: {
|
|
9862
|
+
kind: "struct",
|
|
9863
|
+
fields: [
|
|
9864
|
+
{
|
|
9865
|
+
name: "protocol",
|
|
9866
|
+
type: "pubkey"
|
|
9867
|
+
},
|
|
9868
|
+
{
|
|
9869
|
+
name: "mint",
|
|
9870
|
+
type: "pubkey"
|
|
9871
|
+
},
|
|
9872
|
+
{
|
|
9873
|
+
name: "with_interest",
|
|
9874
|
+
type: "u8"
|
|
9875
|
+
},
|
|
9876
|
+
{
|
|
9877
|
+
name: "amount",
|
|
9878
|
+
type: "u64"
|
|
9879
|
+
},
|
|
9880
|
+
{
|
|
9881
|
+
name: "withdrawal_limit",
|
|
9882
|
+
type: "u64"
|
|
9883
|
+
},
|
|
9884
|
+
{
|
|
9885
|
+
name: "decay_amount",
|
|
9886
|
+
type: "u64"
|
|
9887
|
+
},
|
|
9888
|
+
{
|
|
9889
|
+
name: "last_update",
|
|
9890
|
+
type: "u64"
|
|
9891
|
+
},
|
|
9892
|
+
{
|
|
9893
|
+
name: "expand_pct",
|
|
9894
|
+
type: "u16"
|
|
9895
|
+
},
|
|
9896
|
+
{
|
|
9897
|
+
name: "expand_duration",
|
|
9898
|
+
type: "u32"
|
|
9899
|
+
},
|
|
9900
|
+
{
|
|
9901
|
+
name: "decay_duration",
|
|
9902
|
+
type: "u32"
|
|
9903
|
+
},
|
|
9904
|
+
{
|
|
9905
|
+
name: "base_withdrawal_limit",
|
|
9906
|
+
type: "u64"
|
|
9907
|
+
},
|
|
9908
|
+
{
|
|
9909
|
+
name: "status",
|
|
9910
|
+
type: "u8"
|
|
9911
|
+
}
|
|
9912
|
+
]
|
|
9913
|
+
}
|
|
9914
|
+
},
|
|
9915
|
+
{
|
|
9916
|
+
name: "VaultAdmin",
|
|
9917
|
+
type: {
|
|
9918
|
+
kind: "struct",
|
|
9919
|
+
fields: [
|
|
9920
|
+
{
|
|
9921
|
+
name: "authority",
|
|
9922
|
+
type: "pubkey"
|
|
9923
|
+
},
|
|
9924
|
+
{
|
|
9925
|
+
name: "liquidity_program",
|
|
9926
|
+
type: "pubkey"
|
|
9927
|
+
},
|
|
9928
|
+
{
|
|
9929
|
+
name: "next_vault_id",
|
|
9930
|
+
type: "u16"
|
|
9931
|
+
},
|
|
9932
|
+
{
|
|
9933
|
+
name: "auths",
|
|
9934
|
+
type: {
|
|
9935
|
+
vec: "pubkey"
|
|
9936
|
+
}
|
|
9937
|
+
},
|
|
9938
|
+
{
|
|
9939
|
+
name: "bump",
|
|
9940
|
+
type: "u8"
|
|
9941
|
+
}
|
|
9942
|
+
]
|
|
9943
|
+
}
|
|
9944
|
+
},
|
|
9945
|
+
{
|
|
9946
|
+
name: "VaultConfig",
|
|
9947
|
+
serialization: "bytemuck",
|
|
9948
|
+
repr: {
|
|
9949
|
+
kind: "c",
|
|
9950
|
+
packed: true
|
|
9951
|
+
},
|
|
9952
|
+
type: {
|
|
9953
|
+
kind: "struct",
|
|
9954
|
+
fields: [
|
|
9955
|
+
{
|
|
9956
|
+
name: "vault_id",
|
|
9957
|
+
type: "u16"
|
|
9958
|
+
},
|
|
9959
|
+
{
|
|
9960
|
+
name: "supply_rate_magnifier",
|
|
9961
|
+
type: "i16"
|
|
9962
|
+
},
|
|
9963
|
+
{
|
|
9964
|
+
name: "borrow_rate_magnifier",
|
|
9965
|
+
type: "i16"
|
|
9966
|
+
},
|
|
9967
|
+
{
|
|
9968
|
+
name: "collateral_factor",
|
|
9969
|
+
type: "u16"
|
|
9970
|
+
},
|
|
9971
|
+
{
|
|
9972
|
+
name: "liquidation_threshold",
|
|
9973
|
+
type: "u16"
|
|
9974
|
+
},
|
|
9975
|
+
{
|
|
9976
|
+
name: "liquidation_max_limit",
|
|
9977
|
+
type: "u16"
|
|
9978
|
+
},
|
|
9979
|
+
{
|
|
9980
|
+
name: "withdraw_gap",
|
|
9981
|
+
type: "u16"
|
|
9982
|
+
},
|
|
9983
|
+
{
|
|
9984
|
+
name: "liquidation_penalty",
|
|
9985
|
+
type: "u16"
|
|
9986
|
+
},
|
|
9987
|
+
{
|
|
9988
|
+
name: "borrow_fee",
|
|
9989
|
+
type: "u8"
|
|
9990
|
+
},
|
|
9991
|
+
{
|
|
9992
|
+
name: "vault_type",
|
|
9993
|
+
type: "u8"
|
|
9994
|
+
},
|
|
9995
|
+
{
|
|
9996
|
+
name: "oracle",
|
|
9997
|
+
type: "pubkey"
|
|
9998
|
+
},
|
|
9999
|
+
{
|
|
10000
|
+
name: "rebalancer",
|
|
10001
|
+
type: "pubkey"
|
|
10002
|
+
},
|
|
10003
|
+
{
|
|
10004
|
+
name: "liquidity_program",
|
|
10005
|
+
type: "pubkey"
|
|
10006
|
+
},
|
|
10007
|
+
{
|
|
10008
|
+
name: "oracle_program",
|
|
10009
|
+
type: "pubkey"
|
|
10010
|
+
},
|
|
10011
|
+
{
|
|
10012
|
+
name: "supply_token",
|
|
10013
|
+
type: "pubkey"
|
|
10014
|
+
},
|
|
10015
|
+
{
|
|
10016
|
+
name: "borrow_token",
|
|
10017
|
+
type: "pubkey"
|
|
10018
|
+
},
|
|
10019
|
+
{
|
|
10020
|
+
name: "bump",
|
|
10021
|
+
type: "u8"
|
|
10022
|
+
}
|
|
10023
|
+
]
|
|
10024
|
+
}
|
|
10025
|
+
},
|
|
10026
|
+
{
|
|
10027
|
+
name: "VaultState",
|
|
10028
|
+
serialization: "bytemuck",
|
|
10029
|
+
repr: {
|
|
10030
|
+
kind: "c",
|
|
10031
|
+
packed: true
|
|
10032
|
+
},
|
|
10033
|
+
type: {
|
|
10034
|
+
kind: "struct",
|
|
10035
|
+
fields: [
|
|
10036
|
+
{
|
|
10037
|
+
name: "vault_id",
|
|
10038
|
+
type: "u16"
|
|
10039
|
+
},
|
|
10040
|
+
{
|
|
10041
|
+
name: "branch_liquidated",
|
|
10042
|
+
type: "u8"
|
|
10043
|
+
},
|
|
10044
|
+
{
|
|
10045
|
+
name: "topmost_tick",
|
|
10046
|
+
type: "i32"
|
|
10047
|
+
},
|
|
10048
|
+
{
|
|
10049
|
+
name: "current_branch_id",
|
|
10050
|
+
type: "u32"
|
|
10051
|
+
},
|
|
10052
|
+
{
|
|
10053
|
+
name: "total_branch_id",
|
|
10054
|
+
type: "u32"
|
|
10055
|
+
},
|
|
10056
|
+
{
|
|
10057
|
+
name: "total_supply",
|
|
10058
|
+
type: "u64"
|
|
10059
|
+
},
|
|
10060
|
+
{
|
|
10061
|
+
name: "total_borrow",
|
|
10062
|
+
type: "u64"
|
|
10063
|
+
},
|
|
10064
|
+
{
|
|
10065
|
+
name: "total_positions",
|
|
10066
|
+
type: "u32"
|
|
10067
|
+
},
|
|
10068
|
+
{
|
|
10069
|
+
name: "absorbed_debt_amount",
|
|
10070
|
+
type: "u128"
|
|
10071
|
+
},
|
|
10072
|
+
{
|
|
10073
|
+
name: "absorbed_col_amount",
|
|
10074
|
+
type: "u128"
|
|
10075
|
+
},
|
|
10076
|
+
{
|
|
10077
|
+
name: "absorbed_dust_debt",
|
|
10078
|
+
type: "u64"
|
|
10079
|
+
},
|
|
10080
|
+
{
|
|
10081
|
+
name: "liquidity_supply_exchange_price",
|
|
10082
|
+
type: "u64"
|
|
10083
|
+
},
|
|
10084
|
+
{
|
|
10085
|
+
name: "liquidity_borrow_exchange_price",
|
|
10086
|
+
type: "u64"
|
|
10087
|
+
},
|
|
10088
|
+
{
|
|
10089
|
+
name: "vault_supply_exchange_price",
|
|
10090
|
+
type: "u64"
|
|
10091
|
+
},
|
|
10092
|
+
{
|
|
10093
|
+
name: "vault_borrow_exchange_price",
|
|
10094
|
+
type: "u64"
|
|
10095
|
+
},
|
|
10096
|
+
{
|
|
10097
|
+
name: "next_position_id",
|
|
10098
|
+
type: "u32"
|
|
10099
|
+
},
|
|
10100
|
+
{
|
|
10101
|
+
name: "last_update_timestamp",
|
|
10102
|
+
type: "u64"
|
|
10103
|
+
}
|
|
10104
|
+
]
|
|
10105
|
+
}
|
|
10106
|
+
},
|
|
10107
|
+
{
|
|
10108
|
+
name: "Oracle",
|
|
10109
|
+
type: {
|
|
10110
|
+
kind: "struct",
|
|
10111
|
+
fields: [
|
|
10112
|
+
{
|
|
10113
|
+
name: "nonce",
|
|
10114
|
+
type: "u16"
|
|
10115
|
+
},
|
|
10116
|
+
{
|
|
10117
|
+
name: "sources",
|
|
10118
|
+
type: {
|
|
10119
|
+
vec: {
|
|
10120
|
+
defined: {
|
|
10121
|
+
name: "Sources"
|
|
10122
|
+
}
|
|
10123
|
+
}
|
|
10124
|
+
}
|
|
10125
|
+
},
|
|
10126
|
+
{
|
|
10127
|
+
name: "bump",
|
|
10128
|
+
type: "u8"
|
|
10129
|
+
}
|
|
10130
|
+
]
|
|
10131
|
+
}
|
|
10132
|
+
},
|
|
10133
|
+
{
|
|
10134
|
+
name: "Sources",
|
|
10135
|
+
type: {
|
|
10136
|
+
kind: "struct",
|
|
10137
|
+
fields: [
|
|
10138
|
+
{
|
|
10139
|
+
name: "source",
|
|
10140
|
+
type: "pubkey"
|
|
10141
|
+
},
|
|
10142
|
+
{
|
|
10143
|
+
name: "invert",
|
|
10144
|
+
type: "bool"
|
|
10145
|
+
},
|
|
10146
|
+
{
|
|
10147
|
+
name: "multiplier",
|
|
10148
|
+
type: "u128"
|
|
10149
|
+
},
|
|
10150
|
+
{
|
|
10151
|
+
name: "divisor",
|
|
10152
|
+
type: "u128"
|
|
10153
|
+
},
|
|
10154
|
+
{
|
|
10155
|
+
name: "source_type",
|
|
10156
|
+
type: {
|
|
10157
|
+
defined: {
|
|
10158
|
+
name: "SourceType"
|
|
10159
|
+
}
|
|
10160
|
+
}
|
|
10161
|
+
}
|
|
10162
|
+
]
|
|
10163
|
+
}
|
|
10164
|
+
},
|
|
10165
|
+
{
|
|
10166
|
+
name: "SourceType",
|
|
10167
|
+
type: {
|
|
10168
|
+
kind: "enum",
|
|
10169
|
+
variants: [
|
|
10170
|
+
{
|
|
10171
|
+
name: "Pyth"
|
|
10172
|
+
},
|
|
10173
|
+
{
|
|
10174
|
+
name: "StakePool"
|
|
10175
|
+
},
|
|
10176
|
+
{
|
|
10177
|
+
name: "MsolPool"
|
|
10178
|
+
},
|
|
10179
|
+
{
|
|
10180
|
+
name: "Redstone"
|
|
10181
|
+
},
|
|
10182
|
+
{
|
|
10183
|
+
name: "Chainlink"
|
|
10184
|
+
},
|
|
10185
|
+
{
|
|
10186
|
+
name: "SinglePool"
|
|
10187
|
+
},
|
|
10188
|
+
{
|
|
10189
|
+
name: "JupLend"
|
|
10190
|
+
},
|
|
10191
|
+
{
|
|
10192
|
+
name: "ChainlinkDataStreams"
|
|
10193
|
+
},
|
|
10194
|
+
{
|
|
10195
|
+
name: "PstPool"
|
|
10196
|
+
},
|
|
10197
|
+
{
|
|
10198
|
+
name: "DexSmartColPegOracle"
|
|
10199
|
+
},
|
|
10200
|
+
{
|
|
10201
|
+
name: "DexSmartDebtPegOracle"
|
|
10202
|
+
}
|
|
10203
|
+
]
|
|
10204
|
+
}
|
|
10205
|
+
}
|
|
10206
|
+
]
|
|
10207
|
+
};
|
|
10208
|
+
|
|
10209
|
+
// src/lending/public-data/jupiter-lend/flashloan.ts
|
|
10210
|
+
var import_svm_kit3 = require("@1delta/svm-kit");
|
|
10211
|
+
|
|
10212
|
+
// src/lending/public-data/jupiter-lend/idl/flashloan.json
|
|
10213
|
+
var flashloan_default = {
|
|
10214
|
+
address: "jupgfSgfuAXv4B6R2Uxu85Z1qdzgju79s6MfZekN6XS",
|
|
10215
|
+
metadata: {
|
|
10216
|
+
name: "flashloan",
|
|
10217
|
+
version: "0.1.4",
|
|
10218
|
+
spec: "0.1.0",
|
|
10219
|
+
description: "Created with Anchor"
|
|
10220
|
+
},
|
|
10221
|
+
instructions: [
|
|
10222
|
+
{
|
|
10223
|
+
name: "activate_protocol",
|
|
10224
|
+
discriminator: [
|
|
10225
|
+
230,
|
|
10226
|
+
235,
|
|
10227
|
+
188,
|
|
10228
|
+
19,
|
|
10229
|
+
120,
|
|
10230
|
+
91,
|
|
10231
|
+
11,
|
|
10232
|
+
94
|
|
10233
|
+
],
|
|
10234
|
+
accounts: [
|
|
10235
|
+
{
|
|
10236
|
+
name: "authority",
|
|
10237
|
+
signer: true
|
|
10238
|
+
},
|
|
10239
|
+
{
|
|
10240
|
+
name: "flashloan_admin",
|
|
10241
|
+
writable: true
|
|
10242
|
+
}
|
|
10243
|
+
],
|
|
10244
|
+
args: []
|
|
10245
|
+
},
|
|
10246
|
+
{
|
|
10247
|
+
name: "flashloan_borrow",
|
|
10248
|
+
discriminator: [
|
|
10249
|
+
103,
|
|
10250
|
+
19,
|
|
10251
|
+
78,
|
|
10252
|
+
24,
|
|
10253
|
+
240,
|
|
10254
|
+
9,
|
|
10255
|
+
135,
|
|
10256
|
+
63
|
|
10257
|
+
],
|
|
10258
|
+
accounts: [
|
|
10259
|
+
{
|
|
10260
|
+
name: "signer",
|
|
10261
|
+
writable: true,
|
|
10262
|
+
signer: true
|
|
10263
|
+
},
|
|
10264
|
+
{
|
|
10265
|
+
name: "flashloan_admin",
|
|
10266
|
+
writable: true
|
|
10267
|
+
},
|
|
10268
|
+
{
|
|
10269
|
+
name: "signer_borrow_token_account",
|
|
10270
|
+
writable: true
|
|
10271
|
+
},
|
|
10272
|
+
{
|
|
10273
|
+
name: "mint"
|
|
10274
|
+
},
|
|
10275
|
+
{
|
|
10276
|
+
name: "flashloan_token_reserves_liquidity",
|
|
10277
|
+
writable: true
|
|
10278
|
+
},
|
|
10279
|
+
{
|
|
10280
|
+
name: "flashloan_borrow_position_on_liquidity",
|
|
10281
|
+
writable: true
|
|
10282
|
+
},
|
|
10283
|
+
{
|
|
10284
|
+
name: "rate_model"
|
|
10285
|
+
},
|
|
10286
|
+
{
|
|
10287
|
+
name: "vault",
|
|
10288
|
+
writable: true
|
|
10289
|
+
},
|
|
10290
|
+
{
|
|
10291
|
+
name: "liquidity"
|
|
10292
|
+
},
|
|
10293
|
+
{
|
|
10294
|
+
name: "liquidity_program",
|
|
10295
|
+
relations: [
|
|
10296
|
+
"flashloan_admin"
|
|
10297
|
+
]
|
|
10298
|
+
},
|
|
10299
|
+
{
|
|
10300
|
+
name: "token_program"
|
|
10301
|
+
},
|
|
10302
|
+
{
|
|
10303
|
+
name: "associated_token_program",
|
|
10304
|
+
optional: true,
|
|
10305
|
+
address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
|
|
10306
|
+
},
|
|
10307
|
+
{
|
|
10308
|
+
name: "system_program",
|
|
10309
|
+
address: "11111111111111111111111111111111"
|
|
10310
|
+
},
|
|
10311
|
+
{
|
|
10312
|
+
name: "instruction_sysvar",
|
|
10313
|
+
address: "Sysvar1nstructions1111111111111111111111111"
|
|
10314
|
+
}
|
|
10315
|
+
],
|
|
10316
|
+
args: [
|
|
10317
|
+
{
|
|
10318
|
+
name: "amount",
|
|
10319
|
+
type: "u64"
|
|
10320
|
+
}
|
|
10321
|
+
]
|
|
10322
|
+
},
|
|
10323
|
+
{
|
|
10324
|
+
name: "flashloan_payback",
|
|
10325
|
+
discriminator: [
|
|
10326
|
+
213,
|
|
10327
|
+
47,
|
|
10328
|
+
153,
|
|
10329
|
+
137,
|
|
10330
|
+
84,
|
|
10331
|
+
243,
|
|
10332
|
+
94,
|
|
10333
|
+
232
|
|
10334
|
+
],
|
|
10335
|
+
accounts: [
|
|
10336
|
+
{
|
|
10337
|
+
name: "signer",
|
|
10338
|
+
writable: true,
|
|
10339
|
+
signer: true
|
|
10340
|
+
},
|
|
10341
|
+
{
|
|
10342
|
+
name: "flashloan_admin",
|
|
10343
|
+
writable: true
|
|
10344
|
+
},
|
|
10345
|
+
{
|
|
10346
|
+
name: "signer_borrow_token_account",
|
|
10347
|
+
writable: true
|
|
10348
|
+
},
|
|
10349
|
+
{
|
|
10350
|
+
name: "mint"
|
|
10351
|
+
},
|
|
10352
|
+
{
|
|
10353
|
+
name: "flashloan_token_reserves_liquidity",
|
|
10354
|
+
writable: true
|
|
10355
|
+
},
|
|
10356
|
+
{
|
|
10357
|
+
name: "flashloan_borrow_position_on_liquidity",
|
|
10358
|
+
writable: true
|
|
10359
|
+
},
|
|
10360
|
+
{
|
|
10361
|
+
name: "rate_model"
|
|
10362
|
+
},
|
|
10363
|
+
{
|
|
10364
|
+
name: "vault",
|
|
10365
|
+
writable: true
|
|
10366
|
+
},
|
|
10367
|
+
{
|
|
10368
|
+
name: "liquidity"
|
|
10369
|
+
},
|
|
10370
|
+
{
|
|
10371
|
+
name: "liquidity_program",
|
|
10372
|
+
relations: [
|
|
10373
|
+
"flashloan_admin"
|
|
10374
|
+
]
|
|
10375
|
+
},
|
|
10376
|
+
{
|
|
10377
|
+
name: "token_program"
|
|
10378
|
+
},
|
|
10379
|
+
{
|
|
10380
|
+
name: "associated_token_program",
|
|
10381
|
+
optional: true,
|
|
10382
|
+
address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"
|
|
10383
|
+
},
|
|
10384
|
+
{
|
|
10385
|
+
name: "system_program",
|
|
10386
|
+
address: "11111111111111111111111111111111"
|
|
10387
|
+
},
|
|
10388
|
+
{
|
|
10389
|
+
name: "instruction_sysvar",
|
|
10390
|
+
address: "Sysvar1nstructions1111111111111111111111111"
|
|
10391
|
+
}
|
|
10392
|
+
],
|
|
10393
|
+
args: [
|
|
10394
|
+
{
|
|
10395
|
+
name: "amount",
|
|
10396
|
+
type: "u64"
|
|
10397
|
+
}
|
|
10398
|
+
]
|
|
10399
|
+
},
|
|
10400
|
+
{
|
|
10401
|
+
name: "init_flashloan_admin",
|
|
10402
|
+
discriminator: [
|
|
10403
|
+
185,
|
|
10404
|
+
117,
|
|
10405
|
+
154,
|
|
10406
|
+
56,
|
|
10407
|
+
95,
|
|
10408
|
+
12,
|
|
10409
|
+
187,
|
|
10410
|
+
139
|
|
10411
|
+
],
|
|
10412
|
+
accounts: [
|
|
10413
|
+
{
|
|
10414
|
+
name: "signer",
|
|
10415
|
+
writable: true,
|
|
10416
|
+
signer: true
|
|
10417
|
+
},
|
|
10418
|
+
{
|
|
10419
|
+
name: "flashloan_admin",
|
|
10420
|
+
writable: true,
|
|
10421
|
+
pda: {
|
|
10422
|
+
seeds: [
|
|
10423
|
+
{
|
|
10424
|
+
kind: "const",
|
|
10425
|
+
value: [
|
|
10426
|
+
102,
|
|
10427
|
+
108,
|
|
10428
|
+
97,
|
|
10429
|
+
115,
|
|
10430
|
+
104,
|
|
10431
|
+
108,
|
|
10432
|
+
111,
|
|
10433
|
+
97,
|
|
10434
|
+
110,
|
|
10435
|
+
95,
|
|
10436
|
+
97,
|
|
10437
|
+
100,
|
|
10438
|
+
109,
|
|
10439
|
+
105,
|
|
10440
|
+
110
|
|
10441
|
+
]
|
|
10442
|
+
}
|
|
10443
|
+
]
|
|
9811
10444
|
}
|
|
9812
10445
|
},
|
|
9813
10446
|
{
|
|
@@ -10150,27 +10783,27 @@ var JUP_LIQUIDITY_PROGRAMS = {
|
|
|
10150
10783
|
};
|
|
10151
10784
|
var utf82 = (s) => new TextEncoder().encode(s);
|
|
10152
10785
|
var pk2 = (address) => {
|
|
10153
|
-
const b = (0,
|
|
10786
|
+
const b = (0, import_svm_kit3.decodeBase58)(address);
|
|
10154
10787
|
if (!b || b.length !== 32) throw new Error(`not a pubkey: ${address}`);
|
|
10155
10788
|
return b;
|
|
10156
10789
|
};
|
|
10157
|
-
var jupFlashloanAdmin = async (market = "main") => (await (0,
|
|
10790
|
+
var jupFlashloanAdmin = async (market = "main") => (await (0, import_svm_kit3.findProgramAddress)(
|
|
10158
10791
|
[utf82("flashloan_admin")],
|
|
10159
10792
|
JUP_FLASHLOAN_PROGRAMS[market]
|
|
10160
10793
|
)).address;
|
|
10161
|
-
var jupLiquidity = async (market = "main") => (await (0,
|
|
10794
|
+
var jupLiquidity = async (market = "main") => (await (0, import_svm_kit3.findProgramAddress)(
|
|
10162
10795
|
[utf82("liquidity")],
|
|
10163
10796
|
JUP_LIQUIDITY_PROGRAMS[market]
|
|
10164
10797
|
)).address;
|
|
10165
|
-
var jupLiquidityReserve = async (mint, market = "main") => (await (0,
|
|
10798
|
+
var jupLiquidityReserve = async (mint, market = "main") => (await (0, import_svm_kit3.findProgramAddress)(
|
|
10166
10799
|
[utf82("reserve"), pk2(mint)],
|
|
10167
10800
|
JUP_LIQUIDITY_PROGRAMS[market]
|
|
10168
10801
|
)).address;
|
|
10169
|
-
var jupRateModel = async (mint, market = "main") => (await (0,
|
|
10802
|
+
var jupRateModel = async (mint, market = "main") => (await (0, import_svm_kit3.findProgramAddress)(
|
|
10170
10803
|
[utf82("rate_model"), pk2(mint)],
|
|
10171
10804
|
JUP_LIQUIDITY_PROGRAMS[market]
|
|
10172
10805
|
)).address;
|
|
10173
|
-
var jupFlashBorrowPosition = async (mint, market = "main") => (await (0,
|
|
10806
|
+
var jupFlashBorrowPosition = async (mint, market = "main") => (await (0, import_svm_kit3.findProgramAddress)(
|
|
10174
10807
|
[
|
|
10175
10808
|
utf82("user_borrow_position"),
|
|
10176
10809
|
pk2(mint),
|
|
@@ -10178,9 +10811,9 @@ var jupFlashBorrowPosition = async (mint, market = "main") => (await (0, import_
|
|
|
10178
10811
|
],
|
|
10179
10812
|
JUP_LIQUIDITY_PROGRAMS[market]
|
|
10180
10813
|
)).address;
|
|
10181
|
-
var jupLiquidityVault = async (mint, tokenProgram, market = "main") => (0,
|
|
10814
|
+
var jupLiquidityVault = async (mint, tokenProgram, market = "main") => (0, import_svm_kit3.getAssociatedTokenAddress)(await jupLiquidity(market), mint, tokenProgram);
|
|
10182
10815
|
function decodeJupFlashloanAdmin(data) {
|
|
10183
|
-
const a = (0,
|
|
10816
|
+
const a = (0, import_svm_kit3.decodeIdlAccount)(JUP_FLASHLOAN_IDL, "FlashloanAdmin", data);
|
|
10184
10817
|
return {
|
|
10185
10818
|
authority: a.authority,
|
|
10186
10819
|
liquidityProgram: a.liquidity_program,
|
|
@@ -10191,38 +10824,947 @@ function decodeJupFlashloanAdmin(data) {
|
|
|
10191
10824
|
activeAmount: BigInt(a.active_flashloan_amount)
|
|
10192
10825
|
};
|
|
10193
10826
|
}
|
|
10194
|
-
async function readJupFlashloanAdmin(rpc, market = "main") {
|
|
10195
|
-
const address = await jupFlashloanAdmin(market);
|
|
10196
|
-
const { accounts } = await rpc.readAccounts([address], { encoding: "base64" });
|
|
10197
|
-
const a = accounts[0];
|
|
10198
|
-
if (!a || a.owner !== JUP_FLASHLOAN_PROGRAMS[market]) return null;
|
|
10199
|
-
return decodeJupFlashloanAdmin((0,
|
|
10827
|
+
async function readJupFlashloanAdmin(rpc, market = "main") {
|
|
10828
|
+
const address = await jupFlashloanAdmin(market);
|
|
10829
|
+
const { accounts } = await rpc.readAccounts([address], { encoding: "base64" });
|
|
10830
|
+
const a = accounts[0];
|
|
10831
|
+
if (!a || a.owner !== JUP_FLASHLOAN_PROGRAMS[market]) return null;
|
|
10832
|
+
return decodeJupFlashloanAdmin((0, import_svm_kit3.fromBase64)(a.data[0]));
|
|
10833
|
+
}
|
|
10834
|
+
async function readJupFlashAssets(rpc, market = "main") {
|
|
10835
|
+
const admin = await jupFlashloanAdmin(market);
|
|
10836
|
+
const rows = await rpc.call(
|
|
10837
|
+
"getProgramAccounts",
|
|
10838
|
+
[
|
|
10839
|
+
JUP_LIQUIDITY_PROGRAMS[market],
|
|
10840
|
+
{
|
|
10841
|
+
encoding: "base64",
|
|
10842
|
+
dataSlice: { offset: 40, length: 32 },
|
|
10843
|
+
filters: [{ memcmp: { offset: 8, bytes: admin } }]
|
|
10844
|
+
}
|
|
10845
|
+
],
|
|
10846
|
+
{ accounts: 1 }
|
|
10847
|
+
);
|
|
10848
|
+
const mints = /* @__PURE__ */ new Set();
|
|
10849
|
+
for (const r of rows) mints.add((0, import_svm_kit3.encodeBase58)((0, import_svm_kit3.fromBase64)(r.account.data[0])));
|
|
10850
|
+
return [...mints];
|
|
10851
|
+
}
|
|
10852
|
+
async function readJupFlashAvailable(rpc, mint, tokenProgram, market = "main") {
|
|
10853
|
+
const vault = await jupLiquidityVault(mint, tokenProgram, market);
|
|
10854
|
+
const r = await rpc.call(
|
|
10855
|
+
"getTokenAccountBalance",
|
|
10856
|
+
[vault]
|
|
10857
|
+
);
|
|
10858
|
+
return BigInt(r.value.amount);
|
|
10859
|
+
}
|
|
10860
|
+
|
|
10861
|
+
// src/lending/public-data/jupiter-lend/onchain.ts
|
|
10862
|
+
var JL_VAULTS_ACCOUNTS_IDL = vaults_accounts_default;
|
|
10863
|
+
var JUP_VAULTS_PROGRAMS = {
|
|
10864
|
+
main: "jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi",
|
|
10865
|
+
ethena: "jupo974WCqAUMD3RtpayTap1me7StQCWtEkBbDb6Ba3"
|
|
10866
|
+
};
|
|
10867
|
+
var JUP_DEX_PROGRAM = "jupZ4m2GqUCJ5iueMfzQf8khFfH31d4XAQt3RzCT9Vd";
|
|
10868
|
+
var JL_EXCHANGE_PRICES_PRECISION = 10n ** 12n;
|
|
10869
|
+
var RATE_OUTPUT = 10n ** 18n;
|
|
10870
|
+
var SCALE_FACTOR = 10n ** 18n;
|
|
10871
|
+
var FOUR_DECIMALS = 10000n;
|
|
10872
|
+
var SECONDS_PER_YEAR = 31536000n;
|
|
10873
|
+
var DEFAULT_MAX_UTILIZATION = 9500n;
|
|
10874
|
+
var JL_VAULT_AMOUNT_DECIMALS = 9;
|
|
10875
|
+
var isJlSmartCol = (t) => t === 2 || t === 4;
|
|
10876
|
+
var isJlSmartDebt = (t) => t === 3 || t === 4;
|
|
10877
|
+
var utf83 = (s) => new TextEncoder().encode(s);
|
|
10878
|
+
var u16le = (n) => new Uint8Array([n & 255, n >> 8 & 255]);
|
|
10879
|
+
var big = (v) => BigInt(v ?? 0);
|
|
10880
|
+
var maxB = (a, b) => a > b ? a : b;
|
|
10881
|
+
var minB = (a, b) => a < b ? a : b;
|
|
10882
|
+
var jlVaultConfigPda = async (vaultId, market = "main") => (await (0, import_svm_kit4.findProgramAddress)(
|
|
10883
|
+
[utf83("vault_config"), u16le(vaultId)],
|
|
10884
|
+
JUP_VAULTS_PROGRAMS[market]
|
|
10885
|
+
)).address;
|
|
10886
|
+
var jlVaultStatePda = async (vaultId, market = "main") => (await (0, import_svm_kit4.findProgramAddress)(
|
|
10887
|
+
[utf83("vault_state"), u16le(vaultId)],
|
|
10888
|
+
JUP_VAULTS_PROGRAMS[market]
|
|
10889
|
+
)).address;
|
|
10890
|
+
var jlVaultAdminPda = async (market = "main") => (await (0, import_svm_kit4.findProgramAddress)([utf83("vault_admin")], JUP_VAULTS_PROGRAMS[market])).address;
|
|
10891
|
+
var liq = async (seeds, market) => (await (0, import_svm_kit4.findProgramAddress)(seeds, JUP_LIQUIDITY_PROGRAMS[market])).address;
|
|
10892
|
+
var pk3 = async (a) => {
|
|
10893
|
+
const b = (0, import_svm_kit4.decodeBase58)(a);
|
|
10894
|
+
if (!b || b.length !== 32) throw new Error(`not a pubkey: ${a}`);
|
|
10895
|
+
return b;
|
|
10896
|
+
};
|
|
10897
|
+
var dec = (name, data) => (0, import_svm_kit4.decodeIdlAccount)(JL_VAULTS_ACCOUNTS_IDL, name, (0, import_svm_kit4.fromBase64)(data));
|
|
10898
|
+
var ratio = (withInterest, free) => {
|
|
10899
|
+
if (withInterest > free) return [free * FOUR_DECIMALS / withInterest, false];
|
|
10900
|
+
if (withInterest < free) return [withInterest * FOUR_DECIMALS / free, true];
|
|
10901
|
+
return [withInterest > 0n ? FOUR_DECIMALS : 0n, false];
|
|
10902
|
+
};
|
|
10903
|
+
function jlLiquidityExchangePrices(r, now) {
|
|
10904
|
+
let supplyEx = big(r.supply_exchange_price);
|
|
10905
|
+
let borrowEx = big(r.borrow_exchange_price);
|
|
10906
|
+
const borrowRate = BigInt(r.borrow_rate);
|
|
10907
|
+
const dt = now - big(r.last_update_timestamp);
|
|
10908
|
+
if (supplyEx === 0n || borrowEx === 0n || dt <= 0n || borrowRate === 0n)
|
|
10909
|
+
return { supplyEx, borrowEx };
|
|
10910
|
+
borrowEx += borrowEx * borrowRate * dt / (SECONDS_PER_YEAR * FOUR_DECIMALS);
|
|
10911
|
+
const [supplyRatio, supplyInverse] = ratio(
|
|
10912
|
+
big(r.total_supply_with_interest),
|
|
10913
|
+
big(r.total_supply_interest_free)
|
|
10914
|
+
);
|
|
10915
|
+
const [borrowRatio, borrowInverse] = ratio(
|
|
10916
|
+
big(r.total_borrow_with_interest),
|
|
10917
|
+
big(r.total_borrow_interest_free)
|
|
10918
|
+
);
|
|
10919
|
+
if (borrowRatio === 1n) return { supplyEx, borrowEx };
|
|
10920
|
+
if (supplyInverse && supplyRatio === 0n) return { supplyEx, borrowEx };
|
|
10921
|
+
const util = BigInt(r.last_utilization);
|
|
10922
|
+
let ratioSupplyYield = supplyInverse ? util * (RATE_OUTPUT + RATE_OUTPUT * FOUR_DECIMALS / supplyRatio) / FOUR_DECIMALS : util * RATE_OUTPUT * (FOUR_DECIMALS + supplyRatio) / (FOUR_DECIMALS * FOUR_DECIMALS);
|
|
10923
|
+
const adjBorrowRatio = borrowInverse ? borrowRatio * RATE_OUTPUT / (FOUR_DECIMALS + borrowRatio) : RATE_OUTPUT - borrowRatio * RATE_OUTPUT / (FOUR_DECIMALS + borrowRatio);
|
|
10924
|
+
ratioSupplyYield = ratioSupplyYield * adjBorrowRatio * FOUR_DECIMALS / RATE_OUTPUT / RATE_OUTPUT;
|
|
10925
|
+
const supplyRate = borrowRate * ratioSupplyYield * (FOUR_DECIMALS - BigInt(r.fee_on_interest));
|
|
10926
|
+
supplyEx += supplyEx * supplyRate * dt / (SECONDS_PER_YEAR * FOUR_DECIMALS) / (FOUR_DECIMALS * FOUR_DECIMALS);
|
|
10927
|
+
return { supplyEx, borrowEx };
|
|
10928
|
+
}
|
|
10929
|
+
function jlOverallTokenData(r, now) {
|
|
10930
|
+
const { supplyEx, borrowEx } = jlLiquidityExchangePrices(r, now);
|
|
10931
|
+
const supplyRaw = big(r.total_supply_with_interest);
|
|
10932
|
+
const borrowRaw = big(r.total_borrow_with_interest);
|
|
10933
|
+
const totalSupply = supplyRaw * supplyEx / JL_EXCHANGE_PRICES_PRECISION + big(r.total_supply_interest_free);
|
|
10934
|
+
const totalBorrow = borrowRaw * borrowEx / JL_EXCHANGE_PRICES_PRECISION + big(r.total_borrow_interest_free);
|
|
10935
|
+
let supplyRate = 0n;
|
|
10936
|
+
if (supplyRaw > 0n) {
|
|
10937
|
+
const b = borrowRaw * big(r.borrow_exchange_price) / JL_EXCHANGE_PRICES_PRECISION;
|
|
10938
|
+
const s = supplyRaw * big(r.supply_exchange_price) / JL_EXCHANGE_PRICES_PRECISION;
|
|
10939
|
+
if (s > 0n)
|
|
10940
|
+
supplyRate = BigInt(r.borrow_rate) * (FOUR_DECIMALS - BigInt(r.fee_on_interest)) * b / (s * FOUR_DECIMALS);
|
|
10941
|
+
}
|
|
10942
|
+
const maxUtil = BigInt(r.max_utilization) || DEFAULT_MAX_UTILIZATION;
|
|
10943
|
+
return {
|
|
10944
|
+
supplyEx,
|
|
10945
|
+
borrowEx,
|
|
10946
|
+
totalSupply,
|
|
10947
|
+
totalBorrow,
|
|
10948
|
+
supplyRate,
|
|
10949
|
+
borrowRate: BigInt(r.borrow_rate),
|
|
10950
|
+
maxUtilization: maxUtil
|
|
10951
|
+
};
|
|
10952
|
+
}
|
|
10953
|
+
function jlUserSupplyData(u, o, balance, now) {
|
|
10954
|
+
const z = {
|
|
10955
|
+
modeWithInterest: false,
|
|
10956
|
+
supply: 0n,
|
|
10957
|
+
withdrawalLimit: 0n,
|
|
10958
|
+
lastUpdateTimestamp: 0n,
|
|
10959
|
+
expandPercent: 0n,
|
|
10960
|
+
expandDuration: 0n,
|
|
10961
|
+
baseWithdrawalLimit: 0n,
|
|
10962
|
+
withdrawableUntilLimit: 0n,
|
|
10963
|
+
withdrawable: 0n,
|
|
10964
|
+
decayAmount: 0n,
|
|
10965
|
+
decayEndTimestamp: 0n
|
|
10966
|
+
};
|
|
10967
|
+
if (!u) return z;
|
|
10968
|
+
const amount = big(u.amount);
|
|
10969
|
+
const expandPct = BigInt(u.expand_pct);
|
|
10970
|
+
const expandDuration = BigInt(u.expand_duration);
|
|
10971
|
+
const last = big(u.last_update);
|
|
10972
|
+
let limit = 0n;
|
|
10973
|
+
const lastLimit = big(u.withdrawal_limit);
|
|
10974
|
+
if (lastLimit > 0n) {
|
|
10975
|
+
const maxWithdrawable = amount * expandPct / FOUR_DECIMALS;
|
|
10976
|
+
const expanded = expandDuration > 0n ? maxWithdrawable * (now - last) / expandDuration : maxWithdrawable;
|
|
10977
|
+
limit = lastLimit > expanded ? lastLimit - expanded : 0n;
|
|
10978
|
+
const floor = amount - maxWithdrawable;
|
|
10979
|
+
if (floor > limit) limit = floor;
|
|
10980
|
+
}
|
|
10981
|
+
let decay = big(u.decay_amount);
|
|
10982
|
+
let decayEnd = now;
|
|
10983
|
+
const decayDuration = BigInt(u.decay_duration);
|
|
10984
|
+
if (decay > 0n && decayDuration > 0n) {
|
|
10985
|
+
const elapsed = now - last;
|
|
10986
|
+
if (elapsed < decayDuration) {
|
|
10987
|
+
decay -= decay * elapsed / decayDuration;
|
|
10988
|
+
decayEnd = last + decayDuration;
|
|
10989
|
+
} else decay = 0n;
|
|
10990
|
+
}
|
|
10991
|
+
const withInterest = !!u.with_interest;
|
|
10992
|
+
const ex = (v) => withInterest ? v * o.supplyEx / JL_EXCHANGE_PRICES_PRECISION : v;
|
|
10993
|
+
const supply = ex(amount);
|
|
10994
|
+
let withdrawalLimit = ex(limit);
|
|
10995
|
+
const untilLimit = supply > withdrawalLimit ? supply - withdrawalLimit : 0n;
|
|
10996
|
+
if (withdrawalLimit === 0n) withdrawalLimit = supply;
|
|
10997
|
+
return {
|
|
10998
|
+
modeWithInterest: withInterest,
|
|
10999
|
+
supply,
|
|
11000
|
+
withdrawalLimit,
|
|
11001
|
+
lastUpdateTimestamp: last,
|
|
11002
|
+
expandPercent: expandPct,
|
|
11003
|
+
expandDuration,
|
|
11004
|
+
baseWithdrawalLimit: ex(big(u.base_withdrawal_limit)),
|
|
11005
|
+
withdrawableUntilLimit: untilLimit,
|
|
11006
|
+
withdrawable: minB(balance, untilLimit),
|
|
11007
|
+
decayAmount: ex(decay),
|
|
11008
|
+
decayEndTimestamp: decayEnd
|
|
11009
|
+
};
|
|
11010
|
+
}
|
|
11011
|
+
function jlUserBorrowData(u, o, balance, now) {
|
|
11012
|
+
const z = {
|
|
11013
|
+
modeWithInterest: false,
|
|
11014
|
+
borrow: 0n,
|
|
11015
|
+
borrowLimit: 0n,
|
|
11016
|
+
lastUpdateTimestamp: 0n,
|
|
11017
|
+
expandPercent: 0n,
|
|
11018
|
+
expandDuration: 0n,
|
|
11019
|
+
baseBorrowLimit: 0n,
|
|
11020
|
+
maxBorrowLimit: 0n,
|
|
11021
|
+
borrowLimitUtilization: 0n,
|
|
11022
|
+
borrowableUntilLimit: 0n,
|
|
11023
|
+
borrowable: 0n
|
|
11024
|
+
};
|
|
11025
|
+
if (!u) return z;
|
|
11026
|
+
const amount = big(u.amount);
|
|
11027
|
+
const expandPct = BigInt(u.expand_pct);
|
|
11028
|
+
const expandDuration = BigInt(u.expand_duration);
|
|
11029
|
+
const last = big(u.last_update);
|
|
11030
|
+
const base = big(u.base_debt_ceiling);
|
|
11031
|
+
const maxCeil = big(u.max_debt_ceiling);
|
|
11032
|
+
let limit;
|
|
11033
|
+
if (now < last || expandDuration === 0n) limit = base;
|
|
11034
|
+
else {
|
|
11035
|
+
const maxExpansion = amount * expandPct / FOUR_DECIMALS;
|
|
11036
|
+
limit = maxExpansion * (now - last) / expandDuration + big(u.debt_ceiling);
|
|
11037
|
+
limit = minB(limit, amount + maxExpansion);
|
|
11038
|
+
limit = maxB(limit, base);
|
|
11039
|
+
limit = minB(limit, maxCeil);
|
|
11040
|
+
}
|
|
11041
|
+
const withInterest = !!u.with_interest;
|
|
11042
|
+
const ex = (v) => withInterest ? v * o.borrowEx / JL_EXCHANGE_PRICES_PRECISION : v;
|
|
11043
|
+
const borrow = ex(amount);
|
|
11044
|
+
const borrowLimit = ex(limit);
|
|
11045
|
+
const borrowLimitUtilization = o.maxUtilization * o.totalSupply / FOUR_DECIMALS;
|
|
11046
|
+
const untilUtil = borrowLimitUtilization > o.totalBorrow ? borrowLimitUtilization - o.totalBorrow : 0n;
|
|
11047
|
+
const untilLimit = borrowLimit > borrow ? borrowLimit - borrow : 0n;
|
|
11048
|
+
const borrowableUntilLimit = minB(untilLimit, untilUtil);
|
|
11049
|
+
return {
|
|
11050
|
+
modeWithInterest: withInterest,
|
|
11051
|
+
borrow,
|
|
11052
|
+
borrowLimit,
|
|
11053
|
+
lastUpdateTimestamp: last,
|
|
11054
|
+
expandPercent: expandPct,
|
|
11055
|
+
expandDuration,
|
|
11056
|
+
baseBorrowLimit: ex(base),
|
|
11057
|
+
maxBorrowLimit: ex(maxCeil),
|
|
11058
|
+
borrowLimitUtilization,
|
|
11059
|
+
borrowableUntilLimit,
|
|
11060
|
+
borrowable: minB(balance, borrowableUntilLimit)
|
|
11061
|
+
};
|
|
11062
|
+
}
|
|
11063
|
+
function jlVaultExchangePrices(s, c, liqSupplyEx, liqBorrowEx, now) {
|
|
11064
|
+
const oldLs = big(s.liquidity_supply_exchange_price);
|
|
11065
|
+
const oldLb = big(s.liquidity_borrow_exchange_price);
|
|
11066
|
+
const vs = big(s.vault_supply_exchange_price);
|
|
11067
|
+
const vb = big(s.vault_borrow_exchange_price);
|
|
11068
|
+
if (liqSupplyEx < oldLs || liqBorrowEx < oldLb || oldLs === 0n || oldLb === 0n)
|
|
11069
|
+
return { supplyEx: vs, borrowEx: vb };
|
|
11070
|
+
const dt = maxB(0n, now - big(s.last_update_timestamp));
|
|
11071
|
+
let supplyEx = vs * (liqSupplyEx * SCALE_FACTOR / oldLs) / SCALE_FACTOR;
|
|
11072
|
+
const sm = BigInt(c.supply_rate_magnifier);
|
|
11073
|
+
if (sm !== 0n) {
|
|
11074
|
+
const ch = vs * dt * (sm < 0n ? -sm : sm) / FOUR_DECIMALS / SECONDS_PER_YEAR;
|
|
11075
|
+
supplyEx = sm > 0n ? supplyEx + ch : supplyEx - ch;
|
|
11076
|
+
}
|
|
11077
|
+
const prod = vb * (liqBorrowEx * SCALE_FACTOR / oldLb);
|
|
11078
|
+
let borrowEx = (prod + SCALE_FACTOR - 1n) / SCALE_FACTOR;
|
|
11079
|
+
const bm = BigInt(c.borrow_rate_magnifier);
|
|
11080
|
+
if (bm !== 0n) {
|
|
11081
|
+
const ch = vb * dt * (bm < 0n ? -bm : bm) / FOUR_DECIMALS / SECONDS_PER_YEAR;
|
|
11082
|
+
borrowEx = bm > 0n ? borrowEx + ch : borrowEx - ch;
|
|
11083
|
+
}
|
|
11084
|
+
return { supplyEx, borrowEx };
|
|
11085
|
+
}
|
|
11086
|
+
var jlVaultToRaw = (v, decimals) => decimals >= JL_VAULT_AMOUNT_DECIMALS ? v * 10n ** BigInt(decimals - JL_VAULT_AMOUNT_DECIMALS) : v / 10n ** BigInt(JL_VAULT_AMOUNT_DECIMALS - decimals);
|
|
11087
|
+
async function read(rpc, keys) {
|
|
11088
|
+
const uniq = [...new Set(keys)];
|
|
11089
|
+
const { accounts, slot } = await rpc.readAccounts(uniq, {
|
|
11090
|
+
encoding: "base64"
|
|
11091
|
+
});
|
|
11092
|
+
const m = /* @__PURE__ */ new Map();
|
|
11093
|
+
uniq.forEach((k, i) => m.set(k, accounts[i] ?? null));
|
|
11094
|
+
return { m, slot };
|
|
11095
|
+
}
|
|
11096
|
+
async function readJlNextVaultId(rpc, market = "main") {
|
|
11097
|
+
const admin = await jlVaultAdminPda(market);
|
|
11098
|
+
const { m } = await read(rpc, [admin]);
|
|
11099
|
+
const a = m.get(admin);
|
|
11100
|
+
if (!a || a.owner !== JUP_VAULTS_PROGRAMS[market]) return void 0;
|
|
11101
|
+
return Number(
|
|
11102
|
+
dec("VaultAdmin", a.data[0]).next_vault_id
|
|
11103
|
+
);
|
|
11104
|
+
}
|
|
11105
|
+
var sourceTypeName = (t) => {
|
|
11106
|
+
if (typeof t === "string") return t;
|
|
11107
|
+
if (t && typeof t === "object") return Object.keys(t)[0] ?? "unknown";
|
|
11108
|
+
return String(t);
|
|
11109
|
+
};
|
|
11110
|
+
var lowerFirst = (s) => s.charAt(0).toLowerCase() + s.slice(1);
|
|
11111
|
+
async function readJupiterLendVaultsOnchain(rpc, market, vaultIds, opts = {}) {
|
|
11112
|
+
if (!vaultIds.length) return [];
|
|
11113
|
+
const now = BigInt(opts.now ?? Math.floor(Date.now() / 1e3));
|
|
11114
|
+
const program = JUP_VAULTS_PROGRAMS[market];
|
|
11115
|
+
const cfgKeys = await Promise.all(
|
|
11116
|
+
vaultIds.map((i) => jlVaultConfigPda(i, market))
|
|
11117
|
+
);
|
|
11118
|
+
const stateKeys = await Promise.all(
|
|
11119
|
+
vaultIds.map((i) => jlVaultStatePda(i, market))
|
|
11120
|
+
);
|
|
11121
|
+
const r1 = await read(rpc, [...cfgKeys, ...stateKeys]);
|
|
11122
|
+
const items = [];
|
|
11123
|
+
vaultIds.forEach((id, k) => {
|
|
11124
|
+
const ca = r1.m.get(cfgKeys[k]);
|
|
11125
|
+
const sa = r1.m.get(stateKeys[k]);
|
|
11126
|
+
if (!ca || !sa || ca.owner !== program || sa.owner !== program) return;
|
|
11127
|
+
try {
|
|
11128
|
+
const c = dec("VaultConfig", ca.data[0]);
|
|
11129
|
+
const s = dec("VaultState", sa.data[0]);
|
|
11130
|
+
const t = Number(c.vault_type);
|
|
11131
|
+
items.push({
|
|
11132
|
+
id,
|
|
11133
|
+
configKey: cfgKeys[k],
|
|
11134
|
+
c,
|
|
11135
|
+
s,
|
|
11136
|
+
smartCol: isJlSmartCol(t),
|
|
11137
|
+
smartDebt: isJlSmartDebt(t)
|
|
11138
|
+
});
|
|
11139
|
+
} catch (e) {
|
|
11140
|
+
console.warn(
|
|
11141
|
+
`[jupiter-lend] vault ${market}_${id}: ${e.message}`
|
|
11142
|
+
);
|
|
11143
|
+
}
|
|
11144
|
+
});
|
|
11145
|
+
if (!items.length) return [];
|
|
11146
|
+
const mints = /* @__PURE__ */ new Set();
|
|
11147
|
+
const dexes = /* @__PURE__ */ new Set();
|
|
11148
|
+
const r2Keys = [];
|
|
11149
|
+
const reserveOf = /* @__PURE__ */ new Map();
|
|
11150
|
+
const supplyPosOf = /* @__PURE__ */ new Map();
|
|
11151
|
+
const borrowPosOf = /* @__PURE__ */ new Map();
|
|
11152
|
+
for (const it of items) {
|
|
11153
|
+
r2Keys.push(it.c.oracle);
|
|
11154
|
+
const sides = [
|
|
11155
|
+
[it.c.supply_token, it.smartCol, "supply"],
|
|
11156
|
+
[it.c.borrow_token, it.smartDebt, "borrow"]
|
|
11157
|
+
];
|
|
11158
|
+
for (const [token, smart, side] of sides) {
|
|
11159
|
+
if (smart) {
|
|
11160
|
+
dexes.add(token);
|
|
11161
|
+
continue;
|
|
11162
|
+
}
|
|
11163
|
+
mints.add(token);
|
|
11164
|
+
if (!reserveOf.has(token))
|
|
11165
|
+
reserveOf.set(
|
|
11166
|
+
token,
|
|
11167
|
+
await liq([utf83("reserve"), await pk3(token)], market)
|
|
11168
|
+
);
|
|
11169
|
+
const pos = await liq(
|
|
11170
|
+
[
|
|
11171
|
+
utf83(
|
|
11172
|
+
side === "supply" ? "user_supply_position" : "user_borrow_position"
|
|
11173
|
+
),
|
|
11174
|
+
await pk3(token),
|
|
11175
|
+
await pk3(it.configKey)
|
|
11176
|
+
],
|
|
11177
|
+
market
|
|
11178
|
+
);
|
|
11179
|
+
(side === "supply" ? supplyPosOf : borrowPosOf).set(
|
|
11180
|
+
`${it.id}:${token}`,
|
|
11181
|
+
pos
|
|
11182
|
+
);
|
|
11183
|
+
}
|
|
11184
|
+
}
|
|
11185
|
+
r2Keys.push(
|
|
11186
|
+
...mints,
|
|
11187
|
+
...dexes,
|
|
11188
|
+
...reserveOf.values(),
|
|
11189
|
+
...supplyPosOf.values(),
|
|
11190
|
+
...borrowPosOf.values()
|
|
11191
|
+
);
|
|
11192
|
+
const r2 = await read(rpc, r2Keys);
|
|
11193
|
+
const decimalsOf = /* @__PURE__ */ new Map();
|
|
11194
|
+
for (const mint of mints) {
|
|
11195
|
+
const a = r2.m.get(mint);
|
|
11196
|
+
if (!a) continue;
|
|
11197
|
+
const b = (0, import_svm_kit4.fromBase64)(a.data[0]);
|
|
11198
|
+
if (b.length >= 45) decimalsOf.set(mint, b[44]);
|
|
11199
|
+
}
|
|
11200
|
+
const reserves = /* @__PURE__ */ new Map();
|
|
11201
|
+
for (const [mint, key2] of reserveOf) {
|
|
11202
|
+
const a = r2.m.get(key2);
|
|
11203
|
+
if (!a) continue;
|
|
11204
|
+
try {
|
|
11205
|
+
reserves.set(mint, dec("TokenReserve", a.data[0]));
|
|
11206
|
+
} catch (e) {
|
|
11207
|
+
console.warn(`[jupiter-lend] reserve ${mint}: ${e.message}`);
|
|
11208
|
+
}
|
|
11209
|
+
}
|
|
11210
|
+
const vaultOf = /* @__PURE__ */ new Map();
|
|
11211
|
+
for (const [mint, r] of reserves) vaultOf.set(mint, r.vault);
|
|
11212
|
+
const r3 = vaultOf.size ? await read(rpc, [...vaultOf.values()]) : { m: /* @__PURE__ */ new Map(), slot: r2.slot };
|
|
11213
|
+
const balanceOf = (mint) => {
|
|
11214
|
+
const a = r3.m.get(vaultOf.get(mint) ?? "");
|
|
11215
|
+
if (!a) return 0n;
|
|
11216
|
+
const b = (0, import_svm_kit4.fromBase64)(a.data[0]);
|
|
11217
|
+
return b.length >= 72 ? new DataView(b.buffer, b.byteOffset, b.byteLength).getBigUint64(
|
|
11218
|
+
64,
|
|
11219
|
+
true
|
|
11220
|
+
) : 0n;
|
|
11221
|
+
};
|
|
11222
|
+
const overall = /* @__PURE__ */ new Map();
|
|
11223
|
+
for (const [mint, r] of reserves)
|
|
11224
|
+
overall.set(mint, jlOverallTokenData(r, now));
|
|
11225
|
+
const dexOf = (address) => {
|
|
11226
|
+
const a = r2.m.get(address);
|
|
11227
|
+
if (!a) return void 0;
|
|
11228
|
+
try {
|
|
11229
|
+
const d2 = dec("Dex", a.data[0]);
|
|
11230
|
+
return { address, token0: d2.token_0, token1: d2.token_1 };
|
|
11231
|
+
} catch {
|
|
11232
|
+
return void 0;
|
|
11233
|
+
}
|
|
11234
|
+
};
|
|
11235
|
+
const tokenFact = (mint, decimals) => {
|
|
11236
|
+
const known = opts.tokens?.[mint];
|
|
11237
|
+
if (known) return known;
|
|
11238
|
+
const l = opts.tokenList?.[mint];
|
|
11239
|
+
const sym = l?.symbol ?? mint.slice(0, 4);
|
|
11240
|
+
return {
|
|
11241
|
+
address: mint,
|
|
11242
|
+
chainId: "solana",
|
|
11243
|
+
name: l?.name ?? sym,
|
|
11244
|
+
symbol: sym,
|
|
11245
|
+
uiSymbol: sym,
|
|
11246
|
+
decimals: l?.decimals ?? decimals,
|
|
11247
|
+
...typeof l?.logoURI === "string" ? { logoUrl: l.logoURI } : {},
|
|
11248
|
+
// unpriced: the converter's USD figures read 0 — say so on the bundle, never invent
|
|
11249
|
+
price: "0"
|
|
11250
|
+
};
|
|
11251
|
+
};
|
|
11252
|
+
const dexToken = (d2, address) => {
|
|
11253
|
+
const s = (m) => opts.tokens?.[m]?.uiSymbol ?? opts.tokenList?.[m]?.symbol ?? m.slice(0, 4);
|
|
11254
|
+
const sym = d2 ? `${s(d2.token0)}-${s(d2.token1)} DEX` : `DEX ${address.slice(0, 4)}`;
|
|
11255
|
+
return {
|
|
11256
|
+
address,
|
|
11257
|
+
chainId: "solana",
|
|
11258
|
+
name: `Jupiter Lend ${sym} shares`,
|
|
11259
|
+
symbol: sym,
|
|
11260
|
+
uiSymbol: sym,
|
|
11261
|
+
decimals: JL_VAULT_AMOUNT_DECIMALS,
|
|
11262
|
+
price: "0"
|
|
11263
|
+
};
|
|
11264
|
+
};
|
|
11265
|
+
const out = [];
|
|
11266
|
+
for (const it of items) {
|
|
11267
|
+
const { c, s } = it;
|
|
11268
|
+
const supTok = c.supply_token;
|
|
11269
|
+
const borTok = c.borrow_token;
|
|
11270
|
+
const supO = it.smartCol ? void 0 : overall.get(supTok);
|
|
11271
|
+
const borO = it.smartDebt ? void 0 : overall.get(borTok);
|
|
11272
|
+
if (!it.smartCol && !supO || !it.smartDebt && !borO) {
|
|
11273
|
+
console.warn(
|
|
11274
|
+
`[jupiter-lend] vault ${market}_${it.id}: layer reserve not readable, skipped`
|
|
11275
|
+
);
|
|
11276
|
+
continue;
|
|
11277
|
+
}
|
|
11278
|
+
const supDec = it.smartCol ? JL_VAULT_AMOUNT_DECIMALS : decimalsOf.get(supTok) ?? 9;
|
|
11279
|
+
const borDec = it.smartDebt ? JL_VAULT_AMOUNT_DECIMALS : decimalsOf.get(borTok) ?? 9;
|
|
11280
|
+
const zero = {
|
|
11281
|
+
supplyEx: JL_EXCHANGE_PRICES_PRECISION,
|
|
11282
|
+
borrowEx: JL_EXCHANGE_PRICES_PRECISION,
|
|
11283
|
+
totalSupply: 0n,
|
|
11284
|
+
totalBorrow: 0n,
|
|
11285
|
+
supplyRate: 0n,
|
|
11286
|
+
borrowRate: 0n,
|
|
11287
|
+
maxUtilization: DEFAULT_MAX_UTILIZATION
|
|
11288
|
+
};
|
|
11289
|
+
const so = supO ?? zero;
|
|
11290
|
+
const bo = borO ?? zero;
|
|
11291
|
+
const supBal = it.smartCol ? 0n : balanceOf(supTok);
|
|
11292
|
+
const borBal = it.smartDebt ? 0n : balanceOf(borTok);
|
|
11293
|
+
const us = (() => {
|
|
11294
|
+
const a = r2.m.get(supplyPosOf.get(`${it.id}:${supTok}`) ?? "");
|
|
11295
|
+
return a ? dec("UserSupplyPosition", a.data[0]) : void 0;
|
|
11296
|
+
})();
|
|
11297
|
+
const ub = (() => {
|
|
11298
|
+
const a = r2.m.get(borrowPosOf.get(`${it.id}:${borTok}`) ?? "");
|
|
11299
|
+
return a ? dec("UserBorrowPosition", a.data[0]) : void 0;
|
|
11300
|
+
})();
|
|
11301
|
+
const sup = jlUserSupplyData(it.smartCol ? void 0 : us, so, supBal, now);
|
|
11302
|
+
const bor = jlUserBorrowData(it.smartDebt ? void 0 : ub, bo, borBal, now);
|
|
11303
|
+
const ex = jlVaultExchangePrices(
|
|
11304
|
+
s,
|
|
11305
|
+
c,
|
|
11306
|
+
it.smartCol ? JL_EXCHANGE_PRICES_PRECISION : so.supplyEx,
|
|
11307
|
+
it.smartDebt ? JL_EXCHANGE_PRICES_PRECISION : bo.borrowEx,
|
|
11308
|
+
now
|
|
11309
|
+
);
|
|
11310
|
+
const supplyEx = it.smartCol ? big(s.vault_supply_exchange_price) : ex.supplyEx;
|
|
11311
|
+
const borrowEx = it.smartDebt ? big(s.vault_borrow_exchange_price) : ex.borrowEx;
|
|
11312
|
+
const P = JL_EXCHANGE_PRICES_PRECISION;
|
|
11313
|
+
const totalSupply = jlVaultToRaw(
|
|
11314
|
+
big(s.total_supply) * supplyEx / P,
|
|
11315
|
+
supDec
|
|
11316
|
+
);
|
|
11317
|
+
const totalBorrow = jlVaultToRaw(
|
|
11318
|
+
big(s.total_borrow) * borrowEx / P,
|
|
11319
|
+
borDec
|
|
11320
|
+
);
|
|
11321
|
+
const absorbedSupply = jlVaultToRaw(
|
|
11322
|
+
big(s.absorbed_col_amount) * supplyEx / P,
|
|
11323
|
+
supDec
|
|
11324
|
+
);
|
|
11325
|
+
const absorbedBorrow = jlVaultToRaw(
|
|
11326
|
+
big(s.absorbed_debt_amount) * borrowEx / P,
|
|
11327
|
+
borDec
|
|
11328
|
+
);
|
|
11329
|
+
let withdrawLimit = 0n;
|
|
11330
|
+
let withdrawableUntilLimit = 0n;
|
|
11331
|
+
let withdrawable = 0n;
|
|
11332
|
+
if (sup.supply > 0n) {
|
|
11333
|
+
withdrawLimit = sup.withdrawalLimit;
|
|
11334
|
+
const gap = sup.supply * BigInt(c.withdraw_gap) / 1000n;
|
|
11335
|
+
withdrawableUntilLimit = sup.withdrawableUntilLimit > gap ? (sup.withdrawableUntilLimit - gap) * 999999n / 1000000n : 0n;
|
|
11336
|
+
withdrawable = minB(supBal, withdrawableUntilLimit);
|
|
11337
|
+
}
|
|
11338
|
+
let borrowLimit = 0n;
|
|
11339
|
+
let borrowLimitUtilization = 0n;
|
|
11340
|
+
let borrowableUntilLimit = 0n;
|
|
11341
|
+
let borrowable = 0n;
|
|
11342
|
+
if (bor.borrow > 0n) {
|
|
11343
|
+
borrowLimit = bor.borrowLimit;
|
|
11344
|
+
borrowLimitUtilization = bor.borrowLimitUtilization;
|
|
11345
|
+
borrowableUntilLimit = bor.borrowableUntilLimit * 999999n / 1000000n;
|
|
11346
|
+
borrowable = minB(borBal, borrowableUntilLimit);
|
|
11347
|
+
}
|
|
11348
|
+
const minimumBorrowing = jlVaultToRaw(10001n * borrowEx / P, borDec);
|
|
11349
|
+
const supplyRateLiq = it.smartCol ? 0n : so.supplyRate;
|
|
11350
|
+
const borrowRateLiq = it.smartDebt ? 0n : bo.borrowRate;
|
|
11351
|
+
const supplyRate = supplyRateLiq + BigInt(c.supply_rate_magnifier);
|
|
11352
|
+
const borrowRate = borrowRateLiq + BigInt(c.borrow_rate_magnifier);
|
|
11353
|
+
const supplyDex = it.smartCol ? dexOf(supTok) : void 0;
|
|
11354
|
+
const borrowDex = it.smartDebt ? dexOf(borTok) : void 0;
|
|
11355
|
+
const supplyToken = it.smartCol ? dexToken(supplyDex, supTok) : tokenFact(supTok, supDec);
|
|
11356
|
+
const borrowToken = it.smartDebt ? dexToken(borrowDex, borTok) : tokenFact(borTok, borDec);
|
|
11357
|
+
let oracleSources = [];
|
|
11358
|
+
const oa = r2.m.get(c.oracle);
|
|
11359
|
+
if (oa)
|
|
11360
|
+
try {
|
|
11361
|
+
oracleSources = dec("Oracle", oa.data[0]).sources.map(
|
|
11362
|
+
(x) => ({
|
|
11363
|
+
source: x.source,
|
|
11364
|
+
invert: x.invert,
|
|
11365
|
+
multiplier: String(x.multiplier),
|
|
11366
|
+
divisor: String(x.divisor),
|
|
11367
|
+
sourceType: { [lowerFirst(sourceTypeName(x.source_type))]: {} }
|
|
11368
|
+
})
|
|
11369
|
+
);
|
|
11370
|
+
} catch {
|
|
11371
|
+
}
|
|
11372
|
+
const vault = {
|
|
11373
|
+
id: it.id,
|
|
11374
|
+
address: it.configKey,
|
|
11375
|
+
type: Number(c.vault_type),
|
|
11376
|
+
supplyToken,
|
|
11377
|
+
borrowToken,
|
|
11378
|
+
totalSupply: totalSupply.toString(),
|
|
11379
|
+
totalSupplyLiquidity: sup.supply.toString(),
|
|
11380
|
+
totalBorrow: totalBorrow.toString(),
|
|
11381
|
+
totalBorrowLiquidity: bor.borrow.toString(),
|
|
11382
|
+
absorbedSupply: absorbedSupply.toString(),
|
|
11383
|
+
absorbedBorrow: absorbedBorrow.toString(),
|
|
11384
|
+
supplyRateMagnifier: String(c.supply_rate_magnifier),
|
|
11385
|
+
borrowRateMagnifier: String(c.borrow_rate_magnifier),
|
|
11386
|
+
borrowFee: String(c.borrow_fee),
|
|
11387
|
+
collateralFactor: String(c.collateral_factor),
|
|
11388
|
+
liquidationThreshold: String(c.liquidation_threshold),
|
|
11389
|
+
liquidationMaxLimit: String(c.liquidation_max_limit),
|
|
11390
|
+
liquidationPenalty: String(c.liquidation_penalty),
|
|
11391
|
+
withdrawalGap: String(c.withdraw_gap),
|
|
11392
|
+
supplyRate: supplyRate.toString(),
|
|
11393
|
+
supplyRateLiquidity: supplyRateLiq.toString(),
|
|
11394
|
+
borrowRate: borrowRate.toString(),
|
|
11395
|
+
borrowRateLiquidity: borrowRateLiq.toString(),
|
|
11396
|
+
withdrawLimit: withdrawLimit.toString(),
|
|
11397
|
+
withdrawableUntilLimit: withdrawableUntilLimit.toString(),
|
|
11398
|
+
withdrawable: withdrawable.toString(),
|
|
11399
|
+
borrowLimit: borrowLimit.toString(),
|
|
11400
|
+
borrowableUntilLimit: borrowableUntilLimit.toString(),
|
|
11401
|
+
borrowable: borrowable.toString(),
|
|
11402
|
+
borrowLimitUtilization: borrowLimitUtilization.toString(),
|
|
11403
|
+
minimumBorrowing: minimumBorrowing.toString(),
|
|
11404
|
+
totalPositions: Number(s.total_positions),
|
|
11405
|
+
oracle: c.oracle,
|
|
11406
|
+
oraclePrice: "",
|
|
11407
|
+
oraclePriceOperate: "",
|
|
11408
|
+
oraclePriceLiquidate: "",
|
|
11409
|
+
oracleSources,
|
|
11410
|
+
oracleTimestamp: 0,
|
|
11411
|
+
liquiditySupplyData: {
|
|
11412
|
+
modeWithInterest: sup.modeWithInterest,
|
|
11413
|
+
supply: sup.supply.toString(),
|
|
11414
|
+
withdrawalLimit: sup.withdrawalLimit.toString(),
|
|
11415
|
+
lastUpdateTimestamp: sup.lastUpdateTimestamp.toString(),
|
|
11416
|
+
expandPercent: sup.expandPercent.toString(),
|
|
11417
|
+
expandDuration: sup.expandDuration.toString(),
|
|
11418
|
+
baseWithdrawalLimit: sup.baseWithdrawalLimit.toString(),
|
|
11419
|
+
withdrawableUntilLimit: sup.withdrawableUntilLimit.toString(),
|
|
11420
|
+
withdrawable: sup.withdrawable.toString(),
|
|
11421
|
+
decayAmount: sup.decayAmount.toString(),
|
|
11422
|
+
decayEndTimestamp: sup.decayEndTimestamp.toString()
|
|
11423
|
+
},
|
|
11424
|
+
liquidityBorrowData: {
|
|
11425
|
+
modeWithInterest: bor.modeWithInterest,
|
|
11426
|
+
borrow: bor.borrow.toString(),
|
|
11427
|
+
borrowLimit: bor.borrowLimit.toString(),
|
|
11428
|
+
lastUpdateTimestamp: bor.lastUpdateTimestamp.toString(),
|
|
11429
|
+
expandPercent: bor.expandPercent.toString(),
|
|
11430
|
+
expandDuration: bor.expandDuration.toString(),
|
|
11431
|
+
baseBorrowLimit: bor.baseBorrowLimit.toString(),
|
|
11432
|
+
maxBorrowLimit: bor.maxBorrowLimit.toString(),
|
|
11433
|
+
borrowLimitUtilization: bor.borrowLimitUtilization.toString(),
|
|
11434
|
+
borrowableUntilLimit: bor.borrowableUntilLimit.toString(),
|
|
11435
|
+
borrowable: bor.borrowable.toString()
|
|
11436
|
+
},
|
|
11437
|
+
rewards: [],
|
|
11438
|
+
topTick: Number(s.topmost_tick),
|
|
11439
|
+
metadata: { maxLeverage: false, nativeStake: false, pegged: false }
|
|
11440
|
+
};
|
|
11441
|
+
out.push({
|
|
11442
|
+
vault,
|
|
11443
|
+
smartCol: it.smartCol,
|
|
11444
|
+
smartDebt: it.smartDebt,
|
|
11445
|
+
supplyDex,
|
|
11446
|
+
borrowDex,
|
|
11447
|
+
slot: r2.slot
|
|
11448
|
+
});
|
|
11449
|
+
}
|
|
11450
|
+
return out;
|
|
11451
|
+
}
|
|
11452
|
+
function decodeJlRateModel(data) {
|
|
11453
|
+
if (data.length < 53)
|
|
11454
|
+
throw new Error(`RateModel is ${data.length} bytes, expected 53`);
|
|
11455
|
+
const v = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
11456
|
+
const u16 = (o) => v.getUint16(o, true);
|
|
11457
|
+
const version = data[40];
|
|
11458
|
+
if (version !== 1 && version !== 2)
|
|
11459
|
+
throw new Error(`RateModel version ${version} not supported`);
|
|
11460
|
+
return {
|
|
11461
|
+
version,
|
|
11462
|
+
rateAtZero: u16(41),
|
|
11463
|
+
kink1: u16(43),
|
|
11464
|
+
rateAtKink1: u16(45),
|
|
11465
|
+
rateAtMax: u16(47),
|
|
11466
|
+
...version === 2 ? { kink2: u16(49), rateAtKink2: u16(51) } : {}
|
|
11467
|
+
};
|
|
10200
11468
|
}
|
|
10201
|
-
async function
|
|
10202
|
-
const
|
|
10203
|
-
const
|
|
10204
|
-
|
|
10205
|
-
|
|
10206
|
-
|
|
10207
|
-
|
|
10208
|
-
|
|
10209
|
-
dataSlice: { offset: 40, length: 32 },
|
|
10210
|
-
filters: [{ memcmp: { offset: 8, bytes: admin } }]
|
|
10211
|
-
}
|
|
10212
|
-
],
|
|
10213
|
-
{ accounts: 1 }
|
|
11469
|
+
async function readJlLayerIrms(rpc, market, mints, now = BigInt(Math.floor(Date.now() / 1e3))) {
|
|
11470
|
+
const uniq = [...new Set(mints)];
|
|
11471
|
+
const keys = await Promise.all(
|
|
11472
|
+
uniq.map(async (m2) => ({
|
|
11473
|
+
mint: m2,
|
|
11474
|
+
model: await liq([utf83("rate_model"), await pk3(m2)], market),
|
|
11475
|
+
reserve: await liq([utf83("reserve"), await pk3(m2)], market)
|
|
11476
|
+
}))
|
|
10214
11477
|
);
|
|
10215
|
-
const
|
|
10216
|
-
|
|
10217
|
-
|
|
10218
|
-
}
|
|
10219
|
-
async function readJupFlashAvailable(rpc, mint, tokenProgram, market = "main") {
|
|
10220
|
-
const vault = await jupLiquidityVault(mint, tokenProgram, market);
|
|
10221
|
-
const r = await rpc.call(
|
|
10222
|
-
"getTokenAccountBalance",
|
|
10223
|
-
[vault]
|
|
11478
|
+
const { m } = await read(
|
|
11479
|
+
rpc,
|
|
11480
|
+
keys.flatMap((k) => [k.model, k.reserve])
|
|
10224
11481
|
);
|
|
10225
|
-
|
|
11482
|
+
const out = /* @__PURE__ */ new Map();
|
|
11483
|
+
for (const k of keys) {
|
|
11484
|
+
const ma = m.get(k.model);
|
|
11485
|
+
const ra = m.get(k.reserve);
|
|
11486
|
+
if (!ma || !ra) continue;
|
|
11487
|
+
try {
|
|
11488
|
+
const model = decodeJlRateModel((0, import_svm_kit4.fromBase64)(ma.data[0]));
|
|
11489
|
+
const r = dec("TokenReserve", ra.data[0]);
|
|
11490
|
+
const o = jlOverallTokenData(r, now);
|
|
11491
|
+
const P = JL_EXCHANGE_PRICES_PRECISION;
|
|
11492
|
+
const bWi = Number(big(r.total_borrow_with_interest) * o.borrowEx / P);
|
|
11493
|
+
const sWi = Number(big(r.total_supply_with_interest) * o.supplyEx / P);
|
|
11494
|
+
const tb = Number(o.totalBorrow);
|
|
11495
|
+
const ts = Number(o.totalSupply);
|
|
11496
|
+
const u = ts > 0 ? tb / ts : 0;
|
|
11497
|
+
const ratio2 = u > 0 && sWi > 0 ? bWi / sWi / u : 1;
|
|
11498
|
+
out.set(k.mint, {
|
|
11499
|
+
...model,
|
|
11500
|
+
feeOnInterest: Number(r.fee_on_interest),
|
|
11501
|
+
maxUtilization: Number(o.maxUtilization),
|
|
11502
|
+
supplyWithInterestRatio: Number.isFinite(ratio2) ? ratio2 : 1,
|
|
11503
|
+
lastUtilization: Number(r.last_utilization),
|
|
11504
|
+
borrowRate: Number(r.borrow_rate)
|
|
11505
|
+
});
|
|
11506
|
+
} catch (e) {
|
|
11507
|
+
console.warn(
|
|
11508
|
+
`[jupiter-lend] rate model for ${k.mint} not read: ${e.message}`
|
|
11509
|
+
);
|
|
11510
|
+
}
|
|
11511
|
+
}
|
|
11512
|
+
return out;
|
|
11513
|
+
}
|
|
11514
|
+
|
|
11515
|
+
// src/lending/public-data/jupiter-lend/convertPublic.ts
|
|
11516
|
+
var JL_FACTOR_SCALE = 1e3;
|
|
11517
|
+
var JL_BPS = 1e4;
|
|
11518
|
+
var JL_ORACLE_DECIMALS = 15;
|
|
11519
|
+
var JL_ORACLE_SCALE = 10 ** JL_ORACLE_DECIMALS;
|
|
11520
|
+
var FLUID_ORACLE_DECIMALS = 27;
|
|
11521
|
+
var FLUID_VAULT_TYPE_T1 = 1e4;
|
|
11522
|
+
var bpsToPercent = (v) => num(v) / 100;
|
|
11523
|
+
var jlOraclePriceInBorrow = (raw2) => num(raw2) / JL_ORACLE_SCALE;
|
|
11524
|
+
function jlOracleToFluidRaw(raw2, colDecimals, debtDecimals) {
|
|
11525
|
+
if (typeof raw2 !== "string" || !/^\d+$/.test(raw2)) return void 0;
|
|
11526
|
+
const exp = FLUID_ORACLE_DECIMALS - JL_ORACLE_DECIMALS + debtDecimals - colDecimals;
|
|
11527
|
+
const v = BigInt(raw2);
|
|
11528
|
+
return (exp >= 0 ? v * 10n ** BigInt(exp) : v / 10n ** BigInt(-exp)).toString();
|
|
11529
|
+
}
|
|
11530
|
+
function formatRawUnits(raw2, decimals) {
|
|
11531
|
+
let v;
|
|
11532
|
+
try {
|
|
11533
|
+
v = BigInt(raw2 ?? 0);
|
|
11534
|
+
} catch {
|
|
11535
|
+
return "0";
|
|
11536
|
+
}
|
|
11537
|
+
const neg = v < 0n;
|
|
11538
|
+
if (neg) v = -v;
|
|
11539
|
+
const base = 10n ** BigInt(decimals);
|
|
11540
|
+
const whole = v / base;
|
|
11541
|
+
const frac = (v % base).toString().padStart(decimals, "0").replace(/0+$/, "");
|
|
11542
|
+
return `${neg ? "-" : ""}${whole}${frac ? `.${frac}` : ""}`;
|
|
11543
|
+
}
|
|
11544
|
+
function deriveLayerTotals(vaults, earn) {
|
|
11545
|
+
const t = {};
|
|
11546
|
+
const slot = (mint, decimals) => t[mint] ??= { supply: 0n, borrow: 0n, decimals };
|
|
11547
|
+
for (const e of earn)
|
|
11548
|
+
slot(e.assetAddress, e.asset.decimals).supply += BigInt(
|
|
11549
|
+
e.liquiditySupplyData.supply || "0"
|
|
11550
|
+
);
|
|
11551
|
+
for (const v of vaults) {
|
|
11552
|
+
slot(v.supplyToken.address, v.supplyToken.decimals).supply += BigInt(
|
|
11553
|
+
v.liquiditySupplyData.supply || "0"
|
|
11554
|
+
);
|
|
11555
|
+
slot(v.borrowToken.address, v.borrowToken.decimals).borrow += BigInt(
|
|
11556
|
+
v.liquidityBorrowData.borrow || "0"
|
|
11557
|
+
);
|
|
11558
|
+
}
|
|
11559
|
+
return t;
|
|
11560
|
+
}
|
|
11561
|
+
var fmt = (raw2, decimals) => Number(raw2) / 10 ** decimals;
|
|
11562
|
+
var jupiterLendCurrency = (t, listed3) => {
|
|
11563
|
+
const base = listed3 ?? {
|
|
11564
|
+
chainId: SOLANA_CHAIN_ID,
|
|
11565
|
+
address: t.address,
|
|
11566
|
+
symbol: t.uiSymbol ?? t.symbol,
|
|
11567
|
+
name: t.name,
|
|
11568
|
+
decimals: t.decimals
|
|
11569
|
+
};
|
|
11570
|
+
return { ...base, assetGroup: base.assetGroup || `solana-${t.address}` };
|
|
11571
|
+
};
|
|
11572
|
+
function convertJupiterLendVault(market, v, opts = {}) {
|
|
11573
|
+
const lenderKey = (0, import_lender_registry2.jupiterLendVaultKey)(market, v.id);
|
|
11574
|
+
const sup = v.supplyToken;
|
|
11575
|
+
const bor = v.borrowToken;
|
|
11576
|
+
const supPrice = num(sup.price);
|
|
11577
|
+
const borPrice = num(bor.price);
|
|
11578
|
+
const ltv = num(v.collateralFactor) / JL_FACTOR_SCALE;
|
|
11579
|
+
const lt = num(v.liquidationThreshold) / JL_FACTOR_SCALE;
|
|
11580
|
+
const penalty = num(v.liquidationPenalty) / JL_BPS;
|
|
11581
|
+
const supAsset = jupiterLendCurrency(sup, opts.tokenList?.[sup.address]);
|
|
11582
|
+
const borAsset = jupiterLendCurrency(bor, opts.tokenList?.[bor.address]);
|
|
11583
|
+
const supSym = supAsset.symbol ?? sup.symbol;
|
|
11584
|
+
const borSym = borAsset.symbol ?? bor.symbol;
|
|
11585
|
+
const label = `${supSym} / ${borSym} \xB7 vault #${v.id}`;
|
|
11586
|
+
const intrinsic = (a) => opts.intrinsicYields?.[a.assetGroup] ?? 0;
|
|
11587
|
+
const layerOf = (mint) => {
|
|
11588
|
+
const l = opts.layer?.[mint];
|
|
11589
|
+
if (!l || l.supply === 0n) return { utilization: 0 };
|
|
11590
|
+
return {
|
|
11591
|
+
utilization: Number(l.borrow * 10000n / l.supply) / 1e4,
|
|
11592
|
+
irmTotalDeposits: fmt(l.supply, l.decimals),
|
|
11593
|
+
irmTotalDebt: fmt(l.borrow, l.decimals)
|
|
11594
|
+
};
|
|
11595
|
+
};
|
|
11596
|
+
const totalSupply = BigInt(v.totalSupply || "0");
|
|
11597
|
+
const withdrawLimit = BigInt(v.withdrawLimit || "0");
|
|
11598
|
+
const lockupRatio = totalSupply > 0n ? Number(withdrawLimit * 10000n / totalSupply) / 1e4 : 0;
|
|
11599
|
+
const supplyDeposits = fmt(v.totalSupply, sup.decimals);
|
|
11600
|
+
const borrowDebt = fmt(v.totalBorrow, bor.decimals);
|
|
11601
|
+
const borrowable = fmt(v.borrowable, bor.decimals);
|
|
11602
|
+
const collateralConfig = {
|
|
11603
|
+
category: 0,
|
|
11604
|
+
label,
|
|
11605
|
+
borrowCollateralFactor: ltv,
|
|
11606
|
+
collateralFactor: lt,
|
|
11607
|
+
borrowFactor: 1,
|
|
11608
|
+
liquidationPenalty: penalty,
|
|
11609
|
+
closeFactor: 1,
|
|
11610
|
+
collateralDisabled: false,
|
|
11611
|
+
debtDisabled: true
|
|
11612
|
+
};
|
|
11613
|
+
const debtConfig = {
|
|
11614
|
+
category: 0,
|
|
11615
|
+
label,
|
|
11616
|
+
borrowCollateralFactor: 0,
|
|
11617
|
+
collateralFactor: 0,
|
|
11618
|
+
borrowFactor: 1,
|
|
11619
|
+
liquidationPenalty: 0,
|
|
11620
|
+
closeFactor: 1,
|
|
11621
|
+
collateralDisabled: true,
|
|
11622
|
+
debtDisabled: false
|
|
11623
|
+
};
|
|
11624
|
+
const common = {
|
|
11625
|
+
totalDebtStable: "0",
|
|
11626
|
+
totalDebtStableUSD: 0,
|
|
11627
|
+
stableBorrowRate: 0,
|
|
11628
|
+
hasStable: false,
|
|
11629
|
+
isActive: true,
|
|
11630
|
+
isFrozen: false,
|
|
11631
|
+
debtCeiling: "0",
|
|
11632
|
+
closeFactor: 1,
|
|
11633
|
+
lockupRatio,
|
|
11634
|
+
rewards: []
|
|
11635
|
+
};
|
|
11636
|
+
const colUid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, sup.address);
|
|
11637
|
+
const debtUid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, bor.address);
|
|
11638
|
+
const collateralLeg = {
|
|
11639
|
+
...common,
|
|
11640
|
+
marketUid: colUid,
|
|
11641
|
+
name: `Collateral ${supSym}`,
|
|
11642
|
+
poolId: sup.address,
|
|
11643
|
+
underlying: sup.address,
|
|
11644
|
+
asset: supAsset,
|
|
11645
|
+
decimals: sup.decimals,
|
|
11646
|
+
totalDeposits: formatRawUnits(v.totalSupply, sup.decimals),
|
|
11647
|
+
totalDebt: "0",
|
|
11648
|
+
totalLiquidity: supplyDeposits,
|
|
11649
|
+
borrowLiquidity: 0,
|
|
11650
|
+
totalDepositsUSD: supplyDeposits * supPrice,
|
|
11651
|
+
totalDebtUSD: 0,
|
|
11652
|
+
totalLiquidityUSD: supplyDeposits * supPrice,
|
|
11653
|
+
borrowLiquidityUSD: 0,
|
|
11654
|
+
...layerOf(sup.address),
|
|
11655
|
+
depositRate: bpsToPercent(v.supplyRate),
|
|
11656
|
+
variableBorrowRate: 0,
|
|
11657
|
+
intrinsicYield: intrinsic(supAsset),
|
|
11658
|
+
liquidationBonus: penalty,
|
|
11659
|
+
config: { "0": collateralConfig },
|
|
11660
|
+
collateralActive: true,
|
|
11661
|
+
borrowingEnabled: false,
|
|
11662
|
+
depositsEnabled: true
|
|
11663
|
+
};
|
|
11664
|
+
const debtLeg = {
|
|
11665
|
+
...common,
|
|
11666
|
+
marketUid: debtUid,
|
|
11667
|
+
name: `Loan ${borSym}`,
|
|
11668
|
+
poolId: bor.address,
|
|
11669
|
+
underlying: bor.address,
|
|
11670
|
+
asset: borAsset,
|
|
11671
|
+
decimals: bor.decimals,
|
|
11672
|
+
totalDeposits: "0",
|
|
11673
|
+
totalDebt: formatRawUnits(v.totalBorrow, bor.decimals),
|
|
11674
|
+
totalLiquidity: borrowable,
|
|
11675
|
+
borrowLiquidity: borrowable,
|
|
11676
|
+
totalDepositsUSD: 0,
|
|
11677
|
+
totalDebtUSD: borrowDebt * borPrice,
|
|
11678
|
+
totalLiquidityUSD: borrowable * borPrice,
|
|
11679
|
+
borrowLiquidityUSD: borrowable * borPrice,
|
|
11680
|
+
...layerOf(bor.address),
|
|
11681
|
+
depositRate: 0,
|
|
11682
|
+
variableBorrowRate: bpsToPercent(v.borrowRate),
|
|
11683
|
+
intrinsicYield: intrinsic(borAsset),
|
|
11684
|
+
liquidationBonus: 0,
|
|
11685
|
+
originationFee: num(v.borrowFee) / 100,
|
|
11686
|
+
config: { "0": debtConfig },
|
|
11687
|
+
collateralActive: false,
|
|
11688
|
+
borrowingEnabled: true,
|
|
11689
|
+
depositsEnabled: false
|
|
11690
|
+
};
|
|
11691
|
+
const vault = {
|
|
11692
|
+
vaultAddress: v.address,
|
|
11693
|
+
vaultId: v.id,
|
|
11694
|
+
collateralAddress: sup.address,
|
|
11695
|
+
loanAddress: bor.address,
|
|
11696
|
+
collateralDecimals: sup.decimals,
|
|
11697
|
+
loanDecimals: bor.decimals,
|
|
11698
|
+
oracle: v.oracle,
|
|
11699
|
+
ltv,
|
|
11700
|
+
liquidationThreshold: lt,
|
|
11701
|
+
liquidationPenalty: penalty,
|
|
11702
|
+
oraclePriceOperate: jlOracleToFluidRaw(
|
|
11703
|
+
v.oraclePriceOperate,
|
|
11704
|
+
sup.decimals,
|
|
11705
|
+
bor.decimals
|
|
11706
|
+
),
|
|
11707
|
+
oraclePriceLiquidate: jlOracleToFluidRaw(
|
|
11708
|
+
v.oraclePriceLiquidate,
|
|
11709
|
+
sup.decimals,
|
|
11710
|
+
bor.decimals
|
|
11711
|
+
),
|
|
11712
|
+
isSmartCol: isJlSmartCol(v.type),
|
|
11713
|
+
isSmartDebt: isJlSmartDebt(v.type),
|
|
11714
|
+
vaultType: v.type <= 1 ? FLUID_VAULT_TYPE_T1 : FLUID_VAULT_TYPE_T1 * Math.min(4, v.type),
|
|
11715
|
+
collateral: {
|
|
11716
|
+
assets: [{ underlying: sup.address, decimals: sup.decimals }],
|
|
11717
|
+
dex: null,
|
|
11718
|
+
perShare: null
|
|
11719
|
+
},
|
|
11720
|
+
loan: {
|
|
11721
|
+
assets: [{ underlying: bor.address, decimals: bor.decimals }],
|
|
11722
|
+
dex: null,
|
|
11723
|
+
perShare: null
|
|
11724
|
+
}
|
|
11725
|
+
};
|
|
11726
|
+
const jupiterLendVault = {
|
|
11727
|
+
market,
|
|
11728
|
+
vaultId: v.id,
|
|
11729
|
+
address: v.address,
|
|
11730
|
+
type: v.type,
|
|
11731
|
+
supplyToken: sup.address,
|
|
11732
|
+
borrowToken: bor.address,
|
|
11733
|
+
supplyDecimals: sup.decimals,
|
|
11734
|
+
borrowDecimals: bor.decimals,
|
|
11735
|
+
collateralFactor: num(v.collateralFactor),
|
|
11736
|
+
liquidationThreshold: num(v.liquidationThreshold),
|
|
11737
|
+
liquidationMaxLimit: num(v.liquidationMaxLimit),
|
|
11738
|
+
withdrawalGap: num(v.withdrawalGap),
|
|
11739
|
+
liquidationPenalty: num(v.liquidationPenalty),
|
|
11740
|
+
borrowFee: num(v.borrowFee),
|
|
11741
|
+
supplyRateMagnifier: num(v.supplyRateMagnifier),
|
|
11742
|
+
borrowRateMagnifier: num(v.borrowRateMagnifier),
|
|
11743
|
+
supplyRateLiquidity: num(v.supplyRateLiquidity),
|
|
11744
|
+
borrowRateLiquidity: num(v.borrowRateLiquidity),
|
|
11745
|
+
minimumBorrowing: v.minimumBorrowing,
|
|
11746
|
+
totalPositions: v.totalPositions,
|
|
11747
|
+
borrowLimit: v.borrowLimit,
|
|
11748
|
+
borrowable: v.borrowable,
|
|
11749
|
+
withdrawLimit: v.withdrawLimit,
|
|
11750
|
+
withdrawable: v.withdrawable,
|
|
11751
|
+
oracle: v.oracle,
|
|
11752
|
+
oraclePrice: v.oraclePrice,
|
|
11753
|
+
oraclePriceOperate: v.oraclePriceOperate,
|
|
11754
|
+
oraclePriceLiquidate: v.oraclePriceLiquidate,
|
|
11755
|
+
oracleSources: v.oracleSources,
|
|
11756
|
+
oracleTimestamp: v.oracleTimestamp,
|
|
11757
|
+
liquiditySupplyData: v.liquiditySupplyData,
|
|
11758
|
+
liquidityBorrowData: v.liquidityBorrowData,
|
|
11759
|
+
topTick: v.topTick,
|
|
11760
|
+
metadata: v.metadata
|
|
11761
|
+
};
|
|
11762
|
+
return {
|
|
11763
|
+
lenderKey,
|
|
11764
|
+
chainId: SOLANA_CHAIN_ID,
|
|
11765
|
+
data: { [colUid]: collateralLeg, [debtUid]: debtLeg },
|
|
11766
|
+
params: { vault, jupiterLendVault }
|
|
11767
|
+
};
|
|
10226
11768
|
}
|
|
10227
11769
|
|
|
10228
11770
|
// src/lending/public-data/jupiter-lend/fetchPublic.ts
|
|
@@ -10236,8 +11778,37 @@ async function fetchJupiterLendPublic(opts = {}) {
|
|
|
10236
11778
|
api.vaults(market),
|
|
10237
11779
|
api.earnTokens(market)
|
|
10238
11780
|
]);
|
|
10239
|
-
const layer = deriveLayerTotals(vaults, earn);
|
|
10240
11781
|
const only = opts.vaultIds?.[market];
|
|
11782
|
+
let chain = [];
|
|
11783
|
+
if (opts.rpc && opts.enumerateOnchain !== false) {
|
|
11784
|
+
try {
|
|
11785
|
+
const next = await readJlNextVaultId(opts.rpc, market);
|
|
11786
|
+
const listed3 = new Set(vaults.map((v) => v.id));
|
|
11787
|
+
const ids = [];
|
|
11788
|
+
for (let id = 1; next && id < next; id++)
|
|
11789
|
+
if (!listed3.has(id) && (!only || only.includes(id))) ids.push(id);
|
|
11790
|
+
if (ids.length) {
|
|
11791
|
+
const tokens = {};
|
|
11792
|
+
for (const v of vaults) {
|
|
11793
|
+
tokens[v.supplyToken.address] ??= v.supplyToken;
|
|
11794
|
+
tokens[v.borrowToken.address] ??= v.borrowToken;
|
|
11795
|
+
}
|
|
11796
|
+
for (const e of earn) tokens[e.assetAddress] ??= e.asset;
|
|
11797
|
+
chain = await readJupiterLendVaultsOnchain(opts.rpc, market, ids, {
|
|
11798
|
+
tokens,
|
|
11799
|
+
tokenList: opts.tokenList
|
|
11800
|
+
});
|
|
11801
|
+
}
|
|
11802
|
+
} catch (e) {
|
|
11803
|
+
console.warn(
|
|
11804
|
+
`[jupiter-lend] on-chain enumeration of ${market} failed, serving the API's vaults only: ${e.message}`
|
|
11805
|
+
);
|
|
11806
|
+
}
|
|
11807
|
+
}
|
|
11808
|
+
const layer = deriveLayerTotals(
|
|
11809
|
+
[...vaults, ...chain.map((c) => c.vault)],
|
|
11810
|
+
earn
|
|
11811
|
+
);
|
|
10241
11812
|
let flash;
|
|
10242
11813
|
if (opts.rpc) {
|
|
10243
11814
|
try {
|
|
@@ -10257,13 +11828,64 @@ async function fetchJupiterLendPublic(opts = {}) {
|
|
|
10257
11828
|
);
|
|
10258
11829
|
}
|
|
10259
11830
|
}
|
|
10260
|
-
|
|
11831
|
+
const fromChain = new Map(chain.map((c) => [c.vault.id, c]));
|
|
11832
|
+
let irms = /* @__PURE__ */ new Map();
|
|
11833
|
+
if (opts.rpc) {
|
|
11834
|
+
const mints = /* @__PURE__ */ new Set();
|
|
11835
|
+
for (const v of [...vaults, ...chain.map((c) => c.vault)]) {
|
|
11836
|
+
const cv = fromChain.get(v.id);
|
|
11837
|
+
if (!cv?.smartCol) mints.add(v.supplyToken.address);
|
|
11838
|
+
if (!cv?.smartDebt) mints.add(v.borrowToken.address);
|
|
11839
|
+
}
|
|
11840
|
+
try {
|
|
11841
|
+
irms = await readJlLayerIrms(opts.rpc, market, [...mints]);
|
|
11842
|
+
} catch (e) {
|
|
11843
|
+
console.warn(
|
|
11844
|
+
`[jupiter-lend] layer rate models for ${market} not read: ${e.message}`
|
|
11845
|
+
);
|
|
11846
|
+
}
|
|
11847
|
+
}
|
|
11848
|
+
for (const v of [...vaults, ...chain.map((c) => c.vault)]) {
|
|
10261
11849
|
if (only && !only.includes(v.id)) continue;
|
|
10262
11850
|
const conv = convertJupiterLendVault(market, v, {
|
|
10263
11851
|
tokenList: opts.tokenList,
|
|
10264
11852
|
intrinsicYields: opts.intrinsicYields,
|
|
10265
11853
|
layer
|
|
10266
11854
|
});
|
|
11855
|
+
const cv = fromChain.get(v.id);
|
|
11856
|
+
const mags = {
|
|
11857
|
+
supplyMagnifier: Number(v.supplyRateMagnifier) || 0,
|
|
11858
|
+
borrowMagnifier: Number(v.borrowRateMagnifier) || 0
|
|
11859
|
+
};
|
|
11860
|
+
for (const row of Object.values(conv.data)) {
|
|
11861
|
+
const smart = row.underlying === v.supplyToken.address ? cv?.smartCol : cv?.smartDebt;
|
|
11862
|
+
const irm = smart ? void 0 : irms.get(row.underlying);
|
|
11863
|
+
if (irm) row.jupiterLend = { irm: { ...irm, ...mags } };
|
|
11864
|
+
}
|
|
11865
|
+
const meta = conv.params.jupiterLendVault;
|
|
11866
|
+
meta.source = cv ? "chain" : "api";
|
|
11867
|
+
if (cv) {
|
|
11868
|
+
meta.slot = cv.slot;
|
|
11869
|
+
if (cv.smartCol || cv.smartDebt)
|
|
11870
|
+
meta.smart = {
|
|
11871
|
+
...cv.smartCol ? {
|
|
11872
|
+
col: {
|
|
11873
|
+
dex: v.supplyToken.address,
|
|
11874
|
+
token0: cv.supplyDex?.token0,
|
|
11875
|
+
token1: cv.supplyDex?.token1
|
|
11876
|
+
}
|
|
11877
|
+
} : {},
|
|
11878
|
+
...cv.smartDebt ? {
|
|
11879
|
+
debt: {
|
|
11880
|
+
dex: v.borrowToken.address,
|
|
11881
|
+
token0: cv.borrowDex?.token0,
|
|
11882
|
+
token1: cv.borrowDex?.token1
|
|
11883
|
+
}
|
|
11884
|
+
} : {}
|
|
11885
|
+
};
|
|
11886
|
+
const unpriced = [v.supplyToken, v.borrowToken].filter((t) => !(Number(t.price) > 0)).map((t) => t.address);
|
|
11887
|
+
if (unpriced.length) meta.unpriced = unpriced;
|
|
11888
|
+
}
|
|
10267
11889
|
if (flash)
|
|
10268
11890
|
conv.params.jupiterLendVault.flashloan = {
|
|
10269
11891
|
feeBps: flash.feeBps,
|
|
@@ -10291,7 +11913,7 @@ var SAVE_API_BASE = "https://api.save.finance";
|
|
|
10291
11913
|
var SAVE_WAD = 10n ** 18n;
|
|
10292
11914
|
var SAVE_U64_MAX = "18446744073709551615";
|
|
10293
11915
|
var SAVE_SLOTS_PER_YEAR = 63072e3;
|
|
10294
|
-
var SAVE_DEFAULT_AVG_SLOT_SECONDS = 0.
|
|
11916
|
+
var SAVE_DEFAULT_AVG_SLOT_SECONDS = 0.2665;
|
|
10295
11917
|
var SAVE_LIQUIDATION_CLOSE_FACTOR = 0.2;
|
|
10296
11918
|
var SAVE_MAX_LIQUIDATABLE_VALUE_USD = 5e5;
|
|
10297
11919
|
var SAVE_FULL_LIQUIDATION_VALUE_USD = 1;
|
|
@@ -10729,7 +12351,7 @@ var LS_NO_ACCOUNT = "11111111111111111111111111111111";
|
|
|
10729
12351
|
var LS_U64_MAX = "18446744073709551615";
|
|
10730
12352
|
var isUncapped = (v) => v === void 0 || v === null || String(v) === LS_U64_MAX;
|
|
10731
12353
|
var capOrUndefined = (v) => isUncapped(v) ? void 0 : String(v);
|
|
10732
|
-
var
|
|
12354
|
+
var SECONDS_PER_YEAR2 = 31536e3;
|
|
10733
12355
|
var LS_TENORS = [
|
|
10734
12356
|
{ id: "1d", duration: { duration: 1, durationType: 0 }, days: 1 },
|
|
10735
12357
|
{ id: "1w", duration: { duration: 1, durationType: 1 }, days: 7 },
|
|
@@ -10831,7 +12453,7 @@ function createPacer(intervalMs) {
|
|
|
10831
12453
|
}
|
|
10832
12454
|
|
|
10833
12455
|
// src/lending/public-data/loopscale/markets.ts
|
|
10834
|
-
var
|
|
12456
|
+
var import_svm_kit5 = require("@1delta/svm-kit");
|
|
10835
12457
|
async function buildLoopscaleRoster(vaults, loops, opts = {}) {
|
|
10836
12458
|
const byKey = /* @__PURE__ */ new Map();
|
|
10837
12459
|
const key2 = (p, c) => `${p}_${c}`;
|
|
@@ -10885,6 +12507,8 @@ async function buildLoopscaleRoster(vaults, loops, opts = {}) {
|
|
|
10885
12507
|
strategy: s.address,
|
|
10886
12508
|
name: v.vaultMetadata?.name ?? v.vault.address,
|
|
10887
12509
|
curator: v.vaultMetadata?.managerName ?? "",
|
|
12510
|
+
manager: v.vault.manager,
|
|
12511
|
+
managerImage: v.vaultMetadata?.managerImage ?? void 0,
|
|
10888
12512
|
interestFee: Number(s.interestFee),
|
|
10889
12513
|
originationFee: Number(s.originationFee),
|
|
10890
12514
|
originationsEnabled: s.originationsEnabled,
|
|
@@ -10933,21 +12557,21 @@ async function buildLoopscaleRoster(vaults, loops, opts = {}) {
|
|
|
10933
12557
|
];
|
|
10934
12558
|
const unresolved = [];
|
|
10935
12559
|
if (toProbe.length && opts.rpc) {
|
|
10936
|
-
const mints = await (0,
|
|
10937
|
-
const
|
|
10938
|
-
mints.forEach((m, i) => m &&
|
|
12560
|
+
const mints = await (0, import_svm_kit5.getMints)(opts.rpc, toProbe);
|
|
12561
|
+
const dec2 = /* @__PURE__ */ new Map();
|
|
12562
|
+
mints.forEach((m, i) => m && dec2.set(toProbe[i], m.decimals));
|
|
10939
12563
|
for (const pair of byKey.values()) {
|
|
10940
12564
|
const c = pair.collateralIdentifier;
|
|
10941
|
-
if (pair.assetType === -1 &&
|
|
12565
|
+
if (pair.assetType === -1 && dec2.has(c)) {
|
|
10942
12566
|
pair.assetType = 0;
|
|
10943
12567
|
pair.collateralMint = c;
|
|
10944
12568
|
}
|
|
10945
12569
|
if (pair.collateralMint && pair.collateralDecimals === void 0)
|
|
10946
|
-
pair.collateralDecimals =
|
|
12570
|
+
pair.collateralDecimals = dec2.get(pair.collateralMint);
|
|
10947
12571
|
if (pair.principalDecimals === void 0)
|
|
10948
|
-
pair.principalDecimals =
|
|
12572
|
+
pair.principalDecimals = dec2.get(pair.principalMint);
|
|
10949
12573
|
}
|
|
10950
|
-
for (const c of unknown) if (!
|
|
12574
|
+
for (const c of unknown) if (!dec2.has(c)) unresolved.push(c);
|
|
10951
12575
|
} else unresolved.push(...unknown);
|
|
10952
12576
|
const pairs = [...byKey.values()].filter(
|
|
10953
12577
|
(p) => (p.assetType === 0 || opts.includeUnresolvedCollateral) && (want ? want.has(key2(p.principalMint, p.collateralIdentifier)) : true)
|
|
@@ -11240,7 +12864,12 @@ function convertLoopscalePair(pair, opts) {
|
|
|
11240
12864
|
termId: t.termId,
|
|
11241
12865
|
durationDays: t.durationDays,
|
|
11242
12866
|
durationSecs: t.durationDays * 86400,
|
|
11243
|
-
apr: t.apr
|
|
12867
|
+
apr: t.apr,
|
|
12868
|
+
ladder: t.ladder.map((l) => ({
|
|
12869
|
+
apr: l.apr,
|
|
12870
|
+
assets: fmt2(l.sum, pDec),
|
|
12871
|
+
fill: "single"
|
|
12872
|
+
}))
|
|
11244
12873
|
}));
|
|
11245
12874
|
const common = {
|
|
11246
12875
|
totalDebtStable: "0",
|
|
@@ -11380,11 +13009,11 @@ function convertLoopscalePair(pair, opts) {
|
|
|
11380
13009
|
}
|
|
11381
13010
|
|
|
11382
13011
|
// src/lending/public-data/loopscale/fetchPublic.ts
|
|
11383
|
-
var
|
|
13012
|
+
var import_svm_kit7 = require("@1delta/svm-kit");
|
|
11384
13013
|
init_lenders();
|
|
11385
13014
|
|
|
11386
13015
|
// src/lending/public-data/loopscale/accounts.ts
|
|
11387
|
-
var
|
|
13016
|
+
var import_svm_kit6 = require("@1delta/svm-kit");
|
|
11388
13017
|
|
|
11389
13018
|
// src/lending/public-data/loopscale/idl/loopscale.json
|
|
11390
13019
|
var loopscale_default = {
|
|
@@ -18367,8 +19996,8 @@ var podDecimalToNumber = (p) => Number(podToBigInt(p)) / 1e18;
|
|
|
18367
19996
|
var podBool = (p) => bytesOf(p)[0] !== 0;
|
|
18368
19997
|
var raw = (v) => v;
|
|
18369
19998
|
function decodeLoopscaleLoan(data) {
|
|
18370
|
-
const r = raw((0,
|
|
18371
|
-
const zero = (0,
|
|
19999
|
+
const r = raw((0, import_svm_kit6.decodeIdlAccount)(LOOPSCALE_IDL, "Loan", data));
|
|
20000
|
+
const zero = (0, import_svm_kit6.encodeBase58)(new Uint8Array(32));
|
|
18372
20001
|
const ledgers = r.ledgers.map(
|
|
18373
20002
|
(l) => ({
|
|
18374
20003
|
status: l.status,
|
|
@@ -18412,7 +20041,7 @@ function decodeLoopscaleLoan(data) {
|
|
|
18412
20041
|
};
|
|
18413
20042
|
}
|
|
18414
20043
|
function decodeLoopscaleStrategy(data) {
|
|
18415
|
-
const r = raw((0,
|
|
20044
|
+
const r = raw((0, import_svm_kit6.decodeIdlAccount)(LOOPSCALE_IDL, "Strategy", data));
|
|
18416
20045
|
return {
|
|
18417
20046
|
version: r.version,
|
|
18418
20047
|
nonce: r.nonce,
|
|
@@ -18449,13 +20078,13 @@ async function readLoopscaleLoans(rpc, loanAddresses) {
|
|
|
18449
20078
|
return {
|
|
18450
20079
|
slot,
|
|
18451
20080
|
loans: accounts.map(
|
|
18452
|
-
(a) => a && a.owner === LOOPSCALE_PROGRAM_ID ? decodeLoopscaleLoan((0,
|
|
20081
|
+
(a) => a && a.owner === LOOPSCALE_PROGRAM_ID ? decodeLoopscaleLoan((0, import_svm_kit6.fromBase64)(a.data[0])) : null
|
|
18453
20082
|
)
|
|
18454
20083
|
};
|
|
18455
20084
|
}
|
|
18456
20085
|
function decodeLoopscaleMarketInformation(data) {
|
|
18457
|
-
const r = raw((0,
|
|
18458
|
-
const zero = (0,
|
|
20086
|
+
const r = raw((0, import_svm_kit6.decodeIdlAccount)(LOOPSCALE_IDL, "MarketInformation", data));
|
|
20087
|
+
const zero = (0, import_svm_kit6.encodeBase58)(new Uint8Array(32));
|
|
18459
20088
|
const caps = (c) => ({
|
|
18460
20089
|
max1hr: podToBigInt(c.max_1hr).toString(),
|
|
18461
20090
|
max24hr: podToBigInt(c.max_24hr).toString(),
|
|
@@ -18504,7 +20133,7 @@ async function readLoopscaleMarketInformation(rpc, addresses) {
|
|
|
18504
20133
|
try {
|
|
18505
20134
|
out.set(
|
|
18506
20135
|
unique[i],
|
|
18507
|
-
decodeLoopscaleMarketInformation((0,
|
|
20136
|
+
decodeLoopscaleMarketInformation((0, import_svm_kit6.fromBase64)(a.data[0]))
|
|
18508
20137
|
);
|
|
18509
20138
|
} catch (e) {
|
|
18510
20139
|
console.warn(
|
|
@@ -18697,7 +20326,7 @@ async function fetchLoopscalePublic(opts = {}) {
|
|
|
18697
20326
|
opts.vaults ?? api.vaults(),
|
|
18698
20327
|
opts.loops ?? api.loops()
|
|
18699
20328
|
]);
|
|
18700
|
-
const rpc = opts.rpc ?? (0,
|
|
20329
|
+
const rpc = opts.rpc ?? (0, import_svm_kit7.createSvmRpc)();
|
|
18701
20330
|
const { pairs, unresolved } = await buildLoopscaleRoster(vaults, loops, {
|
|
18702
20331
|
...opts,
|
|
18703
20332
|
rpc
|
|
@@ -18816,18 +20445,18 @@ function tenorsToQuote(pair, all) {
|
|
|
18816
20445
|
return out;
|
|
18817
20446
|
}
|
|
18818
20447
|
function deriveLoopscalePrices(vaults, loops, pairs, tokenList, loanBook) {
|
|
18819
|
-
const
|
|
18820
|
-
for (const [m, t] of Object.entries(tokenList ?? {}))
|
|
20448
|
+
const dec2 = /* @__PURE__ */ new Map();
|
|
20449
|
+
for (const [m, t] of Object.entries(tokenList ?? {})) dec2.set(m, t.decimals);
|
|
18821
20450
|
for (const p of pairs) {
|
|
18822
20451
|
if (p.principalDecimals !== void 0)
|
|
18823
|
-
|
|
20452
|
+
dec2.set(p.principalMint, p.principalDecimals);
|
|
18824
20453
|
if (p.collateralMint && p.collateralDecimals !== void 0)
|
|
18825
|
-
|
|
20454
|
+
dec2.set(p.collateralMint, p.collateralDecimals);
|
|
18826
20455
|
}
|
|
18827
20456
|
const out = {};
|
|
18828
20457
|
const best = /* @__PURE__ */ new Map();
|
|
18829
20458
|
const offer = (mint, usd, raw2) => {
|
|
18830
|
-
const d2 =
|
|
20459
|
+
const d2 = dec2.get(mint);
|
|
18831
20460
|
if (d2 === void 0 || !usd || !(raw2 > 0)) return;
|
|
18832
20461
|
if ((best.get(mint) ?? 0) < usd) {
|
|
18833
20462
|
best.set(mint, usd);
|
|
@@ -18858,7 +20487,7 @@ function deriveLoopscalePrices(vaults, loops, pairs, tokenList, loanBook) {
|
|
|
18858
20487
|
}
|
|
18859
20488
|
|
|
18860
20489
|
// src/prices/pythPush.ts
|
|
18861
|
-
var
|
|
20490
|
+
var import_svm_kit8 = require("@1delta/svm-kit");
|
|
18862
20491
|
var PYTH_RECEIVER_PROGRAM = "rec2HHDDnjLfj4kE7VyEtFA1HPGQLK33259532cRyHp";
|
|
18863
20492
|
var PYTH_PRICE_UPDATE_V2_DISCRIMINATOR = [
|
|
18864
20493
|
34,
|
|
@@ -18871,7 +20500,7 @@ var PYTH_PRICE_UPDATE_V2_DISCRIMINATOR = [
|
|
|
18871
20500
|
205
|
|
18872
20501
|
];
|
|
18873
20502
|
function decodePythPriceUpdate(data) {
|
|
18874
|
-
const b = typeof data === "string" ? (0,
|
|
20503
|
+
const b = typeof data === "string" ? (0, import_svm_kit8.fromBase64)(data) : data;
|
|
18875
20504
|
for (let i = 0; i < 8; i++)
|
|
18876
20505
|
if (b[i] !== PYTH_PRICE_UPDATE_V2_DISCRIMINATOR[i])
|
|
18877
20506
|
throw new Error("pyth: account is not a PriceUpdateV2");
|
|
@@ -19005,7 +20634,7 @@ function createP0Api(opts = {}) {
|
|
|
19005
20634
|
}
|
|
19006
20635
|
|
|
19007
20636
|
// src/lending/public-data/project0/accounts.ts
|
|
19008
|
-
var
|
|
20637
|
+
var import_svm_kit9 = require("@1delta/svm-kit");
|
|
19009
20638
|
|
|
19010
20639
|
// src/lending/public-data/project0/idl/marginfi.json
|
|
19011
20640
|
var marginfi_default = {
|
|
@@ -33869,34 +35498,34 @@ function decimalStringToI80F48(s) {
|
|
|
33869
35498
|
for (let i = 0; i < 16; i++) out[i] = Number(u >> BigInt(8 * i) & 0xffn);
|
|
33870
35499
|
return out;
|
|
33871
35500
|
}
|
|
33872
|
-
var
|
|
33873
|
-
var
|
|
33874
|
-
const b = (0,
|
|
35501
|
+
var utf84 = (s) => new TextEncoder().encode(s);
|
|
35502
|
+
var pk4 = (address) => {
|
|
35503
|
+
const b = (0, import_svm_kit9.decodeBase58)(address);
|
|
33875
35504
|
if (!b || b.length !== 32)
|
|
33876
35505
|
throw new Error(`project0: not a 32-byte pubkey: ${address}`);
|
|
33877
35506
|
return b;
|
|
33878
35507
|
};
|
|
33879
|
-
var
|
|
35508
|
+
var u16le2 = (n) => {
|
|
33880
35509
|
if (!Number.isInteger(n) || n < 0 || n > 65535)
|
|
33881
35510
|
throw new Error(`project0: u16 out of range: ${n}`);
|
|
33882
35511
|
return new Uint8Array([n & 255, n >> 8]);
|
|
33883
35512
|
};
|
|
33884
|
-
var p0LiquidityVaultAuthority = async (bank, programId = P0_PROGRAM_ID) => (await (0,
|
|
33885
|
-
[
|
|
35513
|
+
var p0LiquidityVaultAuthority = async (bank, programId = P0_PROGRAM_ID) => (await (0, import_svm_kit9.findProgramAddress)(
|
|
35514
|
+
[utf84(P0_SEEDS.liquidityVaultAuthority), pk4(bank)],
|
|
33886
35515
|
programId
|
|
33887
35516
|
)).address;
|
|
33888
|
-
var p0LiquidityVault = async (bank, programId = P0_PROGRAM_ID) => (await (0,
|
|
33889
|
-
[
|
|
35517
|
+
var p0LiquidityVault = async (bank, programId = P0_PROGRAM_ID) => (await (0, import_svm_kit9.findProgramAddress)(
|
|
35518
|
+
[utf84(P0_SEEDS.liquidityVault), pk4(bank)],
|
|
33890
35519
|
programId
|
|
33891
35520
|
)).address;
|
|
33892
|
-
var p0FeeState = async (programId = P0_PROGRAM_ID) => (await (0,
|
|
33893
|
-
var p0MarginfiAccountPda = async (authority, accountIndex = 0, opts = {}) => (await (0,
|
|
35521
|
+
var p0FeeState = async (programId = P0_PROGRAM_ID) => (await (0, import_svm_kit9.findProgramAddress)([utf84(P0_SEEDS.feeState)], programId)).address;
|
|
35522
|
+
var p0MarginfiAccountPda = async (authority, accountIndex = 0, opts = {}) => (await (0, import_svm_kit9.findProgramAddress)(
|
|
33894
35523
|
[
|
|
33895
|
-
|
|
33896
|
-
|
|
33897
|
-
|
|
33898
|
-
|
|
33899
|
-
|
|
35524
|
+
utf84(P0_SEEDS.marginfiAccount),
|
|
35525
|
+
pk4(opts.group ?? P0_MAIN_GROUP),
|
|
35526
|
+
pk4(authority),
|
|
35527
|
+
u16le2(accountIndex),
|
|
35528
|
+
u16le2(opts.thirdPartyId ?? 0)
|
|
33900
35529
|
],
|
|
33901
35530
|
opts.programId ?? P0_PROGRAM_ID
|
|
33902
35531
|
)).address;
|
|
@@ -33980,8 +35609,8 @@ var bankConfig = (c) => ({
|
|
|
33980
35609
|
cbEmaAlphaBps: c.cb_ema_alpha_bps
|
|
33981
35610
|
});
|
|
33982
35611
|
function decodeP0Bank(address, data, tokenSymbol) {
|
|
33983
|
-
const
|
|
33984
|
-
const r = (0,
|
|
35612
|
+
const bytes2 = typeof data === "string" ? (0, import_svm_kit9.fromBase64)(data) : data;
|
|
35613
|
+
const r = (0, import_svm_kit9.decodeIdlAccount)(P0_IDL, "Bank", bytes2);
|
|
33985
35614
|
const entries = r.emode.emode_config.entries.filter((e) => e.collateral_bank_emode_tag !== 0).map((e) => ({
|
|
33986
35615
|
collateralBankEmodeTag: e.collateral_bank_emode_tag,
|
|
33987
35616
|
flags: e.flags,
|
|
@@ -34206,8 +35835,8 @@ var u32ToBasis = (v) => v / 4294967295 * 100;
|
|
|
34206
35835
|
var P0_PAUSE_DURATION_SECONDS = 6 * 60 * 60;
|
|
34207
35836
|
var p0GroupPausedAt = (g, now) => !!g?.panic.pausedFlag && (now < g.panic.pauseStartTimestamp || now - g.panic.pauseStartTimestamp < P0_PAUSE_DURATION_SECONDS);
|
|
34208
35837
|
function decodeP0Group(address, data) {
|
|
34209
|
-
const
|
|
34210
|
-
const r = (0,
|
|
35838
|
+
const bytes2 = typeof data === "string" ? (0, import_svm_kit9.fromBase64)(data) : data;
|
|
35839
|
+
const r = (0, import_svm_kit9.decodeIdlAccount)(P0_IDL, "MarginfiGroup", bytes2);
|
|
34211
35840
|
return {
|
|
34212
35841
|
address,
|
|
34213
35842
|
admin: r.admin,
|
|
@@ -34240,11 +35869,11 @@ function decodeP0Group(address, data) {
|
|
|
34240
35869
|
};
|
|
34241
35870
|
}
|
|
34242
35871
|
function decodeP0MarginfiAccount(address, data) {
|
|
34243
|
-
const
|
|
34244
|
-
const r = (0,
|
|
35872
|
+
const bytes2 = typeof data === "string" ? (0, import_svm_kit9.fromBase64)(data) : data;
|
|
35873
|
+
const r = (0, import_svm_kit9.decodeIdlAccount)(
|
|
34245
35874
|
P0_IDL,
|
|
34246
35875
|
"MarginfiAccount",
|
|
34247
|
-
|
|
35876
|
+
bytes2
|
|
34248
35877
|
);
|
|
34249
35878
|
const h = r.health_cache;
|
|
34250
35879
|
return {
|
|
@@ -34296,10 +35925,10 @@ var P0_GROUP_SIZE = 9256;
|
|
|
34296
35925
|
var P0_ACCOUNT_GROUP_OFFSET = 8;
|
|
34297
35926
|
var P0_ACCOUNT_AUTHORITY_OFFSET = 8 + 32;
|
|
34298
35927
|
var P0_BANK_GROUP_OFFSET = 8 + 32 + 1;
|
|
34299
|
-
var p0BankMetadataPda = async (bank, programId = P0_PROGRAM_ID) => (await (0,
|
|
35928
|
+
var p0BankMetadataPda = async (bank, programId = P0_PROGRAM_ID) => (await (0, import_svm_kit9.findProgramAddress)([utf84("metadata"), pk4(bank)], programId)).address;
|
|
34300
35929
|
function decodeP0BankMetadata(data) {
|
|
34301
|
-
const
|
|
34302
|
-
const r = (0,
|
|
35930
|
+
const bytes2 = typeof data === "string" ? (0, import_svm_kit9.fromBase64)(data) : data;
|
|
35931
|
+
const r = (0, import_svm_kit9.decodeIdlAccount)(P0_IDL, "BankMetadata", bytes2);
|
|
34303
35932
|
const td = new TextDecoder();
|
|
34304
35933
|
const ticker = td.decode(r.ticker.subarray(0, r.end_ticker_byte)).trim();
|
|
34305
35934
|
const description = td.decode(r.description.subarray(0, r.end_description_byte)).trim();
|
|
@@ -34449,7 +36078,7 @@ function p0CurveKnots(c) {
|
|
|
34449
36078
|
}
|
|
34450
36079
|
|
|
34451
36080
|
// src/vaults/lst/stakePool.ts
|
|
34452
|
-
var
|
|
36081
|
+
var import_svm_kit10 = require("@1delta/svm-kit");
|
|
34453
36082
|
var SPL_STAKE_POOL_PROGRAM = "SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy";
|
|
34454
36083
|
var OFFSET_RESERVE_STAKE = 130;
|
|
34455
36084
|
var OFFSET_POOL_MINT = 162;
|
|
@@ -34478,8 +36107,8 @@ function decodeStakePool(data) {
|
|
|
34478
36107
|
`stake-pool: account is ${data.byteLength} bytes, need \u2265 ${OFFSET_LAST_UPDATE_EPOCH + 8}`
|
|
34479
36108
|
);
|
|
34480
36109
|
const out = {
|
|
34481
|
-
poolMint: (0,
|
|
34482
|
-
reserveStake: (0,
|
|
36110
|
+
poolMint: (0, import_svm_kit10.encodeBase58)(data.slice(OFFSET_POOL_MINT, OFFSET_POOL_MINT + 32)),
|
|
36111
|
+
reserveStake: (0, import_svm_kit10.encodeBase58)(
|
|
34483
36112
|
data.slice(OFFSET_RESERVE_STAKE, OFFSET_RESERVE_STAKE + 32)
|
|
34484
36113
|
),
|
|
34485
36114
|
totalLamports: u642(data, OFFSET_TOTAL_LAMPORTS),
|
|
@@ -34487,7 +36116,7 @@ function decodeStakePool(data) {
|
|
|
34487
36116
|
lastUpdateEpoch: u642(data, OFFSET_LAST_UPDATE_EPOCH)
|
|
34488
36117
|
};
|
|
34489
36118
|
try {
|
|
34490
|
-
const r = new
|
|
36119
|
+
const r = new import_svm_kit10.BorshReader(data);
|
|
34491
36120
|
r.skip(OFFSET_TAIL);
|
|
34492
36121
|
r.skip(8 + 8 + 32);
|
|
34493
36122
|
const epoch = readFee(r);
|
|
@@ -34525,7 +36154,7 @@ async function readStakePools(rpc, stakePools, opts = {}) {
|
|
|
34525
36154
|
const pools = accounts.map((a) => {
|
|
34526
36155
|
if (!a || a.owner !== program) return null;
|
|
34527
36156
|
try {
|
|
34528
|
-
return decodeStakePool((0,
|
|
36157
|
+
return decodeStakePool((0, import_svm_kit10.fromBase64)(a.data[0]));
|
|
34529
36158
|
} catch {
|
|
34530
36159
|
return null;
|
|
34531
36160
|
}
|
|
@@ -34577,7 +36206,127 @@ async function readEpochClock(rpc) {
|
|
|
34577
36206
|
}
|
|
34578
36207
|
|
|
34579
36208
|
// src/lending/public-data/project0/prices.ts
|
|
34580
|
-
var
|
|
36209
|
+
var import_svm_kit12 = require("@1delta/svm-kit");
|
|
36210
|
+
|
|
36211
|
+
// src/prices/oracleAccounts.ts
|
|
36212
|
+
var import_svm_kit11 = require("@1delta/svm-kit");
|
|
36213
|
+
var PYTH_PRICE_UPDATE_OWNERS = /* @__PURE__ */ new Set([
|
|
36214
|
+
"rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ",
|
|
36215
|
+
"rec2HHDDnjLfj4kE7VyEtFA1HPGQLK33259532cRyHp"
|
|
36216
|
+
]);
|
|
36217
|
+
var PYTH_LEGACY_PROGRAM = "FsJ3A3u2vn5cTVofAjvy6y5kwABJAqYWpe4975bi2epH";
|
|
36218
|
+
var SWITCHBOARD_ON_DEMAND_PROGRAM = "SBondMDrcV3K4kxZR1HNVT7osZxAHVHgYXL5Ze1oMUv";
|
|
36219
|
+
var SWITCHBOARD_V2_PROGRAM = "SW1TCH7qEPTdLsDHRgPuMQjbQxKdH2aBStViMFnt64f";
|
|
36220
|
+
var SCOPE_PROGRAM = "HFn8GnPADiny6XqUoWE8uRPPxb29ikn4yTuPa9MF2fWJ";
|
|
36221
|
+
var MARINADE_PROGRAM = "MarBmsSgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD";
|
|
36222
|
+
var bytes = (data) => typeof data === "string" ? (0, import_svm_kit11.fromBase64)(data) : data;
|
|
36223
|
+
var view = (b) => new DataView(b.buffer, b.byteOffset, b.byteLength);
|
|
36224
|
+
var i128 = (b, o) => {
|
|
36225
|
+
const dv = view(b);
|
|
36226
|
+
const lo = dv.getBigUint64(o, true);
|
|
36227
|
+
const hi = dv.getBigInt64(o + 8, true);
|
|
36228
|
+
return (hi << 64n) + lo;
|
|
36229
|
+
};
|
|
36230
|
+
var disc = (b, d2) => d2.every((x, i) => b[i] === x);
|
|
36231
|
+
var SB_PULL_FEED_DISCRIMINATOR = [196, 27, 108, 196, 10, 215, 219, 40];
|
|
36232
|
+
var SB_V2_AGGREGATOR_DISCRIMINATOR = [
|
|
36233
|
+
217,
|
|
36234
|
+
230,
|
|
36235
|
+
65,
|
|
36236
|
+
101,
|
|
36237
|
+
201,
|
|
36238
|
+
162,
|
|
36239
|
+
27,
|
|
36240
|
+
125
|
|
36241
|
+
];
|
|
36242
|
+
var PYTH_LEGACY_MAGIC = 2712847316;
|
|
36243
|
+
function decodeSwitchboardPullFeed(data) {
|
|
36244
|
+
const b = bytes(data);
|
|
36245
|
+
if (!disc(b, SB_PULL_FEED_DISCRIMINATOR) || b.length < 2392)
|
|
36246
|
+
throw new Error("switchboard: account is not a PullFeedAccountData");
|
|
36247
|
+
const dv = view(b);
|
|
36248
|
+
const value = i128(b, 2264);
|
|
36249
|
+
return {
|
|
36250
|
+
kind: "switchboard-on-demand",
|
|
36251
|
+
price: Number(value) / 1e18,
|
|
36252
|
+
updatedAt: Number(dv.getBigInt64(2216, true)),
|
|
36253
|
+
slot: Number(dv.getBigUint64(2368, true)),
|
|
36254
|
+
name: new TextDecoder().decode(b.subarray(2180, 2212)).replace(/\0+$/, "")
|
|
36255
|
+
};
|
|
36256
|
+
}
|
|
36257
|
+
function decodeSwitchboardV2Aggregator(data) {
|
|
36258
|
+
const b = bytes(data);
|
|
36259
|
+
if (!disc(b, SB_V2_AGGREGATOR_DISCRIMINATOR) || b.length < 386)
|
|
36260
|
+
throw new Error("switchboard: account is not an AggregatorAccountData");
|
|
36261
|
+
const dv = view(b);
|
|
36262
|
+
const mantissa = i128(b, 366);
|
|
36263
|
+
const scale = dv.getUint32(382, true);
|
|
36264
|
+
return {
|
|
36265
|
+
kind: "switchboard-v2",
|
|
36266
|
+
price: Number(mantissa) / 10 ** scale,
|
|
36267
|
+
updatedAt: Number(dv.getBigInt64(358, true)),
|
|
36268
|
+
slot: Number(dv.getBigUint64(350, true)),
|
|
36269
|
+
name: new TextDecoder().decode(b.subarray(8, 40)).replace(/\0+$/, "")
|
|
36270
|
+
};
|
|
36271
|
+
}
|
|
36272
|
+
function decodePythLegacyPrice(data) {
|
|
36273
|
+
const b = bytes(data);
|
|
36274
|
+
const dv = view(b);
|
|
36275
|
+
if (b.length < 240 || dv.getUint32(0, true) !== PYTH_LEGACY_MAGIC)
|
|
36276
|
+
throw new Error("pyth: account is not a legacy price account");
|
|
36277
|
+
if (dv.getUint32(8, true) !== 3)
|
|
36278
|
+
throw new Error("pyth: legacy account is not a PRICE account");
|
|
36279
|
+
const expo = dv.getInt32(20, true);
|
|
36280
|
+
return {
|
|
36281
|
+
kind: "pyth-legacy",
|
|
36282
|
+
price: Number(dv.getBigInt64(208, true)) * 10 ** expo,
|
|
36283
|
+
updatedAt: Number(dv.getBigInt64(96, true)),
|
|
36284
|
+
slot: Number(dv.getBigUint64(232, true)),
|
|
36285
|
+
status: dv.getUint32(224, true)
|
|
36286
|
+
};
|
|
36287
|
+
}
|
|
36288
|
+
var SCOPE_PRICES_LEN = 512;
|
|
36289
|
+
function decodeScopePrice(data, index) {
|
|
36290
|
+
const b = bytes(data);
|
|
36291
|
+
if (!Number.isInteger(index) || index < 0 || index >= SCOPE_PRICES_LEN)
|
|
36292
|
+
throw new Error(`scope: entry index ${index} out of range`);
|
|
36293
|
+
const o = 8 + 32 + index * 56;
|
|
36294
|
+
if (b.length < o + 32) throw new Error("scope: account too short");
|
|
36295
|
+
const dv = view(b);
|
|
36296
|
+
const value = dv.getBigUint64(o, true);
|
|
36297
|
+
const exp = Number(dv.getBigUint64(o + 8, true));
|
|
36298
|
+
return {
|
|
36299
|
+
kind: "scope",
|
|
36300
|
+
price: Number(value) / 10 ** exp,
|
|
36301
|
+
updatedAt: Number(dv.getBigUint64(o + 24, true)),
|
|
36302
|
+
slot: Number(dv.getBigUint64(o + 16, true))
|
|
36303
|
+
};
|
|
36304
|
+
}
|
|
36305
|
+
function decodeMarinadeMsolPrice(data) {
|
|
36306
|
+
const b = bytes(data);
|
|
36307
|
+
if (b.length < 520) throw new Error("marinade: account too short");
|
|
36308
|
+
return Number(view(b).getBigUint64(512, true)) / 2 ** 32;
|
|
36309
|
+
}
|
|
36310
|
+
function decodeOracleFeed(account) {
|
|
36311
|
+
const b = bytes(account.data);
|
|
36312
|
+
if (PYTH_PRICE_UPDATE_OWNERS.has(account.owner) && disc(b, PYTH_PRICE_UPDATE_V2_DISCRIMINATOR)) {
|
|
36313
|
+
const p = decodePythPriceUpdate(b);
|
|
36314
|
+
return {
|
|
36315
|
+
kind: "pyth-push",
|
|
36316
|
+
price: p.priceUsd,
|
|
36317
|
+
updatedAt: p.publishTime,
|
|
36318
|
+
slot: p.postedSlot
|
|
36319
|
+
};
|
|
36320
|
+
}
|
|
36321
|
+
if (account.owner === SWITCHBOARD_ON_DEMAND_PROGRAM)
|
|
36322
|
+
return decodeSwitchboardPullFeed(b);
|
|
36323
|
+
if (account.owner === SWITCHBOARD_V2_PROGRAM)
|
|
36324
|
+
return decodeSwitchboardV2Aggregator(b);
|
|
36325
|
+
if (account.owner === PYTH_LEGACY_PROGRAM) return decodePythLegacyPrice(b);
|
|
36326
|
+
return void 0;
|
|
36327
|
+
}
|
|
36328
|
+
|
|
36329
|
+
// src/lending/public-data/project0/prices.ts
|
|
34581
36330
|
var P0_PYTH_PUSH_SETUPS = /* @__PURE__ */ new Set([
|
|
34582
36331
|
"PythPushOracle",
|
|
34583
36332
|
"StakedWithPythPush",
|
|
@@ -34615,6 +36364,7 @@ var stakePoolKeyOf = (b) => {
|
|
|
34615
36364
|
return void 0;
|
|
34616
36365
|
}
|
|
34617
36366
|
};
|
|
36367
|
+
var marinadeKeyOf = (b) => b.config.oracleSetup === "PythMSOL" ? b.config.oracleKeys[1] : void 0;
|
|
34618
36368
|
var isP0FixedSetup = (setup) => setup.startsWith("Fixed");
|
|
34619
36369
|
var P0_STAKE_POOL_PROGRAMS = /* @__PURE__ */ new Set([
|
|
34620
36370
|
SPL_STAKE_POOL_PROGRAM,
|
|
@@ -34625,6 +36375,8 @@ var DRIFT_SCALED_BALANCE_DECIMALS = 9;
|
|
|
34625
36375
|
async function resolveP0Prices(rpc, banks, opts = {}) {
|
|
34626
36376
|
const pythKeys = /* @__PURE__ */ new Set();
|
|
34627
36377
|
const poolKeys = /* @__PURE__ */ new Set();
|
|
36378
|
+
const marinadeKeys = /* @__PURE__ */ new Set();
|
|
36379
|
+
const scopeKeys = /* @__PURE__ */ new Set();
|
|
34628
36380
|
if (!opts.cacheOnly && rpc)
|
|
34629
36381
|
for (const b of banks) {
|
|
34630
36382
|
if (P0_PYTH_PUSH_SETUPS.has(b.config.oracleSetup)) {
|
|
@@ -34633,12 +36385,20 @@ async function resolveP0Prices(rpc, banks, opts = {}) {
|
|
|
34633
36385
|
}
|
|
34634
36386
|
const pool = stakePoolKeyOf(b);
|
|
34635
36387
|
if (!isNullKey(pool)) poolKeys.add(pool);
|
|
36388
|
+
const msol = marinadeKeyOf(b);
|
|
36389
|
+
if (!isNullKey(msol)) marinadeKeys.add(msol);
|
|
36390
|
+
if (b.config.oracleSetup === "Scope") {
|
|
36391
|
+
const k = b.config.oracleKeys[0];
|
|
36392
|
+
if (!isNullKey(k)) scopeKeys.add(k);
|
|
36393
|
+
}
|
|
34636
36394
|
}
|
|
34637
36395
|
const pyth = {};
|
|
34638
36396
|
const poolRate = {};
|
|
36397
|
+
const msolRate = {};
|
|
36398
|
+
const scopeData = {};
|
|
34639
36399
|
let slot = 0;
|
|
34640
|
-
if (pythKeys.size || poolKeys.size) {
|
|
34641
|
-
const keys = [...pythKeys, ...poolKeys];
|
|
36400
|
+
if (pythKeys.size || poolKeys.size || marinadeKeys.size || scopeKeys.size) {
|
|
36401
|
+
const keys = [...pythKeys, ...poolKeys, ...marinadeKeys, ...scopeKeys];
|
|
34642
36402
|
const res = await rpc.readAccounts(keys, { encoding: "base64" });
|
|
34643
36403
|
slot = res.slot;
|
|
34644
36404
|
res.accounts.forEach((a, i) => {
|
|
@@ -34648,8 +36408,15 @@ async function resolveP0Prices(rpc, banks, opts = {}) {
|
|
|
34648
36408
|
if (pythKeys.has(key2)) {
|
|
34649
36409
|
if (a.owner === PYTH_RECEIVER_PROGRAM)
|
|
34650
36410
|
pyth[key2] = decodePythPriceUpdate(a.data[0]);
|
|
36411
|
+
} else if (marinadeKeys.has(key2)) {
|
|
36412
|
+
if (a.owner === MARINADE_PROGRAM) {
|
|
36413
|
+
const r = decodeMarinadeMsolPrice(a.data[0]);
|
|
36414
|
+
if (r > 0) msolRate[key2] = r;
|
|
36415
|
+
}
|
|
36416
|
+
} else if (scopeKeys.has(key2)) {
|
|
36417
|
+
if (a.owner === SCOPE_PROGRAM) scopeData[key2] = (0, import_svm_kit12.fromBase64)(a.data[0]);
|
|
34651
36418
|
} else if (P0_STAKE_POOL_PROGRAMS.has(a.owner)) {
|
|
34652
|
-
const p = decodeStakePool((0,
|
|
36419
|
+
const p = decodeStakePool((0, import_svm_kit12.fromBase64)(a.data[0]));
|
|
34653
36420
|
if (p.poolTokenSupply > 0n)
|
|
34654
36421
|
poolRate[key2] = Number(p.totalLamports) / Number(p.poolTokenSupply);
|
|
34655
36422
|
}
|
|
@@ -34676,8 +36443,15 @@ async function resolveP0Prices(rpc, banks, opts = {}) {
|
|
|
34676
36443
|
}
|
|
34677
36444
|
const feed = b.config.oracleKeys[0];
|
|
34678
36445
|
const live = feed && !isNullKey(feed) ? pyth[feed] : void 0;
|
|
34679
|
-
const pool = stakePoolKeyOf(b);
|
|
34680
|
-
const liveRate = pool ? poolRate[pool] : void 0;
|
|
36446
|
+
const pool = stakePoolKeyOf(b) ?? marinadeKeyOf(b);
|
|
36447
|
+
const liveRate = pool ? poolRate[pool] ?? msolRate[pool] : void 0;
|
|
36448
|
+
let scope;
|
|
36449
|
+
if (setup === "Scope" && feed && scopeData[feed])
|
|
36450
|
+
try {
|
|
36451
|
+
scope = decodeScopePrice(scopeData[feed], b.config.scopeEntryIndex);
|
|
36452
|
+
} catch (e) {
|
|
36453
|
+
console.warn(`[project0] scope ${feed}: ${e.message}`);
|
|
36454
|
+
}
|
|
34681
36455
|
let liveMult = 1;
|
|
34682
36456
|
let liveMultNote = "";
|
|
34683
36457
|
if (P0_CACHED_PRICE_MULTIPLIER_SETUPS.has(setup)) {
|
|
@@ -34685,7 +36459,7 @@ async function resolveP0Prices(rpc, banks, opts = {}) {
|
|
|
34685
36459
|
liveMultNote = `cached SVSP rate ${cacheMult?.toFixed(6)} as of ${cacheTs}`;
|
|
34686
36460
|
} else if (P0_ADJUSTED_CACHE_SETUPS.has(setup)) {
|
|
34687
36461
|
liveMult = liveRate ?? null;
|
|
34688
|
-
liveMultNote = liveRate ?
|
|
36462
|
+
liveMultNote = liveRate ? `${msolRate[pool] ? "Marinade state" : "SPL stake pool"} ${pool} rate ${liveRate.toFixed(6)}` : "";
|
|
34689
36463
|
}
|
|
34690
36464
|
let out;
|
|
34691
36465
|
if (isP0FixedSetup(setup)) {
|
|
@@ -34702,6 +36476,15 @@ async function resolveP0Prices(rpc, banks, opts = {}) {
|
|
|
34702
36476
|
multiplier: 1,
|
|
34703
36477
|
description: `admin-set fixed price (${setup})`
|
|
34704
36478
|
};
|
|
36479
|
+
} else if (scope && scope.price > 0) {
|
|
36480
|
+
out = {
|
|
36481
|
+
priceUsd: scope.price,
|
|
36482
|
+
source: "scope",
|
|
36483
|
+
updatedAt: scope.updatedAt || void 0,
|
|
36484
|
+
multiplier: 1,
|
|
36485
|
+
feed,
|
|
36486
|
+
description: `Scope ${feed} entry ${b.config.scopeEntryIndex} (${setup})`
|
|
36487
|
+
};
|
|
34705
36488
|
} else if (live && liveMult !== null && liveMult > 0) {
|
|
34706
36489
|
out = {
|
|
34707
36490
|
priceUsd: live.priceUsd * liveMult,
|
|
@@ -35161,13 +36944,13 @@ function deriveP0Mode(liabilityTags, roster) {
|
|
|
35161
36944
|
}
|
|
35162
36945
|
|
|
35163
36946
|
// src/lending/public-data/project0/fetchPublic.ts
|
|
35164
|
-
var
|
|
36947
|
+
var import_svm_kit13 = require("@1delta/svm-kit");
|
|
35165
36948
|
async function fetchProject0Public(opts = {}) {
|
|
35166
36949
|
const api = createP0Api(opts);
|
|
35167
36950
|
const groups = opts.groups?.length ? opts.groups : [P0_MAIN_GROUP];
|
|
35168
36951
|
const source = opts.source ?? "chain";
|
|
35169
36952
|
const roster = opts.roster ?? "scan";
|
|
35170
|
-
const rpc = source === "chain" || roster === "scan" || !opts.prices?.cacheOnly ? opts.rpc ?? (0,
|
|
36953
|
+
const rpc = source === "chain" || roster === "scan" || !opts.prices?.cacheOnly ? opts.rpc ?? (0, import_svm_kit13.createSvmRpc)() : opts.rpc;
|
|
35171
36954
|
const out = {};
|
|
35172
36955
|
for (const group of groups) {
|
|
35173
36956
|
let banks = [];
|
|
@@ -35282,6 +37065,7 @@ async function getLenderPublicData(chainId, opts = {}) {
|
|
|
35282
37065
|
}
|
|
35283
37066
|
|
|
35284
37067
|
// src/lending/public-data/getLenderPublicDataAll.ts
|
|
37068
|
+
var import_svm_kit14 = require("@1delta/svm-kit");
|
|
35285
37069
|
init_types();
|
|
35286
37070
|
init_lenders();
|
|
35287
37071
|
|
|
@@ -35406,12 +37190,15 @@ async function getLenderPublicDataAll(chainId, lenders, opts = {}) {
|
|
|
35406
37190
|
if (chainId !== SOLANA_CHAIN_ID)
|
|
35407
37191
|
throw new Error(`getLenderPublicDataAll: unsupported chain ${chainId}`);
|
|
35408
37192
|
const out = {};
|
|
37193
|
+
const needsSlot = opts.rpc && (lenders.some(import_lender_registry2.isSave) && opts.save?.avgSlotSeconds === void 0 || lenders.some(import_lender_registry2.isKamino) && opts.kamino?.slotSeconds === void 0);
|
|
37194
|
+
const slotSeconds = needsSlot ? await (0, import_svm_kit14.measureSlotSeconds)(opts.rpc) : void 0;
|
|
35409
37195
|
const kaminoKeys = lenders.filter(import_lender_registry2.isKamino);
|
|
35410
37196
|
if (kaminoKeys.length) {
|
|
35411
37197
|
const explicit = kaminoKeys.map(import_lender_registry2.kaminoMarketFromKey).filter((m) => !!m);
|
|
35412
37198
|
const wantsAll = kaminoKeys.some((k) => !(0, import_lender_registry2.kaminoMarketFromKey)(k));
|
|
35413
37199
|
const res = await fetchKaminoPublic({
|
|
35414
37200
|
...opts.kamino,
|
|
37201
|
+
slotSeconds: opts.kamino?.slotSeconds ?? slotSeconds,
|
|
35415
37202
|
rpc: opts.kamino?.rpc ?? opts.rpc,
|
|
35416
37203
|
tokenList: opts.tokenList ?? opts.kamino?.tokenList,
|
|
35417
37204
|
...wantsAll ? {} : { markets: explicit }
|
|
@@ -35451,6 +37238,7 @@ async function getLenderPublicDataAll(chainId, lenders, opts = {}) {
|
|
|
35451
37238
|
const wantsAll = saveKeys.some((k) => !(0, import_lender_registry2.saveMarketFromKey)(k));
|
|
35452
37239
|
const res = await fetchSavePublic({
|
|
35453
37240
|
...opts.save,
|
|
37241
|
+
avgSlotSeconds: opts.save?.avgSlotSeconds ?? slotSeconds,
|
|
35454
37242
|
tokenList: opts.tokenList ?? opts.save?.tokenList,
|
|
35455
37243
|
...wantsAll ? {} : { markets: explicit }
|
|
35456
37244
|
});
|
|
@@ -35630,9 +37418,9 @@ function liquidityRatio(liquidity, totalAssets) {
|
|
|
35630
37418
|
// src/vaults/jupiter-lend/index.ts
|
|
35631
37419
|
function convertJupiterLendEarnToken(market, t, tokenList) {
|
|
35632
37420
|
const price = num(t.asset.price);
|
|
35633
|
-
const
|
|
35634
|
-
const totalAssetsFormatted = Number(t.totalAssets) / 10 **
|
|
35635
|
-
const liquidityFormatted = Number(t.liquiditySupplyData.withdrawable) / 10 **
|
|
37421
|
+
const dec2 = t.asset.decimals;
|
|
37422
|
+
const totalAssetsFormatted = Number(t.totalAssets) / 10 ** dec2;
|
|
37423
|
+
const liquidityFormatted = Number(t.liquiditySupplyData.withdrawable) / 10 ** dec2;
|
|
35636
37424
|
const sharePrice = Number(t.convertToAssets) / 10 ** t.decimals;
|
|
35637
37425
|
const supplyRate = bpsToPercent(t.supplyRate);
|
|
35638
37426
|
const rewardsRate = bpsToPercent(t.rewardsRate);
|
|
@@ -35641,7 +37429,7 @@ function convertJupiterLendEarnToken(market, t, tokenList) {
|
|
|
35641
37429
|
address: t.assetAddress,
|
|
35642
37430
|
symbol: t.asset.uiSymbol,
|
|
35643
37431
|
name: t.asset.name,
|
|
35644
|
-
decimals:
|
|
37432
|
+
decimals: dec2,
|
|
35645
37433
|
...t.asset.logoUrl ? { logoURI: t.asset.logoUrl } : {}
|
|
35646
37434
|
};
|
|
35647
37435
|
return {
|
|
@@ -35656,7 +37444,7 @@ function convertJupiterLendEarnToken(market, t, tokenList) {
|
|
|
35656
37444
|
displayName: `Jupiter Lend ${t.asset.uiSymbol}`,
|
|
35657
37445
|
curatorName: "Jupiter",
|
|
35658
37446
|
decimals: t.decimals,
|
|
35659
|
-
assetDecimals:
|
|
37447
|
+
assetDecimals: dec2,
|
|
35660
37448
|
totalAssets: t.totalAssets,
|
|
35661
37449
|
totalSupply: t.totalSupply,
|
|
35662
37450
|
convertToShares: t.convertToShares,
|
|
@@ -35917,7 +37705,7 @@ async function fetchExponentPtMarkets(opts = {}) {
|
|
|
35917
37705
|
}
|
|
35918
37706
|
|
|
35919
37707
|
// src/vaults/solstice/accounts.ts
|
|
35920
|
-
var
|
|
37708
|
+
var import_svm_kit15 = require("@1delta/svm-kit");
|
|
35921
37709
|
|
|
35922
37710
|
// src/vaults/solstice/idl/yield_strategy.json
|
|
35923
37711
|
var yield_strategy_default = {
|
|
@@ -46586,14 +48374,14 @@ var SOLSTICE_MINTS = {
|
|
|
46586
48374
|
var SOLSTICE_STRATEGIES = ["STRC-USX"];
|
|
46587
48375
|
var SOLSTICE_DECIMALS = 6;
|
|
46588
48376
|
var SOLSTICE_PRICE_DECIMALS = 6;
|
|
46589
|
-
var
|
|
46590
|
-
var
|
|
46591
|
-
const b = (0,
|
|
48377
|
+
var utf85 = (s) => new TextEncoder().encode(s);
|
|
48378
|
+
var pk5 = (address) => {
|
|
48379
|
+
const b = (0, import_svm_kit15.decodeBase58)(address);
|
|
46592
48380
|
if (!b || b.length !== 32)
|
|
46593
48381
|
throw new Error(`solstice: not a 32-byte pubkey: ${address}`);
|
|
46594
48382
|
return b;
|
|
46595
48383
|
};
|
|
46596
|
-
var pda = async (seeds, programId) => (await (0,
|
|
48384
|
+
var pda = async (seeds, programId) => (await (0, import_svm_kit15.findProgramAddress)(seeds, programId)).address;
|
|
46597
48385
|
async function yieldVaultPdas(programId = SOLSTICE_PROGRAMS.yieldVault) {
|
|
46598
48386
|
const [controller, yieldPool, vestingSchedule, shareMint, assetVault] = await Promise.all(
|
|
46599
48387
|
[
|
|
@@ -46602,19 +48390,19 @@ async function yieldVaultPdas(programId = SOLSTICE_PROGRAMS.yieldVault) {
|
|
|
46602
48390
|
"VESTING_SCHEDULE",
|
|
46603
48391
|
"SHARE_MINT",
|
|
46604
48392
|
"ASSET_VAULT"
|
|
46605
|
-
].map((s) => pda([
|
|
48393
|
+
].map((s) => pda([utf85(s)], programId))
|
|
46606
48394
|
);
|
|
46607
48395
|
return { controller, yieldPool, vestingSchedule, shareMint, assetVault };
|
|
46608
48396
|
}
|
|
46609
48397
|
async function yieldVaultCooldownPdas(user, programId = SOLSTICE_PROGRAMS.yieldVault) {
|
|
46610
48398
|
const [escrow, escrowVault] = await Promise.all([
|
|
46611
|
-
pda([
|
|
46612
|
-
pda([
|
|
48399
|
+
pda([utf85("COOLDOWN_ESCROW"), pk5(user)], programId),
|
|
48400
|
+
pda([utf85("COOLDOWN_ESCROW_VAULT"), pk5(user)], programId)
|
|
46613
48401
|
]);
|
|
46614
48402
|
return { escrow, escrowVault };
|
|
46615
48403
|
}
|
|
46616
48404
|
async function strategyPdas(name, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
|
|
46617
|
-
const n =
|
|
48405
|
+
const n = utf85(name);
|
|
46618
48406
|
if (n.length < 1 || n.length > 32)
|
|
46619
48407
|
throw new Error(`solstice: strategy name must be 1..=32 bytes: ${name}`);
|
|
46620
48408
|
const [
|
|
@@ -46626,13 +48414,13 @@ async function strategyPdas(name, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
|
|
|
46626
48414
|
assetVault,
|
|
46627
48415
|
feeVault
|
|
46628
48416
|
] = await Promise.all([
|
|
46629
|
-
pda([
|
|
46630
|
-
pda([
|
|
46631
|
-
pda([
|
|
46632
|
-
pda([
|
|
46633
|
-
pda([
|
|
46634
|
-
pda([
|
|
46635
|
-
pda([
|
|
48417
|
+
pda([utf85("CONTROLLER")], programId),
|
|
48418
|
+
pda([utf85("STRATEGY"), n], programId),
|
|
48419
|
+
pda([utf85("ACCOUNTING"), n], programId),
|
|
48420
|
+
pda([utf85("JUNIOR_MINT"), n], programId),
|
|
48421
|
+
pda([utf85("SENIOR_MINT"), n], programId),
|
|
48422
|
+
pda([utf85("ASSET_VAULT"), n], programId),
|
|
48423
|
+
pda([utf85("FEE_VAULT"), n], programId)
|
|
46636
48424
|
]);
|
|
46637
48425
|
return {
|
|
46638
48426
|
name,
|
|
@@ -46647,10 +48435,10 @@ async function strategyPdas(name, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
|
|
|
46647
48435
|
}
|
|
46648
48436
|
async function settlementBatchPdas(strategyName, batchName, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
|
|
46649
48437
|
const seeds = (tag) => [
|
|
46650
|
-
|
|
46651
|
-
|
|
48438
|
+
utf85(tag),
|
|
48439
|
+
utf85(strategyName),
|
|
46652
48440
|
Uint8Array.of(0),
|
|
46653
|
-
|
|
48441
|
+
utf85(batchName)
|
|
46654
48442
|
];
|
|
46655
48443
|
const [batch, shareVault, assetVault] = await Promise.all([
|
|
46656
48444
|
pda(seeds("SETTLEMENT_BATCH"), programId),
|
|
@@ -46659,38 +48447,38 @@ async function settlementBatchPdas(strategyName, batchName, programId = SOLSTICE
|
|
|
46659
48447
|
]);
|
|
46660
48448
|
return { batch, shareVault, assetVault };
|
|
46661
48449
|
}
|
|
46662
|
-
var juniorUnlockSharePda = (batch, user, programId = SOLSTICE_PROGRAMS.yieldStrategy) => pda([
|
|
48450
|
+
var juniorUnlockSharePda = (batch, user, programId = SOLSTICE_PROGRAMS.yieldStrategy) => pda([utf85("JUNIOR_UNLOCK_SHARE"), pk5(batch), pk5(user)], programId);
|
|
46663
48451
|
async function seniorCooldownPdas(strategyName, user, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
|
|
46664
48452
|
const [cooldown, cooldownVault] = await Promise.all([
|
|
46665
48453
|
pda(
|
|
46666
|
-
[
|
|
48454
|
+
[utf85("SENIOR_UNLOCK_COOLDOWN"), utf85(strategyName), pk5(user)],
|
|
46667
48455
|
programId
|
|
46668
48456
|
),
|
|
46669
48457
|
pda(
|
|
46670
|
-
[
|
|
48458
|
+
[utf85("SENIOR_COOLDOWN_VAULT"), utf85(strategyName), pk5(user)],
|
|
46671
48459
|
programId
|
|
46672
48460
|
)
|
|
46673
48461
|
]);
|
|
46674
48462
|
return { cooldown, cooldownVault };
|
|
46675
48463
|
}
|
|
46676
|
-
var oracleCanonicalPda = (feedId, programId = SOLSTICE_PROGRAMS.oracle) => pda([
|
|
48464
|
+
var oracleCanonicalPda = (feedId, programId = SOLSTICE_PROGRAMS.oracle) => pda([utf85("CANONICAL"), utf85(feedId)], programId);
|
|
46677
48465
|
var strategyNameOf = (raw2) => new TextDecoder().decode(raw2).replace(/\0+$/, "");
|
|
46678
48466
|
var YV = SOLSTICE_YIELD_VAULT_IDL;
|
|
46679
48467
|
var YS = SOLSTICE_YIELD_STRATEGY_IDL;
|
|
46680
|
-
var decodeController = (d2) => (0,
|
|
46681
|
-
var decodeYieldPool = (d2) => (0,
|
|
46682
|
-
var decodeVestingSchedule = (d2) => (0,
|
|
46683
|
-
var decodeCooldownEscrow = (d2) => (0,
|
|
46684
|
-
var decodeStrategyController = (d2) => (0,
|
|
46685
|
-
var decodeStrategy = (d2) => (0,
|
|
46686
|
-
var decodeAccountingState = (d2) => (0,
|
|
46687
|
-
var decodeSettlementBatch = (d2) => (0,
|
|
46688
|
-
var decodeJuniorUnlockShare = (d2) => (0,
|
|
46689
|
-
var decodeSeniorUnlockCooldown = (d2) => (0,
|
|
48468
|
+
var decodeController = (d2) => (0, import_svm_kit15.decodeIdlAccount)(YV, "Controller", d2);
|
|
48469
|
+
var decodeYieldPool = (d2) => (0, import_svm_kit15.decodeIdlAccount)(YV, "YieldPool", d2);
|
|
48470
|
+
var decodeVestingSchedule = (d2) => (0, import_svm_kit15.decodeIdlAccount)(YV, "VestingSchedule", d2);
|
|
48471
|
+
var decodeCooldownEscrow = (d2) => (0, import_svm_kit15.decodeIdlAccount)(YV, "CooldownEscrow", d2);
|
|
48472
|
+
var decodeStrategyController = (d2) => (0, import_svm_kit15.decodeIdlAccount)(YS, "Controller", d2);
|
|
48473
|
+
var decodeStrategy = (d2) => (0, import_svm_kit15.decodeIdlAccount)(YS, "Strategy", d2);
|
|
48474
|
+
var decodeAccountingState = (d2) => (0, import_svm_kit15.decodeIdlAccount)(YS, "AccountingState", d2);
|
|
48475
|
+
var decodeSettlementBatch = (d2) => (0, import_svm_kit15.decodeIdlAccount)(YS, "SettlementBatch", d2);
|
|
48476
|
+
var decodeJuniorUnlockShare = (d2) => (0, import_svm_kit15.decodeIdlAccount)(YS, "JuniorUnlockShare", d2);
|
|
48477
|
+
var decodeSeniorUnlockCooldown = (d2) => (0, import_svm_kit15.decodeIdlAccount)(YS, "SeniorUnlockCooldown", d2);
|
|
46690
48478
|
function accountDiscriminator(idl, name) {
|
|
46691
48479
|
const a = idl.accounts.find((x) => x.name === name);
|
|
46692
48480
|
if (!a) throw new Error(`idl ${idl.metadata?.name}: no account ${name}`);
|
|
46693
|
-
return (0,
|
|
48481
|
+
return (0, import_svm_kit15.encodeBase58)(Uint8Array.from(a.discriminator));
|
|
46694
48482
|
}
|
|
46695
48483
|
var SETTLEMENT_BATCH_SIZE = 309;
|
|
46696
48484
|
var ORACLE_CANONICAL_SIZE = 365;
|
|
@@ -46733,7 +48521,7 @@ function tokenAmount(data) {
|
|
|
46733
48521
|
}
|
|
46734
48522
|
var need = (a, what) => {
|
|
46735
48523
|
if (!a) throw new Error(`solstice: ${what} account is missing`);
|
|
46736
|
-
return (0,
|
|
48524
|
+
return (0, import_svm_kit15.fromBase64)(a.data[0]);
|
|
46737
48525
|
};
|
|
46738
48526
|
async function readSolsticeChainState(rpc, opts = {}) {
|
|
46739
48527
|
const programs = { ...SOLSTICE_PROGRAMS, ...opts.programs };
|
|
@@ -46798,7 +48586,7 @@ async function readSolsticeChainState(rpc, opts = {}) {
|
|
|
46798
48586
|
const raw2 = r.accounts[j++];
|
|
46799
48587
|
s.oracleAccount = feeds[i];
|
|
46800
48588
|
if (raw2)
|
|
46801
|
-
s.oracle = decodeOracleCanonical((0,
|
|
48589
|
+
s.oracle = decodeOracleCanonical((0, import_svm_kit15.fromBase64)(raw2.data[0])) ?? void 0;
|
|
46802
48590
|
});
|
|
46803
48591
|
}
|
|
46804
48592
|
return { slot, yieldVault, strategies };
|
|
@@ -46815,7 +48603,7 @@ function createSolsticeAppApi(opts = {}) {
|
|
|
46815
48603
|
}
|
|
46816
48604
|
|
|
46817
48605
|
// src/vaults/solstice/math.ts
|
|
46818
|
-
var
|
|
48606
|
+
var SECONDS_PER_YEAR3 = 31536000n;
|
|
46819
48607
|
var bigMax0 = (v) => v > 0n ? v : 0n;
|
|
46820
48608
|
function unvestedAt(amount, start, end, now) {
|
|
46821
48609
|
if (start === 0n && end === 0n) return 0n;
|
|
@@ -46854,7 +48642,7 @@ function eusxAssetsToShares(assets, r) {
|
|
|
46854
48642
|
function epochRatePercent(vesting, assetsIncludingVesting, epochSeconds) {
|
|
46855
48643
|
const principal = assetsIncludingVesting - vesting;
|
|
46856
48644
|
if (vesting < 0n || principal <= 0n || epochSeconds <= 0n) return void 0;
|
|
46857
|
-
const perYear = Number(
|
|
48645
|
+
const perYear = Number(SECONDS_PER_YEAR3) / Number(epochSeconds);
|
|
46858
48646
|
return Number(vesting) / Number(principal) * perYear * 100;
|
|
46859
48647
|
}
|
|
46860
48648
|
var eusxEpochRatePercent = (pool, vesting) => epochRatePercent(
|
|
@@ -46911,12 +48699,12 @@ function strategyMode(s, oraclePriceUsd, priceDecimals = 6) {
|
|
|
46911
48699
|
|
|
46912
48700
|
// src/vaults/solstice/fetchPublic.ts
|
|
46913
48701
|
init_types();
|
|
46914
|
-
var
|
|
48702
|
+
var import_svm_kit16 = require("@1delta/svm-kit");
|
|
46915
48703
|
var SCALE = 10 ** SOLSTICE_DECIMALS;
|
|
46916
48704
|
var fmt3 = (raw2) => Number(raw2) / SCALE;
|
|
46917
48705
|
var BATCH_STATUS = ["active", "cancelled", "settled"];
|
|
46918
48706
|
async function fetchSolsticeSettlementBatches(rpc, strategyName, juniorQueueTimeSeconds, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
|
|
46919
|
-
const fetchers = (0,
|
|
48707
|
+
const fetchers = (0, import_svm_kit16.createSvmFetchers)(rpc);
|
|
46920
48708
|
const rows = await fetchers.indexed.scanProgram(
|
|
46921
48709
|
programId,
|
|
46922
48710
|
[
|
|
@@ -46934,7 +48722,7 @@ async function fetchSolsticeSettlementBatches(rpc, strategyName, juniorQueueTime
|
|
|
46934
48722
|
);
|
|
46935
48723
|
const out = [];
|
|
46936
48724
|
for (const r of rows) {
|
|
46937
|
-
const b = decodeSettlementBatch((0,
|
|
48725
|
+
const b = decodeSettlementBatch((0, import_svm_kit16.fromBase64)(r.account.data[0]));
|
|
46938
48726
|
if (strategyNameOf(b.strategy_name) !== strategyName) continue;
|
|
46939
48727
|
const settlementTime = Number(b.settlement_time);
|
|
46940
48728
|
out.push({
|
|
@@ -47200,7 +48988,7 @@ function buildSolsticeVaults(state, ctx) {
|
|
|
47200
48988
|
return out;
|
|
47201
48989
|
}
|
|
47202
48990
|
async function fetchSolsticeVaults(opts = {}) {
|
|
47203
|
-
const rpc = opts.rpc ?? (0,
|
|
48991
|
+
const rpc = opts.rpc ?? (0, import_svm_kit16.createSvmRpc)();
|
|
47204
48992
|
const nowSecs = opts.nowSecs ?? Math.floor(Date.now() / 1e3);
|
|
47205
48993
|
const tokenList = opts.tokenList ?? {};
|
|
47206
48994
|
const state = await readSolsticeChainState(rpc, {
|
|
@@ -47239,15 +49027,15 @@ async function fetchSolsticeVaults(opts = {}) {
|
|
|
47239
49027
|
|
|
47240
49028
|
// src/vaults/solstice/fetchUser.ts
|
|
47241
49029
|
init_types();
|
|
47242
|
-
var
|
|
49030
|
+
var import_svm_kit17 = require("@1delta/svm-kit");
|
|
47243
49031
|
async function fetchSolsticeUser(account, opts = {}) {
|
|
47244
|
-
const rpc = opts.rpc ?? (0,
|
|
49032
|
+
const rpc = opts.rpc ?? (0, import_svm_kit17.createSvmRpc)();
|
|
47245
49033
|
const vaults = opts.vaults ?? await fetchSolsticeVaults({ ...opts, rpc });
|
|
47246
49034
|
const rows = Object.values(vaults);
|
|
47247
49035
|
const nowSecs = opts.nowSecs ?? Math.floor(Date.now() / 1e3);
|
|
47248
49036
|
const atas = await Promise.all(
|
|
47249
49037
|
rows.map(
|
|
47250
|
-
(r) => (0,
|
|
49038
|
+
(r) => (0, import_svm_kit17.getAssociatedTokenAddress)(account, r.address, import_svm_kit17.TOKEN_PROGRAM)
|
|
47251
49039
|
)
|
|
47252
49040
|
);
|
|
47253
49041
|
const eusx = rows.find((r) => r.kind === "yield-vault");
|
|
@@ -47277,10 +49065,10 @@ async function fetchSolsticeUser(account, opts = {}) {
|
|
|
47277
49065
|
const { slot, accounts } = await rpc.readAccounts(keys);
|
|
47278
49066
|
let i = 0;
|
|
47279
49067
|
const next = () => accounts[i++] ?? null;
|
|
47280
|
-
const
|
|
49068
|
+
const bytes2 = (a) => a ? (0, import_svm_kit17.fromBase64)(a.data[0]) : void 0;
|
|
47281
49069
|
const holdings = [];
|
|
47282
49070
|
rows.forEach((r, k) => {
|
|
47283
|
-
const d2 =
|
|
49071
|
+
const d2 = bytes2(next());
|
|
47284
49072
|
if (!d2) return;
|
|
47285
49073
|
const shares = tokenAmount(d2);
|
|
47286
49074
|
if (shares === 0n) return;
|
|
@@ -47302,7 +49090,7 @@ async function fetchSolsticeUser(account, opts = {}) {
|
|
|
47302
49090
|
const pending = [];
|
|
47303
49091
|
const usd = (raw2, r) => Number(raw2) / 10 ** r.assetDecimals * (r.priceUsd ?? 0);
|
|
47304
49092
|
if (eusx && escrow) {
|
|
47305
|
-
const d2 =
|
|
49093
|
+
const d2 = bytes2(next());
|
|
47306
49094
|
if (d2) {
|
|
47307
49095
|
const e = decodeCooldownEscrow(d2);
|
|
47308
49096
|
if (e.asset_amount > 0n)
|
|
@@ -47320,7 +49108,7 @@ async function fetchSolsticeUser(account, opts = {}) {
|
|
|
47320
49108
|
}
|
|
47321
49109
|
}
|
|
47322
49110
|
seniors.forEach((r, k) => {
|
|
47323
|
-
const d2 =
|
|
49111
|
+
const d2 = bytes2(next());
|
|
47324
49112
|
if (!d2) return;
|
|
47325
49113
|
const c = decodeSeniorUnlockCooldown(d2);
|
|
47326
49114
|
if (c.assets_pending === 0n) return;
|
|
@@ -47340,7 +49128,7 @@ async function fetchSolsticeUser(account, opts = {}) {
|
|
|
47340
49128
|
});
|
|
47341
49129
|
});
|
|
47342
49130
|
for (const j of juniorRecords) {
|
|
47343
|
-
const d2 =
|
|
49131
|
+
const d2 = bytes2(next());
|
|
47344
49132
|
if (!d2) continue;
|
|
47345
49133
|
const u = decodeJuniorUnlockShare(d2);
|
|
47346
49134
|
if (u.shares === 0n) continue;
|
|
@@ -63440,7 +65228,7 @@ var HUMA_SEEDS = {
|
|
|
63440
65228
|
};
|
|
63441
65229
|
|
|
63442
65230
|
// src/vaults/huma/accounts.ts
|
|
63443
|
-
var
|
|
65231
|
+
var import_svm_kit18 = require("@1delta/svm-kit");
|
|
63444
65232
|
var HUMA_POOL = {
|
|
63445
65233
|
poolConfig: "28hFhD21Nka3stL27a8zZ4nRLgaDVxRYwJgeEVgeakzS",
|
|
63446
65234
|
poolId: "sFp7QFGknaW37xRFfdRwbC4QhM1n7Y9sJkYL4vnqXRn",
|
|
@@ -63453,21 +65241,21 @@ var HUMA_POOL = {
|
|
|
63453
65241
|
var HUMA_MPST_MINT = "HUPfpnsaJtJGpJxAPNX1vXah7BgYiQYt1c2JMgMumvPs";
|
|
63454
65242
|
var HUMA_CLASSIC_MODE_ID = "Fr2BGzmFkufAUXNWSWk79juyWrHVCj8AbyzbbvZzhwgz";
|
|
63455
65243
|
var HUMA_DECIMALS = 6;
|
|
63456
|
-
var
|
|
63457
|
-
var
|
|
63458
|
-
const b = (0,
|
|
65244
|
+
var utf86 = (s) => new TextEncoder().encode(s);
|
|
65245
|
+
var pk6 = (address) => {
|
|
65246
|
+
const b = (0, import_svm_kit18.decodeBase58)(address);
|
|
63459
65247
|
if (!b || b.length !== 32) throw new Error(`huma: bad pubkey ${address}`);
|
|
63460
65248
|
return b;
|
|
63461
65249
|
};
|
|
63462
|
-
var pda2 = (seeds) => (0,
|
|
63463
|
-
var humaPoolConfigPda = () => pda2([
|
|
63464
|
-
var humaPoolStatePda = () => pda2([
|
|
63465
|
-
var humaPoolAuthorityPda = () => pda2([
|
|
63466
|
-
var humaModeConfigPda = (modeId) => pda2([
|
|
63467
|
-
var humaModeMintPda = (modeConfig) => pda2([
|
|
63468
|
-
var humaLenderStatePda = (modeConfig, lender) => pda2([
|
|
63469
|
-
var humaDeploymentStatePda = (deploymentConfig) => pda2([
|
|
63470
|
-
var humaRedemptionRequestPda = (id, poolConfig) => pda2([
|
|
65250
|
+
var pda2 = (seeds) => (0, import_svm_kit18.findProgramAddress)(seeds, HUMA_PROGRAM).then((r) => r.address);
|
|
65251
|
+
var humaPoolConfigPda = () => pda2([utf86("pool_config"), pk6(HUMA_POOL.poolId)]);
|
|
65252
|
+
var humaPoolStatePda = () => pda2([utf86("pool_state"), pk6(HUMA_POOL.poolConfig)]);
|
|
65253
|
+
var humaPoolAuthorityPda = () => pda2([utf86("pool_authority"), pk6(HUMA_POOL.poolConfig)]);
|
|
65254
|
+
var humaModeConfigPda = (modeId) => pda2([utf86("mode_config"), pk6(HUMA_POOL.poolConfig), pk6(modeId)]);
|
|
65255
|
+
var humaModeMintPda = (modeConfig) => pda2([utf86("mode_mint"), pk6(HUMA_POOL.poolConfig), pk6(modeConfig)]);
|
|
65256
|
+
var humaLenderStatePda = (modeConfig, lender) => pda2([utf86("lender_state"), pk6(modeConfig), pk6(lender)]);
|
|
65257
|
+
var humaDeploymentStatePda = (deploymentConfig) => pda2([utf86("deployment_state"), pk6(deploymentConfig)]);
|
|
65258
|
+
var humaRedemptionRequestPda = (id, poolConfig) => pda2([utf86("redemption_request"), u128be(id), pk6(poolConfig)]);
|
|
63471
65259
|
var u128be = (v) => {
|
|
63472
65260
|
if (v < 0n || v >= 1n << 128n) throw new Error(`huma: id out of u128: ${v}`);
|
|
63473
65261
|
const out = new Uint8Array(16);
|
|
@@ -63475,11 +65263,11 @@ var u128be = (v) => {
|
|
|
63475
65263
|
out[15 - i] = Number(v >> BigInt(8 * i) & 0xffn);
|
|
63476
65264
|
return out;
|
|
63477
65265
|
};
|
|
63478
|
-
var decodeHumaPoolState = (d2) => (0,
|
|
63479
|
-
var decodeHumaModeConfig = (d2) => (0,
|
|
63480
|
-
var decodeHumaPoolConfig = (d2) => (0,
|
|
63481
|
-
var decodeHumaLenderState = (d2) => (0,
|
|
63482
|
-
var decodeHumaRedemptionRequest = (d2) => (0,
|
|
65266
|
+
var decodeHumaPoolState = (d2) => (0, import_svm_kit18.decodeIdlAccount)(HUMA_IDL, "PoolState", d2);
|
|
65267
|
+
var decodeHumaModeConfig = (d2) => (0, import_svm_kit18.decodeIdlAccount)(HUMA_IDL, "ModeConfig", d2);
|
|
65268
|
+
var decodeHumaPoolConfig = (d2) => (0, import_svm_kit18.decodeIdlAccount)(HUMA_IDL, "PoolConfig", d2);
|
|
65269
|
+
var decodeHumaLenderState = (d2) => (0, import_svm_kit18.decodeIdlAccount)(HUMA_IDL, "LenderState", d2);
|
|
65270
|
+
var decodeHumaRedemptionRequest = (d2) => (0, import_svm_kit18.decodeIdlAccount)(HUMA_IDL, "RedemptionRequest", d2);
|
|
63483
65271
|
function mintSupply2(data) {
|
|
63484
65272
|
if (data.length < 44) throw new Error("huma: mint account too short");
|
|
63485
65273
|
return data.slice(36, 44).reduce((a, b, i) => a | BigInt(b) << BigInt(8 * i), 0n);
|
|
@@ -63493,23 +65281,23 @@ var need2 = (a, what) => {
|
|
|
63493
65281
|
return a;
|
|
63494
65282
|
};
|
|
63495
65283
|
async function readHumaChainState(rpc, pool = HUMA_POOL) {
|
|
63496
|
-
const poolUnderlyingToken = await (0,
|
|
65284
|
+
const poolUnderlyingToken = await (0, import_svm_kit18.getAssociatedTokenAddress)(
|
|
63497
65285
|
await humaPoolAuthorityPda(),
|
|
63498
65286
|
pool.underlyingMint,
|
|
63499
|
-
|
|
65287
|
+
import_svm_kit18.TOKEN_PROGRAM
|
|
63500
65288
|
);
|
|
63501
65289
|
const { slot, accounts: first } = await rpc.readAccounts(
|
|
63502
65290
|
[pool.poolState, pool.poolConfig, poolUnderlyingToken],
|
|
63503
65291
|
{ encoding: "base64" }
|
|
63504
65292
|
);
|
|
63505
65293
|
const state = decodeHumaPoolState(
|
|
63506
|
-
(0,
|
|
65294
|
+
(0, import_svm_kit18.fromBase64)(need2(first[0], "pool_state").data[0])
|
|
63507
65295
|
);
|
|
63508
65296
|
const config = decodeHumaPoolConfig(
|
|
63509
|
-
(0,
|
|
65297
|
+
(0, import_svm_kit18.fromBase64)(need2(first[1], "pool_config").data[0])
|
|
63510
65298
|
);
|
|
63511
65299
|
const poolCash = tokenAmount2(
|
|
63512
|
-
first[2] ? (0,
|
|
65300
|
+
first[2] ? (0, import_svm_kit18.fromBase64)(first[2].data[0]) : void 0
|
|
63513
65301
|
);
|
|
63514
65302
|
const modeMints = await Promise.all(
|
|
63515
65303
|
state.mode_config_keys.map((k) => humaModeMintPda(k))
|
|
@@ -63524,9 +65312,9 @@ async function readHumaChainState(rpc, pool = HUMA_POOL) {
|
|
|
63524
65312
|
{ encoding: "base64" }
|
|
63525
65313
|
);
|
|
63526
65314
|
const modeConfig = decodeHumaModeConfig(
|
|
63527
|
-
(0,
|
|
65315
|
+
(0, import_svm_kit18.fromBase64)(need2(modeAcct, "mode_config").data[0])
|
|
63528
65316
|
);
|
|
63529
|
-
const mintData = (0,
|
|
65317
|
+
const mintData = (0, import_svm_kit18.fromBase64)(need2(mintAcct, "pst_mint").data[0]);
|
|
63530
65318
|
const next = state.redemption.next_request_id;
|
|
63531
65319
|
const last = state.redemption.last_request_id;
|
|
63532
65320
|
const gate = state.redemption.global_redemption_gating;
|
|
@@ -63583,7 +65371,7 @@ async function readHumaLenderState(rpc, modeConfig, wallet) {
|
|
|
63583
65371
|
const a = accounts[0];
|
|
63584
65372
|
return {
|
|
63585
65373
|
address,
|
|
63586
|
-
state: a ? decodeHumaLenderState((0,
|
|
65374
|
+
state: a ? decodeHumaLenderState((0, import_svm_kit18.fromBase64)(a.data[0])) : null
|
|
63587
65375
|
};
|
|
63588
65376
|
}
|
|
63589
65377
|
var HUMA_REDEMPTION_REQUEST_SIZE = 273;
|
|
@@ -63599,12 +65387,12 @@ async function readHumaRedemptionRequests(fetchers, wallet) {
|
|
|
63599
65387
|
);
|
|
63600
65388
|
return rows.map((r) => ({
|
|
63601
65389
|
address: r.pubkey,
|
|
63602
|
-
...decodeHumaRedemptionRequest((0,
|
|
65390
|
+
...decodeHumaRedemptionRequest((0, import_svm_kit18.fromBase64)(r.account.data[0]))
|
|
63603
65391
|
})).sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
|
|
63604
65392
|
}
|
|
63605
65393
|
|
|
63606
65394
|
// src/vaults/huma/fetchPublic.ts
|
|
63607
|
-
var
|
|
65395
|
+
var import_svm_kit19 = require("@1delta/svm-kit");
|
|
63608
65396
|
var SCALE2 = 10 ** HUMA_DECIMALS;
|
|
63609
65397
|
var fmt4 = (raw2) => Number(raw2) / SCALE2;
|
|
63610
65398
|
var HUMA_REDEMPTION_SLA_SECONDS = 7 * 86400;
|
|
@@ -63689,7 +65477,7 @@ function convertHumaPst(s, ctx) {
|
|
|
63689
65477
|
}
|
|
63690
65478
|
async function fetchHumaPstVaults(rpcOrOpts = {}) {
|
|
63691
65479
|
const opts = "readAccounts" in rpcOrOpts ? { rpc: rpcOrOpts } : rpcOrOpts;
|
|
63692
|
-
const rpc = opts.rpc ?? (0,
|
|
65480
|
+
const rpc = opts.rpc ?? (0, import_svm_kit19.createSvmRpc)();
|
|
63693
65481
|
const s = await readHumaChainState(rpc);
|
|
63694
65482
|
let priceUsd = opts.priceUsd;
|
|
63695
65483
|
if (priceUsd === void 0 && opts.fetchPrices !== false) {
|
|
@@ -63720,16 +65508,16 @@ var nowSec = () => Math.floor(Date.now() / 1e3);
|
|
|
63720
65508
|
function convertLoopscaleVault(v, opts = {}) {
|
|
63721
65509
|
const s = v.vaultStrategy.strategy;
|
|
63722
65510
|
const listed3 = opts.tokenList?.[s.principalMint];
|
|
63723
|
-
const
|
|
63724
|
-
if (
|
|
65511
|
+
const dec2 = opts.decimals ?? listed3?.decimals;
|
|
65512
|
+
if (dec2 === void 0) return void 0;
|
|
63725
65513
|
const tvlRaw = strategyTvlRaw(s);
|
|
63726
|
-
const tvl = tvlRaw / 10 **
|
|
65514
|
+
const tvl = tvlRaw / 10 ** dec2;
|
|
63727
65515
|
const extAmount = Number(s.externalYieldAmount);
|
|
63728
65516
|
const deployed = Number(s.currentDeployedAmount);
|
|
63729
65517
|
const idle = Number(s.tokenBalance);
|
|
63730
65518
|
const ext = v.vaultStrategy.externalYieldInfo;
|
|
63731
65519
|
const extApr = ext ? cbpsToFraction(ext.apy) : 0;
|
|
63732
|
-
const grossAnnual = Number(s.interestPerSecond) *
|
|
65520
|
+
const grossAnnual = Number(s.interestPerSecond) * SECONDS_PER_YEAR2 + extApr * extAmount;
|
|
63733
65521
|
const gross = tvlRaw > 0 ? grossAnnual / tvlRaw * 100 : 0;
|
|
63734
65522
|
const feeFrac = cbpsToFraction(s.interestFee);
|
|
63735
65523
|
const supplyRate = gross * (1 - feeFrac);
|
|
@@ -63746,7 +65534,7 @@ function convertLoopscaleVault(v, opts = {}) {
|
|
|
63746
65534
|
const rDec = mint ? opts.tokenList?.[mint]?.decimals : void 0;
|
|
63747
65535
|
if (!p || rDec === void 0 || !priceUsd || tvl <= 0) continue;
|
|
63748
65536
|
const perSec = Number(r.emissionsPerSecond ?? 0) / 10 ** rDec;
|
|
63749
|
-
rewardsRate += perSec *
|
|
65537
|
+
rewardsRate += perSec * SECONDS_PER_YEAR2 * p / (tvl * priceUsd) * 100;
|
|
63750
65538
|
}
|
|
63751
65539
|
const lp = Number(v.vault.lpSupply);
|
|
63752
65540
|
const earlyFee = Number(v.vault.maxEarlyUnstakeFee);
|
|
@@ -63766,13 +65554,15 @@ function convertLoopscaleVault(v, opts = {}) {
|
|
|
63766
65554
|
name: meta?.name ?? v.vault.address,
|
|
63767
65555
|
displayName: meta?.name ? `Loopscale ${meta.name}` : `Loopscale ${sym}`,
|
|
63768
65556
|
curatorName: meta?.managerName ?? "Loopscale",
|
|
63769
|
-
|
|
63770
|
-
|
|
65557
|
+
manager: v.vault.manager,
|
|
65558
|
+
managerImage: meta?.managerImage ?? void 0,
|
|
65559
|
+
decimals: dec2,
|
|
65560
|
+
assetDecimals: dec2,
|
|
63771
65561
|
totalAssets: String(tvlRaw),
|
|
63772
65562
|
totalSupply: String(lp),
|
|
63773
|
-
convertToAssets: String(Math.round(sharePrice * 10 **
|
|
65563
|
+
convertToAssets: String(Math.round(sharePrice * 10 ** dec2)),
|
|
63774
65564
|
convertToShares: String(
|
|
63775
|
-
sharePrice > 0 ? Math.round(1 / sharePrice * 10 **
|
|
65565
|
+
sharePrice > 0 ? Math.round(1 / sharePrice * 10 ** dec2) : 0
|
|
63776
65566
|
),
|
|
63777
65567
|
grossRate: gross,
|
|
63778
65568
|
supplyRate,
|
|
@@ -63784,8 +65574,8 @@ function convertLoopscaleVault(v, opts = {}) {
|
|
|
63784
65574
|
totalAssetsFormatted: tvl,
|
|
63785
65575
|
totalAssetsUsd: sum?.totalSupplyUsd ?? tvl * (priceUsd ?? 0),
|
|
63786
65576
|
liquidity: String(idle),
|
|
63787
|
-
liquidityFormatted: idle / 10 **
|
|
63788
|
-
liquidityUsd: idle / 10 **
|
|
65577
|
+
liquidityFormatted: idle / 10 ** dec2,
|
|
65578
|
+
liquidityUsd: idle / 10 ** dec2 * (priceUsd ?? 0),
|
|
63789
65579
|
sharePrice,
|
|
63790
65580
|
sharePriceUsd: sharePrice * (priceUsd ?? 0),
|
|
63791
65581
|
yieldProfile: "yield-bearing",
|
|
@@ -63853,9 +65643,162 @@ async function fetchLoopscaleEarnVaults(opts = {}) {
|
|
|
63853
65643
|
return out;
|
|
63854
65644
|
}
|
|
63855
65645
|
|
|
65646
|
+
// src/vaults/kamino-kvault/api.ts
|
|
65647
|
+
var KVAULT_PROGRAM_ID = "KvauGMspG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd";
|
|
65648
|
+
function createKaminoKvaultApi(opts = {}) {
|
|
65649
|
+
const base = (opts.baseUrl ?? KAMINO_API_BASE).replace(/\/$/, "");
|
|
65650
|
+
const limit = createLimiter(opts.maxInFlight ?? 4);
|
|
65651
|
+
const get = (path) => limit(() => getJson(`${base}${path}`, opts));
|
|
65652
|
+
return {
|
|
65653
|
+
vaults: () => get("/kvaults/vaults"),
|
|
65654
|
+
/** Every page of the batch metrics. A page that fails fails the call — a partial metrics set would read as vaults with no APY. */
|
|
65655
|
+
metrics: async () => {
|
|
65656
|
+
const out = [];
|
|
65657
|
+
let token;
|
|
65658
|
+
const maxPages = opts.maxPages ?? 20;
|
|
65659
|
+
for (let page = 0; page < maxPages; page++) {
|
|
65660
|
+
const res = await get(
|
|
65661
|
+
`/kvaults/vaults/metrics${token ? `?paginationToken=${encodeURIComponent(token)}` : ""}`
|
|
65662
|
+
);
|
|
65663
|
+
out.push(...res.result ?? []);
|
|
65664
|
+
token = res.paginationToken ?? void 0;
|
|
65665
|
+
if (!token || !res.result?.length) return out;
|
|
65666
|
+
}
|
|
65667
|
+
throw new Error(
|
|
65668
|
+
`kvault metrics: still paging after ${maxPages} pages (${out.length} rows)`
|
|
65669
|
+
);
|
|
65670
|
+
},
|
|
65671
|
+
vaultMetrics: (vault) => get(`/kvaults/vaults/${vault}/metrics`)
|
|
65672
|
+
};
|
|
65673
|
+
}
|
|
65674
|
+
|
|
65675
|
+
// src/vaults/kamino-kvault/fetchPublic.ts
|
|
65676
|
+
init_types();
|
|
65677
|
+
function decimalStringToRaw(s, decimals) {
|
|
65678
|
+
if (s === void 0 || s === null) return void 0;
|
|
65679
|
+
const t = String(s).trim();
|
|
65680
|
+
const m = /^(-?)(\d*)(?:\.(\d*))?$/.exec(t);
|
|
65681
|
+
if (!m || !m[2] && !m[3]) return void 0;
|
|
65682
|
+
const frac = (m[3] ?? "").slice(0, decimals).padEnd(decimals, "0");
|
|
65683
|
+
const v = BigInt((m[2] || "0") + frac);
|
|
65684
|
+
return m[1] ? -v : v;
|
|
65685
|
+
}
|
|
65686
|
+
function convertKaminoKvault(v, m, opts = {}) {
|
|
65687
|
+
if (!m) return void 0;
|
|
65688
|
+
const s = v.state;
|
|
65689
|
+
const dec2 = s.tokenMintDecimals;
|
|
65690
|
+
const shareDec = s.sharesMintDecimals;
|
|
65691
|
+
const listed3 = opts.tokenList?.[s.tokenMint];
|
|
65692
|
+
const listedShare = opts.tokenList?.[s.sharesMint];
|
|
65693
|
+
const sym = listed3?.symbol ?? s.tokenMint.slice(0, 4);
|
|
65694
|
+
const perShare = num(m.tokensPerShare, 1);
|
|
65695
|
+
const shares = BigInt(s.sharesIssued || "0");
|
|
65696
|
+
const perShareRaw = decimalStringToRaw(m.tokensPerShare, dec2) ?? 10n ** BigInt(dec2);
|
|
65697
|
+
const totalAssetsRaw = shares * perShareRaw / 10n ** BigInt(shareDec);
|
|
65698
|
+
const totalAssetsFormatted = Number(totalAssetsRaw) / 10 ** dec2;
|
|
65699
|
+
const idleRaw = BigInt(s.tokenAvailable || "0");
|
|
65700
|
+
const idle = Number(idleRaw) / 10 ** dec2;
|
|
65701
|
+
const price = num(m.tokenPrice);
|
|
65702
|
+
const priced = price > 0;
|
|
65703
|
+
const apy = {
|
|
65704
|
+
current: num(m.apy),
|
|
65705
|
+
actual: num(m.apyActual),
|
|
65706
|
+
d1: num(m.apy24h),
|
|
65707
|
+
d7: num(m.apy7d),
|
|
65708
|
+
d30: num(m.apy30d),
|
|
65709
|
+
d90: num(m.apy90d),
|
|
65710
|
+
farmRewards: num(m.apyFarmRewards),
|
|
65711
|
+
incentives: num(m.apyIncentives),
|
|
65712
|
+
reservesIncentives: num(m.apyReservesIncentives)
|
|
65713
|
+
};
|
|
65714
|
+
const supplyRate = apyFractionToAprPercent(apy.current);
|
|
65715
|
+
const rewardsRate = apyFractionToAprPercent(apy.farmRewards + apy.incentives);
|
|
65716
|
+
const name = s.name?.trim() || listedShare?.name || `Kamino Vault ${sym}`;
|
|
65717
|
+
return {
|
|
65718
|
+
provider: "kamino-kvault",
|
|
65719
|
+
originProvider: "kamino-kvault",
|
|
65720
|
+
chainId: SOLANA_CHAIN_ID,
|
|
65721
|
+
address: v.address,
|
|
65722
|
+
shareMint: s.sharesMint,
|
|
65723
|
+
underlying: s.tokenMint,
|
|
65724
|
+
symbol: listedShare?.symbol ?? `kv${sym}`,
|
|
65725
|
+
name,
|
|
65726
|
+
displayName: name.toLowerCase().includes("kamino") ? name : `Kamino ${name}`,
|
|
65727
|
+
curatorName: s.vaultAdminAuthority,
|
|
65728
|
+
manager: s.vaultAdminAuthority,
|
|
65729
|
+
allocationAdmin: s.allocationAdmin,
|
|
65730
|
+
decimals: shareDec,
|
|
65731
|
+
assetDecimals: dec2,
|
|
65732
|
+
totalAssets: totalAssetsRaw.toString(),
|
|
65733
|
+
totalSupply: shares.toString(),
|
|
65734
|
+
convertToAssets: perShareRaw.toString(),
|
|
65735
|
+
convertToShares: perShare > 0 ? String(Math.round(1 / perShare * 10 ** shareDec)) : "0",
|
|
65736
|
+
supplyRate,
|
|
65737
|
+
rewardsRate,
|
|
65738
|
+
depositRate: supplyRate + rewardsRate,
|
|
65739
|
+
asset: listed3,
|
|
65740
|
+
priceUsd: priced ? price : void 0,
|
|
65741
|
+
totalAssetsFormatted,
|
|
65742
|
+
totalAssetsUsd: priced ? totalAssetsFormatted * price : 0,
|
|
65743
|
+
liquidity: idleRaw.toString(),
|
|
65744
|
+
liquidityFormatted: idle,
|
|
65745
|
+
liquidityUsd: priced ? idle * price : 0,
|
|
65746
|
+
sharePrice: perShare,
|
|
65747
|
+
sharePriceUsd: priced ? num(m.sharePrice, perShare * price) : 0,
|
|
65748
|
+
yieldProfile: "yield-bearing",
|
|
65749
|
+
denomination: denominationOf({
|
|
65750
|
+
symbol: listed3?.symbol,
|
|
65751
|
+
props: listed3?.props
|
|
65752
|
+
}),
|
|
65753
|
+
logoURI: listedShare?.logoURI ?? listed3?.logoURI,
|
|
65754
|
+
fee: s.performanceFeeBps / 100,
|
|
65755
|
+
managementFeePct: s.managementFeeBps / 100,
|
|
65756
|
+
withdrawalMode: "instant-capped",
|
|
65757
|
+
instantLiquidityRatio: totalAssetsRaw > 0n ? Math.min(1, Number(idleRaw * 1000000n / totalAssetsRaw) / 1e6) : 1,
|
|
65758
|
+
apy,
|
|
65759
|
+
holders: m.numberOfHolders ?? 0,
|
|
65760
|
+
vaultFarm: s.vaultFarm && s.vaultFarm !== "11111111111111111111111111111111" ? s.vaultFarm : void 0,
|
|
65761
|
+
allocations: (s.vaultAllocationStrategy ?? []).filter((a) => a.reserve !== "11111111111111111111111111111111").map((a) => ({
|
|
65762
|
+
reserve: a.reserve,
|
|
65763
|
+
weight: a.targetAllocationWeight,
|
|
65764
|
+
ctokenAllocation: a.ctokenAllocation
|
|
65765
|
+
})),
|
|
65766
|
+
createdAt: s.creationTimestamp,
|
|
65767
|
+
minDepositAmount: s.minDepositAmount
|
|
65768
|
+
};
|
|
65769
|
+
}
|
|
65770
|
+
async function fetchKaminoKvaults(opts = {}) {
|
|
65771
|
+
const api = createKaminoKvaultApi(opts);
|
|
65772
|
+
const [vaults, metrics] = await Promise.all([
|
|
65773
|
+
opts.vaults ?? api.vaults(),
|
|
65774
|
+
opts.metrics ?? api.metrics()
|
|
65775
|
+
]);
|
|
65776
|
+
const byVault = /* @__PURE__ */ new Map();
|
|
65777
|
+
for (const m of metrics) if (m.kvault) byVault.set(m.kvault, m);
|
|
65778
|
+
const out = [];
|
|
65779
|
+
const skipped = [];
|
|
65780
|
+
for (const v of vaults) {
|
|
65781
|
+
if (!opts.includeEmpty && BigInt(v.state.sharesIssued || "0") === 0n)
|
|
65782
|
+
continue;
|
|
65783
|
+
const row = convertKaminoKvault(v, byVault.get(v.address), {
|
|
65784
|
+
tokenList: opts.tokenList
|
|
65785
|
+
});
|
|
65786
|
+
if (!row) {
|
|
65787
|
+
skipped.push(v.address);
|
|
65788
|
+
continue;
|
|
65789
|
+
}
|
|
65790
|
+
out.push(row);
|
|
65791
|
+
}
|
|
65792
|
+
if (skipped.length)
|
|
65793
|
+
console.warn(
|
|
65794
|
+
`[kamino-kvault] ${skipped.length} vault(s) skipped \u2014 no metrics row: ${skipped.join(", ")}`
|
|
65795
|
+
);
|
|
65796
|
+
return out;
|
|
65797
|
+
}
|
|
65798
|
+
|
|
63856
65799
|
// src/vaults/lst/fetchPublic.ts
|
|
63857
65800
|
init_types();
|
|
63858
|
-
var
|
|
65801
|
+
var import_svm_kit20 = require("@1delta/svm-kit");
|
|
63859
65802
|
var LAMPORTS_PER_SOL = 10 ** 9;
|
|
63860
65803
|
var TOKEN_SCALE = 10 ** 9;
|
|
63861
65804
|
var SPL_STAKE_POOL_LSTS = [
|
|
@@ -63872,7 +65815,7 @@ var SPL_STAKE_POOL_LSTS = [
|
|
|
63872
65815
|
curatorName: "SolBlaze"
|
|
63873
65816
|
}
|
|
63874
65817
|
];
|
|
63875
|
-
var
|
|
65818
|
+
var SECONDS_PER_YEAR4 = 365.25 * 86400;
|
|
63876
65819
|
function epochRealizedApr(pool, epochSeconds) {
|
|
63877
65820
|
if (pool.lastEpochTotalLamports === void 0 || !pool.lastEpochPoolTokenSupply || pool.poolTokenSupply === 0n || epochSeconds <= 0)
|
|
63878
65821
|
return void 0;
|
|
@@ -63882,7 +65825,7 @@ function epochRealizedApr(pool, epochSeconds) {
|
|
|
63882
65825
|
const epochRate = now / last - 1;
|
|
63883
65826
|
return {
|
|
63884
65827
|
epochRatePercent: epochRate * 100,
|
|
63885
|
-
aprPercent: epochRate * (
|
|
65828
|
+
aprPercent: epochRate * (SECONDS_PER_YEAR4 / epochSeconds) * 100,
|
|
63886
65829
|
lastEpochExchangeRate: last
|
|
63887
65830
|
};
|
|
63888
65831
|
}
|
|
@@ -63918,7 +65861,7 @@ function convertLst(entry, pool, ctx, stakePoolAddress, programId, slot) {
|
|
|
63918
65861
|
provider: "lst",
|
|
63919
65862
|
chainId: SOLANA_CHAIN_ID,
|
|
63920
65863
|
address: pool.poolMint,
|
|
63921
|
-
underlying:
|
|
65864
|
+
underlying: import_svm_kit20.WRAPPED_SOL,
|
|
63922
65865
|
symbol: share.symbol ?? entry.symbol,
|
|
63923
65866
|
name: share.name ?? entry.name,
|
|
63924
65867
|
displayName: `${entry.curatorName} ${entry.symbol}`,
|
|
@@ -63982,7 +65925,7 @@ function convertLst(entry, pool, ctx, stakePoolAddress, programId, slot) {
|
|
|
63982
65925
|
};
|
|
63983
65926
|
}
|
|
63984
65927
|
async function fetchLstVaults(opts = {}) {
|
|
63985
|
-
const rpc = opts.rpc ?? (0,
|
|
65928
|
+
const rpc = opts.rpc ?? (0, import_svm_kit20.createSvmRpc)();
|
|
63986
65929
|
const entries = opts.entries ?? SPL_STAKE_POOL_LSTS;
|
|
63987
65930
|
const tokenList = opts.tokenList ?? {};
|
|
63988
65931
|
const { slot, pools } = await readStakePools(
|
|
@@ -63992,10 +65935,10 @@ async function fetchLstVaults(opts = {}) {
|
|
|
63992
65935
|
let solPriceUsd = opts.solPriceUsd;
|
|
63993
65936
|
if (solPriceUsd === void 0 && opts.fetchPrices !== false) {
|
|
63994
65937
|
solPriceUsd = await fetchJupiterPrices(
|
|
63995
|
-
[
|
|
65938
|
+
[import_svm_kit20.WRAPPED_SOL],
|
|
63996
65939
|
tokenList,
|
|
63997
65940
|
opts.priceApi
|
|
63998
|
-
).then((p) => p.byMint[
|
|
65941
|
+
).then((p) => p.byMint[import_svm_kit20.WRAPPED_SOL]).catch(() => void 0);
|
|
63999
65942
|
}
|
|
64000
65943
|
const found = pools.filter((p) => !!p);
|
|
64001
65944
|
const [epoch, reserves] = await Promise.all([
|
|
@@ -64169,6 +66112,9 @@ function loopscaleOriginRow(r) {
|
|
|
64169
66112
|
meta: {
|
|
64170
66113
|
vaultAccount: r.vaultAccount,
|
|
64171
66114
|
strategy: r.strategy,
|
|
66115
|
+
manager: r.manager,
|
|
66116
|
+
managerName: r.curatorName,
|
|
66117
|
+
managerImage: r.managerImage,
|
|
64172
66118
|
grossRate: r.grossRate,
|
|
64173
66119
|
venueApy: r.venueApy,
|
|
64174
66120
|
interestFee: r.fees.interest,
|
|
@@ -64193,6 +66139,42 @@ function loopscaleOriginRow(r) {
|
|
|
64193
66139
|
}
|
|
64194
66140
|
};
|
|
64195
66141
|
}
|
|
66142
|
+
function kaminoKvaultOriginRow(r) {
|
|
66143
|
+
return {
|
|
66144
|
+
...common4626(r, "kamino-kvault", "sync"),
|
|
66145
|
+
// kvaults publish no curator NAME: `r.curatorName` is the admin address,
|
|
66146
|
+
// and a brand column holding a base58 key would read as the desk's name on
|
|
66147
|
+
// /earn. The address travels as `meta.manager`; a label layer keyed by it
|
|
66148
|
+
// (lender-metadata curator-labels.json → curator_metadata) names it.
|
|
66149
|
+
curatorName: void 0,
|
|
66150
|
+
provider: "kamino-kvault",
|
|
66151
|
+
fee: r.fee,
|
|
66152
|
+
shareAsset: {
|
|
66153
|
+
chainId: r.chainId,
|
|
66154
|
+
address: r.shareMint,
|
|
66155
|
+
symbol: r.symbol,
|
|
66156
|
+
name: r.name,
|
|
66157
|
+
decimals: r.decimals
|
|
66158
|
+
},
|
|
66159
|
+
metaTable: "vault_kamino_kvault_meta",
|
|
66160
|
+
meta: {
|
|
66161
|
+
shareMint: r.shareMint,
|
|
66162
|
+
manager: r.manager,
|
|
66163
|
+
allocationAdmin: r.allocationAdmin,
|
|
66164
|
+
managementFeePct: r.managementFeePct,
|
|
66165
|
+
convertToAssets: r.convertToAssets,
|
|
66166
|
+
convertToShares: r.convertToShares,
|
|
66167
|
+
withdrawalMode: r.withdrawalMode,
|
|
66168
|
+
instantLiquidityRatio: r.instantLiquidityRatio,
|
|
66169
|
+
apy: r.apy,
|
|
66170
|
+
holders: r.holders,
|
|
66171
|
+
vaultFarm: r.vaultFarm,
|
|
66172
|
+
allocations: r.allocations,
|
|
66173
|
+
createdAt: r.createdAt,
|
|
66174
|
+
minDepositAmount: r.minDepositAmount
|
|
66175
|
+
}
|
|
66176
|
+
};
|
|
66177
|
+
}
|
|
64196
66178
|
function exponentOriginRow(r) {
|
|
64197
66179
|
return {
|
|
64198
66180
|
provider: "exponent",
|
|
@@ -64240,6 +66222,8 @@ function toOriginVaultRow(r) {
|
|
|
64240
66222
|
return jupiterLendOriginRow(r);
|
|
64241
66223
|
case "loopscale":
|
|
64242
66224
|
return loopscaleOriginRow(r);
|
|
66225
|
+
case "kamino-kvault":
|
|
66226
|
+
return kaminoKvaultOriginRow(r);
|
|
64243
66227
|
}
|
|
64244
66228
|
}
|
|
64245
66229
|
|
|
@@ -64411,21 +66395,66 @@ async function fetchJupiterLendOracleEntries(opts = {}) {
|
|
|
64411
66395
|
}
|
|
64412
66396
|
|
|
64413
66397
|
// src/prices/oracle-prices/fetchers/save.ts
|
|
66398
|
+
var import_svm_kit21 = require("@1delta/svm-kit");
|
|
64414
66399
|
async function fetchSaveOracleEntries(opts = {}) {
|
|
64415
66400
|
const res = opts.publicData ?? await fetchSavePublic(opts);
|
|
66401
|
+
const feeds = /* @__PURE__ */ new Set();
|
|
66402
|
+
for (const bundle of Object.values(res))
|
|
66403
|
+
for (const row of Object.values(bundle.data)) {
|
|
66404
|
+
if (row.save.pythOracle) feeds.add(row.save.pythOracle);
|
|
66405
|
+
if (row.save.switchboardOracle) feeds.add(row.save.switchboardOracle);
|
|
66406
|
+
}
|
|
66407
|
+
const readings = /* @__PURE__ */ new Map();
|
|
66408
|
+
if (opts.live !== false && feeds.size) {
|
|
66409
|
+
try {
|
|
66410
|
+
const rpc = opts.rpc ?? (0, import_svm_kit21.createSvmRpc)();
|
|
66411
|
+
const keys = [...feeds];
|
|
66412
|
+
const { accounts } = await rpc.readAccounts(keys, { encoding: "base64" });
|
|
66413
|
+
accounts.forEach((a, i) => {
|
|
66414
|
+
if (!a) return;
|
|
66415
|
+
try {
|
|
66416
|
+
const r = decodeOracleFeed({ owner: a.owner, data: a.data[0] });
|
|
66417
|
+
if (r && Number.isFinite(r.price) && r.price > 0)
|
|
66418
|
+
readings.set(keys[i], r);
|
|
66419
|
+
} catch (e) {
|
|
66420
|
+
console.warn(`[save] feed ${keys[i]}: ${e.message}`);
|
|
66421
|
+
}
|
|
66422
|
+
});
|
|
66423
|
+
} catch (e) {
|
|
66424
|
+
console.warn(
|
|
66425
|
+
`[save] live feeds not read, serving stored reserve prices: ${e.message}`
|
|
66426
|
+
);
|
|
66427
|
+
}
|
|
66428
|
+
}
|
|
64416
66429
|
const out = {};
|
|
64417
66430
|
for (const [lender, bundle] of Object.entries(res)) {
|
|
64418
66431
|
out[lender] = Object.entries(bundle.data).map(([marketUid, row]) => {
|
|
64419
66432
|
const s = row.save;
|
|
66433
|
+
const bps = s.scaledPriceOffsetBps;
|
|
66434
|
+
const dial = bps !== 0 ? ` \xD7 (1 + ${bps} bps dial)` : "";
|
|
66435
|
+
const candidates = [s.pythOracle, s.switchboardOracle].filter((k) => !!k && readings.has(k)).map((k) => ({ feed: k, r: readings.get(k) })).sort((a, b) => b.r.updatedAt - a.r.updatedAt);
|
|
66436
|
+
const pick = candidates[0];
|
|
66437
|
+
if (pick) {
|
|
66438
|
+
const price = pick.r.price * (1 + bps / 1e4);
|
|
66439
|
+
return {
|
|
66440
|
+
asset: row.underlying,
|
|
66441
|
+
price,
|
|
66442
|
+
priceUSD: price,
|
|
66443
|
+
marketUid,
|
|
66444
|
+
description: `Save reserve oracle \xB7 ${pick.r.kind}${dial} (live feed read)`,
|
|
66445
|
+
derivation: dial ? "derived" : "direct",
|
|
66446
|
+
feedSource: pick.feed,
|
|
66447
|
+
feedUpdatedAt: pick.r.updatedAt > 0 ? pick.r.updatedAt : void 0
|
|
66448
|
+
};
|
|
66449
|
+
}
|
|
64420
66450
|
const feed = s.pythOracle ?? s.switchboardOracle ?? s.extraOracle;
|
|
64421
66451
|
const kind = s.pythOracle ? "pyth-pull" : s.switchboardOracle ? "switchboard-on-demand" : "extra";
|
|
64422
|
-
const dial = s.scaledPriceOffsetBps !== 0 ? ` \xD7 (1 + ${s.scaledPriceOffsetBps} bps dial)` : "";
|
|
64423
66452
|
return {
|
|
64424
66453
|
asset: row.underlying,
|
|
64425
66454
|
price: s.priceUsd,
|
|
64426
66455
|
priceUSD: s.priceUsd,
|
|
64427
66456
|
marketUid,
|
|
64428
|
-
description: `Save reserve price \xB7 ${kind}${dial} \xB7 slot ${s.lastUpdateSlot}${s.stale ? " (stale)" : ""}`,
|
|
66457
|
+
description: `Save reserve price (stored) \xB7 ${kind}${dial} \xB7 slot ${s.lastUpdateSlot}${s.stale ? " (stale)" : ""}`,
|
|
64429
66458
|
derivation: dial ? "derived" : "direct",
|
|
64430
66459
|
feedSource: feed
|
|
64431
66460
|
};
|
|
@@ -64490,16 +66519,19 @@ async function fetchProject0OracleEntries(opts = {}) {
|
|
|
64490
66519
|
for (const [lender, bundle] of Object.entries(res)) {
|
|
64491
66520
|
out[lender] = Object.entries(bundle.data).filter(([, row]) => row.p0.price.source !== "none").map(([marketUid, row]) => {
|
|
64492
66521
|
const p = row.p0.price;
|
|
64493
|
-
|
|
66522
|
+
const fixed = p.source === "fixed";
|
|
66523
|
+
const entry = {
|
|
64494
66524
|
asset: row.underlying,
|
|
64495
66525
|
price: p.priceUsd,
|
|
64496
66526
|
priceUSD: p.priceUsd,
|
|
64497
66527
|
marketUid,
|
|
64498
66528
|
description: `Project 0 \xB7 ${p.description ?? p.source}`,
|
|
64499
|
-
derivation: p.source === "pyth-push"
|
|
66529
|
+
derivation: p.source === "pyth-push" || p.source === "scope" || fixed ? "direct" : "derived",
|
|
64500
66530
|
feedSource: p.feed,
|
|
64501
66531
|
feedUpdatedAt: p.updatedAt
|
|
64502
66532
|
};
|
|
66533
|
+
if (fixed) entry.staticBase = true;
|
|
66534
|
+
return entry;
|
|
64503
66535
|
});
|
|
64504
66536
|
}
|
|
64505
66537
|
return out;
|
|
@@ -64510,14 +66542,15 @@ async function fetchOraclePrices(chainIds, opts = {}) {
|
|
|
64510
66542
|
const FETCHERS = {
|
|
64511
66543
|
kamino: (chainId) => chainId === SOLANA_CHAIN_ID ? fetchKaminoOracleEntries(opts.overrides, opts) : Promise.resolve({}),
|
|
64512
66544
|
"jupiter-lend": (chainId) => chainId === SOLANA_CHAIN_ID ? fetchJupiterLendOracleEntries(opts) : Promise.resolve({}),
|
|
64513
|
-
save: (chainId) => chainId === SOLANA_CHAIN_ID ? fetchSaveOracleEntries({ timeoutMs: opts.timeoutMs }) : Promise.resolve({}),
|
|
66545
|
+
save: (chainId) => chainId === SOLANA_CHAIN_ID ? fetchSaveOracleEntries({ timeoutMs: opts.timeoutMs, rpc: opts.rpc }) : Promise.resolve({}),
|
|
64514
66546
|
loopscale: (chainId) => chainId === SOLANA_CHAIN_ID ? fetchLoopscaleOracleEntries({
|
|
64515
66547
|
timeoutMs: opts.timeoutMs,
|
|
64516
66548
|
tokenList: opts.tokenList
|
|
64517
66549
|
}) : Promise.resolve({}),
|
|
64518
66550
|
project0: (chainId) => chainId === SOLANA_CHAIN_ID ? fetchProject0OracleEntries({
|
|
64519
66551
|
timeoutMs: opts.timeoutMs,
|
|
64520
|
-
tokenList: opts.tokenList
|
|
66552
|
+
tokenList: opts.tokenList,
|
|
66553
|
+
...opts.rpc ? { rpc: opts.rpc } : {}
|
|
64521
66554
|
}) : Promise.resolve({})
|
|
64522
66555
|
};
|
|
64523
66556
|
const names = opts.onlyFetchers?.length ? opts.onlyFetchers : Object.keys(FETCHERS);
|
|
@@ -64805,7 +66838,7 @@ async function mintToReserve(api, market) {
|
|
|
64805
66838
|
|
|
64806
66839
|
// src/lending/user-data/kamino/onchain.ts
|
|
64807
66840
|
init_types();
|
|
64808
|
-
var
|
|
66841
|
+
var import_svm_kit22 = require("@1delta/svm-kit");
|
|
64809
66842
|
init_lenders();
|
|
64810
66843
|
var KLEND_OBLIGATION_SIZE = 3344;
|
|
64811
66844
|
var KLEND_OBLIGATION_DISCRIMINATOR = [
|
|
@@ -64824,7 +66857,7 @@ var SF = 60n;
|
|
|
64824
66857
|
var bsf = (b) => b.value.reduce((a, w, i) => a + (BigInt(w) << 64n * BigInt(i)), 0n);
|
|
64825
66858
|
var sfToNumber = (x) => Number(x >> 30n) / 2 ** 30;
|
|
64826
66859
|
function decodeKaminoObligation(address, data) {
|
|
64827
|
-
const o = (0,
|
|
66860
|
+
const o = (0, import_svm_kit22.decodeIdlAccount)(KLEND_IDL, "Obligation", data);
|
|
64828
66861
|
return {
|
|
64829
66862
|
address,
|
|
64830
66863
|
owner: o.owner,
|
|
@@ -64852,7 +66885,7 @@ function decodeKaminoObligation(address, data) {
|
|
|
64852
66885
|
};
|
|
64853
66886
|
}
|
|
64854
66887
|
function decodeKaminoReserveState(reserve, data) {
|
|
64855
|
-
const r = (0,
|
|
66888
|
+
const r = (0, import_svm_kit22.decodeIdlAccount)(KLEND_IDL, "Reserve", data);
|
|
64856
66889
|
const l = r.liquidity;
|
|
64857
66890
|
const totalSf = klendTotalSupplySf({
|
|
64858
66891
|
availableAmount: BigInt(l.totalAvailableAmount),
|
|
@@ -64921,7 +66954,7 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
|
|
|
64921
66954
|
obligation: o.address,
|
|
64922
66955
|
reason: `elevation group ${o.elevationGroup} terms not read \u2014 health uses the reserves' own LT`
|
|
64923
66956
|
});
|
|
64924
|
-
const
|
|
66957
|
+
const view2 = {
|
|
64925
66958
|
address: o.address,
|
|
64926
66959
|
market: o.market,
|
|
64927
66960
|
lenderKey,
|
|
@@ -64952,7 +66985,7 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
|
|
|
64952
66985
|
const units = depositUnits(d2.cTokens, s);
|
|
64953
66986
|
const amount = Number(units);
|
|
64954
66987
|
const uid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, d2.reserve);
|
|
64955
|
-
|
|
66988
|
+
view2.deposits.push({
|
|
64956
66989
|
reserve: d2.reserve,
|
|
64957
66990
|
marketUid: uid,
|
|
64958
66991
|
mint: s.mint,
|
|
@@ -64960,10 +66993,10 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
|
|
|
64960
66993
|
amount,
|
|
64961
66994
|
amountUsd: amount * s.priceUsd
|
|
64962
66995
|
});
|
|
64963
|
-
|
|
64964
|
-
|
|
66996
|
+
view2.asOfSlot = Math.min(view2.asOfSlot, s.lastUpdateSlot);
|
|
66997
|
+
view2.depositedValueUsd += amount * s.priceUsd;
|
|
64965
66998
|
const lt = group?.liquidationThreshold ?? s.liquidationThresholdPct;
|
|
64966
|
-
|
|
66999
|
+
view2.unhealthyBorrowValueUsd += amount * s.priceUsd * lt / 100;
|
|
64967
67000
|
const p = leg(uid);
|
|
64968
67001
|
p.deposits = units;
|
|
64969
67002
|
p.depositsUSD = amount * s.priceUsd;
|
|
@@ -64986,7 +67019,7 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
|
|
|
64986
67019
|
const units = debtUnits(debtSf, s);
|
|
64987
67020
|
const amount = Number(units);
|
|
64988
67021
|
const uid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, b.reserve);
|
|
64989
|
-
|
|
67022
|
+
view2.borrows.push({
|
|
64990
67023
|
reserve: b.reserve,
|
|
64991
67024
|
marketUid: uid,
|
|
64992
67025
|
mint: s.mint,
|
|
@@ -64994,17 +67027,17 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
|
|
|
64994
67027
|
amount,
|
|
64995
67028
|
amountUsd: amount * s.priceUsd
|
|
64996
67029
|
});
|
|
64997
|
-
|
|
64998
|
-
|
|
67030
|
+
view2.asOfSlot = Math.min(view2.asOfSlot, s.lastUpdateSlot);
|
|
67031
|
+
view2.bfAdjustedDebtUsd += amount * s.priceUsd * (o.elevationGroup ? 100 : Math.max(100, s.borrowFactorPct)) / 100;
|
|
64999
67032
|
const p = leg(uid);
|
|
65000
67033
|
p.debt = units;
|
|
65001
67034
|
p.debtUSD = amount * s.priceUsd;
|
|
65002
67035
|
p.debtUSDOracle = amount * s.priceUsd;
|
|
65003
67036
|
}
|
|
65004
|
-
if (
|
|
65005
|
-
if (
|
|
65006
|
-
|
|
65007
|
-
views.push(
|
|
67037
|
+
if (view2.asOfSlot === Infinity) view2.asOfSlot = o.lastUpdateSlot;
|
|
67038
|
+
if (view2.bfAdjustedDebtUsd > 0)
|
|
67039
|
+
view2.healthFactor = view2.unhealthyBorrowValueUsd / view2.bfAdjustedDebtUsd;
|
|
67040
|
+
views.push(view2);
|
|
65008
67041
|
bucket.lendingPositions[o.address] = legs;
|
|
65009
67042
|
bucket.modes[o.address] = String(o.elevationGroup);
|
|
65010
67043
|
bucket.accounts[o.address] = accounts[o.address] ?? {
|
|
@@ -65025,15 +67058,15 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
|
|
|
65025
67058
|
};
|
|
65026
67059
|
}
|
|
65027
67060
|
async function fetchKaminoUserOnchain(account, opts = {}) {
|
|
65028
|
-
const rpc = opts.rpc ?? (0,
|
|
65029
|
-
const hits = await (0,
|
|
67061
|
+
const rpc = opts.rpc ?? (0, import_svm_kit22.createSvmRpc)();
|
|
67062
|
+
const hits = await (0, import_svm_kit22.createSvmFetchers)(rpc).indexed.scanProgram(
|
|
65030
67063
|
KLEND_PROGRAM_ID,
|
|
65031
67064
|
[
|
|
65032
67065
|
{ dataSize: KLEND_OBLIGATION_SIZE },
|
|
65033
67066
|
{
|
|
65034
67067
|
memcmp: {
|
|
65035
67068
|
offset: 0,
|
|
65036
|
-
bytes: (0,
|
|
67069
|
+
bytes: (0, import_svm_kit22.encodeBase58)(Uint8Array.from(KLEND_OBLIGATION_DISCRIMINATOR))
|
|
65037
67070
|
}
|
|
65038
67071
|
},
|
|
65039
67072
|
{ memcmp: { offset: KLEND_OBLIGATION_OWNER_OFFSET, bytes: account } }
|
|
@@ -65044,7 +67077,7 @@ async function fetchKaminoUserOnchain(account, opts = {}) {
|
|
|
65044
67077
|
}
|
|
65045
67078
|
);
|
|
65046
67079
|
const markets = opts.markets && new Set(opts.markets);
|
|
65047
|
-
const obligations = hits.map((h) => decodeKaminoObligation(h.pubkey, (0,
|
|
67080
|
+
const obligations = hits.map((h) => decodeKaminoObligation(h.pubkey, (0, import_svm_kit22.fromBase64)(h.account.data[0]))).filter((o) => !markets || markets.has(o.market));
|
|
65048
67081
|
const reserves = { ...opts.reserves };
|
|
65049
67082
|
const need3 = [
|
|
65050
67083
|
...new Set(
|
|
@@ -65067,8 +67100,8 @@ async function fetchKaminoUserOnchain(account, opts = {}) {
|
|
|
65067
67100
|
const a = accounts2[i];
|
|
65068
67101
|
if (!a || a.owner !== KLEND_PROGRAM_ID) return;
|
|
65069
67102
|
if (i < need3.length)
|
|
65070
|
-
reserves[k] = decodeKaminoReserveState(k, (0,
|
|
65071
|
-
else groups[k] = readKlendElevationGroups((0,
|
|
67103
|
+
reserves[k] = decodeKaminoReserveState(k, (0, import_svm_kit22.fromBase64)(a.data[0]));
|
|
67104
|
+
else groups[k] = readKlendElevationGroups((0, import_svm_kit22.fromBase64)(a.data[0]));
|
|
65072
67105
|
});
|
|
65073
67106
|
}
|
|
65074
67107
|
const accounts = {};
|
|
@@ -65098,7 +67131,7 @@ async function fetchKaminoUserOnchain(account, opts = {}) {
|
|
|
65098
67131
|
init_types();
|
|
65099
67132
|
init_lenders();
|
|
65100
67133
|
var isPositionId = (id) => typeof id === "number" && Number.isSafeInteger(id) && id > 0;
|
|
65101
|
-
var
|
|
67134
|
+
var big2 = (v) => {
|
|
65102
67135
|
try {
|
|
65103
67136
|
return BigInt(v ?? 0);
|
|
65104
67137
|
} catch {
|
|
@@ -65118,8 +67151,8 @@ function convertJupiterLendUserPositions(account, market, positions, vaults = /*
|
|
|
65118
67151
|
skip("liquidated");
|
|
65119
67152
|
continue;
|
|
65120
67153
|
}
|
|
65121
|
-
const supplyRaw =
|
|
65122
|
-
const borrowRaw =
|
|
67154
|
+
const supplyRaw = big2(p.supply);
|
|
67155
|
+
const borrowRaw = big2(p.borrow) + big2(p.dustBorrow);
|
|
65123
67156
|
if (supplyRaw === 0n && borrowRaw === 0n) {
|
|
65124
67157
|
skip("empty");
|
|
65125
67158
|
continue;
|
|
@@ -65213,7 +67246,7 @@ async function fetchJupiterLendUser(account, opts = {}) {
|
|
|
65213
67246
|
ext.borrowPositions[market] = borrows;
|
|
65214
67247
|
ext.earnPositions[market] = earns;
|
|
65215
67248
|
const needsRoster = borrows.some(
|
|
65216
|
-
(p) => !p.isLiquidated && (
|
|
67249
|
+
(p) => !p.isLiquidated && (big2(p.supply) > 0n || big2(p.borrow) + big2(p.dustBorrow) > 0n) && !(p.vault && p.vault.id === p.vaultId)
|
|
65217
67250
|
);
|
|
65218
67251
|
const roster = needsRoster ? new Map((await api.vaults(market)).map((v) => [v.id, v])) : void 0;
|
|
65219
67252
|
const conv = convertJupiterLendUserPositions(
|
|
@@ -65230,13 +67263,13 @@ async function fetchJupiterLendUser(account, opts = {}) {
|
|
|
65230
67263
|
}
|
|
65231
67264
|
|
|
65232
67265
|
// src/lending/user-data/save/obligation.ts
|
|
65233
|
-
var
|
|
67266
|
+
var import_svm_kit23 = require("@1delta/svm-kit");
|
|
65234
67267
|
function decodeSaveObligation(address, data) {
|
|
65235
67268
|
if (data.length !== SAVE_OBLIGATION_SIZE)
|
|
65236
67269
|
throw new Error(
|
|
65237
67270
|
`save obligation ${address}: ${data.length} bytes, expected ${SAVE_OBLIGATION_SIZE}`
|
|
65238
67271
|
);
|
|
65239
|
-
const r = new
|
|
67272
|
+
const r = new import_svm_kit23.BorshReader(data);
|
|
65240
67273
|
const version = r.u8();
|
|
65241
67274
|
const lastUpdateSlot = r.u64();
|
|
65242
67275
|
const stale = r.bool();
|
|
@@ -65299,10 +67332,10 @@ function saveObligationSeed(lendingMarket, index = 0) {
|
|
|
65299
67332
|
throw new Error(`save obligation index out of range: ${index}`);
|
|
65300
67333
|
return lendingMarket.slice(0, 24) + String(index).padStart(6, "0") + "m";
|
|
65301
67334
|
}
|
|
65302
|
-
var sha256 = async (
|
|
67335
|
+
var sha256 = async (bytes2) => new Uint8Array(await crypto.subtle.digest("SHA-256", bytes2));
|
|
65303
67336
|
async function createWithSeed(base, seed, programId) {
|
|
65304
|
-
const b = (0,
|
|
65305
|
-
const p = (0,
|
|
67337
|
+
const b = (0, import_svm_kit23.decodeBase58)(base);
|
|
67338
|
+
const p = (0, import_svm_kit23.decodeBase58)(programId);
|
|
65306
67339
|
if (!b || b.length !== 32) throw new Error(`not a pubkey: ${base}`);
|
|
65307
67340
|
if (!p || p.length !== 32) throw new Error(`not a pubkey: ${programId}`);
|
|
65308
67341
|
const s = new TextEncoder().encode(seed);
|
|
@@ -65311,25 +67344,25 @@ async function createWithSeed(base, seed, programId) {
|
|
|
65311
67344
|
buf.set(b, 0);
|
|
65312
67345
|
buf.set(s, 32);
|
|
65313
67346
|
buf.set(p, 32 + s.length);
|
|
65314
|
-
return (0,
|
|
67347
|
+
return (0, import_svm_kit23.encodeBase58)(await sha256(buf));
|
|
65315
67348
|
}
|
|
65316
67349
|
var saveObligationAddress = (wallet, lendingMarket, index = 0, programId = SAVE_PROGRAM_ID) => createWithSeed(wallet, saveObligationSeed(lendingMarket, index), programId);
|
|
65317
67350
|
|
|
65318
67351
|
// src/lending/user-data/save/fetchUser.ts
|
|
65319
67352
|
init_types();
|
|
65320
|
-
var
|
|
67353
|
+
var import_svm_kit24 = require("@1delta/svm-kit");
|
|
65321
67354
|
init_lenders();
|
|
65322
67355
|
var SAVE_WALLET_POS_ID = "wallet";
|
|
65323
|
-
var readTokenAmount = (
|
|
65324
|
-
if (
|
|
65325
|
-
if ((0,
|
|
67356
|
+
var readTokenAmount = (bytes2, mint) => {
|
|
67357
|
+
if (bytes2.length < 72) return void 0;
|
|
67358
|
+
if ((0, import_svm_kit24.encodeBase58)(bytes2.subarray(0, 32)) !== mint) return void 0;
|
|
65326
67359
|
let v = 0n;
|
|
65327
|
-
for (let i = 71; i >= 64; i--) v = v << 8n | BigInt(
|
|
67360
|
+
for (let i = 71; i >= 64; i--) v = v << 8n | BigInt(bytes2[i]);
|
|
65328
67361
|
return v;
|
|
65329
67362
|
};
|
|
65330
67363
|
async function fetchSaveUser(account, opts = {}) {
|
|
65331
67364
|
const api = createSaveApi(opts);
|
|
65332
|
-
const rpc = opts.rpc ?? (0,
|
|
67365
|
+
const rpc = opts.rpc ?? (0, import_svm_kit24.createSvmRpc)();
|
|
65333
67366
|
const configs = opts.configs ?? await api.marketConfigs();
|
|
65334
67367
|
const markets = selectSaveMarkets(configs, opts);
|
|
65335
67368
|
const step = Math.min(
|
|
@@ -65361,10 +67394,10 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65361
67394
|
reserve,
|
|
65362
67395
|
market: c.market,
|
|
65363
67396
|
cTokenMint: c.collateralMint,
|
|
65364
|
-
address: await (0,
|
|
67397
|
+
address: await (0, import_svm_kit24.getAssociatedTokenAddress)(
|
|
65365
67398
|
account,
|
|
65366
67399
|
c.collateralMint,
|
|
65367
|
-
|
|
67400
|
+
import_svm_kit24.TOKEN_PROGRAM
|
|
65368
67401
|
)
|
|
65369
67402
|
}))
|
|
65370
67403
|
);
|
|
@@ -65385,9 +67418,9 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65385
67418
|
const exists = !!a && a.owner === SAVE_PROGRAM_ID && typeof a.data?.[0] === "string";
|
|
65386
67419
|
(probed[key2] ??= []).push({ index: c.index, address: c.address, exists });
|
|
65387
67420
|
if (!exists) return;
|
|
65388
|
-
const
|
|
65389
|
-
if (
|
|
65390
|
-
found.push({ c, ob: decodeSaveObligation(c.address,
|
|
67421
|
+
const bytes2 = (0, import_svm_kit24.fromBase64)(a.data[0]);
|
|
67422
|
+
if (bytes2.length !== SAVE_OBLIGATION_SIZE) return;
|
|
67423
|
+
found.push({ c, ob: decodeSaveObligation(c.address, bytes2) });
|
|
65391
67424
|
});
|
|
65392
67425
|
if (extend)
|
|
65393
67426
|
for (const c of pending) {
|
|
@@ -65406,9 +67439,9 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65406
67439
|
const wallet = [];
|
|
65407
67440
|
ataCands.forEach((c, i) => {
|
|
65408
67441
|
const a = ataAccounts[i];
|
|
65409
|
-
if (!a || a.owner !==
|
|
67442
|
+
if (!a || a.owner !== import_svm_kit24.TOKEN_PROGRAM || typeof a.data?.[0] !== "string")
|
|
65410
67443
|
return;
|
|
65411
|
-
const amount = readTokenAmount((0,
|
|
67444
|
+
const amount = readTokenAmount((0, import_svm_kit24.fromBase64)(a.data[0]), c.cTokenMint);
|
|
65412
67445
|
if (amount && amount > 0n) wallet.push({ c, cTokens: amount });
|
|
65413
67446
|
});
|
|
65414
67447
|
const reserveIds = [
|
|
@@ -65476,7 +67509,7 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65476
67509
|
address: ob.address,
|
|
65477
67510
|
label: `#${c.index}`
|
|
65478
67511
|
};
|
|
65479
|
-
const
|
|
67512
|
+
const view2 = {
|
|
65480
67513
|
address: ob.address,
|
|
65481
67514
|
market: c.market.address,
|
|
65482
67515
|
lenderKey,
|
|
@@ -65519,13 +67552,13 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65519
67552
|
});
|
|
65520
67553
|
continue;
|
|
65521
67554
|
}
|
|
65522
|
-
const
|
|
67555
|
+
const dec2 = s.reserve.liquidity.mintDecimals;
|
|
65523
67556
|
const raw2 = d2.depositedAmount * saveExchangeRateWad(s.reserve) / SAVE_WAD;
|
|
65524
|
-
const amountStr = scaledToDecimal(raw2,
|
|
67557
|
+
const amountStr = scaledToDecimal(raw2, dec2);
|
|
65525
67558
|
const amount = Number(amountStr);
|
|
65526
67559
|
const price = wadToNumber(s.reserve.liquidity.marketPrice);
|
|
65527
67560
|
const usd = amount * price;
|
|
65528
|
-
|
|
67561
|
+
view2.deposits.push({
|
|
65529
67562
|
reserve: d2.reserve,
|
|
65530
67563
|
marketUid: uid,
|
|
65531
67564
|
mint: s.reserve.liquidity.mintPubkey,
|
|
@@ -65534,10 +67567,10 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65534
67567
|
amountUsd: usd,
|
|
65535
67568
|
served: !reason
|
|
65536
67569
|
});
|
|
65537
|
-
|
|
65538
|
-
|
|
65539
|
-
|
|
65540
|
-
|
|
67570
|
+
view2.depositedValueUsd += usd;
|
|
67571
|
+
view2.allowedBorrowValueUsd += usd * (s.reserve.config.loanToValueRatio / 100);
|
|
67572
|
+
view2.unhealthyBorrowValueUsd += usd * (s.reserve.config.liquidationThreshold / 100);
|
|
67573
|
+
view2.superUnhealthyBorrowValueUsd += usd * (s.reserve.config.maxLiquidationThreshold / 100);
|
|
65541
67574
|
if (reason) {
|
|
65542
67575
|
unserved.push({
|
|
65543
67576
|
lenderKey,
|
|
@@ -65577,18 +67610,18 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65577
67610
|
});
|
|
65578
67611
|
continue;
|
|
65579
67612
|
}
|
|
65580
|
-
const
|
|
67613
|
+
const dec2 = s.reserve.liquidity.mintDecimals;
|
|
65581
67614
|
const price = wadToNumber(s.reserve.liquidity.marketPrice);
|
|
65582
67615
|
const reserveIdx = BigInt(s.reserve.liquidity.cumulativeBorrowRateWads);
|
|
65583
67616
|
const legIdx = b.cumulativeBorrowRateWads;
|
|
65584
67617
|
const wads = legIdx > 0n ? b.borrowedAmountWads * reserveIdx / legIdx : b.borrowedAmountWads;
|
|
65585
|
-
const amountStr = scaledToDecimal(wads, 18 +
|
|
67618
|
+
const amountStr = scaledToDecimal(wads, 18 + dec2);
|
|
65586
67619
|
const amount = Number(amountStr);
|
|
65587
|
-
const atTouch = wadToNumber(b.borrowedAmountWads.toString()) / 10 **
|
|
67620
|
+
const atTouch = wadToNumber(b.borrowedAmountWads.toString()) / 10 ** dec2;
|
|
65588
67621
|
const usd = amount * price;
|
|
65589
67622
|
const addedBps = s.reserve.config.addedBorrowWeightBPS;
|
|
65590
67623
|
const weight = 1 + Number(addedBps) / 1e4;
|
|
65591
|
-
|
|
67624
|
+
view2.borrows.push({
|
|
65592
67625
|
reserve: b.reserve,
|
|
65593
67626
|
marketUid: uid,
|
|
65594
67627
|
mint: s.reserve.liquidity.mintPubkey,
|
|
@@ -65598,8 +67631,8 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65598
67631
|
borrowWeight: weight,
|
|
65599
67632
|
served: !reason
|
|
65600
67633
|
});
|
|
65601
|
-
if (weight > 1e9 && wads > 0n)
|
|
65602
|
-
|
|
67634
|
+
if (weight > 1e9 && wads > 0n) view2.unboundedWeightDebt = true;
|
|
67635
|
+
view2.weightedBorrowValueUsd += usd * weight;
|
|
65603
67636
|
if (reason) {
|
|
65604
67637
|
unserved.push({
|
|
65605
67638
|
lenderKey,
|
|
@@ -65620,8 +67653,8 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65620
67653
|
debtUSDOracle: usd
|
|
65621
67654
|
});
|
|
65622
67655
|
}
|
|
65623
|
-
|
|
65624
|
-
views.push(
|
|
67656
|
+
view2.healthFactor = view2.weightedBorrowValueUsd > 0 ? view2.unhealthyBorrowValueUsd / view2.weightedBorrowValueUsd : Infinity;
|
|
67657
|
+
views.push(view2);
|
|
65625
67658
|
}
|
|
65626
67659
|
const walletViews = [];
|
|
65627
67660
|
for (const { c, cTokens } of wallet) {
|
|
@@ -65629,10 +67662,10 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65629
67662
|
const uid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, c.reserve);
|
|
65630
67663
|
const s = states[c.reserve];
|
|
65631
67664
|
const reason = servedReason(c.reserve);
|
|
65632
|
-
const
|
|
67665
|
+
const dec2 = s?.reserve.liquidity.mintDecimals ?? 0;
|
|
65633
67666
|
const amountStr = s ? scaledToDecimal(
|
|
65634
67667
|
cTokens * saveExchangeRateWad(s.reserve) / SAVE_WAD,
|
|
65635
|
-
|
|
67668
|
+
dec2
|
|
65636
67669
|
) : "0";
|
|
65637
67670
|
const usd = s ? Number(amountStr) * wadToNumber(s.reserve.liquidity.marketPrice) : 0;
|
|
65638
67671
|
walletViews.push({
|
|
@@ -65688,12 +67721,12 @@ async function fetchSaveUser(account, opts = {}) {
|
|
|
65688
67721
|
}
|
|
65689
67722
|
|
|
65690
67723
|
// src/lending/user-data/loopscale/fetchUser.ts
|
|
65691
|
-
var
|
|
67724
|
+
var import_svm_kit25 = require("@1delta/svm-kit");
|
|
65692
67725
|
init_types();
|
|
65693
67726
|
var shortAddr = (a) => `${a.slice(0, 4)}\u2026${a.slice(-4)}`;
|
|
65694
67727
|
function convertLoopscaleUser(account, items, opts) {
|
|
65695
67728
|
const now = opts.now ?? Math.floor(Date.now() / 1e3);
|
|
65696
|
-
const
|
|
67729
|
+
const dec2 = (mint) => opts.decimals[mint];
|
|
65697
67730
|
const positions = {};
|
|
65698
67731
|
const loans = [];
|
|
65699
67732
|
const skipped = [];
|
|
@@ -65704,7 +67737,7 @@ function convertLoopscaleUser(account, items, opts) {
|
|
|
65704
67737
|
...it.ledgers.map((l) => l.principalMint),
|
|
65705
67738
|
...it.collateral.map((c) => c.assetMint)
|
|
65706
67739
|
]);
|
|
65707
|
-
const missing = [...mints].filter((m) =>
|
|
67740
|
+
const missing = [...mints].filter((m) => dec2(m) === void 0);
|
|
65708
67741
|
if (missing.length) {
|
|
65709
67742
|
if (!it.loan.closed)
|
|
65710
67743
|
skipped.push({
|
|
@@ -65713,7 +67746,7 @@ function convertLoopscaleUser(account, items, opts) {
|
|
|
65713
67746
|
});
|
|
65714
67747
|
continue;
|
|
65715
67748
|
}
|
|
65716
|
-
const tok = (raw2, mint) => raw2 / 10 **
|
|
67749
|
+
const tok = (raw2, mint) => raw2 / 10 ** dec2(mint);
|
|
65717
67750
|
const ledgers = it.ledgers.map((l) => {
|
|
65718
67751
|
const d2 = { duration: l.duration, durationType: l.durationType };
|
|
65719
67752
|
const toMaturity = ledgerInterestAt(
|
|
@@ -65887,7 +67920,7 @@ async function fetchLoopscaleUser(account, opts = {}) {
|
|
|
65887
67920
|
];
|
|
65888
67921
|
if (unknown.length) {
|
|
65889
67922
|
try {
|
|
65890
|
-
const mints = await (0,
|
|
67923
|
+
const mints = await (0, import_svm_kit25.getMints)(opts.rpc ?? (0, import_svm_kit25.createSvmRpc)(), unknown);
|
|
65891
67924
|
mints.forEach((m, i) => {
|
|
65892
67925
|
if (m) decimals[unknown[i]] = m.decimals;
|
|
65893
67926
|
});
|
|
@@ -65907,17 +67940,17 @@ async function fetchLoopscaleUser(account, opts = {}) {
|
|
|
65907
67940
|
|
|
65908
67941
|
// src/lending/user-data/project0/fetchUser.ts
|
|
65909
67942
|
init_types();
|
|
65910
|
-
var
|
|
67943
|
+
var import_svm_kit26 = require("@1delta/svm-kit");
|
|
65911
67944
|
init_lenders();
|
|
65912
67945
|
var flagOn = (flags, bit) => (BigInt(flags) & bit) !== 0n;
|
|
65913
67946
|
async function fetchProject0User(account, opts = {}) {
|
|
65914
|
-
const rpc = opts.rpc ?? (0,
|
|
67947
|
+
const rpc = opts.rpc ?? (0, import_svm_kit26.createSvmRpc)();
|
|
65915
67948
|
const groups = opts.groups?.length ? opts.groups : [P0_MAIN_GROUP];
|
|
65916
67949
|
const pub = opts.publicData ?? await fetchProject0Public({ ...opts, rpc, groups });
|
|
65917
67950
|
const found = [];
|
|
65918
67951
|
let discovery = opts.discovery ?? "scan";
|
|
65919
67952
|
let readSlot = 0;
|
|
65920
|
-
const f = (0,
|
|
67953
|
+
const f = (0, import_svm_kit26.createSvmFetchers)(rpc);
|
|
65921
67954
|
for (const group of groups) {
|
|
65922
67955
|
if (discovery === "scan") {
|
|
65923
67956
|
try {
|
|
@@ -65927,7 +67960,7 @@ async function fetchProject0User(account, opts = {}) {
|
|
|
65927
67960
|
{
|
|
65928
67961
|
memcmp: {
|
|
65929
67962
|
offset: 0,
|
|
65930
|
-
bytes: (0,
|
|
67963
|
+
bytes: (0, import_svm_kit26.encodeBase58)(
|
|
65931
67964
|
Uint8Array.from(P0_MARGINFI_ACCOUNT_DISCRIMINATOR)
|
|
65932
67965
|
)
|
|
65933
67966
|
}
|
|
@@ -66019,7 +68052,7 @@ async function fetchProject0User(account, opts = {}) {
|
|
|
66019
68052
|
}).catch(() => void 0) === acc.address;
|
|
66020
68053
|
const label = isPda ? `#${acc.accountIndex}${acc.thirdPartyIndex ? ` \xB7 third party ${acc.thirdPartyIndex}` : ""}` : `keypair ${acc.address.slice(0, 4)}\u2026${acc.address.slice(-4)}`;
|
|
66021
68054
|
const emodeActive = /* @__PURE__ */ new Set();
|
|
66022
|
-
const
|
|
68055
|
+
const view2 = {
|
|
66023
68056
|
address: acc.address,
|
|
66024
68057
|
group,
|
|
66025
68058
|
lenderKey,
|
|
@@ -66051,7 +68084,7 @@ async function fetchProject0User(account, opts = {}) {
|
|
|
66051
68084
|
for (const b of active) {
|
|
66052
68085
|
const hit = rowsByBank.get(b.bank);
|
|
66053
68086
|
if (!hit) {
|
|
66054
|
-
|
|
68087
|
+
view2.incomplete = true;
|
|
66055
68088
|
unserved.push({
|
|
66056
68089
|
account: acc.address,
|
|
66057
68090
|
bank: b.bank,
|
|
@@ -66060,7 +68093,7 @@ async function fetchProject0User(account, opts = {}) {
|
|
|
66060
68093
|
liabilityShares: b.liabilityShares,
|
|
66061
68094
|
reason: !bundle ? "group not served" : meta?.droppedBanks.find((d2) => d2.bank === b.bank)?.reason ?? "not in the group roster"
|
|
66062
68095
|
});
|
|
66063
|
-
|
|
68096
|
+
view2.balances.push({
|
|
66064
68097
|
bank: b.bank,
|
|
66065
68098
|
mint: meta?.banks[b.bank]?.mint ?? "",
|
|
66066
68099
|
symbol: meta?.banks[b.bank]?.symbol ?? b.bank.slice(0, 4),
|
|
@@ -66104,7 +68137,7 @@ async function fetchProject0User(account, opts = {}) {
|
|
|
66104
68137
|
const lwMaint = p0.liabilityWeightMaint;
|
|
66105
68138
|
const depUsd = deposited * price;
|
|
66106
68139
|
const borUsd = borrowed * price;
|
|
66107
|
-
|
|
68140
|
+
view2.balances.push({
|
|
66108
68141
|
bank: b.bank,
|
|
66109
68142
|
marketUid: uid,
|
|
66110
68143
|
mint: row.underlying,
|
|
@@ -66123,10 +68156,10 @@ async function fetchProject0User(account, opts = {}) {
|
|
|
66123
68156
|
emissionsOutstanding: b.emissionsOutstanding,
|
|
66124
68157
|
unpriced: p0.price.source === "none"
|
|
66125
68158
|
});
|
|
66126
|
-
|
|
66127
|
-
|
|
66128
|
-
|
|
66129
|
-
|
|
68159
|
+
view2.assetValueInitUsd += depUsd * awInit;
|
|
68160
|
+
view2.assetValueMaintUsd += depUsd * awMaint;
|
|
68161
|
+
view2.liabilityValueInitUsd += borUsd * lwInit;
|
|
68162
|
+
view2.liabilityValueMaintUsd += borUsd * lwMaint;
|
|
66130
68163
|
legs[uid] = {
|
|
66131
68164
|
marketUid: uid,
|
|
66132
68165
|
deposits: p0DecimalString(deposited, row.decimals),
|
|
@@ -66140,13 +68173,13 @@ async function fetchProject0User(account, opts = {}) {
|
|
|
66140
68173
|
claimableRewards: 0
|
|
66141
68174
|
};
|
|
66142
68175
|
}
|
|
66143
|
-
|
|
66144
|
-
|
|
68176
|
+
view2.healthFactor = view2.liabilityValueMaintUsd > 0 ? view2.assetValueMaintUsd / view2.liabilityValueMaintUsd : Infinity;
|
|
68177
|
+
view2.freeCollateralUsd = Math.max(
|
|
66145
68178
|
0,
|
|
66146
|
-
|
|
68179
|
+
view2.assetValueInitUsd - view2.liabilityValueInitUsd
|
|
66147
68180
|
);
|
|
66148
|
-
|
|
66149
|
-
views.push(
|
|
68181
|
+
view2.emodeActive = [...emodeActive];
|
|
68182
|
+
views.push(view2);
|
|
66150
68183
|
if (!active.length) continue;
|
|
66151
68184
|
const out = positions[lenderKey] ??= {
|
|
66152
68185
|
chainId: SOLANA_CHAIN_ID,
|
|
@@ -66379,7 +68412,7 @@ function kaminoTermAdapter(row, market) {
|
|
|
66379
68412
|
if (row.originationFee === void 0)
|
|
66380
68413
|
pending["borrow.fees"] = "origination and flash-loan fees are in the reserve account, which was not read";
|
|
66381
68414
|
for (const p of market?.pending ?? []) pending[`market: ${p}`] = p;
|
|
66382
|
-
const
|
|
68415
|
+
const liq2 = market?.liquidation;
|
|
66383
68416
|
return {
|
|
66384
68417
|
profileId: KAMINO_PROFILE_ID,
|
|
66385
68418
|
borrow: {
|
|
@@ -66453,14 +68486,14 @@ function kaminoTermAdapter(row, market) {
|
|
|
66453
68486
|
debtWithdrawalCap: capExt(k.debtWithdrawalCap),
|
|
66454
68487
|
// remaining new debt outside any elevation group (`borrowLimitOutsideElevationGroup − tracked`)
|
|
66455
68488
|
debtCapacityOutsideGroups: base.debtCapacity,
|
|
66456
|
-
...
|
|
68489
|
+
...liq2 ? {
|
|
66457
68490
|
fullLiquidation: {
|
|
66458
68491
|
// obligation LTV above which the close factor is 100 %
|
|
66459
|
-
aboveLtv:
|
|
68492
|
+
aboveLtv: liq2.insolvencyRiskUnhealthyLtvPct / 100,
|
|
66460
68493
|
// a debt leg worth less than this is liquidated whole
|
|
66461
|
-
belowDebtValueUsd:
|
|
68494
|
+
belowDebtValueUsd: liq2.minFullLiquidationValueThresholdUsd,
|
|
66462
68495
|
// one liquidation repays at most this
|
|
66463
|
-
maxPerLiquidationUsd:
|
|
68496
|
+
maxPerLiquidationUsd: liq2.maxLiquidatableDebtMarketValueAtOnceUsd
|
|
66464
68497
|
}
|
|
66465
68498
|
} : {},
|
|
66466
68499
|
...k.pairIncentives.length ? { pairIncentives: k.pairIncentives } : {}
|
|
@@ -67326,9 +69359,12 @@ function project0TermAdapter(row, group) {
|
|
|
67326
69359
|
HUMA_SEEDS,
|
|
67327
69360
|
HttpError,
|
|
67328
69361
|
JL_BPS,
|
|
69362
|
+
JL_EXCHANGE_PRICES_PRECISION,
|
|
67329
69363
|
JL_FACTOR_SCALE,
|
|
67330
69364
|
JL_ORACLE_DECIMALS,
|
|
67331
69365
|
JL_ORACLE_SCALE,
|
|
69366
|
+
JL_VAULTS_ACCOUNTS_IDL,
|
|
69367
|
+
JL_VAULT_AMOUNT_DECIMALS,
|
|
67332
69368
|
JUPITER_LEND_API_BASE,
|
|
67333
69369
|
JUPITER_LEND_KEYED_API_BASE,
|
|
67334
69370
|
JUPITER_LEND_KEY_PREFIX,
|
|
@@ -67337,9 +69373,11 @@ function project0TermAdapter(row, group) {
|
|
|
67337
69373
|
JUPITER_LEND_PROGRAMS,
|
|
67338
69374
|
JUPITER_PRICE_API_BASE,
|
|
67339
69375
|
JUPITER_PRICE_KEYED_API_BASE,
|
|
69376
|
+
JUP_DEX_PROGRAM,
|
|
67340
69377
|
JUP_FLASHLOAN_IDL,
|
|
67341
69378
|
JUP_FLASHLOAN_PROGRAMS,
|
|
67342
69379
|
JUP_LIQUIDITY_PROGRAMS,
|
|
69380
|
+
JUP_VAULTS_PROGRAMS,
|
|
67343
69381
|
KAMINO_API_BASE,
|
|
67344
69382
|
KAMINO_KEY_PREFIX,
|
|
67345
69383
|
KAMINO_MAIN_MARKET,
|
|
@@ -67359,6 +69397,7 @@ function project0TermAdapter(row, group) {
|
|
|
67359
69397
|
KLEND_RESERVE_SIZE,
|
|
67360
69398
|
KLEND_RESERVE_SLICE,
|
|
67361
69399
|
KLEND_U64_MAX,
|
|
69400
|
+
KVAULT_PROGRAM_ID,
|
|
67362
69401
|
LENDER_BRAND_NAMES,
|
|
67363
69402
|
LOANS_PAGE,
|
|
67364
69403
|
LOOPSCALE_ACCOUNT_DISCRIMINATORS,
|
|
@@ -67489,6 +69528,7 @@ function project0TermAdapter(row, group) {
|
|
|
67489
69528
|
convertJupiterLendOracleEntries,
|
|
67490
69529
|
convertJupiterLendUserPositions,
|
|
67491
69530
|
convertJupiterLendVault,
|
|
69531
|
+
convertKaminoKvault,
|
|
67492
69532
|
convertKaminoLoans,
|
|
67493
69533
|
convertKaminoMarket,
|
|
67494
69534
|
convertKaminoOraclePrices,
|
|
@@ -67505,6 +69545,7 @@ function project0TermAdapter(row, group) {
|
|
|
67505
69545
|
createExponentApi,
|
|
67506
69546
|
createJupiterLendApi,
|
|
67507
69547
|
createKaminoApi,
|
|
69548
|
+
createKaminoKvaultApi,
|
|
67508
69549
|
createLimiter,
|
|
67509
69550
|
createLoopscaleApi,
|
|
67510
69551
|
createMarketUid,
|
|
@@ -67514,6 +69555,7 @@ function project0TermAdapter(row, group) {
|
|
|
67514
69555
|
createSolsticeAppApi,
|
|
67515
69556
|
createWithSeed,
|
|
67516
69557
|
decimalStringToI80F48,
|
|
69558
|
+
decimalStringToRaw,
|
|
67517
69559
|
decodeAccountingState,
|
|
67518
69560
|
decodeController,
|
|
67519
69561
|
decodeCooldownEscrow,
|
|
@@ -67522,6 +69564,7 @@ function project0TermAdapter(row, group) {
|
|
|
67522
69564
|
decodeHumaPoolConfig,
|
|
67523
69565
|
decodeHumaPoolState,
|
|
67524
69566
|
decodeHumaRedemptionRequest,
|
|
69567
|
+
decodeJlRateModel,
|
|
67525
69568
|
decodeJuniorUnlockShare,
|
|
67526
69569
|
decodeJupFlashloanAdmin,
|
|
67527
69570
|
decodeKaminoObligation,
|
|
@@ -67566,6 +69609,7 @@ function project0TermAdapter(row, group) {
|
|
|
67566
69609
|
fetchJupiterLendPublic,
|
|
67567
69610
|
fetchJupiterLendUser,
|
|
67568
69611
|
fetchJupiterPrices,
|
|
69612
|
+
fetchKaminoKvaults,
|
|
67569
69613
|
fetchKaminoOracleEntries,
|
|
67570
69614
|
fetchKaminoOraclePrices,
|
|
67571
69615
|
fetchKaminoPublic,
|
|
@@ -67608,6 +69652,8 @@ function project0TermAdapter(row, group) {
|
|
|
67608
69652
|
i80f48ToNumber,
|
|
67609
69653
|
isBorrowable,
|
|
67610
69654
|
isEvmChainId,
|
|
69655
|
+
isJlSmartCol,
|
|
69656
|
+
isJlSmartDebt,
|
|
67611
69657
|
isJupiterLend,
|
|
67612
69658
|
isKamino,
|
|
67613
69659
|
isLenderBrand,
|
|
@@ -67627,8 +69673,17 @@ function project0TermAdapter(row, group) {
|
|
|
67627
69673
|
isSyntheticQuoteMint,
|
|
67628
69674
|
isU64Max,
|
|
67629
69675
|
isUncapped,
|
|
69676
|
+
jlLiquidityExchangePrices,
|
|
67630
69677
|
jlOraclePriceInBorrow,
|
|
67631
69678
|
jlOracleToFluidRaw,
|
|
69679
|
+
jlOverallTokenData,
|
|
69680
|
+
jlUserBorrowData,
|
|
69681
|
+
jlUserSupplyData,
|
|
69682
|
+
jlVaultAdminPda,
|
|
69683
|
+
jlVaultConfigPda,
|
|
69684
|
+
jlVaultExchangePrices,
|
|
69685
|
+
jlVaultStatePda,
|
|
69686
|
+
jlVaultToRaw,
|
|
67632
69687
|
joinableBatch,
|
|
67633
69688
|
juniorUnlockSharePda,
|
|
67634
69689
|
jupFlashBorrowPosition,
|
|
@@ -67647,6 +69702,7 @@ function project0TermAdapter(row, group) {
|
|
|
67647
69702
|
kaminoCloseFactor,
|
|
67648
69703
|
kaminoDefaultEntry,
|
|
67649
69704
|
kaminoGroupLabel,
|
|
69705
|
+
kaminoKvaultOriginRow,
|
|
67650
69706
|
kaminoMarketFromKey,
|
|
67651
69707
|
kaminoMarketKey,
|
|
67652
69708
|
kaminoOracleEntriesFromMarkets,
|
|
@@ -67708,9 +69764,12 @@ function project0TermAdapter(row, group) {
|
|
|
67708
69764
|
readHumaChainState,
|
|
67709
69765
|
readHumaLenderState,
|
|
67710
69766
|
readHumaRedemptionRequests,
|
|
69767
|
+
readJlLayerIrms,
|
|
69768
|
+
readJlNextVaultId,
|
|
67711
69769
|
readJupFlashAssets,
|
|
67712
69770
|
readJupFlashAvailable,
|
|
67713
69771
|
readJupFlashloanAdmin,
|
|
69772
|
+
readJupiterLendVaultsOnchain,
|
|
67714
69773
|
readKlendElevationGroups,
|
|
67715
69774
|
readKlendFlashFacts,
|
|
67716
69775
|
readKlendLendingMarket,
|