@kamino-finance/klend-sdk 3.2.4 → 3.2.5
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.d.ts
CHANGED
|
@@ -75,7 +75,7 @@ export declare class KaminoMarket {
|
|
|
75
75
|
/**
|
|
76
76
|
* @returns The max borrowable amount for leverage positions
|
|
77
77
|
*/
|
|
78
|
-
getMaxLeverageBorrowableAmount(collReserve: KaminoReserve, debtReserve: KaminoReserve, slot: number, obligation?: KaminoObligation): Promise<Decimal>;
|
|
78
|
+
getMaxLeverageBorrowableAmount(collReserve: KaminoReserve, debtReserve: KaminoReserve, slot: number, requestElevationGroup: boolean, obligation?: KaminoObligation): Promise<Decimal>;
|
|
79
79
|
loadReserves(): Promise<void>;
|
|
80
80
|
refreshAll(): Promise<void>;
|
|
81
81
|
getReserveByAddress(address: PublicKey): KaminoReserve | undefined;
|
package/dist/classes/market.js
CHANGED
|
@@ -261,10 +261,10 @@ class KaminoMarket {
|
|
|
261
261
|
/**
|
|
262
262
|
* @returns The max borrowable amount for leverage positions
|
|
263
263
|
*/
|
|
264
|
-
getMaxLeverageBorrowableAmount(collReserve, debtReserve, slot, obligation) {
|
|
264
|
+
getMaxLeverageBorrowableAmount(collReserve, debtReserve, slot, requestElevationGroup, obligation) {
|
|
265
265
|
return __awaiter(this, void 0, void 0, function* () {
|
|
266
266
|
return obligation
|
|
267
|
-
? obligation.getMaxBorrowAmount(this, debtReserve.getLiquidityMint(), slot)
|
|
267
|
+
? obligation.getMaxBorrowAmount(this, debtReserve.getLiquidityMint(), slot, requestElevationGroup)
|
|
268
268
|
: debtReserve.getMaxBorrowAmountWithCollReserve(this, collReserve, slot);
|
|
269
269
|
});
|
|
270
270
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"market.js","sourceRoot":"","sources":["../../src/classes/market.ts"],"names":[],"mappings":"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","sourcesContent":["import { AccountInfo, 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 {\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 '@kamino-finance/kliquidity-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 readonly recentSlotDurationMs: number;\n\n private constructor(\n connection: Connection,\n state: LendingMarket,\n marketAddress: string,\n reserves: Map<PublicKey, KaminoReserve>,\n scope: Scope,\n recentSlotDurationMs: number,\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 this.recentSlotDurationMs = recentSlotDurationMs;\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 recentSlotDurationMs: number,\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, recentSlotDurationMs)\n : new Map<PublicKey, KaminoReserve>();\n\n return new KaminoMarket(\n connection,\n market,\n marketAddress.toString(),\n reserves,\n scope,\n recentSlotDurationMs,\n programId\n );\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(\n this.getAddress(),\n this.connection,\n this.programId,\n this.recentSlotDurationMs\n );\n this.reservesActive = getReservesActive(this.reserves);\n }\n\n async reloadSingleReserve(reservePk: PublicKey, accountData?: AccountInfo<Buffer>): Promise<void> {\n const reserve = await getSingleReserve(reservePk, this.connection, this.recentSlotDurationMs, accountData);\n this.reserves.set(reservePk, reserve);\n this.reservesActive.set(reservePk, reserve);\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 getMinNetValueObligation(): Decimal {\n return new Fraction(this.state.minNetValueInObligationSf).toDecimal();\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 let tvl = new Decimal(0);\n for (const reserve of this.reserves.values()) {\n tvl = tvl.add(reserve.getDepositTvl());\n }\n return tvl;\n }\n\n getTotalBorrowTVL(): Decimal {\n let tvl = new Decimal(0);\n for (const reserve of this.reserves.values()) {\n tvl = 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 /**\n * @returns The max borrowable amount for leverage positions\n */\n async getMaxLeverageBorrowableAmount(\n collReserve: KaminoReserve,\n debtReserve: KaminoReserve,\n slot: number,\n obligation?: KaminoObligation\n ): Promise<Decimal> {\n return obligation\n ? obligation.getMaxBorrowAmount(this, debtReserve.getLiquidityMint(), slot)\n : debtReserve.getMaxBorrowAmountWithCollReserve(this, collReserve, slot);\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 this.recentSlotDurationMs\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(\n reserve.address,\n reserve.getEstimatedCumulativeBorrowRate(slot, this.state.referralFeeBps)\n );\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 getRecentSlotDurationMs(): number {\n return this.recentSlotDurationMs;\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 recentSlotDurationMs: number\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 recentSlotDurationMs\n );\n reservesByAddress.set(kaminoReserve.address, kaminoReserve);\n });\n return reservesByAddress;\n}\n\nexport async function getSingleReserve(\n reservePk: PublicKey,\n connection: Connection,\n recentSlotDurationMs: number,\n accountData?: AccountInfo<Buffer>\n): Promise<KaminoReserve> {\n const reserve = accountData ? accountData : await connection.getAccountInfo(reservePk);\n\n if (reserve === null) {\n throw new Error(`Reserve account ${reservePk.toBase58()} does not exist`);\n }\n\n const reserveAccount = Reserve.decode(reserve.data);\n\n if (!reserveAccount) {\n throw Error(`Could not parse reserve ${reservePk.toBase58()}`);\n }\n\n const reservesAndOracles = await getTokenOracleData(connection, [reserveAccount]);\n const [reserveState, oracle] = reservesAndOracles[0];\n\n if (!oracle) {\n throw Error(`Could not find oracle for ${parseTokenSymbol(reserveState.config.tokenInfo.name)} reserve`);\n }\n const kaminoReserve = KaminoReserve.initialize(\n reserve,\n reservePk,\n reserveState,\n oracle,\n connection,\n recentSlotDurationMs\n );\n\n return kaminoReserve;\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 connection: Connection,\n market: KaminoMarket,\n mint: string,\n programId: PublicKey = PROGRAM_ID\n): Promise<[PublicKey, AccountInfo<Buffer>]> {\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: market.address,\n },\n },\n {\n memcmp: {\n offset: 128,\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 return [reserve.pubkey, reserve.account];\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 { AccountInfo, 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 {\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 '@kamino-finance/kliquidity-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 readonly recentSlotDurationMs: number;\n\n private constructor(\n connection: Connection,\n state: LendingMarket,\n marketAddress: string,\n reserves: Map<PublicKey, KaminoReserve>,\n scope: Scope,\n recentSlotDurationMs: number,\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 this.recentSlotDurationMs = recentSlotDurationMs;\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 recentSlotDurationMs: number,\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, recentSlotDurationMs)\n : new Map<PublicKey, KaminoReserve>();\n\n return new KaminoMarket(\n connection,\n market,\n marketAddress.toString(),\n reserves,\n scope,\n recentSlotDurationMs,\n programId\n );\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(\n this.getAddress(),\n this.connection,\n this.programId,\n this.recentSlotDurationMs\n );\n this.reservesActive = getReservesActive(this.reserves);\n }\n\n async reloadSingleReserve(reservePk: PublicKey, accountData?: AccountInfo<Buffer>): Promise<void> {\n const reserve = await getSingleReserve(reservePk, this.connection, this.recentSlotDurationMs, accountData);\n this.reserves.set(reservePk, reserve);\n this.reservesActive.set(reservePk, reserve);\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 getMinNetValueObligation(): Decimal {\n return new Fraction(this.state.minNetValueInObligationSf).toDecimal();\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 let tvl = new Decimal(0);\n for (const reserve of this.reserves.values()) {\n tvl = tvl.add(reserve.getDepositTvl());\n }\n return tvl;\n }\n\n getTotalBorrowTVL(): Decimal {\n let tvl = new Decimal(0);\n for (const reserve of this.reserves.values()) {\n tvl = 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 /**\n * @returns The max borrowable amount for leverage positions\n */\n async getMaxLeverageBorrowableAmount(\n collReserve: KaminoReserve,\n debtReserve: KaminoReserve,\n slot: number,\n requestElevationGroup: boolean,\n obligation?: KaminoObligation\n ): Promise<Decimal> {\n return obligation\n ? obligation.getMaxBorrowAmount(this, debtReserve.getLiquidityMint(), slot, requestElevationGroup)\n : debtReserve.getMaxBorrowAmountWithCollReserve(this, collReserve, slot);\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 this.recentSlotDurationMs\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(\n reserve.address,\n reserve.getEstimatedCumulativeBorrowRate(slot, this.state.referralFeeBps)\n );\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 getRecentSlotDurationMs(): number {\n return this.recentSlotDurationMs;\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 recentSlotDurationMs: number\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 recentSlotDurationMs\n );\n reservesByAddress.set(kaminoReserve.address, kaminoReserve);\n });\n return reservesByAddress;\n}\n\nexport async function getSingleReserve(\n reservePk: PublicKey,\n connection: Connection,\n recentSlotDurationMs: number,\n accountData?: AccountInfo<Buffer>\n): Promise<KaminoReserve> {\n const reserve = accountData ? accountData : await connection.getAccountInfo(reservePk);\n\n if (reserve === null) {\n throw new Error(`Reserve account ${reservePk.toBase58()} does not exist`);\n }\n\n const reserveAccount = Reserve.decode(reserve.data);\n\n if (!reserveAccount) {\n throw Error(`Could not parse reserve ${reservePk.toBase58()}`);\n }\n\n const reservesAndOracles = await getTokenOracleData(connection, [reserveAccount]);\n const [reserveState, oracle] = reservesAndOracles[0];\n\n if (!oracle) {\n throw Error(`Could not find oracle for ${parseTokenSymbol(reserveState.config.tokenInfo.name)} reserve`);\n }\n const kaminoReserve = KaminoReserve.initialize(\n reserve,\n reservePk,\n reserveState,\n oracle,\n connection,\n recentSlotDurationMs\n );\n\n return kaminoReserve;\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 connection: Connection,\n market: KaminoMarket,\n mint: string,\n programId: PublicKey = PROGRAM_ID\n): Promise<[PublicKey, AccountInfo<Buffer>]> {\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: market.address,\n },\n },\n {\n memcmp: {\n offset: 128,\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 return [reserve.pubkey, reserve.account];\n}\n\nconst lamportsToNumberDecimal = (amount: Decimal.Value, decimals: number): Decimal => {\n const factor = 10 ** decimals;\n return new Decimal(amount).div(factor);\n};\n"]}
|
|
@@ -153,7 +153,7 @@ export declare class KaminoObligation {
|
|
|
153
153
|
borrowLiquidationLimit: Decimal;
|
|
154
154
|
};
|
|
155
155
|
static calculateObligationBorrows(market: KaminoMarket, obligation: Obligation, cumulativeBorrowRates: Map<PublicKey, Decimal> | null, getPx: (reserve: KaminoReserve) => Decimal): BorrowStats;
|
|
156
|
-
getMaxBorrowAmount(market: KaminoMarket, tokenMint: PublicKey, slot: number,
|
|
156
|
+
getMaxBorrowAmount(market: KaminoMarket, tokenMint: PublicKey, slot: number, requestElevationGroup: boolean): Decimal;
|
|
157
157
|
getMaxWithdrawAmount(market: KaminoMarket, tokenMint: PublicKey, slot: number): Decimal;
|
|
158
158
|
/**
|
|
159
159
|
*
|
|
@@ -543,11 +543,25 @@ class KaminoObligation {
|
|
|
543
543
|
positions,
|
|
544
544
|
};
|
|
545
545
|
}
|
|
546
|
-
getMaxBorrowAmount(market, tokenMint, slot,
|
|
546
|
+
getMaxBorrowAmount(market, tokenMint, slot, requestElevationGroup) {
|
|
547
547
|
const reserve = market.getReserveByMint(tokenMint);
|
|
548
548
|
if (!reserve) {
|
|
549
549
|
throw new Error('Reserve not found');
|
|
550
550
|
}
|
|
551
|
+
const groups = market.state.elevationGroups;
|
|
552
|
+
const emodeGroupsDebtReserve = reserve.state.config.elevationGroups;
|
|
553
|
+
const commonElevationGroups = [...emodeGroupsDebtReserve].filter((item) => item !== 0 && groups[item - 1].debtReserve.equals(reserve.address));
|
|
554
|
+
let elevationGroup = this.state.elevationGroup;
|
|
555
|
+
if (commonElevationGroups.length != 0) {
|
|
556
|
+
const eModeGroupWithMaxLtvAndDebtReserve = commonElevationGroups.reduce((prev, curr) => {
|
|
557
|
+
const prevGroup = groups.find((group) => group.id === prev);
|
|
558
|
+
const currGroup = groups.find((group) => group.id === curr);
|
|
559
|
+
return prevGroup.ltvPct > currGroup.ltvPct ? prev : curr;
|
|
560
|
+
});
|
|
561
|
+
if (requestElevationGroup) {
|
|
562
|
+
elevationGroup = eModeGroupWithMaxLtvAndDebtReserve;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
551
565
|
const elevationGroupActivated = reserve.state.config.elevationGroups.includes(elevationGroup) && elevationGroup !== 0;
|
|
552
566
|
const reserveBorrowFactor = reserve.getBorrowFactor();
|
|
553
567
|
const borrowFactor = elevationGroupActivated ? new decimal_js_1.default(1) : reserveBorrowFactor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obligation.js","sourceRoot":"","sources":["../../src/classes/obligation.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { KaminoReserve } from './reserve';\nimport { Obligation } from '../idl_codegen/accounts';\nimport { KaminoMarket } from './market';\nimport BN from 'bn.js';\nimport { Fraction } from './fraction';\nimport { ObligationCollateral, ObligationLiquidity } from '../idl_codegen/types';\nimport { positiveOrZero, valueOrZero } from './utils';\nimport { isNotNullPubkey, PubkeyHashMap, U64_MAX } from '../utils';\nimport { ActionType } from './action';\n\nexport type Position = {\n reserveAddress: PublicKey;\n mintAddress: PublicKey;\n amount: Decimal;\n marketValueRefreshed: Decimal;\n};\n\nexport type ObligationStats = {\n userTotalDeposit: Decimal;\n userTotalBorrow: Decimal;\n userTotalBorrowBorrowFactorAdjusted: Decimal;\n borrowLimit: Decimal;\n borrowLiquidationLimit: Decimal;\n borrowUtilization: Decimal;\n netAccountValue: Decimal;\n loanToValue: Decimal;\n liquidationLtv: Decimal;\n leverage: Decimal;\n potentialElevationGroupUpdate: number;\n};\n\ninterface BorrowStats {\n borrows: Map<PublicKey, Position>;\n userTotalBorrow: Decimal;\n userTotalBorrowBorrowFactorAdjusted: Decimal;\n positions: number;\n}\n\nexport class KaminoObligation {\n obligationAddress: PublicKey;\n\n state: Obligation;\n\n /**\n * Deposits stored in a map of reserve address to position\n */\n deposits: Map<PublicKey, Position>;\n\n /**\n * Borrows stored in a map of reserve address to position\n */\n borrows: Map<PublicKey, Position>;\n\n refreshedStats: ObligationStats;\n\n obligationTag: number;\n\n /**\n * Initialise a new Obligation from the deserialized state\n * @param market\n * @param obligationAddress\n * @param obligation\n * @param collateralExchangeRates - rates from the market by reserve address, will be calculated if not provided\n * @param cumulativeBorrowRates - rates from the market by reserve address, will be calculated if not provided\n */\n constructor(\n market: KaminoMarket,\n obligationAddress: PublicKey,\n obligation: Obligation,\n collateralExchangeRates: Map<PublicKey, Decimal>,\n cumulativeBorrowRates: Map<PublicKey, Decimal>\n ) {\n this.obligationAddress = obligationAddress;\n this.state = obligation;\n const { borrows, deposits, refreshedStats } = this.calculatePositions(\n market,\n obligation,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n this.deposits = deposits;\n this.borrows = borrows;\n this.refreshedStats = refreshedStats;\n this.obligationTag = obligation.tag.toNumber();\n }\n\n static async load(kaminoMarket: KaminoMarket, obligationAddress: PublicKey): Promise<KaminoObligation | null> {\n const res = await kaminoMarket.getConnection().getAccountInfoAndContext(obligationAddress);\n if (res.value === null) {\n return null;\n }\n const accInfo = res.value;\n if (!accInfo.owner.equals(kaminoMarket.programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n const obligation = Obligation.decode(accInfo.data);\n\n if (obligation === null) {\n return null;\n }\n const { collateralExchangeRates, cumulativeBorrowRates } = KaminoObligation.getRatesForObligation(\n kaminoMarket,\n obligation,\n res.context.slot\n );\n return new KaminoObligation(\n kaminoMarket,\n obligationAddress,\n obligation,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n }\n\n static async loadAll(\n kaminoMarket: KaminoMarket,\n obligationAddresses: PublicKey[],\n slot?: number\n ): Promise<(KaminoObligation | null)[]> {\n let currentSlot = slot;\n let obligations: (Obligation | null)[];\n if (!currentSlot) {\n [currentSlot, obligations] = await Promise.all([\n kaminoMarket.getConnection().getSlot(),\n Obligation.fetchMultiple(kaminoMarket.getConnection(), obligationAddresses, kaminoMarket.programId),\n ]);\n } else {\n obligations = await Obligation.fetchMultiple(\n kaminoMarket.getConnection(),\n obligationAddresses,\n kaminoMarket.programId\n );\n }\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n for (const obligation of obligations) {\n if (obligation !== null) {\n KaminoObligation.addRatesForObligation(\n kaminoMarket,\n obligation,\n collateralExchangeRates,\n cumulativeBorrowRates,\n currentSlot\n );\n }\n }\n\n return obligations.map((obligation, i) => {\n if (obligation === null) {\n return null;\n }\n return new KaminoObligation(\n kaminoMarket,\n obligationAddresses[i],\n obligation,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n });\n }\n\n /**\n * @returns the obligation borrows as a list\n */\n getBorrows(): Array<Position> {\n return [...this.borrows.values()];\n }\n\n /**\n * @returns the obligation borrows as a list\n */\n getDeposits(): Array<Position> {\n return [...this.deposits.values()];\n }\n\n /**\n * @returns the total deposited value of the obligation (sum of all deposits)\n */\n getDepositedValue(): Decimal {\n return new Fraction(this.state.depositedValueSf).toDecimal();\n }\n\n /**\n * @returns the total borrowed value of the obligation (sum of all borrows -- no borrow factor)\n */\n getBorrowedMarketValue(): Decimal {\n return new Fraction(this.state.borrowedAssetsMarketValueSf).toDecimal();\n }\n\n /**\n * @returns the total borrowed value of the obligation (sum of all borrows -- with borrow factor weighting)\n */\n getBorrowedMarketValueBFAdjusted(): Decimal {\n return new Fraction(this.state.borrowFactorAdjustedDebtValueSf).toDecimal();\n }\n\n /**\n * @returns total borrow power of the obligation, relative to max LTV of each asset's reserve\n */\n getAllowedBorrowValue(): Decimal {\n return new Fraction(this.state.allowedBorrowValueSf).toDecimal();\n }\n\n /**\n * @returns the borrow value at which the obligation gets liquidatable\n * (relative to the liquidation threshold of each asset's reserve)\n */\n getUnhealthyBorrowValue(): Decimal {\n return new Fraction(this.state.unhealthyBorrowValueSf).toDecimal();\n }\n\n /**\n *\n * @returns Market value of the deposit in the specified obligation collateral/deposit asset (USD)\n */\n getDepositMarketValue(deposit: ObligationCollateral): Decimal {\n return new Fraction(deposit.marketValueSf).toDecimal();\n }\n\n getBorrowByReserve(reserve: PublicKey): Position | undefined {\n return this.borrows.get(reserve);\n }\n\n getDepositByReserve(reserve: PublicKey): Position | undefined {\n return this.deposits.get(reserve);\n }\n\n getBorrowByMint(mint: PublicKey): Position | undefined {\n for (const value of this.borrows.values()) {\n if (value.mintAddress.equals(mint)) {\n return value;\n }\n }\n return undefined;\n }\n\n getDepositByMint(mint: PublicKey): Position | undefined {\n for (const value of this.deposits.values()) {\n if (value.mintAddress.equals(mint)) {\n return value;\n }\n }\n return undefined;\n }\n\n /**\n *\n * @returns Market value of the borrow in the specified obligation liquidity/borrow asset (USD) (no borrow factor weighting)\n */\n getBorrowMarketValue(borrow: ObligationLiquidity): Decimal {\n return new Fraction(borrow.marketValueSf).toDecimal();\n }\n\n /**\n *\n * @returns Market value of the borrow in the specified obligation liquidity/borrow asset (USD) (with borrow factor weighting)\n */\n getBorrowMarketValueBFAdjusted(borrow: ObligationLiquidity): Decimal {\n return new Fraction(borrow.borrowFactorAdjustedMarketValueSf).toDecimal();\n }\n\n /**\n * Calculate the current ratio of borrowed value to deposited value\n */\n loanToValue(): Decimal {\n if (this.refreshedStats.userTotalDeposit.eq(0)) {\n return new Decimal(0);\n }\n return this.refreshedStats.userTotalBorrowBorrowFactorAdjusted.div(this.refreshedStats.userTotalDeposit);\n }\n\n /**\n * @returns the total number of positions (deposits + borrows)\n */\n getNumberOfPositions(): number {\n return this.deposits.size + this.borrows.size;\n }\n\n getNetAccountValue(): Decimal {\n return this.refreshedStats.netAccountValue;\n }\n\n /**\n * @returns the potential elevation groups the obligation qualifies for\n */\n getElevationGroups(kaminoMarket: KaminoMarket): Array<number> {\n const reserves = new PubkeyHashMap<PublicKey, KaminoReserve>();\n for (const deposit of this.state.deposits.values()) {\n if (isNotNullPubkey(deposit.depositReserve) && !reserves.has(deposit.depositReserve)) {\n reserves.set(deposit.depositReserve, kaminoMarket.getReserveByAddress(deposit.depositReserve)!);\n }\n }\n for (const borrow of this.state.borrows.values()) {\n if (isNotNullPubkey(borrow.borrowReserve) && !reserves.has(borrow.borrowReserve)) {\n reserves.set(borrow.borrowReserve, kaminoMarket.getReserveByAddress(borrow.borrowReserve)!);\n }\n }\n return KaminoObligation.getElevationGroupsForReserves([...reserves.values()]);\n }\n\n static getElevationGroupsForReserves(reserves: Array<KaminoReserve>): Array<number> {\n const elevationGroupsCounts = new Map<number, number>();\n for (const reserve of reserves) {\n for (const elevationGroup of reserve.state.config.elevationGroups) {\n if (elevationGroup !== 0) {\n const count = elevationGroupsCounts.get(elevationGroup);\n if (count) {\n elevationGroupsCounts.set(elevationGroup, count + 1);\n } else {\n elevationGroupsCounts.set(elevationGroup, 1);\n }\n }\n }\n }\n const activeElevationGroups = new Array<number>();\n for (const [group, count] of elevationGroupsCounts.entries()) {\n if (count === reserves.length) {\n activeElevationGroups.push(group);\n }\n }\n return activeElevationGroups;\n }\n\n calculateSimulatedBorrow(\n oldStats: ObligationStats,\n oldBorrows: Map<PublicKey, Position>,\n borrowAmount: Decimal,\n mint: PublicKey,\n reserves: Map<PublicKey, KaminoReserve>\n ): {\n stats: ObligationStats;\n borrows: Map<PublicKey, Position>;\n } {\n const newStats = { ...oldStats };\n const newBorrows = new PubkeyHashMap<PublicKey, Position>([...oldBorrows.entries()]);\n let borrowPosition: Position | undefined = undefined;\n for (const oldBorrow of oldBorrows.values()) {\n if (oldBorrow.mintAddress.equals(mint)) {\n borrowPosition = { ...oldBorrow };\n }\n }\n let reserve: KaminoReserve | undefined = undefined;\n for (const kaminoReserve of reserves.values()) {\n if (kaminoReserve.getLiquidityMint().equals(mint)) {\n reserve = kaminoReserve;\n }\n }\n\n if (!reserve) {\n throw new Error(`No reserve found for mint ${mint}`);\n }\n\n if (!borrowPosition) {\n borrowPosition = {\n reserveAddress: reserve!.address,\n mintAddress: mint,\n amount: new Decimal(0),\n marketValueRefreshed: new Decimal(0),\n };\n }\n\n if (!reserve.state.config.elevationGroups.includes(this.state.elevationGroup)) {\n throw new Error(\n `User would have to downgrade the elevation group in order to be able to borrow from this reserve`\n );\n }\n\n const borrowFactor =\n this.state.elevationGroup !== 0 ? new Decimal(1) : new Decimal(reserve.stats.borrowFactor).div(100);\n\n const borrowValueUSD = borrowAmount.mul(reserve.getOracleMarketPrice()).dividedBy(reserve.getMintFactor());\n\n const borrowValueBorrowFactorAdjustedUSD = borrowValueUSD.mul(borrowFactor);\n\n newStats.userTotalBorrow = positiveOrZero(newStats.userTotalBorrow.plus(borrowValueUSD));\n newStats.userTotalBorrowBorrowFactorAdjusted = positiveOrZero(\n newStats.userTotalBorrowBorrowFactorAdjusted.plus(borrowValueBorrowFactorAdjustedUSD)\n );\n\n borrowPosition.amount = positiveOrZero(borrowPosition.amount.plus(borrowAmount));\n borrowPosition.mintAddress = mint;\n borrowPosition.marketValueRefreshed = positiveOrZero(borrowPosition.marketValueRefreshed.plus(borrowValueUSD));\n\n newBorrows.set(borrowPosition.reserveAddress, borrowPosition);\n return {\n borrows: newBorrows,\n stats: newStats,\n };\n }\n\n calculateSimulatedDeposit(\n oldStats: ObligationStats,\n oldDeposits: Map<PublicKey, Position>,\n amount: Decimal,\n mint: PublicKey,\n reserves: Map<PublicKey, KaminoReserve>,\n market: KaminoMarket\n ): {\n stats: ObligationStats;\n deposits: Map<PublicKey, Position>;\n } {\n const newStats = { ...oldStats };\n const newDeposits = new PubkeyHashMap<PublicKey, Position>([...oldDeposits.entries()]);\n\n let depositPosition: Position | undefined = undefined;\n for (const oldDeposit of oldDeposits.values()) {\n if (oldDeposit.mintAddress.equals(mint)) {\n depositPosition = { ...oldDeposit };\n }\n }\n let reserve: KaminoReserve | undefined = undefined;\n for (const kaminoReserve of reserves.values()) {\n if (kaminoReserve.getLiquidityMint().equals(mint)) {\n reserve = kaminoReserve;\n }\n }\n if (!reserve) {\n throw new Error(`No reserve found for mint ${mint}`);\n }\n\n if (!depositPosition) {\n depositPosition = {\n reserveAddress: reserve!.address,\n mintAddress: mint,\n amount: new Decimal(0),\n marketValueRefreshed: new Decimal(0),\n };\n }\n\n let loanToValue = reserve.stats.loanToValuePct;\n let liqThreshold = reserve.stats.liquidationThreshold;\n\n if (this.state.elevationGroup !== 0) {\n loanToValue = market.getElevationGroup(this.state.elevationGroup).ltvPct / 100;\n liqThreshold = market.getElevationGroup(this.state.elevationGroup).liquidationThresholdPct / 100;\n }\n\n if (!reserve.state.config.elevationGroups.includes(this.state.elevationGroup)) {\n throw new Error(\n `User would have to downgrade the elevation group in order to be able to deposit in this reserve`\n );\n }\n\n const supplyAmount = amount; //.mul(reserve.getCollateralExchangeRate()).floor();\n const supplyAmountMultiplierUSD = supplyAmount\n .mul(reserve.getOracleMarketPrice())\n .dividedBy('1'.concat(Array(reserve.stats.decimals + 1).join('0')));\n\n newStats.userTotalDeposit = positiveOrZero(newStats.userTotalDeposit.plus(supplyAmountMultiplierUSD));\n newStats.borrowLimit = positiveOrZero(newStats.borrowLimit.plus(supplyAmountMultiplierUSD.mul(loanToValue)));\n newStats.borrowLiquidationLimit = positiveOrZero(\n newStats.borrowLiquidationLimit.plus(supplyAmountMultiplierUSD.mul(liqThreshold))\n );\n newStats.liquidationLtv = valueOrZero(newStats.borrowLiquidationLimit.div(newStats.userTotalDeposit));\n\n depositPosition.amount = positiveOrZero(depositPosition.amount.plus(amount));\n depositPosition.mintAddress = mint;\n depositPosition.marketValueRefreshed = positiveOrZero(\n depositPosition.marketValueRefreshed.plus(\n supplyAmount.mul(reserve.getOracleMarketPrice()).dividedBy(reserve.getMintFactor())\n )\n );\n\n newDeposits.set(depositPosition.reserveAddress, depositPosition);\n\n return {\n deposits: newDeposits,\n stats: newStats,\n };\n }\n\n /**\n * Calculate the newly modified stats of the obligation\n */\n // TODO: Elevation group problems\n // TODO: Shall we set up position limits?\n getSimulatedObligationStats(params: {\n amountCollateral?: Decimal;\n amountDebt?: Decimal;\n action: ActionType;\n mint: PublicKey;\n market: KaminoMarket;\n reserves: Map<PublicKey, KaminoReserve>;\n }): {\n stats: ObligationStats;\n deposits: Map<PublicKey, Position>;\n borrows: Map<PublicKey, Position>;\n } {\n const { amountCollateral, amountDebt, action, mint, market, reserves } = params;\n let newStats = { ...this.refreshedStats };\n let newDeposits: Map<PublicKey, Position> = new PubkeyHashMap<PublicKey, Position>([...this.deposits.entries()]);\n let newBorrows: Map<PublicKey, Position> = new PubkeyHashMap<PublicKey, Position>([...this.borrows.entries()]);\n\n switch (action) {\n case 'deposit': {\n if (amountCollateral === undefined) {\n throw Error('amountColl is required for deposit action');\n }\n const { stats, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n amountCollateral,\n mint,\n reserves,\n market\n );\n\n newStats = stats;\n newDeposits = deposits;\n\n break;\n }\n case 'borrow': {\n if (amountDebt === undefined) {\n throw Error('amountDebt is required for borrow action');\n }\n const { stats, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n amountDebt,\n mint,\n reserves\n );\n newStats = stats;\n newBorrows = borrows;\n break;\n }\n case 'repay': {\n if (amountDebt === undefined) {\n throw Error('amountDebt is required for repay action');\n }\n const { stats, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n new Decimal(amountDebt).neg(),\n mint,\n reserves\n );\n newStats = stats;\n newBorrows = borrows;\n break;\n }\n\n case 'withdraw': {\n if (amountCollateral === undefined) {\n throw Error('amountColl is required for withdraw action');\n }\n const { stats, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n new Decimal(amountCollateral).neg(),\n mint,\n reserves,\n market\n );\n newStats = stats;\n newDeposits = deposits;\n break;\n }\n case 'depositAndBorrow': {\n if (amountCollateral === undefined || amountDebt === undefined) {\n throw Error('amountColl and amountDebt are required for depositAndBorrow action');\n }\n const { stats: statsAfterDeposit, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n amountCollateral,\n mint,\n reserves,\n market\n );\n const { stats, borrows } = this.calculateSimulatedBorrow(\n statsAfterDeposit,\n this.borrows,\n amountDebt,\n mint,\n reserves\n );\n\n newStats = stats;\n newDeposits = deposits;\n newBorrows = borrows;\n break;\n }\n case 'repayAndWithdraw': {\n if (amountCollateral === undefined || amountDebt === undefined) {\n throw Error('amountColl and amountDebt are required for repayAndWithdraw action');\n }\n const { stats: statsAfterRepay, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n new Decimal(amountDebt).neg(),\n mint,\n reserves\n );\n const { stats: statsAfterWithdraw, deposits } = this.calculateSimulatedDeposit(\n statsAfterRepay,\n this.deposits,\n new Decimal(amountCollateral).neg(),\n mint,\n reserves,\n market\n );\n newStats = statsAfterWithdraw;\n newDeposits = deposits;\n newBorrows = borrows;\n break;\n }\n default: {\n throw Error(`Invalid action type ${action} for getSimulatedObligationStats`);\n }\n }\n newStats.netAccountValue = newStats.userTotalDeposit.minus(newStats.userTotalBorrow);\n newStats.loanToValue = valueOrZero(\n newStats.userTotalBorrowBorrowFactorAdjusted.dividedBy(newStats.userTotalDeposit)\n );\n newStats.leverage = valueOrZero(newStats.userTotalDeposit.dividedBy(newStats.netAccountValue));\n\n return {\n stats: newStats,\n deposits: newDeposits,\n borrows: newBorrows,\n };\n }\n\n estimateObligationInterestRate = (\n market: KaminoMarket,\n reserve: KaminoReserve,\n borrow: ObligationLiquidity,\n currentSlot: number\n ): Decimal => {\n const estimatedCumulativeBorrowRate = reserve.getEstimatedCumulativeBorrowRate(\n currentSlot,\n market.state.referralFeeBps\n );\n\n const currentCumulativeBorrowRate = KaminoObligation.getCumulativeBorrowRate(borrow);\n\n if (estimatedCumulativeBorrowRate.gt(currentCumulativeBorrowRate)) {\n return estimatedCumulativeBorrowRate.div(currentCumulativeBorrowRate);\n }\n\n return new Decimal(0);\n };\n\n private calculateDeposits(\n market: KaminoMarket,\n obligation: Obligation,\n collateralExchangeRates: Map<PublicKey, Decimal>,\n getPx: (reserve: KaminoReserve) => Decimal\n ): {\n deposits: Map<PublicKey, Position>;\n userTotalDeposit: Decimal;\n borrowLimit: Decimal;\n liquidationLtv: Decimal;\n borrowLiquidationLimit: Decimal;\n } {\n return KaminoObligation.calculateObligationDeposits(market, obligation, collateralExchangeRates, getPx);\n }\n\n private calculateBorrows(\n market: KaminoMarket,\n obligation: Obligation,\n cumulativeBorrowRates: Map<PublicKey, Decimal>,\n getPx: (reserve: KaminoReserve) => Decimal\n ): BorrowStats {\n return KaminoObligation.calculateObligationBorrows(market, obligation, cumulativeBorrowRates, getPx);\n }\n\n private calculatePositions(\n market: KaminoMarket,\n obligation: Obligation,\n collateralExchangeRates: Map<PublicKey, Decimal>,\n cumulativeBorrowRates: Map<PublicKey, Decimal>\n ): {\n borrows: Map<PublicKey, Position>;\n deposits: Map<PublicKey, Position>;\n refreshedStats: ObligationStats;\n } {\n const getOraclePx = (reserve: KaminoReserve) => reserve.getOracleMarketPrice();\n const depositStatsOraclePrice = this.calculateDeposits(market, obligation, collateralExchangeRates, getOraclePx);\n\n const borrowStatsOraclePrice = this.calculateBorrows(market, obligation, cumulativeBorrowRates, getOraclePx);\n\n const netAccountValueScopeRefreshed = depositStatsOraclePrice.userTotalDeposit.minus(\n borrowStatsOraclePrice.userTotalBorrow\n );\n\n const potentialElevationGroupUpdate = 0;\n\n return {\n deposits: depositStatsOraclePrice.deposits,\n borrows: borrowStatsOraclePrice.borrows,\n refreshedStats: {\n borrowLimit: depositStatsOraclePrice.borrowLimit,\n borrowLiquidationLimit: depositStatsOraclePrice.borrowLiquidationLimit,\n userTotalBorrow: borrowStatsOraclePrice.userTotalBorrow,\n userTotalBorrowBorrowFactorAdjusted: borrowStatsOraclePrice.userTotalBorrowBorrowFactorAdjusted,\n userTotalDeposit: depositStatsOraclePrice.userTotalDeposit,\n liquidationLtv: depositStatsOraclePrice.liquidationLtv,\n borrowUtilization: borrowStatsOraclePrice.userTotalBorrowBorrowFactorAdjusted.dividedBy(\n depositStatsOraclePrice.borrowLimit\n ),\n netAccountValue: netAccountValueScopeRefreshed,\n leverage: depositStatsOraclePrice.userTotalDeposit.dividedBy(netAccountValueScopeRefreshed),\n loanToValue: borrowStatsOraclePrice.userTotalBorrowBorrowFactorAdjusted.dividedBy(\n depositStatsOraclePrice.userTotalDeposit\n ),\n potentialElevationGroupUpdate,\n },\n };\n }\n\n public static calculateObligationDeposits(\n market: KaminoMarket,\n obligation: Obligation,\n collateralExchangeRates: Map<PublicKey, Decimal> | null,\n getPx: (reserve: KaminoReserve) => Decimal\n ): {\n deposits: Map<PublicKey, Position>;\n userTotalDeposit: Decimal;\n userTotalCollateralDeposit: Decimal;\n borrowLimit: Decimal;\n liquidationLtv: Decimal;\n borrowLiquidationLimit: Decimal;\n } {\n let userTotalDeposit = new Decimal(0);\n let userTotalCollateralDeposit = new Decimal(0);\n let borrowLimit = new Decimal(0);\n let borrowLiquidationLimit = new Decimal(0);\n\n const deposits = new PubkeyHashMap<PublicKey, Position>();\n for (let i = 0; i < obligation.deposits.length; i++) {\n if (!isNotNullPubkey(obligation.deposits[i].depositReserve)) {\n continue;\n }\n const deposit = obligation.deposits[i];\n const reserve = market.getReserveByAddress(deposit.depositReserve);\n if (!reserve) {\n throw new Error(\n `Obligation contains a deposit belonging to reserve: ${deposit.depositReserve} but the reserve was not found on the market. Deposit amount: ${deposit.depositedAmount}`\n );\n }\n let loanToValue = reserve.stats.loanToValuePct;\n let liqThreshold = reserve.stats.liquidationThreshold;\n\n if (obligation.elevationGroup !== 0) {\n loanToValue = market.state.elevationGroups[obligation.elevationGroup - 1].ltvPct / 100;\n liqThreshold = market.state.elevationGroups[obligation.elevationGroup - 1].liquidationThresholdPct / 100;\n }\n\n let exchangeRate;\n if (collateralExchangeRates !== null) {\n exchangeRate = collateralExchangeRates.get(reserve.address)!;\n } else {\n exchangeRate = reserve.getCollateralExchangeRate();\n }\n const supplyAmount = new Decimal(deposit.depositedAmount.toString()).div(exchangeRate);\n\n const depositValueUsd = supplyAmount.mul(getPx(reserve)).div(reserve.getMintFactor());\n\n userTotalDeposit = userTotalDeposit.add(depositValueUsd);\n\n if (loanToValue !== 0) {\n userTotalCollateralDeposit = userTotalCollateralDeposit.add(depositValueUsd);\n }\n\n borrowLimit = borrowLimit.add(depositValueUsd.mul(loanToValue));\n borrowLiquidationLimit = borrowLiquidationLimit.add(depositValueUsd.mul(liqThreshold));\n\n const position: Position = {\n reserveAddress: reserve.address,\n mintAddress: reserve.getLiquidityMint(),\n amount: supplyAmount,\n marketValueRefreshed: depositValueUsd,\n };\n deposits.set(reserve.address, position);\n }\n\n return {\n deposits,\n userTotalDeposit,\n userTotalCollateralDeposit,\n borrowLimit,\n liquidationLtv: valueOrZero(borrowLiquidationLimit.div(userTotalDeposit)),\n borrowLiquidationLimit,\n };\n }\n\n public static calculateObligationBorrows(\n market: KaminoMarket,\n obligation: Obligation,\n cumulativeBorrowRates: Map<PublicKey, Decimal> | null,\n getPx: (reserve: KaminoReserve) => Decimal\n ): BorrowStats {\n let userTotalBorrow = new Decimal(0);\n let userTotalBorrowBorrowFactorAdjusted = new Decimal(0);\n let positions = 0;\n\n const borrows = new PubkeyHashMap<PublicKey, Position>();\n for (let i = 0; i < obligation.borrows.length; i++) {\n if (!isNotNullPubkey(obligation.borrows[i].borrowReserve)) {\n continue;\n }\n const borrow = obligation.borrows[i];\n const reserve = market.getReserveByAddress(borrow.borrowReserve);\n if (!reserve) {\n throw new Error(\n `Obligation contains a borrow belonging to reserve: ${\n borrow.borrowReserve\n } but the reserve was not found on the market. Borrow amount: ${KaminoObligation.getBorrowAmount(borrow)}`\n );\n }\n\n const obligationCumulativeBorrowRate = KaminoObligation.getCumulativeBorrowRate(borrow);\n let cumulativeBorrowRate;\n if (cumulativeBorrowRates !== null) {\n cumulativeBorrowRate = cumulativeBorrowRates.get(reserve.address)!;\n } else {\n cumulativeBorrowRate = reserve.getCumulativeBorrowRate();\n }\n\n const borrowAmount = KaminoObligation.getBorrowAmount(borrow)\n .mul(cumulativeBorrowRate)\n .dividedBy(obligationCumulativeBorrowRate);\n\n const borrowValueUsd = borrowAmount.mul(getPx(reserve)).dividedBy(reserve.getMintFactor());\n\n const borrowFactor = KaminoObligation.getBorrowFactorForReserve(reserve, obligation.elevationGroup);\n const borrowValueBorrowFactorAdjustedUsd = borrowValueUsd.mul(borrowFactor);\n\n if (!borrowAmount.eq(new Decimal('0'))) {\n positions += 1;\n }\n\n userTotalBorrow = userTotalBorrow.plus(borrowValueUsd);\n userTotalBorrowBorrowFactorAdjusted = userTotalBorrowBorrowFactorAdjusted.plus(\n borrowValueBorrowFactorAdjustedUsd\n );\n\n const position: Position = {\n reserveAddress: reserve.address,\n mintAddress: reserve.getLiquidityMint(),\n amount: borrowAmount,\n marketValueRefreshed: borrowValueUsd,\n };\n borrows.set(reserve.address, position);\n }\n\n return {\n borrows,\n userTotalBorrow,\n userTotalBorrowBorrowFactorAdjusted,\n positions,\n };\n }\n\n getMaxBorrowAmount(\n market: KaminoMarket,\n tokenMint: PublicKey,\n slot: number,\n elevationGroup: number = this.state.elevationGroup\n ): Decimal {\n const reserve = market.getReserveByMint(tokenMint);\n\n if (!reserve) {\n throw new Error('Reserve not found');\n }\n\n const elevationGroupActivated =\n reserve.state.config.elevationGroups.includes(elevationGroup) && elevationGroup !== 0;\n\n const reserveBorrowFactor = reserve.getBorrowFactor();\n const borrowFactor = elevationGroupActivated ? new Decimal(1) : reserveBorrowFactor;\n\n const maxObligationBorrowPower = this.refreshedStats.borrowLimit // adjusted available amount\n .minus(this.refreshedStats.userTotalBorrowBorrowFactorAdjusted)\n .div(borrowFactor)\n .div(reserve.getOracleMarketPrice())\n .mul(reserve.getMintFactor());\n const reserveAvailableAmount = reserve.getLiquidityAvailableAmount();\n let reserveBorrowCapRemained = reserve.stats.reserveBorrowLimit.sub(reserve.getBorrowedAmount());\n\n this.deposits.forEach((deposit) => {\n const depositReserve = market.getReserveByAddress(deposit.reserveAddress);\n if (!depositReserve) {\n throw new Error('Reserve not found');\n }\n if (depositReserve.state.config.disableUsageAsCollOutsideEmode && !elevationGroupActivated) {\n reserveBorrowCapRemained = new Decimal(0);\n }\n });\n\n let maxBorrowAmount = Decimal.min(maxObligationBorrowPower, reserveAvailableAmount, reserveBorrowCapRemained);\n\n const debtWithdrawalCap = reserve.getDebtWithdrawalCapCapacity().sub(reserve.getDebtWithdrawalCapCurrent(slot));\n maxBorrowAmount = reserve.getDebtWithdrawalCapCapacity().gt(0)\n ? Decimal.min(maxBorrowAmount, debtWithdrawalCap)\n : maxBorrowAmount;\n\n let originationFeeRate = reserve.getBorrowFee();\n\n // Inclusive fee rate\n originationFeeRate = originationFeeRate.div(originationFeeRate.add(new Decimal(1)));\n const borrowFee = maxBorrowAmount.mul(originationFeeRate);\n\n maxBorrowAmount = maxBorrowAmount.sub(borrowFee);\n\n const utilizationRatioLimit = reserve.state.config.utilizationLimitBlockBorrowingAbove / 100;\n const currentUtilizationRatio = reserve.calculateUtilizationRatio();\n\n if (utilizationRatioLimit > 0 && currentUtilizationRatio > utilizationRatioLimit) {\n return new Decimal(0);\n } else if (utilizationRatioLimit > 0 && currentUtilizationRatio < utilizationRatioLimit) {\n const maxBorrowBasedOnUtilization = new Decimal(utilizationRatioLimit - currentUtilizationRatio).mul(\n reserve.getTotalSupply()\n );\n maxBorrowAmount = Decimal.min(maxBorrowAmount, maxBorrowBasedOnUtilization);\n }\n\n let borrowLimitDependentOnElevationGroup = new Decimal(U64_MAX);\n\n if (!elevationGroupActivated) {\n borrowLimitDependentOnElevationGroup = reserve\n .getBorrowLimitOutsideElevationGroup()\n .sub(reserve.getBorrowedAmountOutsideElevationGroup());\n } else {\n let maxDebtTakenAgainstCollaterals = new Decimal(U64_MAX);\n for (const [_, value] of this.deposits.entries()) {\n const depositReserve = market.getReserveByAddress(value.reserveAddress);\n\n if (!depositReserve) {\n throw new Error('Reserve not found');\n }\n\n const maxDebtAllowedAgainstCollateral = depositReserve\n .getBorrowLimitAgainstCollateralInElevationGroup(elevationGroup - 1)\n .sub(depositReserve.getBorrowedAmountAgainstCollateralInElevationGroup(elevationGroup - 1));\n\n maxDebtTakenAgainstCollaterals = Decimal.max(\n new Decimal(0),\n Decimal.min(maxDebtAllowedAgainstCollateral, maxDebtTakenAgainstCollaterals)\n );\n }\n borrowLimitDependentOnElevationGroup = maxDebtTakenAgainstCollaterals;\n }\n\n maxBorrowAmount = Decimal.min(maxBorrowAmount, borrowLimitDependentOnElevationGroup);\n\n return Decimal.max(new Decimal(0), maxBorrowAmount);\n }\n\n getMaxWithdrawAmount(market: KaminoMarket, tokenMint: PublicKey, slot: number): Decimal {\n const reserve = market.getReserveByMint(tokenMint);\n\n if (!reserve) {\n throw new Error('Reserve not found');\n }\n\n const userDepositPosition = this.getDepositByReserve(reserve.address);\n\n if (!userDepositPosition) {\n throw new Error('Deposit reserve not found');\n }\n\n const userDepositPositionAmount = userDepositPosition.amount;\n\n if (this.refreshedStats.userTotalBorrowBorrowFactorAdjusted.equals(new Decimal(0))) {\n return new Decimal(userDepositPositionAmount);\n }\n\n const elevationGroupActivated =\n reserve.state.config.elevationGroups.includes(this.state.elevationGroup) && this.state.elevationGroup !== 0;\n\n const reserveMaxLtv = elevationGroupActivated\n ? market.getElevationGroup(this.state.elevationGroup).ltvPct / 100\n : reserve.stats.loanToValuePct;\n // bf adjusted debt value > allowed_borrow_value\n if (this.refreshedStats.userTotalBorrowBorrowFactorAdjusted >= this.refreshedStats.borrowLimit) {\n return new Decimal(0);\n }\n\n let maxWithdrawValue;\n if (reserveMaxLtv === 0) {\n maxWithdrawValue = userDepositPositionAmount;\n } else {\n // borrowLimit / userTotalDeposit = maxLtv\n // maxWithdrawValue = userTotalDeposit - userTotalBorrow / maxLtv\n maxWithdrawValue = this.refreshedStats.borrowLimit\n .sub(this.refreshedStats.userTotalBorrowBorrowFactorAdjusted)\n .div(reserveMaxLtv)\n .mul(0.999); // remove 0.1% to prevent going over max ltv\n }\n\n const maxWithdrawAmount = maxWithdrawValue.div(reserve.getOracleMarketPrice()).mul(reserve.getMintFactor());\n const reserveAvailableLiquidity = reserve.getLiquidityAvailableAmount();\n\n const withdrawalCapRemained = reserve\n .getDepositWithdrawalCapCapacity()\n .sub(reserve.getDepositWithdrawalCapCurrent(slot));\n return Decimal.max(\n 0,\n Decimal.min(userDepositPositionAmount, maxWithdrawAmount, reserveAvailableLiquidity, withdrawalCapRemained)\n );\n }\n\n /**\n *\n * @returns Total borrowed amount for the specified obligation liquidity/borrow asset\n */\n static getBorrowAmount(borrow: ObligationLiquidity): Decimal {\n return new Fraction(borrow.borrowedAmountSf).toDecimal();\n }\n\n /**\n *\n * @returns Cumulative borrow rate for the specified obligation liquidity/borrow asset\n */\n static getCumulativeBorrowRate(borrow: ObligationLiquidity): Decimal {\n let accSf = new BN(0);\n for (const value of borrow.cumulativeBorrowRateBsf.value.reverse()) {\n accSf = accSf.add(value);\n accSf.shrn(64);\n }\n return new Fraction(accSf).toDecimal();\n }\n\n public static getRatesForObligation(\n kaminoMarket: KaminoMarket,\n obligation: Obligation,\n slot: number\n ): {\n collateralExchangeRates: Map<PublicKey, Decimal>;\n cumulativeBorrowRates: Map<PublicKey, Decimal>;\n } {\n const collateralExchangeRates = KaminoObligation.getCollateralExchangeRatesForObligation(\n kaminoMarket,\n obligation,\n slot\n );\n const cumulativeBorrowRates = KaminoObligation.getCumulativeBorrowRatesForObligation(\n kaminoMarket,\n obligation,\n slot\n );\n\n return {\n collateralExchangeRates,\n cumulativeBorrowRates,\n };\n }\n\n public static addRatesForObligation(\n kaminoMarket: KaminoMarket,\n obligation: Obligation,\n collateralExchangeRates: Map<PublicKey, Decimal>,\n cumulativeBorrowRates: Map<PublicKey, Decimal>,\n slot: number\n ): void {\n KaminoObligation.addCollateralExchangeRatesForObligation(kaminoMarket, collateralExchangeRates, obligation, slot);\n KaminoObligation.addCumulativeBorrowRatesForObligation(kaminoMarket, cumulativeBorrowRates, obligation, slot);\n }\n\n static getCollateralExchangeRatesForObligation(\n kaminoMarket: KaminoMarket,\n obligation: Obligation,\n slot: number\n ): Map<PublicKey, Decimal> {\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n for (let i = 0; i < obligation.deposits.length; i++) {\n const deposit = obligation.deposits[i];\n if (isNotNullPubkey(deposit.depositReserve) && !collateralExchangeRates.has(deposit.depositReserve)) {\n const reserve = kaminoMarket.getReserveByAddress(deposit.depositReserve)!;\n const collateralExchangeRate = reserve.getEstimatedCollateralExchangeRate(\n slot,\n kaminoMarket.state.referralFeeBps\n );\n collateralExchangeRates.set(reserve.address, collateralExchangeRate);\n }\n }\n return collateralExchangeRates;\n }\n\n static addCollateralExchangeRatesForObligation(\n kaminoMarket: KaminoMarket,\n collateralExchangeRates: Map<PublicKey, Decimal>,\n obligation: Obligation,\n slot: number\n ) {\n for (let i = 0; i < obligation.deposits.length; i++) {\n const deposit = obligation.deposits[i];\n if (isNotNullPubkey(deposit.depositReserve) && !collateralExchangeRates.has(deposit.depositReserve)) {\n const reserve = kaminoMarket.getReserveByAddress(deposit.depositReserve)!;\n const collateralExchangeRate = reserve.getEstimatedCollateralExchangeRate(\n slot,\n kaminoMarket.state.referralFeeBps\n );\n collateralExchangeRates.set(reserve.address, collateralExchangeRate);\n }\n }\n }\n\n static getCumulativeBorrowRatesForObligation(kaminoMarket: KaminoMarket, obligation: Obligation, slot: number) {\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n for (let i = 0; i < obligation.borrows.length; i++) {\n const borrow = obligation.borrows[i];\n if (isNotNullPubkey(borrow.borrowReserve) && !cumulativeBorrowRates.has(borrow.borrowReserve)) {\n const reserve = kaminoMarket.getReserveByAddress(borrow.borrowReserve)!;\n const cumulativeBorrowRate = reserve.getEstimatedCumulativeBorrowRate(slot, kaminoMarket.state.referralFeeBps);\n cumulativeBorrowRates.set(reserve.address, cumulativeBorrowRate);\n }\n }\n return cumulativeBorrowRates;\n }\n\n static addCumulativeBorrowRatesForObligation(\n kaminoMarket: KaminoMarket,\n cumulativeBorrowRates: Map<PublicKey, Decimal>,\n obligation: Obligation,\n slot: number\n ) {\n for (let i = 0; i < obligation.borrows.length; i++) {\n const borrow = obligation.borrows[i];\n if (isNotNullPubkey(borrow.borrowReserve) && !cumulativeBorrowRates.has(borrow.borrowReserve)) {\n const reserve = kaminoMarket.getReserveByAddress(borrow.borrowReserve)!;\n const cumulativeBorrowRate = reserve.getEstimatedCumulativeBorrowRate(slot, kaminoMarket.state.referralFeeBps);\n cumulativeBorrowRates.set(reserve.address, cumulativeBorrowRate);\n }\n }\n }\n\n static getBorrowFactorForReserve(reserve: KaminoReserve, elevationGroup: number): Decimal {\n if (elevationGroup !== 0) {\n return new Decimal(1);\n }\n return new Decimal(reserve.stats.borrowFactor).div(100);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"obligation.js","sourceRoot":"","sources":["../../src/classes/obligation.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable max-classes-per-file */\nimport { PublicKey } from '@solana/web3.js';\nimport Decimal from 'decimal.js';\nimport { KaminoReserve } from './reserve';\nimport { Obligation } from '../idl_codegen/accounts';\nimport { KaminoMarket } from './market';\nimport BN from 'bn.js';\nimport { Fraction } from './fraction';\nimport { ObligationCollateral, ObligationLiquidity } from '../idl_codegen/types';\nimport { positiveOrZero, valueOrZero } from './utils';\nimport { isNotNullPubkey, PubkeyHashMap, U64_MAX } from '../utils';\nimport { ActionType } from './action';\n\nexport type Position = {\n reserveAddress: PublicKey;\n mintAddress: PublicKey;\n amount: Decimal;\n marketValueRefreshed: Decimal;\n};\n\nexport type ObligationStats = {\n userTotalDeposit: Decimal;\n userTotalBorrow: Decimal;\n userTotalBorrowBorrowFactorAdjusted: Decimal;\n borrowLimit: Decimal;\n borrowLiquidationLimit: Decimal;\n borrowUtilization: Decimal;\n netAccountValue: Decimal;\n loanToValue: Decimal;\n liquidationLtv: Decimal;\n leverage: Decimal;\n potentialElevationGroupUpdate: number;\n};\n\ninterface BorrowStats {\n borrows: Map<PublicKey, Position>;\n userTotalBorrow: Decimal;\n userTotalBorrowBorrowFactorAdjusted: Decimal;\n positions: number;\n}\n\nexport class KaminoObligation {\n obligationAddress: PublicKey;\n\n state: Obligation;\n\n /**\n * Deposits stored in a map of reserve address to position\n */\n deposits: Map<PublicKey, Position>;\n\n /**\n * Borrows stored in a map of reserve address to position\n */\n borrows: Map<PublicKey, Position>;\n\n refreshedStats: ObligationStats;\n\n obligationTag: number;\n\n /**\n * Initialise a new Obligation from the deserialized state\n * @param market\n * @param obligationAddress\n * @param obligation\n * @param collateralExchangeRates - rates from the market by reserve address, will be calculated if not provided\n * @param cumulativeBorrowRates - rates from the market by reserve address, will be calculated if not provided\n */\n constructor(\n market: KaminoMarket,\n obligationAddress: PublicKey,\n obligation: Obligation,\n collateralExchangeRates: Map<PublicKey, Decimal>,\n cumulativeBorrowRates: Map<PublicKey, Decimal>\n ) {\n this.obligationAddress = obligationAddress;\n this.state = obligation;\n const { borrows, deposits, refreshedStats } = this.calculatePositions(\n market,\n obligation,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n this.deposits = deposits;\n this.borrows = borrows;\n this.refreshedStats = refreshedStats;\n this.obligationTag = obligation.tag.toNumber();\n }\n\n static async load(kaminoMarket: KaminoMarket, obligationAddress: PublicKey): Promise<KaminoObligation | null> {\n const res = await kaminoMarket.getConnection().getAccountInfoAndContext(obligationAddress);\n if (res.value === null) {\n return null;\n }\n const accInfo = res.value;\n if (!accInfo.owner.equals(kaminoMarket.programId)) {\n throw new Error(\"account doesn't belong to this program\");\n }\n const obligation = Obligation.decode(accInfo.data);\n\n if (obligation === null) {\n return null;\n }\n const { collateralExchangeRates, cumulativeBorrowRates } = KaminoObligation.getRatesForObligation(\n kaminoMarket,\n obligation,\n res.context.slot\n );\n return new KaminoObligation(\n kaminoMarket,\n obligationAddress,\n obligation,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n }\n\n static async loadAll(\n kaminoMarket: KaminoMarket,\n obligationAddresses: PublicKey[],\n slot?: number\n ): Promise<(KaminoObligation | null)[]> {\n let currentSlot = slot;\n let obligations: (Obligation | null)[];\n if (!currentSlot) {\n [currentSlot, obligations] = await Promise.all([\n kaminoMarket.getConnection().getSlot(),\n Obligation.fetchMultiple(kaminoMarket.getConnection(), obligationAddresses, kaminoMarket.programId),\n ]);\n } else {\n obligations = await Obligation.fetchMultiple(\n kaminoMarket.getConnection(),\n obligationAddresses,\n kaminoMarket.programId\n );\n }\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n for (const obligation of obligations) {\n if (obligation !== null) {\n KaminoObligation.addRatesForObligation(\n kaminoMarket,\n obligation,\n collateralExchangeRates,\n cumulativeBorrowRates,\n currentSlot\n );\n }\n }\n\n return obligations.map((obligation, i) => {\n if (obligation === null) {\n return null;\n }\n return new KaminoObligation(\n kaminoMarket,\n obligationAddresses[i],\n obligation,\n collateralExchangeRates,\n cumulativeBorrowRates\n );\n });\n }\n\n /**\n * @returns the obligation borrows as a list\n */\n getBorrows(): Array<Position> {\n return [...this.borrows.values()];\n }\n\n /**\n * @returns the obligation borrows as a list\n */\n getDeposits(): Array<Position> {\n return [...this.deposits.values()];\n }\n\n /**\n * @returns the total deposited value of the obligation (sum of all deposits)\n */\n getDepositedValue(): Decimal {\n return new Fraction(this.state.depositedValueSf).toDecimal();\n }\n\n /**\n * @returns the total borrowed value of the obligation (sum of all borrows -- no borrow factor)\n */\n getBorrowedMarketValue(): Decimal {\n return new Fraction(this.state.borrowedAssetsMarketValueSf).toDecimal();\n }\n\n /**\n * @returns the total borrowed value of the obligation (sum of all borrows -- with borrow factor weighting)\n */\n getBorrowedMarketValueBFAdjusted(): Decimal {\n return new Fraction(this.state.borrowFactorAdjustedDebtValueSf).toDecimal();\n }\n\n /**\n * @returns total borrow power of the obligation, relative to max LTV of each asset's reserve\n */\n getAllowedBorrowValue(): Decimal {\n return new Fraction(this.state.allowedBorrowValueSf).toDecimal();\n }\n\n /**\n * @returns the borrow value at which the obligation gets liquidatable\n * (relative to the liquidation threshold of each asset's reserve)\n */\n getUnhealthyBorrowValue(): Decimal {\n return new Fraction(this.state.unhealthyBorrowValueSf).toDecimal();\n }\n\n /**\n *\n * @returns Market value of the deposit in the specified obligation collateral/deposit asset (USD)\n */\n getDepositMarketValue(deposit: ObligationCollateral): Decimal {\n return new Fraction(deposit.marketValueSf).toDecimal();\n }\n\n getBorrowByReserve(reserve: PublicKey): Position | undefined {\n return this.borrows.get(reserve);\n }\n\n getDepositByReserve(reserve: PublicKey): Position | undefined {\n return this.deposits.get(reserve);\n }\n\n getBorrowByMint(mint: PublicKey): Position | undefined {\n for (const value of this.borrows.values()) {\n if (value.mintAddress.equals(mint)) {\n return value;\n }\n }\n return undefined;\n }\n\n getDepositByMint(mint: PublicKey): Position | undefined {\n for (const value of this.deposits.values()) {\n if (value.mintAddress.equals(mint)) {\n return value;\n }\n }\n return undefined;\n }\n\n /**\n *\n * @returns Market value of the borrow in the specified obligation liquidity/borrow asset (USD) (no borrow factor weighting)\n */\n getBorrowMarketValue(borrow: ObligationLiquidity): Decimal {\n return new Fraction(borrow.marketValueSf).toDecimal();\n }\n\n /**\n *\n * @returns Market value of the borrow in the specified obligation liquidity/borrow asset (USD) (with borrow factor weighting)\n */\n getBorrowMarketValueBFAdjusted(borrow: ObligationLiquidity): Decimal {\n return new Fraction(borrow.borrowFactorAdjustedMarketValueSf).toDecimal();\n }\n\n /**\n * Calculate the current ratio of borrowed value to deposited value\n */\n loanToValue(): Decimal {\n if (this.refreshedStats.userTotalDeposit.eq(0)) {\n return new Decimal(0);\n }\n return this.refreshedStats.userTotalBorrowBorrowFactorAdjusted.div(this.refreshedStats.userTotalDeposit);\n }\n\n /**\n * @returns the total number of positions (deposits + borrows)\n */\n getNumberOfPositions(): number {\n return this.deposits.size + this.borrows.size;\n }\n\n getNetAccountValue(): Decimal {\n return this.refreshedStats.netAccountValue;\n }\n\n /**\n * @returns the potential elevation groups the obligation qualifies for\n */\n getElevationGroups(kaminoMarket: KaminoMarket): Array<number> {\n const reserves = new PubkeyHashMap<PublicKey, KaminoReserve>();\n for (const deposit of this.state.deposits.values()) {\n if (isNotNullPubkey(deposit.depositReserve) && !reserves.has(deposit.depositReserve)) {\n reserves.set(deposit.depositReserve, kaminoMarket.getReserveByAddress(deposit.depositReserve)!);\n }\n }\n for (const borrow of this.state.borrows.values()) {\n if (isNotNullPubkey(borrow.borrowReserve) && !reserves.has(borrow.borrowReserve)) {\n reserves.set(borrow.borrowReserve, kaminoMarket.getReserveByAddress(borrow.borrowReserve)!);\n }\n }\n return KaminoObligation.getElevationGroupsForReserves([...reserves.values()]);\n }\n\n static getElevationGroupsForReserves(reserves: Array<KaminoReserve>): Array<number> {\n const elevationGroupsCounts = new Map<number, number>();\n for (const reserve of reserves) {\n for (const elevationGroup of reserve.state.config.elevationGroups) {\n if (elevationGroup !== 0) {\n const count = elevationGroupsCounts.get(elevationGroup);\n if (count) {\n elevationGroupsCounts.set(elevationGroup, count + 1);\n } else {\n elevationGroupsCounts.set(elevationGroup, 1);\n }\n }\n }\n }\n const activeElevationGroups = new Array<number>();\n for (const [group, count] of elevationGroupsCounts.entries()) {\n if (count === reserves.length) {\n activeElevationGroups.push(group);\n }\n }\n return activeElevationGroups;\n }\n\n calculateSimulatedBorrow(\n oldStats: ObligationStats,\n oldBorrows: Map<PublicKey, Position>,\n borrowAmount: Decimal,\n mint: PublicKey,\n reserves: Map<PublicKey, KaminoReserve>\n ): {\n stats: ObligationStats;\n borrows: Map<PublicKey, Position>;\n } {\n const newStats = { ...oldStats };\n const newBorrows = new PubkeyHashMap<PublicKey, Position>([...oldBorrows.entries()]);\n let borrowPosition: Position | undefined = undefined;\n for (const oldBorrow of oldBorrows.values()) {\n if (oldBorrow.mintAddress.equals(mint)) {\n borrowPosition = { ...oldBorrow };\n }\n }\n let reserve: KaminoReserve | undefined = undefined;\n for (const kaminoReserve of reserves.values()) {\n if (kaminoReserve.getLiquidityMint().equals(mint)) {\n reserve = kaminoReserve;\n }\n }\n\n if (!reserve) {\n throw new Error(`No reserve found for mint ${mint}`);\n }\n\n if (!borrowPosition) {\n borrowPosition = {\n reserveAddress: reserve!.address,\n mintAddress: mint,\n amount: new Decimal(0),\n marketValueRefreshed: new Decimal(0),\n };\n }\n\n if (!reserve.state.config.elevationGroups.includes(this.state.elevationGroup)) {\n throw new Error(\n `User would have to downgrade the elevation group in order to be able to borrow from this reserve`\n );\n }\n\n const borrowFactor =\n this.state.elevationGroup !== 0 ? new Decimal(1) : new Decimal(reserve.stats.borrowFactor).div(100);\n\n const borrowValueUSD = borrowAmount.mul(reserve.getOracleMarketPrice()).dividedBy(reserve.getMintFactor());\n\n const borrowValueBorrowFactorAdjustedUSD = borrowValueUSD.mul(borrowFactor);\n\n newStats.userTotalBorrow = positiveOrZero(newStats.userTotalBorrow.plus(borrowValueUSD));\n newStats.userTotalBorrowBorrowFactorAdjusted = positiveOrZero(\n newStats.userTotalBorrowBorrowFactorAdjusted.plus(borrowValueBorrowFactorAdjustedUSD)\n );\n\n borrowPosition.amount = positiveOrZero(borrowPosition.amount.plus(borrowAmount));\n borrowPosition.mintAddress = mint;\n borrowPosition.marketValueRefreshed = positiveOrZero(borrowPosition.marketValueRefreshed.plus(borrowValueUSD));\n\n newBorrows.set(borrowPosition.reserveAddress, borrowPosition);\n return {\n borrows: newBorrows,\n stats: newStats,\n };\n }\n\n calculateSimulatedDeposit(\n oldStats: ObligationStats,\n oldDeposits: Map<PublicKey, Position>,\n amount: Decimal,\n mint: PublicKey,\n reserves: Map<PublicKey, KaminoReserve>,\n market: KaminoMarket\n ): {\n stats: ObligationStats;\n deposits: Map<PublicKey, Position>;\n } {\n const newStats = { ...oldStats };\n const newDeposits = new PubkeyHashMap<PublicKey, Position>([...oldDeposits.entries()]);\n\n let depositPosition: Position | undefined = undefined;\n for (const oldDeposit of oldDeposits.values()) {\n if (oldDeposit.mintAddress.equals(mint)) {\n depositPosition = { ...oldDeposit };\n }\n }\n let reserve: KaminoReserve | undefined = undefined;\n for (const kaminoReserve of reserves.values()) {\n if (kaminoReserve.getLiquidityMint().equals(mint)) {\n reserve = kaminoReserve;\n }\n }\n if (!reserve) {\n throw new Error(`No reserve found for mint ${mint}`);\n }\n\n if (!depositPosition) {\n depositPosition = {\n reserveAddress: reserve!.address,\n mintAddress: mint,\n amount: new Decimal(0),\n marketValueRefreshed: new Decimal(0),\n };\n }\n\n let loanToValue = reserve.stats.loanToValuePct;\n let liqThreshold = reserve.stats.liquidationThreshold;\n\n if (this.state.elevationGroup !== 0) {\n loanToValue = market.getElevationGroup(this.state.elevationGroup).ltvPct / 100;\n liqThreshold = market.getElevationGroup(this.state.elevationGroup).liquidationThresholdPct / 100;\n }\n\n if (!reserve.state.config.elevationGroups.includes(this.state.elevationGroup)) {\n throw new Error(\n `User would have to downgrade the elevation group in order to be able to deposit in this reserve`\n );\n }\n\n const supplyAmount = amount; //.mul(reserve.getCollateralExchangeRate()).floor();\n const supplyAmountMultiplierUSD = supplyAmount\n .mul(reserve.getOracleMarketPrice())\n .dividedBy('1'.concat(Array(reserve.stats.decimals + 1).join('0')));\n\n newStats.userTotalDeposit = positiveOrZero(newStats.userTotalDeposit.plus(supplyAmountMultiplierUSD));\n newStats.borrowLimit = positiveOrZero(newStats.borrowLimit.plus(supplyAmountMultiplierUSD.mul(loanToValue)));\n newStats.borrowLiquidationLimit = positiveOrZero(\n newStats.borrowLiquidationLimit.plus(supplyAmountMultiplierUSD.mul(liqThreshold))\n );\n newStats.liquidationLtv = valueOrZero(newStats.borrowLiquidationLimit.div(newStats.userTotalDeposit));\n\n depositPosition.amount = positiveOrZero(depositPosition.amount.plus(amount));\n depositPosition.mintAddress = mint;\n depositPosition.marketValueRefreshed = positiveOrZero(\n depositPosition.marketValueRefreshed.plus(\n supplyAmount.mul(reserve.getOracleMarketPrice()).dividedBy(reserve.getMintFactor())\n )\n );\n\n newDeposits.set(depositPosition.reserveAddress, depositPosition);\n\n return {\n deposits: newDeposits,\n stats: newStats,\n };\n }\n\n /**\n * Calculate the newly modified stats of the obligation\n */\n // TODO: Elevation group problems\n // TODO: Shall we set up position limits?\n getSimulatedObligationStats(params: {\n amountCollateral?: Decimal;\n amountDebt?: Decimal;\n action: ActionType;\n mint: PublicKey;\n market: KaminoMarket;\n reserves: Map<PublicKey, KaminoReserve>;\n }): {\n stats: ObligationStats;\n deposits: Map<PublicKey, Position>;\n borrows: Map<PublicKey, Position>;\n } {\n const { amountCollateral, amountDebt, action, mint, market, reserves } = params;\n let newStats = { ...this.refreshedStats };\n let newDeposits: Map<PublicKey, Position> = new PubkeyHashMap<PublicKey, Position>([...this.deposits.entries()]);\n let newBorrows: Map<PublicKey, Position> = new PubkeyHashMap<PublicKey, Position>([...this.borrows.entries()]);\n\n switch (action) {\n case 'deposit': {\n if (amountCollateral === undefined) {\n throw Error('amountColl is required for deposit action');\n }\n const { stats, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n amountCollateral,\n mint,\n reserves,\n market\n );\n\n newStats = stats;\n newDeposits = deposits;\n\n break;\n }\n case 'borrow': {\n if (amountDebt === undefined) {\n throw Error('amountDebt is required for borrow action');\n }\n const { stats, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n amountDebt,\n mint,\n reserves\n );\n newStats = stats;\n newBorrows = borrows;\n break;\n }\n case 'repay': {\n if (amountDebt === undefined) {\n throw Error('amountDebt is required for repay action');\n }\n const { stats, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n new Decimal(amountDebt).neg(),\n mint,\n reserves\n );\n newStats = stats;\n newBorrows = borrows;\n break;\n }\n\n case 'withdraw': {\n if (amountCollateral === undefined) {\n throw Error('amountColl is required for withdraw action');\n }\n const { stats, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n new Decimal(amountCollateral).neg(),\n mint,\n reserves,\n market\n );\n newStats = stats;\n newDeposits = deposits;\n break;\n }\n case 'depositAndBorrow': {\n if (amountCollateral === undefined || amountDebt === undefined) {\n throw Error('amountColl and amountDebt are required for depositAndBorrow action');\n }\n const { stats: statsAfterDeposit, deposits } = this.calculateSimulatedDeposit(\n this.refreshedStats,\n this.deposits,\n amountCollateral,\n mint,\n reserves,\n market\n );\n const { stats, borrows } = this.calculateSimulatedBorrow(\n statsAfterDeposit,\n this.borrows,\n amountDebt,\n mint,\n reserves\n );\n\n newStats = stats;\n newDeposits = deposits;\n newBorrows = borrows;\n break;\n }\n case 'repayAndWithdraw': {\n if (amountCollateral === undefined || amountDebt === undefined) {\n throw Error('amountColl and amountDebt are required for repayAndWithdraw action');\n }\n const { stats: statsAfterRepay, borrows } = this.calculateSimulatedBorrow(\n this.refreshedStats,\n this.borrows,\n new Decimal(amountDebt).neg(),\n mint,\n reserves\n );\n const { stats: statsAfterWithdraw, deposits } = this.calculateSimulatedDeposit(\n statsAfterRepay,\n this.deposits,\n new Decimal(amountCollateral).neg(),\n mint,\n reserves,\n market\n );\n newStats = statsAfterWithdraw;\n newDeposits = deposits;\n newBorrows = borrows;\n break;\n }\n default: {\n throw Error(`Invalid action type ${action} for getSimulatedObligationStats`);\n }\n }\n newStats.netAccountValue = newStats.userTotalDeposit.minus(newStats.userTotalBorrow);\n newStats.loanToValue = valueOrZero(\n newStats.userTotalBorrowBorrowFactorAdjusted.dividedBy(newStats.userTotalDeposit)\n );\n newStats.leverage = valueOrZero(newStats.userTotalDeposit.dividedBy(newStats.netAccountValue));\n\n return {\n stats: newStats,\n deposits: newDeposits,\n borrows: newBorrows,\n };\n }\n\n estimateObligationInterestRate = (\n market: KaminoMarket,\n reserve: KaminoReserve,\n borrow: ObligationLiquidity,\n currentSlot: number\n ): Decimal => {\n const estimatedCumulativeBorrowRate = reserve.getEstimatedCumulativeBorrowRate(\n currentSlot,\n market.state.referralFeeBps\n );\n\n const currentCumulativeBorrowRate = KaminoObligation.getCumulativeBorrowRate(borrow);\n\n if (estimatedCumulativeBorrowRate.gt(currentCumulativeBorrowRate)) {\n return estimatedCumulativeBorrowRate.div(currentCumulativeBorrowRate);\n }\n\n return new Decimal(0);\n };\n\n private calculateDeposits(\n market: KaminoMarket,\n obligation: Obligation,\n collateralExchangeRates: Map<PublicKey, Decimal>,\n getPx: (reserve: KaminoReserve) => Decimal\n ): {\n deposits: Map<PublicKey, Position>;\n userTotalDeposit: Decimal;\n borrowLimit: Decimal;\n liquidationLtv: Decimal;\n borrowLiquidationLimit: Decimal;\n } {\n return KaminoObligation.calculateObligationDeposits(market, obligation, collateralExchangeRates, getPx);\n }\n\n private calculateBorrows(\n market: KaminoMarket,\n obligation: Obligation,\n cumulativeBorrowRates: Map<PublicKey, Decimal>,\n getPx: (reserve: KaminoReserve) => Decimal\n ): BorrowStats {\n return KaminoObligation.calculateObligationBorrows(market, obligation, cumulativeBorrowRates, getPx);\n }\n\n private calculatePositions(\n market: KaminoMarket,\n obligation: Obligation,\n collateralExchangeRates: Map<PublicKey, Decimal>,\n cumulativeBorrowRates: Map<PublicKey, Decimal>\n ): {\n borrows: Map<PublicKey, Position>;\n deposits: Map<PublicKey, Position>;\n refreshedStats: ObligationStats;\n } {\n const getOraclePx = (reserve: KaminoReserve) => reserve.getOracleMarketPrice();\n const depositStatsOraclePrice = this.calculateDeposits(market, obligation, collateralExchangeRates, getOraclePx);\n\n const borrowStatsOraclePrice = this.calculateBorrows(market, obligation, cumulativeBorrowRates, getOraclePx);\n\n const netAccountValueScopeRefreshed = depositStatsOraclePrice.userTotalDeposit.minus(\n borrowStatsOraclePrice.userTotalBorrow\n );\n\n const potentialElevationGroupUpdate = 0;\n\n return {\n deposits: depositStatsOraclePrice.deposits,\n borrows: borrowStatsOraclePrice.borrows,\n refreshedStats: {\n borrowLimit: depositStatsOraclePrice.borrowLimit,\n borrowLiquidationLimit: depositStatsOraclePrice.borrowLiquidationLimit,\n userTotalBorrow: borrowStatsOraclePrice.userTotalBorrow,\n userTotalBorrowBorrowFactorAdjusted: borrowStatsOraclePrice.userTotalBorrowBorrowFactorAdjusted,\n userTotalDeposit: depositStatsOraclePrice.userTotalDeposit,\n liquidationLtv: depositStatsOraclePrice.liquidationLtv,\n borrowUtilization: borrowStatsOraclePrice.userTotalBorrowBorrowFactorAdjusted.dividedBy(\n depositStatsOraclePrice.borrowLimit\n ),\n netAccountValue: netAccountValueScopeRefreshed,\n leverage: depositStatsOraclePrice.userTotalDeposit.dividedBy(netAccountValueScopeRefreshed),\n loanToValue: borrowStatsOraclePrice.userTotalBorrowBorrowFactorAdjusted.dividedBy(\n depositStatsOraclePrice.userTotalDeposit\n ),\n potentialElevationGroupUpdate,\n },\n };\n }\n\n public static calculateObligationDeposits(\n market: KaminoMarket,\n obligation: Obligation,\n collateralExchangeRates: Map<PublicKey, Decimal> | null,\n getPx: (reserve: KaminoReserve) => Decimal\n ): {\n deposits: Map<PublicKey, Position>;\n userTotalDeposit: Decimal;\n userTotalCollateralDeposit: Decimal;\n borrowLimit: Decimal;\n liquidationLtv: Decimal;\n borrowLiquidationLimit: Decimal;\n } {\n let userTotalDeposit = new Decimal(0);\n let userTotalCollateralDeposit = new Decimal(0);\n let borrowLimit = new Decimal(0);\n let borrowLiquidationLimit = new Decimal(0);\n\n const deposits = new PubkeyHashMap<PublicKey, Position>();\n for (let i = 0; i < obligation.deposits.length; i++) {\n if (!isNotNullPubkey(obligation.deposits[i].depositReserve)) {\n continue;\n }\n const deposit = obligation.deposits[i];\n const reserve = market.getReserveByAddress(deposit.depositReserve);\n if (!reserve) {\n throw new Error(\n `Obligation contains a deposit belonging to reserve: ${deposit.depositReserve} but the reserve was not found on the market. Deposit amount: ${deposit.depositedAmount}`\n );\n }\n let loanToValue = reserve.stats.loanToValuePct;\n let liqThreshold = reserve.stats.liquidationThreshold;\n\n if (obligation.elevationGroup !== 0) {\n loanToValue = market.state.elevationGroups[obligation.elevationGroup - 1].ltvPct / 100;\n liqThreshold = market.state.elevationGroups[obligation.elevationGroup - 1].liquidationThresholdPct / 100;\n }\n\n let exchangeRate;\n if (collateralExchangeRates !== null) {\n exchangeRate = collateralExchangeRates.get(reserve.address)!;\n } else {\n exchangeRate = reserve.getCollateralExchangeRate();\n }\n const supplyAmount = new Decimal(deposit.depositedAmount.toString()).div(exchangeRate);\n\n const depositValueUsd = supplyAmount.mul(getPx(reserve)).div(reserve.getMintFactor());\n\n userTotalDeposit = userTotalDeposit.add(depositValueUsd);\n\n if (loanToValue !== 0) {\n userTotalCollateralDeposit = userTotalCollateralDeposit.add(depositValueUsd);\n }\n\n borrowLimit = borrowLimit.add(depositValueUsd.mul(loanToValue));\n borrowLiquidationLimit = borrowLiquidationLimit.add(depositValueUsd.mul(liqThreshold));\n\n const position: Position = {\n reserveAddress: reserve.address,\n mintAddress: reserve.getLiquidityMint(),\n amount: supplyAmount,\n marketValueRefreshed: depositValueUsd,\n };\n deposits.set(reserve.address, position);\n }\n\n return {\n deposits,\n userTotalDeposit,\n userTotalCollateralDeposit,\n borrowLimit,\n liquidationLtv: valueOrZero(borrowLiquidationLimit.div(userTotalDeposit)),\n borrowLiquidationLimit,\n };\n }\n\n public static calculateObligationBorrows(\n market: KaminoMarket,\n obligation: Obligation,\n cumulativeBorrowRates: Map<PublicKey, Decimal> | null,\n getPx: (reserve: KaminoReserve) => Decimal\n ): BorrowStats {\n let userTotalBorrow = new Decimal(0);\n let userTotalBorrowBorrowFactorAdjusted = new Decimal(0);\n let positions = 0;\n\n const borrows = new PubkeyHashMap<PublicKey, Position>();\n for (let i = 0; i < obligation.borrows.length; i++) {\n if (!isNotNullPubkey(obligation.borrows[i].borrowReserve)) {\n continue;\n }\n const borrow = obligation.borrows[i];\n const reserve = market.getReserveByAddress(borrow.borrowReserve);\n if (!reserve) {\n throw new Error(\n `Obligation contains a borrow belonging to reserve: ${\n borrow.borrowReserve\n } but the reserve was not found on the market. Borrow amount: ${KaminoObligation.getBorrowAmount(borrow)}`\n );\n }\n\n const obligationCumulativeBorrowRate = KaminoObligation.getCumulativeBorrowRate(borrow);\n let cumulativeBorrowRate;\n if (cumulativeBorrowRates !== null) {\n cumulativeBorrowRate = cumulativeBorrowRates.get(reserve.address)!;\n } else {\n cumulativeBorrowRate = reserve.getCumulativeBorrowRate();\n }\n\n const borrowAmount = KaminoObligation.getBorrowAmount(borrow)\n .mul(cumulativeBorrowRate)\n .dividedBy(obligationCumulativeBorrowRate);\n\n const borrowValueUsd = borrowAmount.mul(getPx(reserve)).dividedBy(reserve.getMintFactor());\n\n const borrowFactor = KaminoObligation.getBorrowFactorForReserve(reserve, obligation.elevationGroup);\n const borrowValueBorrowFactorAdjustedUsd = borrowValueUsd.mul(borrowFactor);\n\n if (!borrowAmount.eq(new Decimal('0'))) {\n positions += 1;\n }\n\n userTotalBorrow = userTotalBorrow.plus(borrowValueUsd);\n userTotalBorrowBorrowFactorAdjusted = userTotalBorrowBorrowFactorAdjusted.plus(\n borrowValueBorrowFactorAdjustedUsd\n );\n\n const position: Position = {\n reserveAddress: reserve.address,\n mintAddress: reserve.getLiquidityMint(),\n amount: borrowAmount,\n marketValueRefreshed: borrowValueUsd,\n };\n borrows.set(reserve.address, position);\n }\n\n return {\n borrows,\n userTotalBorrow,\n userTotalBorrowBorrowFactorAdjusted,\n positions,\n };\n }\n\n getMaxBorrowAmount(\n market: KaminoMarket,\n tokenMint: PublicKey,\n slot: number,\n requestElevationGroup: boolean\n ): Decimal {\n const reserve = market.getReserveByMint(tokenMint);\n\n if (!reserve) {\n throw new Error('Reserve not found');\n }\n\n const groups = market.state.elevationGroups;\n const emodeGroupsDebtReserve = reserve.state.config.elevationGroups;\n const commonElevationGroups = [...emodeGroupsDebtReserve].filter(\n (item) => item !== 0 && groups[item - 1].debtReserve.equals(reserve.address)\n );\n\n let elevationGroup = this.state.elevationGroup;\n if (commonElevationGroups.length != 0) {\n const eModeGroupWithMaxLtvAndDebtReserve = commonElevationGroups.reduce((prev, curr) => {\n const prevGroup = groups.find((group) => group.id === prev);\n const currGroup = groups.find((group) => group.id === curr);\n return prevGroup!.ltvPct > currGroup!.ltvPct ? prev : curr;\n });\n\n if (requestElevationGroup) {\n elevationGroup = eModeGroupWithMaxLtvAndDebtReserve;\n }\n }\n\n const elevationGroupActivated =\n reserve.state.config.elevationGroups.includes(elevationGroup) && elevationGroup !== 0;\n\n const reserveBorrowFactor = reserve.getBorrowFactor();\n const borrowFactor = elevationGroupActivated ? new Decimal(1) : reserveBorrowFactor;\n\n const maxObligationBorrowPower = this.refreshedStats.borrowLimit // adjusted available amount\n .minus(this.refreshedStats.userTotalBorrowBorrowFactorAdjusted)\n .div(borrowFactor)\n .div(reserve.getOracleMarketPrice())\n .mul(reserve.getMintFactor());\n const reserveAvailableAmount = reserve.getLiquidityAvailableAmount();\n let reserveBorrowCapRemained = reserve.stats.reserveBorrowLimit.sub(reserve.getBorrowedAmount());\n\n this.deposits.forEach((deposit) => {\n const depositReserve = market.getReserveByAddress(deposit.reserveAddress);\n if (!depositReserve) {\n throw new Error('Reserve not found');\n }\n if (depositReserve.state.config.disableUsageAsCollOutsideEmode && !elevationGroupActivated) {\n reserveBorrowCapRemained = new Decimal(0);\n }\n });\n\n let maxBorrowAmount = Decimal.min(maxObligationBorrowPower, reserveAvailableAmount, reserveBorrowCapRemained);\n\n const debtWithdrawalCap = reserve.getDebtWithdrawalCapCapacity().sub(reserve.getDebtWithdrawalCapCurrent(slot));\n maxBorrowAmount = reserve.getDebtWithdrawalCapCapacity().gt(0)\n ? Decimal.min(maxBorrowAmount, debtWithdrawalCap)\n : maxBorrowAmount;\n\n let originationFeeRate = reserve.getBorrowFee();\n\n // Inclusive fee rate\n originationFeeRate = originationFeeRate.div(originationFeeRate.add(new Decimal(1)));\n const borrowFee = maxBorrowAmount.mul(originationFeeRate);\n\n maxBorrowAmount = maxBorrowAmount.sub(borrowFee);\n\n const utilizationRatioLimit = reserve.state.config.utilizationLimitBlockBorrowingAbove / 100;\n const currentUtilizationRatio = reserve.calculateUtilizationRatio();\n\n if (utilizationRatioLimit > 0 && currentUtilizationRatio > utilizationRatioLimit) {\n return new Decimal(0);\n } else if (utilizationRatioLimit > 0 && currentUtilizationRatio < utilizationRatioLimit) {\n const maxBorrowBasedOnUtilization = new Decimal(utilizationRatioLimit - currentUtilizationRatio).mul(\n reserve.getTotalSupply()\n );\n maxBorrowAmount = Decimal.min(maxBorrowAmount, maxBorrowBasedOnUtilization);\n }\n\n let borrowLimitDependentOnElevationGroup = new Decimal(U64_MAX);\n\n if (!elevationGroupActivated) {\n borrowLimitDependentOnElevationGroup = reserve\n .getBorrowLimitOutsideElevationGroup()\n .sub(reserve.getBorrowedAmountOutsideElevationGroup());\n } else {\n let maxDebtTakenAgainstCollaterals = new Decimal(U64_MAX);\n for (const [_, value] of this.deposits.entries()) {\n const depositReserve = market.getReserveByAddress(value.reserveAddress);\n\n if (!depositReserve) {\n throw new Error('Reserve not found');\n }\n\n const maxDebtAllowedAgainstCollateral = depositReserve\n .getBorrowLimitAgainstCollateralInElevationGroup(elevationGroup - 1)\n .sub(depositReserve.getBorrowedAmountAgainstCollateralInElevationGroup(elevationGroup - 1));\n\n maxDebtTakenAgainstCollaterals = Decimal.max(\n new Decimal(0),\n Decimal.min(maxDebtAllowedAgainstCollateral, maxDebtTakenAgainstCollaterals)\n );\n }\n borrowLimitDependentOnElevationGroup = maxDebtTakenAgainstCollaterals;\n }\n\n maxBorrowAmount = Decimal.min(maxBorrowAmount, borrowLimitDependentOnElevationGroup);\n\n return Decimal.max(new Decimal(0), maxBorrowAmount);\n }\n\n getMaxWithdrawAmount(market: KaminoMarket, tokenMint: PublicKey, slot: number): Decimal {\n const reserve = market.getReserveByMint(tokenMint);\n\n if (!reserve) {\n throw new Error('Reserve not found');\n }\n\n const userDepositPosition = this.getDepositByReserve(reserve.address);\n\n if (!userDepositPosition) {\n throw new Error('Deposit reserve not found');\n }\n\n const userDepositPositionAmount = userDepositPosition.amount;\n\n if (this.refreshedStats.userTotalBorrowBorrowFactorAdjusted.equals(new Decimal(0))) {\n return new Decimal(userDepositPositionAmount);\n }\n\n const elevationGroupActivated =\n reserve.state.config.elevationGroups.includes(this.state.elevationGroup) && this.state.elevationGroup !== 0;\n\n const reserveMaxLtv = elevationGroupActivated\n ? market.getElevationGroup(this.state.elevationGroup).ltvPct / 100\n : reserve.stats.loanToValuePct;\n // bf adjusted debt value > allowed_borrow_value\n if (this.refreshedStats.userTotalBorrowBorrowFactorAdjusted >= this.refreshedStats.borrowLimit) {\n return new Decimal(0);\n }\n\n let maxWithdrawValue;\n if (reserveMaxLtv === 0) {\n maxWithdrawValue = userDepositPositionAmount;\n } else {\n // borrowLimit / userTotalDeposit = maxLtv\n // maxWithdrawValue = userTotalDeposit - userTotalBorrow / maxLtv\n maxWithdrawValue = this.refreshedStats.borrowLimit\n .sub(this.refreshedStats.userTotalBorrowBorrowFactorAdjusted)\n .div(reserveMaxLtv)\n .mul(0.999); // remove 0.1% to prevent going over max ltv\n }\n\n const maxWithdrawAmount = maxWithdrawValue.div(reserve.getOracleMarketPrice()).mul(reserve.getMintFactor());\n const reserveAvailableLiquidity = reserve.getLiquidityAvailableAmount();\n\n const withdrawalCapRemained = reserve\n .getDepositWithdrawalCapCapacity()\n .sub(reserve.getDepositWithdrawalCapCurrent(slot));\n return Decimal.max(\n 0,\n Decimal.min(userDepositPositionAmount, maxWithdrawAmount, reserveAvailableLiquidity, withdrawalCapRemained)\n );\n }\n\n /**\n *\n * @returns Total borrowed amount for the specified obligation liquidity/borrow asset\n */\n static getBorrowAmount(borrow: ObligationLiquidity): Decimal {\n return new Fraction(borrow.borrowedAmountSf).toDecimal();\n }\n\n /**\n *\n * @returns Cumulative borrow rate for the specified obligation liquidity/borrow asset\n */\n static getCumulativeBorrowRate(borrow: ObligationLiquidity): Decimal {\n let accSf = new BN(0);\n for (const value of borrow.cumulativeBorrowRateBsf.value.reverse()) {\n accSf = accSf.add(value);\n accSf.shrn(64);\n }\n return new Fraction(accSf).toDecimal();\n }\n\n public static getRatesForObligation(\n kaminoMarket: KaminoMarket,\n obligation: Obligation,\n slot: number\n ): {\n collateralExchangeRates: Map<PublicKey, Decimal>;\n cumulativeBorrowRates: Map<PublicKey, Decimal>;\n } {\n const collateralExchangeRates = KaminoObligation.getCollateralExchangeRatesForObligation(\n kaminoMarket,\n obligation,\n slot\n );\n const cumulativeBorrowRates = KaminoObligation.getCumulativeBorrowRatesForObligation(\n kaminoMarket,\n obligation,\n slot\n );\n\n return {\n collateralExchangeRates,\n cumulativeBorrowRates,\n };\n }\n\n public static addRatesForObligation(\n kaminoMarket: KaminoMarket,\n obligation: Obligation,\n collateralExchangeRates: Map<PublicKey, Decimal>,\n cumulativeBorrowRates: Map<PublicKey, Decimal>,\n slot: number\n ): void {\n KaminoObligation.addCollateralExchangeRatesForObligation(kaminoMarket, collateralExchangeRates, obligation, slot);\n KaminoObligation.addCumulativeBorrowRatesForObligation(kaminoMarket, cumulativeBorrowRates, obligation, slot);\n }\n\n static getCollateralExchangeRatesForObligation(\n kaminoMarket: KaminoMarket,\n obligation: Obligation,\n slot: number\n ): Map<PublicKey, Decimal> {\n const collateralExchangeRates = new PubkeyHashMap<PublicKey, Decimal>();\n for (let i = 0; i < obligation.deposits.length; i++) {\n const deposit = obligation.deposits[i];\n if (isNotNullPubkey(deposit.depositReserve) && !collateralExchangeRates.has(deposit.depositReserve)) {\n const reserve = kaminoMarket.getReserveByAddress(deposit.depositReserve)!;\n const collateralExchangeRate = reserve.getEstimatedCollateralExchangeRate(\n slot,\n kaminoMarket.state.referralFeeBps\n );\n collateralExchangeRates.set(reserve.address, collateralExchangeRate);\n }\n }\n return collateralExchangeRates;\n }\n\n static addCollateralExchangeRatesForObligation(\n kaminoMarket: KaminoMarket,\n collateralExchangeRates: Map<PublicKey, Decimal>,\n obligation: Obligation,\n slot: number\n ) {\n for (let i = 0; i < obligation.deposits.length; i++) {\n const deposit = obligation.deposits[i];\n if (isNotNullPubkey(deposit.depositReserve) && !collateralExchangeRates.has(deposit.depositReserve)) {\n const reserve = kaminoMarket.getReserveByAddress(deposit.depositReserve)!;\n const collateralExchangeRate = reserve.getEstimatedCollateralExchangeRate(\n slot,\n kaminoMarket.state.referralFeeBps\n );\n collateralExchangeRates.set(reserve.address, collateralExchangeRate);\n }\n }\n }\n\n static getCumulativeBorrowRatesForObligation(kaminoMarket: KaminoMarket, obligation: Obligation, slot: number) {\n const cumulativeBorrowRates = new PubkeyHashMap<PublicKey, Decimal>();\n for (let i = 0; i < obligation.borrows.length; i++) {\n const borrow = obligation.borrows[i];\n if (isNotNullPubkey(borrow.borrowReserve) && !cumulativeBorrowRates.has(borrow.borrowReserve)) {\n const reserve = kaminoMarket.getReserveByAddress(borrow.borrowReserve)!;\n const cumulativeBorrowRate = reserve.getEstimatedCumulativeBorrowRate(slot, kaminoMarket.state.referralFeeBps);\n cumulativeBorrowRates.set(reserve.address, cumulativeBorrowRate);\n }\n }\n return cumulativeBorrowRates;\n }\n\n static addCumulativeBorrowRatesForObligation(\n kaminoMarket: KaminoMarket,\n cumulativeBorrowRates: Map<PublicKey, Decimal>,\n obligation: Obligation,\n slot: number\n ) {\n for (let i = 0; i < obligation.borrows.length; i++) {\n const borrow = obligation.borrows[i];\n if (isNotNullPubkey(borrow.borrowReserve) && !cumulativeBorrowRates.has(borrow.borrowReserve)) {\n const reserve = kaminoMarket.getReserveByAddress(borrow.borrowReserve)!;\n const cumulativeBorrowRate = reserve.getEstimatedCumulativeBorrowRate(slot, kaminoMarket.state.referralFeeBps);\n cumulativeBorrowRates.set(reserve.address, cumulativeBorrowRate);\n }\n }\n }\n\n static getBorrowFactorForReserve(reserve: KaminoReserve, elevationGroup: number): Decimal {\n if (elevationGroup !== 0) {\n return new Decimal(1);\n }\n return new Decimal(reserve.stats.borrowFactor).div(100);\n }\n}\n"]}
|