@1delta/margin-fetcher-sol 0.0.1 → 0.0.2

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,
@@ -344,6 +353,7 @@ __export(index_exports, {
344
353
  fetchJupiterLendPublic: () => fetchJupiterLendPublic,
345
354
  fetchJupiterLendUser: () => fetchJupiterLendUser,
346
355
  fetchJupiterPrices: () => fetchJupiterPrices,
356
+ fetchKaminoKvaults: () => fetchKaminoKvaults,
347
357
  fetchKaminoOracleEntries: () => fetchKaminoOracleEntries,
348
358
  fetchKaminoOraclePrices: () => fetchKaminoOraclePrices,
349
359
  fetchKaminoPublic: () => fetchKaminoPublic,
@@ -386,6 +396,8 @@ __export(index_exports, {
386
396
  i80f48ToNumber: () => i80f48ToNumber,
387
397
  isBorrowable: () => isBorrowable,
388
398
  isEvmChainId: () => import_chain_registry.isEvmChainId,
399
+ isJlSmartCol: () => isJlSmartCol,
400
+ isJlSmartDebt: () => isJlSmartDebt,
389
401
  isJupiterLend: () => import_lender_registry2.isJupiterLend,
390
402
  isKamino: () => import_lender_registry2.isKamino,
391
403
  isLenderBrand: () => isLenderBrand,
@@ -405,8 +417,17 @@ __export(index_exports, {
405
417
  isSyntheticQuoteMint: () => isSyntheticQuoteMint,
406
418
  isU64Max: () => isU64Max,
407
419
  isUncapped: () => isUncapped,
420
+ jlLiquidityExchangePrices: () => jlLiquidityExchangePrices,
408
421
  jlOraclePriceInBorrow: () => jlOraclePriceInBorrow,
409
422
  jlOracleToFluidRaw: () => jlOracleToFluidRaw,
423
+ jlOverallTokenData: () => jlOverallTokenData,
424
+ jlUserBorrowData: () => jlUserBorrowData,
425
+ jlUserSupplyData: () => jlUserSupplyData,
426
+ jlVaultAdminPda: () => jlVaultAdminPda,
427
+ jlVaultConfigPda: () => jlVaultConfigPda,
428
+ jlVaultExchangePrices: () => jlVaultExchangePrices,
429
+ jlVaultStatePda: () => jlVaultStatePda,
430
+ jlVaultToRaw: () => jlVaultToRaw,
410
431
  joinableBatch: () => joinableBatch,
411
432
  juniorUnlockSharePda: () => juniorUnlockSharePda,
412
433
  jupFlashBorrowPosition: () => jupFlashBorrowPosition,
@@ -425,6 +446,7 @@ __export(index_exports, {
425
446
  kaminoCloseFactor: () => kaminoCloseFactor,
426
447
  kaminoDefaultEntry: () => kaminoDefaultEntry,
427
448
  kaminoGroupLabel: () => kaminoGroupLabel,
449
+ kaminoKvaultOriginRow: () => kaminoKvaultOriginRow,
428
450
  kaminoMarketFromKey: () => import_lender_registry2.kaminoMarketFromKey,
429
451
  kaminoMarketKey: () => import_lender_registry2.kaminoMarketKey,
430
452
  kaminoOracleEntriesFromMarkets: () => kaminoOracleEntriesFromMarkets,
@@ -486,9 +508,11 @@ __export(index_exports, {
486
508
  readHumaChainState: () => readHumaChainState,
487
509
  readHumaLenderState: () => readHumaLenderState,
488
510
  readHumaRedemptionRequests: () => readHumaRedemptionRequests,
511
+ readJlNextVaultId: () => readJlNextVaultId,
489
512
  readJupFlashAssets: () => readJupFlashAssets,
490
513
  readJupFlashAvailable: () => readJupFlashAvailable,
491
514
  readJupFlashloanAdmin: () => readJupFlashloanAdmin,
515
+ readJupiterLendVaultsOnchain: () => readJupiterLendVaultsOnchain,
492
516
  readKlendElevationGroups: () => readKlendElevationGroups,
493
517
  readKlendFlashFacts: () => readKlendFlashFacts,
494
518
  readKlendLendingMarket: () => readKlendLendingMarket,
@@ -9319,259 +9343,838 @@ function createJupiterLendApi(opts = {}) {
9319
9343
  // src/lending/public-data/jupiter-lend/convertPublic.ts
9320
9344
  init_types();
9321
9345
  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
9346
+
9347
+ // src/lending/public-data/jupiter-lend/onchain.ts
9348
+ var import_svm_kit3 = require("@1delta/svm-kit");
9349
+
9350
+ // src/lending/public-data/jupiter-lend/idl/vaults-accounts.json
9351
+ var vaults_accounts_default = {
9352
+ address: "jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi",
9353
+ metadata: {
9354
+ name: "vaults",
9355
+ version: "0.1.5",
9356
+ spec: "0.1.0",
9357
+ 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."
9358
+ },
9359
+ instructions: [],
9360
+ accounts: [
9361
+ {
9362
+ name: "Dex",
9363
+ discriminator: [
9364
+ 236,
9365
+ 30,
9366
+ 181,
9367
+ 80,
9368
+ 209,
9369
+ 217,
9370
+ 25,
9371
+ 163
9372
+ ]
9525
9373
  },
9526
- loan: {
9527
- assets: [{ underlying: bor.address, decimals: bor.decimals }],
9528
- dex: null,
9529
- perShare: null
9374
+ {
9375
+ name: "TokenReserve",
9376
+ discriminator: [
9377
+ 21,
9378
+ 18,
9379
+ 59,
9380
+ 135,
9381
+ 120,
9382
+ 20,
9383
+ 31,
9384
+ 12
9385
+ ]
9386
+ },
9387
+ {
9388
+ name: "UserBorrowPosition",
9389
+ discriminator: [
9390
+ 73,
9391
+ 126,
9392
+ 65,
9393
+ 123,
9394
+ 220,
9395
+ 126,
9396
+ 197,
9397
+ 24
9398
+ ]
9399
+ },
9400
+ {
9401
+ name: "UserSupplyPosition",
9402
+ discriminator: [
9403
+ 202,
9404
+ 219,
9405
+ 136,
9406
+ 118,
9407
+ 61,
9408
+ 177,
9409
+ 21,
9410
+ 146
9411
+ ]
9412
+ },
9413
+ {
9414
+ name: "VaultAdmin",
9415
+ discriminator: [
9416
+ 88,
9417
+ 97,
9418
+ 160,
9419
+ 117,
9420
+ 102,
9421
+ 39,
9422
+ 103,
9423
+ 44
9424
+ ]
9425
+ },
9426
+ {
9427
+ name: "VaultConfig",
9428
+ discriminator: [
9429
+ 99,
9430
+ 86,
9431
+ 43,
9432
+ 216,
9433
+ 184,
9434
+ 102,
9435
+ 119,
9436
+ 77
9437
+ ]
9438
+ },
9439
+ {
9440
+ name: "VaultState",
9441
+ discriminator: [
9442
+ 228,
9443
+ 196,
9444
+ 82,
9445
+ 165,
9446
+ 98,
9447
+ 210,
9448
+ 235,
9449
+ 152
9450
+ ]
9451
+ },
9452
+ {
9453
+ name: "Oracle",
9454
+ discriminator: [
9455
+ 139,
9456
+ 194,
9457
+ 131,
9458
+ 179,
9459
+ 140,
9460
+ 179,
9461
+ 229,
9462
+ 244
9463
+ ]
9530
9464
  }
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
- }
9465
+ ],
9466
+ types: [
9467
+ {
9468
+ name: "Dex",
9469
+ docs: [
9470
+ "Core DEX pool state. One per trading pair.",
9471
+ "Uses zero_copy for efficient access without deserialization overhead."
9472
+ ],
9473
+ serialization: "bytemuck",
9474
+ repr: {
9475
+ kind: "c",
9476
+ packed: true
9477
+ },
9478
+ type: {
9479
+ kind: "struct",
9480
+ fields: [
9481
+ {
9482
+ name: "dex_id",
9483
+ type: "u16"
9484
+ },
9485
+ {
9486
+ name: "re_entrancy",
9487
+ type: "u8"
9488
+ },
9489
+ {
9490
+ name: "token_0",
9491
+ type: "pubkey"
9492
+ },
9493
+ {
9494
+ name: "token_1",
9495
+ type: "pubkey"
9496
+ },
9497
+ {
9498
+ name: "token_0_decimals",
9499
+ type: "u8"
9500
+ },
9501
+ {
9502
+ name: "token_1_decimals",
9503
+ type: "u8"
9504
+ },
9505
+ {
9506
+ name: "last_to_last_stored_price",
9507
+ type: "u128"
9508
+ },
9509
+ {
9510
+ name: "last_stored_price",
9511
+ type: "u128"
9512
+ },
9513
+ {
9514
+ name: "center_price",
9515
+ type: "u128"
9516
+ },
9517
+ {
9518
+ name: "last_update_timestamp",
9519
+ type: "u64"
9520
+ },
9521
+ {
9522
+ name: "last_update_slot",
9523
+ type: "u64"
9524
+ },
9525
+ {
9526
+ name: "is_smart_collateral_enabled",
9527
+ type: "u8"
9528
+ },
9529
+ {
9530
+ name: "is_smart_debt_enabled",
9531
+ type: "u8"
9532
+ },
9533
+ {
9534
+ name: "fee",
9535
+ type: "u32"
9536
+ },
9537
+ {
9538
+ name: "revenue_cut",
9539
+ type: "u8"
9540
+ },
9541
+ {
9542
+ name: "percent_change_active",
9543
+ type: "u8"
9544
+ },
9545
+ {
9546
+ name: "upper_percent",
9547
+ type: "u32"
9548
+ },
9549
+ {
9550
+ name: "lower_percent",
9551
+ type: "u32"
9552
+ },
9553
+ {
9554
+ name: "threshold_change_active",
9555
+ type: "u8"
9556
+ },
9557
+ {
9558
+ name: "upper_shift_threshold_percent",
9559
+ type: "u16"
9560
+ },
9561
+ {
9562
+ name: "lower_shift_threshold_percent",
9563
+ type: "u16"
9564
+ },
9565
+ {
9566
+ name: "shifting_time",
9567
+ type: "u32"
9568
+ },
9569
+ {
9570
+ name: "center_price_address",
9571
+ type: "pubkey"
9572
+ },
9573
+ {
9574
+ name: "max_center_price",
9575
+ type: "u64"
9576
+ },
9577
+ {
9578
+ name: "min_center_price",
9579
+ type: "u64"
9580
+ },
9581
+ {
9582
+ name: "token_0_max_utilization",
9583
+ type: "u16"
9584
+ },
9585
+ {
9586
+ name: "token_1_max_utilization",
9587
+ type: "u16"
9588
+ },
9589
+ {
9590
+ name: "is_center_price_shift_active",
9591
+ type: "u8"
9592
+ },
9593
+ {
9594
+ name: "swap_and_arbitrage_paused",
9595
+ type: "u8"
9596
+ },
9597
+ {
9598
+ name: "total_supply_shares",
9599
+ type: "u64"
9600
+ },
9601
+ {
9602
+ name: "max_supply_shares",
9603
+ type: "u64"
9604
+ },
9605
+ {
9606
+ name: "total_borrow_shares",
9607
+ type: "u64"
9608
+ },
9609
+ {
9610
+ name: "max_borrow_shares",
9611
+ type: "u64"
9612
+ },
9613
+ {
9614
+ name: "range_old_upper_shift",
9615
+ type: "u32"
9616
+ },
9617
+ {
9618
+ name: "range_old_lower_shift",
9619
+ type: "u32"
9620
+ },
9621
+ {
9622
+ name: "range_shift_duration",
9623
+ type: "u32"
9624
+ },
9625
+ {
9626
+ name: "range_shift_start_timestamp",
9627
+ type: "u32"
9628
+ },
9629
+ {
9630
+ name: "threshold_old_upper_shift",
9631
+ type: "u16"
9632
+ },
9633
+ {
9634
+ name: "threshold_old_lower_shift",
9635
+ type: "u16"
9636
+ },
9637
+ {
9638
+ name: "threshold_shift_duration",
9639
+ type: "u32"
9640
+ },
9641
+ {
9642
+ name: "threshold_shift_start_timestamp",
9643
+ type: "u32"
9644
+ },
9645
+ {
9646
+ name: "threshold_shift_old_timestamp",
9647
+ type: "u32"
9648
+ },
9649
+ {
9650
+ name: "center_price_shift_start_timestamp",
9651
+ type: "u32"
9652
+ },
9653
+ {
9654
+ name: "center_price_shift_percent",
9655
+ type: "u32"
9656
+ },
9657
+ {
9658
+ name: "center_price_shift_time",
9659
+ type: "u32"
9660
+ },
9661
+ {
9662
+ name: "_reserved",
9663
+ type: {
9664
+ array: [
9665
+ "u8",
9666
+ 32
9667
+ ]
9668
+ }
9669
+ },
9670
+ {
9671
+ name: "bump",
9672
+ type: "u8"
9673
+ }
9674
+ ]
9675
+ }
9676
+ },
9677
+ {
9678
+ name: "TokenReserve",
9679
+ docs: [
9680
+ "Token configuration and exchange prices"
9681
+ ],
9682
+ serialization: "bytemuck",
9683
+ repr: {
9684
+ kind: "c",
9685
+ packed: true
9686
+ },
9687
+ type: {
9688
+ kind: "struct",
9689
+ fields: [
9690
+ {
9691
+ name: "mint",
9692
+ type: "pubkey"
9693
+ },
9694
+ {
9695
+ name: "vault",
9696
+ type: "pubkey"
9697
+ },
9698
+ {
9699
+ name: "borrow_rate",
9700
+ type: "u16"
9701
+ },
9702
+ {
9703
+ name: "fee_on_interest",
9704
+ type: "u16"
9705
+ },
9706
+ {
9707
+ name: "last_utilization",
9708
+ type: "u16"
9709
+ },
9710
+ {
9711
+ name: "last_update_timestamp",
9712
+ type: "u64"
9713
+ },
9714
+ {
9715
+ name: "supply_exchange_price",
9716
+ type: "u64"
9717
+ },
9718
+ {
9719
+ name: "borrow_exchange_price",
9720
+ type: "u64"
9721
+ },
9722
+ {
9723
+ name: "max_utilization",
9724
+ type: "u16"
9725
+ },
9726
+ {
9727
+ name: "total_supply_with_interest",
9728
+ type: "u64"
9729
+ },
9730
+ {
9731
+ name: "total_supply_interest_free",
9732
+ type: "u64"
9733
+ },
9734
+ {
9735
+ name: "total_borrow_with_interest",
9736
+ type: "u64"
9737
+ },
9738
+ {
9739
+ name: "total_borrow_interest_free",
9740
+ type: "u64"
9741
+ },
9742
+ {
9743
+ name: "total_claim_amount",
9744
+ type: "u64"
9745
+ },
9746
+ {
9747
+ name: "interacting_protocol",
9748
+ type: "pubkey"
9749
+ },
9750
+ {
9751
+ name: "interacting_timestamp",
9752
+ type: "u64"
9753
+ },
9754
+ {
9755
+ name: "interacting_balance",
9756
+ type: "u64"
9757
+ }
9758
+ ]
9759
+ }
9760
+ },
9761
+ {
9762
+ name: "UserBorrowPosition",
9763
+ docs: [
9764
+ "User borrow position"
9765
+ ],
9766
+ serialization: "bytemuck",
9767
+ repr: {
9768
+ kind: "c",
9769
+ packed: true
9770
+ },
9771
+ type: {
9772
+ kind: "struct",
9773
+ fields: [
9774
+ {
9775
+ name: "protocol",
9776
+ type: "pubkey"
9777
+ },
9778
+ {
9779
+ name: "mint",
9780
+ type: "pubkey"
9781
+ },
9782
+ {
9783
+ name: "with_interest",
9784
+ type: "u8"
9785
+ },
9786
+ {
9787
+ name: "amount",
9788
+ type: "u64"
9789
+ },
9790
+ {
9791
+ name: "debt_ceiling",
9792
+ type: "u64"
9793
+ },
9794
+ {
9795
+ name: "last_update",
9796
+ type: "u64"
9797
+ },
9798
+ {
9799
+ name: "expand_pct",
9800
+ type: "u16"
9801
+ },
9802
+ {
9803
+ name: "expand_duration",
9804
+ type: "u32"
9805
+ },
9806
+ {
9807
+ name: "base_debt_ceiling",
9808
+ type: "u64"
9809
+ },
9810
+ {
9811
+ name: "max_debt_ceiling",
9812
+ type: "u64"
9813
+ },
9814
+ {
9815
+ name: "status",
9816
+ type: "u8"
9817
+ }
9818
+ ]
9819
+ }
9820
+ },
9821
+ {
9822
+ name: "UserSupplyPosition",
9823
+ docs: [
9824
+ "User supply position"
9825
+ ],
9826
+ serialization: "bytemuck",
9827
+ repr: {
9828
+ kind: "c",
9829
+ packed: true
9830
+ },
9831
+ type: {
9832
+ kind: "struct",
9833
+ fields: [
9834
+ {
9835
+ name: "protocol",
9836
+ type: "pubkey"
9837
+ },
9838
+ {
9839
+ name: "mint",
9840
+ type: "pubkey"
9841
+ },
9842
+ {
9843
+ name: "with_interest",
9844
+ type: "u8"
9845
+ },
9846
+ {
9847
+ name: "amount",
9848
+ type: "u64"
9849
+ },
9850
+ {
9851
+ name: "withdrawal_limit",
9852
+ type: "u64"
9853
+ },
9854
+ {
9855
+ name: "decay_amount",
9856
+ type: "u64"
9857
+ },
9858
+ {
9859
+ name: "last_update",
9860
+ type: "u64"
9861
+ },
9862
+ {
9863
+ name: "expand_pct",
9864
+ type: "u16"
9865
+ },
9866
+ {
9867
+ name: "expand_duration",
9868
+ type: "u32"
9869
+ },
9870
+ {
9871
+ name: "decay_duration",
9872
+ type: "u32"
9873
+ },
9874
+ {
9875
+ name: "base_withdrawal_limit",
9876
+ type: "u64"
9877
+ },
9878
+ {
9879
+ name: "status",
9880
+ type: "u8"
9881
+ }
9882
+ ]
9883
+ }
9884
+ },
9885
+ {
9886
+ name: "VaultAdmin",
9887
+ type: {
9888
+ kind: "struct",
9889
+ fields: [
9890
+ {
9891
+ name: "authority",
9892
+ type: "pubkey"
9893
+ },
9894
+ {
9895
+ name: "liquidity_program",
9896
+ type: "pubkey"
9897
+ },
9898
+ {
9899
+ name: "next_vault_id",
9900
+ type: "u16"
9901
+ },
9902
+ {
9903
+ name: "auths",
9904
+ type: {
9905
+ vec: "pubkey"
9906
+ }
9907
+ },
9908
+ {
9909
+ name: "bump",
9910
+ type: "u8"
9911
+ }
9912
+ ]
9913
+ }
9914
+ },
9915
+ {
9916
+ name: "VaultConfig",
9917
+ serialization: "bytemuck",
9918
+ repr: {
9919
+ kind: "c",
9920
+ packed: true
9921
+ },
9922
+ type: {
9923
+ kind: "struct",
9924
+ fields: [
9925
+ {
9926
+ name: "vault_id",
9927
+ type: "u16"
9928
+ },
9929
+ {
9930
+ name: "supply_rate_magnifier",
9931
+ type: "i16"
9932
+ },
9933
+ {
9934
+ name: "borrow_rate_magnifier",
9935
+ type: "i16"
9936
+ },
9937
+ {
9938
+ name: "collateral_factor",
9939
+ type: "u16"
9940
+ },
9941
+ {
9942
+ name: "liquidation_threshold",
9943
+ type: "u16"
9944
+ },
9945
+ {
9946
+ name: "liquidation_max_limit",
9947
+ type: "u16"
9948
+ },
9949
+ {
9950
+ name: "withdraw_gap",
9951
+ type: "u16"
9952
+ },
9953
+ {
9954
+ name: "liquidation_penalty",
9955
+ type: "u16"
9956
+ },
9957
+ {
9958
+ name: "borrow_fee",
9959
+ type: "u8"
9960
+ },
9961
+ {
9962
+ name: "vault_type",
9963
+ type: "u8"
9964
+ },
9965
+ {
9966
+ name: "oracle",
9967
+ type: "pubkey"
9968
+ },
9969
+ {
9970
+ name: "rebalancer",
9971
+ type: "pubkey"
9972
+ },
9973
+ {
9974
+ name: "liquidity_program",
9975
+ type: "pubkey"
9976
+ },
9977
+ {
9978
+ name: "oracle_program",
9979
+ type: "pubkey"
9980
+ },
9981
+ {
9982
+ name: "supply_token",
9983
+ type: "pubkey"
9984
+ },
9985
+ {
9986
+ name: "borrow_token",
9987
+ type: "pubkey"
9988
+ },
9989
+ {
9990
+ name: "bump",
9991
+ type: "u8"
9992
+ }
9993
+ ]
9994
+ }
9995
+ },
9996
+ {
9997
+ name: "VaultState",
9998
+ serialization: "bytemuck",
9999
+ repr: {
10000
+ kind: "c",
10001
+ packed: true
10002
+ },
10003
+ type: {
10004
+ kind: "struct",
10005
+ fields: [
10006
+ {
10007
+ name: "vault_id",
10008
+ type: "u16"
10009
+ },
10010
+ {
10011
+ name: "branch_liquidated",
10012
+ type: "u8"
10013
+ },
10014
+ {
10015
+ name: "topmost_tick",
10016
+ type: "i32"
10017
+ },
10018
+ {
10019
+ name: "current_branch_id",
10020
+ type: "u32"
10021
+ },
10022
+ {
10023
+ name: "total_branch_id",
10024
+ type: "u32"
10025
+ },
10026
+ {
10027
+ name: "total_supply",
10028
+ type: "u64"
10029
+ },
10030
+ {
10031
+ name: "total_borrow",
10032
+ type: "u64"
10033
+ },
10034
+ {
10035
+ name: "total_positions",
10036
+ type: "u32"
10037
+ },
10038
+ {
10039
+ name: "absorbed_debt_amount",
10040
+ type: "u128"
10041
+ },
10042
+ {
10043
+ name: "absorbed_col_amount",
10044
+ type: "u128"
10045
+ },
10046
+ {
10047
+ name: "absorbed_dust_debt",
10048
+ type: "u64"
10049
+ },
10050
+ {
10051
+ name: "liquidity_supply_exchange_price",
10052
+ type: "u64"
10053
+ },
10054
+ {
10055
+ name: "liquidity_borrow_exchange_price",
10056
+ type: "u64"
10057
+ },
10058
+ {
10059
+ name: "vault_supply_exchange_price",
10060
+ type: "u64"
10061
+ },
10062
+ {
10063
+ name: "vault_borrow_exchange_price",
10064
+ type: "u64"
10065
+ },
10066
+ {
10067
+ name: "next_position_id",
10068
+ type: "u32"
10069
+ },
10070
+ {
10071
+ name: "last_update_timestamp",
10072
+ type: "u64"
10073
+ }
10074
+ ]
10075
+ }
10076
+ },
10077
+ {
10078
+ name: "Oracle",
10079
+ type: {
10080
+ kind: "struct",
10081
+ fields: [
10082
+ {
10083
+ name: "nonce",
10084
+ type: "u16"
10085
+ },
10086
+ {
10087
+ name: "sources",
10088
+ type: {
10089
+ vec: {
10090
+ defined: {
10091
+ name: "Sources"
10092
+ }
10093
+ }
10094
+ }
10095
+ },
10096
+ {
10097
+ name: "bump",
10098
+ type: "u8"
10099
+ }
10100
+ ]
10101
+ }
10102
+ },
10103
+ {
10104
+ name: "Sources",
10105
+ type: {
10106
+ kind: "struct",
10107
+ fields: [
10108
+ {
10109
+ name: "source",
10110
+ type: "pubkey"
10111
+ },
10112
+ {
10113
+ name: "invert",
10114
+ type: "bool"
10115
+ },
10116
+ {
10117
+ name: "multiplier",
10118
+ type: "u128"
10119
+ },
10120
+ {
10121
+ name: "divisor",
10122
+ type: "u128"
10123
+ },
10124
+ {
10125
+ name: "source_type",
10126
+ type: {
10127
+ defined: {
10128
+ name: "SourceType"
10129
+ }
10130
+ }
10131
+ }
10132
+ ]
10133
+ }
10134
+ },
10135
+ {
10136
+ name: "SourceType",
10137
+ type: {
10138
+ kind: "enum",
10139
+ variants: [
10140
+ {
10141
+ name: "Pyth"
10142
+ },
10143
+ {
10144
+ name: "StakePool"
10145
+ },
10146
+ {
10147
+ name: "MsolPool"
10148
+ },
10149
+ {
10150
+ name: "Redstone"
10151
+ },
10152
+ {
10153
+ name: "Chainlink"
10154
+ },
10155
+ {
10156
+ name: "SinglePool"
10157
+ },
10158
+ {
10159
+ name: "JupLend"
10160
+ },
10161
+ {
10162
+ name: "ChainlinkDataStreams"
10163
+ },
10164
+ {
10165
+ name: "PstPool"
10166
+ },
10167
+ {
10168
+ name: "DexSmartColPegOracle"
10169
+ },
10170
+ {
10171
+ name: "DexSmartDebtPegOracle"
10172
+ }
10173
+ ]
10174
+ }
10175
+ }
10176
+ ]
10177
+ };
9575
10178
 
9576
10179
  // src/lending/public-data/jupiter-lend/flashloan.ts
9577
10180
  var import_svm_kit2 = require("@1delta/svm-kit");
@@ -10191,38 +10794,885 @@ function decodeJupFlashloanAdmin(data) {
10191
10794
  activeAmount: BigInt(a.active_flashloan_amount)
10192
10795
  };
10193
10796
  }
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]));
10797
+ async function readJupFlashloanAdmin(rpc, market = "main") {
10798
+ const address = await jupFlashloanAdmin(market);
10799
+ const { accounts } = await rpc.readAccounts([address], { encoding: "base64" });
10800
+ const a = accounts[0];
10801
+ if (!a || a.owner !== JUP_FLASHLOAN_PROGRAMS[market]) return null;
10802
+ return decodeJupFlashloanAdmin((0, import_svm_kit2.fromBase64)(a.data[0]));
10803
+ }
10804
+ async function readJupFlashAssets(rpc, market = "main") {
10805
+ const admin = await jupFlashloanAdmin(market);
10806
+ const rows = await rpc.call(
10807
+ "getProgramAccounts",
10808
+ [
10809
+ JUP_LIQUIDITY_PROGRAMS[market],
10810
+ {
10811
+ encoding: "base64",
10812
+ dataSlice: { offset: 40, length: 32 },
10813
+ filters: [{ memcmp: { offset: 8, bytes: admin } }]
10814
+ }
10815
+ ],
10816
+ { accounts: 1 }
10817
+ );
10818
+ const mints = /* @__PURE__ */ new Set();
10819
+ for (const r of rows) mints.add((0, import_svm_kit2.encodeBase58)((0, import_svm_kit2.fromBase64)(r.account.data[0])));
10820
+ return [...mints];
10821
+ }
10822
+ async function readJupFlashAvailable(rpc, mint, tokenProgram, market = "main") {
10823
+ const vault = await jupLiquidityVault(mint, tokenProgram, market);
10824
+ const r = await rpc.call(
10825
+ "getTokenAccountBalance",
10826
+ [vault]
10827
+ );
10828
+ return BigInt(r.value.amount);
10829
+ }
10830
+
10831
+ // src/lending/public-data/jupiter-lend/onchain.ts
10832
+ var JL_VAULTS_ACCOUNTS_IDL = vaults_accounts_default;
10833
+ var JUP_VAULTS_PROGRAMS = {
10834
+ main: "jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi",
10835
+ ethena: "jupo974WCqAUMD3RtpayTap1me7StQCWtEkBbDb6Ba3"
10836
+ };
10837
+ var JUP_DEX_PROGRAM = "jupZ4m2GqUCJ5iueMfzQf8khFfH31d4XAQt3RzCT9Vd";
10838
+ var JL_EXCHANGE_PRICES_PRECISION = 10n ** 12n;
10839
+ var RATE_OUTPUT = 10n ** 18n;
10840
+ var SCALE_FACTOR = 10n ** 18n;
10841
+ var FOUR_DECIMALS = 10000n;
10842
+ var SECONDS_PER_YEAR = 31536000n;
10843
+ var DEFAULT_MAX_UTILIZATION = 9500n;
10844
+ var JL_VAULT_AMOUNT_DECIMALS = 9;
10845
+ var isJlSmartCol = (t) => t === 2 || t === 4;
10846
+ var isJlSmartDebt = (t) => t === 3 || t === 4;
10847
+ var utf83 = (s) => new TextEncoder().encode(s);
10848
+ var u16le = (n) => new Uint8Array([n & 255, n >> 8 & 255]);
10849
+ var big = (v) => BigInt(v ?? 0);
10850
+ var maxB = (a, b) => a > b ? a : b;
10851
+ var minB = (a, b) => a < b ? a : b;
10852
+ var jlVaultConfigPda = async (vaultId, market = "main") => (await (0, import_svm_kit3.findProgramAddress)(
10853
+ [utf83("vault_config"), u16le(vaultId)],
10854
+ JUP_VAULTS_PROGRAMS[market]
10855
+ )).address;
10856
+ var jlVaultStatePda = async (vaultId, market = "main") => (await (0, import_svm_kit3.findProgramAddress)(
10857
+ [utf83("vault_state"), u16le(vaultId)],
10858
+ JUP_VAULTS_PROGRAMS[market]
10859
+ )).address;
10860
+ var jlVaultAdminPda = async (market = "main") => (await (0, import_svm_kit3.findProgramAddress)([utf83("vault_admin")], JUP_VAULTS_PROGRAMS[market])).address;
10861
+ var liq = async (seeds, market) => (await (0, import_svm_kit3.findProgramAddress)(seeds, JUP_LIQUIDITY_PROGRAMS[market])).address;
10862
+ var pk3 = async (a) => {
10863
+ const b = (0, import_svm_kit3.decodeBase58)(a);
10864
+ if (!b || b.length !== 32) throw new Error(`not a pubkey: ${a}`);
10865
+ return b;
10866
+ };
10867
+ var dec = (name, data) => (0, import_svm_kit3.decodeIdlAccount)(JL_VAULTS_ACCOUNTS_IDL, name, (0, import_svm_kit3.fromBase64)(data));
10868
+ var ratio = (withInterest, free) => {
10869
+ if (withInterest > free) return [free * FOUR_DECIMALS / withInterest, false];
10870
+ if (withInterest < free) return [withInterest * FOUR_DECIMALS / free, true];
10871
+ return [withInterest > 0n ? FOUR_DECIMALS : 0n, false];
10872
+ };
10873
+ function jlLiquidityExchangePrices(r, now) {
10874
+ let supplyEx = big(r.supply_exchange_price);
10875
+ let borrowEx = big(r.borrow_exchange_price);
10876
+ const borrowRate = BigInt(r.borrow_rate);
10877
+ const dt = now - big(r.last_update_timestamp);
10878
+ if (supplyEx === 0n || borrowEx === 0n || dt <= 0n || borrowRate === 0n)
10879
+ return { supplyEx, borrowEx };
10880
+ borrowEx += borrowEx * borrowRate * dt / (SECONDS_PER_YEAR * FOUR_DECIMALS);
10881
+ const [supplyRatio, supplyInverse] = ratio(
10882
+ big(r.total_supply_with_interest),
10883
+ big(r.total_supply_interest_free)
10884
+ );
10885
+ const [borrowRatio, borrowInverse] = ratio(
10886
+ big(r.total_borrow_with_interest),
10887
+ big(r.total_borrow_interest_free)
10888
+ );
10889
+ if (borrowRatio === 1n) return { supplyEx, borrowEx };
10890
+ if (supplyInverse && supplyRatio === 0n) return { supplyEx, borrowEx };
10891
+ const util = BigInt(r.last_utilization);
10892
+ let ratioSupplyYield = supplyInverse ? util * (RATE_OUTPUT + RATE_OUTPUT * FOUR_DECIMALS / supplyRatio) / FOUR_DECIMALS : util * RATE_OUTPUT * (FOUR_DECIMALS + supplyRatio) / (FOUR_DECIMALS * FOUR_DECIMALS);
10893
+ const adjBorrowRatio = borrowInverse ? borrowRatio * RATE_OUTPUT / (FOUR_DECIMALS + borrowRatio) : RATE_OUTPUT - borrowRatio * RATE_OUTPUT / (FOUR_DECIMALS + borrowRatio);
10894
+ ratioSupplyYield = ratioSupplyYield * adjBorrowRatio * FOUR_DECIMALS / RATE_OUTPUT / RATE_OUTPUT;
10895
+ const supplyRate = borrowRate * ratioSupplyYield * (FOUR_DECIMALS - BigInt(r.fee_on_interest));
10896
+ supplyEx += supplyEx * supplyRate * dt / (SECONDS_PER_YEAR * FOUR_DECIMALS) / (FOUR_DECIMALS * FOUR_DECIMALS);
10897
+ return { supplyEx, borrowEx };
10898
+ }
10899
+ function jlOverallTokenData(r, now) {
10900
+ const { supplyEx, borrowEx } = jlLiquidityExchangePrices(r, now);
10901
+ const supplyRaw = big(r.total_supply_with_interest);
10902
+ const borrowRaw = big(r.total_borrow_with_interest);
10903
+ const totalSupply = supplyRaw * supplyEx / JL_EXCHANGE_PRICES_PRECISION + big(r.total_supply_interest_free);
10904
+ const totalBorrow = borrowRaw * borrowEx / JL_EXCHANGE_PRICES_PRECISION + big(r.total_borrow_interest_free);
10905
+ let supplyRate = 0n;
10906
+ if (supplyRaw > 0n) {
10907
+ const b = borrowRaw * big(r.borrow_exchange_price) / JL_EXCHANGE_PRICES_PRECISION;
10908
+ const s = supplyRaw * big(r.supply_exchange_price) / JL_EXCHANGE_PRICES_PRECISION;
10909
+ if (s > 0n)
10910
+ supplyRate = BigInt(r.borrow_rate) * (FOUR_DECIMALS - BigInt(r.fee_on_interest)) * b / (s * FOUR_DECIMALS);
10911
+ }
10912
+ const maxUtil = BigInt(r.max_utilization) || DEFAULT_MAX_UTILIZATION;
10913
+ return {
10914
+ supplyEx,
10915
+ borrowEx,
10916
+ totalSupply,
10917
+ totalBorrow,
10918
+ supplyRate,
10919
+ borrowRate: BigInt(r.borrow_rate),
10920
+ maxUtilization: maxUtil
10921
+ };
10922
+ }
10923
+ function jlUserSupplyData(u, o, balance, now) {
10924
+ const z = {
10925
+ modeWithInterest: false,
10926
+ supply: 0n,
10927
+ withdrawalLimit: 0n,
10928
+ lastUpdateTimestamp: 0n,
10929
+ expandPercent: 0n,
10930
+ expandDuration: 0n,
10931
+ baseWithdrawalLimit: 0n,
10932
+ withdrawableUntilLimit: 0n,
10933
+ withdrawable: 0n,
10934
+ decayAmount: 0n,
10935
+ decayEndTimestamp: 0n
10936
+ };
10937
+ if (!u) return z;
10938
+ const amount = big(u.amount);
10939
+ const expandPct = BigInt(u.expand_pct);
10940
+ const expandDuration = BigInt(u.expand_duration);
10941
+ const last = big(u.last_update);
10942
+ let limit = 0n;
10943
+ const lastLimit = big(u.withdrawal_limit);
10944
+ if (lastLimit > 0n) {
10945
+ const maxWithdrawable = amount * expandPct / FOUR_DECIMALS;
10946
+ const expanded = expandDuration > 0n ? maxWithdrawable * (now - last) / expandDuration : maxWithdrawable;
10947
+ limit = lastLimit > expanded ? lastLimit - expanded : 0n;
10948
+ const floor = amount - maxWithdrawable;
10949
+ if (floor > limit) limit = floor;
10950
+ }
10951
+ let decay = big(u.decay_amount);
10952
+ let decayEnd = now;
10953
+ const decayDuration = BigInt(u.decay_duration);
10954
+ if (decay > 0n && decayDuration > 0n) {
10955
+ const elapsed = now - last;
10956
+ if (elapsed < decayDuration) {
10957
+ decay -= decay * elapsed / decayDuration;
10958
+ decayEnd = last + decayDuration;
10959
+ } else decay = 0n;
10960
+ }
10961
+ const withInterest = !!u.with_interest;
10962
+ const ex = (v) => withInterest ? v * o.supplyEx / JL_EXCHANGE_PRICES_PRECISION : v;
10963
+ const supply = ex(amount);
10964
+ let withdrawalLimit = ex(limit);
10965
+ const untilLimit = supply > withdrawalLimit ? supply - withdrawalLimit : 0n;
10966
+ if (withdrawalLimit === 0n) withdrawalLimit = supply;
10967
+ return {
10968
+ modeWithInterest: withInterest,
10969
+ supply,
10970
+ withdrawalLimit,
10971
+ lastUpdateTimestamp: last,
10972
+ expandPercent: expandPct,
10973
+ expandDuration,
10974
+ baseWithdrawalLimit: ex(big(u.base_withdrawal_limit)),
10975
+ withdrawableUntilLimit: untilLimit,
10976
+ withdrawable: minB(balance, untilLimit),
10977
+ decayAmount: ex(decay),
10978
+ decayEndTimestamp: decayEnd
10979
+ };
10980
+ }
10981
+ function jlUserBorrowData(u, o, balance, now) {
10982
+ const z = {
10983
+ modeWithInterest: false,
10984
+ borrow: 0n,
10985
+ borrowLimit: 0n,
10986
+ lastUpdateTimestamp: 0n,
10987
+ expandPercent: 0n,
10988
+ expandDuration: 0n,
10989
+ baseBorrowLimit: 0n,
10990
+ maxBorrowLimit: 0n,
10991
+ borrowLimitUtilization: 0n,
10992
+ borrowableUntilLimit: 0n,
10993
+ borrowable: 0n
10994
+ };
10995
+ if (!u) return z;
10996
+ const amount = big(u.amount);
10997
+ const expandPct = BigInt(u.expand_pct);
10998
+ const expandDuration = BigInt(u.expand_duration);
10999
+ const last = big(u.last_update);
11000
+ const base = big(u.base_debt_ceiling);
11001
+ const maxCeil = big(u.max_debt_ceiling);
11002
+ let limit;
11003
+ if (now < last || expandDuration === 0n) limit = base;
11004
+ else {
11005
+ const maxExpansion = amount * expandPct / FOUR_DECIMALS;
11006
+ limit = maxExpansion * (now - last) / expandDuration + big(u.debt_ceiling);
11007
+ limit = minB(limit, amount + maxExpansion);
11008
+ limit = maxB(limit, base);
11009
+ limit = minB(limit, maxCeil);
11010
+ }
11011
+ const withInterest = !!u.with_interest;
11012
+ const ex = (v) => withInterest ? v * o.borrowEx / JL_EXCHANGE_PRICES_PRECISION : v;
11013
+ const borrow = ex(amount);
11014
+ const borrowLimit = ex(limit);
11015
+ const borrowLimitUtilization = o.maxUtilization * o.totalSupply / FOUR_DECIMALS;
11016
+ const untilUtil = borrowLimitUtilization > o.totalBorrow ? borrowLimitUtilization - o.totalBorrow : 0n;
11017
+ const untilLimit = borrowLimit > borrow ? borrowLimit - borrow : 0n;
11018
+ const borrowableUntilLimit = minB(untilLimit, untilUtil);
11019
+ return {
11020
+ modeWithInterest: withInterest,
11021
+ borrow,
11022
+ borrowLimit,
11023
+ lastUpdateTimestamp: last,
11024
+ expandPercent: expandPct,
11025
+ expandDuration,
11026
+ baseBorrowLimit: ex(base),
11027
+ maxBorrowLimit: ex(maxCeil),
11028
+ borrowLimitUtilization,
11029
+ borrowableUntilLimit,
11030
+ borrowable: minB(balance, borrowableUntilLimit)
11031
+ };
11032
+ }
11033
+ function jlVaultExchangePrices(s, c, liqSupplyEx, liqBorrowEx, now) {
11034
+ const oldLs = big(s.liquidity_supply_exchange_price);
11035
+ const oldLb = big(s.liquidity_borrow_exchange_price);
11036
+ const vs = big(s.vault_supply_exchange_price);
11037
+ const vb = big(s.vault_borrow_exchange_price);
11038
+ if (liqSupplyEx < oldLs || liqBorrowEx < oldLb || oldLs === 0n || oldLb === 0n)
11039
+ return { supplyEx: vs, borrowEx: vb };
11040
+ const dt = maxB(0n, now - big(s.last_update_timestamp));
11041
+ let supplyEx = vs * (liqSupplyEx * SCALE_FACTOR / oldLs) / SCALE_FACTOR;
11042
+ const sm = BigInt(c.supply_rate_magnifier);
11043
+ if (sm !== 0n) {
11044
+ const ch = vs * dt * (sm < 0n ? -sm : sm) / FOUR_DECIMALS / SECONDS_PER_YEAR;
11045
+ supplyEx = sm > 0n ? supplyEx + ch : supplyEx - ch;
11046
+ }
11047
+ const prod = vb * (liqBorrowEx * SCALE_FACTOR / oldLb);
11048
+ let borrowEx = (prod + SCALE_FACTOR - 1n) / SCALE_FACTOR;
11049
+ const bm = BigInt(c.borrow_rate_magnifier);
11050
+ if (bm !== 0n) {
11051
+ const ch = vb * dt * (bm < 0n ? -bm : bm) / FOUR_DECIMALS / SECONDS_PER_YEAR;
11052
+ borrowEx = bm > 0n ? borrowEx + ch : borrowEx - ch;
11053
+ }
11054
+ return { supplyEx, borrowEx };
11055
+ }
11056
+ 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);
11057
+ async function read(rpc, keys) {
11058
+ const uniq = [...new Set(keys)];
11059
+ const { accounts, slot } = await rpc.readAccounts(uniq, {
11060
+ encoding: "base64"
11061
+ });
11062
+ const m = /* @__PURE__ */ new Map();
11063
+ uniq.forEach((k, i) => m.set(k, accounts[i] ?? null));
11064
+ return { m, slot };
11065
+ }
11066
+ async function readJlNextVaultId(rpc, market = "main") {
11067
+ const admin = await jlVaultAdminPda(market);
11068
+ const { m } = await read(rpc, [admin]);
11069
+ const a = m.get(admin);
11070
+ if (!a || a.owner !== JUP_VAULTS_PROGRAMS[market]) return void 0;
11071
+ return Number(
11072
+ dec("VaultAdmin", a.data[0]).next_vault_id
11073
+ );
11074
+ }
11075
+ var sourceTypeName = (t) => {
11076
+ if (typeof t === "string") return t;
11077
+ if (t && typeof t === "object") return Object.keys(t)[0] ?? "unknown";
11078
+ return String(t);
11079
+ };
11080
+ var lowerFirst = (s) => s.charAt(0).toLowerCase() + s.slice(1);
11081
+ async function readJupiterLendVaultsOnchain(rpc, market, vaultIds, opts = {}) {
11082
+ if (!vaultIds.length) return [];
11083
+ const now = BigInt(opts.now ?? Math.floor(Date.now() / 1e3));
11084
+ const program = JUP_VAULTS_PROGRAMS[market];
11085
+ const cfgKeys = await Promise.all(
11086
+ vaultIds.map((i) => jlVaultConfigPda(i, market))
11087
+ );
11088
+ const stateKeys = await Promise.all(
11089
+ vaultIds.map((i) => jlVaultStatePda(i, market))
11090
+ );
11091
+ const r1 = await read(rpc, [...cfgKeys, ...stateKeys]);
11092
+ const items = [];
11093
+ vaultIds.forEach((id, k) => {
11094
+ const ca = r1.m.get(cfgKeys[k]);
11095
+ const sa = r1.m.get(stateKeys[k]);
11096
+ if (!ca || !sa || ca.owner !== program || sa.owner !== program) return;
11097
+ try {
11098
+ const c = dec("VaultConfig", ca.data[0]);
11099
+ const s = dec("VaultState", sa.data[0]);
11100
+ const t = Number(c.vault_type);
11101
+ items.push({
11102
+ id,
11103
+ configKey: cfgKeys[k],
11104
+ c,
11105
+ s,
11106
+ smartCol: isJlSmartCol(t),
11107
+ smartDebt: isJlSmartDebt(t)
11108
+ });
11109
+ } catch (e) {
11110
+ console.warn(
11111
+ `[jupiter-lend] vault ${market}_${id}: ${e.message}`
11112
+ );
11113
+ }
11114
+ });
11115
+ if (!items.length) return [];
11116
+ const mints = /* @__PURE__ */ new Set();
11117
+ const dexes = /* @__PURE__ */ new Set();
11118
+ const r2Keys = [];
11119
+ const reserveOf = /* @__PURE__ */ new Map();
11120
+ const supplyPosOf = /* @__PURE__ */ new Map();
11121
+ const borrowPosOf = /* @__PURE__ */ new Map();
11122
+ for (const it of items) {
11123
+ r2Keys.push(it.c.oracle);
11124
+ const sides = [
11125
+ [it.c.supply_token, it.smartCol, "supply"],
11126
+ [it.c.borrow_token, it.smartDebt, "borrow"]
11127
+ ];
11128
+ for (const [token, smart, side] of sides) {
11129
+ if (smart) {
11130
+ dexes.add(token);
11131
+ continue;
11132
+ }
11133
+ mints.add(token);
11134
+ if (!reserveOf.has(token))
11135
+ reserveOf.set(
11136
+ token,
11137
+ await liq([utf83("reserve"), await pk3(token)], market)
11138
+ );
11139
+ const pos = await liq(
11140
+ [
11141
+ utf83(
11142
+ side === "supply" ? "user_supply_position" : "user_borrow_position"
11143
+ ),
11144
+ await pk3(token),
11145
+ await pk3(it.configKey)
11146
+ ],
11147
+ market
11148
+ );
11149
+ (side === "supply" ? supplyPosOf : borrowPosOf).set(
11150
+ `${it.id}:${token}`,
11151
+ pos
11152
+ );
11153
+ }
11154
+ }
11155
+ r2Keys.push(
11156
+ ...mints,
11157
+ ...dexes,
11158
+ ...reserveOf.values(),
11159
+ ...supplyPosOf.values(),
11160
+ ...borrowPosOf.values()
11161
+ );
11162
+ const r2 = await read(rpc, r2Keys);
11163
+ const decimalsOf = /* @__PURE__ */ new Map();
11164
+ for (const mint of mints) {
11165
+ const a = r2.m.get(mint);
11166
+ if (!a) continue;
11167
+ const b = (0, import_svm_kit3.fromBase64)(a.data[0]);
11168
+ if (b.length >= 45) decimalsOf.set(mint, b[44]);
11169
+ }
11170
+ const reserves = /* @__PURE__ */ new Map();
11171
+ for (const [mint, key2] of reserveOf) {
11172
+ const a = r2.m.get(key2);
11173
+ if (!a) continue;
11174
+ try {
11175
+ reserves.set(mint, dec("TokenReserve", a.data[0]));
11176
+ } catch (e) {
11177
+ console.warn(`[jupiter-lend] reserve ${mint}: ${e.message}`);
11178
+ }
11179
+ }
11180
+ const vaultOf = /* @__PURE__ */ new Map();
11181
+ for (const [mint, r] of reserves) vaultOf.set(mint, r.vault);
11182
+ const r3 = vaultOf.size ? await read(rpc, [...vaultOf.values()]) : { m: /* @__PURE__ */ new Map(), slot: r2.slot };
11183
+ const balanceOf = (mint) => {
11184
+ const a = r3.m.get(vaultOf.get(mint) ?? "");
11185
+ if (!a) return 0n;
11186
+ const b = (0, import_svm_kit3.fromBase64)(a.data[0]);
11187
+ return b.length >= 72 ? new DataView(b.buffer, b.byteOffset, b.byteLength).getBigUint64(
11188
+ 64,
11189
+ true
11190
+ ) : 0n;
11191
+ };
11192
+ const overall = /* @__PURE__ */ new Map();
11193
+ for (const [mint, r] of reserves)
11194
+ overall.set(mint, jlOverallTokenData(r, now));
11195
+ const dexOf = (address) => {
11196
+ const a = r2.m.get(address);
11197
+ if (!a) return void 0;
11198
+ try {
11199
+ const d2 = dec("Dex", a.data[0]);
11200
+ return { address, token0: d2.token_0, token1: d2.token_1 };
11201
+ } catch {
11202
+ return void 0;
11203
+ }
11204
+ };
11205
+ const tokenFact = (mint, decimals) => {
11206
+ const known = opts.tokens?.[mint];
11207
+ if (known) return known;
11208
+ const l = opts.tokenList?.[mint];
11209
+ const sym = l?.symbol ?? mint.slice(0, 4);
11210
+ return {
11211
+ address: mint,
11212
+ chainId: "solana",
11213
+ name: l?.name ?? sym,
11214
+ symbol: sym,
11215
+ uiSymbol: sym,
11216
+ decimals: l?.decimals ?? decimals,
11217
+ ...typeof l?.logoURI === "string" ? { logoUrl: l.logoURI } : {},
11218
+ // unpriced: the converter's USD figures read 0 — say so on the bundle, never invent
11219
+ price: "0"
11220
+ };
11221
+ };
11222
+ const dexToken = (d2, address) => {
11223
+ const s = (m) => opts.tokens?.[m]?.uiSymbol ?? opts.tokenList?.[m]?.symbol ?? m.slice(0, 4);
11224
+ const sym = d2 ? `${s(d2.token0)}-${s(d2.token1)} DEX` : `DEX ${address.slice(0, 4)}`;
11225
+ return {
11226
+ address,
11227
+ chainId: "solana",
11228
+ name: `Jupiter Lend ${sym} shares`,
11229
+ symbol: sym,
11230
+ uiSymbol: sym,
11231
+ decimals: JL_VAULT_AMOUNT_DECIMALS,
11232
+ price: "0"
11233
+ };
11234
+ };
11235
+ const out = [];
11236
+ for (const it of items) {
11237
+ const { c, s } = it;
11238
+ const supTok = c.supply_token;
11239
+ const borTok = c.borrow_token;
11240
+ const supO = it.smartCol ? void 0 : overall.get(supTok);
11241
+ const borO = it.smartDebt ? void 0 : overall.get(borTok);
11242
+ if (!it.smartCol && !supO || !it.smartDebt && !borO) {
11243
+ console.warn(
11244
+ `[jupiter-lend] vault ${market}_${it.id}: layer reserve not readable, skipped`
11245
+ );
11246
+ continue;
11247
+ }
11248
+ const supDec = it.smartCol ? JL_VAULT_AMOUNT_DECIMALS : decimalsOf.get(supTok) ?? 9;
11249
+ const borDec = it.smartDebt ? JL_VAULT_AMOUNT_DECIMALS : decimalsOf.get(borTok) ?? 9;
11250
+ const zero = {
11251
+ supplyEx: JL_EXCHANGE_PRICES_PRECISION,
11252
+ borrowEx: JL_EXCHANGE_PRICES_PRECISION,
11253
+ totalSupply: 0n,
11254
+ totalBorrow: 0n,
11255
+ supplyRate: 0n,
11256
+ borrowRate: 0n,
11257
+ maxUtilization: DEFAULT_MAX_UTILIZATION
11258
+ };
11259
+ const so = supO ?? zero;
11260
+ const bo = borO ?? zero;
11261
+ const supBal = it.smartCol ? 0n : balanceOf(supTok);
11262
+ const borBal = it.smartDebt ? 0n : balanceOf(borTok);
11263
+ const us = (() => {
11264
+ const a = r2.m.get(supplyPosOf.get(`${it.id}:${supTok}`) ?? "");
11265
+ return a ? dec("UserSupplyPosition", a.data[0]) : void 0;
11266
+ })();
11267
+ const ub = (() => {
11268
+ const a = r2.m.get(borrowPosOf.get(`${it.id}:${borTok}`) ?? "");
11269
+ return a ? dec("UserBorrowPosition", a.data[0]) : void 0;
11270
+ })();
11271
+ const sup = jlUserSupplyData(it.smartCol ? void 0 : us, so, supBal, now);
11272
+ const bor = jlUserBorrowData(it.smartDebt ? void 0 : ub, bo, borBal, now);
11273
+ const ex = jlVaultExchangePrices(
11274
+ s,
11275
+ c,
11276
+ it.smartCol ? JL_EXCHANGE_PRICES_PRECISION : so.supplyEx,
11277
+ it.smartDebt ? JL_EXCHANGE_PRICES_PRECISION : bo.borrowEx,
11278
+ now
11279
+ );
11280
+ const supplyEx = it.smartCol ? big(s.vault_supply_exchange_price) : ex.supplyEx;
11281
+ const borrowEx = it.smartDebt ? big(s.vault_borrow_exchange_price) : ex.borrowEx;
11282
+ const P = JL_EXCHANGE_PRICES_PRECISION;
11283
+ const totalSupply = jlVaultToRaw(
11284
+ big(s.total_supply) * supplyEx / P,
11285
+ supDec
11286
+ );
11287
+ const totalBorrow = jlVaultToRaw(
11288
+ big(s.total_borrow) * borrowEx / P,
11289
+ borDec
11290
+ );
11291
+ const absorbedSupply = jlVaultToRaw(
11292
+ big(s.absorbed_col_amount) * supplyEx / P,
11293
+ supDec
11294
+ );
11295
+ const absorbedBorrow = jlVaultToRaw(
11296
+ big(s.absorbed_debt_amount) * borrowEx / P,
11297
+ borDec
11298
+ );
11299
+ let withdrawLimit = 0n;
11300
+ let withdrawableUntilLimit = 0n;
11301
+ let withdrawable = 0n;
11302
+ if (sup.supply > 0n) {
11303
+ withdrawLimit = sup.withdrawalLimit;
11304
+ const gap = sup.supply * BigInt(c.withdraw_gap) / 1000n;
11305
+ withdrawableUntilLimit = sup.withdrawableUntilLimit > gap ? (sup.withdrawableUntilLimit - gap) * 999999n / 1000000n : 0n;
11306
+ withdrawable = minB(supBal, withdrawableUntilLimit);
11307
+ }
11308
+ let borrowLimit = 0n;
11309
+ let borrowLimitUtilization = 0n;
11310
+ let borrowableUntilLimit = 0n;
11311
+ let borrowable = 0n;
11312
+ if (bor.borrow > 0n) {
11313
+ borrowLimit = bor.borrowLimit;
11314
+ borrowLimitUtilization = bor.borrowLimitUtilization;
11315
+ borrowableUntilLimit = bor.borrowableUntilLimit * 999999n / 1000000n;
11316
+ borrowable = minB(borBal, borrowableUntilLimit);
11317
+ }
11318
+ const minimumBorrowing = jlVaultToRaw(10001n * borrowEx / P, borDec);
11319
+ const supplyRateLiq = it.smartCol ? 0n : so.supplyRate;
11320
+ const borrowRateLiq = it.smartDebt ? 0n : bo.borrowRate;
11321
+ const supplyRate = supplyRateLiq + BigInt(c.supply_rate_magnifier);
11322
+ const borrowRate = borrowRateLiq + BigInt(c.borrow_rate_magnifier);
11323
+ const supplyDex = it.smartCol ? dexOf(supTok) : void 0;
11324
+ const borrowDex = it.smartDebt ? dexOf(borTok) : void 0;
11325
+ const supplyToken = it.smartCol ? dexToken(supplyDex, supTok) : tokenFact(supTok, supDec);
11326
+ const borrowToken = it.smartDebt ? dexToken(borrowDex, borTok) : tokenFact(borTok, borDec);
11327
+ let oracleSources = [];
11328
+ const oa = r2.m.get(c.oracle);
11329
+ if (oa)
11330
+ try {
11331
+ oracleSources = dec("Oracle", oa.data[0]).sources.map(
11332
+ (x) => ({
11333
+ source: x.source,
11334
+ invert: x.invert,
11335
+ multiplier: String(x.multiplier),
11336
+ divisor: String(x.divisor),
11337
+ sourceType: { [lowerFirst(sourceTypeName(x.source_type))]: {} }
11338
+ })
11339
+ );
11340
+ } catch {
11341
+ }
11342
+ const vault = {
11343
+ id: it.id,
11344
+ address: it.configKey,
11345
+ type: Number(c.vault_type),
11346
+ supplyToken,
11347
+ borrowToken,
11348
+ totalSupply: totalSupply.toString(),
11349
+ totalSupplyLiquidity: sup.supply.toString(),
11350
+ totalBorrow: totalBorrow.toString(),
11351
+ totalBorrowLiquidity: bor.borrow.toString(),
11352
+ absorbedSupply: absorbedSupply.toString(),
11353
+ absorbedBorrow: absorbedBorrow.toString(),
11354
+ supplyRateMagnifier: String(c.supply_rate_magnifier),
11355
+ borrowRateMagnifier: String(c.borrow_rate_magnifier),
11356
+ borrowFee: String(c.borrow_fee),
11357
+ collateralFactor: String(c.collateral_factor),
11358
+ liquidationThreshold: String(c.liquidation_threshold),
11359
+ liquidationMaxLimit: String(c.liquidation_max_limit),
11360
+ liquidationPenalty: String(c.liquidation_penalty),
11361
+ withdrawalGap: String(c.withdraw_gap),
11362
+ supplyRate: supplyRate.toString(),
11363
+ supplyRateLiquidity: supplyRateLiq.toString(),
11364
+ borrowRate: borrowRate.toString(),
11365
+ borrowRateLiquidity: borrowRateLiq.toString(),
11366
+ withdrawLimit: withdrawLimit.toString(),
11367
+ withdrawableUntilLimit: withdrawableUntilLimit.toString(),
11368
+ withdrawable: withdrawable.toString(),
11369
+ borrowLimit: borrowLimit.toString(),
11370
+ borrowableUntilLimit: borrowableUntilLimit.toString(),
11371
+ borrowable: borrowable.toString(),
11372
+ borrowLimitUtilization: borrowLimitUtilization.toString(),
11373
+ minimumBorrowing: minimumBorrowing.toString(),
11374
+ totalPositions: Number(s.total_positions),
11375
+ oracle: c.oracle,
11376
+ oraclePrice: "",
11377
+ oraclePriceOperate: "",
11378
+ oraclePriceLiquidate: "",
11379
+ oracleSources,
11380
+ oracleTimestamp: 0,
11381
+ liquiditySupplyData: {
11382
+ modeWithInterest: sup.modeWithInterest,
11383
+ supply: sup.supply.toString(),
11384
+ withdrawalLimit: sup.withdrawalLimit.toString(),
11385
+ lastUpdateTimestamp: sup.lastUpdateTimestamp.toString(),
11386
+ expandPercent: sup.expandPercent.toString(),
11387
+ expandDuration: sup.expandDuration.toString(),
11388
+ baseWithdrawalLimit: sup.baseWithdrawalLimit.toString(),
11389
+ withdrawableUntilLimit: sup.withdrawableUntilLimit.toString(),
11390
+ withdrawable: sup.withdrawable.toString(),
11391
+ decayAmount: sup.decayAmount.toString(),
11392
+ decayEndTimestamp: sup.decayEndTimestamp.toString()
11393
+ },
11394
+ liquidityBorrowData: {
11395
+ modeWithInterest: bor.modeWithInterest,
11396
+ borrow: bor.borrow.toString(),
11397
+ borrowLimit: bor.borrowLimit.toString(),
11398
+ lastUpdateTimestamp: bor.lastUpdateTimestamp.toString(),
11399
+ expandPercent: bor.expandPercent.toString(),
11400
+ expandDuration: bor.expandDuration.toString(),
11401
+ baseBorrowLimit: bor.baseBorrowLimit.toString(),
11402
+ maxBorrowLimit: bor.maxBorrowLimit.toString(),
11403
+ borrowLimitUtilization: bor.borrowLimitUtilization.toString(),
11404
+ borrowableUntilLimit: bor.borrowableUntilLimit.toString(),
11405
+ borrowable: bor.borrowable.toString()
11406
+ },
11407
+ rewards: [],
11408
+ topTick: Number(s.topmost_tick),
11409
+ metadata: { maxLeverage: false, nativeStake: false, pegged: false }
11410
+ };
11411
+ out.push({
11412
+ vault,
11413
+ smartCol: it.smartCol,
11414
+ smartDebt: it.smartDebt,
11415
+ supplyDex,
11416
+ borrowDex,
11417
+ slot: r2.slot
11418
+ });
11419
+ }
11420
+ return out;
11421
+ }
11422
+
11423
+ // src/lending/public-data/jupiter-lend/convertPublic.ts
11424
+ var JL_FACTOR_SCALE = 1e3;
11425
+ var JL_BPS = 1e4;
11426
+ var JL_ORACLE_DECIMALS = 15;
11427
+ var JL_ORACLE_SCALE = 10 ** JL_ORACLE_DECIMALS;
11428
+ var FLUID_ORACLE_DECIMALS = 27;
11429
+ var FLUID_VAULT_TYPE_T1 = 1e4;
11430
+ var bpsToPercent = (v) => num(v) / 100;
11431
+ var jlOraclePriceInBorrow = (raw2) => num(raw2) / JL_ORACLE_SCALE;
11432
+ function jlOracleToFluidRaw(raw2, colDecimals, debtDecimals) {
11433
+ if (typeof raw2 !== "string" || !/^\d+$/.test(raw2)) return void 0;
11434
+ const exp = FLUID_ORACLE_DECIMALS - JL_ORACLE_DECIMALS + debtDecimals - colDecimals;
11435
+ const v = BigInt(raw2);
11436
+ return (exp >= 0 ? v * 10n ** BigInt(exp) : v / 10n ** BigInt(-exp)).toString();
10200
11437
  }
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 }
10214
- );
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];
11438
+ function formatRawUnits(raw2, decimals) {
11439
+ let v;
11440
+ try {
11441
+ v = BigInt(raw2 ?? 0);
11442
+ } catch {
11443
+ return "0";
11444
+ }
11445
+ const neg = v < 0n;
11446
+ if (neg) v = -v;
11447
+ const base = 10n ** BigInt(decimals);
11448
+ const whole = v / base;
11449
+ const frac = (v % base).toString().padStart(decimals, "0").replace(/0+$/, "");
11450
+ return `${neg ? "-" : ""}${whole}${frac ? `.${frac}` : ""}`;
10218
11451
  }
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]
10224
- );
10225
- return BigInt(r.value.amount);
11452
+ function deriveLayerTotals(vaults, earn) {
11453
+ const t = {};
11454
+ const slot = (mint, decimals) => t[mint] ??= { supply: 0n, borrow: 0n, decimals };
11455
+ for (const e of earn)
11456
+ slot(e.assetAddress, e.asset.decimals).supply += BigInt(
11457
+ e.liquiditySupplyData.supply || "0"
11458
+ );
11459
+ for (const v of vaults) {
11460
+ slot(v.supplyToken.address, v.supplyToken.decimals).supply += BigInt(
11461
+ v.liquiditySupplyData.supply || "0"
11462
+ );
11463
+ slot(v.borrowToken.address, v.borrowToken.decimals).borrow += BigInt(
11464
+ v.liquidityBorrowData.borrow || "0"
11465
+ );
11466
+ }
11467
+ return t;
11468
+ }
11469
+ var fmt = (raw2, decimals) => Number(raw2) / 10 ** decimals;
11470
+ var jupiterLendCurrency = (t, listed3) => {
11471
+ const base = listed3 ?? {
11472
+ chainId: SOLANA_CHAIN_ID,
11473
+ address: t.address,
11474
+ symbol: t.uiSymbol ?? t.symbol,
11475
+ name: t.name,
11476
+ decimals: t.decimals
11477
+ };
11478
+ return { ...base, assetGroup: base.assetGroup || `solana-${t.address}` };
11479
+ };
11480
+ function convertJupiterLendVault(market, v, opts = {}) {
11481
+ const lenderKey = (0, import_lender_registry2.jupiterLendVaultKey)(market, v.id);
11482
+ const sup = v.supplyToken;
11483
+ const bor = v.borrowToken;
11484
+ const supPrice = num(sup.price);
11485
+ const borPrice = num(bor.price);
11486
+ const ltv = num(v.collateralFactor) / JL_FACTOR_SCALE;
11487
+ const lt = num(v.liquidationThreshold) / JL_FACTOR_SCALE;
11488
+ const penalty = num(v.liquidationPenalty) / JL_BPS;
11489
+ const supAsset = jupiterLendCurrency(sup, opts.tokenList?.[sup.address]);
11490
+ const borAsset = jupiterLendCurrency(bor, opts.tokenList?.[bor.address]);
11491
+ const supSym = supAsset.symbol ?? sup.symbol;
11492
+ const borSym = borAsset.symbol ?? bor.symbol;
11493
+ const label = `${supSym} / ${borSym} \xB7 vault #${v.id}`;
11494
+ const intrinsic = (a) => opts.intrinsicYields?.[a.assetGroup] ?? 0;
11495
+ const layerOf = (mint) => {
11496
+ const l = opts.layer?.[mint];
11497
+ if (!l || l.supply === 0n) return { utilization: 0 };
11498
+ return {
11499
+ utilization: Number(l.borrow * 10000n / l.supply) / 1e4,
11500
+ irmTotalDeposits: fmt(l.supply, l.decimals),
11501
+ irmTotalDebt: fmt(l.borrow, l.decimals)
11502
+ };
11503
+ };
11504
+ const totalSupply = BigInt(v.totalSupply || "0");
11505
+ const withdrawLimit = BigInt(v.withdrawLimit || "0");
11506
+ const lockupRatio = totalSupply > 0n ? Number(withdrawLimit * 10000n / totalSupply) / 1e4 : 0;
11507
+ const supplyDeposits = fmt(v.totalSupply, sup.decimals);
11508
+ const borrowDebt = fmt(v.totalBorrow, bor.decimals);
11509
+ const borrowable = fmt(v.borrowable, bor.decimals);
11510
+ const collateralConfig = {
11511
+ category: 0,
11512
+ label,
11513
+ borrowCollateralFactor: ltv,
11514
+ collateralFactor: lt,
11515
+ borrowFactor: 1,
11516
+ liquidationPenalty: penalty,
11517
+ closeFactor: 1,
11518
+ collateralDisabled: false,
11519
+ debtDisabled: true
11520
+ };
11521
+ const debtConfig = {
11522
+ category: 0,
11523
+ label,
11524
+ borrowCollateralFactor: 0,
11525
+ collateralFactor: 0,
11526
+ borrowFactor: 1,
11527
+ liquidationPenalty: 0,
11528
+ closeFactor: 1,
11529
+ collateralDisabled: true,
11530
+ debtDisabled: false
11531
+ };
11532
+ const common = {
11533
+ totalDebtStable: "0",
11534
+ totalDebtStableUSD: 0,
11535
+ stableBorrowRate: 0,
11536
+ hasStable: false,
11537
+ isActive: true,
11538
+ isFrozen: false,
11539
+ debtCeiling: "0",
11540
+ closeFactor: 1,
11541
+ lockupRatio,
11542
+ rewards: []
11543
+ };
11544
+ const colUid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, sup.address);
11545
+ const debtUid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, bor.address);
11546
+ const collateralLeg = {
11547
+ ...common,
11548
+ marketUid: colUid,
11549
+ name: `Collateral ${supSym}`,
11550
+ poolId: sup.address,
11551
+ underlying: sup.address,
11552
+ asset: supAsset,
11553
+ decimals: sup.decimals,
11554
+ totalDeposits: formatRawUnits(v.totalSupply, sup.decimals),
11555
+ totalDebt: "0",
11556
+ totalLiquidity: supplyDeposits,
11557
+ borrowLiquidity: 0,
11558
+ totalDepositsUSD: supplyDeposits * supPrice,
11559
+ totalDebtUSD: 0,
11560
+ totalLiquidityUSD: supplyDeposits * supPrice,
11561
+ borrowLiquidityUSD: 0,
11562
+ ...layerOf(sup.address),
11563
+ depositRate: bpsToPercent(v.supplyRate),
11564
+ variableBorrowRate: 0,
11565
+ intrinsicYield: intrinsic(supAsset),
11566
+ liquidationBonus: penalty,
11567
+ config: { "0": collateralConfig },
11568
+ collateralActive: true,
11569
+ borrowingEnabled: false,
11570
+ depositsEnabled: true
11571
+ };
11572
+ const debtLeg = {
11573
+ ...common,
11574
+ marketUid: debtUid,
11575
+ name: `Loan ${borSym}`,
11576
+ poolId: bor.address,
11577
+ underlying: bor.address,
11578
+ asset: borAsset,
11579
+ decimals: bor.decimals,
11580
+ totalDeposits: "0",
11581
+ totalDebt: formatRawUnits(v.totalBorrow, bor.decimals),
11582
+ totalLiquidity: borrowable,
11583
+ borrowLiquidity: borrowable,
11584
+ totalDepositsUSD: 0,
11585
+ totalDebtUSD: borrowDebt * borPrice,
11586
+ totalLiquidityUSD: borrowable * borPrice,
11587
+ borrowLiquidityUSD: borrowable * borPrice,
11588
+ ...layerOf(bor.address),
11589
+ depositRate: 0,
11590
+ variableBorrowRate: bpsToPercent(v.borrowRate),
11591
+ intrinsicYield: intrinsic(borAsset),
11592
+ liquidationBonus: 0,
11593
+ originationFee: num(v.borrowFee) / 100,
11594
+ config: { "0": debtConfig },
11595
+ collateralActive: false,
11596
+ borrowingEnabled: true,
11597
+ depositsEnabled: false
11598
+ };
11599
+ const vault = {
11600
+ vaultAddress: v.address,
11601
+ vaultId: v.id,
11602
+ collateralAddress: sup.address,
11603
+ loanAddress: bor.address,
11604
+ collateralDecimals: sup.decimals,
11605
+ loanDecimals: bor.decimals,
11606
+ oracle: v.oracle,
11607
+ ltv,
11608
+ liquidationThreshold: lt,
11609
+ liquidationPenalty: penalty,
11610
+ oraclePriceOperate: jlOracleToFluidRaw(
11611
+ v.oraclePriceOperate,
11612
+ sup.decimals,
11613
+ bor.decimals
11614
+ ),
11615
+ oraclePriceLiquidate: jlOracleToFluidRaw(
11616
+ v.oraclePriceLiquidate,
11617
+ sup.decimals,
11618
+ bor.decimals
11619
+ ),
11620
+ isSmartCol: isJlSmartCol(v.type),
11621
+ isSmartDebt: isJlSmartDebt(v.type),
11622
+ vaultType: v.type <= 1 ? FLUID_VAULT_TYPE_T1 : FLUID_VAULT_TYPE_T1 * Math.min(4, v.type),
11623
+ collateral: {
11624
+ assets: [{ underlying: sup.address, decimals: sup.decimals }],
11625
+ dex: null,
11626
+ perShare: null
11627
+ },
11628
+ loan: {
11629
+ assets: [{ underlying: bor.address, decimals: bor.decimals }],
11630
+ dex: null,
11631
+ perShare: null
11632
+ }
11633
+ };
11634
+ const jupiterLendVault = {
11635
+ market,
11636
+ vaultId: v.id,
11637
+ address: v.address,
11638
+ type: v.type,
11639
+ supplyToken: sup.address,
11640
+ borrowToken: bor.address,
11641
+ supplyDecimals: sup.decimals,
11642
+ borrowDecimals: bor.decimals,
11643
+ collateralFactor: num(v.collateralFactor),
11644
+ liquidationThreshold: num(v.liquidationThreshold),
11645
+ liquidationMaxLimit: num(v.liquidationMaxLimit),
11646
+ withdrawalGap: num(v.withdrawalGap),
11647
+ liquidationPenalty: num(v.liquidationPenalty),
11648
+ borrowFee: num(v.borrowFee),
11649
+ supplyRateMagnifier: num(v.supplyRateMagnifier),
11650
+ borrowRateMagnifier: num(v.borrowRateMagnifier),
11651
+ supplyRateLiquidity: num(v.supplyRateLiquidity),
11652
+ borrowRateLiquidity: num(v.borrowRateLiquidity),
11653
+ minimumBorrowing: v.minimumBorrowing,
11654
+ totalPositions: v.totalPositions,
11655
+ borrowLimit: v.borrowLimit,
11656
+ borrowable: v.borrowable,
11657
+ withdrawLimit: v.withdrawLimit,
11658
+ withdrawable: v.withdrawable,
11659
+ oracle: v.oracle,
11660
+ oraclePrice: v.oraclePrice,
11661
+ oraclePriceOperate: v.oraclePriceOperate,
11662
+ oraclePriceLiquidate: v.oraclePriceLiquidate,
11663
+ oracleSources: v.oracleSources,
11664
+ oracleTimestamp: v.oracleTimestamp,
11665
+ liquiditySupplyData: v.liquiditySupplyData,
11666
+ liquidityBorrowData: v.liquidityBorrowData,
11667
+ topTick: v.topTick,
11668
+ metadata: v.metadata
11669
+ };
11670
+ return {
11671
+ lenderKey,
11672
+ chainId: SOLANA_CHAIN_ID,
11673
+ data: { [colUid]: collateralLeg, [debtUid]: debtLeg },
11674
+ params: { vault, jupiterLendVault }
11675
+ };
10226
11676
  }
