@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/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: () => 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/flashloan.ts
9577
- var import_svm_kit2 = require("@1delta/svm-kit");
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/flashloan.json
9580
- var flashloan_default = {
9581
- address: "jupgfSgfuAXv4B6R2Uxu85Z1qdzgju79s6MfZekN6XS",
9380
+ // src/lending/public-data/jupiter-lend/idl/vaults-accounts.json
9381
+ var vaults_accounts_default = {
9382
+ address: "jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi",
9582
9383
  metadata: {
9583
- name: "flashloan",
9584
- version: "0.1.4",
9384
+ name: "vaults",
9385
+ version: "0.1.5",
9585
9386
  spec: "0.1.0",
9586
- description: "Created with Anchor"
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: "activate_protocol",
9392
+ name: "Dex",
9591
9393
  discriminator: [
9592
- 230,
9593
- 235,
9594
- 188,
9595
- 19,
9596
- 120,
9597
- 91,
9598
- 11,
9599
- 94
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: "flashloan_borrow",
9405
+ name: "TokenReserve",
9615
9406
  discriminator: [
9616
- 103,
9617
- 19,
9618
- 78,
9619
- 24,
9620
- 240,
9621
- 9,
9407
+ 21,
9408
+ 18,
9409
+ 59,
9622
9410
  135,
9623
- 63
9624
- ],
9625
- accounts: [
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: "flashloan_payback",
9418
+ name: "UserBorrowPosition",
9692
9419
  discriminator: [
9693
- 213,
9694
- 47,
9695
- 153,
9696
- 137,
9697
- 84,
9698
- 243,
9699
- 94,
9700
- 232
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: "init_flashloan_admin",
9431
+ name: "UserSupplyPosition",
9769
9432
  discriminator: [
9770
- 185,
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
- 154,
9773
- 56,
9774
- 95,
9775
- 12,
9776
- 187,
9777
- 139
9778
- ],
9779
- accounts: [
9780
- {
9781
- name: "signer",
9782
- writable: true,
9783
- signer: true
9784
- },
9785
- {
9786
- name: "flashloan_admin",
9787
- writable: true,
9788
- pda: {
9789
- seeds: [
9790
- {
9791
- kind: "const",
9792
- value: [
9793
- 102,
9794
- 108,
9795
- 97,
9796
- 115,
9797
- 104,
9798
- 108,
9799
- 111,
9800
- 97,
9801
- 110,
9802
- 95,
9803
- 97,
9804
- 100,
9805
- 109,
9806
- 105,
9807
- 110
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, import_svm_kit2.decodeBase58)(address);
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, import_svm_kit2.findProgramAddress)(
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, import_svm_kit2.findProgramAddress)(
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, import_svm_kit2.findProgramAddress)(
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, import_svm_kit2.findProgramAddress)(
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, import_svm_kit2.findProgramAddress)(
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, import_svm_kit2.getAssociatedTokenAddress)(await jupLiquidity(market), mint, tokenProgram);
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, import_svm_kit2.decodeIdlAccount)(JUP_FLASHLOAN_IDL, "FlashloanAdmin", data);
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, import_svm_kit2.fromBase64)(a.data[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 readJupFlashAssets(rpc, market = "main") {
10202
- const admin = await jupFlashloanAdmin(market);
10203
- const rows = await rpc.call(
10204
- "getProgramAccounts",
10205
- [
10206
- JUP_LIQUIDITY_PROGRAMS[market],
10207
- {
10208
- encoding: "base64",
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 mints = /* @__PURE__ */ new Set();
10216
- for (const r of rows) mints.add((0, import_svm_kit2.encodeBase58)((0, import_svm_kit2.fromBase64)(r.account.data[0])));
10217
- return [...mints];
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
- return BigInt(r.value.amount);
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
- for (const v of vaults) {
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.4;
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 SECONDS_PER_YEAR = 31536e3;
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 import_svm_kit3 = require("@1delta/svm-kit");
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, import_svm_kit3.getMints)(opts.rpc, toProbe);
10937
- const dec = /* @__PURE__ */ new Map();
10938
- mints.forEach((m, i) => m && dec.set(toProbe[i], m.decimals));
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 && dec.has(c)) {
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 = dec.get(pair.collateralMint);
12570
+ pair.collateralDecimals = dec2.get(pair.collateralMint);
10947
12571
  if (pair.principalDecimals === void 0)
10948
- pair.principalDecimals = dec.get(pair.principalMint);
12572
+ pair.principalDecimals = dec2.get(pair.principalMint);
10949
12573
  }
10950
- for (const c of unknown) if (!dec.has(c)) unresolved.push(c);
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 import_svm_kit5 = require("@1delta/svm-kit");
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 import_svm_kit4 = require("@1delta/svm-kit");
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, import_svm_kit4.decodeIdlAccount)(LOOPSCALE_IDL, "Loan", data));
18371
- const zero = (0, import_svm_kit4.encodeBase58)(new Uint8Array(32));
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, import_svm_kit4.decodeIdlAccount)(LOOPSCALE_IDL, "Strategy", data));
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, import_svm_kit4.fromBase64)(a.data[0])) : null
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, import_svm_kit4.decodeIdlAccount)(LOOPSCALE_IDL, "MarketInformation", data));
18458
- const zero = (0, import_svm_kit4.encodeBase58)(new Uint8Array(32));
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, import_svm_kit4.fromBase64)(a.data[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, import_svm_kit5.createSvmRpc)();
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 dec = /* @__PURE__ */ new Map();
18820
- for (const [m, t] of Object.entries(tokenList ?? {})) dec.set(m, t.decimals);
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
- dec.set(p.principalMint, p.principalDecimals);
20452
+ dec2.set(p.principalMint, p.principalDecimals);
18824
20453
  if (p.collateralMint && p.collateralDecimals !== void 0)
18825
- dec.set(p.collateralMint, p.collateralDecimals);
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 = dec.get(mint);
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 import_svm_kit6 = require("@1delta/svm-kit");
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, import_svm_kit6.fromBase64)(data) : data;
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 import_svm_kit7 = require("@1delta/svm-kit");
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 utf83 = (s) => new TextEncoder().encode(s);
33873
- var pk3 = (address) => {
33874
- const b = (0, import_svm_kit7.decodeBase58)(address);
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 u16le = (n) => {
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, import_svm_kit7.findProgramAddress)(
33885
- [utf83(P0_SEEDS.liquidityVaultAuthority), pk3(bank)],
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, import_svm_kit7.findProgramAddress)(
33889
- [utf83(P0_SEEDS.liquidityVault), pk3(bank)],
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, import_svm_kit7.findProgramAddress)([utf83(P0_SEEDS.feeState)], programId)).address;
33893
- var p0MarginfiAccountPda = async (authority, accountIndex = 0, opts = {}) => (await (0, import_svm_kit7.findProgramAddress)(
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
- utf83(P0_SEEDS.marginfiAccount),
33896
- pk3(opts.group ?? P0_MAIN_GROUP),
33897
- pk3(authority),
33898
- u16le(accountIndex),
33899
- u16le(opts.thirdPartyId ?? 0)
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 bytes = typeof data === "string" ? (0, import_svm_kit7.fromBase64)(data) : data;
33984
- const r = (0, import_svm_kit7.decodeIdlAccount)(P0_IDL, "Bank", bytes);
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 bytes = typeof data === "string" ? (0, import_svm_kit7.fromBase64)(data) : data;
34210
- const r = (0, import_svm_kit7.decodeIdlAccount)(P0_IDL, "MarginfiGroup", bytes);
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 bytes = typeof data === "string" ? (0, import_svm_kit7.fromBase64)(data) : data;
34244
- const r = (0, import_svm_kit7.decodeIdlAccount)(
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
- bytes
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, import_svm_kit7.findProgramAddress)([utf83("metadata"), pk3(bank)], programId)).address;
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 bytes = typeof data === "string" ? (0, import_svm_kit7.fromBase64)(data) : data;
34302
- const r = (0, import_svm_kit7.decodeIdlAccount)(P0_IDL, "BankMetadata", bytes);
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 import_svm_kit8 = require("@1delta/svm-kit");
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, import_svm_kit8.encodeBase58)(data.slice(OFFSET_POOL_MINT, OFFSET_POOL_MINT + 32)),
34482
- reserveStake: (0, import_svm_kit8.encodeBase58)(
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 import_svm_kit8.BorshReader(data);
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, import_svm_kit8.fromBase64)(a.data[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 import_svm_kit9 = require("@1delta/svm-kit");
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, import_svm_kit9.fromBase64)(a.data[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 ? `SPL stake pool ${pool} rate ${liveRate.toFixed(6)}` : "";
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 import_svm_kit10 = require("@1delta/svm-kit");
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, import_svm_kit10.createSvmRpc)() : opts.rpc;
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 dec = t.asset.decimals;
35634
- const totalAssetsFormatted = Number(t.totalAssets) / 10 ** dec;
35635
- const liquidityFormatted = Number(t.liquiditySupplyData.withdrawable) / 10 ** dec;
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: dec,
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: dec,
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 import_svm_kit11 = require("@1delta/svm-kit");
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 utf84 = (s) => new TextEncoder().encode(s);
46590
- var pk4 = (address) => {
46591
- const b = (0, import_svm_kit11.decodeBase58)(address);
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, import_svm_kit11.findProgramAddress)(seeds, programId)).address;
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([utf84(s)], programId))
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([utf84("COOLDOWN_ESCROW"), pk4(user)], programId),
46612
- pda([utf84("COOLDOWN_ESCROW_VAULT"), pk4(user)], programId)
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 = utf84(name);
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([utf84("CONTROLLER")], programId),
46630
- pda([utf84("STRATEGY"), n], programId),
46631
- pda([utf84("ACCOUNTING"), n], programId),
46632
- pda([utf84("JUNIOR_MINT"), n], programId),
46633
- pda([utf84("SENIOR_MINT"), n], programId),
46634
- pda([utf84("ASSET_VAULT"), n], programId),
46635
- pda([utf84("FEE_VAULT"), n], programId)
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
- utf84(tag),
46651
- utf84(strategyName),
48438
+ utf85(tag),
48439
+ utf85(strategyName),
46652
48440
  Uint8Array.of(0),
46653
- utf84(batchName)
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([utf84("JUNIOR_UNLOCK_SHARE"), pk4(batch), pk4(user)], programId);
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
- [utf84("SENIOR_UNLOCK_COOLDOWN"), utf84(strategyName), pk4(user)],
48454
+ [utf85("SENIOR_UNLOCK_COOLDOWN"), utf85(strategyName), pk5(user)],
46667
48455
  programId
46668
48456
  ),
46669
48457
  pda(
46670
- [utf84("SENIOR_COOLDOWN_VAULT"), utf84(strategyName), pk4(user)],
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([utf84("CANONICAL"), utf84(feedId)], programId);
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, import_svm_kit11.decodeIdlAccount)(YV, "Controller", d2);
46681
- var decodeYieldPool = (d2) => (0, import_svm_kit11.decodeIdlAccount)(YV, "YieldPool", d2);
46682
- var decodeVestingSchedule = (d2) => (0, import_svm_kit11.decodeIdlAccount)(YV, "VestingSchedule", d2);
46683
- var decodeCooldownEscrow = (d2) => (0, import_svm_kit11.decodeIdlAccount)(YV, "CooldownEscrow", d2);
46684
- var decodeStrategyController = (d2) => (0, import_svm_kit11.decodeIdlAccount)(YS, "Controller", d2);
46685
- var decodeStrategy = (d2) => (0, import_svm_kit11.decodeIdlAccount)(YS, "Strategy", d2);
46686
- var decodeAccountingState = (d2) => (0, import_svm_kit11.decodeIdlAccount)(YS, "AccountingState", d2);
46687
- var decodeSettlementBatch = (d2) => (0, import_svm_kit11.decodeIdlAccount)(YS, "SettlementBatch", d2);
46688
- var decodeJuniorUnlockShare = (d2) => (0, import_svm_kit11.decodeIdlAccount)(YS, "JuniorUnlockShare", d2);
46689
- var decodeSeniorUnlockCooldown = (d2) => (0, import_svm_kit11.decodeIdlAccount)(YS, "SeniorUnlockCooldown", d2);
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, import_svm_kit11.encodeBase58)(Uint8Array.from(a.discriminator));
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, import_svm_kit11.fromBase64)(a.data[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, import_svm_kit11.fromBase64)(raw2.data[0])) ?? void 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 SECONDS_PER_YEAR2 = 31536000n;
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(SECONDS_PER_YEAR2) / Number(epochSeconds);
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 import_svm_kit12 = require("@1delta/svm-kit");
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, import_svm_kit12.createSvmFetchers)(rpc);
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, import_svm_kit12.fromBase64)(r.account.data[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, import_svm_kit12.createSvmRpc)();
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 import_svm_kit13 = require("@1delta/svm-kit");
49030
+ var import_svm_kit17 = require("@1delta/svm-kit");
47243
49031
  async function fetchSolsticeUser(account, opts = {}) {
47244
- const rpc = opts.rpc ?? (0, import_svm_kit13.createSvmRpc)();
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, import_svm_kit13.getAssociatedTokenAddress)(account, r.address, import_svm_kit13.TOKEN_PROGRAM)
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 bytes = (a) => a ? (0, import_svm_kit13.fromBase64)(a.data[0]) : void 0;
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 = bytes(next());
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 = bytes(next());
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 = bytes(next());
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 = bytes(next());
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 import_svm_kit14 = require("@1delta/svm-kit");
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 utf85 = (s) => new TextEncoder().encode(s);
63457
- var pk5 = (address) => {
63458
- const b = (0, import_svm_kit14.decodeBase58)(address);
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, import_svm_kit14.findProgramAddress)(seeds, HUMA_PROGRAM).then((r) => r.address);
63463
- var humaPoolConfigPda = () => pda2([utf85("pool_config"), pk5(HUMA_POOL.poolId)]);
63464
- var humaPoolStatePda = () => pda2([utf85("pool_state"), pk5(HUMA_POOL.poolConfig)]);
63465
- var humaPoolAuthorityPda = () => pda2([utf85("pool_authority"), pk5(HUMA_POOL.poolConfig)]);
63466
- var humaModeConfigPda = (modeId) => pda2([utf85("mode_config"), pk5(HUMA_POOL.poolConfig), pk5(modeId)]);
63467
- var humaModeMintPda = (modeConfig) => pda2([utf85("mode_mint"), pk5(HUMA_POOL.poolConfig), pk5(modeConfig)]);
63468
- var humaLenderStatePda = (modeConfig, lender) => pda2([utf85("lender_state"), pk5(modeConfig), pk5(lender)]);
63469
- var humaDeploymentStatePda = (deploymentConfig) => pda2([utf85("deployment_state"), pk5(deploymentConfig)]);
63470
- var humaRedemptionRequestPda = (id, poolConfig) => pda2([utf85("redemption_request"), u128be(id), pk5(poolConfig)]);
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, import_svm_kit14.decodeIdlAccount)(HUMA_IDL, "PoolState", d2);
63479
- var decodeHumaModeConfig = (d2) => (0, import_svm_kit14.decodeIdlAccount)(HUMA_IDL, "ModeConfig", d2);
63480
- var decodeHumaPoolConfig = (d2) => (0, import_svm_kit14.decodeIdlAccount)(HUMA_IDL, "PoolConfig", d2);
63481
- var decodeHumaLenderState = (d2) => (0, import_svm_kit14.decodeIdlAccount)(HUMA_IDL, "LenderState", d2);
63482
- var decodeHumaRedemptionRequest = (d2) => (0, import_svm_kit14.decodeIdlAccount)(HUMA_IDL, "RedemptionRequest", d2);
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, import_svm_kit14.getAssociatedTokenAddress)(
65284
+ const poolUnderlyingToken = await (0, import_svm_kit18.getAssociatedTokenAddress)(
63497
65285
  await humaPoolAuthorityPda(),
63498
65286
  pool.underlyingMint,
63499
- import_svm_kit14.TOKEN_PROGRAM
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, import_svm_kit14.fromBase64)(need2(first[0], "pool_state").data[0])
65294
+ (0, import_svm_kit18.fromBase64)(need2(first[0], "pool_state").data[0])
63507
65295
  );
