@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/README.md +63 -0
- package/dist/index.d.mts +588 -25
- package/dist/index.d.ts +588 -25
- package/dist/index.js +2477 -547
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2433 -525
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.js
CHANGED
|
@@ -104,9 +104,12 @@ __export(index_exports, {
|
|
|
104
104
|
HUMA_SEEDS: () => HUMA_SEEDS,
|
|
105
105
|
HttpError: () => HttpError,
|
|
106
106
|
JL_BPS: () => JL_BPS,
|
|
107
|
+
JL_EXCHANGE_PRICES_PRECISION: () => JL_EXCHANGE_PRICES_PRECISION,
|
|
107
108
|
JL_FACTOR_SCALE: () => JL_FACTOR_SCALE,
|
|
108
109
|
JL_ORACLE_DECIMALS: () => JL_ORACLE_DECIMALS,
|
|
109
110
|
JL_ORACLE_SCALE: () => JL_ORACLE_SCALE,
|
|
111
|
+
JL_VAULTS_ACCOUNTS_IDL: () => JL_VAULTS_ACCOUNTS_IDL,
|
|
112
|
+
JL_VAULT_AMOUNT_DECIMALS: () => JL_VAULT_AMOUNT_DECIMALS,
|
|
110
113
|
JUPITER_LEND_API_BASE: () => JUPITER_LEND_API_BASE,
|
|
111
114
|
JUPITER_LEND_KEYED_API_BASE: () => JUPITER_LEND_KEYED_API_BASE,
|
|
112
115
|
JUPITER_LEND_KEY_PREFIX: () => import_lender_registry2.JUPITER_LEND_KEY_PREFIX,
|
|
@@ -115,9 +118,11 @@ __export(index_exports, {
|
|
|
115
118
|
JUPITER_LEND_PROGRAMS: () => JUPITER_LEND_PROGRAMS,
|
|
116
119
|
JUPITER_PRICE_API_BASE: () => JUPITER_PRICE_API_BASE,
|
|
117
120
|
JUPITER_PRICE_KEYED_API_BASE: () => JUPITER_PRICE_KEYED_API_BASE,
|
|
121
|
+
JUP_DEX_PROGRAM: () => JUP_DEX_PROGRAM,
|
|
118
122
|
JUP_FLASHLOAN_IDL: () => JUP_FLASHLOAN_IDL,
|
|
119
123
|
JUP_FLASHLOAN_PROGRAMS: () => JUP_FLASHLOAN_PROGRAMS,
|
|
120
124
|
JUP_LIQUIDITY_PROGRAMS: () => JUP_LIQUIDITY_PROGRAMS,
|
|
125
|
+
JUP_VAULTS_PROGRAMS: () => JUP_VAULTS_PROGRAMS,
|
|
121
126
|
KAMINO_API_BASE: () => KAMINO_API_BASE,
|
|
122
127
|
KAMINO_KEY_PREFIX: () => import_lender_registry2.KAMINO_KEY_PREFIX,
|
|
123
128
|
KAMINO_MAIN_MARKET: () => KAMINO_MAIN_MARKET,
|
|
@@ -137,6 +142,7 @@ __export(index_exports, {
|
|
|
137
142
|
KLEND_RESERVE_SIZE: () => KLEND_RESERVE_SIZE,
|
|
138
143
|
KLEND_RESERVE_SLICE: () => KLEND_RESERVE_SLICE,
|
|
139
144
|
KLEND_U64_MAX: () => KLEND_U64_MAX,
|
|
145
|
+
KVAULT_PROGRAM_ID: () => KVAULT_PROGRAM_ID,
|
|
140
146
|
LENDER_BRAND_NAMES: () => LENDER_BRAND_NAMES,
|
|
141
147
|
LOANS_PAGE: () => LOANS_PAGE,
|
|
142
148
|
LOOPSCALE_ACCOUNT_DISCRIMINATORS: () => LOOPSCALE_ACCOUNT_DISCRIMINATORS,
|
|
@@ -224,7 +230,7 @@ __export(index_exports, {
|
|
|
224
230
|
SAVE_UNBORROWABLE_BORROW_FACTOR: () => SAVE_UNBORROWABLE_BORROW_FACTOR,
|
|
225
231
|
SAVE_WAD: () => SAVE_WAD,
|
|
226
232
|
SAVE_WALLET_POS_ID: () => SAVE_WALLET_POS_ID,
|
|
227
|
-
SECONDS_PER_YEAR: () =>
|
|
233
|
+
SECONDS_PER_YEAR: () => SECONDS_PER_YEAR2,
|
|
228
234
|
SETTLEMENT_BATCH_SIZE: () => SETTLEMENT_BATCH_SIZE,
|
|
229
235
|
SOLANA_CHAIN_ID: () => SOLANA_CHAIN_ID,
|
|
230
236
|
SOLSTICE_APP_API_BASE: () => SOLSTICE_APP_API_BASE,
|
|
@@ -267,6 +273,7 @@ __export(index_exports, {
|
|
|
267
273
|
convertJupiterLendOracleEntries: () => convertJupiterLendOracleEntries,
|
|
268
274
|
convertJupiterLendUserPositions: () => convertJupiterLendUserPositions,
|
|
269
275
|
convertJupiterLendVault: () => convertJupiterLendVault,
|
|
276
|
+
convertKaminoKvault: () => convertKaminoKvault,
|
|
270
277
|
convertKaminoLoans: () => convertKaminoLoans,
|
|
271
278
|
convertKaminoMarket: () => convertKaminoMarket,
|
|
272
279
|
convertKaminoOraclePrices: () => convertKaminoOraclePrices,
|
|
@@ -283,6 +290,7 @@ __export(index_exports, {
|
|
|
283
290
|
createExponentApi: () => createExponentApi,
|
|
284
291
|
createJupiterLendApi: () => createJupiterLendApi,
|
|
285
292
|
createKaminoApi: () => createKaminoApi,
|
|
293
|
+
createKaminoKvaultApi: () => createKaminoKvaultApi,
|
|
286
294
|
createLimiter: () => createLimiter,
|
|
287
295
|
createLoopscaleApi: () => createLoopscaleApi,
|
|
288
296
|
createMarketUid: () => createMarketUid,
|
|
@@ -292,6 +300,7 @@ __export(index_exports, {
|
|
|
292
300
|
createSolsticeAppApi: () => createSolsticeAppApi,
|
|
293
301
|
createWithSeed: () => createWithSeed,
|
|
294
302
|
decimalStringToI80F48: () => decimalStringToI80F48,
|
|
303
|
+
decimalStringToRaw: () => decimalStringToRaw,
|
|
295
304
|
decodeAccountingState: () => decodeAccountingState,
|
|
296
305
|
decodeController: () => decodeController,
|
|
297
306
|
decodeCooldownEscrow: () => decodeCooldownEscrow,
|
|
@@ -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
|
-
|
|
9323
|
-
|
|
9324
|
-
var
|
|
9325
|
-
|
|
9326
|
-
|
|
9327
|
-
var
|
|
9328
|
-
|
|
9329
|
-
|
|
9330
|
-
|
|
9331
|
-
|
|
9332
|
-
|
|
9333
|
-
|
|
9334
|
-
|
|
9335
|
-
|
|
9336
|
-
|
|
9337
|
-
|
|
9338
|
-
|
|
9339
|
-
|
|
9340
|
-
|
|
9341
|
-
|
|
9342
|
-
|
|
9343
|
-
|
|
9344
|
-
|
|
9345
|
-
|
|
9346
|
-
|
|
9347
|
-
|
|
9348
|
-
|
|
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
|
-
|
|
9527
|
-
|
|
9528
|
-
|
|
9529
|
-
|
|
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
|
-
|
|
9533
|
-
|
|
9534
|
-
|
|
9535
|
-
|
|
9536
|
-
|
|
9537
|
-
|
|
9538
|
-
|
|
9539
|
-
|
|
9540
|
-
|
|
9541
|
-
|
|
9542
|
-
|
|
9543
|
-
|
|
9544
|
-
|
|
9545
|
-
|
|
9546
|
-
|
|
9547
|
-
|
|
9548
|
-
|
|
9549
|
-
|
|
9550
|
-
|
|
9551
|
-
|
|
9552
|
-
|
|
9553
|
-
|
|
9554
|
-
|
|
9555
|
-
|
|
9556
|
-
|
|
9557
|
-
|
|
9558
|
-
|
|
9559
|
-
|
|
9560
|
-
|
|
9561
|
-
|
|
9562
|
-
|
|
9563
|
-
|
|
9564
|
-
|
|
9565
|
-
|
|
9566
|
-
|
|
9567
|
-
|
|
9568
|
-
|
|
9569
|
-
|
|
9570
|
-
|
|
9571
|
-
|
|
9572
|
-
|
|
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
|
-
|
|
10202
|
-
|
|
10203
|
-
|
|
10204
|
-
|
|
10205
|
-
|
|
10206
|
-
|
|
10207
|
-
|
|
10208
|
-
|
|
10209
|
-
|
|
10210
|
-
|
|
10211
|
-
|
|
10212
|
-
|
|
10213
|
-
|
|
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
|
-
|
|
10220
|
-
const
|
|
10221
|
-
const
|
|
10222
|
-
|
|
10223
|
-
|
|
10224
|
-
|
|
10225
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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,
|
|
10937
|
-
const
|
|
10938
|
-
mints.forEach((m, i) => m &&
|
|
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 &&
|
|
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 =
|
|
12453
|
+
pair.collateralDecimals = dec2.get(pair.collateralMint);
|
|
10947
12454
|
if (pair.principalDecimals === void 0)
|
|
10948
|
-
pair.principalDecimals =
|
|
12455
|
+
pair.principalDecimals = dec2.get(pair.principalMint);
|
|
10949
12456
|
}
|
|
10950
|
-
for (const c of unknown) if (!
|
|
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
|
|
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
|
|
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,
|
|
18371
|
-
const zero = (0,
|
|
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,
|
|
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,
|
|
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,
|
|
18458
|
-
const zero = (0,
|
|
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,
|
|
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,
|
|
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
|
|
18820
|
-
for (const [m, t] of Object.entries(tokenList ?? {}))
|
|
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
|
-
|
|
20330
|
+
dec2.set(p.principalMint, p.principalDecimals);
|
|
18824
20331
|
if (p.collateralMint && p.collateralDecimals !== void 0)
|
|
18825
|
-
|
|
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 =
|
|
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
|
|
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,
|
|
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
|
|
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
|
|
33873
|
-
var
|
|
33874
|
-
const b = (0,
|
|
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
|
|
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,
|
|
33885
|
-
[
|
|
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,
|
|
33889
|
-
[
|
|
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,
|
|
33893
|
-
var p0MarginfiAccountPda = async (authority, accountIndex = 0, opts = {}) => (await (0,
|
|
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
|
-
|
|
33896
|
-
|
|
33897
|
-
|
|
33898
|
-
|
|
33899
|
-
|
|
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
|
|
33984
|
-
const r = (0,
|
|
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
|
|
34210
|
-
const r = (0,
|
|
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
|
|
34244
|
-
const r = (0,
|
|
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
|
-
|
|
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,
|
|
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
|
|
34302
|
-
const r = (0,
|
|
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
|
|
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,
|
|
34482
|
-
reserveStake: (0,
|
|
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
|
|
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,
|
|
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
|
|
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,
|
|
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 ?
|
|
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
|
|
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,
|
|
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
|
|
35634
|
-
const totalAssetsFormatted = Number(t.totalAssets) / 10 **
|
|
35635
|
-
const liquidityFormatted = Number(t.liquiditySupplyData.withdrawable) / 10 **
|
|
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:
|
|
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:
|
|
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
|
|
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
|
|
46590
|
-
var
|
|
46591
|
-
const b = (0,
|
|
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,
|
|
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([
|
|
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([
|
|
46612
|
-
pda([
|
|
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 =
|
|
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([
|
|
46630
|
-
pda([
|
|
46631
|
-
pda([
|
|
46632
|
-
pda([
|
|
46633
|
-
pda([
|
|
46634
|
-
pda([
|
|
46635
|
-
pda([
|
|
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
|
-
|
|
46651
|
-
|
|
48311
|
+
utf85(tag),
|
|
48312
|
+
utf85(strategyName),
|
|
46652
48313
|
Uint8Array.of(0),
|
|
46653
|
-
|
|
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([
|
|
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
|
-
[
|
|
48327
|
+
[utf85("SENIOR_UNLOCK_COOLDOWN"), utf85(strategyName), pk5(user)],
|
|
46667
48328
|
programId
|
|
46668
48329
|
),
|
|
46669
48330
|
pda(
|
|
46670
|
-
[
|
|
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([
|
|
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,
|
|
46681
|
-
var decodeYieldPool = (d2) => (0,
|
|
46682
|
-
var decodeVestingSchedule = (d2) => (0,
|
|
46683
|
-
var decodeCooldownEscrow = (d2) => (0,
|
|
46684
|
-
var decodeStrategyController = (d2) => (0,
|
|
46685
|
-
var decodeStrategy = (d2) => (0,
|
|
46686
|
-
var decodeAccountingState = (d2) => (0,
|
|
46687
|
-
var decodeSettlementBatch = (d2) => (0,
|
|
46688
|
-
var decodeJuniorUnlockShare = (d2) => (0,
|
|
46689
|
-
var decodeSeniorUnlockCooldown = (d2) => (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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(
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
48903
|
+
var import_svm_kit15 = require("@1delta/svm-kit");
|
|
47243
48904
|
async function fetchSolsticeUser(account, opts = {}) {
|
|
47244
|
-
const rpc = opts.rpc ?? (0,
|
|
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,
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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
|
|
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
|
|
63457
|
-
var
|
|
63458
|
-
const b = (0,
|
|
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,
|
|
63463
|
-
var humaPoolConfigPda = () => pda2([
|
|
63464
|
-
var humaPoolStatePda = () => pda2([
|
|
63465
|
-
var humaPoolAuthorityPda = () => pda2([
|
|
63466
|
-
var humaModeConfigPda = (modeId) => pda2([
|
|
63467
|
-
var humaModeMintPda = (modeConfig) => pda2([
|
|
63468
|
-
var humaLenderStatePda = (modeConfig, lender) => pda2([
|
|
63469
|
-
var humaDeploymentStatePda = (deploymentConfig) => pda2([
|
|
63470
|
-
var humaRedemptionRequestPda = (id, poolConfig) => pda2([
|
|
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,
|
|
63479
|
-
var decodeHumaModeConfig = (d2) => (0,
|
|
63480
|
-
var decodeHumaPoolConfig = (d2) => (0,
|
|
63481
|
-
var decodeHumaLenderState = (d2) => (0,
|
|
63482
|
-
var decodeHumaRedemptionRequest = (d2) => (0,
|
|
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,
|
|
65157
|
+
const poolUnderlyingToken = await (0, import_svm_kit16.getAssociatedTokenAddress)(
|
|
63497
65158
|
await humaPoolAuthorityPda(),
|
|
63498
65159
|
pool.underlyingMint,
|
|
63499
|
-
|
|
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,
|
|
65167
|
+
(0, import_svm_kit16.fromBase64)(need2(first[0], "pool_state").data[0])
|
|
63507
65168
|
);
|
|
63508
65169
|
const config = decodeHumaPoolConfig(
|
|
63509
|
-
(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,
|
|
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,
|
|
65188
|
+
(0, import_svm_kit16.fromBase64)(need2(modeAcct, "mode_config").data[0])
|
|
63528
65189
|
);
|
|
63529
|
-
const mintData = (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,
|
|
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,
|
|
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
|
|
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,
|
|
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
|
|
63724
|
-
if (
|
|
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 **
|
|
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) *
|
|
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 *
|
|
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
|
-
|
|
63770
|
-
|
|
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 **
|
|
65436
|
+
convertToAssets: String(Math.round(sharePrice * 10 ** dec2)),
|
|
63774
65437
|
convertToShares: String(
|
|
63775
|
-
sharePrice > 0 ? Math.round(1 / sharePrice * 10 **
|
|
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 **
|
|
63788
|
-
liquidityUsd: idle / 10 **
|
|
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
|
|
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
|
|
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 * (
|
|
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:
|
|
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,
|
|
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
|
-
[
|
|
65811
|
+
[import_svm_kit18.WRAPPED_SOL],
|
|
63996
65812
|
tokenList,
|
|
63997
65813
|
opts.priceApi
|
|
63998
|
-
).then((p) => p.byMint[
|
|
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
|
-
|
|
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"
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
64964
|
-
|
|
66869
|
+
view2.asOfSlot = Math.min(view2.asOfSlot, s.lastUpdateSlot);
|
|
66870
|
+
view2.depositedValueUsd += amount * s.priceUsd;
|
|
64965
66871
|
const lt = group?.liquidationThreshold ?? s.liquidationThresholdPct;
|
|
64966
|
-
|
|
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
|
-
|
|
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
|
-
|
|
64998
|
-
|
|
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 (
|
|
65005
|
-
if (
|
|
65006
|
-
|
|
65007
|
-
views.push(
|
|
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,
|
|
65029
|
-
const hits = await (0,
|
|
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,
|
|
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,
|
|
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,
|
|
65071
|
-
else groups[k] = readKlendElevationGroups((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
|
|
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 =
|
|
65122
|
-
const borrowRaw =
|
|
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 && (
|
|
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
|
|
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
|
|
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 (
|
|
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,
|
|
65305
|
-
const p = (0,
|
|
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,
|
|
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
|
|
67226
|
+
var import_svm_kit22 = require("@1delta/svm-kit");
|
|
65321
67227
|
init_lenders();
|
|
65322
67228
|
var SAVE_WALLET_POS_ID = "wallet";
|
|
65323
|
-
var readTokenAmount = (
|
|
65324
|
-
if (
|
|
65325
|
-
if ((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(
|
|
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,
|
|
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,
|
|
67270
|
+
address: await (0, import_svm_kit22.getAssociatedTokenAddress)(
|
|
65365
67271
|
account,
|
|
65366
67272
|
c.collateralMint,
|
|
65367
|
-
|
|
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
|
|
65389
|
-
if (
|
|
65390
|
-
found.push({ c, ob: decodeSaveObligation(c.address,
|
|
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 !==
|
|
67315
|
+
if (!a || a.owner !== import_svm_kit22.TOKEN_PROGRAM || typeof a.data?.[0] !== "string")
|
|
65410
67316
|
return;
|
|
65411
|
-
const amount = readTokenAmount((0,
|
|
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
|
|
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
|
|
67428
|
+
const dec2 = s.reserve.liquidity.mintDecimals;
|
|
65523
67429
|
const raw2 = d2.depositedAmount * saveExchangeRateWad(s.reserve) / SAVE_WAD;
|
|
65524
|
-
const amountStr = scaledToDecimal(raw2,
|
|
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
|
-
|
|
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
|
-
|
|
65538
|
-
|
|
65539
|
-
|
|
65540
|
-
|
|
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
|
|
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 +
|
|
67491
|
+
const amountStr = scaledToDecimal(wads, 18 + dec2);
|
|
65586
67492
|
const amount = Number(amountStr);
|
|
65587
|
-
const atTouch = wadToNumber(b.borrowedAmountWads.toString()) / 10 **
|
|
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
|
-
|
|
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)
|
|
65602
|
-
|
|
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
|
-
|
|
65624
|
-
views.push(
|
|
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
|
|
67538
|
+
const dec2 = s?.reserve.liquidity.mintDecimals ?? 0;
|
|
65633
67539
|
const amountStr = s ? scaledToDecimal(
|
|
65634
67540
|
cTokens * saveExchangeRateWad(s.reserve) / SAVE_WAD,
|
|
65635
|
-
|
|
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
|
|
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
|
|
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) =>
|
|
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 **
|
|
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,
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
66127
|
-
|
|
66128
|
-
|
|
66129
|
-
|
|
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
|
-
|
|
66144
|
-
|
|
68049
|
+
view2.healthFactor = view2.liabilityValueMaintUsd > 0 ? view2.assetValueMaintUsd / view2.liabilityValueMaintUsd : Infinity;
|
|
68050
|
+
view2.freeCollateralUsd = Math.max(
|
|
66145
68051
|
0,
|
|
66146
|
-
|
|
68052
|
+
view2.assetValueInitUsd - view2.liabilityValueInitUsd
|
|
66147
68053
|
);
|
|
66148
|
-
|
|
66149
|
-
views.push(
|
|
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
|
|
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
|
-
...
|
|
68362
|
+
...liq2 ? {
|
|
66457
68363
|
fullLiquidation: {
|
|
66458
68364
|
// obligation LTV above which the close factor is 100 %
|
|
66459
|
-
aboveLtv:
|
|
68365
|
+
aboveLtv: liq2.insolvencyRiskUnhealthyLtvPct / 100,
|
|
66460
68366
|
// a debt leg worth less than this is liquidated whole
|
|
66461
|
-
belowDebtValueUsd:
|
|
68367
|
+
belowDebtValueUsd: liq2.minFullLiquidationValueThresholdUsd,
|
|
66462
68368
|
// one liquidation repays at most this
|
|
66463
|
-
maxPerLiquidationUsd:
|
|
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,
|