10227
11677
 
10228
11678
  // src/lending/public-data/jupiter-lend/fetchPublic.ts
@@ -10236,8 +11686,37 @@ async function fetchJupiterLendPublic(opts = {}) {
10236
11686
  api.vaults(market),
10237
11687
  api.earnTokens(market)
10238
11688
  ]);
10239
- const layer = deriveLayerTotals(vaults, earn);
10240
11689
  const only = opts.vaultIds?.[market];
11690
+ let chain = [];
11691
+ if (opts.rpc && opts.enumerateOnchain !== false) {
11692
+ try {
11693
+ const next = await readJlNextVaultId(opts.rpc, market);
11694
+ const listed3 = new Set(vaults.map((v) => v.id));
11695
+ const ids = [];
11696
+ for (let id = 1; next && id < next; id++)
11697
+ if (!listed3.has(id) && (!only || only.includes(id))) ids.push(id);
11698
+ if (ids.length) {
11699
+ const tokens = {};
11700
+ for (const v of vaults) {
11701
+ tokens[v.supplyToken.address] ??= v.supplyToken;
11702
+ tokens[v.borrowToken.address] ??= v.borrowToken;
11703
+ }
11704
+ for (const e of earn) tokens[e.assetAddress] ??= e.asset;
11705
+ chain = await readJupiterLendVaultsOnchain(opts.rpc, market, ids, {
11706
+ tokens,
11707
+ tokenList: opts.tokenList
11708
+ });
11709
+ }
11710
+ } catch (e) {
11711
+ console.warn(
11712
+ `[jupiter-lend] on-chain enumeration of ${market} failed, serving the API's vaults only: ${e.message}`
11713
+ );
11714
+ }
11715
+ }
11716
+ const layer = deriveLayerTotals(
11717
+ [...vaults, ...chain.map((c) => c.vault)],
11718
+ earn
11719
+ );
10241
11720
  let flash;