63508
65296
  const config = decodeHumaPoolConfig(
63509
- (0, import_svm_kit14.fromBase64)(need2(first[1], "pool_config").data[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, import_svm_kit14.fromBase64)(first[2].data[0]) : void 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, import_svm_kit14.fromBase64)(need2(modeAcct, "mode_config").data[0])
65315
+ (0, import_svm_kit18.fromBase64)(need2(modeAcct, "mode_config").data[0])
63528
65316
  );
63529
- const mintData = (0, import_svm_kit14.fromBase64)(need2(mintAcct, "pst_mint").data[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, import_svm_kit14.fromBase64)(a.data[0])) : null
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, import_svm_kit14.fromBase64)(r.account.data[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 import_svm_kit15 = require("@1delta/svm-kit");
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, import_svm_kit15.createSvmRpc)();
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 dec = opts.decimals ?? listed3?.decimals;
63724
- if (dec === void 0) return void 0;
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 ** dec;
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) * SECONDS_PER_YEAR + extApr * extAmount;
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 * SECONDS_PER_YEAR * p / (tvl * priceUsd) * 100;
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
- decimals: dec,
63770
- assetDecimals: dec,
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 ** dec)),
65563
+ convertToAssets: String(Math.round(sharePrice * 10 ** dec2)),
63774
65564
  convertToShares: String(
63775
- sharePrice > 0 ? Math.round(1 / sharePrice * 10 ** dec) : 0
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 ** dec,
63788
- liquidityUsd: idle / 10 ** dec * (priceUsd ?? 0),
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 import_svm_kit16 = require("@1delta/svm-kit");
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 SECONDS_PER_YEAR3 = 365.25 * 86400;
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 * (SECONDS_PER_YEAR3 / epochSeconds) * 100,
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: import_svm_kit16.WRAPPED_SOL,
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, import_svm_kit16.createSvmRpc)();
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
- [import_svm_kit16.WRAPPED_SOL],
65938
+ [import_svm_kit20.WRAPPED_SOL],
63996
65939
  tokenList,
