@kamino-finance/klend-sdk 2.10.9 → 2.10.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/classes/market.js +25 -2
- package/dist/classes/market.js.map +1 -1
- package/dist/classes/reserve.js +3 -0
- package/dist/classes/reserve.js.map +1 -1
- package/dist/lending_operations/repay_with_collateral_calcs.d.ts +16 -4
- package/dist/lending_operations/repay_with_collateral_calcs.js +5 -4
- package/dist/lending_operations/repay_with_collateral_calcs.js.map +1 -1
- package/dist/lending_operations/repay_with_collateral_operations.d.ts +1 -1
- package/dist/lending_operations/repay_with_collateral_operations.js +6 -6
- package/dist/lending_operations/repay_with_collateral_operations.js.map +1 -1
- package/dist/utils/rpc.js +6 -3
- package/dist/utils/rpc.js.map +1 -1
- package/package.json +4 -4
package/dist/classes/market.js
CHANGED
|
@@ -1,4 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
26
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
27
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -42,7 +65,6 @@ const kamino_sdk_1 = require("@hubbleprotocol/kamino-sdk");
|
|
|
42
65
|
const utils_2 = require("./utils");
|
|
43
66
|
const sbv2_lite_1 = __importDefault(require("@switchboard-xyz/sbv2-lite"));
|
|
44
67
|
const zero_padding_1 = require("../idl_codegen/zero_padding");
|
|
45
|
-
const rpc_1 = require("../utils/rpc");
|
|
46
68
|
class KaminoMarket {
|
|
47
69
|
constructor(connection, state, marketAddress, reserves, scope, programId = programId_1.PROGRAM_ID) {
|
|
48
70
|
this.address = marketAddress;
|
|
@@ -361,6 +383,7 @@ class KaminoMarket {
|
|
|
361
383
|
getAllObligationsForMarket(tag) {
|
|
362
384
|
var _a;
|
|
363
385
|
return __awaiter(this, void 0, void 0, function* () {
|
|
386
|
+
const { getProgramAccounts } = yield Promise.resolve().then(() => __importStar(require('../utils/rpc')));
|
|
364
387
|
const filters = [
|
|
365
388
|
{
|
|
366
389
|
dataSize: accounts_1.Obligation.layout.span + 8,
|
|
@@ -384,7 +407,7 @@ class KaminoMarket {
|
|
|
384
407
|
const cumulativeBorrowRates = new utils_1.PubkeyHashMap();
|
|
385
408
|
const [slot, obligations] = yield Promise.all([
|
|
386
409
|
this.connection.getSlot(),
|
|
387
|
-
|
|
410
|
+
getProgramAccounts(this.connection, this.programId, {
|
|
388
411
|
commitment: (_a = this.connection.commitment) !== null && _a !== void 0 ? _a : 'processed',
|
|
389
412
|
filters,
|
|
390
413
|
dataSlice: { offset: 0, length: zero_padding_1.ObligationZP.layout.span + 8 }, // truncate the padding
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/classes/market.ts"],"names":[],"mappings":"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","sourcesContent":["import { Connection, PublicKey } from '@solana/web3.js';\nimport { KaminoObligation } from './obligation';\nimport { KaminoReserve } from './reserve';\nimport { LendingMarket, Obligation, UserMetadata, ReferrerTokenState, Reserve } from '../idl_codegen/accounts';\nimport { MarketConfigType } from './shared';\nimport {\n lendingMarketAuthPda,\n ObligationType,\n referrerTokenStatePda,\n userMetadataPda,\n getTokenOracleData,\n VanillaObligation,\n LendingObligation,\n MultiplyObligation,\n LeverageObligation,\n isNotNullPubkey,\n getAllOracleAccounts,\n PythPrices,\n cacheOrGetScopePrice,\n cacheOrGetPythPrices,\n cacheOrGetSwitchboardPrice,\n PubkeyHashMap,\n CandidatePrice,\n} from '../utils';\nimport base58 from 'bs58';\nimport { BN } from '@coral-xyz/anchor';\nimport Decimal from 'decimal.js';\nimport { FarmState } from '@hubbleprotocol/farms-sdk';\nimport { PROGRAM_ID } from '../idl_codegen/programId';\nimport bs58 from 'bs58';\nimport { OraclePrices, Scope } from '@hubbleprotocol/scope-sdk';\nimport { Fraction } from './fraction';\nimport { chunks, KaminoPrices, MintToPriceMap } from '@hubbleprotocol/kamino-sdk';\nimport { parseTokenSymbol } from './utils';\nimport SwitchboardProgram from '@switchboard-xyz/sbv2-lite';\nimport { ObligationZP } from '../idl_codegen/zero_padding';\nimport { getProgramAccounts } from '../utils/rpc';\n\nexport interface ReserveRewardInfo {\n rewardsPerSecond: Decimal; // not lamport\n rewardsRemaining: Decimal; // not lamport\n rewardApr: Decimal;\n rewardMint: PublicKey;\n totalInvestmentUsd: Decimal;\n rewardPrice: number;\n}\n\nexport class KaminoMarket {\n private readonly connection: Connection;\n\n readonly address: string;\n\n state: LendingMarket;\n\n reserves: Map<PublicKey, KaminoReserve>;\n\n reservesActive: Map<PublicKey, KaminoReserve>;\n\n readonly programId: PublicKey;\n\n scope: Scope;\n\n private constructor(\n connection: Connection,\n state: LendingMarket,\n marketAddress: string,\n reserves: Map<PublicKey, KaminoReserve>,\n scope: Scope,\n programId: PublicKey = PROGRAM_ID\n ) {\n this.address = marketAddress;\n this.connection = connection;\n this.state = state;\n this.reserves = reserves;\n this.reservesActive = getReservesActive(this.reserves);\n this.programId = programId;\n this.scope = scope;\n }\n\n /**\n * Load a new market with all of its associated reserves\n * @param connection\n * @param marketAddress\n * @param programId\n * @param setupLocalTest\n */\n static async load(\n connection: Connection,\n marketAddress: PublicKey,\n programId: PublicKey = PROGRAM_ID,\n setupLocalTest: boolean = false,\n withReserves: boolean = true\n ) {\n const market = await LendingMarket.fetch(connection, marketAddress, programId);\n\n if (market === null) {\n return null;\n }\n let scope: Scope;\n if (!setupLocalTest) {\n scope = new Scope('mainnet-beta', connection);\n } else {\n scope = new Scope('localnet', connection);\n }\n\n const reserves = withReserves\n ? await getReservesForMarket(marketAddress, connection, programId)\n : new Map<PublicKey, KaminoReserve>();\n\n return new KaminoMarket(connection, market, marketAddress.toString(), reserves, scope, programId);\n }\n\n async reload(): Promise<void> {\n const market = await LendingMarket.fetch(this.connection, this.getAddress(), this.programId);\n if (market === null) {\n return;\n }\n\n this.state = market;\n this.reserves = await getReservesForMarket(this.getAddress(), this.connection, this.programId);\n this.reservesActive = getReservesActive(this.reserves);\n }\n\n /**\n * Get the address of this market\n * @return market address public key\n */\n getAddress(): PublicKey {\n return new PublicKey(this.address);\n }\n\n /**\n * Get a list of reserves for this market\n */\n getReserves(): Array<KaminoReserve> {\n return [...this.reserves.values()];\n }\n\n getElevationGroup(elevationGroup: number) {\n return this.state.elevationGroups[elevationGroup - 1];\n }\n\n /**\n * Get the authority PDA of this market\n * @return market authority public key\n */\n getLendingMarketAuthority(): PublicKey {\n return lendingMarketAuthPda(this.getAddress(), this.programId)[0];\n }\n\n async getObligationDepositByWallet(\n owner: PublicKey,\n mint: PublicKey,\n obligationType: ObligationType\n ): Promise<Decimal> {\n const obligation = await this.getObligationByWallet(owner, obligationType);\n return obligation?.getDepositByMint(mint)?.amount ?? new Decimal(0);\n }\n\n async getObligationBorrowByWallet(\n owner: PublicKey,\n mint: PublicKey,\n obligationType: ObligationType\n ): Promise<Decimal> {\n const obligation = await this.getObligationByWallet(owner, obligationType);\n return obligation?.getBorrowByMint(mint)?.amount ?? new Decimal(0);\n }\n\n getTotalDepositTVL(): Decimal {\n const tvl = new Decimal(0);\n for (const reserve of this.reserves.values()) {\n tvl.add(reserve.getDepositTvl());\n }\n return tvl;\n }\n\n getTotalBorrowTVL(): Decimal {\n const tvl = new Decimal(0);\n for (const reserve of this.reserves.values()) {\n tvl.add(reserve.getBorrowTvl());\n }\n return tvl;\n }\n\n getMaxLeverageForPair(collTokenMint: PublicKey, debtTokenMint: PublicKey): number {\n const { maxLtv: maxCollateralLtv, borrowFactor } = this.getMaxAndLiquidationLtvAndBorrowFactorForPair(\n collTokenMint,\n debtTokenMint\n );\n\n const maxLeverage =\n // const ltv = (coll * ltv_factor) / (debt * borrow_factor);\n 1 / (1 - (maxCollateralLtv * 100) / (borrowFactor * 100));\n\n return maxLeverage;\n }\n\n getMaxAndLiquidationLtvAndBorrowFactorForPair(\n collTokenMint: PublicKey,\n debtTokenMint: PublicKey\n ): { maxLtv: number; liquidationLtv: number; borrowFactor: number } {\n const collReserve: KaminoReserve | undefined = this.getReserveByMint(collTokenMint);\n const debtReserve: KaminoReserve | undefined = this.getReserveByMint(debtTokenMint);\n\n if (!collReserve || !debtReserve) {\n throw Error('Could not find one of the reserves.');\n }\n\n const groupsColl = new Set(collReserve.state.config.elevationGroups);\n const groupsDebt = new Set(debtReserve.state.config.elevationGroups);\n const commonElevationGroups = [...groupsColl].filter((item) => groupsDebt.has(item) && item !== 0);\n\n // Ltv factor for coll token\n const maxCollateralLtv =\n commonElevationGroups.length === 0\n ? collReserve.state.config.loanToValuePct\n : this.state.elevationGroups\n .filter((e) => commonElevationGroups.includes(e.id))\n .reduce((acc, elem) => Math.max(acc, elem.ltvPct), 0);\n\n const liquidationLtv =\n commonElevationGroups.length === 0\n ? collReserve.state.config.liquidationThresholdPct\n : this.state.elevationGroups\n .filter((e) => commonElevationGroups.includes(e.id))\n .reduce((acc, elem) => Math.max(acc, elem.liquidationThresholdPct), 0);\n\n const borrowFactor =\n commonElevationGroups.length === 0 ? debtReserve?.state.config.borrowFactorPct.toNumber() / 100 : 1;\n\n return { maxLtv: maxCollateralLtv / 100, liquidationLtv: liquidationLtv / 100, borrowFactor };\n }\n\n async getTotalProductTvl(\n productType: ObligationType\n ): Promise<{ tvl: Decimal; borrows: Decimal; deposits: Decimal; avgLeverage: Decimal }> {\n let obligations = (await this.getAllObligationsForMarket(productType.toArgs().tag)).filter(\n (obligation) =>\n obligation.refreshedStats.userTotalBorrow.gt(0) || obligation.refreshedStats.userTotalDeposit.gt(0)\n );\n\n switch (productType.toArgs().tag) {\n case VanillaObligation.tag: {\n break;\n }\n case LendingObligation.tag: {\n const mint = productType.toArgs().seed1;\n obligations = obligations.filter((obligation) => obligation.getDepositByMint(mint) !== undefined);\n break;\n }\n case MultiplyObligation.tag:\n case LeverageObligation.tag: {\n const collMint = productType.toArgs().seed1;\n const debtMint = productType.toArgs().seed2;\n obligations = obligations.filter(\n (obligation) =>\n obligation.getDepositByMint(collMint) !== undefined && obligation.getBorrowByMint(debtMint) !== undefined\n );\n break;\n }\n default:\n throw new Error('Invalid obligation type');\n }\n\n const deposits = obligations.reduce(\n (acc, obligation) => acc.plus(obligation.refreshedStats.userTotalDeposit),\n new Decimal(0)\n );\n const borrows = obligations.reduce(\n (acc, obligation) => acc.plus(obligation.refreshedStats.userTotalBorrow),\n new Decimal(0)\n );\n const avgLeverage = obligations.reduce(\n (acc, obligations) => acc.plus(obligations.refreshedStats.leverage),\n new Decimal(0)\n );\n return { tvl: deposits.sub(borrows), deposits, borrows, avgLeverage: avgLeverage.div(obligations.length) };\n }\n\n /**\n *\n * @returns Number of active obligations in the market\n */\n async getNumberOfObligations() {\n return (await this.getAllObligationsForMarket())\n .filter(\n (obligation) =>\n obligation.refreshedStats.userTotalBorrow.gt(0) || obligation.refreshedStats.userTotalDeposit.gt(0)\n )\n .reduce((acc, _obligation) => acc + 1, 0);\n }\n\n async getObligationByWallet(publicKey: PublicKey, obligationType: ObligationType): Promise<KaminoObligation | null> {\n const { address } = this;\n if (!address) {\n throw Error('Market must be initialized to call initialize.');\n }\n const obligationAddress = obligationType.toPda(this.getAddress(), publicKey);\n return KaminoObligation.load(this, obligationAddress);\n }\n\n async loadReserves() {\n const addresses = [...this.reserves.keys()];\n const reserveAccounts = await this.connection.getMultipleAccountsInfo(addresses, 'processed');\n const deserializedReserves = reserveAccounts.map((reserve, i) => {\n if (reserve === null) {\n // maybe reuse old here\n throw new Error(`Reserve account ${addresses[i].toBase58()} was not found`);\n }\n const reserveAccount = Reserve.decode(reserve.data);\n if (!reserveAccount) {\n throw Error(`Could not parse reserve ${addresses[i].toBase58()}`);\n }\n return reserveAccount;\n });\n const reservesAndOracles = await getTokenOracleData(this.connection, deserializedReserves);\n const kaminoReserves = new PubkeyHashMap<PublicKey, KaminoReserve>();\n reservesAndOracles.forEach(([reserve, oracle], index) => {\n if (!oracle) {\n throw Error(`Could not find oracle for ${parseTokenSymbol(reserve.config.tokenInfo.name)} reserve`);\n }\n const kaminoReserve = KaminoReserve.initialize(\n reserveAccounts[index]!,\n addresses[index],\n reserve,\n oracle,\n this.connection\n );\n kaminoReserves.set(kaminoReserve.address, kaminoReserve);\n });\n this.reserves = kaminoReserves;\n this.reservesActive = getReservesActive(this.reserves);\n }\n\n async refreshAll() {\n const promises = [this.getReserves().every((reserve) => reserve.stats) ? this.loadReserves() : null].filter(\n (x) => x\n );\n\n await Promise.all(promises);\n\n this.reservesActive = getReservesActive(this.reserves);\n }\n\n getReserveByAddress(address: PublicKey) {\n return this.reserves.get(address);\n }\n\n getReserveByMint(address: PublicKey) {\n for (const reserve of this.reserves.values()) {\n if (reserve.getLiquidityMint().equals(address)) {\n return reserve;\n }\n }\n return undefined;\n }\n\n getReserveBySymbol(symbol: string) {\n for (const reserve of this.reserves.values()) {\n if (reserve.symbol === symbol) {\n return reserve;\n }\n }\n return undefined;\n }\n\n getReserveMintBySymbol(symbol: string) {\n return this.getReserveBySymbol(symbol)?.getLiquidityMint();\n }\n\n async getReserveFarmInfo(\n mint: PublicKey,\n getRewardPrice: (mint: PublicKey) => Promise<number>\n ): Promise<{ borrowingRewards: ReserveRewardInfo; depositingRewards: ReserveRewardInfo }> {\n const { address } = this;\n if (!address) {\n throw Error('Market must be initialized to call initialize.');\n }\n if (!this.getReserves().every((reserve) => reserve.stats)) {\n await this.loadReserves();\n }\n\n // Find the reserve\n const kaminoReserve = this.getReserveByMint(mint);\n\n if (!kaminoReserve) {\n throw Error(`Could not find reserve. ${mint}`);\n }\n\n const totalDepositAmount = lamportsToNumberDecimal(\n kaminoReserve.getLiquidityAvailableAmount(),\n kaminoReserve.stats.decimals\n );\n const totalBorrowAmount = lamportsToNumberDecimal(kaminoReserve.getBorrowedAmount(), kaminoReserve.stats.decimals);\n\n const collateralFarmAddress = kaminoReserve.state.farmCollateral;\n const debtFarmAddress = kaminoReserve.state.farmDebt;\n\n const result = {\n borrowingRewards: {\n rewardsPerSecond: new Decimal(0),\n rewardsRemaining: new Decimal(0),\n rewardApr: new Decimal(0),\n rewardMint: PublicKey.default,\n totalInvestmentUsd: new Decimal(0),\n rewardPrice: 0,\n },\n depositingRewards: {\n rewardsPerSecond: new Decimal(0),\n rewardsRemaining: new Decimal(0),\n rewardApr: new Decimal(0),\n rewardMint: PublicKey.default,\n totalInvestmentUsd: new Decimal(0),\n rewardPrice: 0,\n },\n };\n\n if (isNotNullPubkey(collateralFarmAddress)) {\n result.depositingRewards = await this.getRewardInfoForFarm(\n collateralFarmAddress,\n totalDepositAmount,\n getRewardPrice\n );\n }\n if (isNotNullPubkey(debtFarmAddress)) {\n result.depositingRewards = await this.getRewardInfoForFarm(debtFarmAddress, totalBorrowAmount, getRewardPrice);\n }\n\n return result;\n }\n\n async getRewardInfoForFarm(\n farmAddress: PublicKey,\n totalInvestmentUsd: Decimal,\n getRewardPrice: (mint: PublicKey) => Promise<number>\n ): Promise<ReserveRewardInfo> {\n const farmState = await FarmState.fetch(this.connection, farmAddress);\n if (!farmState) {\n throw Error(`Could not parse farm state. ${farmAddress}`);\n }\n const { token, rewardsAvailable, rewardScheduleCurve } = farmState.rewardInfos[0];\n // TODO: marius fix\n const rewardPerSecondLamports = rewardScheduleCurve.points[0].rewardPerTimeUnit.toNumber();\n const { mint, decimals: rewardDecimals } = token;\n const rewardPriceUsd = await getRewardPrice(mint);\n const rewardApr = this.calculateRewardAPR(\n rewardPerSecondLamports,\n rewardPriceUsd,\n totalInvestmentUsd,\n rewardDecimals.toNumber()\n );\n\n return {\n rewardsPerSecond: new Decimal(rewardPerSecondLamports).dividedBy(10 ** rewardDecimals.toNumber()),\n rewardsRemaining: new Decimal(rewardsAvailable.toNumber()).dividedBy(10 ** rewardDecimals.toNumber()),\n rewardApr: rewardsAvailable.toNumber() > 0 ? rewardApr : new Decimal(0),\n rewardMint: mint,\n totalInvestmentUsd,\n rewardPrice: rewardPriceUsd,\n };\n }\n\n calculateRewardAPR(\n rewardPerSecondLamports: number,\n rewardPriceUsd: number,\n totalInvestmentUsd: Decimal,\n rewardDecimals: number\n ): Decimal {\n const rewardsPerYear = new Decimal(rewardPerSecondLamports)\n .dividedBy(10 ** rewardDecimals)\n .times(365 * 24 * 60 * 60)\n .times(rewardPriceUsd);\n\n return rewardsPerYear.dividedBy(totalInvestmentUsd);\n }\n\n /**\n * Get all obligations for lending market, optionally filter by obligation tag\n * This function will likely require an RPC capable of returning more than the default 100k rows in a single scan\n *\n * @param tag\n */\n async getAllObligationsForMarket(tag?: number): Promise<KaminoObligation[]> {\n const filters = [\n {\n dataSize: Obligation.layout.span + 8,\n },\n {\n memcmp: {\n offset: 32,\n bytes: this.address,\n },\n },\n ];\n\n if (tag !== undefined) {\n filters.push({\n memcmp: {\n offset: 8,\n bytes: base58.encode(new BN(tag).toBuffer()),\n },\n });\n }\n\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n\n const [slot, obligations] = await Promise.all([\n this.connection.getSlot(),\n getProgramAccounts(this.connection, this.programId, {\n commitment: this.connection.commitment ?? 'processed',\n filters,\n dataSlice: { offset: 0, length: ObligationZP.layout.span + 8 }, // truncate the padding\n }),\n ]);\n\n return obligations.map((obligation) => {\n if (obligation.account === null) {\n throw new Error('Invalid account');\n }\n\n const obligationAccount = ObligationZP.decode(obligation.account.data);\n if (!obligationAccount) {\n throw Error('Could not parse obligation.');\n }\n\n KaminoObligation.addRatesForObligation(\n this,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates,\n slot\n );\n return new KaminoObligation(\n this,\n obligation.pubkey,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n });\n }\n\n /**\n * Get all obligations for lending market from an async generator filled with batches of 100 obligations each\n * @param tag\n * @example\n * const obligationsGenerator = market.batchGetAllObligationsForMarket();\n * for await (const obligations of obligationsGenerator) {\n * console.log('got a batch of # obligations:', obligations.length);\n * }\n */\n async *batchGetAllObligationsForMarket(tag?: number): AsyncGenerator<KaminoObligation[], void, unknown> {\n const filters = [\n {\n dataSize: Obligation.layout.span + 8,\n },\n {\n memcmp: {\n offset: 32,\n bytes: this.address,\n },\n },\n ];\n\n if (tag !== undefined) {\n filters.push({\n memcmp: {\n offset: 8,\n bytes: base58.encode(new BN(tag).toBuffer()),\n },\n });\n }\n\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n\n const [obligationPubkeys, slot] = await Promise.all([\n this.connection.getProgramAccounts(this.programId, {\n filters,\n dataSlice: { offset: 0, length: 0 },\n }),\n this.connection.getSlot(),\n ]);\n\n for (const batch of chunks(\n obligationPubkeys.map((x) => x.pubkey),\n 100\n )) {\n const obligationAccounts = await this.connection.getMultipleAccountsInfo(batch);\n const obligationsBatch: KaminoObligation[] = [];\n for (let i = 0; i < obligationAccounts.length; i++) {\n const obligation = obligationAccounts[i];\n const pubkey = batch[i];\n if (obligation === null) {\n continue;\n }\n\n const obligationAccount = Obligation.decode(obligation.data);\n\n if (!obligationAccount) {\n throw Error(`Could not decode obligation ${pubkey.toString()}`);\n }\n\n KaminoObligation.addRatesForObligation(\n this,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates,\n slot\n );\n obligationsBatch.push(\n new KaminoObligation(this, pubkey, obligationAccount, collateralExchangeRates, cumulativeBorrowRates)\n );\n }\n yield obligationsBatch;\n }\n }\n\n async getAllObligationsByTag(tag: number, market: PublicKey) {\n const [slot, obligations] = await Promise.all([\n this.connection.getSlot(),\n this.connection.getProgramAccounts(this.programId, {\n filters: [\n {\n dataSize: Obligation.layout.span + 8,\n },\n {\n memcmp: {\n offset: 8,\n bytes: base58.encode(new BN(tag).toBuffer()),\n },\n },\n {\n memcmp: {\n offset: 32,\n bytes: market.toBase58(),\n },\n },\n ],\n }),\n ]);\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n\n return obligations.map((obligation) => {\n if (obligation.account === null) {\n throw new Error('Invalid account');\n }\n if (!obligation.account.owner.equals(this.programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n\n const obligationAccount = Obligation.decode(obligation.account.data);\n\n if (!obligationAccount) {\n throw Error('Could not parse obligation.');\n }\n\n KaminoObligation.addRatesForObligation(\n this,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates,\n slot\n );\n\n return new KaminoObligation(\n this,\n obligation.pubkey,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n });\n }\n\n async getAllUserObligations(user: PublicKey) {\n const [currentSlot, obligations] = await Promise.all([\n this.connection.getSlot(),\n this.connection.getProgramAccounts(this.programId, {\n filters: [\n {\n dataSize: Obligation.layout.span + 8,\n },\n {\n memcmp: {\n offset: 0,\n bytes: bs58.encode(Obligation.discriminator),\n },\n },\n {\n memcmp: {\n offset: 64,\n bytes: user.toBase58(),\n },\n },\n {\n memcmp: {\n offset: 32,\n bytes: this.address,\n },\n },\n ],\n }),\n ]);\n\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n return obligations.map((obligation) => {\n if (obligation.account === null) {\n throw new Error('Invalid account');\n }\n if (!obligation.account.owner.equals(this.programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n\n const obligationAccount = Obligation.decode(obligation.account.data);\n\n if (!obligationAccount) {\n throw Error('Could not parse obligation.');\n }\n\n KaminoObligation.addRatesForObligation(\n this,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates,\n currentSlot\n );\n return new KaminoObligation(\n this,\n obligation.pubkey,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n });\n }\n\n async getUserObligationsByTag(tag: number, user: PublicKey): Promise<KaminoObligation[]> {\n const [currentSlot, obligations] = await Promise.all([\n this.connection.getSlot(),\n this.connection.getProgramAccounts(this.programId, {\n filters: [\n {\n dataSize: Obligation.layout.span + 8,\n },\n {\n memcmp: {\n offset: 8,\n bytes: base58.encode(new BN(tag).toBuffer()),\n },\n },\n {\n memcmp: {\n offset: 32,\n bytes: this.address,\n },\n },\n {\n memcmp: {\n offset: 64,\n bytes: user.toBase58(),\n },\n },\n ],\n }),\n ]);\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n return obligations.map((obligation) => {\n if (obligation.account === null) {\n throw new Error('Invalid account');\n }\n if (!obligation.account.owner.equals(this.programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n\n const obligationAccount = Obligation.decode(obligation.account.data);\n\n if (!obligationAccount) {\n throw Error('Could not parse obligation.');\n }\n KaminoObligation.addRatesForObligation(\n this,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates,\n currentSlot\n );\n return new KaminoObligation(\n this,\n obligation.pubkey,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n });\n }\n\n async getObligationByAddress(address: PublicKey) {\n if (!this.getReserves().every((reserve) => reserve.stats)) {\n await this.loadReserves();\n }\n return KaminoObligation.load(this, address);\n }\n\n async getMultipleObligationsByAddress(addresses: PublicKey[]) {\n return KaminoObligation.loadAll(this, addresses);\n }\n\n /**\n * Get the user metadata PDA and fetch and return the user metadata state if it exists\n * @return [address, userMetadataState] - The address of the user metadata PDA and the user metadata state, or null if it doesn't exist\n */\n async getUserMetadata(user: PublicKey): Promise<[PublicKey, UserMetadata | null]> {\n const [address, _bump] = userMetadataPda(user, this.programId);\n\n const userMetadata = await UserMetadata.fetch(this.connection, address, this.programId);\n\n return [address, userMetadata];\n }\n\n async getReferrerTokenStateForReserve(\n referrer: PublicKey,\n reserve: PublicKey\n ): Promise<[PublicKey, ReferrerTokenState | null]> {\n const [address, _bump] = referrerTokenStatePda(referrer, reserve, this.programId);\n\n const referrerTokenState = await ReferrerTokenState.fetch(this.connection, address, this.programId);\n\n return [address, referrerTokenState];\n }\n\n async getAllReferrerTokenStates(referrer: PublicKey) {\n const referrerTokenStates = await this.connection.getProgramAccounts(this.programId, {\n filters: [\n {\n dataSize: ReferrerTokenState.layout.span + 8,\n },\n {\n memcmp: {\n offset: 8,\n bytes: referrer.toBase58(),\n },\n },\n ],\n });\n\n const referrerTokenStatesForMints = new PubkeyHashMap<PublicKey, ReferrerTokenState>();\n\n referrerTokenStates.forEach((referrerTokenState) => {\n if (referrerTokenState.account === null) {\n throw new Error('Invalid account');\n }\n if (!referrerTokenState.account.owner.equals(this.programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n\n const referrerTokenStateDecoded = ReferrerTokenState.decode(referrerTokenState.account.data);\n\n if (!referrerTokenStateDecoded) {\n throw Error('Could not parse obligation.');\n }\n\n referrerTokenStatesForMints.set(referrerTokenStateDecoded.mint, referrerTokenStateDecoded);\n });\n\n return referrerTokenStatesForMints;\n }\n\n async getAllReferrerFeesUnclaimed(referrer: PublicKey) {\n const referrerTokenStatesForMints = await this.getAllReferrerTokenStates(referrer);\n\n const referrerFeesUnclaimedForMints = new PubkeyHashMap<PublicKey, Decimal>();\n\n for (const mint of referrerTokenStatesForMints.keys()) {\n referrerFeesUnclaimedForMints.set(\n mint,\n new Fraction(referrerTokenStatesForMints.get(mint)!.amountUnclaimedSf).toDecimal()\n );\n }\n\n return referrerFeesUnclaimedForMints;\n }\n\n async getReferrerFeesUnclaimedForReserve(referrer: PublicKey, reserve: KaminoReserve): Promise<Decimal> {\n const [, referrerTokenState] = await this.getReferrerTokenStateForReserve(referrer, reserve.address);\n return referrerTokenState ? new Fraction(referrerTokenState.amountUnclaimedSf).toDecimal() : new Decimal(0);\n }\n\n async getReferrerFeesCumulativeForReserve(referrer: PublicKey, reserve: KaminoReserve): Promise<Decimal> {\n const [, referrerTokenState] = await this.getReferrerTokenStateForReserve(referrer, reserve.address);\n return referrerTokenState ? new Fraction(referrerTokenState.amountCumulativeSf).toDecimal() : new Decimal(0);\n }\n\n async getAllReferrerFeesCumulative(referrer: PublicKey) {\n const referrerTokenStatesForMints = await this.getAllReferrerTokenStates(referrer);\n\n const referrerFeesCumulativeForMints = new PubkeyHashMap<PublicKey, Decimal>();\n\n for (const mint of referrerTokenStatesForMints.keys()) {\n referrerFeesCumulativeForMints.set(\n mint,\n new Fraction(referrerTokenStatesForMints.get(mint)!.amountUnclaimedSf).toDecimal()\n );\n }\n\n return referrerFeesCumulativeForMints;\n }\n\n async getReferrerUrl(baseUrl: string, referrer: PublicKey) {\n return baseUrl + this.encodeReferrer(referrer);\n }\n\n async getReferrerFromUrl(baseUrl: string, url: string) {\n return this.decodeReferrer(url.split(baseUrl)[1]);\n }\n\n async encodeReferrer(referrer: PublicKey) {\n return bs58.encode(referrer.toBuffer());\n }\n\n async decodeReferrer(encoded_referrer: string) {\n const referrer_buffer = bs58.decode(encoded_referrer);\n return new PublicKey(referrer_buffer.toString());\n }\n\n /**\n * Get the underlying connection passed when instantiating this market\n * @return connection\n */\n getConnection() {\n return this.connection;\n }\n\n /**\n * Get all Scope prices used by all the market reserves\n */\n async getAllScopePrices(oraclePrices?: OraclePrices): Promise<KaminoPrices> {\n if (!oraclePrices) {\n oraclePrices = await this.scope.getOraclePrices();\n }\n const spot: MintToPriceMap = {};\n const twaps: MintToPriceMap = {};\n for (const reserve of this.reserves.values()) {\n const tokenMint = reserve.getLiquidityMint().toString();\n const tokenName = reserve.getTokenSymbol();\n const oracle = reserve.state.config.tokenInfo.scopeConfiguration.priceFeed;\n const chain = reserve.state.config.tokenInfo.scopeConfiguration.priceChain;\n const twapChain = reserve.state.config.tokenInfo.scopeConfiguration.twapChain.filter((x) => x > 0);\n if (oracle && isNotNullPubkey(oracle) && chain && Scope.isScopeChainValid(chain)) {\n const spotPrice = await this.scope.getPriceFromChain(chain, oraclePrices);\n spot[tokenMint] = { price: spotPrice.price, name: tokenName };\n }\n if (oracle && isNotNullPubkey(oracle) && twapChain && Scope.isScopeChainValid(twapChain)) {\n const twap = await this.scope.getPriceFromChain(twapChain, oraclePrices);\n twaps[tokenMint] = { price: twap.price, name: tokenName };\n }\n }\n return { spot, twap: twaps };\n }\n\n /**\n * Get all Scope/Pyth/Switchboard prices used by all the market reserves\n */\n async getAllPrices(): Promise<KlendPrices> {\n const klendPrices: KlendPrices = {\n scope: { spot: {}, twap: {} },\n pyth: { spot: {}, twap: {} },\n switchboard: { spot: {}, twap: {} },\n };\n const allOracleAccounts = await getAllOracleAccounts(\n this.connection,\n this.getReserves().map((x) => x.state)\n );\n const pythCache = new PubkeyHashMap<PublicKey, PythPrices>();\n const switchboardCache = new PubkeyHashMap<PublicKey, CandidatePrice>();\n const scopeCache = new PubkeyHashMap<PublicKey, OraclePrices>();\n\n const switchboardV2 = await SwitchboardProgram.loadMainnet(this.connection);\n\n for (const reserve of this.reserves.values()) {\n const tokenMint = reserve.getLiquidityMint().toString();\n const tokenName = reserve.getTokenSymbol();\n const scopeOracle = reserve.state.config.tokenInfo.scopeConfiguration.priceFeed;\n const spotChain = reserve.state.config.tokenInfo.scopeConfiguration.priceChain;\n const twapChain = reserve.state.config.tokenInfo.scopeConfiguration.twapChain.filter((x) => x > 0);\n const pythOracle = reserve.state.config.tokenInfo.pythConfiguration.price;\n const switchboardSpotOracle = reserve.state.config.tokenInfo.switchboardConfiguration.priceAggregator;\n const switchboardTwapOracle = reserve.state.config.tokenInfo.switchboardConfiguration.twapAggregator;\n\n if (isNotNullPubkey(scopeOracle)) {\n const scopePrices = {\n spot: cacheOrGetScopePrice(scopeOracle, scopeCache, allOracleAccounts, spotChain),\n twap: cacheOrGetScopePrice(scopeOracle, scopeCache, allOracleAccounts, twapChain),\n };\n this.setPriceIfExist(klendPrices.scope, scopePrices.spot, scopePrices.twap, tokenMint, tokenName);\n }\n if (isNotNullPubkey(pythOracle)) {\n const pythPrices = cacheOrGetPythPrices(pythOracle, pythCache, allOracleAccounts);\n this.setPriceIfExist(klendPrices.pyth, pythPrices?.spot, pythPrices?.twap, tokenMint, tokenName);\n }\n if (isNotNullPubkey(switchboardSpotOracle)) {\n const switchboardPrices = {\n spot: cacheOrGetSwitchboardPrice(switchboardSpotOracle, switchboardCache, allOracleAccounts, switchboardV2),\n twap: isNotNullPubkey(switchboardTwapOracle)\n ? cacheOrGetSwitchboardPrice(switchboardTwapOracle, switchboardCache, allOracleAccounts, switchboardV2)\n : null,\n };\n this.setPriceIfExist(\n klendPrices.switchboard,\n switchboardPrices.spot,\n switchboardPrices.twap,\n tokenMint,\n tokenName\n );\n }\n }\n return klendPrices;\n }\n\n getCumulativeBorrowRatesByReserve(slot: number): Map<PublicKey, Decimal> {\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n for (const reserve of this.reserves.values()) {\n cumulativeBorrowRates.set(reserve.address, reserve.getEstimatedCumulativeBorrowRate(slot));\n }\n return cumulativeBorrowRates;\n }\n\n getCollateralExchangeRatesByReserve(slot: number): Map<PublicKey, Decimal> {\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n for (const reserve of this.reserves.values()) {\n collateralExchangeRates.set(\n reserve.address,\n reserve.getEstimatedCollateralExchangeRate(slot, this.state.referralFeeBps)\n );\n }\n return collateralExchangeRates;\n }\n\n private setPriceIfExist(\n prices: KaminoPrices,\n spot: CandidatePrice | null | undefined,\n twap: CandidatePrice | null | undefined,\n mint: string,\n tokenName: string\n ) {\n if (spot) {\n prices.spot[mint] = { price: spot.price, name: tokenName };\n }\n if (twap) {\n prices.twap[mint] = { price: twap.price, name: tokenName };\n }\n }\n}\n\nexport type KlendPrices = {\n scope: KaminoPrices;\n pyth: KaminoPrices;\n switchboard: KaminoPrices;\n};\n\nexport async function getReservesForMarket(\n marketAddress: PublicKey,\n connection: Connection,\n programId: PublicKey\n): Promise<Map<PublicKey, KaminoReserve>> {\n const reserves = await connection.getProgramAccounts(programId, {\n filters: [\n {\n dataSize: Reserve.layout.span + 8,\n },\n {\n memcmp: {\n offset: 32,\n bytes: marketAddress.toBase58(),\n },\n },\n ],\n });\n const deserializedReserves = reserves.map((reserve) => {\n if (reserve.account === null) {\n throw new Error(`Reserve account ${reserve.pubkey.toBase58()} does not exist`);\n }\n\n const reserveAccount = Reserve.decode(reserve.account.data);\n\n if (!reserveAccount) {\n throw Error(`Could not parse reserve ${reserve.pubkey.toBase58()}`);\n }\n return reserveAccount;\n });\n const allBuffers = reserves.map((reserve) => reserve.account);\n const reservesAndOracles = await getTokenOracleData(connection, deserializedReserves);\n const reservesByAddress = new PubkeyHashMap<PublicKey, KaminoReserve>();\n reservesAndOracles.forEach(([reserve, oracle], index) => {\n if (!oracle) {\n throw Error(`Could not find oracle for ${parseTokenSymbol(reserve.config.tokenInfo.name)} reserve`);\n }\n const kaminoReserve = KaminoReserve.initialize(\n allBuffers[index],\n reserves[index].pubkey,\n reserve,\n oracle,\n connection\n );\n reservesByAddress.set(kaminoReserve.address, kaminoReserve);\n });\n return reservesByAddress;\n}\n\nexport function getReservesActive(reserves: Map<PublicKey, KaminoReserve>): Map<PublicKey, KaminoReserve> {\n const reservesActive = new PubkeyHashMap<PublicKey, KaminoReserve>();\n for (const [key, reserve] of reserves) {\n if (reserve.state.config.status === 0) {\n reservesActive.set(key, reserve);\n }\n }\n return reservesActive;\n}\n\nexport async function _getReserveFromMintAndMarket(\n marketConfig: MarketConfigType,\n mint: string,\n connection: Connection,\n programId: PublicKey\n): Promise<[PublicKey, Reserve]> {\n const reserve = (\n await connection.getProgramAccounts(programId, {\n filters: [\n {\n dataSize: Reserve.layout.span + 8,\n },\n {\n memcmp: {\n offset: 32,\n bytes: marketConfig.lendingMarket,\n },\n },\n {\n memcmp: {\n offset: 64,\n bytes: mint,\n },\n },\n ],\n })\n )[0];\n\n if (reserve.account === null) {\n throw new Error('Invalid account');\n }\n if (!reserve.account.owner.equals(programId)) {\n throw new Error(\"Account doesn't belong to this program\");\n }\n\n const reserveAccount = Reserve.decode(reserve.account.data);\n\n if (!reserveAccount) {\n throw Error('Could not parse reserve.');\n }\n\n return [reserve.pubkey, reserveAccount];\n}\n\nconst lamportsToNumberDecimal = (amount: Decimal.Value, decimals: number): Decimal => {\n const factor = 10 ** decimals;\n return new Decimal(amount).div(factor);\n};\n"]}
|
|
1
|
+
{"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/classes/market.ts"],"names":[],"mappings":"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","sourcesContent":["import { Connection, PublicKey } from '@solana/web3.js';\nimport { KaminoObligation } from './obligation';\nimport { KaminoReserve } from './reserve';\nimport { LendingMarket, Obligation, UserMetadata, ReferrerTokenState, Reserve } from '../idl_codegen/accounts';\nimport { MarketConfigType } from './shared';\nimport {\n lendingMarketAuthPda,\n ObligationType,\n referrerTokenStatePda,\n userMetadataPda,\n getTokenOracleData,\n VanillaObligation,\n LendingObligation,\n MultiplyObligation,\n LeverageObligation,\n isNotNullPubkey,\n getAllOracleAccounts,\n PythPrices,\n cacheOrGetScopePrice,\n cacheOrGetPythPrices,\n cacheOrGetSwitchboardPrice,\n PubkeyHashMap,\n CandidatePrice,\n} from '../utils';\nimport base58 from 'bs58';\nimport { BN } from '@coral-xyz/anchor';\nimport Decimal from 'decimal.js';\nimport { FarmState } from '@hubbleprotocol/farms-sdk';\nimport { PROGRAM_ID } from '../idl_codegen/programId';\nimport bs58 from 'bs58';\nimport { OraclePrices, Scope } from '@hubbleprotocol/scope-sdk';\nimport { Fraction } from './fraction';\nimport { chunks, KaminoPrices, MintToPriceMap } from '@hubbleprotocol/kamino-sdk';\nimport { parseTokenSymbol } from './utils';\nimport SwitchboardProgram from '@switchboard-xyz/sbv2-lite';\nimport { ObligationZP } from '../idl_codegen/zero_padding';\n\nexport interface ReserveRewardInfo {\n rewardsPerSecond: Decimal; // not lamport\n rewardsRemaining: Decimal; // not lamport\n rewardApr: Decimal;\n rewardMint: PublicKey;\n totalInvestmentUsd: Decimal;\n rewardPrice: number;\n}\n\nexport class KaminoMarket {\n private readonly connection: Connection;\n\n readonly address: string;\n\n state: LendingMarket;\n\n reserves: Map<PublicKey, KaminoReserve>;\n\n reservesActive: Map<PublicKey, KaminoReserve>;\n\n readonly programId: PublicKey;\n\n scope: Scope;\n\n private constructor(\n connection: Connection,\n state: LendingMarket,\n marketAddress: string,\n reserves: Map<PublicKey, KaminoReserve>,\n scope: Scope,\n programId: PublicKey = PROGRAM_ID\n ) {\n this.address = marketAddress;\n this.connection = connection;\n this.state = state;\n this.reserves = reserves;\n this.reservesActive = getReservesActive(this.reserves);\n this.programId = programId;\n this.scope = scope;\n }\n\n /**\n * Load a new market with all of its associated reserves\n * @param connection\n * @param marketAddress\n * @param programId\n * @param setupLocalTest\n */\n static async load(\n connection: Connection,\n marketAddress: PublicKey,\n programId: PublicKey = PROGRAM_ID,\n setupLocalTest: boolean = false,\n withReserves: boolean = true\n ) {\n const market = await LendingMarket.fetch(connection, marketAddress, programId);\n\n if (market === null) {\n return null;\n }\n let scope: Scope;\n if (!setupLocalTest) {\n scope = new Scope('mainnet-beta', connection);\n } else {\n scope = new Scope('localnet', connection);\n }\n\n const reserves = withReserves\n ? await getReservesForMarket(marketAddress, connection, programId)\n : new Map<PublicKey, KaminoReserve>();\n\n return new KaminoMarket(connection, market, marketAddress.toString(), reserves, scope, programId);\n }\n\n async reload(): Promise<void> {\n const market = await LendingMarket.fetch(this.connection, this.getAddress(), this.programId);\n if (market === null) {\n return;\n }\n\n this.state = market;\n this.reserves = await getReservesForMarket(this.getAddress(), this.connection, this.programId);\n this.reservesActive = getReservesActive(this.reserves);\n }\n\n /**\n * Get the address of this market\n * @return market address public key\n */\n getAddress(): PublicKey {\n return new PublicKey(this.address);\n }\n\n /**\n * Get a list of reserves for this market\n */\n getReserves(): Array<KaminoReserve> {\n return [...this.reserves.values()];\n }\n\n getElevationGroup(elevationGroup: number) {\n return this.state.elevationGroups[elevationGroup - 1];\n }\n\n /**\n * Get the authority PDA of this market\n * @return market authority public key\n */\n getLendingMarketAuthority(): PublicKey {\n return lendingMarketAuthPda(this.getAddress(), this.programId)[0];\n }\n\n async getObligationDepositByWallet(\n owner: PublicKey,\n mint: PublicKey,\n obligationType: ObligationType\n ): Promise<Decimal> {\n const obligation = await this.getObligationByWallet(owner, obligationType);\n return obligation?.getDepositByMint(mint)?.amount ?? new Decimal(0);\n }\n\n async getObligationBorrowByWallet(\n owner: PublicKey,\n mint: PublicKey,\n obligationType: ObligationType\n ): Promise<Decimal> {\n const obligation = await this.getObligationByWallet(owner, obligationType);\n return obligation?.getBorrowByMint(mint)?.amount ?? new Decimal(0);\n }\n\n getTotalDepositTVL(): Decimal {\n const tvl = new Decimal(0);\n for (const reserve of this.reserves.values()) {\n tvl.add(reserve.getDepositTvl());\n }\n return tvl;\n }\n\n getTotalBorrowTVL(): Decimal {\n const tvl = new Decimal(0);\n for (const reserve of this.reserves.values()) {\n tvl.add(reserve.getBorrowTvl());\n }\n return tvl;\n }\n\n getMaxLeverageForPair(collTokenMint: PublicKey, debtTokenMint: PublicKey): number {\n const { maxLtv: maxCollateralLtv, borrowFactor } = this.getMaxAndLiquidationLtvAndBorrowFactorForPair(\n collTokenMint,\n debtTokenMint\n );\n\n const maxLeverage =\n // const ltv = (coll * ltv_factor) / (debt * borrow_factor);\n 1 / (1 - (maxCollateralLtv * 100) / (borrowFactor * 100));\n\n return maxLeverage;\n }\n\n getMaxAndLiquidationLtvAndBorrowFactorForPair(\n collTokenMint: PublicKey,\n debtTokenMint: PublicKey\n ): { maxLtv: number; liquidationLtv: number; borrowFactor: number } {\n const collReserve: KaminoReserve | undefined = this.getReserveByMint(collTokenMint);\n const debtReserve: KaminoReserve | undefined = this.getReserveByMint(debtTokenMint);\n\n if (!collReserve || !debtReserve) {\n throw Error('Could not find one of the reserves.');\n }\n\n const groupsColl = new Set(collReserve.state.config.elevationGroups);\n const groupsDebt = new Set(debtReserve.state.config.elevationGroups);\n const commonElevationGroups = [...groupsColl].filter((item) => groupsDebt.has(item) && item !== 0);\n\n // Ltv factor for coll token\n const maxCollateralLtv =\n commonElevationGroups.length === 0\n ? collReserve.state.config.loanToValuePct\n : this.state.elevationGroups\n .filter((e) => commonElevationGroups.includes(e.id))\n .reduce((acc, elem) => Math.max(acc, elem.ltvPct), 0);\n\n const liquidationLtv =\n commonElevationGroups.length === 0\n ? collReserve.state.config.liquidationThresholdPct\n : this.state.elevationGroups\n .filter((e) => commonElevationGroups.includes(e.id))\n .reduce((acc, elem) => Math.max(acc, elem.liquidationThresholdPct), 0);\n\n const borrowFactor =\n commonElevationGroups.length === 0 ? debtReserve?.state.config.borrowFactorPct.toNumber() / 100 : 1;\n\n return { maxLtv: maxCollateralLtv / 100, liquidationLtv: liquidationLtv / 100, borrowFactor };\n }\n\n async getTotalProductTvl(\n productType: ObligationType\n ): Promise<{ tvl: Decimal; borrows: Decimal; deposits: Decimal; avgLeverage: Decimal }> {\n let obligations = (await this.getAllObligationsForMarket(productType.toArgs().tag)).filter(\n (obligation) =>\n obligation.refreshedStats.userTotalBorrow.gt(0) || obligation.refreshedStats.userTotalDeposit.gt(0)\n );\n\n switch (productType.toArgs().tag) {\n case VanillaObligation.tag: {\n break;\n }\n case LendingObligation.tag: {\n const mint = productType.toArgs().seed1;\n obligations = obligations.filter((obligation) => obligation.getDepositByMint(mint) !== undefined);\n break;\n }\n case MultiplyObligation.tag:\n case LeverageObligation.tag: {\n const collMint = productType.toArgs().seed1;\n const debtMint = productType.toArgs().seed2;\n obligations = obligations.filter(\n (obligation) =>\n obligation.getDepositByMint(collMint) !== undefined && obligation.getBorrowByMint(debtMint) !== undefined\n );\n break;\n }\n default:\n throw new Error('Invalid obligation type');\n }\n\n const deposits = obligations.reduce(\n (acc, obligation) => acc.plus(obligation.refreshedStats.userTotalDeposit),\n new Decimal(0)\n );\n const borrows = obligations.reduce(\n (acc, obligation) => acc.plus(obligation.refreshedStats.userTotalBorrow),\n new Decimal(0)\n );\n const avgLeverage = obligations.reduce(\n (acc, obligations) => acc.plus(obligations.refreshedStats.leverage),\n new Decimal(0)\n );\n return { tvl: deposits.sub(borrows), deposits, borrows, avgLeverage: avgLeverage.div(obligations.length) };\n }\n\n /**\n *\n * @returns Number of active obligations in the market\n */\n async getNumberOfObligations() {\n return (await this.getAllObligationsForMarket())\n .filter(\n (obligation) =>\n obligation.refreshedStats.userTotalBorrow.gt(0) || obligation.refreshedStats.userTotalDeposit.gt(0)\n )\n .reduce((acc, _obligation) => acc + 1, 0);\n }\n\n async getObligationByWallet(publicKey: PublicKey, obligationType: ObligationType): Promise<KaminoObligation | null> {\n const { address } = this;\n if (!address) {\n throw Error('Market must be initialized to call initialize.');\n }\n const obligationAddress = obligationType.toPda(this.getAddress(), publicKey);\n return KaminoObligation.load(this, obligationAddress);\n }\n\n async loadReserves() {\n const addresses = [...this.reserves.keys()];\n const reserveAccounts = await this.connection.getMultipleAccountsInfo(addresses, 'processed');\n const deserializedReserves = reserveAccounts.map((reserve, i) => {\n if (reserve === null) {\n // maybe reuse old here\n throw new Error(`Reserve account ${addresses[i].toBase58()} was not found`);\n }\n const reserveAccount = Reserve.decode(reserve.data);\n if (!reserveAccount) {\n throw Error(`Could not parse reserve ${addresses[i].toBase58()}`);\n }\n return reserveAccount;\n });\n const reservesAndOracles = await getTokenOracleData(this.connection, deserializedReserves);\n const kaminoReserves = new PubkeyHashMap<PublicKey, KaminoReserve>();\n reservesAndOracles.forEach(([reserve, oracle], index) => {\n if (!oracle) {\n throw Error(`Could not find oracle for ${parseTokenSymbol(reserve.config.tokenInfo.name)} reserve`);\n }\n const kaminoReserve = KaminoReserve.initialize(\n reserveAccounts[index]!,\n addresses[index],\n reserve,\n oracle,\n this.connection\n );\n kaminoReserves.set(kaminoReserve.address, kaminoReserve);\n });\n this.reserves = kaminoReserves;\n this.reservesActive = getReservesActive(this.reserves);\n }\n\n async refreshAll() {\n const promises = [this.getReserves().every((reserve) => reserve.stats) ? this.loadReserves() : null].filter(\n (x) => x\n );\n\n await Promise.all(promises);\n\n this.reservesActive = getReservesActive(this.reserves);\n }\n\n getReserveByAddress(address: PublicKey) {\n return this.reserves.get(address);\n }\n\n getReserveByMint(address: PublicKey) {\n for (const reserve of this.reserves.values()) {\n if (reserve.getLiquidityMint().equals(address)) {\n return reserve;\n }\n }\n return undefined;\n }\n\n getReserveBySymbol(symbol: string) {\n for (const reserve of this.reserves.values()) {\n if (reserve.symbol === symbol) {\n return reserve;\n }\n }\n return undefined;\n }\n\n getReserveMintBySymbol(symbol: string) {\n return this.getReserveBySymbol(symbol)?.getLiquidityMint();\n }\n\n async getReserveFarmInfo(\n mint: PublicKey,\n getRewardPrice: (mint: PublicKey) => Promise<number>\n ): Promise<{ borrowingRewards: ReserveRewardInfo; depositingRewards: ReserveRewardInfo }> {\n const { address } = this;\n if (!address) {\n throw Error('Market must be initialized to call initialize.');\n }\n if (!this.getReserves().every((reserve) => reserve.stats)) {\n await this.loadReserves();\n }\n\n // Find the reserve\n const kaminoReserve = this.getReserveByMint(mint);\n\n if (!kaminoReserve) {\n throw Error(`Could not find reserve. ${mint}`);\n }\n\n const totalDepositAmount = lamportsToNumberDecimal(\n kaminoReserve.getLiquidityAvailableAmount(),\n kaminoReserve.stats.decimals\n );\n const totalBorrowAmount = lamportsToNumberDecimal(kaminoReserve.getBorrowedAmount(), kaminoReserve.stats.decimals);\n\n const collateralFarmAddress = kaminoReserve.state.farmCollateral;\n const debtFarmAddress = kaminoReserve.state.farmDebt;\n\n const result = {\n borrowingRewards: {\n rewardsPerSecond: new Decimal(0),\n rewardsRemaining: new Decimal(0),\n rewardApr: new Decimal(0),\n rewardMint: PublicKey.default,\n totalInvestmentUsd: new Decimal(0),\n rewardPrice: 0,\n },\n depositingRewards: {\n rewardsPerSecond: new Decimal(0),\n rewardsRemaining: new Decimal(0),\n rewardApr: new Decimal(0),\n rewardMint: PublicKey.default,\n totalInvestmentUsd: new Decimal(0),\n rewardPrice: 0,\n },\n };\n\n if (isNotNullPubkey(collateralFarmAddress)) {\n result.depositingRewards = await this.getRewardInfoForFarm(\n collateralFarmAddress,\n totalDepositAmount,\n getRewardPrice\n );\n }\n if (isNotNullPubkey(debtFarmAddress)) {\n result.depositingRewards = await this.getRewardInfoForFarm(debtFarmAddress, totalBorrowAmount, getRewardPrice);\n }\n\n return result;\n }\n\n async getRewardInfoForFarm(\n farmAddress: PublicKey,\n totalInvestmentUsd: Decimal,\n getRewardPrice: (mint: PublicKey) => Promise<number>\n ): Promise<ReserveRewardInfo> {\n const farmState = await FarmState.fetch(this.connection, farmAddress);\n if (!farmState) {\n throw Error(`Could not parse farm state. ${farmAddress}`);\n }\n const { token, rewardsAvailable, rewardScheduleCurve } = farmState.rewardInfos[0];\n // TODO: marius fix\n const rewardPerSecondLamports = rewardScheduleCurve.points[0].rewardPerTimeUnit.toNumber();\n const { mint, decimals: rewardDecimals } = token;\n const rewardPriceUsd = await getRewardPrice(mint);\n const rewardApr = this.calculateRewardAPR(\n rewardPerSecondLamports,\n rewardPriceUsd,\n totalInvestmentUsd,\n rewardDecimals.toNumber()\n );\n\n return {\n rewardsPerSecond: new Decimal(rewardPerSecondLamports).dividedBy(10 ** rewardDecimals.toNumber()),\n rewardsRemaining: new Decimal(rewardsAvailable.toNumber()).dividedBy(10 ** rewardDecimals.toNumber()),\n rewardApr: rewardsAvailable.toNumber() > 0 ? rewardApr : new Decimal(0),\n rewardMint: mint,\n totalInvestmentUsd,\n rewardPrice: rewardPriceUsd,\n };\n }\n\n calculateRewardAPR(\n rewardPerSecondLamports: number,\n rewardPriceUsd: number,\n totalInvestmentUsd: Decimal,\n rewardDecimals: number\n ): Decimal {\n const rewardsPerYear = new Decimal(rewardPerSecondLamports)\n .dividedBy(10 ** rewardDecimals)\n .times(365 * 24 * 60 * 60)\n .times(rewardPriceUsd);\n\n return rewardsPerYear.dividedBy(totalInvestmentUsd);\n }\n\n /**\n * Get all obligations for lending market, optionally filter by obligation tag\n * This function will likely require an RPC capable of returning more than the default 100k rows in a single scan\n *\n * @param tag\n */\n async getAllObligationsForMarket(tag?: number): Promise<KaminoObligation[]> {\n const { getProgramAccounts } = await import('../utils/rpc');\n const filters = [\n {\n dataSize: Obligation.layout.span + 8,\n },\n {\n memcmp: {\n offset: 32,\n bytes: this.address,\n },\n },\n ];\n\n if (tag !== undefined) {\n filters.push({\n memcmp: {\n offset: 8,\n bytes: base58.encode(new BN(tag).toBuffer()),\n },\n });\n }\n\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n\n const [slot, obligations] = await Promise.all([\n this.connection.getSlot(),\n getProgramAccounts(this.connection, this.programId, {\n commitment: this.connection.commitment ?? 'processed',\n filters,\n dataSlice: { offset: 0, length: ObligationZP.layout.span + 8 }, // truncate the padding\n }),\n ]);\n\n return obligations.map((obligation) => {\n if (obligation.account === null) {\n throw new Error('Invalid account');\n }\n\n const obligationAccount = ObligationZP.decode(obligation.account.data);\n if (!obligationAccount) {\n throw Error('Could not parse obligation.');\n }\n\n KaminoObligation.addRatesForObligation(\n this,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates,\n slot\n );\n return new KaminoObligation(\n this,\n obligation.pubkey,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n });\n }\n\n /**\n * Get all obligations for lending market from an async generator filled with batches of 100 obligations each\n * @param tag\n * @example\n * const obligationsGenerator = market.batchGetAllObligationsForMarket();\n * for await (const obligations of obligationsGenerator) {\n * console.log('got a batch of # obligations:', obligations.length);\n * }\n */\n async *batchGetAllObligationsForMarket(tag?: number): AsyncGenerator<KaminoObligation[], void, unknown> {\n const filters = [\n {\n dataSize: Obligation.layout.span + 8,\n },\n {\n memcmp: {\n offset: 32,\n bytes: this.address,\n },\n },\n ];\n\n if (tag !== undefined) {\n filters.push({\n memcmp: {\n offset: 8,\n bytes: base58.encode(new BN(tag).toBuffer()),\n },\n });\n }\n\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n\n const [obligationPubkeys, slot] = await Promise.all([\n this.connection.getProgramAccounts(this.programId, {\n filters,\n dataSlice: { offset: 0, length: 0 },\n }),\n this.connection.getSlot(),\n ]);\n\n for (const batch of chunks(\n obligationPubkeys.map((x) => x.pubkey),\n 100\n )) {\n const obligationAccounts = await this.connection.getMultipleAccountsInfo(batch);\n const obligationsBatch: KaminoObligation[] = [];\n for (let i = 0; i < obligationAccounts.length; i++) {\n const obligation = obligationAccounts[i];\n const pubkey = batch[i];\n if (obligation === null) {\n continue;\n }\n\n const obligationAccount = Obligation.decode(obligation.data);\n\n if (!obligationAccount) {\n throw Error(`Could not decode obligation ${pubkey.toString()}`);\n }\n\n KaminoObligation.addRatesForObligation(\n this,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates,\n slot\n );\n obligationsBatch.push(\n new KaminoObligation(this, pubkey, obligationAccount, collateralExchangeRates, cumulativeBorrowRates)\n );\n }\n yield obligationsBatch;\n }\n }\n\n async getAllObligationsByTag(tag: number, market: PublicKey) {\n const [slot, obligations] = await Promise.all([\n this.connection.getSlot(),\n this.connection.getProgramAccounts(this.programId, {\n filters: [\n {\n dataSize: Obligation.layout.span + 8,\n },\n {\n memcmp: {\n offset: 8,\n bytes: base58.encode(new BN(tag).toBuffer()),\n },\n },\n {\n memcmp: {\n offset: 32,\n bytes: market.toBase58(),\n },\n },\n ],\n }),\n ]);\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n\n return obligations.map((obligation) => {\n if (obligation.account === null) {\n throw new Error('Invalid account');\n }\n if (!obligation.account.owner.equals(this.programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n\n const obligationAccount = Obligation.decode(obligation.account.data);\n\n if (!obligationAccount) {\n throw Error('Could not parse obligation.');\n }\n\n KaminoObligation.addRatesForObligation(\n this,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates,\n slot\n );\n\n return new KaminoObligation(\n this,\n obligation.pubkey,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n });\n }\n\n async getAllUserObligations(user: PublicKey) {\n const [currentSlot, obligations] = await Promise.all([\n this.connection.getSlot(),\n this.connection.getProgramAccounts(this.programId, {\n filters: [\n {\n dataSize: Obligation.layout.span + 8,\n },\n {\n memcmp: {\n offset: 0,\n bytes: bs58.encode(Obligation.discriminator),\n },\n },\n {\n memcmp: {\n offset: 64,\n bytes: user.toBase58(),\n },\n },\n {\n memcmp: {\n offset: 32,\n bytes: this.address,\n },\n },\n ],\n }),\n ]);\n\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n return obligations.map((obligation) => {\n if (obligation.account === null) {\n throw new Error('Invalid account');\n }\n if (!obligation.account.owner.equals(this.programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n\n const obligationAccount = Obligation.decode(obligation.account.data);\n\n if (!obligationAccount) {\n throw Error('Could not parse obligation.');\n }\n\n KaminoObligation.addRatesForObligation(\n this,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates,\n currentSlot\n );\n return new KaminoObligation(\n this,\n obligation.pubkey,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n });\n }\n\n async getUserObligationsByTag(tag: number, user: PublicKey): Promise<KaminoObligation[]> {\n const [currentSlot, obligations] = await Promise.all([\n this.connection.getSlot(),\n this.connection.getProgramAccounts(this.programId, {\n filters: [\n {\n dataSize: Obligation.layout.span + 8,\n },\n {\n memcmp: {\n offset: 8,\n bytes: base58.encode(new BN(tag).toBuffer()),\n },\n },\n {\n memcmp: {\n offset: 32,\n bytes: this.address,\n },\n },\n {\n memcmp: {\n offset: 64,\n bytes: user.toBase58(),\n },\n },\n ],\n }),\n ]);\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n return obligations.map((obligation) => {\n if (obligation.account === null) {\n throw new Error('Invalid account');\n }\n if (!obligation.account.owner.equals(this.programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n\n const obligationAccount = Obligation.decode(obligation.account.data);\n\n if (!obligationAccount) {\n throw Error('Could not parse obligation.');\n }\n KaminoObligation.addRatesForObligation(\n this,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates,\n currentSlot\n );\n return new KaminoObligation(\n this,\n obligation.pubkey,\n obligationAccount,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n });\n }\n\n async getObligationByAddress(address: PublicKey) {\n if (!this.getReserves().every((reserve) => reserve.stats)) {\n await this.loadReserves();\n }\n return KaminoObligation.load(this, address);\n }\n\n async getMultipleObligationsByAddress(addresses: PublicKey[]) {\n return KaminoObligation.loadAll(this, addresses);\n }\n\n /**\n * Get the user metadata PDA and fetch and return the user metadata state if it exists\n * @return [address, userMetadataState] - The address of the user metadata PDA and the user metadata state, or null if it doesn't exist\n */\n async getUserMetadata(user: PublicKey): Promise<[PublicKey, UserMetadata | null]> {\n const [address, _bump] = userMetadataPda(user, this.programId);\n\n const userMetadata = await UserMetadata.fetch(this.connection, address, this.programId);\n\n return [address, userMetadata];\n }\n\n async getReferrerTokenStateForReserve(\n referrer: PublicKey,\n reserve: PublicKey\n ): Promise<[PublicKey, ReferrerTokenState | null]> {\n const [address, _bump] = referrerTokenStatePda(referrer, reserve, this.programId);\n\n const referrerTokenState = await ReferrerTokenState.fetch(this.connection, address, this.programId);\n\n return [address, referrerTokenState];\n }\n\n async getAllReferrerTokenStates(referrer: PublicKey) {\n const referrerTokenStates = await this.connection.getProgramAccounts(this.programId, {\n filters: [\n {\n dataSize: ReferrerTokenState.layout.span + 8,\n },\n {\n memcmp: {\n offset: 8,\n bytes: referrer.toBase58(),\n },\n },\n ],\n });\n\n const referrerTokenStatesForMints = new PubkeyHashMap<PublicKey, ReferrerTokenState>();\n\n referrerTokenStates.forEach((referrerTokenState) => {\n if (referrerTokenState.account === null) {\n throw new Error('Invalid account');\n }\n if (!referrerTokenState.account.owner.equals(this.programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n\n const referrerTokenStateDecoded = ReferrerTokenState.decode(referrerTokenState.account.data);\n\n if (!referrerTokenStateDecoded) {\n throw Error('Could not parse obligation.');\n }\n\n referrerTokenStatesForMints.set(referrerTokenStateDecoded.mint, referrerTokenStateDecoded);\n });\n\n return referrerTokenStatesForMints;\n }\n\n async getAllReferrerFeesUnclaimed(referrer: PublicKey) {\n const referrerTokenStatesForMints = await this.getAllReferrerTokenStates(referrer);\n\n const referrerFeesUnclaimedForMints = new PubkeyHashMap<PublicKey, Decimal>();\n\n for (const mint of referrerTokenStatesForMints.keys()) {\n referrerFeesUnclaimedForMints.set(\n mint,\n new Fraction(referrerTokenStatesForMints.get(mint)!.amountUnclaimedSf).toDecimal()\n );\n }\n\n return referrerFeesUnclaimedForMints;\n }\n\n async getReferrerFeesUnclaimedForReserve(referrer: PublicKey, reserve: KaminoReserve): Promise<Decimal> {\n const [, referrerTokenState] = await this.getReferrerTokenStateForReserve(referrer, reserve.address);\n return referrerTokenState ? new Fraction(referrerTokenState.amountUnclaimedSf).toDecimal() : new Decimal(0);\n }\n\n async getReferrerFeesCumulativeForReserve(referrer: PublicKey, reserve: KaminoReserve): Promise<Decimal> {\n const [, referrerTokenState] = await this.getReferrerTokenStateForReserve(referrer, reserve.address);\n return referrerTokenState ? new Fraction(referrerTokenState.amountCumulativeSf).toDecimal() : new Decimal(0);\n }\n\n async getAllReferrerFeesCumulative(referrer: PublicKey) {\n const referrerTokenStatesForMints = await this.getAllReferrerTokenStates(referrer);\n\n const referrerFeesCumulativeForMints = new PubkeyHashMap<PublicKey, Decimal>();\n\n for (const mint of referrerTokenStatesForMints.keys()) {\n referrerFeesCumulativeForMints.set(\n mint,\n new Fraction(referrerTokenStatesForMints.get(mint)!.amountUnclaimedSf).toDecimal()\n );\n }\n\n return referrerFeesCumulativeForMints;\n }\n\n async getReferrerUrl(baseUrl: string, referrer: PublicKey) {\n return baseUrl + this.encodeReferrer(referrer);\n }\n\n async getReferrerFromUrl(baseUrl: string, url: string) {\n return this.decodeReferrer(url.split(baseUrl)[1]);\n }\n\n async encodeReferrer(referrer: PublicKey) {\n return bs58.encode(referrer.toBuffer());\n }\n\n async decodeReferrer(encoded_referrer: string) {\n const referrer_buffer = bs58.decode(encoded_referrer);\n return new PublicKey(referrer_buffer.toString());\n }\n\n /**\n * Get the underlying connection passed when instantiating this market\n * @return connection\n */\n getConnection() {\n return this.connection;\n }\n\n /**\n * Get all Scope prices used by all the market reserves\n */\n async getAllScopePrices(oraclePrices?: OraclePrices): Promise<KaminoPrices> {\n if (!oraclePrices) {\n oraclePrices = await this.scope.getOraclePrices();\n }\n const spot: MintToPriceMap = {};\n const twaps: MintToPriceMap = {};\n for (const reserve of this.reserves.values()) {\n const tokenMint = reserve.getLiquidityMint().toString();\n const tokenName = reserve.getTokenSymbol();\n const oracle = reserve.state.config.tokenInfo.scopeConfiguration.priceFeed;\n const chain = reserve.state.config.tokenInfo.scopeConfiguration.priceChain;\n const twapChain = reserve.state.config.tokenInfo.scopeConfiguration.twapChain.filter((x) => x > 0);\n if (oracle && isNotNullPubkey(oracle) && chain && Scope.isScopeChainValid(chain)) {\n const spotPrice = await this.scope.getPriceFromChain(chain, oraclePrices);\n spot[tokenMint] = { price: spotPrice.price, name: tokenName };\n }\n if (oracle && isNotNullPubkey(oracle) && twapChain && Scope.isScopeChainValid(twapChain)) {\n const twap = await this.scope.getPriceFromChain(twapChain, oraclePrices);\n twaps[tokenMint] = { price: twap.price, name: tokenName };\n }\n }\n return { spot, twap: twaps };\n }\n\n /**\n * Get all Scope/Pyth/Switchboard prices used by all the market reserves\n */\n async getAllPrices(): Promise<KlendPrices> {\n const klendPrices: KlendPrices = {\n scope: { spot: {}, twap: {} },\n pyth: { spot: {}, twap: {} },\n switchboard: { spot: {}, twap: {} },\n };\n const allOracleAccounts = await getAllOracleAccounts(\n this.connection,\n this.getReserves().map((x) => x.state)\n );\n const pythCache = new PubkeyHashMap<PublicKey, PythPrices>();\n const switchboardCache = new PubkeyHashMap<PublicKey, CandidatePrice>();\n const scopeCache = new PubkeyHashMap<PublicKey, OraclePrices>();\n\n const switchboardV2 = await SwitchboardProgram.loadMainnet(this.connection);\n\n for (const reserve of this.reserves.values()) {\n const tokenMint = reserve.getLiquidityMint().toString();\n const tokenName = reserve.getTokenSymbol();\n const scopeOracle = reserve.state.config.tokenInfo.scopeConfiguration.priceFeed;\n const spotChain = reserve.state.config.tokenInfo.scopeConfiguration.priceChain;\n const twapChain = reserve.state.config.tokenInfo.scopeConfiguration.twapChain.filter((x) => x > 0);\n const pythOracle = reserve.state.config.tokenInfo.pythConfiguration.price;\n const switchboardSpotOracle = reserve.state.config.tokenInfo.switchboardConfiguration.priceAggregator;\n const switchboardTwapOracle = reserve.state.config.tokenInfo.switchboardConfiguration.twapAggregator;\n\n if (isNotNullPubkey(scopeOracle)) {\n const scopePrices = {\n spot: cacheOrGetScopePrice(scopeOracle, scopeCache, allOracleAccounts, spotChain),\n twap: cacheOrGetScopePrice(scopeOracle, scopeCache, allOracleAccounts, twapChain),\n };\n this.setPriceIfExist(klendPrices.scope, scopePrices.spot, scopePrices.twap, tokenMint, tokenName);\n }\n if (isNotNullPubkey(pythOracle)) {\n const pythPrices = cacheOrGetPythPrices(pythOracle, pythCache, allOracleAccounts);\n this.setPriceIfExist(klendPrices.pyth, pythPrices?.spot, pythPrices?.twap, tokenMint, tokenName);\n }\n if (isNotNullPubkey(switchboardSpotOracle)) {\n const switchboardPrices = {\n spot: cacheOrGetSwitchboardPrice(switchboardSpotOracle, switchboardCache, allOracleAccounts, switchboardV2),\n twap: isNotNullPubkey(switchboardTwapOracle)\n ? cacheOrGetSwitchboardPrice(switchboardTwapOracle, switchboardCache, allOracleAccounts, switchboardV2)\n : null,\n };\n this.setPriceIfExist(\n klendPrices.switchboard,\n switchboardPrices.spot,\n switchboardPrices.twap,\n tokenMint,\n tokenName\n );\n }\n }\n return klendPrices;\n }\n\n getCumulativeBorrowRatesByReserve(slot: number): Map<PublicKey, Decimal> {\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n for (const reserve of this.reserves.values()) {\n cumulativeBorrowRates.set(reserve.address, reserve.getEstimatedCumulativeBorrowRate(slot));\n }\n return cumulativeBorrowRates;\n }\n\n getCollateralExchangeRatesByReserve(slot: number): Map<PublicKey, Decimal> {\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n for (const reserve of this.reserves.values()) {\n collateralExchangeRates.set(\n reserve.address,\n reserve.getEstimatedCollateralExchangeRate(slot, this.state.referralFeeBps)\n );\n }\n return collateralExchangeRates;\n }\n\n private setPriceIfExist(\n prices: KaminoPrices,\n spot: CandidatePrice | null | undefined,\n twap: CandidatePrice | null | undefined,\n mint: string,\n tokenName: string\n ) {\n if (spot) {\n prices.spot[mint] = { price: spot.price, name: tokenName };\n }\n if (twap) {\n prices.twap[mint] = { price: twap.price, name: tokenName };\n }\n }\n}\n\nexport type KlendPrices = {\n scope: KaminoPrices;\n pyth: KaminoPrices;\n switchboard: KaminoPrices;\n};\n\nexport async function getReservesForMarket(\n marketAddress: PublicKey,\n connection: Connection,\n programId: PublicKey\n): Promise<Map<PublicKey, KaminoReserve>> {\n const reserves = await connection.getProgramAccounts(programId, {\n filters: [\n {\n dataSize: Reserve.layout.span + 8,\n },\n {\n memcmp: {\n offset: 32,\n bytes: marketAddress.toBase58(),\n },\n },\n ],\n });\n const deserializedReserves = reserves.map((reserve) => {\n if (reserve.account === null) {\n throw new Error(`Reserve account ${reserve.pubkey.toBase58()} does not exist`);\n }\n\n const reserveAccount = Reserve.decode(reserve.account.data);\n\n if (!reserveAccount) {\n throw Error(`Could not parse reserve ${reserve.pubkey.toBase58()}`);\n }\n return reserveAccount;\n });\n const allBuffers = reserves.map((reserve) => reserve.account);\n const reservesAndOracles = await getTokenOracleData(connection, deserializedReserves);\n const reservesByAddress = new PubkeyHashMap<PublicKey, KaminoReserve>();\n reservesAndOracles.forEach(([reserve, oracle], index) => {\n if (!oracle) {\n throw Error(`Could not find oracle for ${parseTokenSymbol(reserve.config.tokenInfo.name)} reserve`);\n }\n const kaminoReserve = KaminoReserve.initialize(\n allBuffers[index],\n reserves[index].pubkey,\n reserve,\n oracle,\n connection\n );\n reservesByAddress.set(kaminoReserve.address, kaminoReserve);\n });\n return reservesByAddress;\n}\n\nexport function getReservesActive(reserves: Map<PublicKey, KaminoReserve>): Map<PublicKey, KaminoReserve> {\n const reservesActive = new PubkeyHashMap<PublicKey, KaminoReserve>();\n for (const [key, reserve] of reserves) {\n if (reserve.state.config.status === 0) {\n reservesActive.set(key, reserve);\n }\n }\n return reservesActive;\n}\n\nexport async function _getReserveFromMintAndMarket(\n marketConfig: MarketConfigType,\n mint: string,\n connection: Connection,\n programId: PublicKey\n): Promise<[PublicKey, Reserve]> {\n const reserve = (\n await connection.getProgramAccounts(programId, {\n filters: [\n {\n dataSize: Reserve.layout.span + 8,\n },\n {\n memcmp: {\n offset: 32,\n bytes: marketConfig.lendingMarket,\n },\n },\n {\n memcmp: {\n offset: 64,\n bytes: mint,\n },\n },\n ],\n })\n )[0];\n\n if (reserve.account === null) {\n throw new Error('Invalid account');\n }\n if (!reserve.account.owner.equals(programId)) {\n throw new Error(\"Account doesn't belong to this program\");\n }\n\n const reserveAccount = Reserve.decode(reserve.account.data);\n\n if (!reserveAccount) {\n throw Error('Could not parse reserve.');\n }\n\n return [reserve.pubkey, reserveAccount];\n}\n\nconst lamportsToNumberDecimal = (amount: Decimal.Value, decimals: number): Decimal => {\n const factor = 10 ** decimals;\n return new Decimal(amount).div(factor);\n};\n"]}
|
package/dist/classes/reserve.js
CHANGED
|
@@ -27,6 +27,9 @@ class KaminoReserve {
|
|
|
27
27
|
* @returns the flash loan fee percentage of the reserve
|
|
28
28
|
*/
|
|
29
29
|
this.getFlashLoanFee = () => {
|
|
30
|
+
if (this.state.config.fees.flashLoanFeeSf.toString() === utils_1.U64_MAX) {
|
|
31
|
+
return new decimal_js_1.default('0');
|
|
32
|
+
}
|
|
30
33
|
return new fraction_1.Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();
|
|
31
34
|
};
|
|
32
35
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/classes/reserve.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { AccountInfo, Connection, PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { INITIAL_COLLATERAL_RATE, ONE_HUNDRED_PCT_IN_BPS, SLOTS_PER_YEAR, TokenOracleData } from '../utils';\nimport { ReserveDataType, ReserveStatus } from './shared';\nimport { Reserve, ReserveFields } from '../idl_codegen/accounts';\nimport { CurvePointFields } from '../idl_codegen/types';\nimport { calculateAPYFromAPR, getBorrowRate, parseTokenSymbol } from './utils';\nimport { Fraction } from './fraction';\nimport BN from 'bn.js';\nimport { ActionType } from './action';\n\nexport class KaminoReserve {\n state: Reserve;\n address: PublicKey;\n symbol: string;\n\n tokenOraclePrice: TokenOracleData;\n stats: ReserveDataType;\n\n private buffer: AccountInfo<Buffer> | null;\n private connection: Connection;\n\n constructor(state: Reserve, address: PublicKey, tokenOraclePrice: TokenOracleData, connection: Connection) {\n this.state = state;\n this.address = address;\n this.buffer = null;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = {} as ReserveDataType;\n this.connection = connection;\n this.symbol = parseTokenSymbol(state.config.tokenInfo.name);\n }\n\n static initialize(\n accountData: AccountInfo<Buffer>,\n address: PublicKey,\n state: Reserve,\n tokenOraclePrice: TokenOracleData,\n connection: Connection\n ) {\n const reserve = new KaminoReserve(state, address, tokenOraclePrice, connection);\n reserve.setBuffer(accountData);\n reserve.stats = reserve.formatReserveData(state);\n return reserve;\n }\n\n /// GETTERS\n\n /**\n * @returns the parsed token symbol of the reserve\n */\n getTokenSymbol(): string {\n return parseTokenSymbol(this.state.config.tokenInfo.name);\n }\n\n /**\n * @returns the total borrowed amount of the reserve\n */\n getBorrowedAmount(): Decimal {\n return new Fraction(this.state.liquidity.borrowedAmountSf).toDecimal();\n }\n\n /**\n * @returns the available liquidity amount of the reserve\n */\n getLiquidityAvailableAmount(): Decimal {\n return new Decimal(this.state.liquidity.availableAmount.toString());\n }\n\n /**\n *\n * @returns the last cached price stored in the reserve in USD\n */\n getReserveMarketPrice(): Decimal {\n return new Fraction(this.state.liquidity.marketPriceSf).toDecimal();\n }\n\n /**\n * @returns the current market price of the reserve in USD\n */\n getOracleMarketPrice(): Decimal {\n return this.tokenOraclePrice.price;\n }\n\n /**\n * @returns the total accumulated protocol fees of the reserve\n */\n getAccumulatedProtocolFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedProtocolFeesSf).toDecimal();\n }\n\n /**\n * @returns the total accumulated referrer fees of the reserve\n */\n getAccumulatedReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedReferrerFeesSf).toDecimal();\n }\n\n /**\n * @returns the total pending referrer fees of the reserve\n */\n getPendingReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.pendingReferrerFeesSf).toDecimal();\n }\n\n /**\n *\n * @returns the flash loan fee percentage of the reserve\n */\n getFlashLoanFee = (): Decimal => {\n return new Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the origination fee percentage of the reserve\n */\n getBorrowFee = (): Decimal => {\n return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();\n };\n\n /**\n * Use getEstimatedTotalSupply() for the most accurate value\n * @returns the stale total liquidity supply of the reserve from the last refresh\n */\n getTotalSupply(): Decimal {\n return this.getLiquidityAvailableAmount()\n .add(this.getBorrowedAmount())\n .sub(this.getAccumulatedProtocolFees())\n .sub(this.getAccumulatedReferrerFees())\n .sub(this.getPendingReferrerFees());\n }\n\n /**\n * Calculates the total liquidity supply of the reserve\n */\n getEstimatedTotalSupply(slot: number, referralFeeBps: number): Decimal {\n const { totalSupply } = this.getEstimatedDebtAndSupply(slot, referralFeeBps);\n return totalSupply;\n }\n\n /**\n * Use getEstimatedCumulativeBorrowRate() for the most accurate value\n * @returns the stale cumulative borrow rate of the reserve from the last refresh\n */\n getCumulativeBorrowRate(): Decimal {\n let accSf = new BN(0);\n for (const value of this.state.liquidity.cumulativeBorrowRateBsf.value.reverse()) {\n accSf = accSf.add(value);\n accSf.shrn(64);\n }\n return new Fraction(accSf).toDecimal();\n }\n\n /**\n * @Returns estimated cumulative borrow rate of the reserve\n */\n getEstimatedCumulativeBorrowRate(currentSlot: number): Decimal {\n const currentBorrowRate = new Decimal(this.calculateBorrowAPR());\n const slotsElapsed = Math.max(currentSlot - this.state.lastUpdate.slot.toNumber(), 0);\n\n const compoundInterest = this.approximateCompoundedInterest(currentBorrowRate, slotsElapsed);\n\n const previousCumulativeBorrowRate = this.getCumulativeBorrowRate();\n\n return previousCumulativeBorrowRate.mul(compoundInterest);\n }\n\n /**\n * Use getEstimatedCollateralExchangeRate() for the most accurate value\n * @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getCollateralExchangeRate(): Decimal {\n const totalSupply = this.getTotalSupply();\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getEstimatedCollateralExchangeRate(slot: number, referralFeeBps: number): Decimal {\n const totalSupply = this.getEstimatedTotalSupply(slot, referralFeeBps);\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the total USD value of the existing collateral in the reserve\n */\n getDepositTvl = (): Decimal => {\n return new Decimal(this.getTotalSupply().toString()).mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n *\n * Get the total USD value of the borrowed assets from the reserve\n */\n getBorrowTvl = (): Decimal => {\n return this.getBorrowedAmount().mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n * @returns 10^mint_decimals\n */\n getMintFactor(): Decimal {\n return new Decimal(10).pow(this.state.liquidity.mintDecimals.toNumber());\n }\n\n /**\n * @Returns true if the total liquidity supply of the reserve is greater than the deposit limit\n */\n depositLimitCrossed(): boolean {\n return this.getTotalSupply().gt(new Decimal(this.state.config.depositLimit.toString()));\n }\n\n /**\n * @Returns true if the total borrowed amount of the reserve is greater than the borrow limit\n */\n borrowLimitCrossed(): boolean {\n return this.getBorrowedAmount().gt(new Decimal(this.state.config.borrowLimit.toString()));\n }\n\n calculateSupplyAPR() {\n const currentUtilization = this.calculateUtilizationRatio();\n\n const borrowAPR = this.calculateBorrowAPR();\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n return currentUtilization * borrowAPR * protocolTakeRatePct;\n }\n\n getEstimatedDebtAndSupply(slot: number, referralFeeBps: number): { totalBorrow: Decimal; totalSupply: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let totalBorrow: Decimal;\n let totalSupply: Decimal;\n if (slotsElapsed === 0) {\n totalBorrow = this.getBorrowedAmount();\n totalSupply = this.getTotalSupply();\n } else {\n const { newDebt, newAccProtocolFees, pendingReferralFees } = this.compoundInterest(slotsElapsed, referralFeeBps);\n const newTotalSupply = this.getLiquidityAvailableAmount()\n .add(newDebt)\n .sub(newAccProtocolFees)\n .sub(this.getAccumulatedReferrerFees())\n .sub(pendingReferralFees);\n totalBorrow = newDebt;\n totalSupply = newTotalSupply;\n }\n return { totalBorrow, totalSupply };\n }\n\n calculateUtilizationRatio() {\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n if (totalSupply.eq(0)) {\n return 0;\n }\n return totalBorrows.dividedBy(totalSupply).toNumber();\n }\n\n calcSimulatedUtilizationRatio(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ): number {\n const { totalBorrow: previousTotalBorrowed, totalSupply: previousTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n\n switch (action) {\n case 'deposit': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'withdraw': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n if (newTotalSupply.eq(0)) {\n return 0;\n } else {\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n }\n case 'borrow': {\n const newTotalBorrowed = previousTotalBorrowed.add(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'repay': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'depositAndBorrow': {\n const newTotalSupply = previousTotalSupply.add(amount);\n const newTotalBorrowed = previousTotalBorrowed.add(outflowAmount!);\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'repayAndWithdraw': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n const newTotalSupply = previousTotalSupply.sub(outflowAmount!);\n if (newTotalSupply.eq(0)) {\n return 0;\n }\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'mint': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'redeem': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n default:\n throw Error(`Invalid action type ${action} for simulatedUtilizationRatio`);\n }\n }\n\n calcSimulatedBorrowAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(newUtilization, curve);\n }\n\n calcSimulatedSupplyAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const simulatedBorrowAPR = this.calcSimulatedBorrowAPR(amount, action, slot, referralFeeBps, outflowAmount);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n\n return newUtilization * simulatedBorrowAPR * protocolTakeRatePct;\n }\n\n calculateBorrowAPR() {\n const currentUtilization = this.calculateUtilizationRatio();\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(currentUtilization, curve);\n }\n\n /**\n * @returns the mint of the reserve liquidity token\n */\n getLiquidityMint(): PublicKey {\n return this.state.liquidity.mintPubkey;\n }\n\n /**\n * @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token\n */\n getCTokenMint(): PublicKey {\n return this.state.collateral.mintPubkey;\n }\n\n setBuffer(buffer: AccountInfo<Buffer> | null) {\n this.buffer = buffer;\n }\n\n async load(tokenOraclePrice: TokenOracleData) {\n if (!this.buffer) {\n this.setBuffer(await this.connection.getAccountInfo(this.address, 'processed'));\n }\n\n if (!this.buffer) {\n throw Error(`Error requesting account info for ${this.symbol}`);\n }\n\n const parsedData = await Reserve.fetch(this.connection, this.address);\n if (!parsedData) {\n throw Error(`Unable to parse data of reserve ${this.symbol}`);\n }\n this.state = parsedData;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = this.formatReserveData(parsedData);\n }\n\n totalSupplyAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.supplyInterestAPY).toNumber();\n\n return {\n interestAPY: stats.supplyInterestAPY,\n totalAPY,\n };\n }\n\n totalBorrowAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.borrowInterestAPY).toNumber();\n\n return {\n interestAPY: stats.borrowInterestAPY,\n totalAPY,\n };\n }\n\n private formatReserveData(parsedData: ReserveFields): ReserveDataType {\n const mintTotalSupply = new Decimal(parsedData.collateral.mintTotalSupply.toString()).div(this.getMintFactor());\n let reserveStatus = ReserveStatus.Active;\n switch (parsedData.config.status) {\n case 0:\n reserveStatus = ReserveStatus.Active;\n break;\n case 1:\n reserveStatus = ReserveStatus.Obsolete;\n break;\n case 2:\n reserveStatus = ReserveStatus.Hidden;\n break;\n }\n return {\n // Reserve config\n\n status: reserveStatus,\n mintAddress: parsedData.liquidity.mintPubkey,\n borrowCurve: truncateBorrowCurve(parsedData.config.borrowRateCurve.points),\n loanToValuePct: parsedData.config.loanToValuePct / 100,\n maxLiquidationBonus: parsedData.config.maxLiquidationBonusBps / 10000,\n minLiquidationBonus: parsedData.config.minLiquidationBonusBps / 10000,\n liquidationThreshold: parsedData.config.liquidationThresholdPct / 100,\n protocolTakeRate: parsedData.config.protocolTakeRatePct / 100,\n reserveDepositLimit: new Decimal(parsedData.config.depositLimit.toString()),\n reserveBorrowLimit: new Decimal(parsedData.config.borrowLimit.toString()),\n\n // Reserve info\n symbol: parseTokenSymbol(parsedData.config.tokenInfo.name),\n decimals: this.state.liquidity.mintDecimals.toNumber(),\n supplyInterestAPY: calculateAPYFromAPR(this.calculateSupplyAPR()),\n borrowInterestAPY: calculateAPYFromAPR(this.calculateBorrowAPR()),\n accumulatedProtocolFees: this.getAccumulatedProtocolFees().div(this.getMintFactor()),\n mintTotalSupply,\n depositLimitCrossedSlot: parsedData.liquidity.depositLimitCrossedSlot.toNumber(),\n borrowLimitCrossedSlot: parsedData.liquidity.borrowLimitCrossedSlot.toNumber(),\n borrowFactor: parsedData.config.borrowFactorPct.toNumber(),\n };\n }\n\n /**\n * Compound current borrow rate over elapsed slots\n *\n * This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.\n *\n * This also calculates referral fees, which are taken into pendingReferralFees.\n *\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517\n *\n * @param slotsElapsed\n * @param referralFeeBps\n */\n private compoundInterest(\n slotsElapsed: number,\n referralFeeBps: number\n ): {\n newDebt: Decimal;\n netNewDebt: Decimal;\n totalProtocolFee: Decimal;\n absoluteReferralFee: Decimal;\n maxReferralFees: Decimal;\n newAccProtocolFees: Decimal;\n pendingReferralFees: Decimal;\n } {\n const currentBorrowRate = this.calculateBorrowAPR();\n const protocolTakeRate = new Decimal(this.state.config.protocolTakeRatePct).div(100);\n const referralRate = new Decimal(referralFeeBps).div(10_000);\n\n const compoundInterestRate = this.approximateCompoundedInterest(new Decimal(currentBorrowRate), slotsElapsed);\n\n const previousDebt = this.getBorrowedAmount();\n const newDebt = previousDebt.mul(compoundInterestRate);\n const netNewDebt = newDebt.sub(previousDebt);\n\n const totalProtocolFee = netNewDebt.mul(protocolTakeRate);\n const absoluteReferralFee = protocolTakeRate.mul(referralRate);\n const maxReferralFees = netNewDebt.mul(absoluteReferralFee);\n\n const newAccProtocolFees = totalProtocolFee.sub(maxReferralFees).add(this.getAccumulatedProtocolFees());\n\n const pendingReferralFees = this.getPendingReferrerFees().add(maxReferralFees);\n\n return {\n newDebt,\n netNewDebt,\n totalProtocolFee,\n absoluteReferralFee,\n maxReferralFees,\n newAccProtocolFees,\n pendingReferralFees,\n };\n }\n\n /**\n * Approximation to match the smart contract calculation\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026\n * @param rate\n * @param elapsedSlots\n * @private\n */\n private approximateCompoundedInterest(rate: Decimal, elapsedSlots: number): Decimal {\n const base = rate.div(SLOTS_PER_YEAR);\n switch (elapsedSlots) {\n case 0:\n return new Decimal(1);\n case 1:\n return base.add(1);\n case 2:\n return base.add(1).mul(base.add(1));\n case 3:\n return base.add(1).mul(base.add(1)).mul(base.add(1));\n case 4:\n // eslint-disable-next-line no-case-declarations\n const pow2 = base.add(1).mul(base.add(1));\n return pow2.mul(pow2);\n }\n const exp = elapsedSlots;\n const expMinus1 = exp - 1;\n const expMinus2 = exp - 2;\n\n const basePow2 = base.mul(base);\n const basePow3 = basePow2.mul(base);\n\n const firstTerm = base.mul(exp);\n const secondTerm = basePow2.mul(exp).mul(expMinus1).div(2);\n const thirdTerm = basePow3.mul(exp).mul(expMinus1).mul(expMinus2).div(6);\n\n return new Decimal(1).add(firstTerm).add(secondTerm).add(thirdTerm);\n }\n}\n\nconst truncateBorrowCurve = (points: CurvePointFields[]): [number, number][] => {\n const curve: [number, number][] = [];\n for (const { utilizationRateBps, borrowRateBps } of points) {\n curve.push([utilizationRateBps / ONE_HUNDRED_PCT_IN_BPS, borrowRateBps / ONE_HUNDRED_PCT_IN_BPS]);\n\n if (utilizationRateBps === ONE_HUNDRED_PCT_IN_BPS) {\n break;\n }\n }\n return curve;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"reserve.js","sourceRoot":"","sources":["../../src/classes/reserve.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { AccountInfo, Connection, PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { INITIAL_COLLATERAL_RATE, ONE_HUNDRED_PCT_IN_BPS, SLOTS_PER_YEAR, TokenOracleData, U64_MAX } from '../utils';\nimport { ReserveDataType, ReserveStatus } from './shared';\nimport { Reserve, ReserveFields } from '../idl_codegen/accounts';\nimport { CurvePointFields } from '../idl_codegen/types';\nimport { calculateAPYFromAPR, getBorrowRate, parseTokenSymbol } from './utils';\nimport { Fraction } from './fraction';\nimport BN from 'bn.js';\nimport { ActionType } from './action';\n\nexport class KaminoReserve {\n state: Reserve;\n address: PublicKey;\n symbol: string;\n\n tokenOraclePrice: TokenOracleData;\n stats: ReserveDataType;\n\n private buffer: AccountInfo<Buffer> | null;\n private connection: Connection;\n\n constructor(state: Reserve, address: PublicKey, tokenOraclePrice: TokenOracleData, connection: Connection) {\n this.state = state;\n this.address = address;\n this.buffer = null;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = {} as ReserveDataType;\n this.connection = connection;\n this.symbol = parseTokenSymbol(state.config.tokenInfo.name);\n }\n\n static initialize(\n accountData: AccountInfo<Buffer>,\n address: PublicKey,\n state: Reserve,\n tokenOraclePrice: TokenOracleData,\n connection: Connection\n ) {\n const reserve = new KaminoReserve(state, address, tokenOraclePrice, connection);\n reserve.setBuffer(accountData);\n reserve.stats = reserve.formatReserveData(state);\n return reserve;\n }\n\n /// GETTERS\n\n /**\n * @returns the parsed token symbol of the reserve\n */\n getTokenSymbol(): string {\n return parseTokenSymbol(this.state.config.tokenInfo.name);\n }\n\n /**\n * @returns the total borrowed amount of the reserve\n */\n getBorrowedAmount(): Decimal {\n return new Fraction(this.state.liquidity.borrowedAmountSf).toDecimal();\n }\n\n /**\n * @returns the available liquidity amount of the reserve\n */\n getLiquidityAvailableAmount(): Decimal {\n return new Decimal(this.state.liquidity.availableAmount.toString());\n }\n\n /**\n *\n * @returns the last cached price stored in the reserve in USD\n */\n getReserveMarketPrice(): Decimal {\n return new Fraction(this.state.liquidity.marketPriceSf).toDecimal();\n }\n\n /**\n * @returns the current market price of the reserve in USD\n */\n getOracleMarketPrice(): Decimal {\n return this.tokenOraclePrice.price;\n }\n\n /**\n * @returns the total accumulated protocol fees of the reserve\n */\n getAccumulatedProtocolFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedProtocolFeesSf).toDecimal();\n }\n\n /**\n * @returns the total accumulated referrer fees of the reserve\n */\n getAccumulatedReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.accumulatedReferrerFeesSf).toDecimal();\n }\n\n /**\n * @returns the total pending referrer fees of the reserve\n */\n getPendingReferrerFees(): Decimal {\n return new Fraction(this.state.liquidity.pendingReferrerFeesSf).toDecimal();\n }\n\n /**\n *\n * @returns the flash loan fee percentage of the reserve\n */\n getFlashLoanFee = (): Decimal => {\n if (this.state.config.fees.flashLoanFeeSf.toString() === U64_MAX) {\n return new Decimal('0');\n }\n return new Fraction(this.state.config.fees.flashLoanFeeSf).toDecimal();\n };\n\n /**\n *\n * @returns the origination fee percentage of the reserve\n */\n getBorrowFee = (): Decimal => {\n return new Fraction(this.state.config.fees.borrowFeeSf).toDecimal();\n };\n\n /**\n * Use getEstimatedTotalSupply() for the most accurate value\n * @returns the stale total liquidity supply of the reserve from the last refresh\n */\n getTotalSupply(): Decimal {\n return this.getLiquidityAvailableAmount()\n .add(this.getBorrowedAmount())\n .sub(this.getAccumulatedProtocolFees())\n .sub(this.getAccumulatedReferrerFees())\n .sub(this.getPendingReferrerFees());\n }\n\n /**\n * Calculates the total liquidity supply of the reserve\n */\n getEstimatedTotalSupply(slot: number, referralFeeBps: number): Decimal {\n const { totalSupply } = this.getEstimatedDebtAndSupply(slot, referralFeeBps);\n return totalSupply;\n }\n\n /**\n * Use getEstimatedCumulativeBorrowRate() for the most accurate value\n * @returns the stale cumulative borrow rate of the reserve from the last refresh\n */\n getCumulativeBorrowRate(): Decimal {\n let accSf = new BN(0);\n for (const value of this.state.liquidity.cumulativeBorrowRateBsf.value.reverse()) {\n accSf = accSf.add(value);\n accSf.shrn(64);\n }\n return new Fraction(accSf).toDecimal();\n }\n\n /**\n * @Returns estimated cumulative borrow rate of the reserve\n */\n getEstimatedCumulativeBorrowRate(currentSlot: number): Decimal {\n const currentBorrowRate = new Decimal(this.calculateBorrowAPR());\n const slotsElapsed = Math.max(currentSlot - this.state.lastUpdate.slot.toNumber(), 0);\n\n const compoundInterest = this.approximateCompoundedInterest(currentBorrowRate, slotsElapsed);\n\n const previousCumulativeBorrowRate = this.getCumulativeBorrowRate();\n\n return previousCumulativeBorrowRate.mul(compoundInterest);\n }\n\n /**\n * Use getEstimatedCollateralExchangeRate() for the most accurate value\n * @returns the stale exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getCollateralExchangeRate(): Decimal {\n const totalSupply = this.getTotalSupply();\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the estimated exchange rate between the collateral tokens and the liquidity - this is a decimal number scaled by 1e18\n */\n getEstimatedCollateralExchangeRate(slot: number, referralFeeBps: number): Decimal {\n const totalSupply = this.getEstimatedTotalSupply(slot, referralFeeBps);\n const mintTotalSupply = this.state.collateral.mintTotalSupply;\n if (mintTotalSupply.isZero() || totalSupply.isZero()) {\n return INITIAL_COLLATERAL_RATE;\n } else {\n return new Decimal(mintTotalSupply.toString()).dividedBy(totalSupply.toString());\n }\n }\n\n /**\n *\n * @returns the total USD value of the existing collateral in the reserve\n */\n getDepositTvl = (): Decimal => {\n return new Decimal(this.getTotalSupply().toString()).mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n *\n * Get the total USD value of the borrowed assets from the reserve\n */\n getBorrowTvl = (): Decimal => {\n return this.getBorrowedAmount().mul(this.getOracleMarketPrice()).div(this.getMintFactor());\n };\n\n /**\n * @returns 10^mint_decimals\n */\n getMintFactor(): Decimal {\n return new Decimal(10).pow(this.state.liquidity.mintDecimals.toNumber());\n }\n\n /**\n * @Returns true if the total liquidity supply of the reserve is greater than the deposit limit\n */\n depositLimitCrossed(): boolean {\n return this.getTotalSupply().gt(new Decimal(this.state.config.depositLimit.toString()));\n }\n\n /**\n * @Returns true if the total borrowed amount of the reserve is greater than the borrow limit\n */\n borrowLimitCrossed(): boolean {\n return this.getBorrowedAmount().gt(new Decimal(this.state.config.borrowLimit.toString()));\n }\n\n calculateSupplyAPR() {\n const currentUtilization = this.calculateUtilizationRatio();\n\n const borrowAPR = this.calculateBorrowAPR();\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n return currentUtilization * borrowAPR * protocolTakeRatePct;\n }\n\n getEstimatedDebtAndSupply(slot: number, referralFeeBps: number): { totalBorrow: Decimal; totalSupply: Decimal } {\n const slotsElapsed = Math.max(slot - this.state.lastUpdate.slot.toNumber(), 0);\n let totalBorrow: Decimal;\n let totalSupply: Decimal;\n if (slotsElapsed === 0) {\n totalBorrow = this.getBorrowedAmount();\n totalSupply = this.getTotalSupply();\n } else {\n const { newDebt, newAccProtocolFees, pendingReferralFees } = this.compoundInterest(slotsElapsed, referralFeeBps);\n const newTotalSupply = this.getLiquidityAvailableAmount()\n .add(newDebt)\n .sub(newAccProtocolFees)\n .sub(this.getAccumulatedReferrerFees())\n .sub(pendingReferralFees);\n totalBorrow = newDebt;\n totalSupply = newTotalSupply;\n }\n return { totalBorrow, totalSupply };\n }\n\n calculateUtilizationRatio() {\n const totalBorrows = this.getBorrowedAmount();\n const totalSupply = this.getTotalSupply();\n if (totalSupply.eq(0)) {\n return 0;\n }\n return totalBorrows.dividedBy(totalSupply).toNumber();\n }\n\n calcSimulatedUtilizationRatio(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ): number {\n const { totalBorrow: previousTotalBorrowed, totalSupply: previousTotalSupply } = this.getEstimatedDebtAndSupply(\n slot,\n referralFeeBps\n );\n\n switch (action) {\n case 'deposit': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'withdraw': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n if (newTotalSupply.eq(0)) {\n return 0;\n } else {\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n }\n case 'borrow': {\n const newTotalBorrowed = previousTotalBorrowed.add(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'repay': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n return newTotalBorrowed.dividedBy(previousTotalSupply).toNumber();\n }\n case 'depositAndBorrow': {\n const newTotalSupply = previousTotalSupply.add(amount);\n const newTotalBorrowed = previousTotalBorrowed.add(outflowAmount!);\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'repayAndWithdraw': {\n const newTotalBorrowed = previousTotalBorrowed.sub(amount);\n const newTotalSupply = previousTotalSupply.sub(outflowAmount!);\n if (newTotalSupply.eq(0)) {\n return 0;\n }\n return newTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'mint': {\n const newTotalSupply = previousTotalSupply.add(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n case 'redeem': {\n const newTotalSupply = previousTotalSupply.sub(amount);\n return previousTotalBorrowed.dividedBy(newTotalSupply).toNumber();\n }\n default:\n throw Error(`Invalid action type ${action} for simulatedUtilizationRatio`);\n }\n }\n\n calcSimulatedBorrowAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(newUtilization, curve);\n }\n\n calcSimulatedSupplyAPR(\n amount: Decimal,\n action: ActionType,\n slot: number,\n referralFeeBps: number,\n outflowAmount?: Decimal\n ) {\n const newUtilization = this.calcSimulatedUtilizationRatio(amount, action, slot, referralFeeBps, outflowAmount);\n const simulatedBorrowAPR = this.calcSimulatedBorrowAPR(amount, action, slot, referralFeeBps, outflowAmount);\n const protocolTakeRatePct = 1 - this.state.config.protocolTakeRatePct / 100;\n\n return newUtilization * simulatedBorrowAPR * protocolTakeRatePct;\n }\n\n calculateBorrowAPR() {\n const currentUtilization = this.calculateUtilizationRatio();\n const curve = truncateBorrowCurve(this.state.config.borrowRateCurve.points);\n return getBorrowRate(currentUtilization, curve);\n }\n\n /**\n * @returns the mint of the reserve liquidity token\n */\n getLiquidityMint(): PublicKey {\n return this.state.liquidity.mintPubkey;\n }\n\n /**\n * @returns the mint of the reserve collateral token , i.e. the cToken minted for depositing the liquidity token\n */\n getCTokenMint(): PublicKey {\n return this.state.collateral.mintPubkey;\n }\n\n setBuffer(buffer: AccountInfo<Buffer> | null) {\n this.buffer = buffer;\n }\n\n async load(tokenOraclePrice: TokenOracleData) {\n if (!this.buffer) {\n this.setBuffer(await this.connection.getAccountInfo(this.address, 'processed'));\n }\n\n if (!this.buffer) {\n throw Error(`Error requesting account info for ${this.symbol}`);\n }\n\n const parsedData = await Reserve.fetch(this.connection, this.address);\n if (!parsedData) {\n throw Error(`Unable to parse data of reserve ${this.symbol}`);\n }\n this.state = parsedData;\n this.tokenOraclePrice = tokenOraclePrice;\n this.stats = this.formatReserveData(parsedData);\n }\n\n totalSupplyAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.supplyInterestAPY).toNumber();\n\n return {\n interestAPY: stats.supplyInterestAPY,\n totalAPY,\n };\n }\n\n totalBorrowAPY() {\n const { stats } = this;\n if (!stats) {\n throw Error('KaminoMarket must call loadRewards.');\n }\n\n const totalAPY = new Decimal(stats.borrowInterestAPY).toNumber();\n\n return {\n interestAPY: stats.borrowInterestAPY,\n totalAPY,\n };\n }\n\n private formatReserveData(parsedData: ReserveFields): ReserveDataType {\n const mintTotalSupply = new Decimal(parsedData.collateral.mintTotalSupply.toString()).div(this.getMintFactor());\n let reserveStatus = ReserveStatus.Active;\n switch (parsedData.config.status) {\n case 0:\n reserveStatus = ReserveStatus.Active;\n break;\n case 1:\n reserveStatus = ReserveStatus.Obsolete;\n break;\n case 2:\n reserveStatus = ReserveStatus.Hidden;\n break;\n }\n return {\n // Reserve config\n\n status: reserveStatus,\n mintAddress: parsedData.liquidity.mintPubkey,\n borrowCurve: truncateBorrowCurve(parsedData.config.borrowRateCurve.points),\n loanToValuePct: parsedData.config.loanToValuePct / 100,\n maxLiquidationBonus: parsedData.config.maxLiquidationBonusBps / 10000,\n minLiquidationBonus: parsedData.config.minLiquidationBonusBps / 10000,\n liquidationThreshold: parsedData.config.liquidationThresholdPct / 100,\n protocolTakeRate: parsedData.config.protocolTakeRatePct / 100,\n reserveDepositLimit: new Decimal(parsedData.config.depositLimit.toString()),\n reserveBorrowLimit: new Decimal(parsedData.config.borrowLimit.toString()),\n\n // Reserve info\n symbol: parseTokenSymbol(parsedData.config.tokenInfo.name),\n decimals: this.state.liquidity.mintDecimals.toNumber(),\n supplyInterestAPY: calculateAPYFromAPR(this.calculateSupplyAPR()),\n borrowInterestAPY: calculateAPYFromAPR(this.calculateBorrowAPR()),\n accumulatedProtocolFees: this.getAccumulatedProtocolFees().div(this.getMintFactor()),\n mintTotalSupply,\n depositLimitCrossedSlot: parsedData.liquidity.depositLimitCrossedSlot.toNumber(),\n borrowLimitCrossedSlot: parsedData.liquidity.borrowLimitCrossedSlot.toNumber(),\n borrowFactor: parsedData.config.borrowFactorPct.toNumber(),\n };\n }\n\n /**\n * Compound current borrow rate over elapsed slots\n *\n * This also calculates protocol fees, which are taken for all obligations that have borrowed from current reserve.\n *\n * This also calculates referral fees, which are taken into pendingReferralFees.\n *\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L517\n *\n * @param slotsElapsed\n * @param referralFeeBps\n */\n private compoundInterest(\n slotsElapsed: number,\n referralFeeBps: number\n ): {\n newDebt: Decimal;\n netNewDebt: Decimal;\n totalProtocolFee: Decimal;\n absoluteReferralFee: Decimal;\n maxReferralFees: Decimal;\n newAccProtocolFees: Decimal;\n pendingReferralFees: Decimal;\n } {\n const currentBorrowRate = this.calculateBorrowAPR();\n const protocolTakeRate = new Decimal(this.state.config.protocolTakeRatePct).div(100);\n const referralRate = new Decimal(referralFeeBps).div(10_000);\n\n const compoundInterestRate = this.approximateCompoundedInterest(new Decimal(currentBorrowRate), slotsElapsed);\n\n const previousDebt = this.getBorrowedAmount();\n const newDebt = previousDebt.mul(compoundInterestRate);\n const netNewDebt = newDebt.sub(previousDebt);\n\n const totalProtocolFee = netNewDebt.mul(protocolTakeRate);\n const absoluteReferralFee = protocolTakeRate.mul(referralRate);\n const maxReferralFees = netNewDebt.mul(absoluteReferralFee);\n\n const newAccProtocolFees = totalProtocolFee.sub(maxReferralFees).add(this.getAccumulatedProtocolFees());\n\n const pendingReferralFees = this.getPendingReferrerFees().add(maxReferralFees);\n\n return {\n newDebt,\n netNewDebt,\n totalProtocolFee,\n absoluteReferralFee,\n maxReferralFees,\n newAccProtocolFees,\n pendingReferralFees,\n };\n }\n\n /**\n * Approximation to match the smart contract calculation\n * https://github.com/Kamino-Finance/klend/blob/release/1.3.0/programs/klend/src/state/reserve.rs#L1026\n * @param rate\n * @param elapsedSlots\n * @private\n */\n private approximateCompoundedInterest(rate: Decimal, elapsedSlots: number): Decimal {\n const base = rate.div(SLOTS_PER_YEAR);\n switch (elapsedSlots) {\n case 0:\n return new Decimal(1);\n case 1:\n return base.add(1);\n case 2:\n return base.add(1).mul(base.add(1));\n case 3:\n return base.add(1).mul(base.add(1)).mul(base.add(1));\n case 4:\n // eslint-disable-next-line no-case-declarations\n const pow2 = base.add(1).mul(base.add(1));\n return pow2.mul(pow2);\n }\n const exp = elapsedSlots;\n const expMinus1 = exp - 1;\n const expMinus2 = exp - 2;\n\n const basePow2 = base.mul(base);\n const basePow3 = basePow2.mul(base);\n\n const firstTerm = base.mul(exp);\n const secondTerm = basePow2.mul(exp).mul(expMinus1).div(2);\n const thirdTerm = basePow3.mul(exp).mul(expMinus1).mul(expMinus2).div(6);\n\n return new Decimal(1).add(firstTerm).add(secondTerm).add(thirdTerm);\n }\n}\n\nconst truncateBorrowCurve = (points: CurvePointFields[]): [number, number][] => {\n const curve: [number, number][] = [];\n for (const { utilizationRateBps, borrowRateBps } of points) {\n curve.push([utilizationRateBps / ONE_HUNDRED_PCT_IN_BPS, borrowRateBps / ONE_HUNDRED_PCT_IN_BPS]);\n\n if (utilizationRateBps === ONE_HUNDRED_PCT_IN_BPS) {\n break;\n }\n }\n return curve;\n};\n"]}
|
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
import Decimal from 'decimal.js';
|
|
2
2
|
import { KaminoMarket, KaminoObligation } from '../classes';
|
|
3
3
|
import { PublicKey } from '@solana/web3.js';
|
|
4
|
-
export declare function estimateDebtRepaymentWithColl(
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
export declare function estimateDebtRepaymentWithColl(props: {
|
|
5
|
+
collAmount: Decimal;
|
|
6
|
+
priceDebtToColl: Decimal;
|
|
7
|
+
slippagePct: Decimal;
|
|
8
|
+
flashBorrowReserveFlashLoanFeePercentage: Decimal;
|
|
9
|
+
kaminoMarket: KaminoMarket;
|
|
10
|
+
debtTokenMint: PublicKey;
|
|
11
|
+
obligation: KaminoObligation;
|
|
12
|
+
currentSlot: number;
|
|
13
|
+
}): Decimal;
|
|
14
|
+
export declare function estimateCollNeededForDebtRepayment(props: {
|
|
15
|
+
debtAmount: Decimal;
|
|
16
|
+
priceDebtToColl: Decimal;
|
|
17
|
+
slippagePct: Decimal;
|
|
18
|
+
flashBorrowReserveFlashLoanFeePercentage: Decimal;
|
|
19
|
+
}): Decimal;
|
|
@@ -5,8 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.estimateCollNeededForDebtRepayment = exports.estimateDebtRepaymentWithColl = void 0;
|
|
7
7
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
8
|
-
function estimateDebtRepaymentWithColl(
|
|
9
|
-
priceDebtToColl, slippagePct, flashBorrowReserveFlashLoanFeePercentage, kaminoMarket, debtTokenMint, obligation, currentSlot
|
|
8
|
+
function estimateDebtRepaymentWithColl(props) {
|
|
9
|
+
const { collAmount, priceDebtToColl, slippagePct, flashBorrowReserveFlashLoanFeePercentage, kaminoMarket, debtTokenMint, obligation, currentSlot, } = props;
|
|
10
10
|
const slippage = slippagePct.div('100');
|
|
11
11
|
const flashLoanFee = flashBorrowReserveFlashLoanFeePercentage.div('100');
|
|
12
12
|
const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
|
|
@@ -25,8 +25,9 @@ priceDebtToColl, slippagePct, flashBorrowReserveFlashLoanFeePercentage, kaminoMa
|
|
|
25
25
|
return debtIrAdjusted;
|
|
26
26
|
}
|
|
27
27
|
exports.estimateDebtRepaymentWithColl = estimateDebtRepaymentWithColl;
|
|
28
|
-
function estimateCollNeededForDebtRepayment(
|
|
29
|
-
|
|
28
|
+
function estimateCollNeededForDebtRepayment(props) {
|
|
29
|
+
const { debtAmount, // in decimals
|
|
30
|
+
priceDebtToColl, slippagePct, flashBorrowReserveFlashLoanFeePercentage, } = props;
|
|
30
31
|
const slippage = slippagePct.div('100');
|
|
31
32
|
const flashLoanFee = flashBorrowReserveFlashLoanFeePercentage.div('100');
|
|
32
33
|
const debtFlashLoanRepay = debtAmount.mul(new decimal_js_1.default(1.0).add(flashLoanFee));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repay_with_collateral_calcs.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_calcs.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAiC;AAIjC,SAAgB,6BAA6B,
|
|
1
|
+
{"version":3,"file":"repay_with_collateral_calcs.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_calcs.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAiC;AAIjC,SAAgB,6BAA6B,CAAC,KAS7C;IACC,MAAM,EACJ,UAAU,EACV,eAAe,EACf,WAAW,EACX,wCAAwC,EACxC,YAAY,EACZ,aAAa,EACb,UAAU,EACV,WAAW,GACZ,GAAG,KAAK,CAAC;IACV,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,wCAAwC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACjE,IAAI,WAAW,KAAK,SAAS,EAAE;QAC7B,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;KAC3C;IAED,MAAM,aAAa,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAC1F,MAAM,uBAAuB,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAEtF,MAAM,oBAAoB,GAAG,UAAU;SACpC,8BAA8B,CAC7B,WAAW,EACX,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,WAAC,OAAA,MAAA,MAAM,CAAC,aAAa,0CAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA,EAAA,CAAE,EAC9F,WAAW,CACZ;SACA,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,oBAAO,CAAC,UAAU,CAAC,CAAC;IAE5F,uHAAuH;IACvH,MAAM,cAAc,GAAG,uBAAuB;SAC3C,GAAG,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,MAAM,CAAC,CAAC,CAAC;SAClD,eAAe,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,oBAAO,CAAC,UAAU,CAAC,CAAC;IAE5F,OAAO,cAAc,CAAC;AACxB,CAAC;AA5CD,sEA4CC;AAED,SAAgB,kCAAkC,CAAC,KAKlD;IACC,MAAM,EACJ,UAAU,EAAE,cAAc;IAC1B,eAAe,EACf,WAAW,EACX,wCAAwC,GACzC,GAAG,KAAK,CAAC;IACV,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,wCAAwC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEzE,MAAM,kBAAkB,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9E,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,oBAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IAE/F,OAAO,UAAU,CAAC;AACpB,CAAC;AAnBD,gFAmBC","sourcesContent":["import Decimal from 'decimal.js';\nimport { KaminoMarket, KaminoObligation } from '../classes';\nimport { PublicKey } from '@solana/web3.js';\n\nexport function estimateDebtRepaymentWithColl(props: {\n collAmount: Decimal; // in decimals\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashBorrowReserveFlashLoanFeePercentage: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n obligation: KaminoObligation;\n currentSlot: number;\n}): Decimal {\n const {\n collAmount,\n priceDebtToColl,\n slippagePct,\n flashBorrowReserveFlashLoanFeePercentage,\n kaminoMarket,\n debtTokenMint,\n obligation,\n currentSlot,\n } = props;\n const slippage = slippagePct.div('100');\n const flashLoanFee = flashBorrowReserveFlashLoanFeePercentage.div('100');\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n if (debtReserve === undefined) {\n throw new Error('Debt reserve not found');\n }\n\n const debtAfterSwap = collAmount.div(new Decimal(1.0).add(slippage)).div(priceDebtToColl);\n const debtAfterFlashLoanRepay = debtAfterSwap.div(new Decimal(1.0).add(flashLoanFee));\n\n const irSlippageBpsForDebt = obligation\n .estimateObligationInterestRate(\n debtReserve,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve.state.liquidity.mintDecimals.toNumber(), Decimal.ROUND_CEIL);\n\n // Estimate slightly more, by adding 1% to IR in order to avoid the case where UI users can repay the max we allow them\n const debtIrAdjusted = debtAfterFlashLoanRepay\n .div(irSlippageBpsForDebt.mul(new Decimal('1.01')))\n .toDecimalPlaces(debtReserve.state.liquidity.mintDecimals.toNumber(), Decimal.ROUND_CEIL);\n\n return debtIrAdjusted;\n}\n\nexport function estimateCollNeededForDebtRepayment(props: {\n debtAmount: Decimal; // in decimals\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashBorrowReserveFlashLoanFeePercentage: Decimal;\n}): Decimal {\n const {\n debtAmount, // in decimals\n priceDebtToColl,\n slippagePct,\n flashBorrowReserveFlashLoanFeePercentage,\n } = props;\n const slippage = slippagePct.div('100');\n const flashLoanFee = flashBorrowReserveFlashLoanFeePercentage.div('100');\n\n const debtFlashLoanRepay = debtAmount.mul(new Decimal(1.0).add(flashLoanFee));\n const collToSwap = debtFlashLoanRepay.mul(new Decimal(1.0).add(slippage)).mul(priceDebtToColl);\n\n return collToSwap;\n}\n"]}
|
|
@@ -20,8 +20,9 @@ const web3_js_1 = require("@solana/web3.js");
|
|
|
20
20
|
const decimal_js_1 = __importDefault(require("decimal.js"));
|
|
21
21
|
const repayWithCollCalcs = (props) => {
|
|
22
22
|
// Initialize local variables from the props object
|
|
23
|
-
const { repayAmount, priceDebtToColl, slippagePct,
|
|
23
|
+
const { repayAmount, priceDebtToColl, slippagePct, flashLoanFeePct } = props;
|
|
24
24
|
const slippage = slippagePct.div('100');
|
|
25
|
+
const flashLoanFee = flashLoanFeePct.div('100');
|
|
25
26
|
const swapDebtExpectedOut = repayAmount.mul(new decimal_js_1.default(1.0).add(flashLoanFee));
|
|
26
27
|
const collToSwapIn = swapDebtExpectedOut.mul(new decimal_js_1.default(1.0).add(slippage)).mul(priceDebtToColl);
|
|
27
28
|
return {
|
|
@@ -35,7 +36,7 @@ const getRepayWithCollSwapInputs = (props) => {
|
|
|
35
36
|
const { repayAmount, priceDebtToColl, slippagePct, kaminoMarket, debtTokenMint, collTokenMint, obligation, currentSlot, } = props;
|
|
36
37
|
const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
|
|
37
38
|
const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
|
|
38
|
-
const
|
|
39
|
+
const flashLoanFeePct = (debtReserve === null || debtReserve === void 0 ? void 0 : debtReserve.getFlashLoanFee().ceil()) || new decimal_js_1.default(0);
|
|
39
40
|
const irSlippageBpsForDebt = obligation
|
|
40
41
|
.estimateObligationInterestRate(debtReserve, obligation === null || obligation === void 0 ? void 0 : obligation.state.borrows.find((borrow) => { var _a; return (_a = borrow.borrowReserve) === null || _a === void 0 ? void 0 : _a.equals(debtReserve.address); }), currentSlot)
|
|
41
42
|
.toDecimalPlaces(debtReserve === null || debtReserve === void 0 ? void 0 : debtReserve.state.liquidity.mintDecimals.toNumber(), decimal_js_1.default.ROUND_CEIL);
|
|
@@ -47,7 +48,7 @@ const getRepayWithCollSwapInputs = (props) => {
|
|
|
47
48
|
repayAmount: repayAmountIrAdjusted,
|
|
48
49
|
priceDebtToColl,
|
|
49
50
|
slippagePct,
|
|
50
|
-
|
|
51
|
+
flashLoanFeePct: flashLoanFeePct,
|
|
51
52
|
});
|
|
52
53
|
return {
|
|
53
54
|
swapInputs: {
|
|
@@ -66,7 +67,7 @@ const getRepayWithCollIxns = (props) => __awaiter(void 0, void 0, void 0, functi
|
|
|
66
67
|
const collReserve = kaminoMarket.getReserveByMint(collTokenMint);
|
|
67
68
|
const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);
|
|
68
69
|
// const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);
|
|
69
|
-
const
|
|
70
|
+
const flashLoanFeePct = (debtReserve === null || debtReserve === void 0 ? void 0 : debtReserve.getFlashLoanFee()) || new decimal_js_1.default(0);
|
|
70
71
|
const irSlippageBpsForDebt = obligation
|
|
71
72
|
.estimateObligationInterestRate(debtReserve, obligation === null || obligation === void 0 ? void 0 : obligation.state.borrows.find((borrow) => { var _a; return (_a = borrow.borrowReserve) === null || _a === void 0 ? void 0 : _a.equals(debtReserve.address); }), currentSlot)
|
|
72
73
|
.toDecimalPlaces(debtReserve === null || debtReserve === void 0 ? void 0 : debtReserve.state.liquidity.mintDecimals.toNumber(), decimal_js_1.default.ROUND_CEIL);
|
|
@@ -78,9 +79,8 @@ const getRepayWithCollIxns = (props) => __awaiter(void 0, void 0, void 0, functi
|
|
|
78
79
|
repayAmount,
|
|
79
80
|
priceDebtToColl,
|
|
80
81
|
slippagePct,
|
|
81
|
-
|
|
82
|
+
flashLoanFeePct,
|
|
82
83
|
});
|
|
83
|
-
console.log('repayWithCollSwapInputs', repayAmount, priceDebtToColl, slippagePct, flashLoanFee);
|
|
84
84
|
console.log('Ops Calcs', (0, leverage_1.toJson)(calcs));
|
|
85
85
|
// // 1. Create atas & budget txns
|
|
86
86
|
const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve.getCTokenMint()];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repay_with_collateral_operations.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { KaminoAction, KaminoMarket, KaminoObligation, numberToLamportsDecimal } from '../classes';\nimport { SwapInputs, SwapIxnsProvider, getFlashLoanInstructions, toJson } from '../leverage';\nimport {\n PublicKeySet,\n U64_MAX,\n getAtasWithCreateIxnsIfMissing,\n getComputeBudgetAndPriorityFeeIxns,\n removeBudgetAndAtaIxns,\n} from '../utils';\nimport { PublicKey, TransactionInstruction } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\n\nexport const repayWithCollCalcs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashLoanFee: Decimal;\n}): {\n repayAmount: Decimal;\n collToSwapIn: Decimal;\n swapDebtExpectedOut: Decimal;\n} => {\n // Initialize local variables from the props object\n const { repayAmount, priceDebtToColl, slippagePct, flashLoanFee } = props;\n\n const slippage = slippagePct.div('100');\n\n const swapDebtExpectedOut = repayAmount.mul(new Decimal(1.0).add(flashLoanFee));\n const collToSwapIn = swapDebtExpectedOut.mul(new Decimal(1.0).add(slippage)).mul(priceDebtToColl);\n\n return {\n repayAmount,\n collToSwapIn,\n swapDebtExpectedOut,\n };\n};\n\nexport const getRepayWithCollSwapInputs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n obligation: KaminoObligation;\n currentSlot: number;\n}): {\n swapInputs: SwapInputs;\n} => {\n const {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n kaminoMarket,\n debtTokenMint,\n collTokenMint,\n obligation,\n currentSlot,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not repaying enough\n const repayAmountIrAdjusted = repayAmount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const repayCalcs = repayWithCollCalcs({\n repayAmount: repayAmountIrAdjusted,\n priceDebtToColl,\n slippagePct,\n flashLoanFee,\n });\n\n return {\n swapInputs: {\n inputAmountLamports: numberToLamportsDecimal(repayCalcs.collToSwapIn, collReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n };\n};\n\nexport const getRepayWithCollIxns = async (props: {\n kaminoMarket: KaminoMarket;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n amount: Decimal;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n owner: PublicKey;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n isClosingPosition: boolean;\n obligation: KaminoObligation;\n referrer: PublicKey;\n swapper: SwapIxnsProvider;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n}> => {\n const {\n kaminoMarket,\n budgetAndPriorityFeeIxns,\n amount,\n debtTokenMint,\n collTokenMint,\n owner,\n priceDebtToColl,\n slippagePct,\n isClosingPosition,\n obligation,\n referrer,\n swapper,\n currentSlot,\n getTotalKlendAccountsOnly,\n } = props;\n\n const connection = kaminoMarket.getConnection();\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n // const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const flashLoanFee = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not reapying enough\n const repayAmount = amount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const calcs = repayWithCollCalcs({\n repayAmount,\n priceDebtToColl,\n slippagePct,\n flashLoanFee,\n });\n\n console.log('repayWithCollSwapInputs', repayAmount, priceDebtToColl, slippagePct, flashLoanFee);\n\n console.log('Ops Calcs', toJson(calcs));\n\n // // 1. Create atas & budget txns\n const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, owner, mintsToCreateAtas);\n\n // 1. Flash borrow & repay the debt to repay amount needed\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length,\n walletPublicKey: owner,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor(),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 2. Repay using the flash borrowed funds & withdraw collateral to swap and pay the flash loan\n const repayAndWithdrawAction = await KaminoAction.buildRepayAndWithdrawTxns(\n kaminoMarket,\n isClosingPosition ? U64_MAX : numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n new PublicKey(debtTokenMint),\n isClosingPosition\n ? U64_MAX\n : numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toString(),\n new PublicKey(collTokenMint),\n owner,\n currentSlot,\n obligation,\n 0,\n false,\n undefined,\n undefined,\n isClosingPosition,\n referrer\n );\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n ixns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n console.log(\n 'Expected to swap in',\n calcs.collToSwapIn.toString(),\n 'coll for',\n calcs.swapDebtExpectedOut.toString(),\n 'debt'\n );\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n // 3. Swap collateral to debt to repay flash loan\n const [swapIxns, lookupTablesAddresses] = await swapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct.toNumber()\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ],\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"repay_with_collateral_operations.js","sourceRoot":"","sources":["../../src/lending_operations/repay_with_collateral_operations.ts"],"names":[],"mappings":"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","sourcesContent":["import { KaminoAction, KaminoMarket, KaminoObligation, numberToLamportsDecimal } from '../classes';\nimport { SwapInputs, SwapIxnsProvider, getFlashLoanInstructions, toJson } from '../leverage';\nimport {\n PublicKeySet,\n U64_MAX,\n getAtasWithCreateIxnsIfMissing,\n getComputeBudgetAndPriorityFeeIxns,\n removeBudgetAndAtaIxns,\n} from '../utils';\nimport { PublicKey, TransactionInstruction } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\n\nexport const repayWithCollCalcs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n flashLoanFeePct: Decimal;\n}): {\n repayAmount: Decimal;\n collToSwapIn: Decimal;\n swapDebtExpectedOut: Decimal;\n} => {\n // Initialize local variables from the props object\n const { repayAmount, priceDebtToColl, slippagePct, flashLoanFeePct } = props;\n\n const slippage = slippagePct.div('100');\n const flashLoanFee = flashLoanFeePct.div('100');\n\n const swapDebtExpectedOut = repayAmount.mul(new Decimal(1.0).add(flashLoanFee));\n const collToSwapIn = swapDebtExpectedOut.mul(new Decimal(1.0).add(slippage)).mul(priceDebtToColl);\n\n return {\n repayAmount,\n collToSwapIn,\n swapDebtExpectedOut,\n };\n};\n\nexport const getRepayWithCollSwapInputs = (props: {\n repayAmount: Decimal;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n kaminoMarket: KaminoMarket;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n obligation: KaminoObligation;\n currentSlot: number;\n}): {\n swapInputs: SwapInputs;\n} => {\n const {\n repayAmount,\n priceDebtToColl,\n slippagePct,\n kaminoMarket,\n debtTokenMint,\n collTokenMint,\n obligation,\n currentSlot,\n } = props;\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee().ceil() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not repaying enough\n const repayAmountIrAdjusted = repayAmount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const repayCalcs = repayWithCollCalcs({\n repayAmount: repayAmountIrAdjusted,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct: flashLoanFeePct,\n });\n\n return {\n swapInputs: {\n inputAmountLamports: numberToLamportsDecimal(repayCalcs.collToSwapIn, collReserve!.stats.decimals)\n .ceil()\n .toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n },\n };\n};\n\nexport const getRepayWithCollIxns = async (props: {\n kaminoMarket: KaminoMarket;\n budgetAndPriorityFeeIxns: TransactionInstruction[];\n amount: Decimal;\n debtTokenMint: PublicKey;\n collTokenMint: PublicKey;\n owner: PublicKey;\n priceDebtToColl: Decimal;\n slippagePct: Decimal;\n isClosingPosition: boolean;\n obligation: KaminoObligation;\n referrer: PublicKey;\n swapper: SwapIxnsProvider;\n currentSlot: number;\n getTotalKlendAccountsOnly: boolean;\n}): Promise<{\n ixns: TransactionInstruction[];\n lookupTablesAddresses: PublicKey[];\n swapInputs: SwapInputs;\n totalKlendAccounts: number;\n}> => {\n const {\n kaminoMarket,\n budgetAndPriorityFeeIxns,\n amount,\n debtTokenMint,\n collTokenMint,\n owner,\n priceDebtToColl,\n slippagePct,\n isClosingPosition,\n obligation,\n referrer,\n swapper,\n currentSlot,\n getTotalKlendAccountsOnly,\n } = props;\n\n const connection = kaminoMarket.getConnection();\n const collReserve = kaminoMarket.getReserveByMint(collTokenMint);\n const debtReserve = kaminoMarket.getReserveByMint(debtTokenMint);\n // const solTokenReserve = kaminoMarket.getReserveByMint(WRAPPED_SOL_MINT);\n const flashLoanFeePct = debtReserve?.getFlashLoanFee() || new Decimal(0);\n\n const irSlippageBpsForDebt = obligation!\n .estimateObligationInterestRate(\n debtReserve!,\n obligation?.state.borrows.find((borrow) => borrow.borrowReserve?.equals(debtReserve!.address))!,\n currentSlot\n )\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n // add 0.1% to irSlippageBpsForDebt because we don't want to estimate slightly less than SC and end up not reapying enough\n const repayAmount = amount\n .mul(irSlippageBpsForDebt.mul(new Decimal('1.001')))\n .toDecimalPlaces(debtReserve?.state.liquidity.mintDecimals.toNumber()!, Decimal.ROUND_CEIL);\n\n const calcs = repayWithCollCalcs({\n repayAmount,\n priceDebtToColl,\n slippagePct,\n flashLoanFeePct,\n });\n\n console.log('Ops Calcs', toJson(calcs));\n\n // // 1. Create atas & budget txns\n const mintsToCreateAtas = [collTokenMint, debtTokenMint, collReserve!.getCTokenMint()];\n\n const budgetIxns = budgetAndPriorityFeeIxns || getComputeBudgetAndPriorityFeeIxns(3000000);\n const {\n atas: [, debtTokenAta],\n createAtasIxns,\n closeAtasIxns,\n } = await getAtasWithCreateIxnsIfMissing(connection, owner, mintsToCreateAtas);\n\n // 1. Flash borrow & repay the debt to repay amount needed\n const { flashBorrowIxn, flashRepayIxn } = getFlashLoanInstructions({\n borrowIxnIndex: budgetIxns.length + createAtasIxns.length,\n walletPublicKey: owner,\n lendingMarketAuthority: kaminoMarket.getLendingMarketAuthority(),\n lendingMarketAddress: kaminoMarket.getAddress(),\n reserve: debtReserve!,\n amountLamports: numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor(),\n destinationAta: debtTokenAta,\n referrerAccount: kaminoMarket.programId,\n referrerTokenState: kaminoMarket.programId,\n programId: kaminoMarket.programId,\n });\n\n // 2. Repay using the flash borrowed funds & withdraw collateral to swap and pay the flash loan\n const repayAndWithdrawAction = await KaminoAction.buildRepayAndWithdrawTxns(\n kaminoMarket,\n isClosingPosition ? U64_MAX : numberToLamportsDecimal(repayAmount, debtReserve!.stats.decimals).floor().toString(),\n new PublicKey(debtTokenMint),\n isClosingPosition\n ? U64_MAX\n : numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toString(),\n new PublicKey(collTokenMint),\n owner,\n currentSlot,\n obligation,\n 0,\n false,\n undefined,\n undefined,\n isClosingPosition,\n referrer\n );\n\n const ixns = [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ];\n\n const uniqueAccounts = new PublicKeySet<PublicKey>([]);\n ixns.forEach((ixn) => {\n ixn.keys.forEach((key) => {\n uniqueAccounts.add(key.pubkey);\n });\n });\n const totalKlendAccounts = uniqueAccounts.toArray().length;\n\n // return early to avoid extra swapper calls\n if (getTotalKlendAccountsOnly) {\n return {\n ixns: [],\n lookupTablesAddresses: [],\n swapInputs: { inputAmountLamports: 0, inputMint: PublicKey.default, outputMint: PublicKey.default },\n totalKlendAccounts: totalKlendAccounts,\n };\n }\n\n console.log(\n 'Expected to swap in',\n calcs.collToSwapIn.toString(),\n 'coll for',\n calcs.swapDebtExpectedOut.toString(),\n 'debt'\n );\n\n const swapInputs: SwapInputs = {\n inputAmountLamports: numberToLamportsDecimal(calcs.collToSwapIn, collReserve!.stats.decimals).ceil().toNumber(),\n inputMint: collTokenMint,\n outputMint: debtTokenMint,\n };\n\n // 3. Swap collateral to debt to repay flash loan\n const [swapIxns, lookupTablesAddresses] = await swapper(\n swapInputs.inputAmountLamports,\n swapInputs.inputMint,\n swapInputs.outputMint,\n slippagePct.toNumber()\n );\n\n const swapInstructions = removeBudgetAndAtaIxns(swapIxns, []);\n\n return {\n ixns: [\n ...budgetIxns,\n ...createAtasIxns,\n ...[flashBorrowIxn],\n ...repayAndWithdrawAction.setupIxs,\n ...[repayAndWithdrawAction.lendingIxs[0]],\n ...repayAndWithdrawAction.inBetweenIxs,\n ...[repayAndWithdrawAction.lendingIxs[1]],\n ...repayAndWithdrawAction.cleanupIxs,\n ...swapInstructions,\n ...[flashRepayIxn],\n ...closeAtasIxns,\n ],\n lookupTablesAddresses,\n swapInputs,\n totalKlendAccounts,\n };\n};\n"]}
|
package/dist/utils/rpc.js
CHANGED
|
@@ -27,7 +27,10 @@ exports.getProgramAccounts = void 0;
|
|
|
27
27
|
const web3_js_1 = require("@solana/web3.js");
|
|
28
28
|
const buffer_1 = require("buffer");
|
|
29
29
|
const axios_1 = __importDefault(require("axios"));
|
|
30
|
-
const
|
|
30
|
+
const zstd_wasm_1 = require("@bokuweb/zstd-wasm");
|
|
31
|
+
(() => __awaiter(void 0, void 0, void 0, function* () {
|
|
32
|
+
yield (0, zstd_wasm_1.init)();
|
|
33
|
+
}))();
|
|
31
34
|
/**
|
|
32
35
|
* Uses zstd compression when fetching all accounts owned by a program for a smaller response size
|
|
33
36
|
* Uses axios instead of node-fetch to work around a bug in node-fetch that causes subsequent requests with different encoding to fail
|
|
@@ -76,13 +79,13 @@ function getProgramAccounts(connection, programId, configOrCommitment) {
|
|
|
76
79
|
exports.getProgramAccounts = getProgramAccounts;
|
|
77
80
|
function deserializeAccountInfo(accountInfo) {
|
|
78
81
|
return __awaiter(this, void 0, void 0, function* () {
|
|
79
|
-
const data =
|
|
82
|
+
const data = (0, zstd_wasm_1.decompress)(buffer_1.Buffer.from(accountInfo.data[0], 'base64'));
|
|
80
83
|
return {
|
|
81
84
|
owner: accountInfo.owner,
|
|
82
85
|
lamports: accountInfo.lamports,
|
|
83
86
|
executable: accountInfo.executable,
|
|
84
87
|
rentEpoch: accountInfo.rentEpoch,
|
|
85
|
-
data,
|
|
88
|
+
data: buffer_1.Buffer.from(data),
|
|
86
89
|
};
|
|
87
90
|
});
|
|
88
91
|
}
|
package/dist/utils/rpc.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/utils/rpc.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6CAQyB;AACzB,mCAAgC;AAChC,kDAA0B;AAC1B,
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/utils/rpc.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AccountInfo,\n Commitment,\n Connection,\n GetProgramAccountsConfig,\n GetProgramAccountsResponse,\n PublicKey,\n SolanaJSONRPCError,\n} from '@solana/web3.js';\nimport { Buffer } from 'buffer';\nimport axios from 'axios';\nimport { init, decompress } from '@bokuweb/zstd-wasm';\n(async () => {\n await init();\n})();\n\n/**\n * Uses zstd compression when fetching all accounts owned by a program for a smaller response size\n * Uses axios instead of node-fetch to work around a bug in node-fetch that causes subsequent requests with different encoding to fail\n * @param connection\n * @param programId\n * @param configOrCommitment\n */\nexport async function getProgramAccounts(\n connection: Connection,\n programId: PublicKey,\n configOrCommitment?: GetProgramAccountsConfig | Commitment\n): Promise<GetProgramAccountsResponse> {\n const programIdStr = programId.toBase58();\n const { commitment, config } = extractCommitmentFromConfig(configOrCommitment);\n const { encoding: _encoding, ...configWithoutEncoding } = config || {};\n // Use axios here to work around a bug in node fetch that causes subsequent requests with different encoding to fail\n // https://github.com/node-fetch/node-fetch/issues/1767\n const response = await axios.post(\n connection.rpcEndpoint,\n {\n method: 'getProgramAccounts',\n jsonrpc: '2.0',\n params: [\n programIdStr,\n {\n encoding: 'base64+zstd',\n commitment,\n ...configWithoutEncoding,\n },\n ],\n id: crypto.randomUUID(),\n },\n {\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'Accept-Encoding': 'gzip, deflate',\n 'Cache-Control': 'no-cache',\n },\n }\n );\n\n const unsafeRes = response.data;\n if ('error' in unsafeRes) {\n throw new SolanaJSONRPCError(unsafeRes.error, `Failed to get accounts owned by program: ${[programIdStr]}`);\n }\n\n const res = unsafeRes as RpcResult;\n const deser = res.result.map(async (account) => ({\n account: await deserializeAccountInfo(account.account),\n pubkey: new PublicKey(account.pubkey),\n }));\n const x = await Promise.all(deser);\n return x as GetProgramAccountsResponse;\n}\n\nasync function deserializeAccountInfo(accountInfo: AccountInfo<string[]>): Promise<AccountInfo<Buffer>> {\n const data = decompress(Buffer.from(accountInfo.data[0], 'base64'));\n return {\n owner: accountInfo.owner,\n lamports: accountInfo.lamports,\n executable: accountInfo.executable,\n rentEpoch: accountInfo.rentEpoch,\n data: Buffer.from(data),\n };\n}\n\nfunction extractCommitmentFromConfig<TConfig>(\n commitmentOrConfig?: Commitment | ({ commitment?: Commitment } & TConfig)\n) {\n let commitment: Commitment | undefined;\n let config: Omit<TConfig, 'commitment'> | undefined;\n if (typeof commitmentOrConfig === 'string') {\n commitment = commitmentOrConfig;\n } else if (commitmentOrConfig) {\n const { commitment: specifiedCommitment, ...specifiedConfig } = commitmentOrConfig;\n commitment = specifiedCommitment;\n config = specifiedConfig;\n }\n return { commitment, config };\n}\n\ninterface RpcResult {\n jsonrpc: string;\n result: Result;\n}\n\nexport type Result = readonly Readonly<{\n account: AccountInfo<string[]>;\n /** the account Pubkey as base-58 encoded string */\n pubkey: string;\n}>[];\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kamino-finance/klend-sdk",
|
|
3
|
-
"version": "2.10.
|
|
3
|
+
"version": "2.10.11",
|
|
4
4
|
"description": "Typescript SDK for interacting with the Kamino Lending (klend) protocol",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -40,12 +40,12 @@
|
|
|
40
40
|
"dump-programs": "./deps/dump-from-mainnet.sh"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
+
"@bokuweb/zstd-wasm": "^0.0.20",
|
|
43
44
|
"@coral-xyz/anchor": "^0.28.0",
|
|
44
45
|
"@coral-xyz/borsh": "^0.28.0",
|
|
45
46
|
"@hubbleprotocol/farms-sdk": "^0.3.7",
|
|
46
47
|
"@hubbleprotocol/kamino-sdk": "^3.0.16",
|
|
47
48
|
"@hubbleprotocol/scope-sdk": "^3.0.6",
|
|
48
|
-
"@mongodb-js/zstd": "^1.2.0",
|
|
49
49
|
"@pythnetwork/client": "^2.5.1",
|
|
50
50
|
"@solana/buffer-layout": "^4.0.0",
|
|
51
51
|
"@solana/spl-token": "^0.1.8",
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
"@types/bs58": "^4.0.1",
|
|
69
69
|
"@types/chai": "^4.3.5",
|
|
70
70
|
"@types/jest": "^27.0.3",
|
|
71
|
-
"@types/mocha": "^10.0.
|
|
71
|
+
"@types/mocha": "^10.0.6",
|
|
72
72
|
"@types/node-fetch": "^2.6.7",
|
|
73
73
|
"@typescript-eslint/eslint-plugin": "^5.5.0",
|
|
74
74
|
"@typescript-eslint/parser": "^5.5.0",
|
|
@@ -88,7 +88,7 @@
|
|
|
88
88
|
"start-server-and-test": "^2.0.0",
|
|
89
89
|
"ts-jest": "^28.0.7",
|
|
90
90
|
"ts-mocha": "^10.0.0",
|
|
91
|
-
"ts-node": "^10.9.
|
|
91
|
+
"ts-node": "^10.9.2",
|
|
92
92
|
"typedoc": "^0.22.10",
|
|
93
93
|
"typescript": "^4.9.5",
|
|
94
94
|
"typescript-eslint": "^0.0.1-alpha.0"
|