10242
11721
  if (opts.rpc) {
10243
11722
  try {
@@ -10257,13 +11736,39 @@ async function fetchJupiterLendPublic(opts = {}) {
10257
11736
  );
10258
11737
  }
10259
11738
  }
10260
- for (const v of vaults) {
11739
+ const fromChain = new Map(chain.map((c) => [c.vault.id, c]));
11740
+ for (const v of [...vaults, ...chain.map((c) => c.vault)]) {
10261
11741
  if (only && !only.includes(v.id)) continue;
10262
11742
  const conv = convertJupiterLendVault(market, v, {
10263
11743
  tokenList: opts.tokenList,
10264
11744
  intrinsicYields: opts.intrinsicYields,
10265
11745
  layer
10266
11746
  });
11747
+ const cv = fromChain.get(v.id);
11748
+ const meta = conv.params.jupiterLendVault;
11749
+ meta.source = cv ? "chain" : "api";
11750
+ if (cv) {
11751
+ meta.slot = cv.slot;
11752
+ if (cv.smartCol || cv.smartDebt)
11753
+ meta.smart = {
11754
+ ...cv.smartCol ? {
11755
+ col: {
11756
+ dex: v.supplyToken.address,
11757
+ token0: cv.supplyDex?.token0,
11758
+ token1: cv.supplyDex?.token1
11759
+ }
11760
+ } : {},
11761
+ ...cv.smartDebt ? {
11762
+ debt: {
11763
+ dex: v.borrowToken.address,
11764
+ token0: cv.borrowDex?.token0,
11765
+ token1: cv.borrowDex?.token1
11766
+ }
11767
+ } : {}
11768
+ };
11769
+ const unpriced = [v.supplyToken, v.borrowToken].filter((t) => !(Number(t.price) > 0)).map((t) => t.address);
11770
+ if (unpriced.length) meta.unpriced = unpriced;
11771
+ }
10267
11772
  if (flash)
10268
11773
  conv.params.jupiterLendVault.flashloan = {
10269
11774
  feeBps: flash.feeBps,
@@ -10729,7 +12234,7 @@ var LS_NO_ACCOUNT = "11111111111111111111111111111111";
10729
12234
  var LS_U64_MAX = "18446744073709551615";
10730
12235
  var isUncapped = (v) => v === void 0 || v === null || String(v) === LS_U64_MAX;
10731
12236
  var capOrUndefined = (v) => isUncapped(v) ? void 0 : String(v);
10732
- var SECONDS_PER_YEAR = 31536e3;
12237
+ var SECONDS_PER_YEAR2 = 31536e3;
10733
12238
  var LS_TENORS = [
10734
12239
  { id: "1d", duration: { duration: 1, durationType: 0 }, days: 1 },
10735
12240
  { id: "1w", duration: { duration: 1, durationType: 1 }, days: 7 },
@@ -10831,7 +12336,7 @@ function createPacer(intervalMs) {
10831
12336
  }
10832
12337
 
10833
12338
  // src/lending/public-data/loopscale/markets.ts
10834
- var import_svm_kit3 = require("@1delta/svm-kit");
12339
+ var import_svm_kit4 = require("@1delta/svm-kit");
10835
12340
  async function buildLoopscaleRoster(vaults, loops, opts = {}) {
10836
12341
  const byKey = /* @__PURE__ */ new Map();
10837
12342
  const key2 = (p, c) => `${p}_${c}`;
@@ -10885,6 +12390,8 @@ async function buildLoopscaleRoster(vaults, loops, opts = {}) {
10885
12390
  strategy: s.address,
10886
12391
  name: v.vaultMetadata?.name ?? v.vault.address,
10887
12392
  curator: v.vaultMetadata?.managerName ?? "",
12393
+ manager: v.vault.manager,
12394
+ managerImage: v.vaultMetadata?.managerImage ?? void 0,
10888
12395
  interestFee: Number(s.interestFee),
10889
12396
  originationFee: Number(s.originationFee),
10890
12397
  originationsEnabled: s.originationsEnabled,
@@ -10933,21 +12440,21 @@ async function buildLoopscaleRoster(vaults, loops, opts = {}) {
10933
12440
  ];
10934
12441
  const unresolved = [];
10935
12442
  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));
12443
+ const mints = await (0, import_svm_kit4.getMints)(opts.rpc, toProbe);
12444
+ const dec2 = /* @__PURE__ */ new Map();
12445
+ mints.forEach((m, i) => m && dec2.set(toProbe[i], m.decimals));
10939
12446
  for (const pair of byKey.values()) {
10940
12447
  const c = pair.collateralIdentifier;
10941
- if (pair.assetType === -1 && dec.has(c)) {
12448
+ if (pair.assetType === -1 && dec2.has(c)) {
10942
12449
  pair.assetType = 0;
10943
12450
  pair.collateralMint = c;
10944
12451
  }
10945
12452
  if (pair.collateralMint && pair.collateralDecimals === void 0)
10946
- pair.collateralDecimals = dec.get(pair.collateralMint);
12453
+ pair.collateralDecimals = dec2.get(pair.collateralMint);
10947
12454
  if (pair.principalDecimals === void 0)
10948
- pair.principalDecimals = dec.get(pair.principalMint);
12455
+ pair.principalDecimals = dec2.get(pair.principalMint);
10949
12456
  }
10950
- for (const c of unknown) if (!dec.has(c)) unresolved.push(c);
12457
+ for (const c of unknown) if (!dec2.has(c)) unresolved.push(c);
10951
12458
  } else unresolved.push(...unknown);
10952
12459
  const pairs = [...byKey.values()].filter(
10953
12460
  (p) => (p.assetType === 0 || opts.includeUnresolvedCollateral) && (want ? want.has(key2(p.principalMint, p.collateralIdentifier)) : true)
@@ -11380,11 +12887,11 @@ function convertLoopscalePair(pair, opts) {
11380
12887
  }
11381
12888
 
11382
12889
  // src/lending/public-data/loopscale/fetchPublic.ts
11383
- var import_svm_kit5 = require("@1delta/svm-kit");
12890
+ var import_svm_kit6 = require("@1delta/svm-kit");
11384
12891
  init_lenders();
11385
12892
 
11386
12893
  // src/lending/public-data/loopscale/accounts.ts
11387
- var import_svm_kit4 = require("@1delta/svm-kit");
12894
+ var import_svm_kit5 = require("@1delta/svm-kit");
11388
12895
 
11389
12896
  // src/lending/public-data/loopscale/idl/loopscale.json
11390
12897
  var loopscale_default = {
@@ -18367,8 +19874,8 @@ var podDecimalToNumber = (p) => Number(podToBigInt(p)) / 1e18;
18367
19874
  var podBool = (p) => bytesOf(p)[0] !== 0;
18368
19875
  var raw = (v) => v;
18369
19876
  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));
19877
+ const r = raw((0, import_svm_kit5.decodeIdlAccount)(LOOPSCALE_IDL, "Loan", data));
19878
+ const zero = (0, import_svm_kit5.encodeBase58)(new Uint8Array(32));
18372
19879
  const ledgers = r.ledgers.map(
18373
19880
  (l) => ({
18374
19881
  status: l.status,
@@ -18412,7 +19919,7 @@ function decodeLoopscaleLoan(data) {
18412
19919
  };
18413
19920
  }
18414
19921
  function decodeLoopscaleStrategy(data) {
18415
- const r = raw((0, import_svm_kit4.decodeIdlAccount)(LOOPSCALE_IDL, "Strategy", data));
19922
+ const r = raw((0, import_svm_kit5.decodeIdlAccount)(LOOPSCALE_IDL, "Strategy", data));
18416
19923
  return {
18417
19924
  version: r.version,
18418
19925
  nonce: r.nonce,
@@ -18449,13 +19956,13 @@ async function readLoopscaleLoans(rpc, loanAddresses) {
18449
19956
  return {
18450
19957
  slot,
18451
19958
  loans: accounts.map(
18452
- (a) => a && a.owner === LOOPSCALE_PROGRAM_ID ? decodeLoopscaleLoan((0, import_svm_kit4.fromBase64)(a.data[0])) : null
19959
+ (a) => a && a.owner === LOOPSCALE_PROGRAM_ID ? decodeLoopscaleLoan((0, import_svm_kit5.fromBase64)(a.data[0])) : null
18453
19960
  )
18454
19961
  };
18455
19962
  }
18456
19963
  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));
19964
+ const r = raw((0, import_svm_kit5.decodeIdlAccount)(LOOPSCALE_IDL, "MarketInformation", data));
19965
+ const zero = (0, import_svm_kit5.encodeBase58)(new Uint8Array(32));
18459
19966
  const caps = (c) => ({
18460
19967
  max1hr: podToBigInt(c.max_1hr).toString(),
18461
19968
  max24hr: podToBigInt(c.max_24hr).toString(),
@@ -18504,7 +20011,7 @@ async function readLoopscaleMarketInformation(rpc, addresses) {
18504
20011
  try {
18505
20012
  out.set(
18506
20013
  unique[i],
18507
- decodeLoopscaleMarketInformation((0, import_svm_kit4.fromBase64)(a.data[0]))
20014
+ decodeLoopscaleMarketInformation((0, import_svm_kit5.fromBase64)(a.data[0]))
18508
20015
  );
18509
20016
  } catch (e) {
18510
20017
  console.warn(
@@ -18697,7 +20204,7 @@ async function fetchLoopscalePublic(opts = {}) {
18697
20204
  opts.vaults ?? api.vaults(),
18698
20205
  opts.loops ?? api.loops()
18699
20206
  ]);
18700
- const rpc = opts.rpc ?? (0, import_svm_kit5.createSvmRpc)();
20207
+ const rpc = opts.rpc ?? (0, import_svm_kit6.createSvmRpc)();
18701
20208
  const { pairs, unresolved } = await buildLoopscaleRoster(vaults, loops, {
18702
20209
  ...opts,
18703
20210
  rpc
@@ -18816,18 +20323,18 @@ function tenorsToQuote(pair, all) {
18816
20323
  return out;
18817
20324
  }
18818
20325
  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);
20326
+ const dec2 = /* @__PURE__ */ new Map();
20327
+ for (const [m, t] of Object.entries(tokenList ?? {})) dec2.set(m, t.decimals);
18821
20328
  for (const p of pairs) {
18822
20329
  if (p.principalDecimals !== void 0)
18823
- dec.set(p.principalMint, p.principalDecimals);
20330
+ dec2.set(p.principalMint, p.principalDecimals);
18824
20331
  if (p.collateralMint && p.collateralDecimals !== void 0)
18825
- dec.set(p.collateralMint, p.collateralDecimals);
20332
+ dec2.set(p.collateralMint, p.collateralDecimals);
18826
20333
  }
18827
20334
  const out = {};
18828
20335
  const best = /* @__PURE__ */ new Map();
18829
20336
  const offer = (mint, usd, raw2) => {
18830
- const d2 = dec.get(mint);
20337
+ const d2 = dec2.get(mint);
18831
20338
  if (d2 === void 0 || !usd || !(raw2 > 0)) return;
18832
20339
  if ((best.get(mint) ?? 0) < usd) {
18833
20340
  best.set(mint, usd);
@@ -18858,7 +20365,7 @@ function deriveLoopscalePrices(vaults, loops, pairs, tokenList, loanBook) {
18858
20365
  }
18859
20366
 
18860
20367
  // src/prices/pythPush.ts
18861
- var import_svm_kit6 = require("@1delta/svm-kit");
20368
+ var import_svm_kit7 = require("@1delta/svm-kit");
18862
20369
  var PYTH_RECEIVER_PROGRAM = "rec2HHDDnjLfj4kE7VyEtFA1HPGQLK33259532cRyHp";
18863
20370
  var PYTH_PRICE_UPDATE_V2_DISCRIMINATOR = [
18864
20371
  34,
@@ -18871,7 +20378,7 @@ var PYTH_PRICE_UPDATE_V2_DISCRIMINATOR = [
18871
20378
  205
18872
20379
  ];
18873
20380
  function decodePythPriceUpdate(data) {
18874
- const b = typeof data === "string" ? (0, import_svm_kit6.fromBase64)(data) : data;
20381
+ const b = typeof data === "string" ? (0, import_svm_kit7.fromBase64)(data) : data;
18875
20382
  for (let i = 0; i < 8; i++)
18876
20383
  if (b[i] !== PYTH_PRICE_UPDATE_V2_DISCRIMINATOR[i])
18877
20384
  throw new Error("pyth: account is not a PriceUpdateV2");
@@ -19005,7 +20512,7 @@ function createP0Api(opts = {}) {
19005
20512
  }
19006
20513
 
19007
20514
  // src/lending/public-data/project0/accounts.ts
19008
- var import_svm_kit7 = require("@1delta/svm-kit");
20515
+ var import_svm_kit8 = require("@1delta/svm-kit");
19009
20516
 
19010
20517
  // src/lending/public-data/project0/idl/marginfi.json
19011
20518
  var marginfi_default = {
@@ -33869,34 +35376,34 @@ function decimalStringToI80F48(s) {
33869
35376
  for (let i = 0; i < 16; i++) out[i] = Number(u >> BigInt(8 * i) & 0xffn);
33870
35377
  return out;
33871
35378
  }
33872
- var utf83 = (s) => new TextEncoder().encode(s);
33873
- var pk3 = (address) => {
33874
- const b = (0, import_svm_kit7.decodeBase58)(address);
35379
+ var utf84 = (s) => new TextEncoder().encode(s);
35380
+ var pk4 = (address) => {
35381
+ const b = (0, import_svm_kit8.decodeBase58)(address);
33875
35382
  if (!b || b.length !== 32)
33876
35383
  throw new Error(`project0: not a 32-byte pubkey: ${address}`);
33877
35384
  return b;
33878
35385
  };
33879
- var u16le = (n) => {
35386
+ var u16le2 = (n) => {
33880
35387
  if (!Number.isInteger(n) || n < 0 || n > 65535)
33881
35388
  throw new Error(`project0: u16 out of range: ${n}`);
33882
35389
  return new Uint8Array([n & 255, n >> 8]);
33883
35390
  };
33884
- var p0LiquidityVaultAuthority = async (bank, programId = P0_PROGRAM_ID) => (await (0, import_svm_kit7.findProgramAddress)(
33885
- [utf83(P0_SEEDS.liquidityVaultAuthority), pk3(bank)],
35391
+ var p0LiquidityVaultAuthority = async (bank, programId = P0_PROGRAM_ID) => (await (0, import_svm_kit8.findProgramAddress)(
35392
+ [utf84(P0_SEEDS.liquidityVaultAuthority), pk4(bank)],
33886
35393
  programId
33887
35394
  )).address;
33888
- var p0LiquidityVault = async (bank, programId = P0_PROGRAM_ID) => (await (0, import_svm_kit7.findProgramAddress)(
33889
- [utf83(P0_SEEDS.liquidityVault), pk3(bank)],
35395
+ var p0LiquidityVault = async (bank, programId = P0_PROGRAM_ID) => (await (0, import_svm_kit8.findProgramAddress)(
35396
+ [utf84(P0_SEEDS.liquidityVault), pk4(bank)],
33890
35397
  programId
33891
35398
  )).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)(
35399
+ var p0FeeState = async (programId = P0_PROGRAM_ID) => (await (0, import_svm_kit8.findProgramAddress)([utf84(P0_SEEDS.feeState)], programId)).address;
35400
+ var p0MarginfiAccountPda = async (authority, accountIndex = 0, opts = {}) => (await (0, import_svm_kit8.findProgramAddress)(
33894
35401
  [
33895
- utf83(P0_SEEDS.marginfiAccount),
33896
- pk3(opts.group ?? P0_MAIN_GROUP),
33897
- pk3(authority),
33898
- u16le(accountIndex),
33899
- u16le(opts.thirdPartyId ?? 0)
35402
+ utf84(P0_SEEDS.marginfiAccount),
35403
+ pk4(opts.group ?? P0_MAIN_GROUP),
35404
+ pk4(authority),
35405
+ u16le2(accountIndex),
35406
+ u16le2(opts.thirdPartyId ?? 0)
33900
35407
  ],
33901
35408
  opts.programId ?? P0_PROGRAM_ID
33902
35409
  )).address;
@@ -33980,8 +35487,8 @@ var bankConfig = (c) => ({
33980
35487
  cbEmaAlphaBps: c.cb_ema_alpha_bps
33981
35488
  });
33982
35489
  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);
35490
+ const bytes2 = typeof data === "string" ? (0, import_svm_kit8.fromBase64)(data) : data;
35491
+ const r = (0, import_svm_kit8.decodeIdlAccount)(P0_IDL, "Bank", bytes2);
33985
35492
  const entries = r.emode.emode_config.entries.filter((e) => e.collateral_bank_emode_tag !== 0).map((e) => ({
33986
35493
  collateralBankEmodeTag: e.collateral_bank_emode_tag,
33987
35494
  flags: e.flags,
@@ -34206,8 +35713,8 @@ var u32ToBasis = (v) => v / 4294967295 * 100;
34206
35713
  var P0_PAUSE_DURATION_SECONDS = 6 * 60 * 60;
34207
35714
  var p0GroupPausedAt = (g, now) => !!g?.panic.pausedFlag && (now < g.panic.pauseStartTimestamp || now - g.panic.pauseStartTimestamp < P0_PAUSE_DURATION_SECONDS);
34208
35715
  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);
35716
+ const bytes2 = typeof data === "string" ? (0, import_svm_kit8.fromBase64)(data) : data;
35717
+ const r = (0, import_svm_kit8.decodeIdlAccount)(P0_IDL, "MarginfiGroup", bytes2);
34211
35718
  return {
34212
35719
  address,
34213
35720
  admin: r.admin,
@@ -34240,11 +35747,11 @@ function decodeP0Group(address, data) {
34240
35747
  };
34241
35748
  }
34242
35749
  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)(
35750
+ const bytes2 = typeof data === "string" ? (0, import_svm_kit8.fromBase64)(data) : data;
35751
+ const r = (0, import_svm_kit8.decodeIdlAccount)(
34245
35752
  P0_IDL,
34246
35753
  "MarginfiAccount",
34247
- bytes
35754
+ bytes2
34248
35755
  );
34249
35756
  const h = r.health_cache;
34250
35757
  return {
@@ -34296,10 +35803,10 @@ var P0_GROUP_SIZE = 9256;
34296
35803
  var P0_ACCOUNT_GROUP_OFFSET = 8;
34297
35804
  var P0_ACCOUNT_AUTHORITY_OFFSET = 8 + 32;
34298
35805
  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;
35806
+ var p0BankMetadataPda = async (bank, programId = P0_PROGRAM_ID) => (await (0, import_svm_kit8.findProgramAddress)([utf84("metadata"), pk4(bank)], programId)).address;
34300
35807
  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);
35808
+ const bytes2 = typeof data === "string" ? (0, import_svm_kit8.fromBase64)(data) : data;
35809
+ const r = (0, import_svm_kit8.decodeIdlAccount)(P0_IDL, "BankMetadata", bytes2);
34303
35810
  const td = new TextDecoder();
34304
35811
  const ticker = td.decode(r.ticker.subarray(0, r.end_ticker_byte)).trim();
34305
35812
  const description = td.decode(r.description.subarray(0, r.end_description_byte)).trim();
@@ -34449,7 +35956,7 @@ function p0CurveKnots(c) {
34449
35956
  }
34450
35957
 
34451
35958
  // src/vaults/lst/stakePool.ts
34452
- var import_svm_kit8 = require("@1delta/svm-kit");
35959
+ var import_svm_kit9 = require("@1delta/svm-kit");
34453
35960
  var SPL_STAKE_POOL_PROGRAM = "SPoo1Ku8WFXoNDMHPsrGSTSG1Y47rzgn41SLUNakuHy";
34454
35961
  var OFFSET_RESERVE_STAKE = 130;
34455
35962
  var OFFSET_POOL_MINT = 162;
@@ -34478,8 +35985,8 @@ function decodeStakePool(data) {
34478
35985
  `stake-pool: account is ${data.byteLength} bytes, need \u2265 ${OFFSET_LAST_UPDATE_EPOCH + 8}`
34479
35986
  );
34480
35987
  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)(
35988
+ poolMint: (0, import_svm_kit9.encodeBase58)(data.slice(OFFSET_POOL_MINT, OFFSET_POOL_MINT + 32)),
35989
+ reserveStake: (0, import_svm_kit9.encodeBase58)(
34483
35990
  data.slice(OFFSET_RESERVE_STAKE, OFFSET_RESERVE_STAKE + 32)
34484
35991
  ),
34485
35992
  totalLamports: u642(data, OFFSET_TOTAL_LAMPORTS),
@@ -34487,7 +35994,7 @@ function decodeStakePool(data) {
34487
35994
  lastUpdateEpoch: u642(data, OFFSET_LAST_UPDATE_EPOCH)
34488
35995
  };
34489
35996
  try {
34490
- const r = new import_svm_kit8.BorshReader(data);
35997
+ const r = new import_svm_kit9.BorshReader(data);
34491
35998
  r.skip(OFFSET_TAIL);
34492
35999
  r.skip(8 + 8 + 32);
34493
36000
  const epoch = readFee(r);
@@ -34525,7 +36032,7 @@ async function readStakePools(rpc, stakePools, opts = {}) {
34525
36032
  const pools = accounts.map((a) => {
34526
36033
  if (!a || a.owner !== program) return null;
34527
36034
  try {
34528
- return decodeStakePool((0, import_svm_kit8.fromBase64)(a.data[0]));
36035
+ return decodeStakePool((0, import_svm_kit9.fromBase64)(a.data[0]));
34529
36036
  } catch {
34530
36037
  return null;
34531
36038
  }
@@ -34577,7 +36084,127 @@ async function readEpochClock(rpc) {
34577
36084
  }
34578
36085
 
34579
36086
  // src/lending/public-data/project0/prices.ts
34580
- var import_svm_kit9 = require("@1delta/svm-kit");
36087
+ var import_svm_kit11 = require("@1delta/svm-kit");
36088
+
36089
+ // src/prices/oracleAccounts.ts
36090
+ var import_svm_kit10 = require("@1delta/svm-kit");
36091
+ var PYTH_PRICE_UPDATE_OWNERS = /* @__PURE__ */ new Set([
36092
+ "rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ",
36093
+ "rec2HHDDnjLfj4kE7VyEtFA1HPGQLK33259532cRyHp"
36094
+ ]);
36095
+ var PYTH_LEGACY_PROGRAM = "FsJ3A3u2vn5cTVofAjvy6y5kwABJAqYWpe4975bi2epH";
36096
+ var SWITCHBOARD_ON_DEMAND_PROGRAM = "SBondMDrcV3K4kxZR1HNVT7osZxAHVHgYXL5Ze1oMUv";
36097
+ var SWITCHBOARD_V2_PROGRAM = "SW1TCH7qEPTdLsDHRgPuMQjbQxKdH2aBStViMFnt64f";
36098
+ var SCOPE_PROGRAM = "HFn8GnPADiny6XqUoWE8uRPPxb29ikn4yTuPa9MF2fWJ";
36099
+ var MARINADE_PROGRAM = "MarBmsSgKXdrN1egZf5sqe1TMai9K1rChYNDJgjq7aD";
36100
+ var bytes = (data) => typeof data === "string" ? (0, import_svm_kit10.fromBase64)(data) : data;
36101
+ var view = (b) => new DataView(b.buffer, b.byteOffset, b.byteLength);
36102
+ var i128 = (b, o) => {
36103
+ const dv = view(b);
36104
+ const lo = dv.getBigUint64(o, true);
36105
+ const hi = dv.getBigInt64(o + 8, true);
36106
+ return (hi << 64n) + lo;
36107
+ };
36108
+ var disc = (b, d2) => d2.every((x, i) => b[i] === x);
36109
+ var SB_PULL_FEED_DISCRIMINATOR = [196, 27, 108, 196, 10, 215, 219, 40];
36110
+ var SB_V2_AGGREGATOR_DISCRIMINATOR = [
36111
+ 217,
36112
+ 230,
36113
+ 65,
36114
+ 101,
36115
+ 201,
36116
+ 162,
36117
+ 27,
36118
+ 125
36119
+ ];
36120
+ var PYTH_LEGACY_MAGIC = 2712847316;
36121
+ function decodeSwitchboardPullFeed(data) {
36122
+ const b = bytes(data);
36123
+ if (!disc(b, SB_PULL_FEED_DISCRIMINATOR) || b.length < 2392)
36124
+ throw new Error("switchboard: account is not a PullFeedAccountData");
36125
+ const dv = view(b);
36126
+ const value = i128(b, 2264);
36127
+ return {
36128
+ kind: "switchboard-on-demand",
36129
+ price: Number(value) / 1e18,
36130
+ updatedAt: Number(dv.getBigInt64(2216, true)),
36131
+ slot: Number(dv.getBigUint64(2368, true)),
36132
+ name: new TextDecoder().decode(b.subarray(2180, 2212)).replace(/\0+$/, "")
36133
+ };
36134
+ }
36135
+ function decodeSwitchboardV2Aggregator(data) {
36136
+ const b = bytes(data);
36137
+ if (!disc(b, SB_V2_AGGREGATOR_DISCRIMINATOR) || b.length < 386)
36138
+ throw new Error("switchboard: account is not an AggregatorAccountData");
36139
+ const dv = view(b);
36140
+ const mantissa = i128(b, 366);
36141
+ const scale = dv.getUint32(382, true);
36142
+ return {
36143
+ kind: "switchboard-v2",
36144
+ price: Number(mantissa) / 10 ** scale,
36145
+ updatedAt: Number(dv.getBigInt64(358, true)),
36146
+ slot: Number(dv.getBigUint64(350, true)),
36147
+ name: new TextDecoder().decode(b.subarray(8, 40)).replace(/\0+$/, "")
36148
+ };
36149
+ }
36150
+ function decodePythLegacyPrice(data) {
36151
+ const b = bytes(data);
36152
+ const dv = view(b);
36153
+ if (b.length < 240 || dv.getUint32(0, true) !== PYTH_LEGACY_MAGIC)
36154
+ throw new Error("pyth: account is not a legacy price account");
36155
+ if (dv.getUint32(8, true) !== 3)
36156
+ throw new Error("pyth: legacy account is not a PRICE account");
36157
+ const expo = dv.getInt32(20, true);
36158
+ return {
36159
+ kind: "pyth-legacy",
36160
+ price: Number(dv.getBigInt64(208, true)) * 10 ** expo,
36161
+ updatedAt: Number(dv.getBigInt64(96, true)),
36162
+ slot: Number(dv.getBigUint64(232, true)),
36163
+ status: dv.getUint32(224, true)
36164
+ };
36165
+ }
36166
+ var SCOPE_PRICES_LEN = 512;
36167
+ function decodeScopePrice(data, index) {
36168
+ const b = bytes(data);
36169
+ if (!Number.isInteger(index) || index < 0 || index >= SCOPE_PRICES_LEN)
36170
+ throw new Error(`scope: entry index ${index} out of range`);
36171
+ const o = 8 + 32 + index * 56;
36172
+ if (b.length < o + 32) throw new Error("scope: account too short");
36173
+ const dv = view(b);
36174
+ const value = dv.getBigUint64(o, true);
36175
+ const exp = Number(dv.getBigUint64(o + 8, true));
36176
+ return {
36177
+ kind: "scope",
36178
+ price: Number(value) / 10 ** exp,
36179
+ updatedAt: Number(dv.getBigUint64(o + 24, true)),
36180
+ slot: Number(dv.getBigUint64(o + 16, true))
36181
+ };
36182
+ }
36183
+ function decodeMarinadeMsolPrice(data) {
36184
+ const b = bytes(data);
36185
+ if (b.length < 520) throw new Error("marinade: account too short");
36186
+ return Number(view(b).getBigUint64(512, true)) / 2 ** 32;
36187
+ }
36188
+ function decodeOracleFeed(account) {
36189
+ const b = bytes(account.data);
36190
+ if (PYTH_PRICE_UPDATE_OWNERS.has(account.owner) && disc(b, PYTH_PRICE_UPDATE_V2_DISCRIMINATOR)) {
36191
+ const p = decodePythPriceUpdate(b);
36192
+ return {
36193
+ kind: "pyth-push",
36194
+ price: p.priceUsd,
36195
+ updatedAt: p.publishTime,
36196
+ slot: p.postedSlot
36197
+ };
36198
+ }
36199
+ if (account.owner === SWITCHBOARD_ON_DEMAND_PROGRAM)
36200
+ return decodeSwitchboardPullFeed(b);
36201
+ if (account.owner === SWITCHBOARD_V2_PROGRAM)
36202
+ return decodeSwitchboardV2Aggregator(b);
36203
+ if (account.owner === PYTH_LEGACY_PROGRAM) return decodePythLegacyPrice(b);
36204
+ return void 0;
36205
+ }
36206
+
36207
+ // src/lending/public-data/project0/prices.ts
34581
36208
  var P0_PYTH_PUSH_SETUPS = /* @__PURE__ */ new Set([
34582
36209
  "PythPushOracle",
34583
36210
  "StakedWithPythPush",
@@ -34615,6 +36242,7 @@ var stakePoolKeyOf = (b) => {
34615
36242
  return void 0;
34616
36243
  }
34617
36244
  };
36245
+ var marinadeKeyOf = (b) => b.config.oracleSetup === "PythMSOL" ? b.config.oracleKeys[1] : void 0;
34618
36246
  var isP0FixedSetup = (setup) => setup.startsWith("Fixed");
34619
36247
  var P0_STAKE_POOL_PROGRAMS = /* @__PURE__ */ new Set([
34620
36248
  SPL_STAKE_POOL_PROGRAM,
@@ -34625,6 +36253,8 @@ var DRIFT_SCALED_BALANCE_DECIMALS = 9;
34625
36253
  async function resolveP0Prices(rpc, banks, opts = {}) {
34626
36254
  const pythKeys = /* @__PURE__ */ new Set();
34627
36255
  const poolKeys = /* @__PURE__ */ new Set();
36256
+ const marinadeKeys = /* @__PURE__ */ new Set();
36257
+ const scopeKeys = /* @__PURE__ */ new Set();
34628
36258
  if (!opts.cacheOnly && rpc)
34629
36259
  for (const b of banks) {
34630
36260
  if (P0_PYTH_PUSH_SETUPS.has(b.config.oracleSetup)) {
@@ -34633,12 +36263,20 @@ async function resolveP0Prices(rpc, banks, opts = {}) {
34633
36263
  }
34634
36264
  const pool = stakePoolKeyOf(b);
34635
36265
  if (!isNullKey(pool)) poolKeys.add(pool);
36266
+ const msol = marinadeKeyOf(b);
36267
+ if (!isNullKey(msol)) marinadeKeys.add(msol);
36268
+ if (b.config.oracleSetup === "Scope") {
36269
+ const k = b.config.oracleKeys[0];
36270
+ if (!isNullKey(k)) scopeKeys.add(k);
36271
+ }
34636
36272
  }
34637
36273
  const pyth = {};
34638
36274
  const poolRate = {};
36275
+ const msolRate = {};
36276
+ const scopeData = {};
34639
36277
  let slot = 0;
34640
- if (pythKeys.size || poolKeys.size) {
34641
- const keys = [...pythKeys, ...poolKeys];
36278
+ if (pythKeys.size || poolKeys.size || marinadeKeys.size || scopeKeys.size) {
36279
+ const keys = [...pythKeys, ...poolKeys, ...marinadeKeys, ...scopeKeys];
34642
36280
  const res = await rpc.readAccounts(keys, { encoding: "base64" });
34643
36281
  slot = res.slot;
34644
36282
  res.accounts.forEach((a, i) => {
@@ -34648,8 +36286,15 @@ async function resolveP0Prices(rpc, banks, opts = {}) {
34648
36286
  if (pythKeys.has(key2)) {
34649
36287
  if (a.owner === PYTH_RECEIVER_PROGRAM)
34650
36288
  pyth[key2] = decodePythPriceUpdate(a.data[0]);
36289
+ } else if (marinadeKeys.has(key2)) {
36290
+ if (a.owner === MARINADE_PROGRAM) {
36291
+ const r = decodeMarinadeMsolPrice(a.data[0]);
36292
+ if (r > 0) msolRate[key2] = r;
36293
+ }
36294
+ } else if (scopeKeys.has(key2)) {
36295
+ if (a.owner === SCOPE_PROGRAM) scopeData[key2] = (0, import_svm_kit11.fromBase64)(a.data[0]);
34651
36296
  } else if (P0_STAKE_POOL_PROGRAMS.has(a.owner)) {
34652
- const p = decodeStakePool((0, import_svm_kit9.fromBase64)(a.data[0]));
36297
+ const p = decodeStakePool((0, import_svm_kit11.fromBase64)(a.data[0]));
34653
36298
  if (p.poolTokenSupply > 0n)
34654
36299
  poolRate[key2] = Number(p.totalLamports) / Number(p.poolTokenSupply);
34655
36300
  }
@@ -34676,8 +36321,15 @@ async function resolveP0Prices(rpc, banks, opts = {}) {
34676
36321
  }
34677
36322
  const feed = b.config.oracleKeys[0];
34678
36323
  const live = feed && !isNullKey(feed) ? pyth[feed] : void 0;
34679
- const pool = stakePoolKeyOf(b);
34680
- const liveRate = pool ? poolRate[pool] : void 0;
36324
+ const pool = stakePoolKeyOf(b) ?? marinadeKeyOf(b);
36325
+ const liveRate = pool ? poolRate[pool] ?? msolRate[pool] : void 0;
36326
+ let scope;
36327
+ if (setup === "Scope" && feed && scopeData[feed])
36328
+ try {
36329
+ scope = decodeScopePrice(scopeData[feed], b.config.scopeEntryIndex);
36330
+ } catch (e) {
36331
+ console.warn(`[project0] scope ${feed}: ${e.message}`);
36332
+ }
34681
36333
  let liveMult = 1;
34682
36334
  let liveMultNote = "";
34683
36335
  if (P0_CACHED_PRICE_MULTIPLIER_SETUPS.has(setup)) {
@@ -34685,7 +36337,7 @@ async function resolveP0Prices(rpc, banks, opts = {}) {
34685
36337
  liveMultNote = `cached SVSP rate ${cacheMult?.toFixed(6)} as of ${cacheTs}`;
34686
36338
  } else if (P0_ADJUSTED_CACHE_SETUPS.has(setup)) {
34687
36339
  liveMult = liveRate ?? null;
34688
- liveMultNote = liveRate ? `SPL stake pool ${pool} rate ${liveRate.toFixed(6)}` : "";
36340
+ liveMultNote = liveRate ? `${msolRate[pool] ? "Marinade state" : "SPL stake pool"} ${pool} rate ${liveRate.toFixed(6)}` : "";
34689
36341
  }
34690
36342
  let out;
34691
36343
  if (isP0FixedSetup(setup)) {
@@ -34702,6 +36354,15 @@ async function resolveP0Prices(rpc, banks, opts = {}) {
34702
36354
  multiplier: 1,
34703
36355
  description: `admin-set fixed price (${setup})`
34704
36356
  };
36357
+ } else if (scope && scope.price > 0) {
36358
+ out = {
36359
+ priceUsd: scope.price,
36360
+ source: "scope",
36361
+ updatedAt: scope.updatedAt || void 0,
36362
+ multiplier: 1,
36363
+ feed,
36364
+ description: `Scope ${feed} entry ${b.config.scopeEntryIndex} (${setup})`
36365
+ };
34705
36366
  } else if (live && liveMult !== null && liveMult > 0) {
34706
36367
  out = {
34707
36368
  priceUsd: live.priceUsd * liveMult,
@@ -35161,13 +36822,13 @@ function deriveP0Mode(liabilityTags, roster) {
35161
36822
  }
35162
36823
 
35163
36824
  // src/lending/public-data/project0/fetchPublic.ts
35164
- var import_svm_kit10 = require("@1delta/svm-kit");
36825
+ var import_svm_kit12 = require("@1delta/svm-kit");
35165
36826
  async function fetchProject0Public(opts = {}) {
35166
36827
  const api = createP0Api(opts);
35167
36828
  const groups = opts.groups?.length ? opts.groups : [P0_MAIN_GROUP];
35168
36829
  const source = opts.source ?? "chain";
35169
36830
  const roster = opts.roster ?? "scan";
35170
- const rpc = source === "chain" || roster === "scan" || !opts.prices?.cacheOnly ? opts.rpc ?? (0, import_svm_kit10.createSvmRpc)() : opts.rpc;
36831
+ const rpc = source === "chain" || roster === "scan" || !opts.prices?.cacheOnly ? opts.rpc ?? (0, import_svm_kit12.createSvmRpc)() : opts.rpc;
35171
36832
  const out = {};
35172
36833
  for (const group of groups) {
35173
36834
  let banks = [];
@@ -35630,9 +37291,9 @@ function liquidityRatio(liquidity, totalAssets) {
35630
37291
  // src/vaults/jupiter-lend/index.ts
35631
37292
  function convertJupiterLendEarnToken(market, t, tokenList) {
35632
37293
  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;
37294
+ const dec2 = t.asset.decimals;
37295
+ const totalAssetsFormatted = Number(t.totalAssets) / 10 ** dec2;
37296
+ const liquidityFormatted = Number(t.liquiditySupplyData.withdrawable) / 10 ** dec2;
35636
37297
  const sharePrice = Number(t.convertToAssets) / 10 ** t.decimals;
35637
37298
  const supplyRate = bpsToPercent(t.supplyRate);
35638
37299
  const rewardsRate = bpsToPercent(t.rewardsRate);
@@ -35641,7 +37302,7 @@ function convertJupiterLendEarnToken(market, t, tokenList) {
35641
37302
  address: t.assetAddress,
35642
37303
  symbol: t.asset.uiSymbol,
35643
37304
  name: t.asset.name,
35644
- decimals: dec,
37305
+ decimals: dec2,
35645
37306
  ...t.asset.logoUrl ? { logoURI: t.asset.logoUrl } : {}
35646
37307
  };
35647
37308
  return {
@@ -35656,7 +37317,7 @@ function convertJupiterLendEarnToken(market, t, tokenList) {
35656
37317
  displayName: `Jupiter Lend ${t.asset.uiSymbol}`,
35657
37318
  curatorName: "Jupiter",
35658
37319
  decimals: t.decimals,
35659
- assetDecimals: dec,
37320
+ assetDecimals: dec2,
35660
37321
  totalAssets: t.totalAssets,
35661
37322
  totalSupply: t.totalSupply,
35662
37323
  convertToShares: t.convertToShares,
@@ -35917,7 +37578,7 @@ async function fetchExponentPtMarkets(opts = {}) {
35917
37578
  }
35918
37579
 
35919
37580
  // src/vaults/solstice/accounts.ts
35920
- var import_svm_kit11 = require("@1delta/svm-kit");
37581
+ var import_svm_kit13 = require("@1delta/svm-kit");
35921
37582
 
35922
37583
  // src/vaults/solstice/idl/yield_strategy.json
35923
37584
  var yield_strategy_default = {
@@ -46586,14 +48247,14 @@ var SOLSTICE_MINTS = {
46586
48247
  var SOLSTICE_STRATEGIES = ["STRC-USX"];
46587
48248
  var SOLSTICE_DECIMALS = 6;
46588
48249
  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);
48250
+ var utf85 = (s) => new TextEncoder().encode(s);
48251
+ var pk5 = (address) => {
48252
+ const b = (0, import_svm_kit13.decodeBase58)(address);
46592
48253
  if (!b || b.length !== 32)
46593
48254
  throw new Error(`solstice: not a 32-byte pubkey: ${address}`);
46594
48255
  return b;
46595
48256
  };
46596
- var pda = async (seeds, programId) => (await (0, import_svm_kit11.findProgramAddress)(seeds, programId)).address;
48257
+ var pda = async (seeds, programId) => (await (0, import_svm_kit13.findProgramAddress)(seeds, programId)).address;
46597
48258
  async function yieldVaultPdas(programId = SOLSTICE_PROGRAMS.yieldVault) {
46598
48259
  const [controller, yieldPool, vestingSchedule, shareMint, assetVault] = await Promise.all(
46599
48260
  [
@@ -46602,19 +48263,19 @@ async function yieldVaultPdas(programId = SOLSTICE_PROGRAMS.yieldVault) {
46602
48263
  "VESTING_SCHEDULE",
46603
48264
  "SHARE_MINT",
46604
48265
  "ASSET_VAULT"
46605
- ].map((s) => pda([utf84(s)], programId))
48266
+ ].map((s) => pda([utf85(s)], programId))
46606
48267
  );
46607
48268
  return { controller, yieldPool, vestingSchedule, shareMint, assetVault };
46608
48269
  }
46609
48270
  async function yieldVaultCooldownPdas(user, programId = SOLSTICE_PROGRAMS.yieldVault) {
46610
48271
  const [escrow, escrowVault] = await Promise.all([
46611
- pda([utf84("COOLDOWN_ESCROW"), pk4(user)], programId),
46612
- pda([utf84("COOLDOWN_ESCROW_VAULT"), pk4(user)], programId)
48272
+ pda([utf85("COOLDOWN_ESCROW"), pk5(user)], programId),
48273
+ pda([utf85("COOLDOWN_ESCROW_VAULT"), pk5(user)], programId)
46613
48274
  ]);
46614
48275
  return { escrow, escrowVault };
46615
48276
  }
46616
48277
  async function strategyPdas(name, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
46617
- const n = utf84(name);
48278
+ const n = utf85(name);
46618
48279
  if (n.length < 1 || n.length > 32)
46619
48280
  throw new Error(`solstice: strategy name must be 1..=32 bytes: ${name}`);
46620
48281
  const [
@@ -46626,13 +48287,13 @@ async function strategyPdas(name, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
46626
48287
  assetVault,
46627
48288
  feeVault
46628
48289
  ] = 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)
48290
+ pda([utf85("CONTROLLER")], programId),
48291
+ pda([utf85("STRATEGY"), n], programId),
48292
+ pda([utf85("ACCOUNTING"), n], programId),
48293
+ pda([utf85("JUNIOR_MINT"), n], programId),
48294
+ pda([utf85("SENIOR_MINT"), n], programId),
48295
+ pda([utf85("ASSET_VAULT"), n], programId),
48296
+ pda([utf85("FEE_VAULT"), n], programId)
46636
48297
  ]);
46637
48298
  return {
46638
48299
  name,
@@ -46647,10 +48308,10 @@ async function strategyPdas(name, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
46647
48308
  }
46648
48309
  async function settlementBatchPdas(strategyName, batchName, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
46649
48310
  const seeds = (tag) => [
46650
- utf84(tag),
46651
- utf84(strategyName),
48311
+ utf85(tag),
48312
+ utf85(strategyName),
46652
48313
  Uint8Array.of(0),
46653
- utf84(batchName)
48314
+ utf85(batchName)
46654
48315
  ];
46655
48316
  const [batch, shareVault, assetVault] = await Promise.all([
46656
48317
  pda(seeds("SETTLEMENT_BATCH"), programId),
@@ -46659,38 +48320,38 @@ async function settlementBatchPdas(strategyName, batchName, programId = SOLSTICE
46659
48320
  ]);
46660
48321
  return { batch, shareVault, assetVault };
46661
48322
  }
46662
- var juniorUnlockSharePda = (batch, user, programId = SOLSTICE_PROGRAMS.yieldStrategy) => pda([utf84("JUNIOR_UNLOCK_SHARE"), pk4(batch), pk4(user)], programId);
48323
+ var juniorUnlockSharePda = (batch, user, programId = SOLSTICE_PROGRAMS.yieldStrategy) => pda([utf85("JUNIOR_UNLOCK_SHARE"), pk5(batch), pk5(user)], programId);
46663
48324
  async function seniorCooldownPdas(strategyName, user, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
46664
48325
  const [cooldown, cooldownVault] = await Promise.all([
46665
48326
  pda(
46666
- [utf84("SENIOR_UNLOCK_COOLDOWN"), utf84(strategyName), pk4(user)],
48327
+ [utf85("SENIOR_UNLOCK_COOLDOWN"), utf85(strategyName), pk5(user)],
46667
48328
  programId
46668
48329
  ),
46669
48330
  pda(
46670
- [utf84("SENIOR_COOLDOWN_VAULT"), utf84(strategyName), pk4(user)],
48331
+ [utf85("SENIOR_COOLDOWN_VAULT"), utf85(strategyName), pk5(user)],
46671
48332
  programId
46672
48333
  )
46673
48334
  ]);
46674
48335
  return { cooldown, cooldownVault };
46675
48336
  }
46676
- var oracleCanonicalPda = (feedId, programId = SOLSTICE_PROGRAMS.oracle) => pda([utf84("CANONICAL"), utf84(feedId)], programId);
48337
+ var oracleCanonicalPda = (feedId, programId = SOLSTICE_PROGRAMS.oracle) => pda([utf85("CANONICAL"), utf85(feedId)], programId);
46677
48338
  var strategyNameOf = (raw2) => new TextDecoder().decode(raw2).replace(/\0+$/, "");
46678
48339
  var YV = SOLSTICE_YIELD_VAULT_IDL;
46679
48340
  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);
48341
+ var decodeController = (d2) => (0, import_svm_kit13.decodeIdlAccount)(YV, "Controller", d2);
48342
+ var decodeYieldPool = (d2) => (0, import_svm_kit13.decodeIdlAccount)(YV, "YieldPool", d2);
48343
+ var decodeVestingSchedule = (d2) => (0, import_svm_kit13.decodeIdlAccount)(YV, "VestingSchedule", d2);
48344
+ var decodeCooldownEscrow = (d2) => (0, import_svm_kit13.decodeIdlAccount)(YV, "CooldownEscrow", d2);
48345
+ var decodeStrategyController = (d2) => (0, import_svm_kit13.decodeIdlAccount)(YS, "Controller", d2);
48346
+ var decodeStrategy = (d2) => (0, import_svm_kit13.decodeIdlAccount)(YS, "Strategy", d2);
48347
+ var decodeAccountingState = (d2) => (0, import_svm_kit13.decodeIdlAccount)(YS, "AccountingState", d2);
48348
+ var decodeSettlementBatch = (d2) => (0, import_svm_kit13.decodeIdlAccount)(YS, "SettlementBatch", d2);
48349
+ var decodeJuniorUnlockShare = (d2) => (0, import_svm_kit13.decodeIdlAccount)(YS, "JuniorUnlockShare", d2);
48350
+ var decodeSeniorUnlockCooldown = (d2) => (0, import_svm_kit13.decodeIdlAccount)(YS, "SeniorUnlockCooldown", d2);
46690
48351
  function accountDiscriminator(idl, name) {
46691
48352
  const a = idl.accounts.find((x) => x.name === name);
46692
48353
  if (!a) throw new Error(`idl ${idl.metadata?.name}: no account ${name}`);
46693
- return (0, import_svm_kit11.encodeBase58)(Uint8Array.from(a.discriminator));
48354
+ return (0, import_svm_kit13.encodeBase58)(Uint8Array.from(a.discriminator));
46694
48355
  }
46695
48356
  var SETTLEMENT_BATCH_SIZE = 309;
46696
48357
  var ORACLE_CANONICAL_SIZE = 365;
@@ -46733,7 +48394,7 @@ function tokenAmount(data) {
46733
48394
  }
46734
48395
  var need = (a, what) => {
46735
48396
  if (!a) throw new Error(`solstice: ${what} account is missing`);
46736
- return (0, import_svm_kit11.fromBase64)(a.data[0]);
48397
+ return (0, import_svm_kit13.fromBase64)(a.data[0]);
46737
48398
  };
46738
48399
  async function readSolsticeChainState(rpc, opts = {}) {
46739
48400
  const programs = { ...SOLSTICE_PROGRAMS, ...opts.programs };
@@ -46798,7 +48459,7 @@ async function readSolsticeChainState(rpc, opts = {}) {
46798
48459
  const raw2 = r.accounts[j++];
46799
48460
  s.oracleAccount = feeds[i];
46800
48461
  if (raw2)
46801
- s.oracle = decodeOracleCanonical((0, import_svm_kit11.fromBase64)(raw2.data[0])) ?? void 0;
48462
+ s.oracle = decodeOracleCanonical((0, import_svm_kit13.fromBase64)(raw2.data[0])) ?? void 0;
46802
48463
  });
46803
48464
  }
46804
48465
  return { slot, yieldVault, strategies };
@@ -46815,7 +48476,7 @@ function createSolsticeAppApi(opts = {}) {
46815
48476
  }
46816
48477
 
46817
48478
  // src/vaults/solstice/math.ts
46818
- var SECONDS_PER_YEAR2 = 31536000n;
48479
+ var SECONDS_PER_YEAR3 = 31536000n;
46819
48480
  var bigMax0 = (v) => v > 0n ? v : 0n;
46820
48481
  function unvestedAt(amount, start, end, now) {
46821
48482
  if (start === 0n && end === 0n) return 0n;
@@ -46854,7 +48515,7 @@ function eusxAssetsToShares(assets, r) {
46854
48515
  function epochRatePercent(vesting, assetsIncludingVesting, epochSeconds) {
46855
48516
  const principal = assetsIncludingVesting - vesting;
46856
48517
  if (vesting < 0n || principal <= 0n || epochSeconds <= 0n) return void 0;
46857
- const perYear = Number(SECONDS_PER_YEAR2) / Number(epochSeconds);
48518
+ const perYear = Number(SECONDS_PER_YEAR3) / Number(epochSeconds);
46858
48519
  return Number(vesting) / Number(principal) * perYear * 100;
46859
48520
  }
46860
48521
  var eusxEpochRatePercent = (pool, vesting) => epochRatePercent(
@@ -46911,12 +48572,12 @@ function strategyMode(s, oraclePriceUsd, priceDecimals = 6) {
46911
48572
 
46912
48573
  // src/vaults/solstice/fetchPublic.ts
46913
48574
  init_types();
46914
- var import_svm_kit12 = require("@1delta/svm-kit");
48575
+ var import_svm_kit14 = require("@1delta/svm-kit");
46915
48576
  var SCALE = 10 ** SOLSTICE_DECIMALS;
46916
48577
  var fmt3 = (raw2) => Number(raw2) / SCALE;
46917
48578
  var BATCH_STATUS = ["active", "cancelled", "settled"];
46918
48579
  async function fetchSolsticeSettlementBatches(rpc, strategyName, juniorQueueTimeSeconds, programId = SOLSTICE_PROGRAMS.yieldStrategy) {
46919
- const fetchers = (0, import_svm_kit12.createSvmFetchers)(rpc);
48580
+ const fetchers = (0, import_svm_kit14.createSvmFetchers)(rpc);
46920
48581
  const rows = await fetchers.indexed.scanProgram(
46921
48582
  programId,
46922
48583
  [
@@ -46934,7 +48595,7 @@ async function fetchSolsticeSettlementBatches(rpc, strategyName, juniorQueueTime
46934
48595
  );
46935
48596
  const out = [];
46936
48597
  for (const r of rows) {
46937
- const b = decodeSettlementBatch((0, import_svm_kit12.fromBase64)(r.account.data[0]));
48598
+ const b = decodeSettlementBatch((0, import_svm_kit14.fromBase64)(r.account.data[0]));
46938
48599
  if (strategyNameOf(b.strategy_name) !== strategyName) continue;
46939
48600
  const settlementTime = Number(b.settlement_time);
46940
48601
  out.push({
@@ -47200,7 +48861,7 @@ function buildSolsticeVaults(state, ctx) {
47200
48861
  return out;
47201
48862
  }
47202
48863
  async function fetchSolsticeVaults(opts = {}) {
47203
- const rpc = opts.rpc ?? (0, import_svm_kit12.createSvmRpc)();
48864
+ const rpc = opts.rpc ?? (0, import_svm_kit14.createSvmRpc)();
47204
48865
  const nowSecs = opts.nowSecs ?? Math.floor(Date.now() / 1e3);
47205
48866
  const tokenList = opts.tokenList ?? {};
47206
48867
  const state = await readSolsticeChainState(rpc, {
@@ -47239,15 +48900,15 @@ async function fetchSolsticeVaults(opts = {}) {
47239
48900
 
47240
48901
  // src/vaults/solstice/fetchUser.ts
47241
48902
  init_types();
47242
- var import_svm_kit13 = require("@1delta/svm-kit");
48903
+ var import_svm_kit15 = require("@1delta/svm-kit");
47243
48904
  async function fetchSolsticeUser(account, opts = {}) {
47244
- const rpc = opts.rpc ?? (0, import_svm_kit13.createSvmRpc)();
48905
+ const rpc = opts.rpc ?? (0, import_svm_kit15.createSvmRpc)();
47245
48906
  const vaults = opts.vaults ?? await fetchSolsticeVaults({ ...opts, rpc });
47246
48907
  const rows = Object.values(vaults);
47247
48908
  const nowSecs = opts.nowSecs ?? Math.floor(Date.now() / 1e3);
47248
48909
  const atas = await Promise.all(
47249
48910
  rows.map(
47250
- (r) => (0, import_svm_kit13.getAssociatedTokenAddress)(account, r.address, import_svm_kit13.TOKEN_PROGRAM)
48911
+ (r) => (0, import_svm_kit15.getAssociatedTokenAddress)(account, r.address, import_svm_kit15.TOKEN_PROGRAM)
47251
48912
  )
47252
48913
  );
47253
48914
  const eusx = rows.find((r) => r.kind === "yield-vault");
@@ -47277,10 +48938,10 @@ async function fetchSolsticeUser(account, opts = {}) {
47277
48938
  const { slot, accounts } = await rpc.readAccounts(keys);
47278
48939
  let i = 0;
47279
48940
  const next = () => accounts[i++] ?? null;
47280
- const bytes = (a) => a ? (0, import_svm_kit13.fromBase64)(a.data[0]) : void 0;
48941
+ const bytes2 = (a) => a ? (0, import_svm_kit15.fromBase64)(a.data[0]) : void 0;
47281
48942
  const holdings = [];
47282
48943
  rows.forEach((r, k) => {
47283
- const d2 = bytes(next());
48944
+ const d2 = bytes2(next());
47284
48945
  if (!d2) return;
47285
48946
  const shares = tokenAmount(d2);
47286
48947
  if (shares === 0n) return;
@@ -47302,7 +48963,7 @@ async function fetchSolsticeUser(account, opts = {}) {
47302
48963
  const pending = [];
47303
48964
  const usd = (raw2, r) => Number(raw2) / 10 ** r.assetDecimals * (r.priceUsd ?? 0);
47304
48965
  if (eusx && escrow) {
47305
- const d2 = bytes(next());
48966
+ const d2 = bytes2(next());
47306
48967
  if (d2) {
47307
48968
  const e = decodeCooldownEscrow(d2);
47308
48969
  if (e.asset_amount > 0n)
@@ -47320,7 +48981,7 @@ async function fetchSolsticeUser(account, opts = {}) {
47320
48981
  }
47321
48982
  }
47322
48983
  seniors.forEach((r, k) => {
47323
- const d2 = bytes(next());
48984
+ const d2 = bytes2(next());
47324
48985
  if (!d2) return;
47325
48986
  const c = decodeSeniorUnlockCooldown(d2);
47326
48987
  if (c.assets_pending === 0n) return;
@@ -47340,7 +49001,7 @@ async function fetchSolsticeUser(account, opts = {}) {
47340
49001
  });
47341
49002
  });
47342
49003
  for (const j of juniorRecords) {
47343
- const d2 = bytes(next());
49004
+ const d2 = bytes2(next());
47344
49005
  if (!d2) continue;
47345
49006
  const u = decodeJuniorUnlockShare(d2);
47346
49007
  if (u.shares === 0n) continue;
@@ -63440,7 +65101,7 @@ var HUMA_SEEDS = {
63440
65101
  };
63441
65102
 
63442
65103
  // src/vaults/huma/accounts.ts
63443
- var import_svm_kit14 = require("@1delta/svm-kit");
65104
+ var import_svm_kit16 = require("@1delta/svm-kit");
63444
65105
  var HUMA_POOL = {
63445
65106
  poolConfig: "28hFhD21Nka3stL27a8zZ4nRLgaDVxRYwJgeEVgeakzS",
63446
65107
  poolId: "sFp7QFGknaW37xRFfdRwbC4QhM1n7Y9sJkYL4vnqXRn",
@@ -63453,21 +65114,21 @@ var HUMA_POOL = {
63453
65114
  var HUMA_MPST_MINT = "HUPfpnsaJtJGpJxAPNX1vXah7BgYiQYt1c2JMgMumvPs";
63454
65115
  var HUMA_CLASSIC_MODE_ID = "Fr2BGzmFkufAUXNWSWk79juyWrHVCj8AbyzbbvZzhwgz";
63455
65116
  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);
65117
+ var utf86 = (s) => new TextEncoder().encode(s);
65118
+ var pk6 = (address) => {
65119
+ const b = (0, import_svm_kit16.decodeBase58)(address);
63459
65120
  if (!b || b.length !== 32) throw new Error(`huma: bad pubkey ${address}`);
63460
65121
  return b;
63461
65122
  };
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)]);
65123
+ var pda2 = (seeds) => (0, import_svm_kit16.findProgramAddress)(seeds, HUMA_PROGRAM).then((r) => r.address);
65124
+ var humaPoolConfigPda = () => pda2([utf86("pool_config"), pk6(HUMA_POOL.poolId)]);
65125
+ var humaPoolStatePda = () => pda2([utf86("pool_state"), pk6(HUMA_POOL.poolConfig)]);
65126
+ var humaPoolAuthorityPda = () => pda2([utf86("pool_authority"), pk6(HUMA_POOL.poolConfig)]);
65127
+ var humaModeConfigPda = (modeId) => pda2([utf86("mode_config"), pk6(HUMA_POOL.poolConfig), pk6(modeId)]);
65128
+ var humaModeMintPda = (modeConfig) => pda2([utf86("mode_mint"), pk6(HUMA_POOL.poolConfig), pk6(modeConfig)]);
65129
+ var humaLenderStatePda = (modeConfig, lender) => pda2([utf86("lender_state"), pk6(modeConfig), pk6(lender)]);
65130
+ var humaDeploymentStatePda = (deploymentConfig) => pda2([utf86("deployment_state"), pk6(deploymentConfig)]);
65131
+ var humaRedemptionRequestPda = (id, poolConfig) => pda2([utf86("redemption_request"), u128be(id), pk6(poolConfig)]);
63471
65132
  var u128be = (v) => {
63472
65133
  if (v < 0n || v >= 1n << 128n) throw new Error(`huma: id out of u128: ${v}`);
63473
65134
  const out = new Uint8Array(16);
@@ -63475,11 +65136,11 @@ var u128be = (v) => {
63475
65136
  out[15 - i] = Number(v >> BigInt(8 * i) & 0xffn);
63476
65137
  return out;
63477
65138
  };
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);
65139
+ var decodeHumaPoolState = (d2) => (0, import_svm_kit16.decodeIdlAccount)(HUMA_IDL, "PoolState", d2);
65140
+ var decodeHumaModeConfig = (d2) => (0, import_svm_kit16.decodeIdlAccount)(HUMA_IDL, "ModeConfig", d2);
65141
+ var decodeHumaPoolConfig = (d2) => (0, import_svm_kit16.decodeIdlAccount)(HUMA_IDL, "PoolConfig", d2);
65142
+ var decodeHumaLenderState = (d2) => (0, import_svm_kit16.decodeIdlAccount)(HUMA_IDL, "LenderState", d2);
65143
+ var decodeHumaRedemptionRequest = (d2) => (0, import_svm_kit16.decodeIdlAccount)(HUMA_IDL, "RedemptionRequest", d2);
63483
65144
  function mintSupply2(data) {
63484
65145
  if (data.length < 44) throw new Error("huma: mint account too short");
63485
65146
  return data.slice(36, 44).reduce((a, b, i) => a | BigInt(b) << BigInt(8 * i), 0n);
@@ -63493,23 +65154,23 @@ var need2 = (a, what) => {
63493
65154
  return a;
63494
65155
  };
63495
65156
  async function readHumaChainState(rpc, pool = HUMA_POOL) {
63496
- const poolUnderlyingToken = await (0, import_svm_kit14.getAssociatedTokenAddress)(
65157
+ const poolUnderlyingToken = await (0, import_svm_kit16.getAssociatedTokenAddress)(
63497
65158
  await humaPoolAuthorityPda(),
63498
65159
  pool.underlyingMint,
63499
- import_svm_kit14.TOKEN_PROGRAM
65160
+ import_svm_kit16.TOKEN_PROGRAM
63500
65161
  );
63501
65162
  const { slot, accounts: first } = await rpc.readAccounts(
63502
65163
  [pool.poolState, pool.poolConfig, poolUnderlyingToken],
63503
65164
  { encoding: "base64" }
63504
65165
  );
63505
65166
  const state = decodeHumaPoolState(
63506
- (0, import_svm_kit14.fromBase64)(need2(first[0], "pool_state").data[0])
65167
+ (0, import_svm_kit16.fromBase64)(need2(first[0], "pool_state").data[0])
63507
65168
  );
63508
65169
  const config = decodeHumaPoolConfig(
63509
- (0, import_svm_kit14.fromBase64)(need2(first[1], "pool_config").data[0])
65170
+ (0, import_svm_kit16.fromBase64)(need2(first[1], "pool_config").data[0])
63510
65171
  );
63511
65172
  const poolCash = tokenAmount2(
63512
- first[2] ? (0, import_svm_kit14.fromBase64)(first[2].data[0]) : void 0
65173
+ first[2] ? (0, import_svm_kit16.fromBase64)(first[2].data[0]) : void 0
63513
65174
  );
63514
65175
  const modeMints = await Promise.all(
63515
65176
  state.mode_config_keys.map((k) => humaModeMintPda(k))
@@ -63524,9 +65185,9 @@ async function readHumaChainState(rpc, pool = HUMA_POOL) {
63524
65185
  { encoding: "base64" }
63525
65186
  );
63526
65187
  const modeConfig = decodeHumaModeConfig(
63527
- (0, import_svm_kit14.fromBase64)(need2(modeAcct, "mode_config").data[0])
65188
+ (0, import_svm_kit16.fromBase64)(need2(modeAcct, "mode_config").data[0])
63528
65189
  );
63529
- const mintData = (0, import_svm_kit14.fromBase64)(need2(mintAcct, "pst_mint").data[0]);
65190
+ const mintData = (0, import_svm_kit16.fromBase64)(need2(mintAcct, "pst_mint").data[0]);
63530
65191
  const next = state.redemption.next_request_id;
63531
65192
  const last = state.redemption.last_request_id;
63532
65193
  const gate = state.redemption.global_redemption_gating;
@@ -63583,7 +65244,7 @@ async function readHumaLenderState(rpc, modeConfig, wallet) {
63583
65244
  const a = accounts[0];
63584
65245
  return {
63585
65246
  address,
63586
- state: a ? decodeHumaLenderState((0, import_svm_kit14.fromBase64)(a.data[0])) : null
65247
+ state: a ? decodeHumaLenderState((0, import_svm_kit16.fromBase64)(a.data[0])) : null
63587
65248
  };
63588
65249
  }
63589
65250
  var HUMA_REDEMPTION_REQUEST_SIZE = 273;
@@ -63599,12 +65260,12 @@ async function readHumaRedemptionRequests(fetchers, wallet) {
63599
65260
  );
63600
65261
  return rows.map((r) => ({
63601
65262
  address: r.pubkey,
63602
- ...decodeHumaRedemptionRequest((0, import_svm_kit14.fromBase64)(r.account.data[0]))
65263
+ ...decodeHumaRedemptionRequest((0, import_svm_kit16.fromBase64)(r.account.data[0]))
63603
65264
  })).sort((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
63604
65265
  }
63605
65266
 
63606
65267
  // src/vaults/huma/fetchPublic.ts
63607
- var import_svm_kit15 = require("@1delta/svm-kit");
65268
+ var import_svm_kit17 = require("@1delta/svm-kit");
63608
65269
  var SCALE2 = 10 ** HUMA_DECIMALS;
63609
65270
  var fmt4 = (raw2) => Number(raw2) / SCALE2;
63610
65271
  var HUMA_REDEMPTION_SLA_SECONDS = 7 * 86400;
@@ -63689,7 +65350,7 @@ function convertHumaPst(s, ctx) {
63689
65350
  }
63690
65351
  async function fetchHumaPstVaults(rpcOrOpts = {}) {
63691
65352
  const opts = "readAccounts" in rpcOrOpts ? { rpc: rpcOrOpts } : rpcOrOpts;
63692
- const rpc = opts.rpc ?? (0, import_svm_kit15.createSvmRpc)();
65353
+ const rpc = opts.rpc ?? (0, import_svm_kit17.createSvmRpc)();
63693
65354
  const s = await readHumaChainState(rpc);
63694
65355
  let priceUsd = opts.priceUsd;
63695
65356
  if (priceUsd === void 0 && opts.fetchPrices !== false) {
@@ -63720,16 +65381,16 @@ var nowSec = () => Math.floor(Date.now() / 1e3);
63720
65381
  function convertLoopscaleVault(v, opts = {}) {
63721
65382
  const s = v.vaultStrategy.strategy;
63722
65383
  const listed3 = opts.tokenList?.[s.principalMint];
63723
- const dec = opts.decimals ?? listed3?.decimals;
63724
- if (dec === void 0) return void 0;
65384
+ const dec2 = opts.decimals ?? listed3?.decimals;
65385
+ if (dec2 === void 0) return void 0;
63725
65386
  const tvlRaw = strategyTvlRaw(s);
63726
- const tvl = tvlRaw / 10 ** dec;
65387
+ const tvl = tvlRaw / 10 ** dec2;
63727
65388
  const extAmount = Number(s.externalYieldAmount);
63728
65389
  const deployed = Number(s.currentDeployedAmount);
63729
65390
  const idle = Number(s.tokenBalance);
63730
65391
  const ext = v.vaultStrategy.externalYieldInfo;
63731
65392
  const extApr = ext ? cbpsToFraction(ext.apy) : 0;
63732
- const grossAnnual = Number(s.interestPerSecond) * SECONDS_PER_YEAR + extApr * extAmount;
65393
+ const grossAnnual = Number(s.interestPerSecond) * SECONDS_PER_YEAR2 + extApr * extAmount;
63733
65394
  const gross = tvlRaw > 0 ? grossAnnual / tvlRaw * 100 : 0;
63734
65395
  const feeFrac = cbpsToFraction(s.interestFee);
63735
65396
  const supplyRate = gross * (1 - feeFrac);
@@ -63746,7 +65407,7 @@ function convertLoopscaleVault(v, opts = {}) {
63746
65407
  const rDec = mint ? opts.tokenList?.[mint]?.decimals : void 0;
63747
65408
  if (!p || rDec === void 0 || !priceUsd || tvl <= 0) continue;
63748
65409
  const perSec = Number(r.emissionsPerSecond ?? 0) / 10 ** rDec;
63749
- rewardsRate += perSec * SECONDS_PER_YEAR * p / (tvl * priceUsd) * 100;
65410
+ rewardsRate += perSec * SECONDS_PER_YEAR2 * p / (tvl * priceUsd) * 100;
63750
65411
  }
63751
65412
  const lp = Number(v.vault.lpSupply);
63752
65413
  const earlyFee = Number(v.vault.maxEarlyUnstakeFee);
@@ -63766,13 +65427,15 @@ function convertLoopscaleVault(v, opts = {}) {
63766
65427
  name: meta?.name ?? v.vault.address,
63767
65428
  displayName: meta?.name ? `Loopscale ${meta.name}` : `Loopscale ${sym}`,
63768
65429
  curatorName: meta?.managerName ?? "Loopscale",
63769
- decimals: dec,
63770
- assetDecimals: dec,
65430
+ manager: v.vault.manager,
65431
+ managerImage: meta?.managerImage ?? void 0,
65432
+ decimals: dec2,
65433
+ assetDecimals: dec2,
63771
65434
  totalAssets: String(tvlRaw),
63772
65435
  totalSupply: String(lp),
63773
- convertToAssets: String(Math.round(sharePrice * 10 ** dec)),
65436
+ convertToAssets: String(Math.round(sharePrice * 10 ** dec2)),
63774
65437
  convertToShares: String(
63775
- sharePrice > 0 ? Math.round(1 / sharePrice * 10 ** dec) : 0
65438
+ sharePrice > 0 ? Math.round(1 / sharePrice * 10 ** dec2) : 0
63776
65439
  ),
63777
65440
  grossRate: gross,
63778
65441
  supplyRate,
@@ -63784,8 +65447,8 @@ function convertLoopscaleVault(v, opts = {}) {
63784
65447
  totalAssetsFormatted: tvl,
63785
65448
  totalAssetsUsd: sum?.totalSupplyUsd ?? tvl * (priceUsd ?? 0),
63786
65449
  liquidity: String(idle),
63787
- liquidityFormatted: idle / 10 ** dec,
63788
- liquidityUsd: idle / 10 ** dec * (priceUsd ?? 0),
65450
+ liquidityFormatted: idle / 10 ** dec2,
65451
+ liquidityUsd: idle / 10 ** dec2 * (priceUsd ?? 0),
63789
65452
  sharePrice,
63790
65453
  sharePriceUsd: sharePrice * (priceUsd ?? 0),
63791
65454
  yieldProfile: "yield-bearing",
@@ -63853,9 +65516,162 @@ async function fetchLoopscaleEarnVaults(opts = {}) {
63853
65516
  return out;
63854
65517
  }
63855
65518
 
65519
+ // src/vaults/kamino-kvault/api.ts
65520
+ var KVAULT_PROGRAM_ID = "KvauGMspG5k6rtzrqqn7WNn3oZdyKqLKwK2XWQ8FLjd";
65521
+ function createKaminoKvaultApi(opts = {}) {
65522
+ const base = (opts.baseUrl ?? KAMINO_API_BASE).replace(/\/$/, "");
65523
+ const limit = createLimiter(opts.maxInFlight ?? 4);
65524
+ const get = (path) => limit(() => getJson(`${base}${path}`, opts));
65525
+ return {
65526
+ vaults: () => get("/kvaults/vaults"),
65527
+ /** Every page of the batch metrics. A page that fails fails the call — a partial metrics set would read as vaults with no APY. */
65528
+ metrics: async () => {
65529
+ const out = [];
65530
+ let token;
65531
+ const maxPages = opts.maxPages ?? 20;
65532
+ for (let page = 0; page < maxPages; page++) {
65533
+ const res = await get(
65534
+ `/kvaults/vaults/metrics${token ? `?paginationToken=${encodeURIComponent(token)}` : ""}`
65535
+ );
65536
+ out.push(...res.result ?? []);
65537
+ token = res.paginationToken ?? void 0;
65538
+ if (!token || !res.result?.length) return out;
65539
+ }
65540
+ throw new Error(
65541
+ `kvault metrics: still paging after ${maxPages} pages (${out.length} rows)`
65542
+ );
65543
+ },
65544
+ vaultMetrics: (vault) => get(`/kvaults/vaults/${vault}/metrics`)
65545
+ };
65546
+ }
65547
+
65548
+ // src/vaults/kamino-kvault/fetchPublic.ts
65549
+ init_types();
65550
+ function decimalStringToRaw(s, decimals) {
65551
+ if (s === void 0 || s === null) return void 0;
65552
+ const t = String(s).trim();
65553
+ const m = /^(-?)(\d*)(?:\.(\d*))?$/.exec(t);
65554
+ if (!m || !m[2] && !m[3]) return void 0;
65555
+ const frac = (m[3] ?? "").slice(0, decimals).padEnd(decimals, "0");
65556
+ const v = BigInt((m[2] || "0") + frac);
65557
+ return m[1] ? -v : v;
65558
+ }
65559
+ function convertKaminoKvault(v, m, opts = {}) {
65560
+ if (!m) return void 0;
65561
+ const s = v.state;
65562
+ const dec2 = s.tokenMintDecimals;
65563
+ const shareDec = s.sharesMintDecimals;
65564
+ const listed3 = opts.tokenList?.[s.tokenMint];
65565
+ const listedShare = opts.tokenList?.[s.sharesMint];
65566
+ const sym = listed3?.symbol ?? s.tokenMint.slice(0, 4);
65567
+ const perShare = num(m.tokensPerShare, 1);
65568
+ const shares = BigInt(s.sharesIssued || "0");
65569
+ const perShareRaw = decimalStringToRaw(m.tokensPerShare, dec2) ?? 10n ** BigInt(dec2);
65570
+ const totalAssetsRaw = shares * perShareRaw / 10n ** BigInt(shareDec);
65571
+ const totalAssetsFormatted = Number(totalAssetsRaw) / 10 ** dec2;
65572
+ const idleRaw = BigInt(s.tokenAvailable || "0");
65573
+ const idle = Number(idleRaw) / 10 ** dec2;
65574
+ const price = num(m.tokenPrice);
65575
+ const priced = price > 0;
65576
+ const apy = {
65577
+ current: num(m.apy),
65578
+ actual: num(m.apyActual),
65579
+ d1: num(m.apy24h),
65580
+ d7: num(m.apy7d),
65581
+ d30: num(m.apy30d),
65582
+ d90: num(m.apy90d),
65583
+ farmRewards: num(m.apyFarmRewards),
65584
+ incentives: num(m.apyIncentives),
65585
+ reservesIncentives: num(m.apyReservesIncentives)
65586
+ };
65587
+ const supplyRate = apyFractionToAprPercent(apy.current);
65588
+ const rewardsRate = apyFractionToAprPercent(apy.farmRewards + apy.incentives);
65589
+ const name = s.name?.trim() || listedShare?.name || `Kamino Vault ${sym}`;
65590
+ return {
65591
+ provider: "kamino-kvault",
65592
+ originProvider: "kamino-kvault",
65593
+ chainId: SOLANA_CHAIN_ID,
65594
+ address: v.address,
65595
+ shareMint: s.sharesMint,
65596
+ underlying: s.tokenMint,
65597
+ symbol: listedShare?.symbol ?? `kv${sym}`,
65598
+ name,
65599
+ displayName: name.toLowerCase().includes("kamino") ? name : `Kamino ${name}`,
65600
+ curatorName: s.vaultAdminAuthority,
65601
+ manager: s.vaultAdminAuthority,
65602
+ allocationAdmin: s.allocationAdmin,
65603
+ decimals: shareDec,
65604
+ assetDecimals: dec2,
65605
+ totalAssets: totalAssetsRaw.toString(),
65606
+ totalSupply: shares.toString(),
65607
+ convertToAssets: perShareRaw.toString(),
65608
+ convertToShares: perShare > 0 ? String(Math.round(1 / perShare * 10 ** shareDec)) : "0",
65609
+ supplyRate,
65610
+ rewardsRate,
65611
+ depositRate: supplyRate + rewardsRate,
65612
+ asset: listed3,
65613
+ priceUsd: priced ? price : void 0,
65614
+ totalAssetsFormatted,
65615
+ totalAssetsUsd: priced ? totalAssetsFormatted * price : 0,
65616
+ liquidity: idleRaw.toString(),
65617
+ liquidityFormatted: idle,
65618
+ liquidityUsd: priced ? idle * price : 0,
65619
+ sharePrice: perShare,
65620
+ sharePriceUsd: priced ? num(m.sharePrice, perShare * price) : 0,
65621
+ yieldProfile: "yield-bearing",
65622
+ denomination: denominationOf({
65623
+ symbol: listed3?.symbol,
65624
+ props: listed3?.props
65625
+ }),
65626
+ logoURI: listedShare?.logoURI ?? listed3?.logoURI,
65627
+ fee: s.performanceFeeBps / 100,
65628
+ managementFeePct: s.managementFeeBps / 100,
65629
+ withdrawalMode: "instant-capped",
65630
+ instantLiquidityRatio: totalAssetsRaw > 0n ? Math.min(1, Number(idleRaw * 1000000n / totalAssetsRaw) / 1e6) : 1,
65631
+ apy,
65632
+ holders: m.numberOfHolders ?? 0,
65633
+ vaultFarm: s.vaultFarm && s.vaultFarm !== "11111111111111111111111111111111" ? s.vaultFarm : void 0,
65634
+ allocations: (s.vaultAllocationStrategy ?? []).filter((a) => a.reserve !== "11111111111111111111111111111111").map((a) => ({
65635
+ reserve: a.reserve,
65636
+ weight: a.targetAllocationWeight,
65637
+ ctokenAllocation: a.ctokenAllocation
65638
+ })),
65639
+ createdAt: s.creationTimestamp,
65640
+ minDepositAmount: s.minDepositAmount
65641
+ };
65642
+ }
65643
+ async function fetchKaminoKvaults(opts = {}) {
65644
+ const api = createKaminoKvaultApi(opts);
65645
+ const [vaults, metrics] = await Promise.all([
65646
+ opts.vaults ?? api.vaults(),
65647
+ opts.metrics ?? api.metrics()
65648
+ ]);
65649
+ const byVault = /* @__PURE__ */ new Map();
65650
+ for (const m of metrics) if (m.kvault) byVault.set(m.kvault, m);
65651
+ const out = [];
65652
+ const skipped = [];
65653
+ for (const v of vaults) {
65654
+ if (!opts.includeEmpty && BigInt(v.state.sharesIssued || "0") === 0n)
65655
+ continue;
65656
+ const row = convertKaminoKvault(v, byVault.get(v.address), {
65657
+ tokenList: opts.tokenList
65658
+ });
65659
+ if (!row) {
65660
+ skipped.push(v.address);
65661
+ continue;
65662
+ }
65663
+ out.push(row);
65664
+ }
65665
+ if (skipped.length)
65666
+ console.warn(
65667
+ `[kamino-kvault] ${skipped.length} vault(s) skipped \u2014 no metrics row: ${skipped.join(", ")}`
65668
+ );
65669
+ return out;
65670
+ }
65671
+
63856
65672
  // src/vaults/lst/fetchPublic.ts
63857
65673
  init_types();
63858
- var import_svm_kit16 = require("@1delta/svm-kit");
65674
+ var import_svm_kit18 = require("@1delta/svm-kit");
63859
65675
  var LAMPORTS_PER_SOL = 10 ** 9;
63860
65676
  var TOKEN_SCALE = 10 ** 9;
63861
65677
  var SPL_STAKE_POOL_LSTS = [
@@ -63872,7 +65688,7 @@ var SPL_STAKE_POOL_LSTS = [
63872
65688
  curatorName: "SolBlaze"
63873
65689
  }
63874
65690
  ];
63875
- var SECONDS_PER_YEAR3 = 365.25 * 86400;
65691
+ var SECONDS_PER_YEAR4 = 365.25 * 86400;
63876
65692
  function epochRealizedApr(pool, epochSeconds) {
63877
65693
  if (pool.lastEpochTotalLamports === void 0 || !pool.lastEpochPoolTokenSupply || pool.poolTokenSupply === 0n || epochSeconds <= 0)
63878
65694
  return void 0;
@@ -63882,7 +65698,7 @@ function epochRealizedApr(pool, epochSeconds) {
63882
65698
  const epochRate = now / last - 1;
63883
65699
  return {
63884
65700
  epochRatePercent: epochRate * 100,
63885
- aprPercent: epochRate * (SECONDS_PER_YEAR3 / epochSeconds) * 100,
65701
+ aprPercent: epochRate * (SECONDS_PER_YEAR4 / epochSeconds) * 100,
63886
65702
  lastEpochExchangeRate: last
63887
65703
  };
63888
65704
  }
@@ -63918,7 +65734,7 @@ function convertLst(entry, pool, ctx, stakePoolAddress, programId, slot) {
63918
65734
  provider: "lst",
63919
65735
  chainId: SOLANA_CHAIN_ID,
63920
65736
  address: pool.poolMint,
63921
- underlying: import_svm_kit16.WRAPPED_SOL,
65737
+ underlying: import_svm_kit18.WRAPPED_SOL,
63922
65738
  symbol: share.symbol ?? entry.symbol,
63923
65739
  name: share.name ?? entry.name,
63924
65740
  displayName: `${entry.curatorName} ${entry.symbol}`,
@@ -63982,7 +65798,7 @@ function convertLst(entry, pool, ctx, stakePoolAddress, programId, slot) {
63982
65798
  };
63983
65799
  }
63984
65800
  async function fetchLstVaults(opts = {}) {
63985
- const rpc = opts.rpc ?? (0, import_svm_kit16.createSvmRpc)();
65801
+ const rpc = opts.rpc ?? (0, import_svm_kit18.createSvmRpc)();
63986
65802
  const entries = opts.entries ?? SPL_STAKE_POOL_LSTS;
63987
65803
  const tokenList = opts.tokenList ?? {};
63988
65804
  const { slot, pools } = await readStakePools(
@@ -63992,10 +65808,10 @@ async function fetchLstVaults(opts = {}) {
63992
65808
  let solPriceUsd = opts.solPriceUsd;
63993
65809
  if (solPriceUsd === void 0 && opts.fetchPrices !== false) {
63994
65810
  solPriceUsd = await fetchJupiterPrices(
63995
- [import_svm_kit16.WRAPPED_SOL],
65811
+ [import_svm_kit18.WRAPPED_SOL],
63996
65812
  tokenList,
63997
65813
  opts.priceApi
63998
- ).then((p) => p.byMint[import_svm_kit16.WRAPPED_SOL]).catch(() => void 0);
65814
+ ).then((p) => p.byMint[import_svm_kit18.WRAPPED_SOL]).catch(() => void 0);
63999
65815
  }
64000
65816
  const found = pools.filter((p) => !!p);
64001
65817
  const [epoch, reserves] = await Promise.all([
@@ -64169,6 +65985,9 @@ function loopscaleOriginRow(r) {
64169
65985
  meta: {
64170
65986
  vaultAccount: r.vaultAccount,
64171
65987
  strategy: r.strategy,
65988
+ manager: r.manager,
65989
+ managerName: r.curatorName,
65990
+ managerImage: r.managerImage,
64172
65991
  grossRate: r.grossRate,
64173
65992
  venueApy: r.venueApy,
64174
65993
  interestFee: r.fees.interest,
@@ -64193,6 +66012,42 @@ function loopscaleOriginRow(r) {
64193
66012
  }
64194
66013
  };
64195
66014
  }
66015
+ function kaminoKvaultOriginRow(r) {
66016
+ return {
66017
+ ...common4626(r, "kamino-kvault", "sync"),
66018
+ // kvaults publish no curator NAME: `r.curatorName` is the admin address,
66019
+ // and a brand column holding a base58 key would read as the desk's name on
66020
+ // /earn. The address travels as `meta.manager`; a label layer keyed by it
66021
+ // (lender-metadata curator-labels.json → curator_metadata) names it.
66022
+ curatorName: void 0,
66023
+ provider: "kamino-kvault",
66024
+ fee: r.fee,
66025
+ shareAsset: {
66026
+ chainId: r.chainId,
66027
+ address: r.shareMint,
66028
+ symbol: r.symbol,
66029
+ name: r.name,
66030
+ decimals: r.decimals
66031
+ },
66032
+ metaTable: "vault_kamino_kvault_meta",
66033
+ meta: {
66034
+ shareMint: r.shareMint,
66035
+ manager: r.manager,
66036
+ allocationAdmin: r.allocationAdmin,
66037
+ managementFeePct: r.managementFeePct,
66038
+ convertToAssets: r.convertToAssets,
66039
+ convertToShares: r.convertToShares,
66040
+ withdrawalMode: r.withdrawalMode,
66041
+ instantLiquidityRatio: r.instantLiquidityRatio,
66042
+ apy: r.apy,
66043
+ holders: r.holders,
66044
+ vaultFarm: r.vaultFarm,
66045
+ allocations: r.allocations,
66046
+ createdAt: r.createdAt,
66047
+ minDepositAmount: r.minDepositAmount
66048
+ }
66049
+ };
66050
+ }
64196
66051
  function exponentOriginRow(r) {
64197
66052
  return {
64198
66053
  provider: "exponent",
@@ -64240,6 +66095,8 @@ function toOriginVaultRow(r) {
64240
66095
  return jupiterLendOriginRow(r);
64241
66096
  case "loopscale":
64242
66097
  return loopscaleOriginRow(r);
66098
+ case "kamino-kvault":
66099
+ return kaminoKvaultOriginRow(r);
64243
66100
  }
64244
66101
  }
64245
66102
 
@@ -64411,21 +66268,66 @@ async function fetchJupiterLendOracleEntries(opts = {}) {
64411
66268
  }
64412
66269
 
64413
66270
  // src/prices/oracle-prices/fetchers/save.ts
66271
+ var import_svm_kit19 = require("@1delta/svm-kit");
64414
66272
  async function fetchSaveOracleEntries(opts = {}) {
64415
66273
  const res = opts.publicData ?? await fetchSavePublic(opts);
66274
+ const feeds = /* @__PURE__ */ new Set();
66275
+ for (const bundle of Object.values(res))
66276
+ for (const row of Object.values(bundle.data)) {
66277
+ if (row.save.pythOracle) feeds.add(row.save.pythOracle);
66278
+ if (row.save.switchboardOracle) feeds.add(row.save.switchboardOracle);
66279
+ }
66280
+ const readings = /* @__PURE__ */ new Map();
66281
+ if (opts.live !== false && feeds.size) {
66282
+ try {
66283
+ const rpc = opts.rpc ?? (0, import_svm_kit19.createSvmRpc)();
66284
+ const keys = [...feeds];
66285
+ const { accounts } = await rpc.readAccounts(keys, { encoding: "base64" });
66286
+ accounts.forEach((a, i) => {
66287
+ if (!a) return;
66288
+ try {
66289
+ const r = decodeOracleFeed({ owner: a.owner, data: a.data[0] });
66290
+ if (r && Number.isFinite(r.price) && r.price > 0)
66291
+ readings.set(keys[i], r);
66292
+ } catch (e) {
66293
+ console.warn(`[save] feed ${keys[i]}: ${e.message}`);
66294
+ }
66295
+ });
66296
+ } catch (e) {
66297
+ console.warn(
66298
+ `[save] live feeds not read, serving stored reserve prices: ${e.message}`
66299
+ );
66300
+ }
66301
+ }
64416
66302
  const out = {};
64417
66303
  for (const [lender, bundle] of Object.entries(res)) {
64418
66304
  out[lender] = Object.entries(bundle.data).map(([marketUid, row]) => {
64419
66305
  const s = row.save;
66306
+ const bps = s.scaledPriceOffsetBps;
66307
+ const dial = bps !== 0 ? ` \xD7 (1 + ${bps} bps dial)` : "";
66308
+ 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);
66309
+ const pick = candidates[0];
66310
+ if (pick) {
66311
+ const price = pick.r.price * (1 + bps / 1e4);
66312
+ return {
66313
+ asset: row.underlying,
66314
+ price,
66315
+ priceUSD: price,
66316
+ marketUid,
66317
+ description: `Save reserve oracle \xB7 ${pick.r.kind}${dial} (live feed read)`,
66318
+ derivation: dial ? "derived" : "direct",
66319
+ feedSource: pick.feed,
66320
+ feedUpdatedAt: pick.r.updatedAt > 0 ? pick.r.updatedAt : void 0
66321
+ };
66322
+ }
64420
66323
  const feed = s.pythOracle ?? s.switchboardOracle ?? s.extraOracle;
64421
66324
  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
66325
  return {
64424
66326
  asset: row.underlying,
64425
66327
  price: s.priceUsd,
64426
66328
  priceUSD: s.priceUsd,
64427
66329
  marketUid,
64428
- description: `Save reserve price \xB7 ${kind}${dial} \xB7 slot ${s.lastUpdateSlot}${s.stale ? " (stale)" : ""}`,
66330
+ description: `Save reserve price (stored) \xB7 ${kind}${dial} \xB7 slot ${s.lastUpdateSlot}${s.stale ? " (stale)" : ""}`,
64429
66331
  derivation: dial ? "derived" : "direct",
64430
66332
  feedSource: feed
64431
66333
  };
@@ -64490,16 +66392,19 @@ async function fetchProject0OracleEntries(opts = {}) {
64490
66392
  for (const [lender, bundle] of Object.entries(res)) {
64491
66393
  out[lender] = Object.entries(bundle.data).filter(([, row]) => row.p0.price.source !== "none").map(([marketUid, row]) => {
64492
66394
  const p = row.p0.price;
64493
- return {
66395
+ const fixed = p.source === "fixed";
66396
+ const entry = {
64494
66397
  asset: row.underlying,
64495
66398
  price: p.priceUsd,
64496
66399
  priceUSD: p.priceUsd,
64497
66400
  marketUid,
64498
66401
  description: `Project 0 \xB7 ${p.description ?? p.source}`,
64499
- derivation: p.source === "pyth-push" ? "direct" : p.source === "fixed" ? "direct" : "derived",
66402
+ derivation: p.source === "pyth-push" || p.source === "scope" || fixed ? "direct" : "derived",
64500
66403
  feedSource: p.feed,
64501
66404
  feedUpdatedAt: p.updatedAt
64502
66405
  };
66406
+ if (fixed) entry.staticBase = true;
66407
+ return entry;
64503
66408
  });
64504
66409
  }
64505
66410
  return out;
@@ -64510,14 +66415,15 @@ async function fetchOraclePrices(chainIds, opts = {}) {
64510
66415
  const FETCHERS = {
64511
66416
  kamino: (chainId) => chainId === SOLANA_CHAIN_ID ? fetchKaminoOracleEntries(opts.overrides, opts) : Promise.resolve({}),
64512
66417
  "jupiter-lend": (chainId) => chainId === SOLANA_CHAIN_ID ? fetchJupiterLendOracleEntries(opts) : Promise.resolve({}),
64513
- save: (chainId) => chainId === SOLANA_CHAIN_ID ? fetchSaveOracleEntries({ timeoutMs: opts.timeoutMs }) : Promise.resolve({}),
66418
+ save: (chainId) => chainId === SOLANA_CHAIN_ID ? fetchSaveOracleEntries({ timeoutMs: opts.timeoutMs, rpc: opts.rpc }) : Promise.resolve({}),
64514
66419
  loopscale: (chainId) => chainId === SOLANA_CHAIN_ID ? fetchLoopscaleOracleEntries({
64515
66420
  timeoutMs: opts.timeoutMs,
64516
66421
  tokenList: opts.tokenList
64517
66422
  }) : Promise.resolve({}),
64518
66423
  project0: (chainId) => chainId === SOLANA_CHAIN_ID ? fetchProject0OracleEntries({
64519
66424
  timeoutMs: opts.timeoutMs,
64520
- tokenList: opts.tokenList
66425
+ tokenList: opts.tokenList,
66426
+ ...opts.rpc ? { rpc: opts.rpc } : {}
64521
66427
  }) : Promise.resolve({})
64522
66428
  };
64523
66429
  const names = opts.onlyFetchers?.length ? opts.onlyFetchers : Object.keys(FETCHERS);
@@ -64805,7 +66711,7 @@ async function mintToReserve(api, market) {
64805
66711
 
64806
66712
  // src/lending/user-data/kamino/onchain.ts
64807
66713
  init_types();
64808
- var import_svm_kit17 = require("@1delta/svm-kit");
66714
+ var import_svm_kit20 = require("@1delta/svm-kit");
64809
66715
  init_lenders();
64810
66716
  var KLEND_OBLIGATION_SIZE = 3344;
64811
66717
  var KLEND_OBLIGATION_DISCRIMINATOR = [
@@ -64824,7 +66730,7 @@ var SF = 60n;
64824
66730
  var bsf = (b) => b.value.reduce((a, w, i) => a + (BigInt(w) << 64n * BigInt(i)), 0n);
64825
66731
  var sfToNumber = (x) => Number(x >> 30n) / 2 ** 30;
64826
66732
  function decodeKaminoObligation(address, data) {
64827
- const o = (0, import_svm_kit17.decodeIdlAccount)(KLEND_IDL, "Obligation", data);
66733
+ const o = (0, import_svm_kit20.decodeIdlAccount)(KLEND_IDL, "Obligation", data);
64828
66734
  return {
64829
66735
  address,
64830
66736
  owner: o.owner,
@@ -64852,7 +66758,7 @@ function decodeKaminoObligation(address, data) {
64852
66758
  };
64853
66759
  }
64854
66760
  function decodeKaminoReserveState(reserve, data) {
64855
- const r = (0, import_svm_kit17.decodeIdlAccount)(KLEND_IDL, "Reserve", data);
66761
+ const r = (0, import_svm_kit20.decodeIdlAccount)(KLEND_IDL, "Reserve", data);
64856
66762
  const l = r.liquidity;
64857
66763
  const totalSf = klendTotalSupplySf({
64858
66764
  availableAmount: BigInt(l.totalAvailableAmount),
@@ -64921,7 +66827,7 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
64921
66827
  obligation: o.address,
64922
66828
  reason: `elevation group ${o.elevationGroup} terms not read \u2014 health uses the reserves' own LT`
64923
66829
  });
64924
- const view = {
66830
+ const view2 = {
64925
66831
  address: o.address,
64926
66832
  market: o.market,
64927
66833
  lenderKey,
@@ -64952,7 +66858,7 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
64952
66858
  const units = depositUnits(d2.cTokens, s);
64953
66859
  const amount = Number(units);
64954
66860
  const uid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, d2.reserve);
64955
- view.deposits.push({
66861
+ view2.deposits.push({
64956
66862
  reserve: d2.reserve,
64957
66863
  marketUid: uid,
64958
66864
  mint: s.mint,
@@ -64960,10 +66866,10 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
64960
66866
  amount,
64961
66867
  amountUsd: amount * s.priceUsd
64962
66868
  });
64963
- view.asOfSlot = Math.min(view.asOfSlot, s.lastUpdateSlot);
64964
- view.depositedValueUsd += amount * s.priceUsd;
66869
+ view2.asOfSlot = Math.min(view2.asOfSlot, s.lastUpdateSlot);
66870
+ view2.depositedValueUsd += amount * s.priceUsd;
64965
66871
  const lt = group?.liquidationThreshold ?? s.liquidationThresholdPct;
64966
- view.unhealthyBorrowValueUsd += amount * s.priceUsd * lt / 100;
66872
+ view2.unhealthyBorrowValueUsd += amount * s.priceUsd * lt / 100;
64967
66873
  const p = leg(uid);
64968
66874
  p.deposits = units;
64969
66875
  p.depositsUSD = amount * s.priceUsd;
@@ -64986,7 +66892,7 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
64986
66892
  const units = debtUnits(debtSf, s);
64987
66893
  const amount = Number(units);
64988
66894
  const uid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, b.reserve);
64989
- view.borrows.push({
66895
+ view2.borrows.push({
64990
66896
  reserve: b.reserve,
64991
66897
  marketUid: uid,
64992
66898
  mint: s.mint,
@@ -64994,17 +66900,17 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
64994
66900
  amount,
64995
66901
  amountUsd: amount * s.priceUsd
64996
66902
  });
64997
- view.asOfSlot = Math.min(view.asOfSlot, s.lastUpdateSlot);
64998
- view.bfAdjustedDebtUsd += amount * s.priceUsd * (o.elevationGroup ? 100 : Math.max(100, s.borrowFactorPct)) / 100;
66903
+ view2.asOfSlot = Math.min(view2.asOfSlot, s.lastUpdateSlot);
66904
+ view2.bfAdjustedDebtUsd += amount * s.priceUsd * (o.elevationGroup ? 100 : Math.max(100, s.borrowFactorPct)) / 100;
64999
66905
  const p = leg(uid);
65000
66906
  p.debt = units;
65001
66907
  p.debtUSD = amount * s.priceUsd;
65002
66908
  p.debtUSDOracle = amount * s.priceUsd;
65003
66909
  }
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);
66910
+ if (view2.asOfSlot === Infinity) view2.asOfSlot = o.lastUpdateSlot;
66911
+ if (view2.bfAdjustedDebtUsd > 0)
66912
+ view2.healthFactor = view2.unhealthyBorrowValueUsd / view2.bfAdjustedDebtUsd;
66913
+ views.push(view2);
65008
66914
  bucket.lendingPositions[o.address] = legs;
65009
66915
  bucket.modes[o.address] = String(o.elevationGroup);
65010
66916
  bucket.accounts[o.address] = accounts[o.address] ?? {
@@ -65025,15 +66931,15 @@ function valueKaminoObligations(account, obligations, reserves, groups = {}, acc
65025
66931
  };
65026
66932
  }
65027
66933
  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(
66934
+ const rpc = opts.rpc ?? (0, import_svm_kit20.createSvmRpc)();
66935
+ const hits = await (0, import_svm_kit20.createSvmFetchers)(rpc).indexed.scanProgram(
65030
66936
  KLEND_PROGRAM_ID,
65031
66937
  [
65032
66938
  { dataSize: KLEND_OBLIGATION_SIZE },
65033
66939
  {
65034
66940
  memcmp: {
65035
66941
  offset: 0,
65036
- bytes: (0, import_svm_kit17.encodeBase58)(Uint8Array.from(KLEND_OBLIGATION_DISCRIMINATOR))
66942
+ bytes: (0, import_svm_kit20.encodeBase58)(Uint8Array.from(KLEND_OBLIGATION_DISCRIMINATOR))
65037
66943
  }
65038
66944
  },
65039
66945
  { memcmp: { offset: KLEND_OBLIGATION_OWNER_OFFSET, bytes: account } }
@@ -65044,7 +66950,7 @@ async function fetchKaminoUserOnchain(account, opts = {}) {
65044
66950
  }
65045
66951
  );
65046
66952
  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));
66953
+ const obligations = hits.map((h) => decodeKaminoObligation(h.pubkey, (0, import_svm_kit20.fromBase64)(h.account.data[0]))).filter((o) => !markets || markets.has(o.market));
65048
66954
  const reserves = { ...opts.reserves };
65049
66955
  const need3 = [
65050
66956
  ...new Set(
@@ -65067,8 +66973,8 @@ async function fetchKaminoUserOnchain(account, opts = {}) {
65067
66973
  const a = accounts2[i];
65068
66974
  if (!a || a.owner !== KLEND_PROGRAM_ID) return;
65069
66975
  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]));
66976
+ reserves[k] = decodeKaminoReserveState(k, (0, import_svm_kit20.fromBase64)(a.data[0]));
66977
+ else groups[k] = readKlendElevationGroups((0, import_svm_kit20.fromBase64)(a.data[0]));
65072
66978
  });
65073
66979
  }
65074
66980
  const accounts = {};
@@ -65098,7 +67004,7 @@ async function fetchKaminoUserOnchain(account, opts = {}) {
65098
67004
  init_types();
65099
67005
  init_lenders();
65100
67006
  var isPositionId = (id) => typeof id === "number" && Number.isSafeInteger(id) && id > 0;
65101
- var big = (v) => {
67007
+ var big2 = (v) => {
65102
67008
  try {
65103
67009
  return BigInt(v ?? 0);
65104
67010
  } catch {
@@ -65118,8 +67024,8 @@ function convertJupiterLendUserPositions(account, market, positions, vaults = /*
65118
67024
  skip("liquidated");
65119
67025
  continue;
65120
67026
  }
65121
- const supplyRaw = big(p.supply);
65122
- const borrowRaw = big(p.borrow) + big(p.dustBorrow);
67027
+ const supplyRaw = big2(p.supply);
67028
+ const borrowRaw = big2(p.borrow) + big2(p.dustBorrow);
65123
67029
  if (supplyRaw === 0n && borrowRaw === 0n) {
65124
67030
  skip("empty");
65125
67031
  continue;
@@ -65213,7 +67119,7 @@ async function fetchJupiterLendUser(account, opts = {}) {
65213
67119
  ext.borrowPositions[market] = borrows;
65214
67120
  ext.earnPositions[market] = earns;
65215
67121
  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)
67122
+ (p) => !p.isLiquidated && (big2(p.supply) > 0n || big2(p.borrow) + big2(p.dustBorrow) > 0n) && !(p.vault && p.vault.id === p.vaultId)
65217
67123
  );
65218
67124
  const roster = needsRoster ? new Map((await api.vaults(market)).map((v) => [v.id, v])) : void 0;
65219
67125
  const conv = convertJupiterLendUserPositions(
@@ -65230,13 +67136,13 @@ async function fetchJupiterLendUser(account, opts = {}) {
65230
67136
  }
65231
67137
 
65232
67138
  // src/lending/user-data/save/obligation.ts
65233
- var import_svm_kit18 = require("@1delta/svm-kit");
67139
+ var import_svm_kit21 = require("@1delta/svm-kit");
65234
67140
  function decodeSaveObligation(address, data) {
65235
67141
  if (data.length !== SAVE_OBLIGATION_SIZE)
65236
67142
  throw new Error(
65237
67143
  `save obligation ${address}: ${data.length} bytes, expected ${SAVE_OBLIGATION_SIZE}`
65238
67144
  );
65239
- const r = new import_svm_kit18.BorshReader(data);
67145
+ const r = new import_svm_kit21.BorshReader(data);
65240
67146
  const version = r.u8();
65241
67147
  const lastUpdateSlot = r.u64();
65242
67148
  const stale = r.bool();
@@ -65299,10 +67205,10 @@ function saveObligationSeed(lendingMarket, index = 0) {
65299
67205
  throw new Error(`save obligation index out of range: ${index}`);
65300
67206
  return lendingMarket.slice(0, 24) + String(index).padStart(6, "0") + "m";
65301
67207
  }
65302
- var sha256 = async (bytes) => new Uint8Array(await crypto.subtle.digest("SHA-256", bytes));
67208
+ var sha256 = async (bytes2) => new Uint8Array(await crypto.subtle.digest("SHA-256", bytes2));
65303
67209
  async function createWithSeed(base, seed, programId) {
65304
- const b = (0, import_svm_kit18.decodeBase58)(base);
65305
- const p = (0, import_svm_kit18.decodeBase58)(programId);
67210
+ const b = (0, import_svm_kit21.decodeBase58)(base);
67211
+ const p = (0, import_svm_kit21.decodeBase58)(programId);
65306
67212
  if (!b || b.length !== 32) throw new Error(`not a pubkey: ${base}`);
65307
67213
  if (!p || p.length !== 32) throw new Error(`not a pubkey: ${programId}`);
65308
67214
  const s = new TextEncoder().encode(seed);
@@ -65311,25 +67217,25 @@ async function createWithSeed(base, seed, programId) {
65311
67217
  buf.set(b, 0);
65312
67218
  buf.set(s, 32);
65313
67219
  buf.set(p, 32 + s.length);
65314
- return (0, import_svm_kit18.encodeBase58)(await sha256(buf));
67220
+ return (0, import_svm_kit21.encodeBase58)(await sha256(buf));
65315
67221
  }
65316
67222
  var saveObligationAddress = (wallet, lendingMarket, index = 0, programId = SAVE_PROGRAM_ID) => createWithSeed(wallet, saveObligationSeed(lendingMarket, index), programId);
65317
67223
 
65318
67224
  // src/lending/user-data/save/fetchUser.ts
65319
67225
  init_types();
65320
- var import_svm_kit19 = require("@1delta/svm-kit");
67226
+ var import_svm_kit22 = require("@1delta/svm-kit");
65321
67227
  init_lenders();
65322
67228
  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;
67229
+ var readTokenAmount = (bytes2, mint) => {
67230
+ if (bytes2.length < 72) return void 0;
67231
+ if ((0, import_svm_kit22.encodeBase58)(bytes2.subarray(0, 32)) !== mint) return void 0;
65326
67232
  let v = 0n;
65327
- for (let i = 71; i >= 64; i--) v = v << 8n | BigInt(bytes[i]);
67233
+ for (let i = 71; i >= 64; i--) v = v << 8n | BigInt(bytes2[i]);
65328
67234
  return v;
65329
67235
  };
65330
67236
  async function fetchSaveUser(account, opts = {}) {
65331
67237
  const api = createSaveApi(opts);
65332
- const rpc = opts.rpc ?? (0, import_svm_kit19.createSvmRpc)();
67238
+ const rpc = opts.rpc ?? (0, import_svm_kit22.createSvmRpc)();
65333
67239
  const configs = opts.configs ?? await api.marketConfigs();
65334
67240
  const markets = selectSaveMarkets(configs, opts);
65335
67241
  const step = Math.min(
@@ -65361,10 +67267,10 @@ async function fetchSaveUser(account, opts = {}) {
65361
67267
  reserve,
65362
67268
  market: c.market,
65363
67269
  cTokenMint: c.collateralMint,
65364
- address: await (0, import_svm_kit19.getAssociatedTokenAddress)(
67270
+ address: await (0, import_svm_kit22.getAssociatedTokenAddress)(
65365
67271
  account,
65366
67272
  c.collateralMint,
65367
- import_svm_kit19.TOKEN_PROGRAM
67273
+ import_svm_kit22.TOKEN_PROGRAM
65368
67274
  )
65369
67275
  }))
65370
67276
  );
@@ -65385,9 +67291,9 @@ async function fetchSaveUser(account, opts = {}) {
65385
67291
  const exists = !!a && a.owner === SAVE_PROGRAM_ID && typeof a.data?.[0] === "string";
65386
67292
  (probed[key2] ??= []).push({ index: c.index, address: c.address, exists });
65387
67293
  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) });
67294
+ const bytes2 = (0, import_svm_kit22.fromBase64)(a.data[0]);
67295
+ if (bytes2.length !== SAVE_OBLIGATION_SIZE) return;
67296
+ found.push({ c, ob: decodeSaveObligation(c.address, bytes2) });
65391
67297
  });
65392
67298
  if (extend)
65393
67299
  for (const c of pending) {
@@ -65406,9 +67312,9 @@ async function fetchSaveUser(account, opts = {}) {
65406
67312
  const wallet = [];
65407
67313
  ataCands.forEach((c, i) => {
65408
67314
  const a = ataAccounts[i];
65409
- if (!a || a.owner !== import_svm_kit19.TOKEN_PROGRAM || typeof a.data?.[0] !== "string")
67315
+ if (!a || a.owner !== import_svm_kit22.TOKEN_PROGRAM || typeof a.data?.[0] !== "string")
65410
67316
  return;
65411
- const amount = readTokenAmount((0, import_svm_kit19.fromBase64)(a.data[0]), c.cTokenMint);
67317
+ const amount = readTokenAmount((0, import_svm_kit22.fromBase64)(a.data[0]), c.cTokenMint);
65412
67318
  if (amount && amount > 0n) wallet.push({ c, cTokens: amount });
65413
67319
  });
65414
67320
  const reserveIds = [
@@ -65476,7 +67382,7 @@ async function fetchSaveUser(account, opts = {}) {
65476
67382
  address: ob.address,
65477
67383
  label: `#${c.index}`
65478
67384
  };
65479
- const view = {
67385
+ const view2 = {
65480
67386
  address: ob.address,
65481
67387
  market: c.market.address,
65482
67388
  lenderKey,
@@ -65519,13 +67425,13 @@ async function fetchSaveUser(account, opts = {}) {
65519
67425
  });
65520
67426
  continue;
65521
67427
  }
65522
- const dec = s.reserve.liquidity.mintDecimals;
67428
+ const dec2 = s.reserve.liquidity.mintDecimals;
65523
67429
  const raw2 = d2.depositedAmount * saveExchangeRateWad(s.reserve) / SAVE_WAD;
65524
- const amountStr = scaledToDecimal(raw2, dec);
67430
+ const amountStr = scaledToDecimal(raw2, dec2);
65525
67431
  const amount = Number(amountStr);
65526
67432
  const price = wadToNumber(s.reserve.liquidity.marketPrice);
65527
67433
  const usd = amount * price;
65528
- view.deposits.push({
67434
+ view2.deposits.push({
65529
67435
  reserve: d2.reserve,
65530
67436
  marketUid: uid,
65531
67437
  mint: s.reserve.liquidity.mintPubkey,
@@ -65534,10 +67440,10 @@ async function fetchSaveUser(account, opts = {}) {
65534
67440
  amountUsd: usd,
65535
67441
  served: !reason
65536
67442
  });
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);
67443
+ view2.depositedValueUsd += usd;
67444
+ view2.allowedBorrowValueUsd += usd * (s.reserve.config.loanToValueRatio / 100);
67445
+ view2.unhealthyBorrowValueUsd += usd * (s.reserve.config.liquidationThreshold / 100);
67446
+ view2.superUnhealthyBorrowValueUsd += usd * (s.reserve.config.maxLiquidationThreshold / 100);
65541
67447
  if (reason) {
65542
67448
  unserved.push({
65543
67449
  lenderKey,
@@ -65577,18 +67483,18 @@ async function fetchSaveUser(account, opts = {}) {
65577
67483
  });
65578
67484
  continue;
65579
67485
  }
65580
- const dec = s.reserve.liquidity.mintDecimals;
67486
+ const dec2 = s.reserve.liquidity.mintDecimals;
65581
67487
  const price = wadToNumber(s.reserve.liquidity.marketPrice);
65582
67488
  const reserveIdx = BigInt(s.reserve.liquidity.cumulativeBorrowRateWads);
65583
67489
  const legIdx = b.cumulativeBorrowRateWads;
65584
67490
  const wads = legIdx > 0n ? b.borrowedAmountWads * reserveIdx / legIdx : b.borrowedAmountWads;
65585
- const amountStr = scaledToDecimal(wads, 18 + dec);
67491
+ const amountStr = scaledToDecimal(wads, 18 + dec2);
65586
67492
  const amount = Number(amountStr);
65587
- const atTouch = wadToNumber(b.borrowedAmountWads.toString()) / 10 ** dec;
67493
+ const atTouch = wadToNumber(b.borrowedAmountWads.toString()) / 10 ** dec2;
65588
67494
  const usd = amount * price;
65589
67495
  const addedBps = s.reserve.config.addedBorrowWeightBPS;
65590
67496
  const weight = 1 + Number(addedBps) / 1e4;
65591
- view.borrows.push({
67497
+ view2.borrows.push({
65592
67498
  reserve: b.reserve,
65593
67499
  marketUid: uid,
65594
67500
  mint: s.reserve.liquidity.mintPubkey,
@@ -65598,8 +67504,8 @@ async function fetchSaveUser(account, opts = {}) {
65598
67504
  borrowWeight: weight,
65599
67505
  served: !reason
65600
67506
  });
65601
- if (weight > 1e9 && wads > 0n) view.unboundedWeightDebt = true;
65602
- view.weightedBorrowValueUsd += usd * weight;
67507
+ if (weight > 1e9 && wads > 0n) view2.unboundedWeightDebt = true;
67508
+ view2.weightedBorrowValueUsd += usd * weight;
65603
67509
  if (reason) {
65604
67510
  unserved.push({
65605
67511
  lenderKey,
@@ -65620,8 +67526,8 @@ async function fetchSaveUser(account, opts = {}) {
65620
67526
  debtUSDOracle: usd
65621
67527
  });
65622
67528
  }
65623
- view.healthFactor = view.weightedBorrowValueUsd > 0 ? view.unhealthyBorrowValueUsd / view.weightedBorrowValueUsd : Infinity;
65624
- views.push(view);
67529
+ view2.healthFactor = view2.weightedBorrowValueUsd > 0 ? view2.unhealthyBorrowValueUsd / view2.weightedBorrowValueUsd : Infinity;
67530
+ views.push(view2);
65625
67531
  }
65626
67532
  const walletViews = [];
65627
67533
  for (const { c, cTokens } of wallet) {
@@ -65629,10 +67535,10 @@ async function fetchSaveUser(account, opts = {}) {
65629
67535
  const uid = createMarketUid(SOLANA_CHAIN_ID, lenderKey, c.reserve);
65630
67536
  const s = states[c.reserve];
65631
67537
  const reason = servedReason(c.reserve);
65632
- const dec = s?.reserve.liquidity.mintDecimals ?? 0;
67538
+ const dec2 = s?.reserve.liquidity.mintDecimals ?? 0;
65633
67539
  const amountStr = s ? scaledToDecimal(
65634
67540
  cTokens * saveExchangeRateWad(s.reserve) / SAVE_WAD,
65635
- dec
67541
+ dec2
65636
67542
  ) : "0";
65637
67543
  const usd = s ? Number(amountStr) * wadToNumber(s.reserve.liquidity.marketPrice) : 0;
65638
67544
  walletViews.push({
@@ -65688,12 +67594,12 @@ async function fetchSaveUser(account, opts = {}) {
65688
67594
  }
65689
67595
 
65690
67596
  // src/lending/user-data/loopscale/fetchUser.ts
65691
- var import_svm_kit20 = require("@1delta/svm-kit");
67597
+ var import_svm_kit23 = require("@1delta/svm-kit");
65692
67598
  init_types();
65693
67599
  var shortAddr = (a) => `${a.slice(0, 4)}\u2026${a.slice(-4)}`;
65694
67600
  function convertLoopscaleUser(account, items, opts) {
65695
67601
  const now = opts.now ?? Math.floor(Date.now() / 1e3);
65696
- const dec = (mint) => opts.decimals[mint];
67602
+ const dec2 = (mint) => opts.decimals[mint];
65697
67603
  const positions = {};
65698
67604
  const loans = [];
65699
67605
  const skipped = [];
@@ -65704,7 +67610,7 @@ function convertLoopscaleUser(account, items, opts) {
65704
67610
  ...it.ledgers.map((l) => l.principalMint),
65705
67611
  ...it.collateral.map((c) => c.assetMint)
65706
67612
  ]);
65707
- const missing = [...mints].filter((m) => dec(m) === void 0);
67613
+ const missing = [...mints].filter((m) => dec2(m) === void 0);
65708
67614
  if (missing.length) {
65709
67615
  if (!it.loan.closed)
65710
67616
  skipped.push({
@@ -65713,7 +67619,7 @@ function convertLoopscaleUser(account, items, opts) {
65713
67619
  });
65714
67620
  continue;
65715
67621
  }
65716
- const tok = (raw2, mint) => raw2 / 10 ** dec(mint);
67622
+ const tok = (raw2, mint) => raw2 / 10 ** dec2(mint);
65717
67623
  const ledgers = it.ledgers.map((l) => {
65718
67624
  const d2 = { duration: l.duration, durationType: l.durationType };
65719
67625
  const toMaturity = ledgerInterestAt(
@@ -65887,7 +67793,7 @@ async function fetchLoopscaleUser(account, opts = {}) {
65887
67793
  ];
65888
67794
  if (unknown.length) {
65889
67795
  try {
65890
- const mints = await (0, import_svm_kit20.getMints)(opts.rpc ?? (0, import_svm_kit20.createSvmRpc)(), unknown);
67796
+ const mints = await (0, import_svm_kit23.getMints)(opts.rpc ?? (0, import_svm_kit23.createSvmRpc)(), unknown);
65891
67797
  mints.forEach((m, i) => {
65892
67798
  if (m) decimals[unknown[i]] = m.decimals;
65893
67799
  });
@@ -65907,17 +67813,17 @@ async function fetchLoopscaleUser(account, opts = {}) {
65907
67813
 
65908
67814
  // src/lending/user-data/project0/fetchUser.ts
65909
67815
  init_types();
65910
- var import_svm_kit21 = require("@1delta/svm-kit");
67816
+ var import_svm_kit24 = require("@1delta/svm-kit");
65911
67817
  init_lenders();
65912
67818
  var flagOn = (flags, bit) => (BigInt(flags) & bit) !== 0n;
65913
67819
  async function fetchProject0User(account, opts = {}) {
65914
- const rpc = opts.rpc ?? (0, import_svm_kit21.createSvmRpc)();
67820
+ const rpc = opts.rpc ?? (0, import_svm_kit24.createSvmRpc)();
65915
67821
  const groups = opts.groups?.length ? opts.groups : [P0_MAIN_GROUP];
65916
67822
  const pub = opts.publicData ?? await fetchProject0Public({ ...opts, rpc, groups });
65917
67823
  const found = [];
65918
67824
  let discovery = opts.discovery ?? "scan";
65919
67825
  let readSlot = 0;
65920
- const f = (0, import_svm_kit21.createSvmFetchers)(rpc);
67826
+ const f = (0, import_svm_kit24.createSvmFetchers)(rpc);
65921
67827
  for (const group of groups) {
65922
67828
  if (discovery === "scan") {
65923
67829
  try {
@@ -65927,7 +67833,7 @@ async function fetchProject0User(account, opts = {}) {
65927
67833
  {
65928
67834
  memcmp: {
65929
67835
  offset: 0,
65930
- bytes: (0, import_svm_kit21.encodeBase58)(
67836
+ bytes: (0, import_svm_kit24.encodeBase58)(
65931
67837
  Uint8Array.from(P0_MARGINFI_ACCOUNT_DISCRIMINATOR)
65932
67838
  )
65933
67839
  }
@@ -66019,7 +67925,7 @@ async function fetchProject0User(account, opts = {}) {
66019
67925
  }).catch(() => void 0) === acc.address;
66020
67926
  const label = isPda ? `#${acc.accountIndex}${acc.thirdPartyIndex ? ` \xB7 third party ${acc.thirdPartyIndex}` : ""}` : `keypair ${acc.address.slice(0, 4)}\u2026${acc.address.slice(-4)}`;
66021
67927
  const emodeActive = /* @__PURE__ */ new Set();
66022
- const view = {
67928
+ const view2 = {
66023
67929
  address: acc.address,
66024
67930
  group,
66025
67931
  lenderKey,
@@ -66051,7 +67957,7 @@ async function fetchProject0User(account, opts = {}) {
66051
67957
  for (const b of active) {
66052
67958
  const hit = rowsByBank.get(b.bank);
66053
67959
  if (!hit) {
66054
- view.incomplete = true;
67960
+ view2.incomplete = true;
66055
67961
  unserved.push({
66056
67962
  account: acc.address,
66057
67963
  bank: b.bank,
@@ -66060,7 +67966,7 @@ async function fetchProject0User(account, opts = {}) {
66060
67966
  liabilityShares: b.liabilityShares,
66061
67967
  reason: !bundle ? "group not served" : meta?.droppedBanks.find((d2) => d2.bank === b.bank)?.reason ?? "not in the group roster"
66062
67968
  });
66063
- view.balances.push({
67969
+ view2.balances.push({
66064
67970
  bank: b.bank,
66065
67971
  mint: meta?.banks[b.bank]?.mint ?? "",
66066
67972
  symbol: meta?.banks[b.bank]?.symbol ?? b.bank.slice(0, 4),
@@ -66104,7 +68010,7 @@ async function fetchProject0User(account, opts = {}) {
66104
68010
  const lwMaint = p0.liabilityWeightMaint;
66105
68011
  const depUsd = deposited * price;
66106
68012
  const borUsd = borrowed * price;
66107
- view.balances.push({
68013
+ view2.balances.push({
66108
68014
  bank: b.bank,
66109
68015
  marketUid: uid,
66110
68016
  mint: row.underlying,
@@ -66123,10 +68029,10 @@ async function fetchProject0User(account, opts = {}) {
66123
68029
  emissionsOutstanding: b.emissionsOutstanding,
66124
68030
  unpriced: p0.price.source === "none"
66125
68031
  });
66126
- view.assetValueInitUsd += depUsd * awInit;
66127
- view.assetValueMaintUsd += depUsd * awMaint;
66128
- view.liabilityValueInitUsd += borUsd * lwInit;
66129
- view.liabilityValueMaintUsd += borUsd * lwMaint;
68032
+ view2.assetValueInitUsd += depUsd * awInit;
68033
+ view2.assetValueMaintUsd += depUsd * awMaint;
68034
+ view2.liabilityValueInitUsd += borUsd * lwInit;
68035
+ view2.liabilityValueMaintUsd += borUsd * lwMaint;
66130
68036
  legs[uid] = {
66131
68037
  marketUid: uid,
66132
68038
  deposits: p0DecimalString(deposited, row.decimals),
@@ -66140,13 +68046,13 @@ async function fetchProject0User(account, opts = {}) {
66140
68046
  claimableRewards: 0
66141
68047
  };
66142
68048
  }
66143
- view.healthFactor = view.liabilityValueMaintUsd > 0 ? view.assetValueMaintUsd / view.liabilityValueMaintUsd : Infinity;
66144
- view.freeCollateralUsd = Math.max(
68049
+ view2.healthFactor = view2.liabilityValueMaintUsd > 0 ? view2.assetValueMaintUsd / view2.liabilityValueMaintUsd : Infinity;
68050
+ view2.freeCollateralUsd = Math.max(
66145
68051
  0,
66146
- view.assetValueInitUsd - view.liabilityValueInitUsd
68052
+ view2.assetValueInitUsd - view2.liabilityValueInitUsd
66147
68053
  );
66148
- view.emodeActive = [...emodeActive];
66149
- views.push(view);
68054
+ view2.emodeActive = [...emodeActive];
68055
+ views.push(view2);
66150
68056
  if (!active.length) continue;
66151
68057
  const out = positions[lenderKey] ??= {
66152
68058
  chainId: SOLANA_CHAIN_ID,
@@ -66379,7 +68285,7 @@ function kaminoTermAdapter(row, market) {
66379
68285
  if (row.originationFee === void 0)
66380
68286
  pending["borrow.fees"] = "origination and flash-loan fees are in the reserve account, which was not read";
66381
68287
  for (const p of market?.pending ?? []) pending[`market: ${p}`] = p;
66382
- const liq = market?.liquidation;
68288
+ const liq2 = market?.liquidation;
66383
68289
  return {
66384
68290
  profileId: KAMINO_PROFILE_ID,
66385
68291
  borrow: {
@@ -66453,14 +68359,14 @@ function kaminoTermAdapter(row, market) {
66453
68359
  debtWithdrawalCap: capExt(k.debtWithdrawalCap),
66454
68360
  // remaining new debt outside any elevation group (`borrowLimitOutsideElevationGroup − tracked`)
66455
68361
  debtCapacityOutsideGroups: base.debtCapacity,
66456
- ...liq ? {
68362
+ ...liq2 ? {
66457
68363
  fullLiquidation: {
66458
68364
  // obligation LTV above which the close factor is 100 %
66459
- aboveLtv: liq.insolvencyRiskUnhealthyLtvPct / 100,
68365
+ aboveLtv: liq2.insolvencyRiskUnhealthyLtvPct / 100,
66460
68366
  // a debt leg worth less than this is liquidated whole
66461
- belowDebtValueUsd: liq.minFullLiquidationValueThresholdUsd,
68367
+ belowDebtValueUsd: liq2.minFullLiquidationValueThresholdUsd,
66462
68368
  // one liquidation repays at most this
66463
- maxPerLiquidationUsd: liq.maxLiquidatableDebtMarketValueAtOnceUsd
68369
+ maxPerLiquidationUsd: liq2.maxLiquidatableDebtMarketValueAtOnceUsd
66464
68370
  }
66465
68371
  } : {},
66466
68372
  ...k.pairIncentives.length ? { pairIncentives: k.pairIncentives } : {}
@@ -67326,9 +69232,12 @@ function project0TermAdapter(row, group) {
67326
69232
  HUMA_SEEDS,
67327
69233
  HttpError,
67328
69234
  JL_BPS,
69235
+ JL_EXCHANGE_PRICES_PRECISION,
67329
69236
  JL_FACTOR_SCALE,
67330
69237
  JL_ORACLE_DECIMALS,
67331
69238
  JL_ORACLE_SCALE,
69239
+ JL_VAULTS_ACCOUNTS_IDL,
69240
+ JL_VAULT_AMOUNT_DECIMALS,
67332
69241
  JUPITER_LEND_API_BASE,
67333
69242
  JUPITER_LEND_KEYED_API_BASE,
67334
69243
  JUPITER_LEND_KEY_PREFIX,
@@ -67337,9 +69246,11 @@ function project0TermAdapter(row, group) {
67337
69246
  JUPITER_LEND_PROGRAMS,
67338
69247
  JUPITER_PRICE_API_BASE,
67339
69248
  JUPITER_PRICE_KEYED_API_BASE,
69249
+ JUP_DEX_PROGRAM,
67340
69250
  JUP_FLASHLOAN_IDL,
67341
69251
  JUP_FLASHLOAN_PROGRAMS,
67342
69252
  JUP_LIQUIDITY_PROGRAMS,
69253
+ JUP_VAULTS_PROGRAMS,
67343
69254
  KAMINO_API_BASE,
67344
69255
  KAMINO_KEY_PREFIX,
67345
69256
  KAMINO_MAIN_MARKET,
@@ -67359,6 +69270,7 @@ function project0TermAdapter(row, group) {
67359
69270
  KLEND_RESERVE_SIZE,
67360
69271
  KLEND_RESERVE_SLICE,
67361
69272
  KLEND_U64_MAX,
69273
+ KVAULT_PROGRAM_ID,
67362
69274
  LENDER_BRAND_NAMES,
67363
69275
  LOANS_PAGE,
67364
69276
  LOOPSCALE_ACCOUNT_DISCRIMINATORS,
@@ -67489,6 +69401,7 @@ function project0TermAdapter(row, group) {
67489
69401
  convertJupiterLendOracleEntries,
67490
69402
  convertJupiterLendUserPositions,
67491
69403
  convertJupiterLendVault,
69404
+ convertKaminoKvault,
67492
69405
  convertKaminoLoans,
67493
69406
  convertKaminoMarket,
67494
69407
  convertKaminoOraclePrices,
@@ -67505,6 +69418,7 @@ function project0TermAdapter(row, group) {
67505
69418
  createExponentApi,
67506
69419
  createJupiterLendApi,
67507
69420
  createKaminoApi,
69421
+ createKaminoKvaultApi,
67508
69422
  createLimiter,
67509
69423
  createLoopscaleApi,
67510
69424
  createMarketUid,
@@ -67514,6 +69428,7 @@ function project0TermAdapter(row, group) {
67514
69428
  createSolsticeAppApi,
67515
69429
  createWithSeed,
67516
69430
  decimalStringToI80F48,
69431
+ decimalStringToRaw,
67517
69432
  decodeAccountingState,
67518
69433
  decodeController,
67519
69434
  decodeCooldownEscrow,
@@ -67566,6 +69481,7 @@ function project0TermAdapter(row, group) {
67566
69481
  fetchJupiterLendPublic,
67567
69482
  fetchJupiterLendUser,
67568
69483
  fetchJupiterPrices,
69484
+ fetchKaminoKvaults,
67569
69485
  fetchKaminoOracleEntries,
67570
69486
  fetchKaminoOraclePrices,
67571
69487
  fetchKaminoPublic,
@@ -67608,6 +69524,8 @@ function project0TermAdapter(row, group) {
67608
69524
  i80f48ToNumber,
67609
69525
  isBorrowable,
67610
69526
  isEvmChainId,
69527
+ isJlSmartCol,
69528
+ isJlSmartDebt,
67611
69529
  isJupiterLend,
67612
69530
  isKamino,
67613
69531
  isLenderBrand,
@@ -67627,8 +69545,17 @@ function project0TermAdapter(row, group) {
67627
69545
  isSyntheticQuoteMint,
67628
69546
  isU64Max,
67629
69547
  isUncapped,
69548
+ jlLiquidityExchangePrices,
67630
69549
  jlOraclePriceInBorrow,
67631
69550
  jlOracleToFluidRaw,
69551
+ jlOverallTokenData,
69552
+ jlUserBorrowData,
69553
+ jlUserSupplyData,
69554
+ jlVaultAdminPda,
69555
+ jlVaultConfigPda,
69556
+ jlVaultExchangePrices,
69557
+ jlVaultStatePda,
69558
+ jlVaultToRaw,
67632
69559
  joinableBatch,
67633
69560
  juniorUnlockSharePda,
67634
69561
  jupFlashBorrowPosition,
@@ -67647,6 +69574,7 @@ function project0TermAdapter(row, group) {
67647
69574
  kaminoCloseFactor,
67648
69575
  kaminoDefaultEntry,
67649
69576
  kaminoGroupLabel,
69577
+ kaminoKvaultOriginRow,
67650
69578
  kaminoMarketFromKey,
67651
69579
  kaminoMarketKey,
67652
69580
  kaminoOracleEntriesFromMarkets,
@@ -67708,9 +69636,11 @@ function project0TermAdapter(row, group) {
67708
69636
  readHumaChainState,
67709
69637
  readHumaLenderState,
67710
69638
  readHumaRedemptionRequests,
69639
+ readJlNextVaultId,
67711
69640
  readJupFlashAssets,
67712
69641
  readJupFlashAvailable,
67713
69642
  readJupFlashloanAdmin,
69643
+ readJupiterLendVaultsOnchain,
67714
69644
  readKlendElevationGroups,
67715
69645
  readKlendFlashFacts,
67716
69646
  readKlendLendingMarket,