63997
65940
  opts.priceApi
63998
- ).then((p) => p.byMint[import_svm_kit16.WRAPPED_SOL]).catch(() => void 0);
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
- return {
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" ? "direct" : p.source === "fixed" ? "direct" : "derived",
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 import_svm_kit17 = require("@1delta/svm-kit");
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, import_svm_kit17.decodeIdlAccount)(KLEND_IDL, "Obligation", data);
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, import_svm_kit17.decodeIdlAccount)(KLEND_IDL, "Reserve", data);
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 view = {
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
- view.deposits.push({
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
- view.asOfSlot = Math.min(view.asOfSlot, s.lastUpdateSlot);
64964
- view.depositedValueUsd += amount * s.priceUsd;
66996
+ view2.asOfSlot = Math.min(view2.asOfSlot, s.lastUpdateSlot);
66997
+ view2.depositedValueUsd += amount * s.priceUsd;
64965
66998
  const lt = group?.liquidationThreshold ?? s.liquidationThresholdPct;
64966
- view.unhealthyBorrowValueUsd += amount * s.priceUsd * lt / 100;
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
- view.borrows.push({
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
- view.asOfSlot = Math.min(view.asOfSlot, s.lastUpdateSlot);
64998
- view.bfAdjustedDebtUsd += amount * s.priceUsd * (o.elevationGroup ? 100 : Math.max(100, s.borrowFactorPct)) / 100;
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 (view.asOfSlot === Infinity) view.asOfSlot = o.lastUpdateSlot;
65005
- if (view.bfAdjustedDebtUsd > 0)
65006
- view.healthFactor = view.unhealthyBorrowValueUsd / view.bfAdjustedDebtUsd;
65007
- views.push(view);
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, import_svm_kit17.createSvmRpc)();
65029
- const hits = await (0, import_svm_kit17.createSvmFetchers)(rpc).indexed.scanProgram(
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, import_svm_kit17.encodeBase58)(Uint8Array.from(KLEND_OBLIGATION_DISCRIMINATOR))
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, import_svm_kit17.fromBase64)(h.account.data[0]))).filter((o) => !markets || markets.has(o.market));
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, import_svm_kit17.fromBase64)(a.data[0]));
65071
- else groups[k] = readKlendElevationGroups((0, import_svm_kit17.fromBase64)(a.data[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 big = (v) => {
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 = big(p.supply);
65122
- const borrowRaw = big(p.borrow) + big(p.dustBorrow);
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 && (big(p.supply) > 0n || big(p.borrow) + big(p.dustBorrow) > 0n) && !(p.vault && p.vault.id === p.vaultId)
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 import_svm_kit18 = require("@1delta/svm-kit");
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 import_svm_kit18.BorshReader(data);
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 (bytes) => new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
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, import_svm_kit18.decodeBase58)(base);
65305
- const p = (0, import_svm_kit18.decodeBase58)(programId);
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, import_svm_kit18.encodeBase58)(await sha256(buf));
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 import_svm_kit19 = require("@1delta/svm-kit");
67353
+ var import_svm_kit24 = require("@1delta/svm-kit");
65321
67354
  init_lenders();
65322
67355
  var SAVE_WALLET_POS_ID = "wallet";
65323
- var readTokenAmount = (bytes, mint) => {
65324
- if (bytes.length < 72) return void 0;
65325
- if ((0, import_svm_kit19.encodeBase58)(bytes.subarray(0, 32)) !== mint) return void 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(bytes[i]);
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, import_svm_kit19.createSvmRpc)();
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, import_svm_kit19.getAssociatedTokenAddress)(
67397
+ address: await (0, import_svm_kit24.getAssociatedTokenAddress)(
65365
67398
  account,
65366
67399
  c.collateralMint,
65367
- import_svm_kit19.TOKEN_PROGRAM
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 bytes = (0, import_svm_kit19.fromBase64)(a.data[0]);
65389
- if (bytes.length !== SAVE_OBLIGATION_SIZE) return;
65390
- found.push({ c, ob: decodeSaveObligation(c.address, bytes) });
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 !== import_svm_kit19.TOKEN_PROGRAM || typeof a.data?.[0] !== "string")
67442
+ if (!a || a.owner !== import_svm_kit24.TOKEN_PROGRAM || typeof a.data?.[0] !== "string")
65410
67443
  return;
65411
- const amount = readTokenAmount((0, import_svm_kit19.fromBase64)(a.data[0]), c.cTokenMint);
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 view = {
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 dec = s.reserve.liquidity.mintDecimals;
67555
+ const dec2 = s.reserve.liquidity.mintDecimals;
65523
67556
  const raw2 = d2.depositedAmount * saveExchangeRateWad(s.reserve) / SAVE_WAD;
65524
- const amountStr = scaledToDecimal(raw2, dec);
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
- view.deposits.push({
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
- view.depositedValueUsd += usd;
65538
- view.allowedBorrowValueUsd += usd * (s.reserve.config.loanToValueRatio / 100);
65539
- view.unhealthyBorrowValueUsd += usd * (s.reserve.config.liquidationThreshold / 100);
65540
- view.superUnhealthyBorrowValueUsd += usd * (s.reserve.config.maxLiquidationThreshold / 100);
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 dec = s.reserve.liquidity.mintDecimals;
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 + dec);
67618
+ const amountStr = scaledToDecimal(wads, 18 + dec2);
65586
67619
  const amount = Number(amountStr);
65587
- const atTouch = wadToNumber(b.borrowedAmountWads.toString()) / 10 ** dec;
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
- view.borrows.push({
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) view.unboundedWeightDebt = true;
65602
- view.weightedBorrowValueUsd += usd * weight;
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
- view.healthFactor = view.weightedBorrowValueUsd > 0 ? view.unhealthyBorrowValueUsd / view.weightedBorrowValueUsd : Infinity;
65624
- views.push(view);
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 dec = s?.reserve.liquidity.mintDecimals ?? 0;
67665
+ const dec2 = s?.reserve.liquidity.mintDecimals ?? 0;
65633
67666
  const amountStr = s ? scaledToDecimal(
65634
67667
  cTokens * saveExchangeRateWad(s.reserve) / SAVE_WAD,
65635
- dec
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 import_svm_kit20 = require("@1delta/svm-kit");
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 dec = (mint) => opts.decimals[mint];
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) => dec(m) === void 0);
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 ** dec(mint);
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, import_svm_kit20.getMints)(opts.rpc ?? (0, import_svm_kit20.createSvmRpc)(), unknown);
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 import_svm_kit21 = require("@1delta/svm-kit");
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, import_svm_kit21.createSvmRpc)();
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, import_svm_kit21.createSvmFetchers)(rpc);
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, import_svm_kit21.encodeBase58)(
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 view = {
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
- view.incomplete = true;
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
- view.balances.push({
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
- view.balances.push({
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
- view.assetValueInitUsd += depUsd * awInit;
66127
- view.assetValueMaintUsd += depUsd * awMaint;
66128
- view.liabilityValueInitUsd += borUsd * lwInit;
66129
- view.liabilityValueMaintUsd += borUsd * lwMaint;
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
- view.healthFactor = view.liabilityValueMaintUsd > 0 ? view.assetValueMaintUsd / view.liabilityValueMaintUsd : Infinity;
66144
- view.freeCollateralUsd = Math.max(
68176
+ view2.healthFactor = view2.liabilityValueMaintUsd > 0 ? view2.assetValueMaintUsd / view2.liabilityValueMaintUsd : Infinity;
68177
+ view2.freeCollateralUsd = Math.max(
66145
68178
  0,
66146
- view.assetValueInitUsd - view.liabilityValueInitUsd
68179
+ view2.assetValueInitUsd - view2.liabilityValueInitUsd
66147
68180
  );
66148
- view.emodeActive = [...emodeActive];
66149
- views.push(view);
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 liq = market?.liquidation;
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
- ...liq ? {
68489
+ ...liq2 ? {
66457
68490
  fullLiquidation: {
66458
68491
  // obligation LTV above which the close factor is 100 %
66459
- aboveLtv: liq.insolvencyRiskUnhealthyLtvPct / 100,
68492
+ aboveLtv: liq2.insolvencyRiskUnhealthyLtvPct / 100,
66460
68493
  // a debt leg worth less than this is liquidated whole
66461
- belowDebtValueUsd: liq.minFullLiquidationValueThresholdUsd,
68494
+ belowDebtValueUsd: liq2.minFullLiquidationValueThresholdUsd,
66462
68495
  // one liquidation repays at most this
66463
- maxPerLiquidationUsd: liq.maxLiquidatableDebtMarketValueAtOnceUsd
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,